first commit
This commit is contained in:
137
product/views.py
Normal file
137
product/views.py
Normal file
@@ -0,0 +1,137 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user