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

@ -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):
"""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

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):
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',

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

View File

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