From b6983b63a3d05bf0f3dfb2289294eb8e74c6fe64 Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Wed, 9 Jul 2025 02:30:26 +0300 Subject: [PATCH] Features: 1) Enhance queryset filtering in `get_queryset` to include additional active checks for brand, category, stocks, and vendor; 2) Add caching and header variation for `sitemap_index` and `sitemap_detail` views; 3) Update sitemap limit settings for Category and Brand sitemaps to adjust capacity; Fixes: 1) Replace usage of `slugify` with direct access to `obj.slug` in sitemap location methods; Extra: 1) Remove unused `slugify` import from `core/sitemaps.py`. --- core/sitemaps.py | 13 +++++-------- core/views.py | 7 ++++++- core/viewsets.py | 8 +++++++- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/core/sitemaps.py b/core/sitemaps.py index 0f9a629a..a9be70d8 100644 --- a/core/sitemaps.py +++ b/core/sitemaps.py @@ -1,5 +1,4 @@ from django.contrib.sitemaps import Sitemap -from django.utils.text import slugify from core.models import Brand, Category, Product from evibes.settings import LANGUAGE_CODE @@ -9,7 +8,7 @@ class ProductSitemap(Sitemap): protocol = "https" changefreq = "daily" priority = 0.9 - limit = 40000 + limit = 25000 def items(self): return ( @@ -33,7 +32,7 @@ class CategorySitemap(Sitemap): protocol = "https" changefreq = "weekly" priority = 0.7 - limit = 40000 + limit = 10000 def items(self): return Category.objects.filter(is_active=True).only("uuid", "name", "modified").order_by("-modified") @@ -42,15 +41,14 @@ class CategorySitemap(Sitemap): return obj.modified def location(self, obj): - slug = slugify(obj.name) - return f"/{LANGUAGE_CODE}/catalog/{obj.uuid}/{slug}" + return f"/{LANGUAGE_CODE}/catalog/{obj.slug}" class BrandSitemap(Sitemap): protocol = "https" changefreq = "weekly" priority = 0.6 - limit = 40000 + limit = 10000 def items(self): return Brand.objects.filter(is_active=True).only("uuid", "name", "modified").order_by("-modified") @@ -59,5 +57,4 @@ class BrandSitemap(Sitemap): return obj.modified def location(self, obj): - slug = slugify(obj.name) - return f"/{LANGUAGE_CODE}/brand/{obj.uuid}/{slug}" + return f"/{LANGUAGE_CODE}/brand/{obj.slug}" diff --git a/core/views.py b/core/views.py index 90726a74..91705759 100644 --- a/core/views.py +++ b/core/views.py @@ -11,6 +11,8 @@ from django.shortcuts import redirect from django.utils.encoding import force_str from django.utils.http import urlsafe_base64_decode from django.utils.translation import gettext_lazy as _ +from django.views.decorators.cache import cache_page +from django.views.decorators.vary import vary_on_headers from django_ratelimit.decorators import ratelimit from djangorestframework_camel_case.render import CamelCaseJSONRenderer from djangorestframework_camel_case.util import camelize @@ -52,6 +54,8 @@ from evibes.settings import LANGUAGES from payments.serializers import TransactionProcessSerializer +@cache_page(60 * 60 * 12) +@vary_on_headers("Host") def sitemap_index(request, *args, **kwargs): """ Handles the request for the sitemap index and returns an XML response. It ensures the response includes @@ -70,7 +74,8 @@ def sitemap_index(request, *args, **kwargs): response["Content-Type"] = "application/xml; charset=utf-8" return response - +@cache_page(60 * 60 * 24) +@vary_on_headers("Host") def sitemap_detail(request, *args, **kwargs): """ Handles the detailed view response for a sitemap. This function processes diff --git a/core/viewsets.py b/core/viewsets.py index 53bd1abe..e7228cf7 100644 --- a/core/viewsets.py +++ b/core/viewsets.py @@ -362,7 +362,13 @@ class ProductViewSet(EvibesViewSet): qs = super().get_queryset() if self.request.user.has_perm("core.view_product"): return qs - return qs.filter(is_active=True) + return qs.filter( + is_active=True, + brand__is_active=True, + category__is_active=True, + stocks__isnull=False, + stocks__vendor__is_active=True, + ) def get_object(self): queryset = self.filter_queryset(self.get_queryset())