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')
)
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:

View File

@ -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

View File

@ -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):