diff --git a/apps/timetable/migrations/0002_auto_20190919_0741.py b/apps/timetable/migrations/0002_auto_20190919_0741.py deleted file mode 100644 index c508b7ba..00000000 --- a/apps/timetable/migrations/0002_auto_20190919_0741.py +++ /dev/null @@ -1,48 +0,0 @@ -# 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/migrations/0002_auto_20190919_1124.py b/apps/timetable/migrations/0002_auto_20190919_1124.py new file mode 100644 index 00000000..1e89bbf2 --- /dev/null +++ b/apps/timetable/migrations/0002_auto_20190919_1124.py @@ -0,0 +1,43 @@ +# Generated by Django 2.2.4 on 2019-09-19 11:24 + +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(null=True, verbose_name='Closed time'), + ), + migrations.AddField( + model_name='timetable', + name='opening_at', + field=models.TimeField(null=True, verbose_name='Opening time'), + ), + migrations.AlterField( + model_name='timetable', + name='dinner_end', + field=models.TimeField(null=True, verbose_name='Dinner end time'), + ), + migrations.AlterField( + model_name='timetable', + name='dinner_start', + field=models.TimeField(null=True, verbose_name='Dinner start time'), + ), + migrations.AlterField( + model_name='timetable', + name='lunch_end', + field=models.TimeField(null=True, verbose_name='Lunch end time'), + ), + migrations.AlterField( + model_name='timetable', + name='lunch_start', + field=models.TimeField(null=True, verbose_name='Lunch start time'), + ), + ] diff --git a/apps/timetable/models.py b/apps/timetable/models.py index bef7794c..4e42094f 100644 --- a/apps/timetable/models.py +++ b/apps/timetable/models.py @@ -23,22 +23,13 @@ class Timetable(ProjectBaseMixin): (SUNDAY, _('Sunday'))) weekday = models.PositiveSmallIntegerField(choices=WEEKDAYS_CHOICES, verbose_name=_('Week day')) - 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) + lunch_start = models.TimeField(verbose_name=_('Lunch start time'), null=True) + lunch_end = models.TimeField(verbose_name=_('Lunch end time'), null=True) + dinner_start = models.TimeField(verbose_name=_('Dinner start time'), null=True) + dinner_end = models.TimeField(verbose_name=_('Dinner end time'), null=True) + opening_at = models.TimeField(verbose_name=_('Opening time'), null=True) + closed_at = models.TimeField(verbose_name=_('Closed time'), null=True) class Meta: """Meta class.""" diff --git a/apps/timetable/serialziers.py b/apps/timetable/serialziers.py index 90332668..1339cc8e 100644 --- a/apps/timetable/serialziers.py +++ b/apps/timetable/serialziers.py @@ -1,20 +1,25 @@ """Serializer for app timetable""" -from rest_framework import serializers -from timetable.models import Timetable -from establishment.models import Establishment from django.utils.translation import gettext_lazy as _ +from rest_framework import serializers + +from establishment.models import Establishment +from timetable.models import Timetable 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) + + lunch_start = serializers.TimeField(required=False) + lunch_end = serializers.TimeField(required=False) + dinner_start = serializers.TimeField(required=False) + dinner_end = serializers.TimeField(required=False) + opening_at = serializers.TimeField(required=False) + closed_at = serializers.TimeField(required=False) + + NULLABLE_FIELDS = ['lunch_start', 'lunch_end', 'dinner_start', + 'dinner_end', 'opening_at', 'closed_at'] class Meta: """Meta class.""" @@ -28,9 +33,27 @@ class ScheduleRUDSerializer(serializers.ModelSerializer): 'dinner_end', 'opening_at', 'closed_at', - 'continuous_opening', ] + def validate(self, attrs): + """Override validate method""" + establishment_pk = self.context.get('request')\ + .parser_context.get('view')\ + .kwargs.get('pk') + + # Check if establishment exists. + establishment_qs = Establishment.objects.filter(pk=establishment_pk) + if not establishment_qs.exists(): + raise serializers.ValidationError({'detail': _('Establishment not found.')}) + attrs['establishment'] = establishment_qs.first() + + # If fields not in request data then put it in attrs with None value. + if not self.partial: + for field in self.NULLABLE_FIELDS: + if field not in attrs: + attrs.setdefault(field, None) + return attrs + class ScheduleCreateSerializer(ScheduleRUDSerializer): """Serializer for Establishment model.""" @@ -43,39 +66,11 @@ class ScheduleCreateSerializer(ScheduleRUDSerializer): 'weekday', ] - def validate(self, attrs): - """Override validate method""" - # 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.')}) - - 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(): - raise serializers.ValidationError({'detail': _('Establishment not found.')}) - attrs['establishment'] = establishment_qs.first() - return attrs - 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():