from django.db import models from backend.models.basic_module import BasicModule, BasicModuleSerializer, BasicModuleViewSet from backend.models.university import University from rest_framework import serializers from backend.utils import get_model_config, get_viewset_permissions def semester_error(semester_name): raise serializers.ValidationError( "Inconsistent {} semester dates".format(semester_name)) class UniversitySemestersDates(BasicModule): model_config = get_model_config("UniversitySemestersDates") 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 my_validate(self, attrs): attrs = super(UniversitySemestersDatesSerializer, self).my_validate(attrs) s_b, s_e = attrs['spring_begin'], attrs['spring_end'] a_b, a_e = attrs['autumn_begin'], attrs['autumn_end'] def test(begin, end, name): ok = (begin is None and end is None) or ( begin is not None and end is not None) if not ok: semester_error(name) if begin is not None and (begin > end): semester_error(name) test(s_b, s_e, 'spring') test(a_b, a_e, 'autumn') if s_b is None and a_b is None: semester_error('autaumn and spring') return attrs class Meta: model = UniversitySemestersDates fields = '__all__' class UniversitySemestersDatesViewSet(BasicModuleViewSet): permission_classes = get_viewset_permissions( "UniversitySemestersDatesViewSet") queryset = UniversitySemestersDates.objects.all() # pylint: disable=E1101 serializer_class = UniversitySemestersDatesSerializer