diff --git a/apps/establishment/models.py b/apps/establishment/models.py index 07c8465d..fbe333cf 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -514,6 +514,9 @@ class EstablishmentQuerySet(models.QuerySet): to_attr='main_image') ) + def with_contacts(self): + return self.prefetch_related('emails', 'phones') + class Establishment(GalleryMixin, ProjectBaseMixin, URLImageMixin, TranslatedFieldsMixin, HasTagsMixin, FavoritesMixin): @@ -817,6 +820,11 @@ class Establishment(GalleryMixin, ProjectBaseMixin, URLImageMixin, if self.phones: return [phone.phone.as_e164 for phone in self.phones.all()] + @property + def contact_emails(self): + if self.phones: + return [email.email for email in self.emails.all()] + @property def establishment_subtype_labels(self): if self.establishment_subtypes: diff --git a/apps/establishment/serializers/back.py b/apps/establishment/serializers/back.py index 4b9744e9..cf463454 100644 --- a/apps/establishment/serializers/back.py +++ b/apps/establishment/serializers/back.py @@ -6,7 +6,7 @@ from rest_framework import serializers from account.serializers.common import UserShortSerializer from establishment import models, serializers as model_serializers -from establishment.models import ContactPhone, EstablishmentEmployee +from establishment.models import ContactPhone, EstablishmentEmployee, ContactEmail from gallery.models import Image from location.models import Address from location.serializers import AddressDetailSerializer, TranslatedField @@ -26,6 +26,16 @@ def phones_handler(phones_list, establishment): ContactPhone.objects.create(establishment=establishment, phone=new_phone) +def emails_handler(emails_list, establishment): + """ + create or update emails for establishment + """ + ContactEmail.objects.filter(establishment=establishment).delete() + + for new_email in emails_list: + ContactEmail.objects.create(establishment=establishment, email=new_email) + + class EstablishmentListCreateSerializer(model_serializers.EstablishmentBaseSerializer): """Establishment create serializer""" @@ -39,8 +49,6 @@ class EstablishmentListCreateSerializer(model_serializers.EstablishmentBaseSeria queryset=models.Address.objects.all(), write_only=True ) - emails = model_serializers.ContactEmailsSerializer(read_only=True, - many=True, ) socials = model_serializers.SocialNetworkRelatedSerializers(read_only=True, many=True, ) type = model_serializers.EstablishmentTypeBaseSerializer(source='establishment_type', @@ -55,6 +63,13 @@ class EstablishmentListCreateSerializer(model_serializers.EstablishmentBaseSeria child=serializers.CharField(max_length=128), required=False, ) + emails = serializers.ListField( + source='contact_emails', + allow_null=True, + allow_empty=True, + child=serializers.CharField(max_length=128), + required=False, + ) class Meta: model = models.Establishment @@ -87,8 +102,13 @@ class EstablishmentListCreateSerializer(model_serializers.EstablishmentBaseSeria if 'contact_phones' in validated_data: phones_list = validated_data.pop('contact_phones') + emails_list = [] + if 'contact_emails' in validated_data: + emails_list = validated_data.pop('contact_emails') + instance = super().create(validated_data) phones_handler(phones_list, instance) + emails_handler(emails_list, instance) return instance @@ -113,8 +133,13 @@ class EstablishmentRUDSerializer(model_serializers.EstablishmentBaseSerializer): queryset=models.EstablishmentType.objects.all(), write_only=True ) address = AddressDetailSerializer() - emails = model_serializers.ContactEmailsSerializer(read_only=False, - many=True, ) + emails = serializers.ListField( + source='contact_emails', + allow_null=True, + allow_empty=True, + child=serializers.CharField(max_length=128), + required=False, + ) socials = model_serializers.SocialNetworkRelatedSerializers(read_only=False, many=True, ) type = model_serializers.EstablishmentTypeBaseSerializer(source='establishment_type') @@ -152,8 +177,13 @@ class EstablishmentRUDSerializer(model_serializers.EstablishmentBaseSerializer): if 'contact_phones' in validated_data: phones_list = validated_data.pop('contact_phones') + emails_list = [] + if 'contact_emails' in validated_data: + emails_list = validated_data.pop('contact_emails') + instance = super().update(instance, validated_data) phones_handler(phones_list, instance) + emails_handler(emails_list, instance) return instance diff --git a/apps/establishment/views/back.py b/apps/establishment/views/back.py index dfd5ded7..d745f5e9 100644 --- a/apps/establishment/views/back.py +++ b/apps/establishment/views/back.py @@ -19,7 +19,7 @@ class EstablishmentMixinViews: def get_queryset(self): """Overrided method 'get_queryset'.""" - return models.Establishment.objects.with_base_related() + return models.Establishment.objects.with_base_related().with_contacts() class EstablishmentListCreateView(EstablishmentMixinViews, generics.ListCreateAPIView):