All checks were successful
Build and Push Docker Image / build (push) Successful in 30s
- Introduced `Subcategory` model with migration and unique slug constraint per category - Enabled subcategory assignment for items with validation to ensure category matching - Updated catalog views to handle subcategories, filtering items accordingly - Enhanced templates (`index.html`, `side-bar.html`, `item-list.html`, `detail.html`) to display subcategories - Added dynamic subcategory dropdown in Django admin with category filtering - Created JavaScript for admin subcategory handling and AJAX population - Wrote comprehensive tests for subcategory functionality in views and admin
80 lines
2.5 KiB
Python
80 lines
2.5 KiB
Python
from dataclasses import dataclass
|
|
|
|
from django.http import HttpRequest, HttpResponse, Http404
|
|
from django.shortcuts import render
|
|
|
|
from items.models import Category, Item, Subcategory
|
|
|
|
|
|
@dataclass
|
|
class SelectedCategory:
|
|
name: str | None
|
|
id: str | None
|
|
|
|
|
|
@dataclass
|
|
class SelectedSubcategory:
|
|
name: str | None
|
|
id: str | None
|
|
|
|
|
|
def index(request: HttpRequest, category: str | None = None) -> HttpResponse:
|
|
selected_category = SelectedCategory(name=None, id=None)
|
|
selected_subcategory = SelectedSubcategory(name=None, id=None)
|
|
subcategories = Subcategory.objects.none()
|
|
subcategory_slug = request.GET.get('subcategory')
|
|
items = (
|
|
Item.objects.select_related('category', 'subcategory')
|
|
.prefetch_related('images')
|
|
.order_by('category__name', 'name')
|
|
)
|
|
|
|
if category is None and subcategory_slug:
|
|
raise Http404()
|
|
|
|
if category is not None:
|
|
try:
|
|
cat = Category.objects.get(slug=category.lower())
|
|
selected_category = SelectedCategory(name=cat.name, id=cat.slug)
|
|
except Category.DoesNotExist:
|
|
raise Http404()
|
|
subcategories = Subcategory.objects.filter(category=cat).order_by('name')
|
|
items = items.filter(category=cat)
|
|
|
|
if subcategory_slug:
|
|
try:
|
|
subcategory_obj = subcategories.get(slug=subcategory_slug.lower())
|
|
selected_subcategory = SelectedSubcategory(name=subcategory_obj.name, id=subcategory_obj.slug)
|
|
except Subcategory.DoesNotExist:
|
|
raise Http404()
|
|
|
|
items = items.filter(subcategory=subcategory_obj)
|
|
|
|
return render(request, 'catalog/index.html', {
|
|
'categories': Category.objects.order_by('name'),
|
|
'subcategories': subcategories,
|
|
'items': items,
|
|
'selected_category': selected_category,
|
|
'selected_subcategory': selected_subcategory,
|
|
})
|
|
|
|
|
|
def detail(request: HttpRequest, category: str, slug: str) -> HttpResponse:
|
|
try:
|
|
item = (
|
|
Item.objects.select_related('category', 'subcategory')
|
|
.prefetch_related('images')
|
|
.get(category__slug=category.lower(), slug=slug)
|
|
)
|
|
except Item.DoesNotExist:
|
|
raise Http404()
|
|
|
|
images = list(item.images.all())
|
|
|
|
return render(request, 'catalog/detail.html', {
|
|
'categories': Category.objects.order_by('name'),
|
|
'item': item,
|
|
'images': images,
|
|
'primary_image': images[0] if images else None,
|
|
})
|