Files
shopback/product/views.py
Beyhan Oğur d9f1ea341e first commit
2026-04-26 22:27:56 +03:00

138 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from django.core.cache import cache
from rest_framework import generics
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
from core.Permission import ReadOnly
from product.models import Category, Product, ProductTree
from product.serializers import CategorySerializer, ProductSerializer, ProductTreeSerializer
CACHE_TTL = 60 * 5 # 5 dakika
class StandardResultsSetPagination(PageNumberPagination):
page_size = 12
page_size_query_param = 'page_size'
max_page_size = 100
class CategoryListView(generics.ListAPIView):
permission_classes = [ReadOnly]
serializer_class = CategorySerializer
queryset = Category.objects.order_by('order').filter(is_active=True, parent__isnull=True).all()
def get(self, request, *args, **kwargs):
cache_key = 'product:categories:list'
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data)
queryset = self.get_queryset()
serializer = self.get_serializer(queryset, many=True)
cache.set(cache_key, serializer.data, timeout=CACHE_TTL)
return Response(serializer.data)
class CategoryRetrieveAPIView(generics.RetrieveAPIView):
permission_classes = [ReadOnly]
queryset = Category.objects.order_by('order').filter(is_active=True).all()
serializer_class = CategorySerializer
lookup_field = 'slug'
def get(self, request, *args, **kwargs):
slug = self.kwargs.get('slug')
cache_key = f'product:category:{slug}'
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data)
instance = self.get_object()
serializer = self.get_serializer(instance)
cache.set(cache_key, serializer.data, timeout=CACHE_TTL)
return Response(serializer.data)
class ProductListAPIView(generics.ListAPIView):
permission_classes = [ReadOnly]
serializer_class = ProductSerializer
queryset = Product.objects.filter(is_active=True).all()
pagination_class = StandardResultsSetPagination
def get(self, request, *args, **kwargs):
# Sayfa numarasını al
page = request.query_params.get('page', 1)
cache_key = f'product:products:list:page:{page}'
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data)
queryset = self.get_queryset()
# Sayfalama işlemini uygula
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
# Sayfalanmış yanıtı al (count, next, previous, results yapısı)
response = self.get_paginated_response(serializer.data)
# Yanıtın verisini (data) cache'e kaydet
cache.set(cache_key, response.data, timeout=CACHE_TTL)
return response
# Sayfalama yoksa normal döndür
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
class FeaturedProductListAPIView(generics.ListAPIView):
permission_classes = [ReadOnly]
serializer_class = ProductSerializer
queryset = Product.objects.filter(is_active=True, is_front=True).all()
def get(self, request, *args, **kwargs):
cache_key = 'product:products:featured'
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data)
queryset = self.get_queryset()
serializer = self.get_serializer(queryset, many=True)
cache.set(cache_key, serializer.data, timeout=CACHE_TTL)
return Response(serializer.data)
class ProductListTreeAPIView(generics.ListAPIView):
permission_classes = [ReadOnly]
serializer_class = ProductTreeSerializer
queryset = ProductTree.objects.filter(is_active=True).all()[:3]
def get(self, request, *args, **kwargs):
cache_key = 'product:product_trees:list'
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data)
queryset = self.get_queryset()
serializer = self.get_serializer(queryset, many=True)
cache.set(cache_key, serializer.data, timeout=CACHE_TTL)
return Response(serializer.data)
class ProductRetrieveAPIView(generics.RetrieveAPIView):
permission_classes = [ReadOnly]
queryset = Product.objects.filter(is_active=True).all()
serializer_class = ProductSerializer
lookup_field = 'slug'
def get(self, request, *args, **kwargs):
slug = self.kwargs.get('slug')
cache_key = f'product:product:{slug}'
cached_data = cache.get(cache_key)
if cached_data:
return Response(cached_data)
instance = self.get_object()
serializer = self.get_serializer(instance)
cache.set(cache_key, serializer.data, timeout=CACHE_TTL)
return Response(serializer.data)