from django.db import models from backend.models.module import BasicModule, BasicModuleSerializer, BasicModuleViewSet from backend.models.university import University from rest_framework import serializers def check_nones(val1, val2): if val1 is None and val2 is not None: raise serializers.ValidationError("Check your dates") if val2 is None and val1 is not None: raise serializers.ValidationError("Check your dates") return val1 is None and val2 is None class UniversitySemestersDates(BasicModule): university = models.OneToOneField( University, on_delete=models.CASCADE, related_name='university_semesters_dates', primary_key=True, null=False) spring_begin = models.DateField(null=True, blank=True) spring_end = models.DateField(null=True, blank=True) autumn_begin = models.DateField(null=True, blank=True) autumn_end = models.DateField(null=True, blank=True) @classmethod def get_serializer(cls): return UniversitySemestersDatesSerializer class UniversitySemestersDatesSerializer(BasicModuleSerializer): def validate(self, attrs): spring_ok = check_nones(attrs['spring_begin'], attrs['spring_end']) autumn_ok = check_nones(attrs['autumn_begin'], attrs['autumn_end']) if not spring_ok: spring_ok = attrs['spring_begin'] < attrs['spring_end'] if not autumn_ok: autumn_ok = attrs['autumn_begin'] < attrs['autumn_end'] # no check if spring_end < autumn_begin in case info is not available if not (spring_ok and autumn_ok): raise serializers.ValidationError( "Check your dates !") # TODO better error return attrs class Meta: model = UniversitySemestersDates fields = '__all__' class UniversitySemestersDatesViewSet(BasicModuleViewSet): queryset = UniversitySemestersDates.objects.all() # pylint: disable=E1101 serializer_class = UniversitySemestersDatesSerializer