email cascade establishment

This commit is contained in:
alex 2020-01-28 14:36:54 +03:00
parent 65a6feb4b2
commit 193f1655e4
3 changed files with 44 additions and 6 deletions

View File

@ -514,6 +514,9 @@ class EstablishmentQuerySet(models.QuerySet):
to_attr='main_image') to_attr='main_image')
) )
def with_contacts(self):
return self.prefetch_related('emails', 'phones')
class Establishment(GalleryMixin, ProjectBaseMixin, URLImageMixin, class Establishment(GalleryMixin, ProjectBaseMixin, URLImageMixin,
TranslatedFieldsMixin, HasTagsMixin, FavoritesMixin): TranslatedFieldsMixin, HasTagsMixin, FavoritesMixin):
@ -817,6 +820,11 @@ class Establishment(GalleryMixin, ProjectBaseMixin, URLImageMixin,
if self.phones: if self.phones:
return [phone.phone.as_e164 for phone in self.phones.all()] 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 @property
def establishment_subtype_labels(self): def establishment_subtype_labels(self):
if self.establishment_subtypes: if self.establishment_subtypes:

View File

@ -6,7 +6,7 @@ from rest_framework import serializers
from account.serializers.common import UserShortSerializer from account.serializers.common import UserShortSerializer
from establishment import models, serializers as model_serializers 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 gallery.models import Image
from location.models import Address from location.models import Address
from location.serializers import AddressDetailSerializer, TranslatedField from location.serializers import AddressDetailSerializer, TranslatedField
@ -26,6 +26,16 @@ def phones_handler(phones_list, establishment):
ContactPhone.objects.create(establishment=establishment, phone=new_phone) 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): class EstablishmentListCreateSerializer(model_serializers.EstablishmentBaseSerializer):
"""Establishment create serializer""" """Establishment create serializer"""
@ -39,8 +49,6 @@ class EstablishmentListCreateSerializer(model_serializers.EstablishmentBaseSeria
queryset=models.Address.objects.all(), queryset=models.Address.objects.all(),
write_only=True write_only=True
) )
emails = model_serializers.ContactEmailsSerializer(read_only=True,
many=True, )
socials = model_serializers.SocialNetworkRelatedSerializers(read_only=True, socials = model_serializers.SocialNetworkRelatedSerializers(read_only=True,
many=True, ) many=True, )
type = model_serializers.EstablishmentTypeBaseSerializer(source='establishment_type', type = model_serializers.EstablishmentTypeBaseSerializer(source='establishment_type',
@ -55,6 +63,13 @@ class EstablishmentListCreateSerializer(model_serializers.EstablishmentBaseSeria
child=serializers.CharField(max_length=128), child=serializers.CharField(max_length=128),
required=False, required=False,
) )
emails = serializers.ListField(
source='contact_emails',
allow_null=True,
allow_empty=True,
child=serializers.CharField(max_length=128),
required=False,
)
class Meta: class Meta:
model = models.Establishment model = models.Establishment
@ -87,8 +102,13 @@ class EstablishmentListCreateSerializer(model_serializers.EstablishmentBaseSeria
if 'contact_phones' in validated_data: if 'contact_phones' in validated_data:
phones_list = validated_data.pop('contact_phones') 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) instance = super().create(validated_data)
phones_handler(phones_list, instance) phones_handler(phones_list, instance)
emails_handler(emails_list, instance)
return instance return instance
@ -113,8 +133,13 @@ class EstablishmentRUDSerializer(model_serializers.EstablishmentBaseSerializer):
queryset=models.EstablishmentType.objects.all(), write_only=True queryset=models.EstablishmentType.objects.all(), write_only=True
) )
address = AddressDetailSerializer() address = AddressDetailSerializer()
emails = model_serializers.ContactEmailsSerializer(read_only=False, emails = serializers.ListField(
many=True, ) source='contact_emails',
allow_null=True,
allow_empty=True,
child=serializers.CharField(max_length=128),
required=False,
)
socials = model_serializers.SocialNetworkRelatedSerializers(read_only=False, socials = model_serializers.SocialNetworkRelatedSerializers(read_only=False,
many=True, ) many=True, )
type = model_serializers.EstablishmentTypeBaseSerializer(source='establishment_type') type = model_serializers.EstablishmentTypeBaseSerializer(source='establishment_type')
@ -152,8 +177,13 @@ class EstablishmentRUDSerializer(model_serializers.EstablishmentBaseSerializer):
if 'contact_phones' in validated_data: if 'contact_phones' in validated_data:
phones_list = validated_data.pop('contact_phones') 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) instance = super().update(instance, validated_data)
phones_handler(phones_list, instance) phones_handler(phones_list, instance)
emails_handler(emails_list, instance)
return instance return instance

View File

@ -19,7 +19,7 @@ class EstablishmentMixinViews:
def get_queryset(self): def get_queryset(self):
"""Overrided method 'get_queryset'.""" """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): class EstablishmentListCreateView(EstablishmentMixinViews, generics.ListCreateAPIView):