gault-millau/apps/transfer/serializers/advertisement.py
2019-11-16 01:08:31 +03:00

90 lines
2.8 KiB
Python

from rest_framework import serializers
from main.models import SiteSettings
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):
id = serializers.IntegerField()
href = serializers.CharField()
site_id = serializers.PrimaryKeyRelatedField(
queryset=Sites.objects.all())
class Meta:
"""Meta class."""
model = Advertisement
fields = [
'id',
'href',
'site_id',
]
def validate(self, data):
data.update({
'old_id': data.pop('id'),
'url': data.pop('href'),
'site_settings': self.get_site_settings(data.pop('site_id')),
})
return data
def create(self, validated_data):
site = validated_data.pop('site_settings')
url = validated_data.get('url')
obj, _ = self.Meta.model.objects.get_or_create(url=url, defaults=validated_data)
if site and site not in obj.sites.all():
obj.sites.add(site)
return obj
def get_site_settings(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()
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:
self.Meta.model.objects.get_or_create(source=Page.MOBILE, **validated_data)
self.Meta.model.objects.get_or_create(source=Page.WEB, **validated_data)