feat: Add Twitch Drops Tracker application with campaign management

- Implemented models for DropCampaign, Game, Organization, DropBenefit, TimeBasedDrop, and DropBenefitEdge.
- Created views for listing and detailing drop campaigns.
- Added templates for dashboard, campaign list, and campaign detail.
- Developed management command to import drop campaigns from JSON files.
- Configured admin interface for managing campaigns and related models.
- Updated URL routing for the application.
- Enhanced README with installation instructions and project structure.
This commit is contained in:
Joakim Hellsén 2025-07-09 22:46:23 +02:00
commit 5c482c1729
15 changed files with 1145 additions and 10 deletions

114
templates/base.html Normal file
View file

@ -0,0 +1,114 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}Twitch Drops Tracker{% endblock %}</title>
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- FontAwesome -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css">
<style>
/* Custom styles */
.campaign-card {
transition: transform 0.3s;
height: 100%;
}
.campaign-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
}
.campaign-active {
border-left: 4px solid #9147ff;
}
.campaign-upcoming {
border-left: 4px solid #1d9bf0;
}
.campaign-expired {
border-left: 4px solid #6c757d;
}
.drop-item {
border-left: 4px solid #9147ff;
}
.twitch-color {
color: #9147ff;
}
.bg-twitch {
background-color: #9147ff;
color: white;
}
.benefit-img {
max-width: 120px;
max-height: 120px;
}
</style>
{% block extra_css %}{% endblock %}
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark mb-4">
<div class="container">
<a class="navbar-brand" href="{% url 'twitch:dashboard' %}">
<i class="fa-brands fa-twitch me-2"></i>Twitch Drops Tracker
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item">
<a class="nav-link {% if request.path == '/' %}active{% endif %}"
href="{% url 'twitch:dashboard' %}">
<i class="fas fa-home me-1"></i> Dashboard
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if '/campaigns/' in request.path %}active{% endif %}"
href="{% url 'twitch:campaign_list' %}">
<i class="fas fa-gift me-1"></i> Campaigns
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'admin:index' %}">
<i class="fas fa-cog me-1"></i> Admin
</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container mb-5">
{% block content %}{% endblock %}
</div>
<footer class="bg-dark text-white py-4 mt-auto">
<div class="container">
<div class="row">
<div class="col-md-6">
<h5><i class="fa-brands fa-twitch me-2"></i>Twitch Drops Tracker</h5>
<p>Track and manage Twitch drops campaigns for your favorite games</p>
</div>
<div class="col-md-6 text-md-end">
<p class="mb-0">&copy; {% now "Y" %} Twitch Drops Tracker</p>
<p class="mb-0 small">Not affiliated with Twitch Interactive, Inc.</p>
</div>
</div>
</div>
</footer>
<!-- Bootstrap JS Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
{% block extra_js %}{% endblock %}
</body>
</html>