Added migration

This commit is contained in:
dormantman 2020-01-30 20:58:45 +03:00
parent 14d9b32479
commit b94e933cb1
4 changed files with 217 additions and 88 deletions

View File

@ -0,0 +1,140 @@
# Generated by Django 2.2.7 on 2020-01-30 17:58
from django.conf import settings
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('gallery', '0008_merge_20191212_0752'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('establishment', '0088_merge_20200130_1318'),
]
operations = [
migrations.CreateModel(
name='MenuGallery',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('is_main', models.BooleanField(default=False, verbose_name='Is the main image')),
('image', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='menu_gallery', to='gallery.Image', verbose_name='image')),
],
options={
'verbose_name': 'menu gallery',
'verbose_name_plural': 'menu galleries',
},
),
migrations.CreateModel(
name='MenuUploads',
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')),
('title', models.CharField(default='', max_length=255, verbose_name='title')),
('file', models.FileField(upload_to='', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=('doc', 'docx', 'pdf'))], verbose_name='File')),
('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='menuuploads_records_created', to=settings.AUTH_USER_MODEL, verbose_name='created by')),
],
options={
'verbose_name': 'menu upload',
'verbose_name_plural': 'menu uploads',
},
),
migrations.RemoveField(
model_name='menufiles',
name='created_by',
),
migrations.RemoveField(
model_name='menufiles',
name='modified_by',
),
migrations.RemoveField(
model_name='menu',
name='average_desert_price',
),
migrations.RemoveField(
model_name='menu',
name='average_main_dish_price',
),
migrations.RemoveField(
model_name='menu',
name='average_starter_price',
),
migrations.RemoveField(
model_name='menu',
name='dishes',
),
migrations.RemoveField(
model_name='menu',
name='highest_price',
),
migrations.RemoveField(
model_name='menu',
name='lowest_price',
),
migrations.RemoveField(
model_name='menu',
name='name',
),
migrations.RemoveField(
model_name='menu',
name='nb_wine',
),
migrations.RemoveField(
model_name='menu',
name='price',
),
migrations.RemoveField(
model_name='menu',
name='price_max_by_glass',
),
migrations.RemoveField(
model_name='menu',
name='price_min_by_glass',
),
migrations.RemoveField(
model_name='menu',
name='renewal_per_year',
),
migrations.RemoveField(
model_name='menu',
name='served_by_glasses',
),
migrations.RemoveField(
model_name='menu',
name='uploads',
),
migrations.AlterField(
model_name='menu',
name='schedule',
field=models.ManyToManyField(blank=True, related_name='menus', to='timetable.Timetable', verbose_name='Establishment schedule'),
),
migrations.DeleteModel(
name='MenuDish',
),
migrations.DeleteModel(
name='MenuFiles',
),
migrations.AddField(
model_name='menuuploads',
name='menu',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='menu_uploads', to='establishment.Menu', verbose_name='menu'),
),
migrations.AddField(
model_name='menuuploads',
name='modified_by',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='menuuploads_records_modified', to=settings.AUTH_USER_MODEL, verbose_name='modified by'),
),
migrations.AddField(
model_name='menugallery',
name='menu',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='menu_gallery', to='establishment.Menu', verbose_name='menu'),
),
migrations.AlterUniqueTogether(
name='menugallery',
unique_together={('menu', 'image'), ('menu', 'is_main')},
),
]

View File

@ -14,19 +14,20 @@ from django.contrib.postgres.fields import ArrayField
from django.contrib.postgres.indexes import GinIndex from django.contrib.postgres.indexes import GinIndex
from django.contrib.postgres.search import TrigramSimilarity from django.contrib.postgres.search import TrigramSimilarity
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.validators import MaxValueValidator, MinValueValidator, FileExtensionValidator from django.core.validators import FileExtensionValidator, MaxValueValidator, MinValueValidator
from django.db import models from django.db import models
from django.db.models import Case, ExpressionWrapper, F, Prefetch, Q, Subquery, When from django.db.models import Case, ExpressionWrapper, F, Prefetch, Q, Subquery, When
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.utils import timezone from django.utils import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from phonenumber_field.modelfields import PhoneNumberField
from timezone_field import TimeZoneField
from location.models import Address from location.models import Address
from main.models import Award, Currency from main.models import Award, Currency
from phonenumber_field.modelfields import PhoneNumberField
from review.models import Review from review.models import Review
from tag.models import Tag from tag.models import Tag
from timetable.models import Timetable from timetable.models import Timetable
from timezone_field import TimeZoneField
from utils.methods import transform_into_readable_str from utils.methods import transform_into_readable_str
from utils.models import ( from utils.models import (
BaseAttributes, FavoritesMixin, GalleryMixin, HasTagsMixin, IntermediateGalleryModelMixin, ProjectBaseMixin, BaseAttributes, FavoritesMixin, GalleryMixin, HasTagsMixin, IntermediateGalleryModelMixin, ProjectBaseMixin,

View File

@ -2,7 +2,6 @@
import logging import logging
from django.conf import settings from django.conf import settings
from django.shortcuts import get_object_or_404
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from phonenumber_field.phonenumber import to_python as str_to_phonenumber from phonenumber_field.phonenumber import to_python as str_to_phonenumber
from rest_framework import serializers from rest_framework import serializers
@ -73,89 +72,31 @@ class PlateSerializer(ProjectModelSerializer):
] ]
class MenuDishSerializer(ProjectModelSerializer):
class Meta:
model = models.MenuDish
fields = [
'id',
'name',
'category',
'price',
'signature'
]
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): class MenuSerializers(ProjectModelSerializer):
name = serializers.CharField() plates = PlateSerializer(read_only=True, many=True, source='plate_set')
establishment_id = serializers.PrimaryKeyRelatedField(queryset=models.Establishment.objects.all()) category_translated = serializers.CharField(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, read_only=True)
class Meta: class Meta:
model = models.Menu model = models.Menu
fields = [ fields = [
'id', 'id',
'name', 'category',
'establishment_id', 'category_translated',
'establishment_slug', 'plates',
'price', 'establishment'
'drinks_included',
'schedules',
'uploads',
] ]
def create(self, validated_data):
validated_data['establishment'] = validated_data.pop('establishment_id')
instance = models.Menu.objects.create(**validated_data)
return instance
class MenuRUDSerializers(ProjectModelSerializer): class MenuRUDSerializers(ProjectModelSerializer):
name = serializers.CharField() plates = PlateSerializer(read_only=True, many=True, source='plate_set')
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(MenuSerializers.Meta): class Meta:
"""Overridden Meta class.""" model = models.Menu
fields = MenuSerializers.Meta.fields + [ fields = [
'average_starter_price', 'id',
'average_main_dish_price', 'category',
'average_desert_price', 'plates',
'renewal_per_year', 'establishment'
'nb_wine',
'lowest_price',
'highest_price',
'served_by_glasses',
'price_min_by_glass',
'price_max_by_glass',
] ]

View File

@ -3,7 +3,7 @@ from django.db.models.query_utils import Q
from django.http import Http404 from django.http import Http404
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import generics, status from rest_framework import generics, status, response
from rest_framework.response import Response from rest_framework.response import Response
from account.models import User from account.models import User
@ -568,34 +568,81 @@ class EstablishmentAdminView(generics.ListAPIView):
return User.objects.establishment_admin(establishment).distinct() return User.objects.establishment_admin(establishment).distinct()
class MenuDishesListView(generics.ListAPIView): class MenuDishesListCreateView(generics.ListCreateAPIView):
"""Menu (dessert, main_course, starter) list create view.""" """Menu (dessert, main_course, starter) list create view."""
serializer_class = serializers.MenuDishesSerializer serializer_class = serializers.MenuDishesSerializer
queryset = models.Menu.objects.with_dishes() queryset = models.Menu.objects.with_schedule_plates_establishment().dishes().distinct()
filter_class = filters.MenuDishesBackFilter
permission_classes = get_permission_classes( permission_classes = get_permission_classes(
IsEstablishmentManager, IsEstablishmentManager,
IsEstablishmentAdministrator IsEstablishmentAdministrator
) )
filter_class = filters.MenuDishesBackFilter
class MenuDishesRUDView(MenuRUDMixinViews, generics.RetrieveUpdateDestroyAPIView): class MenuDishesRUDView(generics.RetrieveUpdateDestroyAPIView):
"""Menu (dessert, main_course, starter) RUD view.""" """Menu (dessert, main_course, starter) RUD view."""
lookup_field = None
serializer_class = serializers.MenuDishesRUDSerializers serializer_class = serializers.MenuDishesRUDSerializers
queryset = models.Menu.objects.with_dishes() queryset = models.Menu.objects.dishes().distinct()
permission_classes = get_permission_classes( permission_classes = get_permission_classes(
IsEstablishmentManager, IsEstablishmentManager,
IsEstablishmentAdministrator IsEstablishmentAdministrator
) )
class MenuDishesCreateView(generics.CreateAPIView): class MenuGalleryListView(generics.ListAPIView):
"""Menu (dessert, main_course, starter) list create view.""" """Resource for returning gallery for menu for back-office users."""
serializer_class = serializers.MenuDishesCreateSerializer serializer_class = serializers.ImageBaseSerializer
queryset = models.MenuDish.objects.all()
filter_class = filters.MenuDishesBackFilter
permission_classes = get_permission_classes( permission_classes = get_permission_classes(
IsEstablishmentManager, IsEstablishmentManager,
IsEstablishmentAdministrator IsEstablishmentAdministrator
) )
queryset = models.Menu.objects.with_schedule_plates_establishment().with_gallery().dishes()
def get_object(self):
"""Override get_object method."""
qs = super(MenuGalleryListView, self).get_queryset()
menu = get_object_or_404(qs, pk=self.kwargs.get('pk'))
# May raise a permission denied
# self.check_object_permissions(self.request, menu)
return menu
def get_queryset(self):
"""Override get_queryset method."""
return self.get_object().crop_gallery
class MenuGalleryCreateDestroyView(CreateDestroyGalleryViewMixin):
"""Resource for a create gallery for menu for back-office users."""
serializer_class = serializers.MenuGallerySerializer
permission_classes = get_permission_classes(
IsEstablishmentManager,
IsEstablishmentAdministrator
)
def get_queryset(self):
"""Override get_queryset method."""
qs = models.Menu.objects.with_schedule_plates_establishment().with_gallery().dishes()
return qs
def create(self, request, *args, **kwargs):
_ = super().create(request, *args, **kwargs)
news_qs = self.filter_queryset(self.get_queryset())
return response.Response(
data=serializers.MenuDishesRUDSerializers(get_object_or_404(news_qs, pk=kwargs.get('pk'))).data
)
def get_object(self):
"""
Returns the object the view is displaying.
"""
menu_qs = self.filter_queryset(self.get_queryset())
menu = get_object_or_404(menu_qs, pk=self.kwargs.get('pk'))
gallery = get_object_or_404(menu.menu_gallery, image_id=self.kwargs.get('image_id'))
# May raise a permission denied
self.check_object_permissions(self.request, gallery)
return gallery