diff --git a/apps/news/serializers.py b/apps/news/serializers.py index c0df73a4..ed6ad4d3 100644 --- a/apps/news/serializers.py +++ b/apps/news/serializers.py @@ -22,7 +22,9 @@ from utils.serializers import ( class AgendaSerializer(ProjectModelSerializer): start_datetime = serializers.DateTimeField() end_datetime = serializers.DateTimeField() - address = AddressBaseSerializer() + address = AddressBaseSerializer(read_only=True) + address_id = serializers.PrimaryKeyRelatedField(write_only=True, queryset=location_models.Address.objects.all(), + source='address') event_name_translated = TranslatedField() content_translated = TranslatedField() @@ -36,7 +38,8 @@ class AgendaSerializer(ProjectModelSerializer): 'end_datetime', 'address', 'content_translated', - 'event_name_translated' + 'event_name_translated', + 'address_id', ) @@ -180,6 +183,7 @@ class NewsBackOfficeBaseSerializer(NewsBaseSerializer): """News back office base serializer.""" is_published = serializers.BooleanField(source='is_publish', read_only=True) descriptions = serializers.ListField(required=False) + agenda = AgendaSerializer() class Meta(NewsBaseSerializer.Meta): """Meta class.""" @@ -198,6 +202,7 @@ class NewsBackOfficeBaseSerializer(NewsBaseSerializer): 'created', 'modified', 'descriptions', + 'agenda' ) extra_kwargs = { 'created': {'read_only': True}, @@ -228,6 +233,7 @@ class NewsBackOfficeBaseSerializer(NewsBaseSerializer): for locale in locales: if not attrs[key].get(locale): attrs[key][locale] = getattr(instance, key).get(locale) + return attrs def create(self, validated_data): @@ -245,10 +251,25 @@ class NewsBackOfficeBaseSerializer(NewsBaseSerializer): user = request.user validated_data['created_by'] = user - return super().create(validated_data) + agenda_data = validated_data.get('agenda') + agenda = None + + if agenda_data is not None: + agenda_data['address_id'] = agenda_data.pop('address').pk + agenda_serializer = AgendaSerializer(data=agenda_data) + agenda_serializer.is_valid(raise_exception=True) + agenda = agenda_serializer.save() + + instance = super().create(validated_data) + instance.agenda = agenda + instance.save() + + return instance def update(self, instance, validated_data): slugs = validated_data.get('slugs') + slugs_list = list(map(lambda x: x.lower(), slugs.values() if slugs else ())) + slugs_set = set(slugs_list) if slugs: slugs_list = list(map(lambda x: x.lower(), slugs.values())) slugs_set = set(slugs_list) @@ -256,6 +277,29 @@ class NewsBackOfficeBaseSerializer(NewsBaseSerializer): slugs__values__contains=list(slugs.values()) ).exists() or len(slugs_list) != len(slugs_set): raise serializers.ValidationError({'slugs': _('Slug should be unique')}) + + agenda_data = validated_data.get('agenda') + agenda = instance.agenda + + if agenda is None and agenda_data is not None: + agenda_data['address_id'] = agenda_data.pop('address').pk + agenda_serializer = AgendaSerializer(data=agenda_data) + agenda_serializer.is_valid(raise_exception=True) + agenda_serializer.save() + + elif agenda_data is not None: + agenda.start_datetime = agenda_data.pop( + 'start_datetime') if 'start_datetime' in agenda_data else agenda.start_datetime + agenda.end_datetime = agenda_data.pop( + 'end_datetime') if 'end_datetime' in agenda_data else agenda.end_datetime + agenda.address = agenda_data.pop( + 'address') if 'address' in agenda_data else agenda.address + agenda.event_name = agenda_data.pop( + 'event_name') if 'event_time' in agenda_data else agenda.event_name + agenda.content = agenda_data.pop( + 'content') if 'content' in agenda_data else agenda.content + agenda.save() + return super().update(instance, validated_data)