From 1946bddad24b8d8af7b151b7cc1a20afa9eb6dbf Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 31 Oct 2019 17:55:19 +0300 Subject: [PATCH 1/3] start carousel --- .../migrations/0024_auto_20191031_1439.py | 48 +++++++++++++++++++ apps/main/models.py | 8 ++++ apps/main/transfer.py | 7 +-- apps/main/transfer_data.py | 19 ++++++++ apps/transfer/management/commands/transfer.py | 3 +- apps/transfer/models.py | 22 +++++++++ apps/transfer/serializers/carousel.py | 26 ++++++++++ 7 files changed, 129 insertions(+), 4 deletions(-) create mode 100644 apps/main/migrations/0024_auto_20191031_1439.py create mode 100644 apps/main/transfer_data.py create mode 100644 apps/transfer/serializers/carousel.py diff --git a/apps/main/migrations/0024_auto_20191031_1439.py b/apps/main/migrations/0024_auto_20191031_1439.py new file mode 100644 index 00000000..304c83fe --- /dev/null +++ b/apps/main/migrations/0024_auto_20191031_1439.py @@ -0,0 +1,48 @@ +# Generated by Django 2.2.4 on 2019-10-31 14:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0023_merge_20191028_0725'), + ] + + operations = [ + migrations.AddField( + model_name='carousel', + name='active', + field=models.BooleanField(default=False, verbose_name='old active'), + ), + migrations.AddField( + model_name='carousel', + name='attachment_suffix_url', + field=models.TextField(blank=True, default=None, null=True, verbose_name='old attachment_suffix_url'), + ), + migrations.AddField( + model_name='carousel', + name='description', + field=models.CharField(blank=True, default=None, max_length=255, null=True, verbose_name='old description'), + ), + migrations.AddField( + model_name='carousel', + name='link', + field=models.CharField(blank=True, default=None, max_length=255, null=True, verbose_name='old link'), + ), + migrations.AddField( + model_name='carousel', + name='link_title', + field=models.CharField(blank=True, default=None, max_length=255, null=True, verbose_name='old link_title'), + ), + migrations.AddField( + model_name='carousel', + name='old_id', + field=models.PositiveIntegerField(blank=True, default=None, null=True, verbose_name='old id'), + ), + migrations.AddField( + model_name='carousel', + name='title', + field=models.CharField(blank=True, default=None, max_length=255, null=True, verbose_name='old title'), + ), + ] diff --git a/apps/main/models.py b/apps/main/models.py index 6af4e4d8..98e12289 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -285,6 +285,14 @@ class Carousel(models.Model): object_id = models.PositiveIntegerField() content_object = generic.GenericForeignKey('content_type', 'object_id') + old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None) + title = models.CharField(_('old title'), max_length=255, blank=True, null=True, default=None) + link = models.CharField(_('old link'), max_length=255, blank=True, null=True, default=None) + attachment_suffix_url = models.TextField(_('old attachment_suffix_url'), blank=True, null=True, default=None) + description = models.CharField(_('old description'), max_length=255, blank=True, null=True, default=None) + link_title = models.CharField(_('old link_title'), max_length=255, blank=True, null=True, default=None) + active = models.BooleanField(_('old active'), default=False) + objects = CarouselQuerySet.as_manager() class Meta: diff --git a/apps/main/transfer.py b/apps/main/transfer.py index 5d9caafe..52bde4d9 100644 --- a/apps/main/transfer.py +++ b/apps/main/transfer.py @@ -71,7 +71,8 @@ card = { "facebook_page_url": "facebook_page_url", "instagram_page_url": "instagram_page_url", "contact_email": "contact_email", - "config": ("config", "django.db.models.JSONField") #TODO в качесте ключа использовать country_code_2 из legacy - ? + "config": ("config", "django.db.models.JSONField") + # TODO в качесте ключа использовать country_code_2 из legacy - ? }, # "relations": { # # Как работать c отношение OneToOneField @@ -133,7 +134,7 @@ card = { "vintage_year": "year", } }, - #TODO вопрос с content_type + # TODO вопрос с content_type "relations": { "AwardTypes": [( ("award_type", None), @@ -143,4 +144,4 @@ card = { } } -used_apps = ("locations", ) \ No newline at end of file +used_apps = ("locations",) diff --git a/apps/main/transfer_data.py b/apps/main/transfer_data.py new file mode 100644 index 00000000..a532fb3d --- /dev/null +++ b/apps/main/transfer_data.py @@ -0,0 +1,19 @@ +from pprint import pprint + +from transfer.models import CarouselElements +from transfer.serializers.carousel import CarouselSerializer + + +def transfer_carousel(): + queryset = CarouselElements.objects.all() + + serialized_data = CarouselSerializer(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 = { + 'whirligig': [transfer_carousel] +} diff --git a/apps/transfer/management/commands/transfer.py b/apps/transfer/management/commands/transfer.py index f3abbfab..8d627616 100644 --- a/apps/transfer/management/commands/transfer.py +++ b/apps/transfer/management/commands/transfer.py @@ -21,7 +21,8 @@ class Command(BaseCommand): 'overlook', 'tmp', 'menu', - 'location_establishment' + 'location_establishment', + 'whirligig', ] def handle(self, *args, **options): diff --git a/apps/transfer/models.py b/apps/transfer/models.py index ccda8cd6..d81479a7 100644 --- a/apps/transfer/models.py +++ b/apps/transfer/models.py @@ -938,3 +938,25 @@ class KeyValueMetadatumKeyValueMetadatumEstablishments(MigrateMixin): # class Meta: # managed = False # db_table = 'wine_types' + +class CarouselElements(MigrateMixin): + using = 'legacy' + + title = models.CharField(max_length=255, blank=True, null=True) + link = models.CharField(max_length=255, blank=True, null=True) + home_page_id = models.IntegerField(blank=True, null=True) + created_at = models.DateTimeField() + updated_at = models.DateTimeField() + 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) + attachment_suffix_url = models.TextField(blank=True, null=True) + geometries = models.CharField(max_length=1024, blank=True, null=True) + active = models.IntegerField(blank=True, null=True) + description = models.CharField(max_length=255, blank=True, null=True) + link_title = models.CharField(max_length=255, blank=True, null=True) + + class Meta: + managed = False + db_table = 'carousel_elements' diff --git a/apps/transfer/serializers/carousel.py b/apps/transfer/serializers/carousel.py new file mode 100644 index 00000000..dbc3a139 --- /dev/null +++ b/apps/transfer/serializers/carousel.py @@ -0,0 +1,26 @@ +from rest_framework import serializers + +from main.models import Carousel + + +class CarouselSerializer(serializers.Serializer): + # id = serializers.IntegerField() + # tag_cat_id = serializers.IntegerField() + # news_type_id = serializers.IntegerField() + # news_title = serializers.CharField() + # title = serializers.CharField() + # summary = serializers.CharField(allow_null=True, allow_blank=True) + # body = serializers.CharField(allow_null=True) + # created_at = serializers.DateTimeField(format='%m-%d-%Y %H:%M:%S') + # slug = serializers.CharField() + # state = serializers.CharField() + # template = serializers.CharField() + # country_code = serializers.CharField(allow_null=True) + # locale = serializers.CharField() + # image = serializers.CharField() + # tags = serializers.CharField(allow_null=True) + + def create(self, validated_data): + payload = {} + obj = Carousel.objects.create(**payload) + return obj From 3c88d4f1f57366d6d767b10aa0a3893d7fae8fa0 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 31 Oct 2019 18:31:15 +0300 Subject: [PATCH 2/3] carousel serializer --- .../main/migrations/0025_carousel_is_parse.py | 18 ++++++++ apps/main/models.py | 1 + apps/main/transfer_data.py | 2 +- apps/transfer/serializers/carousel.py | 44 ++++++++++++------- 4 files changed, 47 insertions(+), 18 deletions(-) create mode 100644 apps/main/migrations/0025_carousel_is_parse.py diff --git a/apps/main/migrations/0025_carousel_is_parse.py b/apps/main/migrations/0025_carousel_is_parse.py new file mode 100644 index 00000000..81ede657 --- /dev/null +++ b/apps/main/migrations/0025_carousel_is_parse.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.4 on 2019-10-31 15:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0024_auto_20191031_1439'), + ] + + operations = [ + migrations.AddField( + model_name='carousel', + name='is_parse', + field=models.BooleanField(default=False, verbose_name='is parse'), + ), + ] diff --git a/apps/main/models.py b/apps/main/models.py index 7af1282e..b02e3142 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -293,6 +293,7 @@ class Carousel(models.Model): description = models.CharField(_('old description'), max_length=255, blank=True, null=True, default=None) link_title = models.CharField(_('old link_title'), max_length=255, blank=True, null=True, default=None) active = models.BooleanField(_('old active'), default=False) + is_parse = models.BooleanField(_('is parse'), default=False) objects = CarouselQuerySet.as_manager() diff --git a/apps/main/transfer_data.py b/apps/main/transfer_data.py index a532fb3d..efb7938d 100644 --- a/apps/main/transfer_data.py +++ b/apps/main/transfer_data.py @@ -11,7 +11,7 @@ def transfer_carousel(): if serialized_data.is_valid(): serialized_data.save() else: - pprint(f'News serializer errors: {serialized_data.errors}') + pprint(f'Carousel serializer errors: {serialized_data.errors}') data_types = { diff --git a/apps/transfer/serializers/carousel.py b/apps/transfer/serializers/carousel.py index dbc3a139..a2a3d21a 100644 --- a/apps/transfer/serializers/carousel.py +++ b/apps/transfer/serializers/carousel.py @@ -4,23 +4,33 @@ from main.models import Carousel class CarouselSerializer(serializers.Serializer): - # id = serializers.IntegerField() - # tag_cat_id = serializers.IntegerField() - # news_type_id = serializers.IntegerField() - # news_title = serializers.CharField() - # title = serializers.CharField() - # summary = serializers.CharField(allow_null=True, allow_blank=True) - # body = serializers.CharField(allow_null=True) - # created_at = serializers.DateTimeField(format='%m-%d-%Y %H:%M:%S') - # slug = serializers.CharField() - # state = serializers.CharField() - # template = serializers.CharField() - # country_code = serializers.CharField(allow_null=True) - # locale = serializers.CharField() - # image = serializers.CharField() - # tags = serializers.CharField(allow_null=True) + id = serializers.IntegerField() + title = serializers.CharField(allow_null=True) + link = serializers.CharField(allow_null=True) + link_title = serializers.CharField(allow_null=True) + description = serializers.CharField(allow_null=True) + attachment_suffix_url = serializers.CharField(allow_null=True) + active = serializers.IntegerField() def create(self, validated_data): - payload = {} - obj = Carousel.objects.create(**payload) + validated_data.update({ + 'active': bool(int(validated_data['active'])), + 'content_type': self.get_content_type(validated_data), + 'object_id': self.get_object_id(validated_data), + 'content_object': self.get_content_object(validated_data), + 'is_parse': False, + }) + obj = Carousel.objects.create(**validated_data) return obj + + @staticmethod + def get_content_type(data): + return None + + @staticmethod + def get_object_id(data): + return None + + @staticmethod + def get_content_object(data): + return None From 68182e837cf0a5550b8e36f42343346aba18182c Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 1 Nov 2019 08:41:56 +0300 Subject: [PATCH 3/3] carousel fin --- .../migrations/0026_auto_20191101_0500.py | 24 +++++++++ apps/main/models.py | 5 +- apps/transfer/serializers/carousel.py | 51 ++++++++++++++----- 3 files changed, 63 insertions(+), 17 deletions(-) create mode 100644 apps/main/migrations/0026_auto_20191101_0500.py diff --git a/apps/main/migrations/0026_auto_20191101_0500.py b/apps/main/migrations/0026_auto_20191101_0500.py new file mode 100644 index 00000000..55ecaad0 --- /dev/null +++ b/apps/main/migrations/0026_auto_20191101_0500.py @@ -0,0 +1,24 @@ +# Generated by Django 2.2.4 on 2019-11-01 05:00 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0025_carousel_is_parse'), + ] + + operations = [ + migrations.AlterField( + model_name='carousel', + name='content_type', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType'), + ), + migrations.AlterField( + model_name='carousel', + name='object_id', + field=models.PositiveIntegerField(blank=True, default=None, null=True), + ), + ] diff --git a/apps/main/models.py b/apps/main/models.py index b02e3142..7dee5cf0 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -130,7 +130,6 @@ class SiteSettingsQuerySet(models.QuerySet): class SiteSettings(ProjectBaseMixin): - subdomain = models.CharField(max_length=255, db_index=True, unique=True, verbose_name=_('Subdomain')) country = models.OneToOneField(Country, on_delete=models.PROTECT, @@ -282,8 +281,8 @@ class CarouselQuerySet(models.QuerySet): class Carousel(models.Model): """Carousel model.""" - content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) - object_id = models.PositiveIntegerField() + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, blank=True, null=True, default=None) + object_id = models.PositiveIntegerField(blank=True, null=True, default=None) content_object = generic.GenericForeignKey('content_type', 'object_id') old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None) diff --git a/apps/transfer/serializers/carousel.py b/apps/transfer/serializers/carousel.py index a2a3d21a..3f1e8ecb 100644 --- a/apps/transfer/serializers/carousel.py +++ b/apps/transfer/serializers/carousel.py @@ -1,36 +1,59 @@ +from django.contrib.contenttypes.models import ContentType from rest_framework import serializers +from establishment.models import Establishment from main.models import Carousel +from news.models import News + + +def get_obj_data(model, slug): + try: + obj = model.objects.get(slug=slug) + except model.DoesNotExist: + return None, None + else: + content_type = ContentType.objects.get_for_model(obj) + return obj.id, content_type.id class CarouselSerializer(serializers.Serializer): id = serializers.IntegerField() - title = serializers.CharField(allow_null=True) + title = serializers.CharField(allow_null=True, allow_blank=True) link = serializers.CharField(allow_null=True) - link_title = serializers.CharField(allow_null=True) - description = serializers.CharField(allow_null=True) + link_title = serializers.CharField(allow_null=True, allow_blank=True) + description = serializers.CharField(allow_null=True, allow_blank=True) attachment_suffix_url = serializers.CharField(allow_null=True) active = serializers.IntegerField() def create(self, validated_data): + object_id, content_type_id = self.get_content_type(validated_data) validated_data.update({ 'active': bool(int(validated_data['active'])), - 'content_type': self.get_content_type(validated_data), - 'object_id': self.get_object_id(validated_data), - 'content_object': self.get_content_object(validated_data), - 'is_parse': False, + 'content_type_id': content_type_id, + 'object_id': object_id, + 'is_parse': bool(object_id), }) obj = Carousel.objects.create(**validated_data) return obj @staticmethod def get_content_type(data): - return None + link = data['link'] + if not link: + return None - @staticmethod - def get_object_id(data): - return None + obj_data = None, None + site = 'gaultmillau.com' + if site in link: + data = link.split('/') - @staticmethod - def get_content_object(data): - return None + try: + _type = data[3] + except IndexError: + pass + else: + if _type in ('news', 'pages'): + obj_data = get_obj_data(News, data[4]) + elif _type == 'restaurant': + obj_data = get_obj_data(Establishment, data[4]) + return obj_data