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`.
This commit is contained in:
Egor Pavlovich Gorbunov 2025-07-09 02:30:26 +03:00
parent 89301d6432
commit b6983b63a3
3 changed files with 18 additions and 10 deletions

View file

@ -1,5 +1,4 @@
from django.contrib.sitemaps import Sitemap from django.contrib.sitemaps import Sitemap
from django.utils.text import slugify
from core.models import Brand, Category, Product from core.models import Brand, Category, Product
from evibes.settings import LANGUAGE_CODE from evibes.settings import LANGUAGE_CODE
@ -9,7 +8,7 @@ class ProductSitemap(Sitemap):
protocol = "https" protocol = "https"
changefreq = "daily" changefreq = "daily"
priority = 0.9 priority = 0.9
limit = 40000 limit = 25000
def items(self): def items(self):
return ( return (
@ -33,7 +32,7 @@ class CategorySitemap(Sitemap):
protocol = "https" protocol = "https"
changefreq = "weekly" changefreq = "weekly"
priority = 0.7 priority = 0.7
limit = 40000 limit = 10000
def items(self): def items(self):
return Category.objects.filter(is_active=True).only("uuid", "name", "modified").order_by("-modified") return Category.objects.filter(is_active=True).only("uuid", "name", "modified").order_by("-modified")
@ -42,15 +41,14 @@ class CategorySitemap(Sitemap):
return obj.modified return obj.modified
def location(self, obj): def location(self, obj):
slug = slugify(obj.name) return f"/{LANGUAGE_CODE}/catalog/{obj.slug}"
return f"/{LANGUAGE_CODE}/catalog/{obj.uuid}/{slug}"
class BrandSitemap(Sitemap): class BrandSitemap(Sitemap):
protocol = "https" protocol = "https"
changefreq = "weekly" changefreq = "weekly"
priority = 0.6 priority = 0.6
limit = 40000 limit = 10000
def items(self): def items(self):
return Brand.objects.filter(is_active=True).only("uuid", "name", "modified").order_by("-modified") return Brand.objects.filter(is_active=True).only("uuid", "name", "modified").order_by("-modified")
@ -59,5 +57,4 @@ class BrandSitemap(Sitemap):
return obj.modified return obj.modified
def location(self, obj): def location(self, obj):
slug = slugify(obj.name) return f"/{LANGUAGE_CODE}/brand/{obj.slug}"
return f"/{LANGUAGE_CODE}/brand/{obj.uuid}/{slug}"

View file

@ -11,6 +11,8 @@ from django.shortcuts import redirect
from django.utils.encoding import force_str from django.utils.encoding import force_str
from django.utils.http import urlsafe_base64_decode from django.utils.http import urlsafe_base64_decode
from django.utils.translation import gettext_lazy as _ 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 django_ratelimit.decorators import ratelimit
from djangorestframework_camel_case.render import CamelCaseJSONRenderer from djangorestframework_camel_case.render import CamelCaseJSONRenderer
from djangorestframework_camel_case.util import camelize from djangorestframework_camel_case.util import camelize
@ -52,6 +54,8 @@ from evibes.settings import LANGUAGES
from payments.serializers import TransactionProcessSerializer from payments.serializers import TransactionProcessSerializer
@cache_page(60 * 60 * 12)
@vary_on_headers("Host")
def sitemap_index(request, *args, **kwargs): def sitemap_index(request, *args, **kwargs):
""" """
Handles the request for the sitemap index and returns an XML response. It ensures the response includes 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" response["Content-Type"] = "application/xml; charset=utf-8"
return response return response
@cache_page(60 * 60 * 24)
@vary_on_headers("Host")
def sitemap_detail(request, *args, **kwargs): def sitemap_detail(request, *args, **kwargs):
""" """
Handles the detailed view response for a sitemap. This function processes Handles the detailed view response for a sitemap. This function processes

View file

@ -362,7 +362,13 @@ class ProductViewSet(EvibesViewSet):
qs = super().get_queryset() qs = super().get_queryset()
if self.request.user.has_perm("core.view_product"): if self.request.user.has_perm("core.view_product"):
return qs 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): def get_object(self):
queryset = self.filter_queryset(self.get_queryset()) queryset = self.filter_queryset(self.get_queryset())