From 96978c57946867429dd30752e372886c78ef0ee5 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Thu, 8 Feb 2018 13:34:18 +0300 Subject: [PATCH 01/10] Update Course serializers --- api/v1/serializers.py | 6 ++---- api/v1/views.py | 8 ++++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/api/v1/serializers.py b/api/v1/serializers.py index 4b26877e..2ac04e6d 100644 --- a/api/v1/serializers.py +++ b/api/v1/serializers.py @@ -127,9 +127,7 @@ class CategorySerializer(serializers.ModelSerializer): ) -class CourseSerializer(serializers.ModelSerializer): - cover = ImageObjectSerializer() - gallery = GallerySerializer() +class CourseCreateSerializer(serializers.ModelSerializer): class Meta: model = Course @@ -164,7 +162,7 @@ class CourseSerializer(serializers.ModelSerializer): ) -class CourseRetrieveSerializer(CourseSerializer): +class CourseSerializer(CourseCreateSerializer): category = CategorySerializer() materials = MaterialSerializer(many=True) cover = ImageObjectSerializer() diff --git a/api/v1/views.py b/api/v1/views.py index af0b0e4a..b92e3422 100644 --- a/api/v1/views.py +++ b/api/v1/views.py @@ -13,7 +13,7 @@ from .serializers import ( ImageTextSerializer, VideoSerializer, GallerySerializer, GalleryImageSerializer, GalleryImageCreateSerializer, UserSerializer, UserPhotoSerializer, - LessonSerializer, CourseRetrieveSerializer, + LessonSerializer, CourseCreateSerializer, ImageObjectSerializer, ) from .permissions import IsAdmin, IsAdminOrIsSelf, IsAuthorOrAdmin, IsAuthorObjectOrAdmin @@ -63,10 +63,10 @@ class CourseViewSet(ExtendedModelViewSet): ).prefetch_related( 'likes', 'materials', 'content', ).all() - serializer_class = CourseSerializer + serializer_class = CourseCreateSerializer serializer_class_map = { - 'list': CourseRetrieveSerializer, - 'retrieve': CourseRetrieveSerializer, + 'list': CourseSerializer, + 'retrieve': CourseSerializer, } filter_fields = ('category', 'status', 'is_infinite', 'is_featured',) search_fields = ('author__email', 'title', 'category__title',) From adbdfaf0ef5f2a231d8a3a64f0267f18c43581e0 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Thu, 8 Feb 2018 13:40:51 +0300 Subject: [PATCH 02/10] Update Lesson serializers --- api/v1/serializers.py | 9 ++++++--- api/v1/views.py | 8 ++++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/api/v1/serializers.py b/api/v1/serializers.py index 2ac04e6d..ed517425 100644 --- a/api/v1/serializers.py +++ b/api/v1/serializers.py @@ -169,8 +169,7 @@ class CourseSerializer(CourseCreateSerializer): gallery = GallerySerializer() -class LessonSerializer(serializers.ModelSerializer): - cover = ImageObjectSerializer() +class LessonCreateSerializer(serializers.ModelSerializer): class Meta: model = Lesson @@ -187,13 +186,17 @@ class LessonSerializer(serializers.ModelSerializer): read_only_fields = ( 'id', - 'cover', 'content', 'created_at', 'update_at', ) +class LessonSerializer(LessonCreateSerializer): + course = CourseSerializer() + cover = ImageObjectSerializer() + + class ImageSerializer(serializers.ModelSerializer): img = ImageObjectSerializer() diff --git a/api/v1/views.py b/api/v1/views.py index b92e3422..016f920b 100644 --- a/api/v1/views.py +++ b/api/v1/views.py @@ -14,7 +14,7 @@ from .serializers import ( GallerySerializer, GalleryImageSerializer, GalleryImageCreateSerializer, UserSerializer, UserPhotoSerializer, LessonSerializer, CourseCreateSerializer, - ImageObjectSerializer, + ImageObjectSerializer, LessonCreateSerializer, ) from .permissions import IsAdmin, IsAdminOrIsSelf, IsAuthorOrAdmin, IsAuthorObjectOrAdmin @@ -82,7 +82,11 @@ class LessonViewSet(ExtendedModelViewSet): queryset = Lesson.objects.select_related( 'course', 'cover' ).prefetch_related('content').all() - serializer_class = LessonSerializer + serializer_class = LessonCreateSerializer + serializer_class_map = { + 'list': LessonSerializer, + 'retrieve': LessonSerializer, + } filter_fields = ('course',) search_fields = ('title', 'short_description',) ordering_fields = ('title', 'created_at', 'update_at',) From 8de287f4fe8a51b54160e7963779723265866ae4 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Thu, 8 Feb 2018 13:44:42 +0300 Subject: [PATCH 03/10] Update Image(Content) serializers --- api/v1/serializers.py | 9 +++++++-- api/v1/views.py | 8 ++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/api/v1/serializers.py b/api/v1/serializers.py index ed517425..5e6757eb 100644 --- a/api/v1/serializers.py +++ b/api/v1/serializers.py @@ -197,8 +197,7 @@ class LessonSerializer(LessonCreateSerializer): cover = ImageObjectSerializer() -class ImageSerializer(serializers.ModelSerializer): - img = ImageObjectSerializer() +class ImageCreateSerializer(serializers.ModelSerializer): class Meta: model = Image @@ -220,6 +219,12 @@ class ImageSerializer(serializers.ModelSerializer): ) +class ImageSerializer(serializers.ModelSerializer): + course = CourseSerializer() + lesson = LessonSerializer() + img = ImageObjectSerializer() + + class TextSerializer(serializers.ModelSerializer): class Meta: diff --git a/api/v1/views.py b/api/v1/views.py index 016f920b..d487a057 100644 --- a/api/v1/views.py +++ b/api/v1/views.py @@ -9,7 +9,7 @@ from . import ExtendedModelViewSet from .serializers import ( CategorySerializer, CourseSerializer, MaterialSerializer, LikeSerializer, - ImageSerializer, TextSerializer, + ImageSerializer, TextSerializer, ImageCreateSerializer, ImageTextSerializer, VideoSerializer, GallerySerializer, GalleryImageSerializer, GalleryImageCreateSerializer, UserSerializer, UserPhotoSerializer, @@ -101,7 +101,11 @@ class ImageViewSet(ExtendedModelViewSet): queryset = Image.objects.select_related( 'course', 'lesson', 'img', ).all() - serializer_class = ImageSerializer + serializer_class = ImageCreateSerializer + serializer_class = { + 'list': ImageSerializer, + 'retrieve': ImageSerializer, + } search_fields = ('title',) ordering_fields = ('title', 'created_at', 'update_at', 'position',) # permission_classes = (IsAuthorOrAdmin,) From 5b6245722cf1424f796df427f71ed2ca8d809d13 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Thu, 8 Feb 2018 13:51:42 +0300 Subject: [PATCH 04/10] Update content app serializers --- api/v1/serializers.py | 23 +++++++++++++++++++---- api/v1/views.py | 34 +++++++++++++++++++++++++--------- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/api/v1/serializers.py b/api/v1/serializers.py index 5e6757eb..3e80d04c 100644 --- a/api/v1/serializers.py +++ b/api/v1/serializers.py @@ -225,7 +225,7 @@ class ImageSerializer(serializers.ModelSerializer): img = ImageObjectSerializer() -class TextSerializer(serializers.ModelSerializer): +class TextCreateSerializer(serializers.ModelSerializer): class Meta: model = Text @@ -246,8 +246,12 @@ class TextSerializer(serializers.ModelSerializer): ) -class ImageTextSerializer(serializers.ModelSerializer): - img = ImageObjectSerializer() +class TextSerializer(TextCreateSerializer): + course = CourseSerializer() + lesson = LessonSerializer() + + +class ImageTextCreateSerializer(serializers.ModelSerializer): class Meta: model = ImageText @@ -270,7 +274,13 @@ class ImageTextSerializer(serializers.ModelSerializer): ) -class VideoSerializer(serializers.ModelSerializer): +class ImageTextSerializer(ImageTextCreateSerializer): + course = CourseSerializer() + lesson = LessonSerializer() + img = ImageObjectSerializer() + + +class VideoCreateSerializer(serializers.ModelSerializer): class Meta: model = Video @@ -291,6 +301,11 @@ class VideoSerializer(serializers.ModelSerializer): ) +class VideoSerializer(VideoCreateSerializer): + course = CourseSerializer() + lesson = LessonSerializer() + + class UserSerializer(serializers.ModelSerializer): class Meta: diff --git a/api/v1/views.py b/api/v1/views.py index d487a057..f283e060 100644 --- a/api/v1/views.py +++ b/api/v1/views.py @@ -7,14 +7,18 @@ from rest_framework.response import Response from . import ExtendedModelViewSet from .serializers import ( - CategorySerializer, CourseSerializer, + CategorySerializer, + CourseSerializer, CourseCreateSerializer, MaterialSerializer, LikeSerializer, - ImageSerializer, TextSerializer, ImageCreateSerializer, - ImageTextSerializer, VideoSerializer, - GallerySerializer, GalleryImageSerializer, GalleryImageCreateSerializer, + ImageSerializer, ImageCreateSerializer, + TextSerializer, TextCreateSerializer, + ImageTextSerializer, ImageTextCreateSerializer, + VideoSerializer, VideoCreateSerializer, + GallerySerializer, + GalleryImageSerializer, GalleryImageCreateSerializer, UserSerializer, UserPhotoSerializer, - LessonSerializer, CourseCreateSerializer, - ImageObjectSerializer, LessonCreateSerializer, + LessonSerializer, LessonCreateSerializer, + ImageObjectSerializer, ) from .permissions import IsAdmin, IsAdminOrIsSelf, IsAuthorOrAdmin, IsAuthorObjectOrAdmin @@ -118,7 +122,11 @@ class TextViewSet(ExtendedModelViewSet): queryset = Text.objects.select_related( 'course', 'lesson' ).all() - serializer_class = TextSerializer + serializer_class = TextCreateSerializer + serializer_class_map = { + 'list': TextSerializer, + 'retrieve': TextSerializer, + } search_fields = ('title',) ordering_fields = ('title', 'created_at', 'update_at', 'position',) # permission_classes = (IsAuthorOrAdmin,) @@ -131,7 +139,11 @@ class ImageTextViewSet(ExtendedModelViewSet): queryset = ImageText.objects.select_related( 'course', 'lesson', 'img' ).all() - serializer_class = ImageTextSerializer + serializer_class = ImageTextCreateSerializer + serializer_class = { + 'list': ImageTextSerializer, + 'retrieve': ImageTextSerializer, + } search_fields = ('title',) ordering_fields = ('title', 'created_at', 'update_at', 'position',) # permission_classes = (IsAuthorOrAdmin,) @@ -144,7 +156,11 @@ class VideoViewSet(ExtendedModelViewSet): queryset = Video.objects.select_related( 'course', 'lesson' ).all() - serializer_class = VideoSerializer + serializer_class = VideoCreateSerializer + serializer_class_map = { + 'list': VideoSerializer, + 'retrieve': VideoSerializer, + } search_fields = ('title',) ordering_fields = ('title', 'created_at', 'update_at', 'position',) # permission_classes = (IsAuthorOrAdmin,) From dd1f0c04227e6dec9846e48fa64aac530bee9109 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Thu, 8 Feb 2018 13:57:30 +0300 Subject: [PATCH 05/10] Fix ImageSerializer --- api/v1/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/v1/serializers.py b/api/v1/serializers.py index 3e80d04c..e6d939de 100644 --- a/api/v1/serializers.py +++ b/api/v1/serializers.py @@ -219,7 +219,7 @@ class ImageCreateSerializer(serializers.ModelSerializer): ) -class ImageSerializer(serializers.ModelSerializer): +class ImageSerializer(ImageCreateSerializer): course = CourseSerializer() lesson = LessonSerializer() img = ImageObjectSerializer() From fe558ae1ee80941e797ffe97274025d137865bf9 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Thu, 8 Feb 2018 13:58:11 +0300 Subject: [PATCH 06/10] Fix serializer mapping on some viewsets --- api/v1/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/v1/views.py b/api/v1/views.py index f283e060..6f293576 100644 --- a/api/v1/views.py +++ b/api/v1/views.py @@ -106,7 +106,7 @@ class ImageViewSet(ExtendedModelViewSet): 'course', 'lesson', 'img', ).all() serializer_class = ImageCreateSerializer - serializer_class = { + serializer_class_map = { 'list': ImageSerializer, 'retrieve': ImageSerializer, } @@ -140,7 +140,7 @@ class ImageTextViewSet(ExtendedModelViewSet): 'course', 'lesson', 'img' ).all() serializer_class = ImageTextCreateSerializer - serializer_class = { + serializer_class_map = { 'list': ImageTextSerializer, 'retrieve': ImageTextSerializer, } From 3394da5a202bebf3403018404926e3091e44ce22 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Thu, 8 Feb 2018 13:58:56 +0300 Subject: [PATCH 07/10] Update Material model --- .../migrations/0026_auto_20180208_1053.py | 24 +++++++++++++++++++ apps/course/models.py | 6 ++++- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 apps/course/migrations/0026_auto_20180208_1053.py diff --git a/apps/course/migrations/0026_auto_20180208_1053.py b/apps/course/migrations/0026_auto_20180208_1053.py new file mode 100644 index 00000000..60bac8b8 --- /dev/null +++ b/apps/course/migrations/0026_auto_20180208_1053.py @@ -0,0 +1,24 @@ +# Generated by Django 2.0.2 on 2018-02-08 10:53 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('course', '0025_course_gallery'), + ] + + operations = [ + migrations.AlterField( + model_name='course', + name='price', + field=models.DecimalField(blank=True, decimal_places=2, help_text='Если цена не выставлена, то курс бесплатный', max_digits=10, null=True, verbose_name='Цена курса'), + ), + migrations.AlterField( + model_name='material', + name='cover', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='material_covers', to='content.ImageObject', verbose_name='Обложка материала'), + ), + ] diff --git a/apps/course/models.py b/apps/course/models.py index a00250fe..61cca877 100644 --- a/apps/course/models.py +++ b/apps/course/models.py @@ -128,7 +128,11 @@ class Lesson(models.Model): class Material(models.Model): title = models.CharField('Название материала', max_length=100) - cover = models.ImageField('Фон материала', upload_to='materials') + cover = models.ForeignKey( + ImageObject, related_name='material_covers', + verbose_name='Обложка материала', on_delete=models.CASCADE, + null=True, blank=True, + ) short_description = models.TextField('Краткое описание материала') created_at = models.DateTimeField(auto_now_add=True) From b701ff3c1081484d3f8620fe43dabda3e3604d58 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Thu, 8 Feb 2018 14:01:33 +0300 Subject: [PATCH 08/10] Update Material serializers --- api/v1/serializers.py | 7 +++++-- api/v1/views.py | 10 +++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/api/v1/serializers.py b/api/v1/serializers.py index e6d939de..96630f50 100644 --- a/api/v1/serializers.py +++ b/api/v1/serializers.py @@ -74,7 +74,7 @@ class GalleryImageSerializer(GalleryImageCreateSerializer): img = ImageObjectSerializer() -class MaterialSerializer(serializers.ModelSerializer): +class MaterialCreateSerializer(serializers.ModelSerializer): class Meta: model = Material @@ -89,12 +89,15 @@ class MaterialSerializer(serializers.ModelSerializer): read_only_fields = ( 'id', - 'cover', 'created_at', 'update_at', ) +class MaterialSerializer(MaterialCreateSerializer): + cover = ImageObjectSerializer() + + class LikeSerializer(serializers.ModelSerializer): class Meta: diff --git a/api/v1/views.py b/api/v1/views.py index 6f293576..db87e030 100644 --- a/api/v1/views.py +++ b/api/v1/views.py @@ -7,9 +7,9 @@ from rest_framework.response import Response from . import ExtendedModelViewSet from .serializers import ( - CategorySerializer, + CategorySerializer, LikeSerializer, CourseSerializer, CourseCreateSerializer, - MaterialSerializer, LikeSerializer, + MaterialSerializer, MaterialCreateSerializer, ImageSerializer, ImageCreateSerializer, TextSerializer, TextCreateSerializer, ImageTextSerializer, ImageTextCreateSerializer, @@ -39,7 +39,11 @@ class ImageObjectViewSet(ExtendedModelViewSet): class MaterialViewSet(ExtendedModelViewSet): queryset = Material.objects.all() - serializer_class = MaterialSerializer + serializer_class = MaterialCreateSerializer + serializer_class_map = { + 'list': MaterialSerializer, + 'retrieve': MaterialSerializer, + } search_fields = ('title', 'short_description',) ordering_fields = ('title', 'created_at', 'update_at',) # permission_classes = (IsAdmin,) From 45cab2b44ac1a464427a9d707afb3a3e2d2128f4 Mon Sep 17 00:00:00 2001 From: nikita Date: Thu, 8 Feb 2018 14:33:15 +0300 Subject: [PATCH 09/10] Docker-compose PORT variable --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index d4cda7ed..1736e0f3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,7 +22,7 @@ services: - DJANGO_SETTINGS_MODULE=project.settings - DATABASE_SERVICE_HOST=db ports: - - "8000:8000" + - "${PORT}:8000" depends_on: - db links: From 89866df70342ae4c337080097e5bb233f212111d Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Thu, 8 Feb 2018 15:28:16 +0300 Subject: [PATCH 10/10] Add ordering for User by date_joined field --- apps/user/models.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/user/models.py b/apps/user/models.py index 141073ce..5986e33c 100644 --- a/apps/user/models.py +++ b/apps/user/models.py @@ -41,3 +41,6 @@ class User(AbstractUser): USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['username'] + + class Meta(AbstractUser.Meta): + ordering = ('-date_joined',)