From 9c319c45a098e1243a420279aef054a112d50510 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Mon, 5 Feb 2018 16:16:47 +0300 Subject: [PATCH] LIL-166. Add serializer, viewset, route, admin, models Gallery & GalleryImage --- api/v1/serializers.py | 43 +++++++++++++++++- api/v1/urls.py | 3 ++ api/v1/views.py | 16 ++++++- apps/content/admin.py | 15 ++++++- .../migrations/0004_gallery_galleryimage.py | 45 +++++++++++++++++++ apps/content/models.py | 35 +++++++++++++++ 6 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 apps/content/migrations/0004_gallery_galleryimage.py diff --git a/api/v1/serializers.py b/api/v1/serializers.py index fcecf473..4f01c5e8 100644 --- a/api/v1/serializers.py +++ b/api/v1/serializers.py @@ -1,7 +1,10 @@ from rest_framework import serializers from apps.course.models import Category, Course, Material, Like -from apps.content.models import Image, Text, ImageText, Video +from apps.content.models import ( + Image, Text, ImageText, Video, + Gallery, GalleryImage, +) class MaterialSerializer(serializers.ModelSerializer): @@ -170,3 +173,41 @@ class VideoSerializer(serializers.ModelSerializer): 'created_at', 'update_at', ) + + +class GallerySerializer(serializers.ModelSerializer): + + class Meta: + model = Gallery + fields = ( + 'id', + 'course', + 'title', + 'created_at', + 'update_at', + ) + + read_only_fields = ( + 'id', + 'created_at', + 'update_at', + ) + + +class GalleryImageSerializer(serializers.ModelSerializer): + + class Meta: + model = GalleryImage + fields = ( + 'id', + 'gallery', + 'image', + 'created_at', + 'update_at', + ) + + read_only_fields = ( + 'id', + 'created_at', + 'update_at', + ) diff --git a/api/v1/urls.py b/api/v1/urls.py index cd13a131..e02ee44e 100644 --- a/api/v1/urls.py +++ b/api/v1/urls.py @@ -11,6 +11,7 @@ from .views import ( MaterialViewSet, LikeViewSet, ImageViewSet, TextViewSet, ImageTextViewSet, VideoViewSet, + GalleryViewSet, GalleryImageViewSet, ) router = DefaultRouter() @@ -23,6 +24,8 @@ router.register(r'images', ImageViewSet, base_name='images') router.register(r'texts', TextViewSet, base_name='texts') router.register(r'image-texts', ImageTextViewSet, base_name='image-texts') router.register(r'videos', VideoViewSet, base_name='videos') +router.register(r'galleries', GalleryViewSet, base_name='galleries') +router.register(r'gallery-images', GalleryImageViewSet, base_name='gallery-images') schema_view = get_schema_view( diff --git a/api/v1/views.py b/api/v1/views.py index 64f9e7cb..cb58c9bb 100644 --- a/api/v1/views.py +++ b/api/v1/views.py @@ -6,10 +6,14 @@ from .serializers import ( MaterialSerializer, LikeSerializer, ImageSerializer, TextSerializer, ImageTextSerializer, VideoSerializer, + GallerySerializer, GalleryImageSerializer, ) from apps.course.models import Category, Course, Material, Like -from apps.content.models import Image, Text, ImageText, Video +from apps.content.models import ( + Image, Text, ImageText, Video, + Gallery, GalleryImage, +) class MaterialViewSet(ExtendedModelViewSet): @@ -63,3 +67,13 @@ class VideoViewSet(ExtendedModelViewSet): 'course', 'lesson' ).all() serializer_class = VideoSerializer + + +class GalleryViewSet(ExtendedModelViewSet): + queryset = Gallery.objects.select_related('course').all() + serializer_class = GallerySerializer + + +class GalleryImageViewSet(ExtendedModelViewSet): + queryset = GalleryImage.objects.select_related('gallery').all() + serializer_class = GalleryImageSerializer diff --git a/apps/content/admin.py b/apps/content/admin.py index e2f35219..53619829 100644 --- a/apps/content/admin.py +++ b/apps/content/admin.py @@ -5,7 +5,10 @@ from polymorphic.admin import ( PolymorphicChildModelFilter, ) -from .models import Content, Image, ImageText, Text, Video +from apps.content.models import ( + Content, Image, Text, ImageText, Video, + Gallery, GalleryImage, +) class ContentChildAdmin(PolymorphicChildModelAdmin): @@ -41,3 +44,13 @@ class ContentAdmin(PolymorphicParentModelAdmin): ImageText, Video ) + + +@admin.register(Gallery) +class GalleryAdmin(admin.ModelAdmin): + pass + + +@admin.register(GalleryImage) +class GalleryImageAdmin(admin.ModelAdmin): + pass diff --git a/apps/content/migrations/0004_gallery_galleryimage.py b/apps/content/migrations/0004_gallery_galleryimage.py new file mode 100644 index 00000000..aed5808e --- /dev/null +++ b/apps/content/migrations/0004_gallery_galleryimage.py @@ -0,0 +1,45 @@ +# Generated by Django 2.0.2 on 2018-02-05 13:09 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('course', '0020_auto_20180202_1716'), + ('content', '0003_auto_20180205_1246'), + ] + + operations = [ + migrations.CreateModel( + name='Gallery', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(default='', max_length=100, verbose_name='Заголовок')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('update_at', models.DateTimeField(auto_now=True)), + ('course', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='course.Course', verbose_name='Курс')), + ], + options={ + 'verbose_name': 'Галерея', + 'verbose_name_plural': 'Галереи', + 'ordering': ('-created_at',), + }, + ), + migrations.CreateModel( + name='GalleryImage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('image', models.ImageField(upload_to='content/gallery_images', verbose_name='Изображение')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('update_at', models.DateTimeField(auto_now=True)), + ('gallery', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='content.Gallery', verbose_name='Галерея')), + ], + options={ + 'verbose_name': 'Изображение в галерее', + 'verbose_name_plural': 'Изображения в галерее', + 'ordering': ('-created_at',), + }, + ), + ] diff --git a/apps/content/models.py b/apps/content/models.py index 33a32f6f..aa5e87a8 100644 --- a/apps/content/models.py +++ b/apps/content/models.py @@ -46,3 +46,38 @@ class ImageText(Content): class Video(Content): url = models.URLField('Ссылка') + + +class Gallery(models.Model): + course = models.ForeignKey( + Course, on_delete=models.CASCADE, + null=True, blank=True, + verbose_name='Курс' + ) + title = models.CharField('Заголовок', max_length=100, default='') + + created_at = models.DateTimeField(auto_now_add=True) + update_at = models.DateTimeField(auto_now=True) + + class Meta: + verbose_name = 'Галерея' + verbose_name_plural = 'Галереи' + ordering = ('-created_at',) + + +class GalleryImage(models.Model): + gallery = models.ForeignKey( + Gallery, on_delete=models.CASCADE, + verbose_name='Галерея' + ) + image = models.ImageField( + 'Изображение', upload_to='content/gallery_images' + ) + + created_at = models.DateTimeField(auto_now_add=True) + update_at = models.DateTimeField(auto_now=True) + + class Meta: + verbose_name = 'Изображение в галерее' + verbose_name_plural = 'Изображения в галерее' + ordering = ('-created_at',)