From e8e1fc75e9682107a21654548c4bf184c0669bab Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Wed, 21 Feb 2018 11:22:56 +0300 Subject: [PATCH 1/4] LIL-256. Add age field to SchoolSchedule --- .../migrations/0002_schoolschedule_age.py | 18 ++++++++++++++++++ apps/school/models.py | 1 + 2 files changed, 19 insertions(+) create mode 100644 apps/school/migrations/0002_schoolschedule_age.py diff --git a/apps/school/migrations/0002_schoolschedule_age.py b/apps/school/migrations/0002_schoolschedule_age.py new file mode 100644 index 00000000..3f15d01c --- /dev/null +++ b/apps/school/migrations/0002_schoolschedule_age.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.2 on 2018-02-21 08:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('school', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='schoolschedule', + name='age', + field=models.PositiveSmallIntegerField(default=0, verbose_name='Возраст'), + ), + ] diff --git a/apps/school/models.py b/apps/school/models.py index b77e1925..a7b5a4a2 100644 --- a/apps/school/models.py +++ b/apps/school/models.py @@ -15,6 +15,7 @@ class SchoolSchedule(models.Model): title = models.CharField('Заголовок', default='', max_length=100, db_index=True) description = models.TextField('Описание') materials = models.TextField('Материалы') + age = models.PositiveSmallIntegerField('Возраст', default=0) month_price = models.DecimalField('Цена', max_digits=8, decimal_places=2, default=0) class Meta: From b0e6f68fe226986f4d4996b7e19f5519ca118797 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Wed, 21 Feb 2018 12:02:24 +0300 Subject: [PATCH 2/4] Fix tupos --- .../migrations/0003_auto_20180221_0901.py | 17 +++++++++++++++++ apps/school/models.py | 4 ++-- 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 apps/school/migrations/0003_auto_20180221_0901.py diff --git a/apps/school/migrations/0003_auto_20180221_0901.py b/apps/school/migrations/0003_auto_20180221_0901.py new file mode 100644 index 00000000..3df9e183 --- /dev/null +++ b/apps/school/migrations/0003_auto_20180221_0901.py @@ -0,0 +1,17 @@ +# Generated by Django 2.0.2 on 2018-02-21 09:01 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('school', '0002_schoolschedule_age'), + ] + + operations = [ + migrations.AlterModelOptions( + name='schoolschedule', + options={'ordering': ('weekday',), 'verbose_name': 'Расписание', 'verbose_name_plural': 'Расписания'}, + ), + ] diff --git a/apps/school/models.py b/apps/school/models.py index a7b5a4a2..9eb3d83e 100644 --- a/apps/school/models.py +++ b/apps/school/models.py @@ -20,5 +20,5 @@ class SchoolSchedule(models.Model): class Meta: ordering = ('weekday',) - verbose_name = 'Рассписание' - verbose_name_plural = 'Рассписания' + verbose_name = 'Расписание' + verbose_name_plural = 'Расписания' From acb43aa16efd88cf372281fb2349a2240a7e665e Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Wed, 21 Feb 2018 12:03:27 +0300 Subject: [PATCH 3/4] LIL-256. Add serializer, viewset & route for SchoolSchedule --- api/v1/serializers/school.py | 22 ++++++++++++++++++++++ api/v1/urls.py | 30 +++++++++++++++++------------- api/v1/views.py | 9 ++++++++- 3 files changed, 47 insertions(+), 14 deletions(-) create mode 100644 api/v1/serializers/school.py diff --git a/api/v1/serializers/school.py b/api/v1/serializers/school.py new file mode 100644 index 00000000..29e76ad1 --- /dev/null +++ b/api/v1/serializers/school.py @@ -0,0 +1,22 @@ +from rest_framework import serializers + +from apps.school.models import SchoolSchedule + + +class SchoolScheduleSerializer(serializers.ModelSerializer): + + class Meta: + model = SchoolSchedule + fields = ( + 'id', + 'weekday', + 'title', + 'description', + 'materials', + 'age', + 'month_price', + ) + + read_only_fields = ( + 'id', + ) diff --git a/api/v1/urls.py b/api/v1/urls.py index 305b053d..171b7794 100644 --- a/api/v1/urls.py +++ b/api/v1/urls.py @@ -14,6 +14,7 @@ from .views import ( ImageTextViewSet, VideoViewSet, GalleryViewSet, GalleryImageViewSet, UserViewSet, LessonViewSet, ImageObjectViewSet, + SchoolScheduleViewSet, ) router = DefaultRouter() @@ -30,24 +31,27 @@ 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') + +router.register(r'school-schedules', SchoolScheduleViewSet, base_name='school-schedules') + router.register(r'users', UserViewSet, base_name='users') schema_view = get_schema_view( - openapi.Info( - title="Lil Sity API", - default_version='v1', - description="Routes of Lil City project", - ), - validators=['flex', 'ssv'], - public=False, - permission_classes=(permissions.AllowAny,), + openapi.Info( + title="Lil Sity API", + default_version='v1', + description="Routes of Lil City project", + ), + validators=['flex', 'ssv'], + public=False, + permission_classes=(permissions.AllowAny,), ) urlpatterns = [ - path('swagger(.json|.yaml)', schema_view.without_ui(cache_timeout=None), name='schema-json'), - path('swagger/', schema_view.with_ui('swagger', cache_timeout=None), name='schema-swagger-ui'), - path('redoc/', schema_view.with_ui('redoc', cache_timeout=None), name='schema-redoc'), - path('api-token-auth/', ObtainToken.as_view(), name='api-token-auth'), - path('', include((router.urls, 'api-root')), name='api-root'), + path('swagger(.json|.yaml)', schema_view.without_ui(cache_timeout=None), name='schema-json'), + path('swagger/', schema_view.with_ui('swagger', cache_timeout=None), name='schema-swagger-ui'), + path('redoc/', schema_view.with_ui('redoc', cache_timeout=None), name='schema-redoc'), + path('api-token-auth/', ObtainToken.as_view(), name='api-token-auth'), + path('', include((router.urls, 'api-root')), name='api-root'), ] diff --git a/api/v1/views.py b/api/v1/views.py index 56c65ff9..90591e0c 100644 --- a/api/v1/views.py +++ b/api/v1/views.py @@ -23,6 +23,7 @@ from .serializers.content import ( GalleryImageSerializer, GalleryImageCreateSerializer, ImageObjectSerializer, ) +from .serializers.school import SchoolScheduleSerializer from .serializers.user import ( UserSerializer, UserPhotoSerializer, ) @@ -34,7 +35,7 @@ from apps.content.models import ( Image, Text, ImageText, Video, Gallery, GalleryImage, ImageObject, ) - +from apps.school.models import SchoolSchedule User = get_user_model() @@ -285,3 +286,9 @@ class UserViewSet(ExtendedModelViewSet): return Response({'success': True}) else: return Response({'success': False}, status=status.HTTP_400_BAD_REQUEST) + + +class SchoolScheduleViewSet(ExtendedModelViewSet): + queryset = SchoolSchedule.objects.all() + serializer_class = SchoolScheduleSerializer + permission_classes = (IsAdmin,) From 724793ab14da05b0037b159c74d64fea87383865 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Wed, 21 Feb 2018 12:19:42 +0300 Subject: [PATCH 4/4] Fix Category ordering for admin site --- api/v1/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/v1/views.py b/api/v1/views.py index 90591e0c..2d5add55 100644 --- a/api/v1/views.py +++ b/api/v1/views.py @@ -66,7 +66,7 @@ class LikeViewSet(ExtendedModelViewSet): class CategoryViewSet(ExtendedModelViewSet): - queryset = Category.objects.all() + queryset = Category.objects.order_by('-id') serializer_class = CategorySerializer search_fields = ('title',) ordering_fields = ('title',)