From e27899c5dabd3017da7035c304dffa63ea5c42c2 Mon Sep 17 00:00:00 2001 From: Sanasol Date: Mon, 9 Apr 2018 20:26:08 +0300 Subject: [PATCH] LIL-255 --- api/v1/serializers/school.py | 101 +++++++++++++++++- .../0006_schoolschedule_start_at.py | 18 ++++ .../migrations/0007_schoolscheduleimage.py | 30 ++++++ apps/school/models.py | 24 +++++ apps/user/fixtures/superuser.json | 2 +- .../migrations/0020_auto_20180409_1144.py | 18 ++++ apps/user/models.py | 4 +- apps/user/templates/user/payment-history.html | 2 +- project/templates/lilcity/edit_index.html | 2 +- project/templates/lilcity/index.html | 2 +- 10 files changed, 197 insertions(+), 6 deletions(-) create mode 100644 apps/school/migrations/0006_schoolschedule_start_at.py create mode 100644 apps/school/migrations/0007_schoolscheduleimage.py create mode 100644 apps/user/migrations/0020_auto_20180409_1144.py diff --git a/api/v1/serializers/school.py b/api/v1/serializers/school.py index fa3b0a4f..b3d911d1 100644 --- a/api/v1/serializers/school.py +++ b/api/v1/serializers/school.py @@ -1,9 +1,44 @@ from rest_framework import serializers -from apps.school.models import SchoolSchedule +from apps.school.models import ( + SchoolSchedule, SchoolScheduleImage, ImageObject +) + +from .content import ( + ImageObjectSerializer +) + +from pprint import pprint + + +class GalleryImageCreateSerializer(serializers.ModelSerializer): + + class Meta: + model = SchoolScheduleImage + fields = ( + 'id', + 'img', + 'created_at', + 'update_at', + ) + + read_only_fields = ( + 'id', + 'created_at', + 'update_at', + ) + + +class GalleryImageSerializer(GalleryImageCreateSerializer): + img = ImageObjectSerializer() class SchoolScheduleSerializer(serializers.ModelSerializer): + start_at = serializers.TimeField(format='%H:%M') + schoolschedule_images = serializers.ListSerializer( + child=GalleryImageCreateSerializer(), + required=False, + ) class Meta: model = SchoolSchedule @@ -16,8 +51,72 @@ class SchoolScheduleSerializer(serializers.ModelSerializer): 'age', 'month_price', 'day_discount', + 'start_at', + 'schoolschedule_images', ) read_only_fields = ( 'id', ) + + def create(self, validated_data): + gallery = validated_data.pop('schoolschedule_images', []) + schoolschedule = super().create(validated_data) + pprint('before create dispatch gallery') + pprint(schoolschedule) + pprint(gallery) + self.dispatch_gallery(schoolschedule, gallery) + return schoolschedule + + def update(self, instance, validated_data): + gallery = validated_data.pop('schoolschedule_images', []) + schoolschedule = super().update(instance, validated_data) + self.dispatch_gallery(schoolschedule, gallery) + return schoolschedule + + def dispatch_gallery(self, schoolschedule, gallery): + for image in gallery: + + imgs = SchoolScheduleImage.objects.filter( + schoolschedule=schoolschedule, + img=image['img'] + ) + + if imgs.count() > 0: + pass + else: + si = SchoolScheduleImage.objects.create( + schoolschedule=schoolschedule, + img=image['img'], + ) + + def to_representation(self, instance): + return SchoolScheduleSerializerImg(instance, context=self.context).to_representation(instance) + + +class SchoolScheduleSerializerImg(serializers.ModelSerializer): + start_at = serializers.TimeField(format='%H:%M') + schoolschedule_images = serializers.ListSerializer( + child=GalleryImageSerializer(), + required=False, + ) + + class Meta: + model = SchoolSchedule + fields = ( + 'id', + 'weekday', + 'title', + 'description', + 'materials', + 'age', + 'month_price', + 'day_discount', + 'start_at', + 'schoolschedule_images', + ) + + read_only_fields = ( + 'id', + ) + diff --git a/apps/school/migrations/0006_schoolschedule_start_at.py b/apps/school/migrations/0006_schoolschedule_start_at.py new file mode 100644 index 00000000..88218573 --- /dev/null +++ b/apps/school/migrations/0006_schoolschedule_start_at.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.3 on 2018-04-09 12:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('school', '0005_schoolschedule_day_discount'), + ] + + operations = [ + migrations.AddField( + model_name='schoolschedule', + name='start_at', + field=models.TimeField(null=True, verbose_name='Начало урока'), + ), + ] diff --git a/apps/school/migrations/0007_schoolscheduleimage.py b/apps/school/migrations/0007_schoolscheduleimage.py new file mode 100644 index 00000000..67d0bc3b --- /dev/null +++ b/apps/school/migrations/0007_schoolscheduleimage.py @@ -0,0 +1,30 @@ +# Generated by Django 2.0.3 on 2018-04-09 13:01 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('content', '0017_auto_20180406_1847'), + ('school', '0006_schoolschedule_start_at'), + ] + + operations = [ + migrations.CreateModel( + name='SchoolScheduleImage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('update_at', models.DateTimeField(auto_now=True)), + ('img', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='schoolschedule_images', to='content.ImageObject', verbose_name='Объект изображения')), + ('schoolschedule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='schoolschedule_images', to='school.SchoolSchedule', verbose_name='День занятия')), + ], + options={ + 'verbose_name': 'Изображение в галерее', + 'verbose_name_plural': 'Изображения в галерее', + 'ordering': ('-created_at',), + }, + ), + ] diff --git a/apps/school/models.py b/apps/school/models.py index a51e2b09..551c5893 100644 --- a/apps/school/models.py +++ b/apps/school/models.py @@ -1,5 +1,7 @@ from django.db import models +from apps.content.models import ImageObject + class SchoolSchedule(models.Model): WEEKDAY_CHOICES = ( @@ -18,6 +20,7 @@ class SchoolSchedule(models.Model): age = models.PositiveSmallIntegerField('Возраст', default=0) month_price = models.DecimalField('Цена', max_digits=8, decimal_places=2, default=0) day_discount = models.DecimalField('Скидка, в валюте', max_digits=8, decimal_places=2, default=0) + start_at = models.TimeField('Начало урока', null=True) class Meta: ordering = ('weekday',) @@ -26,3 +29,24 @@ class SchoolSchedule(models.Model): def __str__(self): return dict(self.WEEKDAY_CHOICES).get(self.weekday, '') + + +class SchoolScheduleImage(models.Model): + schoolschedule = models.ForeignKey( + SchoolSchedule, on_delete=models.CASCADE, + verbose_name='День занятия', related_name='schoolschedule_images' + ) + img = models.ForeignKey( + ImageObject, related_name='schoolschedule_images', + verbose_name='Объект изображения', on_delete=models.CASCADE, + null=True, blank=True, + ) + + 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',) + diff --git a/apps/user/fixtures/superuser.json b/apps/user/fixtures/superuser.json index 96362183..e2273736 100644 --- a/apps/user/fixtures/superuser.json +++ b/apps/user/fixtures/superuser.json @@ -13,7 +13,7 @@ "is_active": true, "date_joined": "2018-01-28T08:41:19Z", "email": "admin@lil.city", - "role": 2, + "role": 3, "gender": "n", "country": "", "city": "", diff --git a/apps/user/migrations/0020_auto_20180409_1144.py b/apps/user/migrations/0020_auto_20180409_1144.py new file mode 100644 index 00000000..7fd52853 --- /dev/null +++ b/apps/user/migrations/0020_auto_20180409_1144.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.3 on 2018-04-09 11:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('user', '0019_user_show_in_mainpage'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='role', + field=models.PositiveSmallIntegerField(choices=[(0, 'пользователь'), (1, 'автор'), (2, 'преподаватель'), (3, 'администратор')], default=0, verbose_name='Роль'), + ), + ] diff --git a/apps/user/models.py b/apps/user/models.py index 8d29759f..7c3bb6ae 100644 --- a/apps/user/models.py +++ b/apps/user/models.py @@ -19,10 +19,12 @@ from apps.user.tasks import user_to_mixpanel class User(AbstractUser): USER_ROLE = 0 AUTHOR_ROLE = 1 - ADMIN_ROLE = 2 + TEACHER_ROLE = 2 + ADMIN_ROLE = 3 ROLE_CHOICES = ( (USER_ROLE, 'пользователь'), (AUTHOR_ROLE, 'автор'), + (TEACHER_ROLE, 'преподаватель'), (ADMIN_ROLE, 'администратор'), ) NOT_DEFINED = 'n' diff --git a/apps/user/templates/user/payment-history.html b/apps/user/templates/user/payment-history.html index 63de99bd..0bf3e93f 100644 --- a/apps/user/templates/user/payment-history.html +++ b/apps/user/templates/user/payment-history.html @@ -31,7 +31,7 @@ {% endif %} -{% if request.user.role == 1 or request.user.role == 2 %} +{% if request.user.role >= request.user.AUTHOR_ROLE %}
Вывести деньги со счета
diff --git a/project/templates/lilcity/edit_index.html b/project/templates/lilcity/edit_index.html index b5e79164..de6d31f3 100644 --- a/project/templates/lilcity/edit_index.html +++ b/project/templates/lilcity/edit_index.html @@ -64,7 +64,7 @@