import logging from django.utils.translation import gettext as _ from django.utils import timezone from django.db import models from rest_framework.response import Response from rest_framework.permissions import IsAdminUser from university.api.base import Endpoint from university.api.bases import AdminCourseEndpoint from university.models import Course, UserCourse, GroupCourse from university.forms.admin_course import ( AdminGrantUserCourseForm, AdminGrantGroupCourseForm ) logger = logging.getLogger(__name__) class CourseListEndpoint(Endpoint): permission_classes = (IsAdminUser, ) def get(self, request, *args, **kwargs): return Response({ 'detail': _('success'), 'data': [{ 'id': course.id, 'slug': course.slug, 'title': course.title, 'title': course.title, 'objectives': course.objectives, 'license': course.license, 'license_display': course.get_license_display(), 'visable_when_no_perm': course.visable_when_no_perm, 'category': { 'name': course.category.name, 'slug': course.category.slug } if course.category else None, 'speakers': course.speakers, 'number_of_students': course.userlessonlearnhistory_set.values( 'user').distinct().count(), } for course in Course.objects.all()] }) class CourseDetailEndpoint(AdminCourseEndpoint): permission_classes = (IsAdminUser, ) def get(self, request, course, *args, **kwargs): return Response({ 'detail': _('success'), 'data': { 'id': course.id, 'slug': course.slug, 'title': course.title, 'title': course.title, 'objectives': course.objectives, 'license': course.license, 'license_display': course.get_license_display(), 'visable_when_no_perm': course.visable_when_no_perm, 'category': { 'name': course.category.name, 'slug': course.category.slug } if course.category else None, 'speakers': course.speakers, 'number_of_students': course.userlessonlearnhistory_set.values( 'user').distinct().count(), } }) class UserPermissionEndpoint(AdminCourseEndpoint): permission_classes = (IsAdminUser, ) def get(self, request, course, *args, **kwargs): try: cur_page = int(request.GET.get('currentPage', 1)) per_page = int(request.GET.get('perPage', 10)) search = request.GET.get('search', '') except Exception: return Response({ 'detail': _('wrong params') }, 400) user_courses = UserCourse.objects.filter(course=course).select_related('user') if search: user_courses = user_courses.filter( models.Q(user__username__icontains=search) | models.Q(user__email__icontains=search) | models.Q(user__phone__icontains=search)) total_num = user_courses.count() user_courses = user_courses[(cur_page - 1) * per_page:cur_page * per_page] return Response({ 'detail': _('success'), 'data': [{ 'user': { 'id': u_c.user.id, 'username': u_c.user.username, 'phone': u_c.user.phone, 'email': u_c.user.email }, 'expires_at': timezone.localtime(u_c.expires_at).strftime('%Y-%m-%d') } for u_c in user_courses], 'total_num': total_num, 'per_page': per_page, 'cur_page': cur_page }) def delete(self, request, course, *args, **kwargs): user_id = request.data.get('user_id') UserCourse.objects.filter(course=course, user_id=user_id).delete() return Response() def post(self, request, course, *args, **kwargs): form = AdminGrantUserCourseForm(staff=request.user, course=course, data=request.data) if not form.is_valid(): return Response({ 'detail': _('params error'), 'errors': form.errors }, status=400) form.save() return Response() class GroupPermissionEndpoint(AdminCourseEndpoint): permission_classes = (IsAdminUser, ) def get(self, request, course, *args, **kwargs): group_courses = GroupCourse.objects.filter(course=course).select_related('group') return Response({ 'detail': _('success'), 'data': [{ 'group': { 'id': g_c.group.id, 'name': g_c.group.name, } } for g_c in group_courses], }) def delete(self, request, course, *args, **kwargs): group_id = request.data.get('group_id') GroupCourse.objects.filter(course=course, group_id=group_id).delete() return Response() def post(self, request, course, *args, **kwargs): form = AdminGrantGroupCourseForm(staff=request.user, course=course, data=request.data) if not form.is_valid(): return Response({ 'detail': _('params error'), 'errors': form.errors }, status=400) form.save() return Response()