diff --git a/backlogger/migrations/0005_item_status.py b/backlogger/migrations/0005_item_status.py new file mode 100644 index 0000000..f04592d --- /dev/null +++ b/backlogger/migrations/0005_item_status.py @@ -0,0 +1,20 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('backlogger', '0004_item_hltb_fields'), + ] + + operations = [ + migrations.AddField( + model_name='item', + name='status', + field=models.CharField( + choices=[('active', 'Active'), ('completed', 'Completed'), ('abandoned', 'Abandoned')], + default='active', + max_length=10, + ), + ), + ] diff --git a/backlogger/models.py b/backlogger/models.py index 9bac648..962cd47 100644 --- a/backlogger/models.py +++ b/backlogger/models.py @@ -14,9 +14,19 @@ class Item(models.Model): (OTHER, 'Other'), ] + ACTIVE = 'active' + COMPLETED = 'completed' + ABANDONED = 'abandoned' + STATUS_CHOICES = [ + (ACTIVE, 'Active'), + (COMPLETED, 'Completed'), + (ABANDONED, 'Abandoned'), + ] + user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='items', null=True) category = models.CharField(max_length=10, choices=CATEGORY_CHOICES) + status = models.CharField(max_length=10, choices=STATUS_CHOICES, default=ACTIVE) name = models.CharField(max_length=200) progress_percent = models.FloatField(default=0.0) favorite = models.BooleanField(default=False) diff --git a/backlogger/templates/backlogger/list.html b/backlogger/templates/backlogger/list.html index 332f99b..a87801e 100644 --- a/backlogger/templates/backlogger/list.html +++ b/backlogger/templates/backlogger/list.html @@ -53,6 +53,10 @@ .btn-outline { background: transparent; color: #94a3b8; border: 1px solid #334155; } .btn-danger { background: transparent; color: #f87171; border: 1px solid #f87171; padding: 0.3rem 0.65rem; font-size: 0.78rem; } .btn-danger:hover { background: #f87171; color: #0f172a; opacity: 1; } + .btn-done { background: transparent; color: #34d399; border: 1px solid #34d399; padding: 0.3rem 0.65rem; font-size: 0.78rem; } + .btn-done:hover { background: #34d399; color: #0f172a; opacity: 1; } + .btn-abandon { background: transparent; color: #fb923c; border: 1px solid #fb923c; padding: 0.3rem 0.65rem; font-size: 0.78rem; } + .btn-abandon:hover { background: #fb923c; color: #0f172a; opacity: 1; } .filter-bar { display: flex; @@ -72,6 +76,7 @@ } .tab:hover { color: #e2e8f0; } .tab.active { color: #38bdf8; border-bottom-color: #38bdf8; } + .tab-sep { width: 1px; background: #1e293b; margin: 0.5rem 0.25rem; align-self: stretch; } .sort-wrap { padding-bottom: 0.75rem; } .sort-wrap select { @@ -175,13 +180,19 @@
+ Active + Completed + Abandoned + {% if shelf == 'active' %} + All {% for val, label in categories %} {{ label }} {% endfor %} + {% endif %}
- @@ -229,6 +240,27 @@
Edit + {% if shelf == 'active' %} +
+ {% csrf_token %} + + + +
+
+ {% csrf_token %} + + + +
+ {% else %} +
+ {% csrf_token %} + + + +
+ {% endif %}
{% csrf_token %} diff --git a/backlogger/urls.py b/backlogger/urls.py index b281a66..f817c1b 100644 --- a/backlogger/urls.py +++ b/backlogger/urls.py @@ -7,6 +7,7 @@ urlpatterns = [ path('add/', views.item_add, name='add'), path('/edit/', views.item_edit, name='edit'), path('/delete/', views.item_delete, name='delete'), + path('/status/', views.item_set_status, name='set_status'), path('steam/login/', views.steam_login, name='steam_login'), path('steam/callback/', views.steam_callback, name='steam_callback'), path('steam/import/', views.steam_import, name='steam_import'), diff --git a/backlogger/views.py b/backlogger/views.py index 9805e0d..0d18254 100644 --- a/backlogger/views.py +++ b/backlogger/views.py @@ -35,8 +35,11 @@ SORT_MAP = { def item_list(request): category = request.GET.get('category', '') sort = request.GET.get('sort', 'fav') + shelf = request.GET.get('shelf', Item.ACTIVE) + if shelf not in (Item.ACTIVE, Item.COMPLETED, Item.ABANDONED): + shelf = Item.ACTIVE - items = Item.objects.filter(user=request.user) + items = Item.objects.filter(user=request.user, status=shelf) if category: items = items.filter(category=category) items = items.order_by(*SORT_MAP.get(sort, SORT_MAP['fav'])) @@ -45,6 +48,7 @@ def item_list(request): 'items': items, 'category': category, 'sort': sort, + 'shelf': shelf, 'categories': Item.CATEGORY_CHOICES, }) @@ -79,6 +83,18 @@ def item_edit(request, pk): return render(request, 'backlogger/item_form.html', {'form': form, 'action': 'Edit', 'item': item}) +@login_required +def item_set_status(request, pk): + if request.method == 'POST': + item = get_object_or_404(Item, pk=pk, user=request.user) + new_status = request.POST.get('status') + if new_status in (Item.ACTIVE, Item.COMPLETED, Item.ABANDONED): + item.status = new_status + item.save(update_fields=['status', 'updated_at']) + next_url = request.POST.get('next') or reverse('backlogger:list') + return redirect(next_url) + + @login_required def item_delete(request, pk): if request.method == 'POST':