Added migration
This commit is contained in:
parent
14d9b32479
commit
b94e933cb1
140
apps/establishment/migrations/0089_auto_20200130_1758.py
Normal file
140
apps/establishment/migrations/0089_auto_20200130_1758.py
Normal 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')},
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user