gm-80: complete

This commit is contained in:
Anatoly 2019-09-19 11:26:54 +03:00
parent 540a819f94
commit 38ba443b47
5 changed files with 121 additions and 12 deletions

View File

@ -0,0 +1,19 @@
# Generated by Django 2.2.4 on 2019-09-18 14:37
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('timetable', '0001_initial'),
('establishment', '0021_delete_establishmentschedule'),
]
operations = [
migrations.AddField(
model_name='establishment',
name='schedule',
field=models.ManyToManyField(related_name='schedule', to='timetable.Timetable', verbose_name='Establishment schedule'),
),
]

View File

@ -265,6 +265,10 @@ class Establishment(ProjectBaseMixin, ImageMixin, TranslatedFieldsMixin):
schedule = models.ManyToManyField(to='timetable.Timetable',
verbose_name=_('Establishment schedule'),
related_name='schedule')
# holidays_from = models.DateTimeField(verbose_name=_('Holidays from'),
# help_text=_('Holidays closing date from'))
# holidays_to = models.DateTimeField(verbose_name=_('Holidays to'),
# help_text=_('Holidays closing date to'))
awards = generic.GenericRelation(to='main.Award')
tags = generic.GenericRelation(to='main.MetaDataContent')
reviews = generic.GenericRelation(to='review.Review')

View File

@ -0,0 +1,48 @@
# Generated by Django 2.2.4 on 2019-09-19 07:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('timetable', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='timetable',
name='closed_at',
field=models.TimeField(blank=True, default=None, null=True, verbose_name='Closed time'),
),
migrations.AddField(
model_name='timetable',
name='continuous_opening',
field=models.BooleanField(default=False, verbose_name='Continuous opening'),
),
migrations.AddField(
model_name='timetable',
name='opening_at',
field=models.TimeField(blank=True, default=None, null=True, verbose_name='Opening time'),
),
migrations.AlterField(
model_name='timetable',
name='dinner_end',
field=models.TimeField(blank=True, default=None, null=True, verbose_name='Dinner end time'),
),
migrations.AlterField(
model_name='timetable',
name='dinner_start',
field=models.TimeField(blank=True, default=None, null=True, verbose_name='Dinner start time'),
),
migrations.AlterField(
model_name='timetable',
name='lunch_end',
field=models.TimeField(blank=True, default=None, null=True, verbose_name='Lunch end time'),
),
migrations.AlterField(
model_name='timetable',
name='lunch_start',
field=models.TimeField(blank=True, default=None, null=True, verbose_name='Lunch start time'),
),
]

View File

@ -23,10 +23,22 @@ class Timetable(ProjectBaseMixin):
(SUNDAY, _('Sunday')))
weekday = models.PositiveSmallIntegerField(choices=WEEKDAYS_CHOICES, verbose_name=_('Week day'))
lunch_start = models.TimeField(verbose_name=_('Lunch start time'))
lunch_end = models.TimeField(verbose_name=_('Lunch end time'))
dinner_start = models.TimeField(verbose_name=_('Dinner start time'))
dinner_end = models.TimeField(verbose_name=_('Dinner end time'))
continuous_opening = models.BooleanField(verbose_name=_('Continuous opening'), default=False)
lunch_start = models.TimeField(verbose_name=_('Lunch start time'),
blank=True, null=True, default=None)
lunch_end = models.TimeField(verbose_name=_('Lunch end time'),
blank=True, null=True, default=None)
dinner_start = models.TimeField(verbose_name=_('Dinner start time'),
blank=True, null=True, default=None)
dinner_end = models.TimeField(verbose_name=_('Dinner end time'),
blank=True, null=True, default=None)
# If continuous opening
opening_at = models.TimeField(verbose_name=_('Opening time'),
blank=True, null=True, default=None)
closed_at = models.TimeField(verbose_name=_('Closed time'),
blank=True, null=True, default=None)
class Meta:
"""Meta class."""

View File

@ -2,12 +2,19 @@
from rest_framework import serializers
from timetable.models import Timetable
from establishment.models import Establishment
from django.utils.translation import gettext_lazy as _
class ScheduleRUDSerializer(serializers.ModelSerializer):
"""Serializer for Establishment model."""
weekday_display = serializers.CharField(source='get_weekday_display',
read_only=True)
lunch_start = serializers.TimeField(required=False, allow_null=True)
lunch_end = serializers.TimeField(required=False, allow_null=True)
dinner_start = serializers.TimeField(required=False, allow_null=True)
dinner_end = serializers.TimeField(required=False, allow_null=True)
opening_at = serializers.TimeField(required=False, allow_null=True)
closed_at = serializers.TimeField(required=False, allow_null=True)
class Meta:
"""Meta class."""
@ -19,6 +26,9 @@ class ScheduleRUDSerializer(serializers.ModelSerializer):
'lunch_end',
'dinner_start',
'dinner_end',
'opening_at',
'closed_at',
'continuous_opening',
]
@ -35,22 +45,38 @@ class ScheduleCreateSerializer(ScheduleRUDSerializer):
def validate(self, attrs):
"""Override validate method"""
return attrs
# Validate by continuous_opening
if attrs.get('continuous_opening'):
for attr in attrs:
if attr.startswith('lunch') or attr.startswith('dinner'):
raise serializers.ValidationError(
{'detail': _('Lunch or Dinner times should not be '
'in request data with continuous opening.')})
if not ('opening_at' in attrs) and ('closed_at' in attrs):
raise serializers.ValidationError(
{'detail': _('Opening or Closed times not in request data.')})
else:
if not (('lunch_start' in attrs) and ('lunch_end' in attrs) and
('dinner_start' in attrs) and ('dinner_end' in attrs)):
raise serializers.ValidationError(
{'detail': _('Lunch or dinner times not in request data.')})
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')
# Check if exists establishment.
establishment_qs = Establishment.objects.filter(pk=establishment_pk)
if not establishment_qs.exists():
# todo: replace on appropriate exception
raise serializers.ValidationError()
raise serializers.ValidationError({'detail': _('Establishment not found.')})
attrs['establishment'] = establishment_qs.first()
return attrs
establishment = establishment_qs.first()
def create(self, validated_data):
"""Override create method"""
establishment = validated_data.pop('establishment')
weekday = validated_data.get('weekday')
instance = super().create(validated_data)
schedule_qs = establishment.schedule.filter(weekday=weekday)
if schedule_qs.exists():
schedule_qs.delete()