Merge branch 'feature/agenda-back-office' into 'develop'

Feature/agenda back office

See merge request gm/gm-backend!202
This commit is contained in:
Олег Хаятов 2020-01-17 14:23:44 +00:00
commit 15df8e405d

View File

@ -22,7 +22,9 @@ from utils.serializers import (
class AgendaSerializer(ProjectModelSerializer): class AgendaSerializer(ProjectModelSerializer):
start_datetime = serializers.DateTimeField() start_datetime = serializers.DateTimeField()
end_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() event_name_translated = TranslatedField()
content_translated = TranslatedField() content_translated = TranslatedField()
@ -36,7 +38,8 @@ class AgendaSerializer(ProjectModelSerializer):
'end_datetime', 'end_datetime',
'address', 'address',
'content_translated', 'content_translated',
'event_name_translated' 'event_name_translated',
'address_id',
) )
@ -180,6 +183,7 @@ class NewsBackOfficeBaseSerializer(NewsBaseSerializer):
"""News back office base serializer.""" """News back office base serializer."""
is_published = serializers.BooleanField(source='is_publish', read_only=True) is_published = serializers.BooleanField(source='is_publish', read_only=True)
descriptions = serializers.ListField(required=False) descriptions = serializers.ListField(required=False)
agenda = AgendaSerializer()
class Meta(NewsBaseSerializer.Meta): class Meta(NewsBaseSerializer.Meta):
"""Meta class.""" """Meta class."""
@ -198,6 +202,7 @@ class NewsBackOfficeBaseSerializer(NewsBaseSerializer):
'created', 'created',
'modified', 'modified',
'descriptions', 'descriptions',
'agenda'
) )
extra_kwargs = { extra_kwargs = {
'created': {'read_only': True}, 'created': {'read_only': True},
@ -228,6 +233,7 @@ class NewsBackOfficeBaseSerializer(NewsBaseSerializer):
for locale in locales: for locale in locales:
if not attrs[key].get(locale): if not attrs[key].get(locale):
attrs[key][locale] = getattr(instance, key).get(locale) attrs[key][locale] = getattr(instance, key).get(locale)
return attrs return attrs
def create(self, validated_data): def create(self, validated_data):
@ -245,10 +251,25 @@ class NewsBackOfficeBaseSerializer(NewsBaseSerializer):
user = request.user user = request.user
validated_data['created_by'] = 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): def update(self, instance, validated_data):
slugs = validated_data.get('slugs') 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: if slugs:
slugs_list = list(map(lambda x: x.lower(), slugs.values())) slugs_list = list(map(lambda x: x.lower(), slugs.values()))
slugs_set = set(slugs_list) slugs_set = set(slugs_list)
@ -256,6 +277,29 @@ class NewsBackOfficeBaseSerializer(NewsBaseSerializer):
slugs__values__contains=list(slugs.values()) slugs__values__contains=list(slugs.values())
).exists() or len(slugs_list) != len(slugs_set): ).exists() or len(slugs_list) != len(slugs_set):
raise serializers.ValidationError({'slugs': _('Slug should be unique')}) 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) return super().update(instance, validated_data)