diff --git a/apps/establishment/migrations/0084_auto_20200129_1113.py b/apps/establishment/migrations/0084_auto_20200129_1113.py new file mode 100644 index 00000000..c041c7bd --- /dev/null +++ b/apps/establishment/migrations/0084_auto_20200129_1113.py @@ -0,0 +1,69 @@ +# Generated by Django 2.2.7 on 2020-01-29 11:13 + +from django.conf import settings +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import utils.methods + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('establishment', '0083_establishment_instagram'), + ] + + operations = [ + migrations.CreateModel( + name='MenuFiles', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Date created')), + ('modified', models.DateTimeField(auto_now=True, verbose_name='Date updated')), + ('file', models.FileField(blank=True, default=None, null=True, upload_to=utils.methods.file_path, validators=[django.core.validators.FileExtensionValidator(allowed_extensions=('jpg', 'jpeg', 'png', 'doc', 'docx', 'pdf'))], verbose_name='File')), + ('name', models.CharField(default='', max_length=255, verbose_name='name')), + ('type', models.CharField(default='', max_length=65, verbose_name='type')), + ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='menufiles_records_created', to=settings.AUTH_USER_MODEL, verbose_name='created by')), + ('modified_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='menufiles_records_modified', to=settings.AUTH_USER_MODEL, verbose_name='modified by')), + ], + options={ + 'verbose_name': 'menu upload', + 'verbose_name_plural': 'menu uploads', + }, + ), + migrations.RemoveField( + model_name='menuuploads', + name='created_by', + ), + migrations.RemoveField( + model_name='menuuploads', + name='menu', + ), + migrations.RemoveField( + model_name='menuuploads', + name='modified_by', + ), + migrations.AddField( + model_name='menu', + name='name', + field=models.CharField(default='', max_length=255, verbose_name='name'), + ), + migrations.AlterField( + model_name='menu', + name='schedule', + field=models.ManyToManyField(blank=True, to='timetable.Timetable', verbose_name='Menu schedule'), + ), + migrations.DeleteModel( + name='MenuGallery', + ), + migrations.DeleteModel( + name='MenuUploads', + ), + migrations.AddField( + model_name='menu', + name='uploads', + field=models.ManyToManyField(blank=True, to='establishment.MenuFiles', verbose_name='Menu files'), + ), + ] diff --git a/apps/establishment/migrations/0085_menu_price.py b/apps/establishment/migrations/0085_menu_price.py new file mode 100644 index 00000000..23afcba4 --- /dev/null +++ b/apps/establishment/migrations/0085_menu_price.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.7 on 2020-01-29 11:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('establishment', '0084_auto_20200129_1113'), + ] + + operations = [ + migrations.AddField( + model_name='menu', + name='price', + field=models.IntegerField(blank=True, default=None, null=True, verbose_name='price'), + ), + ] diff --git a/apps/establishment/models.py b/apps/establishment/models.py index 83a7c5e8..9f5fa7fd 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -1283,6 +1283,7 @@ class Menu(GalleryMixin, TranslatedFieldsMixin, BaseAttributes): 'establishment.Establishment', verbose_name=_('establishment'), on_delete=models.CASCADE) is_drinks_included = models.BooleanField(_('is drinks included'), default=False) + price = models.IntegerField(blank=True, null=True, default=None, verbose_name=_('price')) schedule = models.ManyToManyField( to='timetable.Timetable', blank=True, @@ -1306,9 +1307,13 @@ class Menu(GalleryMixin, TranslatedFieldsMixin, BaseAttributes): class MenuFiles(FileMixin, BaseAttributes): """Menu files""" + TYPES = ( + ('image', 'Image'), + ('file', 'File') + ) name = models.CharField(_('name'), max_length=255, default='') - type = models.CharField(_('type'), max_length=65, default='') + type = models.CharField(_('type'), choices=TYPES, max_length=65, default='') class Meta: verbose_name = _('menu upload') diff --git a/apps/establishment/serializers/common.py b/apps/establishment/serializers/common.py index 4bb1a8d4..f861d593 100644 --- a/apps/establishment/serializers/common.py +++ b/apps/establishment/serializers/common.py @@ -2,6 +2,7 @@ import logging from django.conf import settings +from django.shortcuts import get_object_or_404 from django.utils.translation import ugettext_lazy as _ from phonenumber_field.phonenumber import to_python as str_to_phonenumber from rest_framework import serializers @@ -9,24 +10,18 @@ from rest_framework import serializers from comment import models as comment_models from comment.serializers import common as comment_serializers from establishment import models -from establishment.models import Establishment from location.serializers import ( - AddressBaseSerializer, CityBaseSerializer, AddressDetailSerializer, - CityShortSerializer, -) -from location.serializers import ( - EstablishmentWineRegionBaseSerializer, - EstablishmentWineOriginBaseSerializer, + AddressBaseSerializer, AddressDetailSerializer, CityBaseSerializer, + CityShortSerializer, EstablishmentWineOriginBaseSerializer, EstablishmentWineRegionBaseSerializer, ) from main.serializers import AwardSerializer, CurrencySerializer from review.serializers import ReviewShortSerializer from tag.serializers import TagBaseSerializer from timetable.serialziers import ScheduleRUDSerializer from utils import exceptions as utils_exceptions -from utils.serializers import ImageBaseSerializer, CarouselCreateSerializer from utils.serializers import ( + CarouselCreateSerializer, FavoritesCreateSerializer, ImageBaseSerializer, ProjectModelSerializer, TranslatedField, - FavoritesCreateSerializer, ) logger = logging.getLogger(__name__) @@ -77,22 +72,41 @@ class PlateSerializer(ProjectModelSerializer): ] +class MenuFilesSerializers(ProjectModelSerializer): + menu_id = serializers.IntegerField(write_only=True) + + class Meta: + model = models.MenuFiles + fields = [ + 'id', + 'name', + 'type', + 'file', + 'menu_id' + ] + + def create(self, validated_data): + menu_id = validated_data.pop('menu_id') + menu = get_object_or_404(models.Menu, pk=menu_id) + instance = models.MenuFiles.objects.create(**validated_data) + menu.uploads.add(instance) + return instance + + class MenuSerializers(ProjectModelSerializer): name = serializers.CharField() establishment_id = serializers.PrimaryKeyRelatedField(queryset=models.Establishment.objects.all()) establishment_slug = serializers.CharField(read_only=True, source='establishment.slug') - price = serializers.IntegerField(read_only=True, source='establishment.price_level', required=False) - drinks_included = serializers.BooleanField(source='is_drinks_included', required=FavoritesCreateSerializer) + price = serializers.IntegerField(required=False) + drinks_included = serializers.BooleanField(source='is_drinks_included', required=False) schedules = ScheduleRUDSerializer(many=True, allow_null=True, required=False) - uploads = serializers.FileField(allow_null=True, required=False) - category_translated = serializers.CharField(read_only=True) + uploads = MenuFilesSerializers(many=True, read_only=True) class Meta: model = models.Menu fields = [ 'id', 'name', - 'establishment', 'establishment_id', 'establishment_slug', 'price', @@ -100,39 +114,35 @@ class MenuSerializers(ProjectModelSerializer): 'schedules', 'uploads', 'category', - 'category_translated', ] def create(self, validated_data): - print(validated_data, '\n\n\n\n\n') - establishment = models.Establishment.objects.get(pk=validated_data.pop('establishment')) - validated_data['establishment'] = establishment['id'] + validated_data['establishment'] = validated_data.pop('establishment_id') instance = models.Menu.objects.create(**validated_data) return instance -''' -{ - "name": "Menu test", - "establishment_id": 1, - "price": 1, - "drinks_included": true, - "schedules": [], - "uploads": null, - "category": null -} -''' - class MenuRUDSerializers(ProjectModelSerializer): - plates = PlateSerializer(read_only=True, many=True, source='plate_set') + name = serializers.CharField() + establishment_id = serializers.PrimaryKeyRelatedField(read_only=True) + establishment_slug = serializers.CharField(read_only=True, source='establishment.slug') + price = serializers.IntegerField(required=False) + drinks_included = serializers.BooleanField(source='is_drinks_included', required=False) + schedules = ScheduleRUDSerializer(many=True, allow_null=True, required=False) + uploads = MenuFilesSerializers(many=True) class Meta: model = models.Menu fields = [ 'id', + 'name', + 'establishment_id', + 'establishment_slug', + 'price', + 'drinks_included', + 'schedules', + 'uploads', 'category', - 'plates', - 'establishment' ] @@ -566,7 +576,7 @@ class EstablishmentCommentBaseSerializer(comment_serializers.CommentBaseSerializ 'created', 'text', 'mark', - 'nickname', + # 'nickname', 'profile_pic', 'status', 'status_display', @@ -606,7 +616,7 @@ class EstablishmentCommentRUDSerializer(comment_serializers.CommentBaseSerialize 'created', 'text', 'mark', - 'nickname', + # 'nickname', 'profile_pic', ] diff --git a/apps/establishment/urls/back.py b/apps/establishment/urls/back.py index 6db9d07a..b046cf85 100644 --- a/apps/establishment/urls/back.py +++ b/apps/establishment/urls/back.py @@ -37,6 +37,8 @@ urlpatterns = [ # name='menu-dishes-gallery-create-destroy'), path('menus/', views.MenuListCreateView.as_view(), name='menu-list'), path('menus//', views.MenuRUDView.as_view(), name='menu-rud'), + path('menus/uploads/', views.MenuFilesListCreateView.as_view(), name='menu-files-list'), + path('menus/uploads//', views.MenuFilesRUDView.as_view(), name='menu-files-rud'), path('plates/', views.PlateListCreateView.as_view(), name='plates'), path('plates//', views.PlateRUDView.as_view(), name='plate-rud'), path('social_choice/', views.SocialChoiceListCreateView.as_view(), name='socials_choice'), diff --git a/apps/establishment/views/back.py b/apps/establishment/views/back.py index b56ebf10..e7e2ad44 100644 --- a/apps/establishment/views/back.py +++ b/apps/establishment/views/back.py @@ -2,7 +2,7 @@ from django.shortcuts import get_object_or_404 from django_filters.rest_framework import DjangoFilterBackend -from rest_framework import generics, permissions, response +from rest_framework import generics, permissions from rest_framework.response import Response from account.models import User @@ -136,6 +136,20 @@ class MenuRUDView(generics.RetrieveUpdateDestroyAPIView): permission_classes = [IsWineryReviewer | IsEstablishmentManager] +class MenuFilesListCreateView(generics.ListCreateAPIView): + """Menu files list create view.""" + serializer_class = serializers.MenuFilesSerializers + queryset = models.MenuFiles.objects.all() + permission_classes = [IsWineryReviewer | IsEstablishmentManager] + + +class MenuFilesRUDView(generics.RetrieveDestroyAPIView): + """Menu files RUD view.""" + serializer_class = serializers.MenuFilesSerializers + queryset = models.MenuFiles.objects.all() + permission_classes = [IsWineryReviewer | IsEstablishmentManager] + + class SocialChoiceListCreateView(generics.ListCreateAPIView): """SocialChoice list create view.""" serializer_class = serializers.SocialChoiceSerializers @@ -466,7 +480,6 @@ class MenuDishesRUDView(generics.RetrieveUpdateDestroyAPIView): queryset = models.Menu.objects.dishes().distinct() permission_classes = [IsWineryReviewer | IsEstablishmentManager] - # class MenuGalleryListView(generics.ListAPIView): # """Resource for returning gallery for menu for back-office users.""" # serializer_class = serializers.ImageBaseSerializer