from django.core.cache import cache from rest_framework.generics import ListAPIView, RetrieveAPIView from rest_framework.response import Response from core.Permission import ReadOnly from portfolio.models import Portfolio, Category from portfolio.serializers import PortfolioSerializer, CategorySerializer CACHE_TTL_SECONDS = 60 * 5 class CategoryList(ListAPIView): permission_classes = [ReadOnly] queryset = Category.objects.order_by('order').filter(is_active=True, parent__isnull=True).all() # serializer_class = ParentSerializer serializer_class = CategorySerializer def list(self, request, *args, **kwargs): cache_key = 'portfolio:category_list' cached_data = cache.get(cache_key) if cached_data: return Response(cached_data) response = super().list(request, *args, **kwargs) cache.set(cache_key, response.data, timeout=CACHE_TTL_SECONDS) return response class CategoryDetail(RetrieveAPIView): permission_classes = [ReadOnly] queryset = Category.objects.order_by('order').filter(is_active=True).all() serializer_class = CategorySerializer lookup_field = 'slug' # Slug ile arama yapılacak def retrieve(self, request, *args, **kwargs): cache_key = f"portfolio:category_detail:{kwargs.get('slug')}" cached_data = cache.get(cache_key) if cached_data: return Response(cached_data) response = super().retrieve(request, *args, **kwargs) cache.set(cache_key, response.data, timeout=CACHE_TTL_SECONDS) return response def get_serializer_context(self): context = super().get_serializer_context() return context # Create your views here. class PortfolioList(ListAPIView): permission_classes = [ReadOnly] queryset = Portfolio.objects.all() serializer_class = PortfolioSerializer def list(self, request, *args, **kwargs): cache_key = 'portfolio:portfolio_list' cached_data = cache.get(cache_key) if cached_data: return Response(cached_data) response = super().list(request, *args, **kwargs) cache.set(cache_key, response.data, timeout=CACHE_TTL_SECONDS) return response class PortfolioDetail(RetrieveAPIView): permission_classes = [ReadOnly] queryset = Portfolio.objects.all() serializer_class = PortfolioSerializer lookup_field = 'pk' # Portfolio modelinde slug olmadığı için pk kullanılıyor def retrieve(self, request, *args, **kwargs): cache_key = f"portfolio:portfolio_detail:{kwargs.get('pk')}" cached_data = cache.get(cache_key) if cached_data: return Response(cached_data) response = super().retrieve(request, *args, **kwargs) cache.set(cache_key, response.data, timeout=CACHE_TTL_SECONDS) return response