From c85347b53a408fde7e6b4bdab13f6a73c001a5fd Mon Sep 17 00:00:00 2001 From: Dmitriy Kuzmenko Date: Sun, 1 Sep 2019 16:18:17 +0300 Subject: [PATCH] add menu --- apps/establishment/admin.py | 22 +++++ .../migrations/0011_menu_plate.py | 53 +++++++++++ .../migrations/0012_auto_20190901_1251.py | 19 ++++ apps/establishment/models.py | 87 +++++++++---------- apps/establishment/serializers.py | 30 ++++++- apps/main/admin.py | 7 ++ apps/main/serializers.py | 10 +++ 7 files changed, 181 insertions(+), 47 deletions(-) create mode 100644 apps/establishment/migrations/0011_menu_plate.py create mode 100644 apps/establishment/migrations/0012_auto_20190901_1251.py diff --git a/apps/establishment/admin.py b/apps/establishment/admin.py index 93c669ef..05ab36dd 100644 --- a/apps/establishment/admin.py +++ b/apps/establishment/admin.py @@ -4,6 +4,7 @@ from django.contrib.contenttypes.admin import GenericTabularInline from establishment import models from main.models import Award, MetaDataContent from review import models as review_models +from django.utils.translation import gettext_lazy as _ @admin.register(models.EstablishmentType) @@ -65,3 +66,24 @@ class EstablishmentComment(admin.ModelAdmin): @admin.register(models.Position) class PositionAdmin(admin.ModelAdmin): """Position admin.""" + + +class PlateInline(admin.TabularInline): + """Plate inline admin""" + model = models.Plate + extra = 0 + + +@admin.register(models.Menu) +class MenuAdmin(admin.ModelAdmin): + """Menu admin.""" + list_display = ['id', 'category_translated'] + inlines = [ + PlateInline, + ] + + def category_translated(self, obj): + """Get user's short name.""" + return obj.category_translated + + category_translated.short_description = _('category') \ No newline at end of file diff --git a/apps/establishment/migrations/0011_menu_plate.py b/apps/establishment/migrations/0011_menu_plate.py new file mode 100644 index 00000000..e0d50925 --- /dev/null +++ b/apps/establishment/migrations/0011_menu_plate.py @@ -0,0 +1,53 @@ +# Generated by Django 2.2.4 on 2019-09-01 12:11 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import utils.models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('main', '0013_auto_20190901_1032'), + ('establishment', '0010_auto_20190901_1142'), + ] + + operations = [ + migrations.CreateModel( + name='Menu', + 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')), + ('category', utils.models.TJSONField(blank=True, default=None, help_text='{"en-GB":"some text"}', null=True, verbose_name='name')), + ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='menu_records_created', to=settings.AUTH_USER_MODEL, verbose_name='created by')), + ('establishment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='establishment.Establishment', verbose_name='establishment')), + ('modified_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='menu_records_modified', to=settings.AUTH_USER_MODEL, verbose_name='modified by')), + ], + options={ + 'verbose_name': 'menu', + 'verbose_name_plural': 'menu', + }, + bases=(utils.models.TraslatedFieldsMixin, models.Model), + ), + migrations.CreateModel( + name='Plate', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', utils.models.TJSONField(blank=True, default=None, help_text='{"en-GB":"some text"}', null=True, verbose_name='name')), + ('description', utils.models.TJSONField(blank=True, default=None, help_text='{"en-GB":"some text"}', null=True, verbose_name='description')), + ('price', models.DecimalField(decimal_places=2, max_digits=14, verbose_name='price')), + ('is_signature_plate', models.BooleanField(verbose_name='is signature plate')), + ('currency', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='main.Currency', verbose_name='currency')), + ('menu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='establishment.Menu', verbose_name='menu')), + ], + options={ + 'verbose_name': 'plate', + 'verbose_name_plural': 'plates', + }, + bases=(utils.models.TraslatedFieldsMixin, models.Model), + ), + ] diff --git a/apps/establishment/migrations/0012_auto_20190901_1251.py b/apps/establishment/migrations/0012_auto_20190901_1251.py new file mode 100644 index 00000000..3828c997 --- /dev/null +++ b/apps/establishment/migrations/0012_auto_20190901_1251.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.4 on 2019-09-01 12:51 + +from django.db import migrations +import utils.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('establishment', '0011_menu_plate'), + ] + + operations = [ + migrations.AlterField( + model_name='menu', + name='category', + field=utils.models.TJSONField(blank=True, default=None, help_text='{"en-GB":"some text"}', null=True, verbose_name='category'), + ), + ] diff --git a/apps/establishment/models.py b/apps/establishment/models.py index e31fdc23..b44ee4f9 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -277,52 +277,47 @@ class ContactEmail(models.Model): # price_glass_max = models.DecimalField( # _('price max'), max_digits=14, decimal_places=2) # -# -# class Plate(TraslatedFieldsMixin, models.Model): -# """Plate model.""" -# -# STARTER = 0 -# MAIN = 1 -# COURSE = 2 -# DESSERT = 3 -# -# PLATE_TYPE_CHOICES = ( -# (STARTER, _('starter')), -# (MAIN, _('main')), -# (COURSE, _('course')), -# (DESSERT, _('dessert')), -# ) -# name = models.CharField(_('name'), max_length=255) -# plate_type = models.PositiveSmallIntegerField(_('plate_type'), choices=PLATE_TYPE_CHOICES) -# description = TJSONField( -# blank=True, null=True, default=None, verbose_name=_('description'), -# help_text='{"en-GB":"some text"}') -# price = models.DecimalField( -# _('price'), max_digits=14, decimal_places=2) -# is_signature_plate = models.BooleanField(_('is signature plate')) -# currency = models.ForeignKey( -# 'main.Currency', verbose_name=_('currency'), on_delete=models.CASCADE) -# -# menu = models.ManyToManyField(to='Plate', verbose_name=_(''), through='establishment.Menu') -# -# class Meta: -# verbose_name = _('plate') -# verbose_name_plural = _('plates') -# -# def __str__(self): -# return f'plate_id:{self.id}' -# -# -# class Menu(TraslatedFieldsMixin, BaseAttributes): -# """Menu model.""" -# establishment = models.ForeignKey( -# 'establishment.Establishment', verbose_name=_('establishment'), -# on_delete=models.CASCADE) -# plate = models.ForeignKey(Plate, verbose_name=_('menu'), on_delete=models.CASCADE) -# -# class Meta: -# verbose_name = _('menu') -# verbose_name_plural = _('menu') + + +class Plate(TraslatedFieldsMixin, models.Model): + """Plate model.""" + + name = TJSONField( + blank=True, null=True, default=None, verbose_name=_('name'), + help_text='{"en-GB":"some text"}') + description = TJSONField( + blank=True, null=True, default=None, verbose_name=_('description'), + help_text='{"en-GB":"some text"}') + price = models.DecimalField( + _('price'), max_digits=14, decimal_places=2) + is_signature_plate = models.BooleanField(_('is signature plate')) + currency = models.ForeignKey( + 'main.Currency', verbose_name=_('currency'), on_delete=models.CASCADE) + + menu = models.ForeignKey( + 'establishment.Menu', verbose_name=_('menu'), on_delete=models.CASCADE) + + class Meta: + verbose_name = _('plate') + verbose_name_plural = _('plates') + + def __str__(self): + return f'plate_id:{self.id}' + + +class Menu(TraslatedFieldsMixin, BaseAttributes): + """Menu model.""" + category = TJSONField( + blank=True, null=True, default=None, verbose_name=_('category'), + help_text='{"en-GB":"some text"}') + establishment = models.ForeignKey( + 'establishment.Establishment', verbose_name=_('establishment'), + on_delete=models.CASCADE) + + class Meta: + verbose_name = _('menu') + verbose_name_plural = _('menu') + class CommentQuerySet(models.QuerySet): """QuerySets for Comment model.""" diff --git a/apps/establishment/serializers.py b/apps/establishment/serializers.py index cd444ef7..f46cbc4e 100644 --- a/apps/establishment/serializers.py +++ b/apps/establishment/serializers.py @@ -3,7 +3,7 @@ from rest_framework import serializers from establishment import models from location.serializers import AddressSerializer -from main.serializers import MetaDataContentSerializer, AwardSerializer +from main.serializers import MetaDataContentSerializer, AwardSerializer, CurrencySerializer from review import models as review_models from timetable.models import Timetable @@ -26,6 +26,32 @@ class ContactEmailsSerializer(serializers.ModelSerializer): ] +class PlateSerializer(serializers.ModelSerializer): + currency = CurrencySerializer(read_only=True) + + class Meta: + model = models.Plate + fields = [ + 'name_translated', + 'currency', + 'price', + 'is_signature_plate', + ] + + +class MenuSerializers(serializers.ModelSerializer): + plates = PlateSerializer(read_only=True, many=True, source='plate_set') + category_translated = serializers.CharField(read_only=True) + + class Meta: + model = models.Menu + fields = [ + 'id', + 'category_translated', + 'plates' + ] + + class EstablishmentTypeSerializer(serializers.ModelSerializer): """Serializer for EstablishmentType model.""" @@ -129,6 +155,7 @@ class EstablishmentSerializer(serializers.ModelSerializer): comments = CommentSerializer(many=True, allow_null=True) employees = EstablishmentEmployeeSerializer(source='actual_establishment_employees', many=True) + menu = MenuSerializers(source='menu_set', many=True, read_only=True) class Meta: """Meta class.""" @@ -154,4 +181,5 @@ class EstablishmentSerializer(serializers.ModelSerializer): 'reviews', 'comments', 'employees', + 'menu', ) diff --git a/apps/main/admin.py b/apps/main/admin.py index 9ff6606a..2d512868 100644 --- a/apps/main/admin.py +++ b/apps/main/admin.py @@ -39,3 +39,10 @@ class MetaDataCategoryAdmin(admin.ModelAdmin): @admin.register(models.MetaDataContent) class MetaDataContentAdmin(admin.ModelAdmin): """MetaDataContent admin""" + + +@admin.register(models.Currency) +class CurrencContentAdmin(admin.ModelAdmin): + """CurrencContent admin""" + + diff --git a/apps/main/serializers.py b/apps/main/serializers.py index 444d8f57..0348026c 100644 --- a/apps/main/serializers.py +++ b/apps/main/serializers.py @@ -96,4 +96,14 @@ class MetaDataContentSerializer(serializers.ModelSerializer): fields = [ 'id', 'label_translated', + ] + + +class CurrencySerializer(serializers.ModelSerializer): + """Currency serializer""" + class Meta: + model = models.Currency + fields = [ + 'id', + 'name' ] \ No newline at end of file