"""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 _ 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.""" model = Timetable fields = [ 'id', 'weekday_display', 'lunch_start', 'lunch_end', 'dinner_start', 'dinner_end', 'opening_at', 'closed_at', 'continuous_opening', ] class ScheduleCreateSerializer(ScheduleRUDSerializer): """Serializer for Establishment model.""" weekday = serializers.IntegerField(write_only=True) class Meta: """Meta class.""" model = Timetable fields = ScheduleRUDSerializer.Meta.fields + [ '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(): schedule_qs.delete() establishment.schedule.add(instance) return instance