from django.db.models import Q from django.utils.translation import gettext as _ from django.urls import reverse from rest_framework.response import Response from rest_framework.permissions import AllowAny from university.api.base import Endpoint from university.api.bases.course import CourseEndpoint from university.models import Course class CourseListEndpoint(Endpoint): permission_classes = (AllowAny, ) def get(self, request, *args, **kwargs): if request.user.is_authenticated: courses = Course.objects.select_related('category').filter( Q(groupcourse__group__user=request.user) | Q(usercourse__user=request.user) | Q(license=Course.LICENSE_FREE) | Q(visable_when_no_perm=True)) else: courses = Course.objects.select_related('category').filter( Q(license=Course.LICENSE_FREE) | Q(visable_when_no_perm=True)) request_categories = request.GET.get('categories', '') if request.GET.get('categories'): courses = courses.filter(category__slug__in=request_categories.split(',')) courses = courses.distinct() return Response({ 'detail': _('success'), 'datas': [{ 'title': c.title, 'slug': c.slug, 'cover_url': c.cover_image.url if c.cover_image else None, 'license': c.license, 'category': { 'name': c.category.name, 'slug': c.category.slug } if c.category else None } for c in courses] }) class CourseDetailEndpoint(CourseEndpoint): permission_classes = (AllowAny, ) def get(self, request, course, *args, **kwargs): return Response({ 'detail': _('success'), 'datas': { 'slug': course.slug, 'title': course.title, 'description': course.description, 'objectives': course.objectives, 'propaedeutics': course.propaedeutics, 'references': course.references, 'license': course.license, 'cover_url': course.cover_image.url if course.cover_image else None, 'catalog_url': reverse('api:course-catalog', kwargs={ 'course_slug': course.slug }) } }) return Response({'detail': _('success')}) class CourseCatalogEndpoint(CourseEndpoint): permission_classes = (AllowAny, ) def get(self, request, course, *args, **kwargs): has_course = request.user.has_course(course) catalog = { 'slug': course.slug, 'title': course.title, 'number_of_students': course.userlessonlearnhistory_set.values('user').distinct().count(), 'speakers': course.speakers, 'description': course.description, 'objectives': course.objectives, 'propaedeutics': course.propaedeutics, 'references': course.references, 'license': course.license, 'cover_url': course.cover_image.url if course.cover_image else None, 'chapters': [], 'has_online_exam': bool(course.online_exam) } for chapter in course.chapter_set.all().order_by('sequence'): lessons = [{ 'slug': lesson.slug, 'title': lesson.title, 'periods': lesson.periods, 'cover_url': lesson.cover_image.url if lesson.cover_image else None, 'has_permission': has_course or lesson.is_free, 'types': lesson.types, 'quiz': { 'is_passed': request.user.is_passed_quiz(lesson) } if lesson.has_quiz() else None } for lesson in chapter.lesson_set.all().order_by('sequence')] catalog['chapters'].append({ 'slug': chapter.slug, 'title': chapter.title, 'description': chapter.description, 'number_of_lessons': len(lessons), 'periods': sum(l['periods'] for l in lessons), 'lessons': lessons }) return Response({'detail': _('success'), 'datas': catalog})