Merge branch 'develop' into fix_tags

This commit is contained in:
Dmitriy Kuzmenko 2019-11-16 22:57:43 +03:00
commit ca9843482e
20 changed files with 212 additions and 65 deletions

View File

@ -0,0 +1,17 @@
# Generated by Django 2.2.7 on 2019-11-16 11:35
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('advertisement', '0007_auto_20191115_0750'),
]
operations = [
migrations.AlterModelOptions(
name='advertisement',
options={'verbose_name': 'Advertisement', 'verbose_name_plural': 'Advertisements'},
),
]

View File

@ -14,6 +14,12 @@ class CheckWhetherBookingAvailable(generics.GenericAPIView):
""" Checks which service to use if establishmend is managed by any """ """ Checks which service to use if establishmend is managed by any """
_VALID_GUESTONLINE_PERIODS = {'lunch', 'dinner', 'afternoon', 'breakfast'} _VALID_GUESTONLINE_PERIODS = {'lunch', 'dinner', 'afternoon', 'breakfast'}
_GUESTONLINE_PERIODS_TO_PRIOR = {
'breakfast': 1,
'lunch': 2,
'afternoon': 3,
'dinner': 4,
}
permission_classes = (permissions.AllowAny,) permission_classes = (permissions.AllowAny,)
serializer_class = CheckBookingSerializer serializer_class = CheckBookingSerializer
@ -32,7 +38,7 @@ class CheckWhetherBookingAvailable(generics.GenericAPIView):
period_template = iter(periods_by_name.values()).__next__().copy() period_template = iter(periods_by_name.values()).__next__().copy()
period_template.pop('total_left_seats') period_template.pop('total_left_seats')
period_template.pop('hours') period_template['hours'] = []
period_template.pop('period') period_template.pop('period')
processed_periods = [ processed_periods = [
@ -46,7 +52,8 @@ class CheckWhetherBookingAvailable(generics.GenericAPIView):
for unnamed_period in unnamed_periods: for unnamed_period in unnamed_periods:
processed_periods.append(unnamed_period) processed_periods.append(unnamed_period)
response['periods'] = processed_periods response['periods'] = sorted(processed_periods,
key=lambda x: self._GUESTONLINE_PERIODS_TO_PRIOR[x.get('period', 'lunch')])
return response return response

View File

@ -1,11 +1,11 @@
from django.shortcuts import get_object_or_404
from rest_framework import generics from rest_framework import generics
from rest_framework import permissions from rest_framework import permissions
from collection import models from collection import models
from utils.pagination import ProjectPageNumberPagination
from django.shortcuts import get_object_or_404
from establishment.serializers import EstablishmentBaseSerializer
from collection.serializers import common as serializers from collection.serializers import common as serializers
from establishment.serializers import EstablishmentSimilarSerializer
from utils.pagination import ProjectPageNumberPagination
# Mixins # Mixins
@ -53,7 +53,7 @@ class CollectionEstablishmentListView(CollectionListView):
"""Retrieve list of establishment for collection.""" """Retrieve list of establishment for collection."""
lookup_field = 'slug' lookup_field = 'slug'
pagination_class = ProjectPageNumberPagination pagination_class = ProjectPageNumberPagination
serializer_class = EstablishmentBaseSerializer serializer_class = EstablishmentSimilarSerializer
def get_queryset(self): def get_queryset(self):
""" """

View File

@ -5,7 +5,7 @@ from rest_framework import serializers
from comment import models as comment_models from comment import models as comment_models
from comment.serializers import common as comment_serializers from comment.serializers import common as comment_serializers
from establishment import models from establishment import models
from location.serializers import AddressBaseSerializer, CitySerializer, AddressDetailSerializer from location.serializers import AddressBaseSerializer, CitySerializer, AddressDetailSerializer, CityShortSerializer
from main.serializers import AwardSerializer, CurrencySerializer from main.serializers import AwardSerializer, CurrencySerializer
from tag.serializers import TagBaseSerializer from tag.serializers import TagBaseSerializer
from timetable.serialziers import ScheduleRUDSerializer from timetable.serialziers import ScheduleRUDSerializer
@ -17,6 +17,7 @@ from review.serializers import ReviewShortSerializer
class ContactPhonesSerializer(serializers.ModelSerializer): class ContactPhonesSerializer(serializers.ModelSerializer):
"""Contact phone serializer""" """Contact phone serializer"""
class Meta: class Meta:
model = models.ContactPhone model = models.ContactPhone
fields = [ fields = [
@ -26,6 +27,7 @@ class ContactPhonesSerializer(serializers.ModelSerializer):
class ContactEmailsSerializer(serializers.ModelSerializer): class ContactEmailsSerializer(serializers.ModelSerializer):
"""Contact email serializer""" """Contact email serializer"""
class Meta: class Meta:
model = models.ContactEmail model = models.ContactEmail
fields = [ fields = [
@ -35,6 +37,7 @@ class ContactEmailsSerializer(serializers.ModelSerializer):
class SocialNetworkRelatedSerializers(serializers.ModelSerializer): class SocialNetworkRelatedSerializers(serializers.ModelSerializer):
"""Social network serializers.""" """Social network serializers."""
class Meta: class Meta:
model = models.SocialNetwork model = models.SocialNetwork
fields = [ fields = [
@ -45,7 +48,6 @@ class SocialNetworkRelatedSerializers(serializers.ModelSerializer):
class PlateSerializer(ProjectModelSerializer): class PlateSerializer(ProjectModelSerializer):
name_translated = TranslatedField() name_translated = TranslatedField()
currency = CurrencySerializer(read_only=True) currency = CurrencySerializer(read_only=True)
@ -191,6 +193,28 @@ class EstablishmentShortSerializer(serializers.ModelSerializer):
] ]
class EstablishmentProductShortSerializer(serializers.ModelSerializer):
"""SHORT Serializer for displaying info about an establishment on product page."""
establishment_type = EstablishmentTypeGeoSerializer()
establishment_subtypes = EstablishmentSubTypeBaseSerializer(many=True)
address = AddressBaseSerializer()
city = CityShortSerializer(source='address.city', allow_null=True)
class Meta:
"""Meta class."""
model = models.Establishment
fields = [
'id',
'name',
'index_name',
'slug',
'city',
'establishment_type',
'establishment_subtypes',
'address',
]
class EstablishmentProductSerializer(EstablishmentShortSerializer): class EstablishmentProductSerializer(EstablishmentShortSerializer):
"""Serializer for displaying info about an establishment on product page.""" """Serializer for displaying info about an establishment on product page."""
@ -316,6 +340,12 @@ class EstablishmentDetailSerializer(EstablishmentBaseSerializer):
] ]
class EstablishmentSimilarSerializer(EstablishmentBaseSerializer):
"""Serializer for Establishment model."""
address = AddressDetailSerializer(read_only=True)
class EstablishmentCommentCreateSerializer(comment_serializers.CommentSerializer): class EstablishmentCommentCreateSerializer(comment_serializers.CommentSerializer):
"""Create comment serializer""" """Create comment serializer"""
mark = serializers.IntegerField() mark = serializers.IntegerField()
@ -379,4 +409,3 @@ class EstablishmentFavoritesCreateSerializer(FavoritesCreateSerializer):
'content_object': validated_data.pop('establishment') 'content_object': validated_data.pop('establishment')
}) })
return super().create(validated_data) return super().create(validated_data)

View File

@ -72,7 +72,7 @@ class EstablishmentRecentReviewListView(EstablishmentListView):
class EstablishmentSimilarListView(EstablishmentListView): class EstablishmentSimilarListView(EstablishmentListView):
"""Resource for getting a list of establishments.""" """Resource for getting a list of establishments."""
serializer_class = serializers.EstablishmentBaseSerializer serializer_class = serializers.EstablishmentSimilarSerializer
pagination_class = EstablishmentPortionPagination pagination_class = EstablishmentPortionPagination
def get_queryset(self): def get_queryset(self):

View File

@ -54,6 +54,20 @@ class RegionSerializer(serializers.ModelSerializer):
'country_id' 'country_id'
] ]
class CityShortSerializer(serializers.ModelSerializer):
"""Short city serializer"""
country = CountrySerializer(read_only=True)
class Meta:
"""Meta class"""
model = models.City
fields = (
'id',
'name',
'code',
'country',
)
class CitySerializer(serializers.ModelSerializer): class CitySerializer(serializers.ModelSerializer):
"""City serializer.""" """City serializer."""

View File

@ -1,8 +1,9 @@
"""Location app views.""" """Location app views."""
from rest_framework import generics from rest_framework import generics
from rest_framework import permissions from rest_framework import permissions
from django.db.models.expressions import RawSQL
from location import models, serializers from location import models, serializers
from utils.models import get_current_locale
# Mixins # Mixins
@ -37,7 +38,9 @@ class CountryListView(CountryViewMixin, generics.ListAPIView):
"""List view for model Country.""" """List view for model Country."""
pagination_class = None pagination_class = None
def get_queryset(self):
qs = super().get_queryset().order_by(RawSQL("name->>%s", (get_current_locale(),)))
return qs
class CountryRetrieveView(CountryViewMixin, generics.RetrieveAPIView): class CountryRetrieveView(CountryViewMixin, generics.RetrieveAPIView):
"""Retrieve view for model Country.""" """Retrieve view for model Country."""

View File

@ -0,0 +1,20 @@
# Generated by Django 2.2.7 on 2019-11-16 12:48
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('notification', '0002_subscriber_old_id'),
]
operations = [
migrations.AlterField(
model_name='subscriber',
name='user',
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='subscriber', to=settings.AUTH_USER_MODEL, verbose_name='User'),
),
]

View File

@ -74,7 +74,7 @@ class Subscriber(ProjectBaseMixin):
(USABLE, _('Usable')), (USABLE, _('Usable')),
) )
user = models.OneToOneField( user = models.ForeignKey(
User, User,
blank=True, blank=True,
null=True, null=True,

View File

@ -1,7 +1,5 @@
from pprint import pprint from pprint import pprint
from django.db.models import Count
from transfer.models import EmailAddresses, NewsletterSubscriber from transfer.models import EmailAddresses, NewsletterSubscriber
from transfer.serializers.notification import SubscriberSerializer, NewsletterSubscriberSerializer from transfer.serializers.notification import SubscriberSerializer, NewsletterSubscriberSerializer
@ -25,14 +23,14 @@ def transfer_newsletter_subscriber():
'email_address__ip', 'email_address__ip',
'email_address__country_code', 'email_address__country_code',
'email_address__locale', 'email_address__locale',
'created_at', 'updated_at',
) )
# serialized_data = NewsletterSubscriberSerializer(data=list(queryset.values()), many=True) serialized_data = NewsletterSubscriberSerializer(data=list(queryset), many=True)
# if serialized_data.is_valid(): if serialized_data.is_valid():
# serialized_data.save() serialized_data.save()
# else: else:
# pprint(f'NewsletterSubscriber serializer errors: {serialized_data.errors}') pprint(f'NewsletterSubscriber serializer errors: {serialized_data.errors}')
data_types = { data_types = {

View File

@ -82,7 +82,12 @@ class ProductQuerySet(models.QuerySet):
def with_extended_related(self): def with_extended_related(self):
"""Returns qs with almost all related objects.""" """Returns qs with almost all related objects."""
return self.with_base_related() \ return self.with_base_related() \
.prefetch_related('tags', 'standards', 'classifications', 'classifications__standard', .prefetch_related('tags', 'tags__category', 'tags__category__country',
'standards', 'classifications', 'classifications__standard',
'establishment__address', 'establishment__establishment_type',
'establishment__address__city', 'establishment__address__city__country',
'establishment__establishment_subtypes', 'product_gallery',
'gallery', 'product_type', 'subtypes',
'classifications__classification_type', 'classifications__tags') \ 'classifications__classification_type', 'classifications__tags') \
.select_related('wine_region', 'wine_sub_region') .select_related('wine_region', 'wine_sub_region')
@ -270,15 +275,14 @@ class Product(TranslatedFieldsMixin, BaseAttributes):
@property @property
def related_tags(self): def related_tags(self):
return self.tags.exclude( return self.tags.exclude(category__index_name__in=['sugar-content', 'wine-color', 'bottles-produced',
category__index_name__in=['sugar-content', 'wine-color', 'bottles-produced', 'serial-number', 'grape-variety']).prefetch_related('category')
'serial-number', 'grape-variety'])
@property @property
def display_name(self): def display_name(self):
name = f'{self.name} ' \ name = f'{self.name} ' \
f'({self.vintage if self.vintage else "BSA"})' f'({self.vintage if self.vintage else "BSA"})'
if self.establishment.name: if self.establishment and self.establishment.name:
name = f'{self.establishment.name} - ' + name name = f'{self.establishment.name} - ' + name
return name return name

View File

@ -4,7 +4,7 @@ from rest_framework import serializers
from comment.models import Comment from comment.models import Comment
from comment.serializers import CommentSerializer from comment.serializers import CommentSerializer
from establishment.serializers import EstablishmentShortSerializer, EstablishmentProductSerializer from establishment.serializers import EstablishmentShortSerializer, EstablishmentProductSerializer, EstablishmentProductShortSerializer
from gallery.models import Image from gallery.models import Image
from product import models from product import models
from review.serializers import ReviewShortSerializer from review.serializers import ReviewShortSerializer
@ -12,13 +12,13 @@ from utils import exceptions as utils_exceptions
from utils.serializers import TranslatedField, FavoritesCreateSerializer from utils.serializers import TranslatedField, FavoritesCreateSerializer
from main.serializers import AwardSerializer from main.serializers import AwardSerializer
from location.serializers import WineRegionBaseSerializer, WineSubRegionBaseSerializer from location.serializers import WineRegionBaseSerializer, WineSubRegionBaseSerializer
from tag.serializers import TagBaseSerializer, TagCategoryShortSerializer from tag.serializers import TagBaseSerializer, TagCategoryProductSerializer
class ProductTagSerializer(TagBaseSerializer): class ProductTagSerializer(TagBaseSerializer):
"""Serializer for model Tag.""" """Serializer for model Tag."""
category = TagCategoryShortSerializer(read_only=True) category = TagCategoryProductSerializer(read_only=True)
class Meta(TagBaseSerializer.Meta): class Meta(TagBaseSerializer.Meta):
"""Meta class.""" """Meta class."""
@ -88,10 +88,10 @@ class ProductBaseSerializer(serializers.ModelSerializer):
name = serializers.CharField(source='display_name', read_only=True) name = serializers.CharField(source='display_name', read_only=True)
product_type = ProductTypeBaseSerializer(read_only=True) product_type = ProductTypeBaseSerializer(read_only=True)
subtypes = ProductSubTypeBaseSerializer(many=True, read_only=True) subtypes = ProductSubTypeBaseSerializer(many=True, read_only=True)
establishment_detail = EstablishmentShortSerializer(source='establishment', read_only=True) establishment_detail = EstablishmentProductShortSerializer(source='establishment', read_only=True)
tags = ProductTagSerializer(source='related_tags', many=True, read_only=True) tags = ProductTagSerializer(source='related_tags', many=True, read_only=True)
wine_region = WineRegionBaseSerializer(read_only=True) wine_region = WineRegionBaseSerializer(read_only=True)
wine_colors = TagBaseSerializer(many=True, read_only=True) wine_colors = ProductTagSerializer(many=True, read_only=True)
preview_image_url = serializers.URLField(source='preview_main_image_url', preview_image_url = serializers.URLField(source='preview_main_image_url',
allow_null=True, allow_null=True,
read_only=True) read_only=True)
@ -120,6 +120,7 @@ class ProductBaseSerializer(serializers.ModelSerializer):
class ProductDetailSerializer(ProductBaseSerializer): class ProductDetailSerializer(ProductBaseSerializer):
"""Product detail serializer.""" """Product detail serializer."""
description_translated = TranslatedField() description_translated = TranslatedField()
establishment_detail = EstablishmentShortSerializer(source='establishment', read_only=True)
review = ReviewShortSerializer(source='last_published_review', read_only=True) review = ReviewShortSerializer(source='last_published_review', read_only=True)
awards = AwardSerializer(many=True, read_only=True) awards = AwardSerializer(many=True, read_only=True)
classifications = ProductClassificationBaseSerializer(many=True, read_only=True) classifications = ProductClassificationBaseSerializer(many=True, read_only=True)

View File

@ -26,6 +26,10 @@ class ProductListView(ProductBaseView, generics.ListAPIView):
serializer_class = serializers.ProductBaseSerializer serializer_class = serializers.ProductBaseSerializer
filter_class = filters.ProductFilterSet filter_class = filters.ProductFilterSet
def get_queryset(self):
qs = super().get_queryset().with_extended_related()
return qs
class ProductDetailView(ProductBaseView, generics.RetrieveAPIView): class ProductDetailView(ProductBaseView, generics.RetrieveAPIView):
"""Detail view fro model Product.""" """Detail view fro model Product."""

View File

@ -95,13 +95,15 @@ class ProductDocument(Document):
}, },
multi=True multi=True
) )
name = fields.TextField(attr='display_name', analyzer='english')
name_ru = fields.TextField(attr='display_name', analyzer='russian')
name_fr = fields.TextField(attr='display_name', analyzer='french')
class Django: class Django:
model = models.Product model = models.Product
fields = ( fields = (
'id', 'id',
'category', 'category',
'name',
'available', 'available',
'public_mark', 'public_mark',
'slug', 'slug',

View File

@ -39,7 +39,8 @@ class ProductSubtypeDocumentSerializer(serializers.Serializer):
id = serializers.IntegerField() id = serializers.IntegerField()
name_translated = serializers.SerializerMethodField() name_translated = serializers.SerializerMethodField()
get_name_translated = lambda obj: get_translated_value(obj.name) def get_name_translated(self, obj):
return get_translated_value(obj.name)
class WineRegionCountryDocumentSerialzer(serializers.Serializer): class WineRegionCountryDocumentSerialzer(serializers.Serializer):
@ -64,6 +65,9 @@ class WineRegionDocumentSerializer(serializers.Serializer):
name = serializers.CharField() name = serializers.CharField()
country = WineRegionCountryDocumentSerialzer(allow_null=True) country = WineRegionCountryDocumentSerialzer(allow_null=True)
def get_attribute(self, instance):
return instance.wine_region if instance and instance.wine_region else None
class WineColorDocumentSerializer(serializers.Serializer): class WineColorDocumentSerializer(serializers.Serializer):
"""Wine color ES document serializer,""" """Wine color ES document serializer,"""
@ -79,6 +83,18 @@ class WineColorDocumentSerializer(serializers.Serializer):
return get_translated_value(obj.label) return get_translated_value(obj.label)
class ProductTypeDocumentSerializer(serializers.Serializer):
"""Product type ES document serializer."""
id = serializers.IntegerField()
index_name = serializers.CharField()
name_translated = serializers.SerializerMethodField()
@staticmethod
def get_name_translated(obj):
return get_translated_value(obj.name)
class ProductEstablishmentDocumentSerializer(serializers.Serializer): class ProductEstablishmentDocumentSerializer(serializers.Serializer):
"""Related to Product Establishment ES document serializer.""" """Related to Product Establishment ES document serializer."""
@ -199,16 +215,12 @@ class ProductDocumentSerializer(DocumentSerializer):
"""Product document serializer""" """Product document serializer"""
tags = TagsDocumentSerializer(many=True) tags = TagsDocumentSerializer(many=True)
subtypes = ProductSubtypeDocumentSerializer(many=True) subtypes = ProductSubtypeDocumentSerializer(many=True, allow_null=True)
wine_region = WineRegionDocumentSerializer(allow_null=True) wine_region = WineRegionDocumentSerializer(allow_null=True)
wine_colors = WineColorDocumentSerializer(many=True) wine_colors = WineColorDocumentSerializer(many=True)
product_type = serializers.SerializerMethodField() product_type = ProductTypeDocumentSerializer(allow_null=True)
establishment_detail = ProductEstablishmentDocumentSerializer(source='establishment', allow_null=True) establishment_detail = ProductEstablishmentDocumentSerializer(source='establishment', allow_null=True)
@staticmethod
def get_product_type(obj):
return get_translated_value(obj.product_type.name if obj.product_type else {})
class Meta: class Meta:
"""Meta class.""" """Meta class."""

View File

@ -91,8 +91,6 @@ class EstablishmentDocumentViewSet(BaseDocumentViewSet):
'boost': 4}, 'boost': 4},
'transliterated_name': {'fuzziness': 'auto:2,5', 'transliterated_name': {'fuzziness': 'auto:2,5',
'boost': 3}, 'boost': 3},
'index_name': {'fuzziness': 'auto:2,5',
'boost': 2},
'description': {'fuzziness': 'auto:2,5'}, 'description': {'fuzziness': 'auto:2,5'},
} }
translated_search_fields = ( translated_search_fields = (
@ -199,7 +197,7 @@ class ProductDocumentViewSet(BaseDocumentViewSet):
"""Product document ViewSet.""" """Product document ViewSet."""
document = ProductDocument document = ProductDocument
lookup_field = 'slug' # lookup_field = 'slug'
pagination_class = ProjectMobilePagination pagination_class = ProjectMobilePagination
permission_classes = (permissions.AllowAny,) permission_classes = (permissions.AllowAny,)
serializer_class = serializers.ProductDocumentSerializer serializer_class = serializers.ProductDocumentSerializer
@ -212,19 +210,22 @@ class ProductDocumentViewSet(BaseDocumentViewSet):
filter_backends = [ filter_backends = [
FilteringFilterBackend, FilteringFilterBackend,
filters.CustomSearchFilterBackend, filters.CustomSearchFilterBackend,
GeoSpatialFilteringFilterBackend, # GeoSpatialFilteringFilterBackend,
DefaultOrderingFilterBackend, # DefaultOrderingFilterBackend,
] ]
search_fields = { search_fields = {
'name': {'fuzziness': 'auto:2,5', 'name': {'fuzziness': 'auto:2,5',
'boost': 4}, 'boost': 8},
'name_ru': {'fuzziness': 'auto:2,5',
'boost': 6},
'name_fr': {'fuzziness': 'auto:2,5',
'boost': 7},
'transliterated_name': {'fuzziness': 'auto:2,5', 'transliterated_name': {'fuzziness': 'auto:2,5',
'boost': 3}, 'boost': 3},
'index_name': {'fuzziness': 'auto:2,5',
'boost': 2},
'description': {'fuzziness': 'auto:2,5'}, 'description': {'fuzziness': 'auto:2,5'},
} }
translated_search_fields = ( translated_search_fields = (
'description', 'description',
) )
@ -248,7 +249,7 @@ class ProductDocumentViewSet(BaseDocumentViewSet):
'for_establishment': { 'for_establishment': {
'field': 'establishment.slug', 'field': 'establishment.slug',
}, },
'type': { 'product_type': {
'field': 'product_type.index_name', 'field': 'product_type.index_name',
}, },
'subtype': { 'subtype': {
@ -259,5 +260,5 @@ class ProductDocumentViewSet(BaseDocumentViewSet):
] ]
} }
} }
geo_spatial_filter_fields = { # geo_spatial_filter_fields = {
} # }

View File

@ -31,13 +31,18 @@ class TagCategoryFilterSet(TagsBaseFilterSet):
"""TagCategory filterset.""" """TagCategory filterset."""
establishment_type = filters.CharFilter(method='by_establishment_type') establishment_type = filters.CharFilter(method='by_establishment_type')
product_type = filters.CharFilter(method='by_product_type')
class Meta: class Meta:
"""Meta class.""" """Meta class."""
model = models.TagCategory model = models.TagCategory
fields = ('type', fields = ('type',
'establishment_type', ) 'establishment_type',
'product_type', )
def by_product_type(self, queryset, name, value):
return queryset.by_product_type(value)
# todo: filter by establishment type # todo: filter by establishment type
def by_establishment_type(self, queryset, name, value): def by_establishment_type(self, queryset, name, value):

View File

@ -101,6 +101,10 @@ class TagCategoryQuerySet(models.QuerySet):
"""Filter by establishment type index name.""" """Filter by establishment type index name."""
return self.filter(establishment_types__index_name=index_name) return self.filter(establishment_types__index_name=index_name)
def by_product_type(self, index_name):
"""Filter by product type index name."""
return self.filter(product_types__index_name=index_name)
def with_tags(self, switcher=True): def with_tags(self, switcher=True):
"""Filter by existing tags.""" """Filter by existing tags."""
return self.exclude(tags__isnull=switcher) return self.exclude(tags__isnull=switcher)

View File

@ -37,6 +37,21 @@ class TagBackOfficeSerializer(TagBaseSerializer):
'category' 'category'
) )
class TagCategoryProductSerializer(serializers.ModelSerializer):
"""SHORT Serializer for TagCategory"""
label_translated = TranslatedField()
class Meta:
"""Meta class."""
model = models.TagCategory
fields = (
'id',
'label_translated',
'index_name',
)
class TagCategoryBaseSerializer(serializers.ModelSerializer): class TagCategoryBaseSerializer(serializers.ModelSerializer):
"""Serializer for model TagCategory.""" """Serializer for model TagCategory."""

View File

@ -1,3 +1,4 @@
from django.db import IntegrityError
from rest_framework import serializers from rest_framework import serializers
from account.models import User from account.models import User
@ -41,10 +42,10 @@ class NewsletterSubscriberSerializer(serializers.Serializer):
id = serializers.IntegerField() id = serializers.IntegerField()
email_address__email = serializers.CharField() email_address__email = serializers.CharField()
email_address__account_id = serializers.IntegerField(allow_null=True) email_address__account_id = serializers.IntegerField(allow_null=True)
email_address__ip = serializers.CharField(allow_null=True) email_address__ip = serializers.CharField(allow_null=True, allow_blank=True)
email_address__country_code = serializers.CharField(allow_null=True) email_address__country_code = serializers.CharField(allow_null=True, allow_blank=True)
email_address__locale = serializers.CharField(allow_null=True) email_address__locale = serializers.CharField(allow_null=True, allow_blank=True)
created_at = serializers.DateTimeField(format='%m-%d-%Y %H:%M:%S') updated_at = serializers.DateTimeField(format='%m-%d-%Y %H:%M:%S')
def validate(self, data): def validate(self, data):
data.update({ data.update({
@ -53,18 +54,28 @@ class NewsletterSubscriberSerializer(serializers.Serializer):
'ip_address': data.pop('email_address__ip'), 'ip_address': data.pop('email_address__ip'),
'country_code': data.pop('email_address__country_code'), 'country_code': data.pop('email_address__country_code'),
'locale': data.pop('email_address__locale'), 'locale': data.pop('email_address__locale'),
'created': data.pop('created_at'), 'created': data.pop('updated_at'),
'user_id': self.get_user(data), 'user_id': self.get_user(data),
}) })
data.pop('email_address__account_id') data.pop('email_address__account_id')
return data return data
# def create(self, validated_data): def create(self, validated_data):
# obj, _ = Review.objects.update_or_create( try:
# old_id=validated_data['old_id'], obj = Subscriber.objects.get(email=validated_data['email'])
# defaults=validated_data, except Subscriber.DoesNotExist:
# ) obj = Subscriber.objects.create(**validated_data)
# return obj else:
current_data = obj.created
if validated_data['created'] > current_data:
obj.ip_address = validated_data['ip_address']
obj.locale = validated_data['locale']
obj.country_code = validated_data['country_code']
obj.old_id = validated_data['old_id']
obj.created = validated_data['created']
obj.user_id = validated_data['user_id']
obj.save()
return obj
@staticmethod @staticmethod
def get_user(data): def get_user(data):
@ -73,6 +84,6 @@ class NewsletterSubscriberSerializer(serializers.Serializer):
return None return None
user = User.objects.filter(old_id=data['email_address__account_id']).first() user = User.objects.filter(old_id=data['email_address__account_id']).first()
if not user: if user:
raise ValueError(f"User account not found with old_id {data['email_address__account_id']}") return user.id
return user.id return None