diff --git a/api/v1/serializers/course.py b/api/v1/serializers/course.py index bacd4b30..b2cfdb81 100644 --- a/api/v1/serializers/course.py +++ b/api/v1/serializers/course.py @@ -72,6 +72,14 @@ class CategorySerializer(serializers.ModelSerializer): ) +class CourseBulkChangeCategorySerializer(serializers.Serializer): + category = serializers.IntegerField() + courses = serializers.ListField( + child=serializers.IntegerField(), + min_length=1, + ) + + class CourseCreateSerializer(DispatchContentMixin, DispatchGalleryMixin, DispatchMaterialMixin, diff --git a/api/v1/views.py b/api/v1/views.py index 16a0fc6f..635012a2 100644 --- a/api/v1/views.py +++ b/api/v1/views.py @@ -10,6 +10,7 @@ from . import ExtendedModelViewSet from .serializers.course import ( CategorySerializer, LikeSerializer, CourseSerializer, CourseCreateSerializer, + CourseBulkChangeCategorySerializer, MaterialSerializer, MaterialCreateSerializer, LessonSerializer, LessonCreateSerializer, ) @@ -82,6 +83,7 @@ class CourseViewSet(ExtendedModelViewSet): 'list': CourseSerializer, 'retrieve': CourseSerializer, 'draft': CourseSerializer, + 'change_category_bulk': CourseBulkChangeCategorySerializer, } filter_fields = ('category', 'status', 'is_infinite', 'is_featured',) search_fields = ('author__email', 'title', 'category__title',) @@ -99,6 +101,31 @@ class CourseViewSet(ExtendedModelViewSet): serialized_data = serializer(instance=drafts.last()) return Response(serialized_data.data) + @list_route(methods=['patch'], url_path='change-category-bulk') + def change_category_bulk(self, request): + serializer_class = self.get_serializer_class() + serializer = serializer_class(data=request.data) + if serializer.is_valid(): + category_id = serializer.validated_data['category'] + courses_ids = serializer.validated_data['courses'] + try: + category = Category.objects.get(id=category_id) + except Category.DoesNotExist: + return Response( + {'success': False, 'detail': f'Category with id {category_id} not found'}, + status=status.HTTP_400_BAD_REQUEST, + ) + else: + c = Course.objects.filter( + id__in=courses_ids, + ).update(category=category) + return Response({'success': True}) + else: + return Response( + {'success': False}, + status=status.HTTP_400_BAD_REQUEST, + ) + class LessonViewSet(ExtendedModelViewSet): queryset = Lesson.objects.select_related(