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, })