137 lines
5.4 KiB
HTML
137 lines
5.4 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}
|
|
Debug
|
|
{% endblock title %}
|
|
{% block content %}
|
|
<h1>Debug Data Integrity Report</h1>
|
|
<p>Generated at: {{ now }}</p>
|
|
<section>
|
|
<h2>Games Without an Assigned Owner ({{ games_without_owner|length }})</h2>
|
|
{% if games_without_owner %}
|
|
<ul>
|
|
{% for game in games_without_owner %}
|
|
<li>
|
|
<a href="{% url 'twitch:game_detail' game.id %}">{{ game.display_name }}</a> (ID: {{ game.id }})
|
|
</li>
|
|
{% endfor %}
|
|
</ul>
|
|
{% else %}
|
|
<p>None ✅</p>
|
|
{% endif %}
|
|
</section>
|
|
<section>
|
|
<h2>Campaigns With Broken Image URLs ({{ broken_image_campaigns|length }})</h2>
|
|
{% if broken_image_campaigns %}
|
|
<ul>
|
|
{% for c in broken_image_campaigns %}
|
|
<li>
|
|
<a href="{% url 'twitch:campaign_detail' c.id %}">{{ c.name }}</a>
|
|
(Game: <a href="{% url 'twitch:game_detail' c.game.id %}">{{ c.game.display_name }}</a>)
|
|
- URL: {{ c.image_url|default:'(empty)' }}
|
|
</li>
|
|
{% endfor %}
|
|
</ul>
|
|
{% else %}
|
|
<p>None ✅</p>
|
|
{% endif %}
|
|
</section>
|
|
<section>
|
|
<h2>Benefits With Broken Image URLs ({{ broken_benefit_images|length }})</h2>
|
|
{% if broken_benefit_images %}
|
|
<ul>
|
|
{% for b in broken_benefit_images %}
|
|
{# A benefit is linked to a game via a drop and a campaign. #}
|
|
{# We use the 'with' tag to get the first drop for cleaner access. #}
|
|
{% with first_drop=b.drops.all.0 %}
|
|
<li>
|
|
{{ b.name }}
|
|
{# Check if the relationship path to the game exists #}
|
|
{% if first_drop and first_drop.campaign and first_drop.campaign.game %}
|
|
(Game: <a href="{% url 'twitch:game_detail' first_drop.campaign.game.id %}">{{ first_drop.campaign.game.display_name }}</a>)
|
|
{% else %}
|
|
(Game: Not linked)
|
|
{% endif %}
|
|
- URL: {{ b.image_asset_url|default:'(empty)' }}
|
|
</li>
|
|
{% endwith %}
|
|
{% endfor %}
|
|
</ul>
|
|
{% else %}
|
|
<p>None ✅</p>
|
|
{% endif %}
|
|
</section>
|
|
<section>
|
|
<h2>Active Campaigns Missing Image ({{ active_missing_image|length }})</h2>
|
|
{% if active_missing_image %}
|
|
<ul>
|
|
{% for c in active_missing_image %}
|
|
<li>
|
|
<a href="{% url 'twitch:campaign_detail' c.id %}">{{ c.name }}</a>
|
|
(Game: <a href="{% url 'twitch:game_detail' c.game.id %}">{{ c.game.display_name }}</a>)
|
|
</li>
|
|
{% endfor %}
|
|
</ul>
|
|
{% else %}
|
|
<p>None ✅</p>
|
|
{% endif %}
|
|
</section>
|
|
<section>
|
|
<h2>Time-Based Drops Without Benefits ({{ drops_without_benefits|length }})</h2>
|
|
{% if drops_without_benefits %}
|
|
<ul>
|
|
{% for d in drops_without_benefits %}
|
|
<li>
|
|
{{ d.name }}
|
|
(Campaign: <a href="{% url 'twitch:campaign_detail' d.campaign.id %}">{{ d.campaign.name }}</a>
|
|
in Game: <a href="{% url 'twitch:game_detail' d.campaign.game.id %}">{{ d.campaign.game.display_name }}</a>)
|
|
</li>
|
|
{% endfor %}
|
|
</ul>
|
|
{% else %}
|
|
<p>None ✅</p>
|
|
{% endif %}
|
|
</section>
|
|
<section>
|
|
<h2>Campaigns With Invalid Dates ({{ invalid_date_campaigns|length }})</h2>
|
|
{% if invalid_date_campaigns %}
|
|
<ul>
|
|
{% for c in invalid_date_campaigns %}
|
|
<li>
|
|
<a href="{% url 'twitch:campaign_detail' c.id %}">{{ c.name }}</a>
|
|
(Game: <a href="{% url 'twitch:game_detail' c.game.id %}">{{ c.game.display_name }}</a>)
|
|
- Start: {{ c.start_at|default:'(none)' }} / End: {{ c.end_at|default:'(none)' }}
|
|
</li>
|
|
{% endfor %}
|
|
</ul>
|
|
{% else %}
|
|
<p>None ✅</p>
|
|
{% endif %}
|
|
</section>
|
|
<section>
|
|
<h2>Duplicate Campaign Names Per Game ({{ duplicate_name_campaigns|length }})</h2>
|
|
{% if duplicate_name_campaigns %}
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Game</th>
|
|
<th>Campaign Name</th>
|
|
<th>Count</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for row in duplicate_name_campaigns %}
|
|
<tr>
|
|
<td>
|
|
<a href="{% url 'twitch:game_detail' row.game_id %}">{{ row.game__display_name }}</a>
|
|
</td>
|
|
<td>{{ row.name }}</td>
|
|
<td>{{ row.name_count }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% else %}
|
|
<p>None ✅</p>
|
|
{% endif %}
|
|
</section>
|
|
{% endblock content %}
|