from django.contrib.auth.decorators import login_required from django.http import JsonResponse from django.template import loader from django.views.generic import View, DetailView, ListView from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_http_methods from .models import Course, Like from .filters import CourseFilter @login_required @csrf_exempt @require_http_methods(['POST']) def likes(request, course_id): try: course = Course.objects.prefetch_related('likes').get(id=course_id) except Course.DoesNotExist: return JsonResponse({ 'success': False, 'errors': ['Course with id f{cource_id} not found'] }) else: course_user_likes = course.likes.filter(user=request.user) if course_user_likes.exists(): is_liked = False for _course in course_user_likes.all(): course.likes.remove(_course) course_user_likes.delete() else: is_liked = True course.likes.add(Like.objects.create(user=request.user)) count = course.likes.count() return JsonResponse({ "success": True, "likes_count": count, "is_liked": is_liked, }) class CourseView(DetailView): model = Course context_object_name = 'course' template_name = 'course/course.html' class CoursesView(ListView): model = Course context_object_name = 'course_items' paginate_by = 6 def get(self, request, *args, **kwargs): self.object_list = self.get_queryset() allow_empty = self.get_allow_empty() if request.is_ajax(): context = self.get_context_data() template_name = self.get_template_names() html = loader.render_to_string(template_name, context) is_paginated = context.get('is_paginated') if is_paginated: page_obj = context.get('page_obj') prev_url = request.path + '?page=' + str(page_obj.previous_page_number()) if page_obj.has_previous() else None next_url = request.path + '?page=' + str(page_obj.next_page_number()) if page_obj.has_next() else None else: prev_url = None next_url = None return JsonResponse({ 'success': True, 'content': html, 'prev_url': prev_url, 'next_url': next_url, }) else: return super().get(request, args, kwargs) def get_queryset(self): queryset = super().get_queryset() filtered = CourseFilter(self.request.GET, queryset=queryset) return filtered.qs def get_template_names(self): if self.request.is_ajax(): return 'course/course_items.html' return 'course/courses.html'