diff --git a/core/viewsets.py b/core/viewsets.py index afe5e17d..8c603d87 100644 --- a/core/viewsets.py +++ b/core/viewsets.py @@ -1,6 +1,5 @@ import logging import uuid -from contextlib import suppress from uuid import UUID from constance import config @@ -286,6 +285,28 @@ class CategoryViewSet(EvibesViewSet): } additional = {"seo_meta": "ALLOW"} + def get_object(self): + queryset = self.filter_queryset(self.get_queryset()) + lookup_value = self.kwargs[self.lookup_url_kwarg] + + obj = None + + try: + uuid_obj = UUID(lookup_value) + obj = queryset.filter(uuid=uuid_obj).first() + except (ValueError, TypeError): + pass + + if not obj: + obj = queryset.filter(slug=lookup_value).first() + + if not obj: + name = "Category" + raise Http404(f"{name} does not exist: {lookup_value}") + + self.check_object_permissions(self.request, obj) + return obj + def get_queryset(self): qs = super().get_queryset() if self.request.user.has_perm("core.view_category"): @@ -301,13 +322,7 @@ class CategoryViewSet(EvibesViewSet): ], ) def seo_meta(self, request, **kwargs): - lookup_key = getattr(self, "lookup_url_kwarg", "pk") - lookup_val = kwargs.get(lookup_key) - - category = get_object_or_404(Category.objects.select_related("parent"), slug=str(lookup_val)) - - with suppress(Exception): - category = Category.objects.select_related("parent").get(uuid=UUID(str(lookup_val))) + category = self.get_object() title = f"{category.name} | {config.PROJECT_NAME}" description = (category.description or "")[:180] @@ -390,6 +405,28 @@ class BrandViewSet(EvibesViewSet): } additional = {"seo_meta": "ALLOW"} + def get_object(self): + queryset = self.filter_queryset(self.get_queryset()) + lookup_value = self.kwargs[self.lookup_url_kwarg] + + obj = None + + try: + uuid_obj = UUID(lookup_value) + obj = queryset.filter(uuid=uuid_obj).first() + except (ValueError, TypeError): + pass + + if not obj: + obj = queryset.filter(slug=lookup_value).first() + + if not obj: + name = "Brand" + raise Http404(f"{name} does not exist: {lookup_value}") + + self.check_object_permissions(self.request, obj) + return obj + def get_queryset(self): queryset = Brand.objects.all() @@ -411,11 +448,7 @@ class BrandViewSet(EvibesViewSet): ], ) def seo_meta(self, request, **kwargs): - lookup_key = getattr(self, "lookup_url_kwarg", "pk") - lookup_val = kwargs.get(lookup_key) - brand = get_object_or_404(Brand, slug=str(lookup_val)) - with suppress(Exception): - brand = Brand.objects.get(uuid=UUID(str(lookup_val))) + brand = self.get_object() title = f"{brand.name} | {config.PROJECT_NAME}" description = (brand.description or "")[:180]