138 lines
4.8 KiB
Python
138 lines
4.8 KiB
Python
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)
|