From efac785248350306abb869a6e015f420349bee54 Mon Sep 17 00:00:00 2001 From: Dmitriy Kuzmenko Date: Thu, 12 Sep 2019 18:24:21 +0300 Subject: [PATCH] add api for estab, social, plates, menu --- apps/establishment/filters.py | 2 +- .../0016_remove_establishment_name.py | 17 ++++++ .../migrations/0017_auto_20190911_1258.py | 55 +++++++++++++++++++ .../migrations/0018_socialnetwork.py | 27 +++++++++ apps/establishment/models.py | 44 ++++++++++----- apps/establishment/serializers/__init__.py | 3 + apps/establishment/serializers/back.py | 55 +++++++++++++++++++ .../{serializers.py => serializers/common.py} | 26 +++++++-- apps/establishment/serializers/web.py | 0 apps/establishment/urls/back.py | 19 +++++++ apps/establishment/views/__init__.py | 3 + apps/establishment/views/back.py | 50 +++++++++++++++++ apps/establishment/views/common.py | 15 +++++ apps/establishment/{views.py => views/web.py} | 13 +---- project/urls/back.py | 2 +- 15 files changed, 299 insertions(+), 32 deletions(-) create mode 100644 apps/establishment/migrations/0016_remove_establishment_name.py create mode 100644 apps/establishment/migrations/0017_auto_20190911_1258.py create mode 100644 apps/establishment/migrations/0018_socialnetwork.py create mode 100644 apps/establishment/serializers/__init__.py create mode 100644 apps/establishment/serializers/back.py rename apps/establishment/{serializers.py => serializers/common.py} (94%) create mode 100644 apps/establishment/serializers/web.py create mode 100644 apps/establishment/urls/back.py create mode 100644 apps/establishment/views/__init__.py create mode 100644 apps/establishment/views/back.py create mode 100644 apps/establishment/views/common.py rename apps/establishment/{views.py => views/web.py} (93%) diff --git a/apps/establishment/filters.py b/apps/establishment/filters.py index 46960d70..51b207dc 100644 --- a/apps/establishment/filters.py +++ b/apps/establishment/filters.py @@ -5,7 +5,7 @@ from establishment import models class EstablishmentFilter(filters.FilterSet): - """Establishment filterset.""" + """Establishment filter set.""" tag_id = filters.NumberFilter(field_name='tags__metadata__id',) award_id = filters.NumberFilter(field_name='awards__id',) diff --git a/apps/establishment/migrations/0016_remove_establishment_name.py b/apps/establishment/migrations/0016_remove_establishment_name.py new file mode 100644 index 00000000..863f3d13 --- /dev/null +++ b/apps/establishment/migrations/0016_remove_establishment_name.py @@ -0,0 +1,17 @@ +# Generated by Django 2.2.4 on 2019-09-11 12:52 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('establishment', '0015_delete_comment'), + ] + + operations = [ + migrations.RemoveField( + model_name='establishment', + name='name', + ), + ] diff --git a/apps/establishment/migrations/0017_auto_20190911_1258.py b/apps/establishment/migrations/0017_auto_20190911_1258.py new file mode 100644 index 00000000..c6aa8657 --- /dev/null +++ b/apps/establishment/migrations/0017_auto_20190911_1258.py @@ -0,0 +1,55 @@ +# Generated by Django 2.2.4 on 2019-09-11 12:58 + +from django.db import migrations, models +import django.db.models.deletion +import utils.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('establishment', '0016_remove_establishment_name'), + ] + + operations = [ + migrations.AddField( + model_name='establishment', + name='name', + field=models.CharField(default='', max_length=255, verbose_name='name'), + ), + migrations.AlterField( + model_name='establishment', + name='address', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.PROTECT, to='location.Address', verbose_name='address'), + ), + migrations.AlterField( + model_name='establishment', + name='description', + field=utils.models.TJSONField(blank=True, default=None, help_text='{"en-GB":"some text"}', null=True, verbose_name='description'), + ), + migrations.AlterField( + model_name='establishment', + name='establishment_subtypes', + field=models.ManyToManyField(related_name='subtype_establishment', to='establishment.EstablishmentSubType', verbose_name='subtype'), + ), + migrations.AlterField( + model_name='establishment', + name='establishment_type', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='establishment', to='establishment.EstablishmentType', verbose_name='type'), + ), + migrations.AlterField( + model_name='establishment', + name='price_level', + field=models.PositiveIntegerField(blank=True, default=None, null=True, verbose_name='price level'), + ), + migrations.AlterField( + model_name='establishment', + name='public_mark', + field=models.PositiveIntegerField(blank=True, default=None, null=True, verbose_name='public mark'), + ), + migrations.AlterField( + model_name='establishment', + name='toque_number', + field=models.PositiveIntegerField(blank=True, default=None, null=True, verbose_name='toque number'), + ), + ] diff --git a/apps/establishment/migrations/0018_socialnetwork.py b/apps/establishment/migrations/0018_socialnetwork.py new file mode 100644 index 00000000..8efdb1d2 --- /dev/null +++ b/apps/establishment/migrations/0018_socialnetwork.py @@ -0,0 +1,27 @@ +# Generated by Django 2.2.4 on 2019-09-12 13:04 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('establishment', '0017_auto_20190911_1258'), + ] + + operations = [ + migrations.CreateModel( + name='SocialNetwork', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=255, verbose_name='title')), + ('url', models.URLField(verbose_name='URL')), + ('establishment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='socials', to='establishment.Establishment', verbose_name='establishment')), + ], + options={ + 'verbose_name': 'social network', + 'verbose_name_plural': 'social networks', + }, + ), + ] diff --git a/apps/establishment/models.py b/apps/establishment/models.py index efe665ef..a0e28d11 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -106,32 +106,29 @@ class EstablishmentQuerySet(models.QuerySet): class Establishment(ProjectBaseMixin, ImageMixin, TranslatedFieldsMixin): """Establishment model.""" - STR_FIELD_NAME = 'name' - - name = TJSONField(blank=True, null=True, default=None, - verbose_name=_('Name'), help_text='{"en-GB":"some text"}') + name = models.CharField(_('name'), max_length=255, default='') description = TJSONField(blank=True, null=True, default=None, - verbose_name=_('Description'), + verbose_name=_('description'), help_text='{"en-GB":"some text"}') public_mark = models.PositiveIntegerField(blank=True, null=True, default=None, - verbose_name=_('Public mark'),) + verbose_name=_('public mark'),) toque_number = models.PositiveIntegerField(blank=True, null=True, default=None, - verbose_name=_('Toque number'),) + verbose_name=_('toque number'),) establishment_type = models.ForeignKey(EstablishmentType, related_name='establishment', on_delete=models.PROTECT, - verbose_name=_('Type')) + verbose_name=_('type')) establishment_subtypes = models.ManyToManyField(EstablishmentSubType, related_name='subtype_establishment', - verbose_name=_('Subtype')) + verbose_name=_('subtype')) address = models.ForeignKey(Address, blank=True, null=True, default=None, on_delete=models.PROTECT, - verbose_name=_('Address')) + verbose_name=_('address')) price_level = models.PositiveIntegerField(blank=True, null=True, default=None, - verbose_name=_('Price level')) + verbose_name=_('price level')) website = models.URLField(blank=True, null=True, default=None, verbose_name=_('Web site URL')) facebook = models.URLField(blank=True, null=True, default=None, @@ -155,6 +152,9 @@ class Establishment(ProjectBaseMixin, ImageMixin, TranslatedFieldsMixin): verbose_name = _('Establishment') verbose_name_plural = _('Establishments') + def __str__(self): + return f'id:{self.id}-{self.name}' + # todo: recalculate toque_number def recalculate_toque_number(self): self.toque_number = 4 @@ -326,6 +326,7 @@ class ContactEmail(models.Model): class Plate(TranslatedFieldsMixin, models.Model): """Plate model.""" + STR_FIELD_NAME = 'name' name = TJSONField( blank=True, null=True, default=None, verbose_name=_('name'), @@ -346,12 +347,12 @@ class Plate(TranslatedFieldsMixin, models.Model): verbose_name = _('plate') verbose_name_plural = _('plates') - def __str__(self): - return f'plate_id:{self.id}' - class Menu(TranslatedFieldsMixin, BaseAttributes): """Menu model.""" + + STR_FIELD_NAME = 'category' + category = TJSONField( blank=True, null=True, default=None, verbose_name=_('category'), help_text='{"en-GB":"some text"}') @@ -362,3 +363,18 @@ class Menu(TranslatedFieldsMixin, BaseAttributes): class Meta: verbose_name = _('menu') verbose_name_plural = _('menu') + + +class SocialNetwork(models.Model): + establishment = models.ForeignKey( + 'Establishment', verbose_name=_('establishment'), + related_name='socials', on_delete=models.CASCADE) + title = models.CharField(_('title'), max_length=255) + url = models.URLField(_('URL')) + + class Meta: + verbose_name = _('social network') + verbose_name_plural = _('social networks') + + def __str__(self): + return self.title diff --git a/apps/establishment/serializers/__init__.py b/apps/establishment/serializers/__init__.py new file mode 100644 index 00000000..d21c60b9 --- /dev/null +++ b/apps/establishment/serializers/__init__.py @@ -0,0 +1,3 @@ +from establishment.serializers.common import * +from establishment.serializers.web import * +from establishment.serializers.back import * diff --git a/apps/establishment/serializers/back.py b/apps/establishment/serializers/back.py new file mode 100644 index 00000000..89fb5f91 --- /dev/null +++ b/apps/establishment/serializers/back.py @@ -0,0 +1,55 @@ +from establishment.serializers import EstablishmentBaseSerializer, PlateSerializer +from rest_framework import serializers +from establishment import models +from main.models import Currency + +class EstablishmentListCreateSerializer(EstablishmentBaseSerializer): + """Establishment create serializer""" + + type_id = serializers.PrimaryKeyRelatedField( + source='establishment_type', + queryset=models.EstablishmentType.objects.all(), write_only=True + ) + + class Meta: + model = models.Establishment + fields = [ + 'id', + 'name', + 'website', + 'phone', + 'email', + 'price_level', + 'toque_number', + 'type_id', + 'type' + ] + + +class SocialNetworkSerializers(serializers.ModelSerializer): + """Social network serializers.""" + class Meta: + model = models.SocialNetwork + fields = [ + 'id', + 'establishment', + 'title', + 'url', + ] + + +class PlatesSerializers(PlateSerializer): + """Social network serializers.""" + name = serializers.JSONField() + currency_id = serializers.PrimaryKeyRelatedField( + source='currency', + queryset=Currency.objects.all(), write_only=True + ) + + class Meta: + model = models.Plate + fields = PlateSerializer.Meta.fields + [ + 'name', + 'currency_id', + 'menu' + ] \ No newline at end of file diff --git a/apps/establishment/serializers.py b/apps/establishment/serializers/common.py similarity index 94% rename from apps/establishment/serializers.py rename to apps/establishment/serializers/common.py index c297ce54..b8d212f8 100644 --- a/apps/establishment/serializers.py +++ b/apps/establishment/serializers/common.py @@ -32,7 +32,7 @@ class ContactEmailsSerializer(serializers.ModelSerializer): class PlateSerializer(serializers.ModelSerializer): - name_translated = serializers.CharField(allow_null=True) + name_translated = serializers.CharField(allow_null=True, read_only=True) currency = CurrencySerializer(read_only=True) class Meta: @@ -47,14 +47,31 @@ class PlateSerializer(serializers.ModelSerializer): class MenuSerializers(serializers.ModelSerializer): plates = PlateSerializer(read_only=True, many=True, source='plate_set') + category = serializers.JSONField() category_translated = serializers.CharField(read_only=True) class Meta: model = models.Menu fields = [ 'id', + 'category', 'category_translated', - 'plates' + 'plates', + 'establishment' + ] + + +class MenuRUDSerializers(serializers.ModelSerializer): + plates = PlateSerializer(read_only=True, many=True, source='plate_set') + category = serializers.JSONField() + + class Meta: + model = models.Menu + fields = [ + 'id', + 'category', + 'plates', + 'establishment' ] @@ -127,8 +144,7 @@ class EstablishmentEmployeeSerializer(serializers.ModelSerializer): class EstablishmentBaseSerializer(serializers.ModelSerializer): """Base serializer for Establishment model.""" - name_translated = serializers.CharField(allow_null=True) - type = EstablishmentTypeSerializer(source='establishment_type') + type = EstablishmentTypeSerializer(source='establishment_type', read_only=True) subtypes = EstablishmentSubTypeSerializer(many=True) address = AddressSerializer() tags = MetaDataContentSerializer(many=True) @@ -140,7 +156,7 @@ class EstablishmentBaseSerializer(serializers.ModelSerializer): model = models.Establishment fields = [ 'id', - 'name_translated', + 'name', 'price_level', 'toque_number', 'public_mark', diff --git a/apps/establishment/serializers/web.py b/apps/establishment/serializers/web.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/establishment/urls/back.py b/apps/establishment/urls/back.py new file mode 100644 index 00000000..efe9db8d --- /dev/null +++ b/apps/establishment/urls/back.py @@ -0,0 +1,19 @@ +"""Establishment url patterns for backoffice.""" + +from django.urls import path + +from establishment import views + +app_name = 'establishment' + + +urlpatterns = [ + path('', views.EstablishmentListCreateView.as_view(), name='list'), + path('/', views.EstablishmentRetrieveView.as_view(), name='detail'), + path('menus/', views.MenuListCreateView.as_view(), name='menu-list'), + path('menus//', views.MenuRUDView.as_view(), name='menu-rud'), + path('plates/', views.PlateListCreateView.as_view(), name='plates'), + path('plates//', views.PlateListCreateView.as_view(), name='plate-rud'), + path('socials/', views.SocialListCreateView.as_view(), name='socials'), + path('socials//', views.SocialRUDView.as_view(), name='social-rud'), +] \ No newline at end of file diff --git a/apps/establishment/views/__init__.py b/apps/establishment/views/__init__.py new file mode 100644 index 00000000..2c7b88bc --- /dev/null +++ b/apps/establishment/views/__init__.py @@ -0,0 +1,3 @@ +from establishment.views.common import * +from establishment.views.web import * +from establishment.views.back import * diff --git a/apps/establishment/views/back.py b/apps/establishment/views/back.py new file mode 100644 index 00000000..45fd8745 --- /dev/null +++ b/apps/establishment/views/back.py @@ -0,0 +1,50 @@ +"""Establishment app views.""" + +from rest_framework import generics + +from establishment import models, serializers +from establishment.views.common import EstablishmentMixin + + +class EstablishmentListCreateView(EstablishmentMixin, generics.ListCreateAPIView): + """Establishment list/create view.""" + queryset = models.Establishment.objects.all() + serializer_class = serializers.EstablishmentListCreateSerializer + + +class MenuListCreateView(generics.ListCreateAPIView): + """Menu list create view.""" + serializer_class = serializers.MenuSerializers + queryset = models.Menu.objects.all() + + +class MenuRUDView(generics.RetrieveUpdateDestroyAPIView): + """Menu RUD view.""" + serializer_class = serializers.MenuRUDSerializers + queryset = models.Menu.objects.all() + + +class SocialListCreateView(generics.ListCreateAPIView): + """Social list create view.""" + serializer_class = serializers.SocialNetworkSerializers + queryset = models.SocialNetwork.objects.all() + pagination_class = None + + +class SocialRUDView(generics.RetrieveUpdateDestroyAPIView): + """Social RUD view.""" + serializer_class = serializers.SocialNetworkSerializers + queryset = models.SocialNetwork.objects.all() + + +class PlateListCreateView(generics.ListCreateAPIView): + """Plate list create view.""" + serializer_class = serializers.PlatesSerializers + queryset = models.Plate.objects.all() + pagination_class = None + + +class PlateRUDView(generics.RetrieveUpdateDestroyAPIView): + """Social RUD view.""" + serializer_class = serializers.PlatesSerializers + queryset = models.Plate.objects.all() \ No newline at end of file diff --git a/apps/establishment/views/common.py b/apps/establishment/views/common.py new file mode 100644 index 00000000..454ef1d0 --- /dev/null +++ b/apps/establishment/views/common.py @@ -0,0 +1,15 @@ +"""Establishment app views.""" + +from rest_framework import permissions + +from establishment import models + + +class EstablishmentMixin: + """Establishment mixin.""" + + permission_classes = (permissions.AllowAny,) + + def get_queryset(self): + """Overrided method 'get_queryset'.""" + return models.Establishment.objects.all().prefetch_actual_employees() \ No newline at end of file diff --git a/apps/establishment/views.py b/apps/establishment/views/web.py similarity index 93% rename from apps/establishment/views.py rename to apps/establishment/views/web.py index 528d2377..b1a8d8d4 100644 --- a/apps/establishment/views.py +++ b/apps/establishment/views/web.py @@ -7,16 +7,7 @@ from comment import models as comment_models from establishment import filters from establishment import models, serializers from utils.views import JWTGenericViewMixin - - -class EstablishmentMixin: - """Establishment mixin.""" - - permission_classes = (permissions.AllowAny,) - - def get_queryset(self): - """Overrided method 'get_queryset'.""" - return models.Establishment.objects.all().prefetch_actual_employees() +from establishment.views import EstablishmentMixin class EstablishmentListView(EstablishmentMixin, JWTGenericViewMixin, generics.ListAPIView): @@ -25,7 +16,7 @@ class EstablishmentListView(EstablishmentMixin, JWTGenericViewMixin, generics.Li filter_class = filters.EstablishmentFilter def get_queryset(self): - """Overrided method 'get_queryset'.""" + """Overridden method 'get_queryset'.""" qs = super(EstablishmentListView, self).get_queryset() return qs.by_country_code(code=self.request.country_code)\ .annotate_in_favorites(user=self.request.user) diff --git a/project/urls/back.py b/project/urls/back.py index af823cd2..6337f4cd 100644 --- a/project/urls/back.py +++ b/project/urls/back.py @@ -8,7 +8,7 @@ urlpatterns = [ # path('account/', include('account.urls.web')), # path('advertisement/', include('advertisement.urls.web')), # path('collection/', include('collection.urls.web')), - # path('establishments/', include('establishment.urls.web')), + path('establishments/', include('establishment.urls.back')), # path('news/', include('news.urls.web')), # path('partner/', include('partner.urls.web')), ] \ No newline at end of file