From 4b4dc27a49b807f7ea143bb82a7d889ae4422a75 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Fri, 15 Nov 2019 15:59:02 +0300 Subject: [PATCH 1/3] added method to transfer advertisement --- apps/advertisement/models.py | 2 +- apps/advertisement/transfer_data.py | 8 +++-- apps/transfer/models.py | 2 +- apps/transfer/serializers/advertisement.py | 41 ++++++++++++++++++---- 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/apps/advertisement/models.py b/apps/advertisement/models.py index 574aff56..18be4516 100644 --- a/apps/advertisement/models.py +++ b/apps/advertisement/models.py @@ -50,7 +50,7 @@ class Advertisement(ProjectBaseMixin): class Meta: verbose_name = _('Advertisement') - verbose_name_plural = _('Advertisement') + verbose_name_plural = _('Advertisements') def __str__(self): return str(self.url) diff --git a/apps/advertisement/transfer_data.py b/apps/advertisement/transfer_data.py index 64e715ce..b6e5ace5 100644 --- a/apps/advertisement/transfer_data.py +++ b/apps/advertisement/transfer_data.py @@ -5,14 +5,18 @@ from transfer.serializers.advertisement import AdvertisementSerializer def transfer_advertisement(): - queryset = Ads.objects.filter(href__isnull=False).values_list('id', 'href', 'attachment_suffix_url') + errors = [] + queryset = Ads.objects.exclude(href__isnull=True) \ + .exclude(attachment_suffix_url__isnull=True) \ + .exclude(site_id__isnull=True) serialized_data = AdvertisementSerializer(data=list(queryset.values()), many=True) if serialized_data.is_valid(): serialized_data.save() else: - pprint(f"News serializer errors: {serialized_data.errors}") + for d in serialized_data.errors: errors.append(d) if d else None + pprint(f"transfer_product errors: {errors}") data_types = { diff --git a/apps/transfer/models.py b/apps/transfer/models.py index 25fdb527..d2e13d89 100644 --- a/apps/transfer/models.py +++ b/apps/transfer/models.py @@ -839,7 +839,7 @@ class PageMetadata(MigrateMixin): class Ads(MigrateMixin): using = 'legacy' - site_id = models.IntegerField(blank=True, null=True) + site = models.ForeignKey('Sites', on_delete=models.DO_NOTHING) href = models.CharField(max_length=255, blank=True, null=True) start_at = models.DateTimeField(blank=True, null=True) expire_at = models.DateTimeField(blank=True, null=True) diff --git a/apps/transfer/serializers/advertisement.py b/apps/transfer/serializers/advertisement.py index a25ee51e..443e23e2 100644 --- a/apps/transfer/serializers/advertisement.py +++ b/apps/transfer/serializers/advertisement.py @@ -1,22 +1,51 @@ from rest_framework import serializers +from main.models import SiteSettings +from transfer.models import Sites from advertisement.models import Advertisement -class AdvertisementSerializer(serializers.Serializer): +class AdvertisementSerializer(serializers.ModelSerializer): + id = serializers.IntegerField() href = serializers.CharField() - attachment_suffix_url = serializers.CharField(allow_null=True) + site_id = serializers.PrimaryKeyRelatedField( + queryset=Sites.objects.all()) + start_at = serializers.DateTimeField(allow_null=True) + expire_at = serializers.DateTimeField(allow_null=True) + + class Meta: + """Meta class.""" + model = Advertisement + fields = [ + 'id', + 'href', + 'site_id', + 'start_at', + 'expire_at', + ] def validate(self, data): data.update({ 'old_id': data.pop('id'), 'url': data.pop('href'), - 'image_url': data.pop('attachment_suffix_url'), - 'width': 300, - 'height': 250, + 'site': self.get_site(data.pop('site_id')), + 'start': data.pop('start_at', None), + 'end': data.pop('expire_at', None), }) return data def create(self, validated_data): - return Advertisement.objects.create(**validated_data) \ No newline at end of file + site = validated_data.pop('site') + obj, _ = self.Meta.model.objects.get_or_create(validated_data) + + import ipdb;ipdb.set_trace() + if site and site not in obj.sites.all(): + obj.sites.add(site) + return obj + + def get_site(self, subdomain): + subdomain = subdomain.country_code_2 if isinstance(subdomain, Sites) else subdomain + qs = SiteSettings.objects.filter(subdomain=subdomain) + if qs.exists(): + return qs.first() From c293ae4b9cbe8386c05b8752f1b1e73959e7b7bc Mon Sep 17 00:00:00 2001 From: Anatoly Date: Fri, 15 Nov 2019 21:04:37 +0300 Subject: [PATCH 2/3] remove debug tracer --- apps/transfer/serializers/advertisement.py | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/transfer/serializers/advertisement.py b/apps/transfer/serializers/advertisement.py index 443e23e2..958e21a9 100644 --- a/apps/transfer/serializers/advertisement.py +++ b/apps/transfer/serializers/advertisement.py @@ -39,7 +39,6 @@ class AdvertisementSerializer(serializers.ModelSerializer): site = validated_data.pop('site') obj, _ = self.Meta.model.objects.get_or_create(validated_data) - import ipdb;ipdb.set_trace() if site and site not in obj.sites.all(): obj.sites.add(site) return obj From 31399cea838f9ae21c702c5973998241ae08c2e8 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Sat, 16 Nov 2019 00:18:07 +0300 Subject: [PATCH 3/3] added advertisement image import --- apps/advertisement/transfer_data.py | 22 ++++++++++- apps/transfer/serializers/advertisement.py | 45 +++++++++++++++++++++- 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/apps/advertisement/transfer_data.py b/apps/advertisement/transfer_data.py index b6e5ace5..f1a5ca38 100644 --- a/apps/advertisement/transfer_data.py +++ b/apps/advertisement/transfer_data.py @@ -1,7 +1,7 @@ from pprint import pprint from transfer.models import Ads -from transfer.serializers.advertisement import AdvertisementSerializer +from transfer.serializers.advertisement import AdvertisementSerializer, AdvertisementImageSerializer def transfer_advertisement(): @@ -19,6 +19,24 @@ def transfer_advertisement(): pprint(f"transfer_product errors: {errors}") +def transfer_page(): + errors = [] + queryset = Ads.objects.exclude(href__isnull=True) \ + .exclude(attachment_suffix_url__isnull=True) \ + .exclude(site_id__isnull=True) + + serialized_data = AdvertisementImageSerializer(data=list(queryset.values()), many=True) + + if serialized_data.is_valid(): + serialized_data.save() + else: + for d in serialized_data.errors: errors.append(d) if d else None + pprint(f"transfer_page errors: {errors}") + + data_types = { - "commercial": [transfer_advertisement] + "commercial": [ + transfer_advertisement, + transfer_page + ] } diff --git a/apps/transfer/serializers/advertisement.py b/apps/transfer/serializers/advertisement.py index 958e21a9..c7bd50f8 100644 --- a/apps/transfer/serializers/advertisement.py +++ b/apps/transfer/serializers/advertisement.py @@ -1,8 +1,11 @@ from rest_framework import serializers from main.models import SiteSettings -from transfer.models import Sites +from transfer.models import Sites, Ads from advertisement.models import Advertisement +from main.models import Page +import requests +from rest_framework import status class AdvertisementSerializer(serializers.ModelSerializer): @@ -48,3 +51,43 @@ class AdvertisementSerializer(serializers.ModelSerializer): qs = SiteSettings.objects.filter(subdomain=subdomain) if qs.exists(): return qs.first() + + +class AdvertisementImageSerializer(AdvertisementSerializer): + + attachment_suffix_url = serializers.CharField() + + class Meta(AdvertisementSerializer.Meta): + model = Page + fields = [ + 'id', + 'attachment_suffix_url', + ] + + def validate(self, data): + data.update({ + 'image_url': self.get_absolute_image_url(data.pop('attachment_suffix_url')), + 'advertisement': self.get_advertisement(data.pop('id')), + }) + return data + + def get_advertisement(self, old_id): + qs = Advertisement.objects.filter(old_id=old_id) + if qs.exists(): + return qs.first() + + def get_absolute_image_url(self, relative_path): + if relative_path: + absolute_image_url = f'https://1dc3f33f6d-3.optimicdn.com/gaultmillau.com/' \ + f'{relative_path}' + response = requests.head(absolute_image_url) + if response.status_code == status.HTTP_200_OK: + return absolute_image_url + + def create(self, validated_data): + advertisement = validated_data.get('advertisement') + image_url = validated_data.get('image_url') + + if advertisement and image_url: + Page.objects.get_or_create(advertisement=advertisement, image_url=image_url, source=Page.MOBILE) + Page.objects.get_or_create(advertisement=advertisement, image_url=image_url, source=Page.WEB) \ No newline at end of file