Improve import command

This commit is contained in:
Joakim Hellsén 2026-01-05 18:46:46 +01:00
commit 1d6c52325c
No known key found for this signature in database
30 changed files with 2628 additions and 554 deletions

View file

@ -7,14 +7,14 @@
<!-- Campaign Title -->
{% if campaign.game %}
<h1 id="campaign-title">
<a href="{% url 'twitch:game_detail' campaign.game.id %}">{{ campaign.game.get_game_name }}</a> - {{ campaign.clean_name }}
<a href="{% url 'twitch:game_detail' campaign.game.twitch_id %}">{{ campaign.game.get_game_name }}</a> - {{ campaign.clean_name }}
</h1>
{% else %}
<h1 id="campaign-title">{{ campaign.clean_name }}</h1>
{% endif %}
{% if owner %}
<p id="campaign-owner">
<a href="{% url 'twitch:organization_detail' owner.id %}">{{ owner.name }}</a>
<a href="{% url 'twitch:organization_detail' owner.twitch_id %}">{{ owner.name }}</a>
</p>
{% endif %}
<!-- Campaign image -->
@ -23,7 +23,7 @@
height="160"
width="160"
src="{{ campaign.image_best_url|default:campaign.image_url }}"
alt="{{ campaign.name }}">
alt="{{ campaign.name }}" />
{% endif %}
<!-- Campaign description -->
<p id="campaign-description">{{ campaign.description|linebreaksbr }}</p>
@ -98,7 +98,7 @@
<h5>Allowed Channels</h5>
<div id="allowed-channels" style="margin-bottom: 20px;">
{% for channel in allowed_channels %}
<a href="{% url 'twitch:channel_detail' channel.id %}"
<a href="{% url 'twitch:channel_detail' channel.twitch_id %}"
style="display: inline-block;
margin: 2px 5px 2px 0;
padding: 3px 8px;
@ -139,7 +139,7 @@
style="object-fit: cover;
margin-right: 3px"
src="{{ benefit.image_best_url|default:benefit.image_asset_url }}"
alt="{{ benefit.name }}">
alt="{{ benefit.name }}" />
{% endif %}
{% endfor %}
</td>

View file

@ -49,16 +49,16 @@
{% if campaigns %}
{% regroup campaigns by game as campaigns_by_game %}
{% for game_group in campaigns_by_game %}
<section id="game-group-{{ game_group.grouper.id }}"
<section id="game-group-{{ game_group.grouper.twitch_id }}"
style="margin-bottom: 3rem">
<div style="display: flex; gap: 1rem;">
<div style="flex-shrink: 0;">
{% if game_group.grouper.box_art_base_url %}
<img src="{{ game_group.grouper.box_art_base_url }}"
{% if game_group.grouper.box_art_best_url %}
<img src="{{ game_group.grouper.box_art_best_url }}"
alt="Box art for {{ game_group.grouper.display_name }}"
width="120"
height="160"
style="border-radius: 8px">
style="border-radius: 8px" />
{% else %}
<div style="width: 120px;
height: 160px;
@ -69,7 +69,7 @@
justify-content: center;
font-size: 1rem">
🎮
<br>
<br />
No Image
</div>
{% endif %}
@ -78,15 +78,15 @@
{% comment %} Find this header section in your template {% endcomment %}
<header style="margin-bottom: 1rem;">
<h2 style="margin: 0 0 0.5rem 0;">
<a id="game-link-{{ game_group.grouper.id }}"
href="{% url 'twitch:game_detail' game_group.grouper.id %}"
<a id="game-link-{{ game_group.grouper.twitch_id }}"
href="{% url 'twitch:game_detail' game_group.grouper.twitch_id %}"
style="text-decoration: none">{{ game_group.grouper.display_name|default:game_group.grouper.name|default:game_group.grouper.slug|default:game_group.grouper.id }}</a>
</h2>
{% comment %} MODIFICATION: Check if the owner exists before creating the link {% endcomment %}
{% if game_group.grouper.owner %}
{% comment %} Check if the owner exists and has a valid ID before creating the link {% endcomment %}
{% if game_group.grouper.owner and game_group.grouper.owner.twitch_id %}
<p style="margin: 0;">
<a id="org-link-{{ game_group.grouper.owner.id }}"
href="{% url 'twitch:organization_detail' game_group.grouper.owner.id %}"
<a id="org-link-{{ game_group.grouper.owner.twitch_id }}"
href="{% url 'twitch:organization_detail' game_group.grouper.owner.twitch_id %}"
style="text-decoration: none">{{ game_group.grouper.owner.name }}</a>
</p>
{% endif %}
@ -94,23 +94,23 @@
<div style="overflow-x: auto;">
<div style="display: flex; gap: 1rem; min-width: max-content;">
{% for campaign in game_group.list %}
<article id="campaign-{{ campaign.id }}"
<article id="campaign-{{ campaign.twitch_id }}"
style="display: flex;
flex-direction: column;
align-items: flex-start;
padding: 0.5rem;
flex-shrink: 0">
<div>
<a id="campaign-link-{{ campaign.id }}"
href="{% url 'twitch:campaign_detail' campaign.id %}"
<a id="campaign-link-{{ campaign.twitch_id }}"
href="{% url 'twitch:campaign_detail' campaign.twitch_id %}"
style="text-decoration: none">
{% if campaign.image_best_url or campaign.image_url %}
<img id="campaign-image-{{ campaign.id }}"
<img id="campaign-image-{{ campaign.twitch_id }}"
src="{{ campaign.image_best_url|default:campaign.image_url }}"
alt="Campaign artwork for {{ campaign.name }}"
width="120"
height="120"
style="border-radius: 4px">
style="border-radius: 4px" />
{% else %}
<div style="width: 120px;
height: 120px;
@ -121,11 +121,11 @@
justify-content: center;
font-size: 0.9rem">
📦
<br>
<br />
No Image
</div>
{% endif %}
<h4 id="campaign-name-{{ campaign.id }}"
<h4 id="campaign-name-{{ campaign.twitch_id }}"
style="margin: 0.5rem 0;
text-align: left">{{ campaign.clean_name }}</h4>
</a>
@ -142,13 +142,14 @@
</div>
<div style="margin-top: 0.5rem;">
{% if campaign.start_at <= now and campaign.end_at >= now %}
<span id="campaign-status-{{ campaign.id }}"
<span id="campaign-status-{{ campaign.twitch_id }}"
style="font-weight: 600;
color: #28a745">Active</span>
{% elif campaign.start_at > now %}
<span id="campaign-status-{{ campaign.id }}" style="font-weight: 600;">Upcoming</span>
<span id="campaign-status-{{ campaign.twitch_id }}"
style="font-weight: 600">Upcoming</span>
{% else %}
<span id="campaign-status-{{ campaign.id }}"
<span id="campaign-status-{{ campaign.twitch_id }}"
style="font-weight: 600;
color: #dc3545">Expired</span>
{% endif %}
@ -168,7 +169,7 @@
<h2 style="margin: 0 0 1rem 0;">No Campaigns Found</h2>
<p style="margin: 0; font-size: 1.1rem;">
No campaigns match your current filters.
<br>
<br />
Try adjusting your search criteria.
</p>
</section>

View file

@ -26,9 +26,9 @@
<table id="active-campaigns-table">
<tbody>
{% for campaign in active_campaigns %}
<tr id="campaign-row-{{ campaign.id }}">
<tr id="campaign-row-{{ campaign.twitch_id }}">
<td>
<a href="{% url 'twitch:campaign_detail' campaign.id %}">{{ campaign.clean_name }}</a>
<a href="{% url 'twitch:campaign_detail' campaign.twitch_id %}">{{ campaign.clean_name }}</a>
{% if campaign.time_based_drops.all %}
<div class="campaign-benefits">
{% for benefit in campaign.sorted_benefits %}
@ -40,7 +40,7 @@
height="24"
style="display: inline-block;
margin-right: 4px;
vertical-align: middle">
vertical-align: middle" />
{% endif %}
{{ benefit.name }}
</span>
@ -70,9 +70,9 @@
<table id="upcoming-campaigns-table">
<tbody>
{% for campaign in upcoming_campaigns %}
<tr id="campaign-row-{{ campaign.id }}">
<tr id="campaign-row-{{ campaign.twitch_id }}">
<td>
<a href="{% url 'twitch:campaign_detail' campaign.id %}">{{ campaign.clean_name }}</a>
<a href="{% url 'twitch:campaign_detail' campaign.twitch_id %}">{{ campaign.clean_name }}</a>
{% if campaign.time_based_drops.all %}
<div class="campaign-benefits">
{% for benefit in campaign.sorted_benefits %}
@ -84,7 +84,7 @@
height="24"
style="display: inline-block;
margin-right: 4px;
vertical-align: middle">
vertical-align: middle" />
{% endif %}
{{ benefit.name }}
</span>
@ -114,9 +114,9 @@
<table id="expired-campaigns-table">
<tbody>
{% for campaign in expired_campaigns %}
<tr id="campaign-row-{{ campaign.id }}">
<tr id="campaign-row-{{ campaign.twitch_id }}">
<td>
<a href="{% url 'twitch:campaign_detail' campaign.id %}">{{ campaign.clean_name }}</a>
<a href="{% url 'twitch:campaign_detail' campaign.twitch_id %}">{{ campaign.clean_name }}</a>
{% if campaign.time_based_drops.all %}
<div class="campaign-benefits">
{% for benefit in campaign.sorted_benefits %}
@ -128,7 +128,7 @@
height="24"
style="display: inline-block;
margin-right: 4px;
vertical-align: middle">
vertical-align: middle" />
{% endif %}
{{ benefit.name }}
</span>

View file

@ -14,7 +14,7 @@
id="search"
name="search"
value="{{ search_query }}"
placeholder="Search channels...">
placeholder="Search channels..." />
<button id="search-button" type="submit">Search</button>
{% if search_query %}
<a href="{% url 'twitch:channel_list' %}">Clear</a>
@ -35,7 +35,7 @@
<tr id="channel-row-{{ channel.id }}">
<td>
<a id="channel-link-{{ channel.id }}"
href="{% url 'twitch:channel_detail' channel.id %}">{{ channel.display_name }}</a>
href="{% url 'twitch:channel_detail' channel.twitch_id %}">{{ channel.display_name }}</a>
</td>
<td>{{ channel.name }}</td>
<td>{{ channel.campaign_count }}</td>

View file

@ -13,7 +13,7 @@
<ul id="games-without-owner-list">
{% for game in games_without_owner %}
<li id="game-{{ game.id }}">
<a href="{% url 'twitch:game_detail' game.id %}">{{ game.display_name }}</a> (ID: {{ game.id }})
<a href="{% url 'twitch:game_detail' game.twitch_id %}">{{ game.display_name }}</a> (ID: {{ game.twitch_id }})
</li>
{% endfor %}
</ul>
@ -26,9 +26,9 @@
{% if broken_image_campaigns %}
<ul id="broken-image-campaigns-list">
{% for c in broken_image_campaigns %}
<li id="campaign-{{ c.id }}">
<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 id="campaign-{{ c.twitch_id }}">
<a href="{% url 'twitch:campaign_detail' c.twitch_id %}">{{ c.name }}</a>
(Game: <a href="{% url 'twitch:game_detail' c.game.twitch_id %}">{{ c.game.display_name }}</a>)
- URL: {{ c.image_best_url|default:c.image_url|default:'(empty)' }}
</li>
{% endfor %}
@ -49,7 +49,7 @@
{{ 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>)
(Game: <a href="{% url 'twitch:game_detail' first_drop.campaign.game.twitch_id %}">{{ first_drop.campaign.game.display_name }}</a>)
{% else %}
(Game: Not linked)
{% endif %}
@ -67,9 +67,9 @@
{% if active_missing_image %}
<ul id="active-missing-image-list">
{% for c in active_missing_image %}
<li id="campaign-{{ c.id }}">
<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 id="campaign-{{ c.twitch_id }}">
<a href="{% url 'twitch:campaign_detail' c.twitch_id %}">{{ c.name }}</a>
(Game: <a href="{% url 'twitch:game_detail' c.game.twitch_id %}">{{ c.game.display_name }}</a>)
</li>
{% endfor %}
</ul>
@ -82,10 +82,10 @@
{% if drops_without_benefits %}
<ul id="drops-without-benefits-list">
{% for d in drops_without_benefits %}
<li id="drop-{{ d.id }}">
<li id="drop-{{ d.twitch_id }}">
{{ 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>)
(Campaign: <a href="{% url 'twitch:campaign_detail' d.campaign.twitch_id %}">{{ d.campaign.name }}</a>
in Game: <a href="{% url 'twitch:game_detail' d.campaign.game.twitch_id %}">{{ d.campaign.game.display_name }}</a>)
</li>
{% endfor %}
</ul>
@ -98,9 +98,9 @@
{% if invalid_date_campaigns %}
<ul id="invalid-date-campaigns-list">
{% for c in invalid_date_campaigns %}
<li id="campaign-{{ c.id }}">
<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 id="campaign-{{ c.twitch_id }}">
<a href="{% url 'twitch:campaign_detail' c.twitch_id %}">{{ c.name }}</a>
(Game: <a href="{% url 'twitch:game_detail' c.game.twitch_id %}">{{ c.game.display_name }}</a>)
- Start: {{ c.start_at|default:'(none)' }} / End: {{ c.end_at|default:'(none)' }}
</li>
{% endfor %}

View file

@ -14,45 +14,21 @@
height="160"
width="160"
src="{{ game.box_art }}"
alt="{{ game.name }}">
alt="{{ game.name }}" />
{% endif %}
<!-- Game owner -->
{% if owner %}
<small><a id="owner-link"
href="{% url 'twitch:organization_detail' owner.id %}">{{ owner.name }}</a></small>
{% endif %}
{% if user.is_authenticated %}
<form id="notification-form"
method="post"
action="{% url 'twitch:subscribe_notifications' game_id=game.id %}">
{% csrf_token %}
<div>
<input type="checkbox"
id="found"
name="notify_found"
{% if subscription and subscription.notify_found %}checked{% endif %} />
<label for="found">🔔 Get notified as soon as a drop for {{ game.display_name }} appears on Twitch.</label>
</div>
<div>
<input type="checkbox"
id="live"
name="notify_live"
{% if subscription and subscription.notify_live %}checked{% endif %} />
<label for="live">🎮 Get notified when the drop is live and ready to be farmed.</label>
</div>
<button id="save-notifications-button" type="submit">Save notification preferences</button>
</form>
{% else %}
<p id="login-prompt">Login to subscribe!</p>
href="{% url 'twitch:organization_detail' owner.twitch_id %}">{{ owner.name }}</a></small>
{% endif %}
{% if active_campaigns %}
<h5 id="active-campaigns-header">Active Campaigns</h5>
<table id="active-campaigns-table">
<tbody>
{% for campaign in active_campaigns %}
<tr id="campaign-row-{{ campaign.id }}">
<tr id="campaign-row-{{ campaign.twitch_id }}">
<td>
<a href="{% url 'twitch:campaign_detail' campaign.id %}">{{ campaign.clean_name }}</a>
<a href="{% url 'twitch:campaign_detail' campaign.twitch_id %}">{{ campaign.clean_name }}</a>
{% if campaign.time_based_drops.all %}
<div class="campaign-benefits">
{% comment %}Show unique benefits sorted alphabetically{% endcomment %}
@ -65,7 +41,7 @@
height="24"
style="display: inline-block;
margin-right: 4px;
vertical-align: middle">
vertical-align: middle" />
{% endif %}
{{ benefit.name }}
</span>
@ -86,9 +62,9 @@
<table id="upcoming-campaigns-table">
<tbody>
{% for campaign in upcoming_campaigns %}
<tr id="campaign-row-{{ campaign.id }}">
<tr id="campaign-row-{{ campaign.twitch_id }}">
<td>
<a href="{% url 'twitch:campaign_detail' campaign.id %}">{{ campaign.clean_name }}</a>
<a href="{% url 'twitch:campaign_detail' campaign.twitch_id %}">{{ campaign.clean_name }}</a>
{% if campaign.time_based_drops.all %}
<div class="campaign-benefits">
{% for benefit in campaign.sorted_benefits %}
@ -100,7 +76,7 @@
height="24"
style="display: inline-block;
margin-right: 4px;
vertical-align: middle">
vertical-align: middle" />
{% endif %}
{{ benefit.name }}
</span>
@ -121,9 +97,9 @@
<table id="expired-campaigns-table">
<tbody>
{% for campaign in expired_campaigns %}
<tr id="campaign-row-{{ campaign.id }}">
<tr id="campaign-row-{{ campaign.twitch_id }}">
<td>
<a href="{% url 'twitch:campaign_detail' campaign.id %}">{{ campaign.clean_name }}</a>
<a href="{% url 'twitch:campaign_detail' campaign.twitch_id %}">{{ campaign.clean_name }}</a>
{% if campaign.time_based_drops.all %}
<div class="campaign-benefits">
{% comment %}Show unique benefits sorted alphabetically{% endcomment %}
@ -136,7 +112,7 @@
height="24"
style="display: inline-block;
margin-right: 4px;
vertical-align: middle">
vertical-align: middle" />
{% endif %}
{{ benefit.name }}
</span>

View file

@ -22,12 +22,12 @@
flex: 1 1 160px;
text-align: center">
<div style="margin-bottom: 0.25rem;">
{% if item.game.box_art_base_url %}
<img src="{{ item.game.box_art_base_url }}"
{% if item.game.box_art_best_url %}
<img src="{{ item.game.box_art_best_url }}"
alt="Box art for {{ item.game.display_name }}"
width="180"
height="240"
style="border-radius: 8px">
style="border-radius: 8px" />
{% else %}
<div style="width: 180px;
height: 240px;
@ -39,13 +39,13 @@
font-size: 0.8rem;
margin: 0 auto">
🎮
<br>
<br />
No Image
</div>
{% endif %}
</div>
<h4 style="margin: 0;">
<a href="{% url 'twitch:game_detail' item.game.id %}"
<a href="{% url 'twitch:game_detail' item.game.twitch_id %}"
style="text-decoration: none;
color: inherit">{{ item.game.display_name }}</a>
</h4>

View file

@ -14,7 +14,7 @@
<ul style="list-style: none; padding: 0; margin: 0;">
{% for item in games %}
<li id="game-{{ item.game.id }}">
<a href="{% url 'twitch:game_detail' item.game.id %}">{{ item.game.display_name }}</a>
<a href="{% url 'twitch:game_detail' item.game.twitch_id %}">{{ item.game.display_name }}</a>
</li>
{% endfor %}
</ul>

View file

@ -8,7 +8,7 @@
<ul id="org-list">
{% for organization in orgs %}
<li id="org-{{ organization.id }}">
<a href="{% url 'twitch:organization_detail' organization.id %}">{{ organization.name }}</a>
<a href="{% url 'twitch:organization_detail' organization.twitch_id %}">{{ organization.name }}</a>
</li>
{% endfor %}
</ul>

View file

@ -31,7 +31,7 @@
<ul id="games-list">
{% for game in games %}
<li id="game-{{ game.id }}">
<a href="{% url 'twitch:game_detail' pk=game.id %}">{{ game }}</a>
<a href="{% url 'twitch:game_detail' game.twitch_id %}">{{ game }}</a>
</li>
{% endfor %}
</ul>