From 3ce7e186f7181156fb837b4267ba24644b3d3f87 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 24 Oct 2019 14:01:38 +0300 Subject: [PATCH 1/9] migrate from legacy news --- apps/news/transfer_data.py | 16 ++-- apps/transfer/models.py | 1 + apps/transfer/serializers/news.py | 143 +++++++++--------------------- apps/utils/legacy_parser.py | 12 +++ docker-compose.mysql.yml | 20 ++++- project/settings/base.py | 2 +- project/settings/development.py | 2 +- requirements/base.txt | 1 + 8 files changed, 87 insertions(+), 110 deletions(-) create mode 100644 apps/utils/legacy_parser.py diff --git a/apps/news/transfer_data.py b/apps/news/transfer_data.py index deee2fe5..9d13e40e 100644 --- a/apps/news/transfer_data.py +++ b/apps/news/transfer_data.py @@ -1,23 +1,23 @@ -from transfer.serializers.news import NewsSerializer -from transfer.models import PageTexts -from news.models import NewsType from django.db.models import Value, IntegerField, F -from pprint import pprint + +from news.models import NewsType +from transfer.models import PageTexts +from transfer.serializers.news import NewsSerializer def transfer_news(): news_type, _ = NewsType.objects.get_or_create(name="News") - queryset = PageTexts.objects.filter(page__type="News").annotate(news_type=Value(news_type.id, output_field=IntegerField()), - playlist=Value(1, output_field=IntegerField())) - queryset = queryset.annotate(attachment_file_name=F('page__attachment_file_name')) + queryset = PageTexts.objects.filter(page__type="News").annotate( + news_type=Value(news_type.id, output_field=IntegerField()), + ) queryset = queryset.annotate(template=F('page__template')) serialized_data = NewsSerializer(data=list(queryset.values()), many=True) if serialized_data.is_valid(): serialized_data.save() else: - pprint(f"News serializer errors: {serialized_data.errors}") + print(f"News serializer errors: {serialized_data.errors}") data_types = { diff --git a/apps/transfer/models.py b/apps/transfer/models.py index f469f698..f2a634bf 100644 --- a/apps/transfer/models.py +++ b/apps/transfer/models.py @@ -694,6 +694,7 @@ class ReviewTexts(MigrateMixin): managed = False db_table = 'review_texts' + class Comments(MigrateMixin): using = 'legacy' diff --git a/apps/transfer/serializers/news.py b/apps/transfer/serializers/news.py index 2d85bea1..6cddb8dc 100644 --- a/apps/transfer/serializers/news.py +++ b/apps/transfer/serializers/news.py @@ -1,123 +1,68 @@ from rest_framework import serializers + from news.models import News -from uuid import uuid4 -import datetime -from django.conf import settings +from utils.legacy_parser import parse_legacy_content class NewsSerializer(serializers.ModelSerializer): - # image_url = serializers.CharField() - # preview_image_url = serializers.CharField() - attachment_file_name = serializers.CharField(allow_null=True) - # body = serializers.CharField(allow_null=True, source="description") + locale = serializers.CharField() body = serializers.CharField(allow_null=True) title = serializers.CharField() template = serializers.CharField() state = serializers.CharField() - created_at = serializers.DateTimeField(source="start", format='%m-%d-%Y %H:%M:%S') + created_at = serializers.DateTimeField(source='start', format='%m-%d-%Y %H:%M:%S') class Meta: model = News fields = ( - "created_at", - "state", - "template", - # "image_url", - # "preview_image_url", - "attachment_file_name", - "title", - "body", - "slug", - "news_type", - "playlist" + 'created_at', + 'state', + 'template', + 'title', + 'body', + 'slug', + 'news_type', + 'locale', ) def validate(self, data): - data["state"] = self.get_state(data) - data["template"] = self.get_template(data) - data["title"] = self.get_title(data) - data["description"] = self.get_description(data) - data["image_url"] = self.get_image_url(data) - data["preview_image_url"] = self.get_preview_image_url(data) - data.pop("attachment_file_name") - data.pop("body") + data.update({ + 'state': self.get_state(data), + 'template': self.get_template(data), + 'title': self.get_title(data), + 'description': self.get_description(data), + }) + data.pop('body') + data.pop('locale') return data def create(self, validated_data): - # validated_data['state'] = self.get_state(validated_data) return News.objects.create(**validated_data) - def get_template(self, obj): - if obj["template"] == "main": - return News.MAIN - elif obj["template"] == "main.pdf.erb": - return News.MAIN_PDF_ERB - else: - return News.NEWSPAPER + @staticmethod + def get_template(data): + templates = { + 'main': News.MAIN, + 'main.pdf.erb': News.MAIN_PDF_ERB, + } + return templates.get(data['template'], News.MAIN) - # if obj.template == "main": - # return News.MAIN - # elif obj.template == "main.pdf.erb": - # return News.MAIN_PDF_ERB - # else: - # return News.NEWSPAPER + @staticmethod + def get_state(data): + states = { + 'new': News.PUBLISHED, + 'published': News.PUBLISHED, + 'hidden': News.HIDDEN, + } + return states.get(data['state'], News.WAITING) - def get_state(self, obj): - if obj["state"] == "published": - return News.PUBLISHED - elif obj["state"] == "hidden": - return News.HIDDEN - elif obj["state"] == "published_exclusive": - return News.PUBLISHED_EXCLUSIVE - else: - return News.WAITING + @staticmethod + def get_title(data): + return {data['locale']: data['title']} - # if obj.state == "published": - # return News.PUBLISHED - # elif obj.state == "hidden": - # return News.HIDDEN - # elif obj.state == "published_exclusive": - # return News.PUBLISHED_EXCLUSIVE - # else: - # return News.WAITING - - # django.db.utils.IntegrityError: "start" NOT NULL - # def get_start(self, obj): - # # return obj.created_at - # return datetime.datetime.now().isoformat() - - def get_title(self, obj): - tit = obj.get("title") - return {"en-GB": tit} - # return f'{"en-GB": {obj.title}}' - - def get_description(self, obj): - # return {"en-GB": {obj["body"]}} - desc = obj.get("body") - return {"en-GB": desc} - # if not hasattr(obj, "body"): - # return "" - # else: - # return obj.body - - def get_image_url(self, obj): - if not obj.get("attachment_file_name"): - return "" - - if len(obj.get("attachment_file_name"))>200: - return obj.get("attachment_file_name")[:200] - return obj.get("attachment_file_name") - # if not hasattr(obj, "attachment_file_name") or obj.attachment_file_name is None: - # return "" - # return obj.attachment_file_name - - def get_preview_image_url(self, obj): - if not obj.get("attachment_file_name"): - return "" - - if len(obj.get("attachment_file_name"))>200: - return obj.get("attachment_file_name")[:200] - return obj.get("attachment_file_name") - # if not hasattr(obj, "attachment_file_name") or obj.attachment_file_name is None: - # return "" - # return obj.attachment_file_name + @staticmethod + def get_description(data): + content = None + if data['body']: + content = parse_legacy_content(data['body']) + return {data['locale']: content} diff --git a/apps/utils/legacy_parser.py b/apps/utils/legacy_parser.py new file mode 100644 index 00000000..a0e526f2 --- /dev/null +++ b/apps/utils/legacy_parser.py @@ -0,0 +1,12 @@ +import yaml + + +def parse_legacy_content(legacy_content): + clear_str = '!ruby/hash:ActiveSupport::HashWithIndifferentAccess' + content_dict = yaml.safe_load(legacy_content.replace(clear_str, '')) + result = '' + try: + result = content_dict['news_content']['value'] + except IndexError: + pass + return result diff --git a/docker-compose.mysql.yml b/docker-compose.mysql.yml index ac4619dd..cabb3808 100644 --- a/docker-compose.mysql.yml +++ b/docker-compose.mysql.yml @@ -14,6 +14,8 @@ services: volumes: - .:/code - gm-mysql_db:/var/lib/mysql + networks: + - mysql_network # PostgreSQL database db: @@ -29,6 +31,8 @@ services: - "5436:5432" volumes: - gm-db:/var/lib/postgresql/data/ + networks: + - database_network elasticsearch: image: elasticsearch:7.3.1 @@ -42,6 +46,8 @@ services: - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - discovery.type=single-node - xpack.security.enabled=false + networks: + - elasticsearch_network # Redis redis: @@ -113,6 +119,10 @@ services: - gm-media:/media-data ports: - "8000:8000" + networks: + - database_network + - mysql_network + - elasticsearch_network volumes: gm-mysql_db: @@ -124,4 +134,12 @@ volumes: gm-media: name: gm-media - gm-esdata: \ No newline at end of file + gm-esdata: + +networks: + database_network: + driver: bridge + mysql_network: + driver: bridge + elasticsearch_network: + driver: bridge diff --git a/project/settings/base.py b/project/settings/base.py index f5cce87d..f2001779 100644 --- a/project/settings/base.py +++ b/project/settings/base.py @@ -160,7 +160,7 @@ DATABASES = { 'legacy': { 'ENGINE': 'django.db.backends.mysql', # 'HOST': '172.23.0.1', - 'HOST': '127.0.0.1', + 'HOST': 'mysql_db', 'PORT': 3306, 'NAME': 'dev', 'USER': 'dev', diff --git a/project/settings/development.py b/project/settings/development.py index 59691818..3e9968f4 100644 --- a/project/settings/development.py +++ b/project/settings/development.py @@ -19,7 +19,7 @@ DOMAIN_URI = 'gm.id-east.ru' # ELASTICSEARCH SETTINGS ELASTICSEARCH_DSL = { 'default': { - 'hosts': 'localhost:9200' + 'hosts': 'elasticsearch:9200' } } diff --git a/requirements/base.txt b/requirements/base.txt index a4349bea..3a45dedc 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -43,6 +43,7 @@ sorl-thumbnail==12.5.0 mysqlclient==1.4.4 +PyYAML==5.1.2 # temp solution redis==3.2.0 From 5826fb247586a8cbc07b851196035efa8a1d8571 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 24 Oct 2019 14:49:59 +0300 Subject: [PATCH 2/9] mysql to docker-compose fix exception --- apps/utils/legacy_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/utils/legacy_parser.py b/apps/utils/legacy_parser.py index a0e526f2..b69e2604 100644 --- a/apps/utils/legacy_parser.py +++ b/apps/utils/legacy_parser.py @@ -7,6 +7,6 @@ def parse_legacy_content(legacy_content): result = '' try: result = content_dict['news_content']['value'] - except IndexError: + except KeyError: pass return result From 6335abe1ea857693a290a8ef3fe9da0d04feb1aa Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 24 Oct 2019 15:24:31 +0300 Subject: [PATCH 3/9] states dict fix --- apps/transfer/serializers/news.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/transfer/serializers/news.py b/apps/transfer/serializers/news.py index 6cddb8dc..f47b4940 100644 --- a/apps/transfer/serializers/news.py +++ b/apps/transfer/serializers/news.py @@ -50,9 +50,11 @@ class NewsSerializer(serializers.ModelSerializer): @staticmethod def get_state(data): states = { - 'new': News.PUBLISHED, + 'new': News.WAITING, 'published': News.PUBLISHED, 'hidden': News.HIDDEN, + 'published_exclusive': News.PUBLISHED_EXCLUSIVE, + 'scheduled_exclusively': News.WAITING, } return states.get(data['state'], News.WAITING) From a667655c096409adce26e5e05a08027184cb4074 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 24 Oct 2019 15:32:47 +0300 Subject: [PATCH 4/9] pprint --- apps/news/transfer_data.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/news/transfer_data.py b/apps/news/transfer_data.py index 9d13e40e..d46c7613 100644 --- a/apps/news/transfer_data.py +++ b/apps/news/transfer_data.py @@ -1,3 +1,5 @@ +from pprint import pprint + from django.db.models import Value, IntegerField, F from news.models import NewsType @@ -17,7 +19,7 @@ def transfer_news(): if serialized_data.is_valid(): serialized_data.save() else: - print(f"News serializer errors: {serialized_data.errors}") + pprint(f"News serializer errors: {serialized_data.errors}") data_types = { From 449bf0f28ceaa9da7ed5fea9a9d9fadeb8bf6e58 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 24 Oct 2019 16:11:26 +0300 Subject: [PATCH 5/9] comment duplicate method --- apps/location/transfer_data.py | 36 +++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/apps/location/transfer_data.py b/apps/location/transfer_data.py index deee2fe5..4f279daf 100644 --- a/apps/location/transfer_data.py +++ b/apps/location/transfer_data.py @@ -5,21 +5,21 @@ from django.db.models import Value, IntegerField, F from pprint import pprint -def transfer_news(): - news_type, _ = NewsType.objects.get_or_create(name="News") - - queryset = PageTexts.objects.filter(page__type="News").annotate(news_type=Value(news_type.id, output_field=IntegerField()), - playlist=Value(1, output_field=IntegerField())) - queryset = queryset.annotate(attachment_file_name=F('page__attachment_file_name')) - queryset = queryset.annotate(template=F('page__template')) - - serialized_data = NewsSerializer(data=list(queryset.values()), many=True) - if serialized_data.is_valid(): - serialized_data.save() - else: - pprint(f"News serializer errors: {serialized_data.errors}") - - -data_types = { - "news": [transfer_news] -} +# def transfer_news(): +# news_type, _ = NewsType.objects.get_or_create(name="News") +# +# queryset = PageTexts.objects.filter(page__type="News").annotate(news_type=Value(news_type.id, output_field=IntegerField()), +# playlist=Value(1, output_field=IntegerField())) +# queryset = queryset.annotate(attachment_file_name=F('page__attachment_file_name')) +# queryset = queryset.annotate(template=F('page__template')) +# +# serialized_data = NewsSerializer(data=list(queryset.values()), many=True) +# if serialized_data.is_valid(): +# serialized_data.save() +# else: +# pprint(f"News serializer errors: {serialized_data.errors}") +# +# +# data_types = { +# "news": [transfer_news] +# } From 95811c74373514f10cd59daa9c0c4ef3fe874fda Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 25 Oct 2019 10:33:31 +0300 Subject: [PATCH 6/9] return to localhost --- project/settings/base.py | 4 ++-- project/settings/development.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/project/settings/base.py b/project/settings/base.py index 3d085978..752691ea 100644 --- a/project/settings/base.py +++ b/project/settings/base.py @@ -159,8 +159,8 @@ DATABASES = { }, 'legacy': { 'ENGINE': 'django.db.backends.mysql', - # 'HOST': '172.23.0.1', - 'HOST': 'mysql_db', + 'HOST': '172.23.0.1', + # 'HOST': 'mysql_db', 'PORT': 3306, 'NAME': 'dev', 'USER': 'dev', diff --git a/project/settings/development.py b/project/settings/development.py index 6871fbf9..73e0095d 100644 --- a/project/settings/development.py +++ b/project/settings/development.py @@ -19,7 +19,8 @@ DOMAIN_URI = 'gm.id-east.ru' # ELASTICSEARCH SETTINGS ELASTICSEARCH_DSL = { 'default': { - 'hosts': 'elasticsearch:9200' + 'hosts': 'localhost:9200' + # 'hosts': 'elasticsearch:9200' } } From d79946633e1b2ce13760329678fe56851bee145d Mon Sep 17 00:00:00 2001 From: michail Date: Fri, 25 Oct 2019 13:17:35 +0500 Subject: [PATCH 7/9] fix get_description for recipe.py --- apps/transfer/serializers/recipe.py | 19 ++++++++++++++----- project/settings/base.py | 3 ++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/apps/transfer/serializers/recipe.py b/apps/transfer/serializers/recipe.py index 890d2b42..3948bbdd 100644 --- a/apps/transfer/serializers/recipe.py +++ b/apps/transfer/serializers/recipe.py @@ -1,8 +1,10 @@ from rest_framework import serializers from recipe.models import Recipe +from utils.legacy_parser import parse_legacy_content class RecipeSerializer(serializers.ModelSerializer): + locale = serializers.CharField() body = serializers.CharField(allow_null=True) title = serializers.CharField() state = serializers.CharField() @@ -14,7 +16,8 @@ class RecipeSerializer(serializers.ModelSerializer): "body", "title", "state", - "created_at" + "created_at", + 'locale', ) def validate(self, data): @@ -22,6 +25,7 @@ class RecipeSerializer(serializers.ModelSerializer): data["title"] = self.get_title(data) data["description"] = self.get_description(data) data.pop("body") + data.pop("locale") return data def create(self, validated_data): @@ -38,9 +42,14 @@ class RecipeSerializer(serializers.ModelSerializer): return Recipe.WAITING def get_title(self, obj): - tit = obj.get("title") - return {"en-GB": tit} + # tit = obj.get("title") + # return {"en-GB": tit} + return {obj['locale']: obj['title']} def get_description(self, obj): - desc = obj.get("body") - return {"en-GB": desc} + # desc = obj.get("body") + # return {"en-GB": desc} + content = None + if obj['body']: + content = parse_legacy_content(obj['body']) + return {obj['locale']: content} diff --git a/project/settings/base.py b/project/settings/base.py index 752691ea..676a67d1 100644 --- a/project/settings/base.py +++ b/project/settings/base.py @@ -159,7 +159,8 @@ DATABASES = { }, 'legacy': { 'ENGINE': 'django.db.backends.mysql', - 'HOST': '172.23.0.1', + 'HOST': '172.17.0.1', + # 'HOST': '172.23.0.1', # 'HOST': 'mysql_db', 'PORT': 3306, 'NAME': 'dev', From 0f595ee40bc5a2e3807107ab0b813b1657863c2a Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 25 Oct 2019 12:07:02 +0300 Subject: [PATCH 8/9] merge migrations --- .../gallery/migrations/0004_merge_20191025_0906.py | 14 ++++++++++++++ apps/news/migrations/0029_merge_20191025_0906.py | 14 ++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 apps/gallery/migrations/0004_merge_20191025_0906.py create mode 100644 apps/news/migrations/0029_merge_20191025_0906.py diff --git a/apps/gallery/migrations/0004_merge_20191025_0906.py b/apps/gallery/migrations/0004_merge_20191025_0906.py new file mode 100644 index 00000000..4372fa95 --- /dev/null +++ b/apps/gallery/migrations/0004_merge_20191025_0906.py @@ -0,0 +1,14 @@ +# Generated by Django 2.2.4 on 2019-10-25 09:06 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('gallery', '0002_auto_20191023_1207'), + ('gallery', '0003_auto_20191003_1228'), + ] + + operations = [ + ] diff --git a/apps/news/migrations/0029_merge_20191025_0906.py b/apps/news/migrations/0029_merge_20191025_0906.py new file mode 100644 index 00000000..e5967a8d --- /dev/null +++ b/apps/news/migrations/0029_merge_20191025_0906.py @@ -0,0 +1,14 @@ +# Generated by Django 2.2.4 on 2019-10-25 09:06 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('news', '0028_auto_20191024_1649'), + ('news', '0021_auto_20191021_1120'), + ] + + operations = [ + ] From 76d6e22fb92852772fa1a96a3ccbcf134eccccd3 Mon Sep 17 00:00:00 2001 From: michail Date: Fri, 25 Oct 2019 15:42:54 +0500 Subject: [PATCH 9/9] added transfer for advertisement --- .../migrations/0004_auto_20191025_0903.py | 18 +++++++++ apps/advertisement/models.py | 2 +- apps/advertisement/transfer_data.py | 20 ++++++++++ apps/transfer/management/commands/transfer.py | 3 +- apps/transfer/models.py | 20 ++++++++++ apps/transfer/serializers/advertisement.py | 39 +++++++++++++++++++ 6 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 apps/advertisement/migrations/0004_auto_20191025_0903.py create mode 100644 apps/advertisement/transfer_data.py create mode 100644 apps/transfer/serializers/advertisement.py diff --git a/apps/advertisement/migrations/0004_auto_20191025_0903.py b/apps/advertisement/migrations/0004_auto_20191025_0903.py new file mode 100644 index 00000000..f633d67c --- /dev/null +++ b/apps/advertisement/migrations/0004_auto_20191025_0903.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.4 on 2019-10-25 09:03 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('advertisement', '0003_auto_20190919_1344'), + ] + + operations = [ + migrations.AlterField( + model_name='advertisement', + name='block_level', + field=models.CharField(blank=True, max_length=10, null=True, verbose_name='Block level'), + ), + ] diff --git a/apps/advertisement/models.py b/apps/advertisement/models.py index fdc25988..62b41428 100644 --- a/apps/advertisement/models.py +++ b/apps/advertisement/models.py @@ -15,7 +15,7 @@ class Advertisement(ImageMixin, ProjectBaseMixin, PlatformMixin): url = models.URLField(verbose_name=_('Ad URL')) width = models.PositiveIntegerField(verbose_name=_('Block width')) height = models.PositiveIntegerField(verbose_name=_('Block height')) - block_level = models.CharField(verbose_name=_('Block level'), max_length=10) + block_level = models.CharField(verbose_name=_('Block level'), max_length=10, blank=True, null=True) target_languages = models.ManyToManyField(Language) class Meta: diff --git a/apps/advertisement/transfer_data.py b/apps/advertisement/transfer_data.py new file mode 100644 index 00000000..3af16286 --- /dev/null +++ b/apps/advertisement/transfer_data.py @@ -0,0 +1,20 @@ +from pprint import pprint +from django.db.models import Value, IntegerField, F +from transfer.models import Ads +from transfer.serializers.advertisement import AdvertisementSerializer + + +def transfer_advertisement(): + queryset = Ads.objects.filter(href__isnull=False) + + 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}") + + +data_types = { + "commercial": [transfer_advertisement] +} \ No newline at end of file diff --git a/apps/transfer/management/commands/transfer.py b/apps/transfer/management/commands/transfer.py index d4a1c213..68383877 100644 --- a/apps/transfer/management/commands/transfer.py +++ b/apps/transfer/management/commands/transfer.py @@ -15,7 +15,8 @@ class Command(BaseCommand): 'subscriber', 'recipe', 'partner', - 'gallery' + 'gallery', + 'commercial' ] def handle(self, *args, **options): diff --git a/apps/transfer/models.py b/apps/transfer/models.py index f2a634bf..f6dd2dbc 100644 --- a/apps/transfer/models.py +++ b/apps/transfer/models.py @@ -788,3 +788,23 @@ class PageMetadata(MigrateMixin): class Meta: managed = False db_table = 'page_metadata' + + +class Ads(MigrateMixin): + using = 'legacy' + + site_id = models.IntegerField(blank=True, null=True) + 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) + attachment_file_name = models.CharField(max_length=255, blank=True, null=True) + attachment_content_type = models.CharField(max_length=255, blank=True, null=True) + attachment_file_size = models.IntegerField(blank=True, null=True) + attachment_updated_at = models.DateTimeField(blank=True, null=True) + geometries = models.CharField(max_length=1024, blank=True, null=True) + created_at = models.DateTimeField() + updated_at = models.DateTimeField() + + class Meta: + managed = False + db_table = 'ads' \ No newline at end of file diff --git a/apps/transfer/serializers/advertisement.py b/apps/transfer/serializers/advertisement.py new file mode 100644 index 00000000..2e3a488f --- /dev/null +++ b/apps/transfer/serializers/advertisement.py @@ -0,0 +1,39 @@ +from rest_framework import serializers +from advertisement.models import Advertisement +import yaml + + +class AdvertisementSerializer(serializers.ModelSerializer): + href = serializers.CharField() + geometries = serializers.CharField(max_length=1024) + + class Meta: + model = Advertisement + fields = ( + "href", + "geometries" + ) + + def validate(self, data): + data["url"] = data["href"] + data["width"] = self.get_width(data["geometries"]) + data["height"] = self.get_height(data["geometries"]) + data.pop("href") + data.pop("geometries") + return data + + def create(self, validated_data): + return Advertisement.objects.create(**validated_data) + + def get_width(self, data): + data = self.parse_geometries(data) + return int(float(data["width"])) + + def get_height(self, data): + data = self.parse_geometries(data) + return int(float(data["height"])) + + def parse_geometries(self, geo_str): + clear_str = "!ruby/object:Paperclip::Geometry" + content_dict = yaml.safe_load(geo_str.replace(clear_str, '')) + return content_dict[':original'] \ No newline at end of file