from django.shortcuts import render from rest_framework.views import APIView, Response from rest_framework import status from .models import BlogModel from .serializers import AllBlogSerilizer, BlogSerilizer from django.shortcuts import get_object_or_404 from utils.pagination import StructurePagination from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiTypes from django.db.models import Q class AllBlogView(APIView): serializer_class = AllBlogSerilizer pagination_class = StructurePagination authentication_classes = [] @extend_schema( parameters=[ OpenApiParameter( name="search", description="بگرددددد تو بلاااااگگگووووو", required=False, type=OpenApiTypes.STR, ), OpenApiParameter( name="limit", description="لیمیتش", required=False, type=OpenApiTypes.INT, ), OpenApiParameter( name="offset", description="افستش", required=False, type=OpenApiTypes.INT, ) ], responses={ 200: AllBlogSerilizer(many=True), 404: OpenApiTypes.OBJECT, }, ) def get(self, request): blogs = BlogModel.objects.filter(is_published=True) search_query = request.query_params.get('search', None) if search_query: blogs = blogs.filter(Q(title__icontains=search_query) | Q(content__icontains=search_query)) paginator = self.pagination_class() paginated_blogs = paginator.paginate_queryset(blogs, request) blog_ser = self.serializer_class(instance=paginated_blogs, many=True, context={'request': request}) return paginator.get_paginated_response(blog_ser.data) class BlogView(APIView): serializer_class = BlogSerilizer authentication_classes = [] def get_client_ip(self, request): """Helper function to get the client IP from request headers.""" x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') if x_forwarded_for: ip = x_forwarded_for.split(',')[0] else: ip = request.META.get('REMOTE_ADDR') return ip def get(self, request, pk): blog = get_object_or_404(BlogModel, pk=pk) if blog.is_published: # Track views using session client_ip = self.get_client_ip(request) session_key = f'viewed_blog_{pk}_{client_ip}' if not request.session.get(session_key): blog.views += 1 blog.save() print(f'views {blog.views}') print(session_key) request.session[session_key] = True request.session.set_expiry(3600) blog_ser = self.serializer_class(instance=blog, context={'request': request}) return Response(blog_ser.data, status=status.HTTP_200_OK) else: return Response({'detail': 'object with the given id does not exist or is not published yet'}, status=status.HTTP_404_NOT_FOUND)