gm-80: in progress

This commit is contained in:
Anatoly 2019-09-18 18:46:24 +03:00
parent 6e7a617a67
commit 540a819f94
10 changed files with 127 additions and 61 deletions

View File

@ -60,11 +60,6 @@ class EstablishmentAdmin(admin.ModelAdmin):
ReviewInline, CommentInline] ReviewInline, CommentInline]
@admin.register(models.EstablishmentSchedule)
class EstablishmentSchedule(admin.ModelAdmin):
"""Establishment schedule"""
@admin.register(models.Position) @admin.register(models.Position)
class PositionAdmin(admin.ModelAdmin): class PositionAdmin(admin.ModelAdmin):
"""Position admin.""" """Position admin."""

View File

@ -0,0 +1,16 @@
# Generated by Django 2.2.4 on 2019-09-18 12:07
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('establishment', '0020_merge_20190917_1415'),
]
operations = [
migrations.DeleteModel(
name='EstablishmentSchedule',
),
]

View File

@ -262,6 +262,9 @@ class Establishment(ProjectBaseMixin, ImageMixin, TranslatedFieldsMixin):
booking = models.URLField(blank=True, null=True, default=None, booking = models.URLField(blank=True, null=True, default=None,
verbose_name=_('Booking URL')) verbose_name=_('Booking URL'))
is_publish = models.BooleanField(default=False, verbose_name=_('Publish status')) is_publish = models.BooleanField(default=False, verbose_name=_('Publish status'))
schedule = models.ManyToManyField(to='timetable.Timetable',
verbose_name=_('Establishment schedule'),
related_name='schedule')
awards = generic.GenericRelation(to='main.Award') awards = generic.GenericRelation(to='main.Award')
tags = generic.GenericRelation(to='main.MetaDataContent') tags = generic.GenericRelation(to='main.MetaDataContent')
reviews = generic.GenericRelation(to='review.Review') reviews = generic.GenericRelation(to='review.Review')
@ -392,23 +395,6 @@ class EstablishmentScheduleQuerySet(models.QuerySet):
"""QuerySet for model EstablishmentSchedule""" """QuerySet for model EstablishmentSchedule"""
class EstablishmentSchedule(BaseAttributes):
"""Establishment schedule model."""
establishment = models.OneToOneField(Establishment,
related_name='schedule',
on_delete=models.CASCADE,
verbose_name=_('Establishment'))
schedule = models.ManyToManyField(to='timetable.Timetable',
verbose_name=_('Establishment schedule'))
objects = EstablishmentScheduleQuerySet.as_manager()
class Meta:
"""Meta class"""
verbose_name = _('Establishment schedule')
verbose_name_plural = _('Establishment schedules')
class ContactPhone(models.Model): class ContactPhone(models.Model):
"""Contact phone model.""" """Contact phone model."""
establishment = models.ForeignKey( establishment = models.ForeignKey(

View File

@ -1,9 +1,12 @@
import json
from rest_framework import serializers from rest_framework import serializers
from establishment import models from establishment import models
from timetable.models import Timetable
from establishment.serializers import ( from establishment.serializers import (
EstablishmentBaseSerializer, PlateSerializer, ContactEmailsSerializer, EstablishmentBaseSerializer, PlateSerializer, ContactEmailsSerializer,
ContactPhonesSerializer, SocialNetworkRelatedSerializers) ContactPhonesSerializer, SocialNetworkRelatedSerializers, EstablishmentDetailSerializer
)
from main.models import Currency from main.models import Currency

View File

@ -9,7 +9,7 @@ from location.serializers import AddressSerializer
from main.models import MetaDataContent from main.models import MetaDataContent
from main.serializers import MetaDataContentSerializer, AwardSerializer, CurrencySerializer from main.serializers import MetaDataContentSerializer, AwardSerializer, CurrencySerializer
from review import models as review_models from review import models as review_models
from timetable.models import Timetable from timetable.serialziers import ScheduleRUDSerializer
from utils import exceptions as utils_exceptions from utils import exceptions as utils_exceptions
@ -111,22 +111,6 @@ class EstablishmentSubTypeSerializer(serializers.ModelSerializer):
fields = ('id', 'name_translated') fields = ('id', 'name_translated')
class EstablishmentScheduleSerializer(serializers.ModelSerializer):
"""Serializer for Establishment model."""
weekday = serializers.CharField(source='get_weekday_display')
class Meta:
"""Meta class."""
model = Timetable
fields = (
'weekday',
'lunch_start',
'lunch_end',
'dinner_start',
'dinner_end',
)
class ReviewSerializer(serializers.ModelSerializer): class ReviewSerializer(serializers.ModelSerializer):
"""Serializer for model Review.""" """Serializer for model Review."""
text_translated = serializers.CharField(read_only=True) text_translated = serializers.CharField(read_only=True)
@ -203,9 +187,7 @@ class EstablishmentDetailSerializer(EstablishmentListSerializer):
"""Serializer for Establishment model.""" """Serializer for Establishment model."""
description_translated = serializers.CharField(allow_null=True) description_translated = serializers.CharField(allow_null=True)
awards = AwardSerializer(many=True) awards = AwardSerializer(many=True)
schedule = EstablishmentScheduleSerializer(source='schedule.schedule', schedule = ScheduleRUDSerializer(many=True, allow_null=True)
many=True,
allow_null=True)
phones = ContactPhonesSerializer(read_only=True, many=True, ) phones = ContactPhonesSerializer(read_only=True, many=True, )
emails = ContactEmailsSerializer(read_only=True, many=True, ) emails = ContactEmailsSerializer(read_only=True, many=True, )
review = serializers.SerializerMethodField() review = serializers.SerializerMethodField()

View File

@ -10,6 +10,10 @@ app_name = 'establishment'
urlpatterns = [ urlpatterns = [
path('', views.EstablishmentListCreateView.as_view(), name='list'), path('', views.EstablishmentListCreateView.as_view(), name='list'),
path('<int:pk>/', views.EstablishmentRetrieveView.as_view(), name='detail'), path('<int:pk>/', views.EstablishmentRetrieveView.as_view(), name='detail'),
path('<int:pk>/schedule/<int:schedule_id>/', views.EstablishmentScheduleRUDView.as_view(),
name='schedule-rud'),
path('<int:pk>/schedule/', views.EstablishmentScheduleCreateView.as_view(),
name='schedule-create'),
path('menus/', views.MenuListCreateView.as_view(), name='menu-list'), path('menus/', views.MenuListCreateView.as_view(), name='menu-list'),
path('menus/<int:pk>/', views.MenuRUDView.as_view(), name='menu-rud'), path('menus/<int:pk>/', views.MenuRUDView.as_view(), name='menu-rud'),
path('plates/', views.PlateListCreateView.as_view(), name='plates'), path('plates/', views.PlateListCreateView.as_view(), name='plates'),

View File

@ -2,7 +2,8 @@
from rest_framework import generics from rest_framework import generics
from establishment import models, serializers from establishment import models
from establishment import serializers
from establishment.views.common import EstablishmentMixin from establishment.views.common import EstablishmentMixin

View File

@ -7,8 +7,9 @@ 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 main.models import MetaDataContent from main.models import MetaDataContent
from utils.views import JWTGenericViewMixin
from establishment.views import EstablishmentMixin from establishment.views import EstablishmentMixin
from timetable.serialziers import ScheduleRUDSerializer, ScheduleCreateSerializer
from timetable.models import Timetable
class EstablishmentListView(EstablishmentMixin, generics.ListAPIView): class EstablishmentListView(EstablishmentMixin, generics.ListAPIView):
@ -34,12 +35,12 @@ class EstablishmentSimilarListView(EstablishmentListView):
.order_by('-total_mark')[:13] .order_by('-total_mark')[:13]
class EstablishmentRetrieveView(EstablishmentMixin, JWTGenericViewMixin, generics.RetrieveAPIView): class EstablishmentRetrieveView(EstablishmentMixin, generics.RetrieveAPIView):
"""Resource for getting a establishment.""" """Resource for getting a establishment."""
serializer_class = serializers.EstablishmentDetailSerializer serializer_class = serializers.EstablishmentDetailSerializer
class EstablishmentTypeListView(JWTGenericViewMixin, generics.ListAPIView): class EstablishmentTypeListView(generics.ListAPIView):
"""Resource for getting a list of establishment types.""" """Resource for getting a list of establishment types."""
permission_classes = (permissions.AllowAny,) permission_classes = (permissions.AllowAny,)
@ -122,7 +123,7 @@ class EstablishmentFavoritesCreateDestroyView(generics.CreateAPIView, generics.D
return obj return obj
class EstablishmentNearestRetrieveView(EstablishmentMixin, JWTGenericViewMixin, generics.ListAPIView): class EstablishmentNearestRetrieveView(EstablishmentMixin, generics.ListAPIView):
"""Resource for getting list of nearest establishments.""" """Resource for getting list of nearest establishments."""
serializer_class = serializers.EstablishmentListSerializer serializer_class = serializers.EstablishmentListSerializer
filter_class = filters.EstablishmentFilter filter_class = filters.EstablishmentFilter
@ -151,3 +152,40 @@ class EstablishmentTagListView(generics.ListAPIView):
"""Override get_queryset method""" """Override get_queryset method"""
return MetaDataContent.objects.by_content_type(app_label='establishment', return MetaDataContent.objects.by_content_type(app_label='establishment',
model='establishment') model='establishment')
class EstablishmentScheduleRUDView(generics.RetrieveUpdateDestroyAPIView):
"""Establishment schedule RUD view"""
serializer_class = ScheduleRUDSerializer
def get_object(self):
"""
Returns the object the view is displaying.
"""
lookup_url_kwargs = ('pk', 'schedule_id')
assert lookup_url_kwargs not in self.kwargs.keys(), (
'Expected view %s to be called with a URL keyword argument '
'named "%s". Fix your URL conf, or set the `.lookup_field` '
'attribute on the view correctly.' %
(self.__class__.__name__, lookup_url_kwargs)
)
establishment_pk = self.kwargs['pk']
schedule_id = self.kwargs['schedule_id']
establishment = get_object_or_404(klass=models.Establishment.objects.all(),
pk=establishment_pk)
schedule = get_object_or_404(klass=establishment.schedule,
id=schedule_id)
# May raise a permission denied
self.check_object_permissions(self.request, establishment)
self.check_object_permissions(self.request, schedule)
return schedule
class EstablishmentScheduleCreateView(generics.CreateAPIView):
"""Establishment schedule Create view"""
serializer_class = ScheduleCreateSerializer

View File

@ -331,11 +331,10 @@ class Carousel(models.Model):
@property @property
def image(self): def image(self):
# Check if Generic obj has an image if hasattr(self.content_object.image, 'url'):
if not hasattr(self.content_object.image, 'url'): return self.content_object.image
# Check if Generic obj has a FK to gallery if hasattr(self.content_object.image.image, 'url'):
return self.content_object.image.image return self.content_object.image.image
return self.content_object.image
@property @property
def model_name(self): def model_name(self):

View File

@ -1,16 +1,58 @@
"""Serializer for app timetable""" """Serializer for app timetable"""
from rest_framework import serializers from rest_framework import serializers
from timetable import models from timetable.models import Timetable
from establishment.models import Establishment
class TimetableSerializer(serializers.ModelSerializer): class ScheduleRUDSerializer(serializers.ModelSerializer):
"""Serializer for model Timetable""" """Serializer for Establishment model."""
weekday_display = serializers.CharField(source='get_weekday_display',
read_only=True)
class Meta: class Meta:
"""Meta class.""" """Meta class."""
model = models.Timetable model = Timetable
fields = ( fields = [
'id',
'weekday_display',
'lunch_start',
'lunch_end',
'dinner_start',
'dinner_end',
]
class ScheduleCreateSerializer(ScheduleRUDSerializer):
"""Serializer for Establishment model."""
weekday = serializers.IntegerField(write_only=True)
class Meta:
"""Meta class."""
model = Timetable
fields = ScheduleRUDSerializer.Meta.fields + [
'weekday', 'weekday',
'start', ]
'end',
) def validate(self, attrs):
"""Override validate method"""
return attrs
def create(self, validated_data):
"""Override create method"""
instance = super().create(validated_data)
weekday = validated_data.get('weekday')
establishment_pk = self.context.get('request')\
.parser_context.get('view')\
.kwargs.get('pk')
establishment_qs = Establishment.objects.filter(pk=establishment_pk)
if not establishment_qs.exists():
# todo: replace on appropriate exception
raise serializers.ValidationError()
establishment = establishment_qs.first()
schedule_qs = establishment.schedule.filter(weekday=weekday)
if schedule_qs.exists():
schedule_qs.delete()
establishment.schedule.add(instance)
return instance