From 38ba443b4734c19302f922a464699347622349e8 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Thu, 19 Sep 2019 11:26:54 +0300 Subject: [PATCH] gm-80: complete --- .../migrations/0022_establishment_schedule.py | 19 ++++++++ apps/establishment/models.py | 4 ++ .../migrations/0002_auto_20190919_0741.py | 48 +++++++++++++++++++ apps/timetable/models.py | 20 ++++++-- apps/timetable/serialziers.py | 42 ++++++++++++---- 5 files changed, 121 insertions(+), 12 deletions(-) create mode 100644 apps/establishment/migrations/0022_establishment_schedule.py create mode 100644 apps/timetable/migrations/0002_auto_20190919_0741.py diff --git a/apps/establishment/migrations/0022_establishment_schedule.py b/apps/establishment/migrations/0022_establishment_schedule.py new file mode 100644 index 00000000..fbb23577 --- /dev/null +++ b/apps/establishment/migrations/0022_establishment_schedule.py @@ -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'), + ), + ] diff --git a/apps/establishment/models.py b/apps/establishment/models.py index 6a2c0160..0c2a7595 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -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') diff --git a/apps/timetable/migrations/0002_auto_20190919_0741.py b/apps/timetable/migrations/0002_auto_20190919_0741.py new file mode 100644 index 00000000..c508b7ba --- /dev/null +++ b/apps/timetable/migrations/0002_auto_20190919_0741.py @@ -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'), + ), + ] diff --git a/apps/timetable/models.py b/apps/timetable/models.py index 5f3a8762..bef7794c 100644 --- a/apps/timetable/models.py +++ b/apps/timetable/models.py @@ -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.""" diff --git a/apps/timetable/serialziers.py b/apps/timetable/serialziers.py index 899833fa..90332668 100644 --- a/apps/timetable/serialziers.py +++ b/apps/timetable/serialziers.py @@ -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()