add api for estab, social, plates, menu

This commit is contained in:
Dmitriy Kuzmenko 2019-09-12 18:24:21 +03:00
parent a4d7430379
commit efac785248
15 changed files with 299 additions and 32 deletions

View File

@ -5,7 +5,7 @@ from establishment import models
class EstablishmentFilter(filters.FilterSet): class EstablishmentFilter(filters.FilterSet):
"""Establishment filterset.""" """Establishment filter set."""
tag_id = filters.NumberFilter(field_name='tags__metadata__id',) tag_id = filters.NumberFilter(field_name='tags__metadata__id',)
award_id = filters.NumberFilter(field_name='awards__id',) award_id = filters.NumberFilter(field_name='awards__id',)

View File

@ -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',
),
]

View File

@ -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'),
),
]

View File

@ -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',
},
),
]

View File

@ -106,32 +106,29 @@ class EstablishmentQuerySet(models.QuerySet):
class Establishment(ProjectBaseMixin, ImageMixin, TranslatedFieldsMixin): class Establishment(ProjectBaseMixin, ImageMixin, TranslatedFieldsMixin):
"""Establishment model.""" """Establishment model."""
STR_FIELD_NAME = 'name' name = models.CharField(_('name'), max_length=255, default='')
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, description = TJSONField(blank=True, null=True, default=None,
verbose_name=_('Description'), verbose_name=_('description'),
help_text='{"en-GB":"some text"}') help_text='{"en-GB":"some text"}')
public_mark = models.PositiveIntegerField(blank=True, null=True, public_mark = models.PositiveIntegerField(blank=True, null=True,
default=None, default=None,
verbose_name=_('Public mark'),) verbose_name=_('public mark'),)
toque_number = models.PositiveIntegerField(blank=True, null=True, toque_number = models.PositiveIntegerField(blank=True, null=True,
default=None, default=None,
verbose_name=_('Toque number'),) verbose_name=_('toque number'),)
establishment_type = models.ForeignKey(EstablishmentType, establishment_type = models.ForeignKey(EstablishmentType,
related_name='establishment', related_name='establishment',
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_('Type')) verbose_name=_('type'))
establishment_subtypes = models.ManyToManyField(EstablishmentSubType, establishment_subtypes = models.ManyToManyField(EstablishmentSubType,
related_name='subtype_establishment', related_name='subtype_establishment',
verbose_name=_('Subtype')) verbose_name=_('subtype'))
address = models.ForeignKey(Address, blank=True, null=True, default=None, address = models.ForeignKey(Address, blank=True, null=True, default=None,
on_delete=models.PROTECT, on_delete=models.PROTECT,
verbose_name=_('Address')) verbose_name=_('address'))
price_level = models.PositiveIntegerField(blank=True, null=True, price_level = models.PositiveIntegerField(blank=True, null=True,
default=None, default=None,
verbose_name=_('Price level')) verbose_name=_('price level'))
website = models.URLField(blank=True, null=True, default=None, website = models.URLField(blank=True, null=True, default=None,
verbose_name=_('Web site URL')) verbose_name=_('Web site URL'))
facebook = models.URLField(blank=True, null=True, default=None, facebook = models.URLField(blank=True, null=True, default=None,
@ -155,6 +152,9 @@ class Establishment(ProjectBaseMixin, ImageMixin, TranslatedFieldsMixin):
verbose_name = _('Establishment') verbose_name = _('Establishment')
verbose_name_plural = _('Establishments') verbose_name_plural = _('Establishments')
def __str__(self):
return f'id:{self.id}-{self.name}'
# todo: recalculate toque_number # todo: recalculate toque_number
def recalculate_toque_number(self): def recalculate_toque_number(self):
self.toque_number = 4 self.toque_number = 4
@ -326,6 +326,7 @@ class ContactEmail(models.Model):
class Plate(TranslatedFieldsMixin, models.Model): class Plate(TranslatedFieldsMixin, models.Model):
"""Plate model.""" """Plate model."""
STR_FIELD_NAME = 'name'
name = TJSONField( name = TJSONField(
blank=True, null=True, default=None, verbose_name=_('name'), blank=True, null=True, default=None, verbose_name=_('name'),
@ -346,12 +347,12 @@ class Plate(TranslatedFieldsMixin, models.Model):
verbose_name = _('plate') verbose_name = _('plate')
verbose_name_plural = _('plates') verbose_name_plural = _('plates')
def __str__(self):
return f'plate_id:{self.id}'
class Menu(TranslatedFieldsMixin, BaseAttributes): class Menu(TranslatedFieldsMixin, BaseAttributes):
"""Menu model.""" """Menu model."""
STR_FIELD_NAME = 'category'
category = TJSONField( category = TJSONField(
blank=True, null=True, default=None, verbose_name=_('category'), blank=True, null=True, default=None, verbose_name=_('category'),
help_text='{"en-GB":"some text"}') help_text='{"en-GB":"some text"}')
@ -362,3 +363,18 @@ class Menu(TranslatedFieldsMixin, BaseAttributes):
class Meta: class Meta:
verbose_name = _('menu') verbose_name = _('menu')
verbose_name_plural = _('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

View File

@ -0,0 +1,3 @@
from establishment.serializers.common import *
from establishment.serializers.web import *
from establishment.serializers.back import *

View File

@ -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'
]

View File

@ -32,7 +32,7 @@ class ContactEmailsSerializer(serializers.ModelSerializer):
class PlateSerializer(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) currency = CurrencySerializer(read_only=True)
class Meta: class Meta:
@ -47,14 +47,31 @@ class PlateSerializer(serializers.ModelSerializer):
class MenuSerializers(serializers.ModelSerializer): class MenuSerializers(serializers.ModelSerializer):
plates = PlateSerializer(read_only=True, many=True, source='plate_set') plates = PlateSerializer(read_only=True, many=True, source='plate_set')
category = serializers.JSONField()
category_translated = serializers.CharField(read_only=True) category_translated = serializers.CharField(read_only=True)
class Meta: class Meta:
model = models.Menu model = models.Menu
fields = [ fields = [
'id', 'id',
'category',
'category_translated', '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): class EstablishmentBaseSerializer(serializers.ModelSerializer):
"""Base serializer for Establishment model.""" """Base serializer for Establishment model."""
name_translated = serializers.CharField(allow_null=True) type = EstablishmentTypeSerializer(source='establishment_type', read_only=True)
type = EstablishmentTypeSerializer(source='establishment_type')
subtypes = EstablishmentSubTypeSerializer(many=True) subtypes = EstablishmentSubTypeSerializer(many=True)
address = AddressSerializer() address = AddressSerializer()
tags = MetaDataContentSerializer(many=True) tags = MetaDataContentSerializer(many=True)
@ -140,7 +156,7 @@ class EstablishmentBaseSerializer(serializers.ModelSerializer):
model = models.Establishment model = models.Establishment
fields = [ fields = [
'id', 'id',
'name_translated', 'name',
'price_level', 'price_level',
'toque_number', 'toque_number',
'public_mark', 'public_mark',

View File

View File

@ -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('<int:pk>/', views.EstablishmentRetrieveView.as_view(), name='detail'),
path('menus/', views.MenuListCreateView.as_view(), name='menu-list'),
path('menus/<int:pk>/', views.MenuRUDView.as_view(), name='menu-rud'),
path('plates/', views.PlateListCreateView.as_view(), name='plates'),
path('plates/<int:pk>/', views.PlateListCreateView.as_view(), name='plate-rud'),
path('socials/', views.SocialListCreateView.as_view(), name='socials'),
path('socials/<int:pk>/', views.SocialRUDView.as_view(), name='social-rud'),
]

View File

@ -0,0 +1,3 @@
from establishment.views.common import *
from establishment.views.web import *
from establishment.views.back import *

View File

@ -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()

View File

@ -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()

View File

@ -7,16 +7,7 @@ from comment import models as comment_models
from establishment import filters from establishment import filters
from establishment import models, serializers from establishment import models, serializers
from utils.views import JWTGenericViewMixin from utils.views import JWTGenericViewMixin
from establishment.views import EstablishmentMixin
class EstablishmentMixin:
"""Establishment mixin."""
permission_classes = (permissions.AllowAny,)
def get_queryset(self):
"""Overrided method 'get_queryset'."""
return models.Establishment.objects.all().prefetch_actual_employees()
class EstablishmentListView(EstablishmentMixin, JWTGenericViewMixin, generics.ListAPIView): class EstablishmentListView(EstablishmentMixin, JWTGenericViewMixin, generics.ListAPIView):
@ -25,7 +16,7 @@ class EstablishmentListView(EstablishmentMixin, JWTGenericViewMixin, generics.Li
filter_class = filters.EstablishmentFilter filter_class = filters.EstablishmentFilter
def get_queryset(self): def get_queryset(self):
"""Overrided method 'get_queryset'.""" """Overridden method 'get_queryset'."""
qs = super(EstablishmentListView, self).get_queryset() qs = super(EstablishmentListView, self).get_queryset()
return qs.by_country_code(code=self.request.country_code)\ return qs.by_country_code(code=self.request.country_code)\
.annotate_in_favorites(user=self.request.user) .annotate_in_favorites(user=self.request.user)

View File

@ -8,7 +8,7 @@ urlpatterns = [
# path('account/', include('account.urls.web')), # path('account/', include('account.urls.web')),
# path('advertisement/', include('advertisement.urls.web')), # path('advertisement/', include('advertisement.urls.web')),
# path('collection/', include('collection.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('news/', include('news.urls.web')),
# path('partner/', include('partner.urls.web')), # path('partner/', include('partner.urls.web')),
] ]