From 58be2491a55151db539df2252940683af17bfee3 Mon Sep 17 00:00:00 2001 From: Dmitriy Kuzmenko Date: Wed, 30 Oct 2019 18:47:13 +0300 Subject: [PATCH] create command for establishment tags --- .../migrations/0032_auto_20191030_1149.py | 18 ++++++ apps/news/models.py | 2 +- apps/tag/management/__init__.py | 0 apps/tag/management/commands/__init__.py | 0 apps/tag/management/commands/add_tags.py | 62 +++++++++++++++++++ .../tag/migrations/0006_auto_20191030_1151.py | 23 +++++++ .../tag/migrations/0007_auto_20191030_1514.py | 18 ++++++ apps/tag/models.py | 17 ++++- apps/transfer/models.py | 54 ++++++++++++++++ apps/transfer/serializers/news.py | 11 +++- 10 files changed, 202 insertions(+), 3 deletions(-) create mode 100644 apps/news/migrations/0032_auto_20191030_1149.py create mode 100644 apps/tag/management/__init__.py create mode 100644 apps/tag/management/commands/__init__.py create mode 100644 apps/tag/management/commands/add_tags.py create mode 100644 apps/tag/migrations/0006_auto_20191030_1151.py create mode 100644 apps/tag/migrations/0007_auto_20191030_1514.py diff --git a/apps/news/migrations/0032_auto_20191030_1149.py b/apps/news/migrations/0032_auto_20191030_1149.py new file mode 100644 index 00000000..75408f46 --- /dev/null +++ b/apps/news/migrations/0032_auto_20191030_1149.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.4 on 2019-10-30 11:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('news', '0031_merge_20191029_0858'), + ] + + operations = [ + migrations.AlterField( + model_name='news', + name='old_id', + field=models.PositiveIntegerField(blank=True, default=None, null=True, verbose_name='old id'), + ), + ] diff --git a/apps/news/models.py b/apps/news/models.py index f0caa13c..6508215d 100644 --- a/apps/news/models.py +++ b/apps/news/models.py @@ -126,7 +126,7 @@ class News(BaseAttributes, TranslatedFieldsMixin): (PUBLISHED_EXCLUSIVE, _('Published exclusive')), ) - old_id = models.PositiveIntegerField(_('odl id'), blank=True, null=True, default=None) + old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None) news_type = models.ForeignKey(NewsType, on_delete=models.PROTECT, verbose_name=_('news type')) title = TJSONField(blank=True, null=True, default=None, diff --git a/apps/tag/management/__init__.py b/apps/tag/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/tag/management/commands/__init__.py b/apps/tag/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/tag/management/commands/add_tags.py b/apps/tag/management/commands/add_tags.py new file mode 100644 index 00000000..5fc721b7 --- /dev/null +++ b/apps/tag/management/commands/add_tags.py @@ -0,0 +1,62 @@ +from django.core.management.base import BaseCommand + +from establishment.models import Establishment, EstablishmentType +from transfer import models as legacy +from tag.models import Tag, TagCategory + + +class Command(BaseCommand): + help = 'Add tags values from old db to new db' + + def handle(self, *args, **kwargs): + + categories = legacy.KeyValueMetadata.objects.all() + existing_establishment = Establishment.objects.filter(old_id__isnull=False) + for category in categories: + ESTABLISHMENT = 1 + SHOP = 2 + RESTAURANT = 3 + WINEYARD = 4 + + MAPPER = { + RESTAURANT: EstablishmentType.RESTAURANT, + WINEYARD: EstablishmentType.PRODUCER, + } + + mapper_values_meta = legacy.KeyValueMetadatumKeyValueMetadatumEstablishments.objects.all() + for key, value in MAPPER.items(): + values_meta_id_list = mapper_values_meta.filter( + key_value_metadatum_establishment_id=key + ).values_list('key_value_metadatum_id') + + est_type, _ = EstablishmentType.objects.get_or_create(index_name=value) + + key_value_metadata = legacy.KeyValueMetadata.objects.filter(id__in=values_meta_id_list) + + # create TagCategory + for key_value in key_value_metadata: + tag_category, created = TagCategory.objects.get_or_create( + index_name=key_value.key_name, + ) + + if created: + tag_category.label = {'en-GB': key_value.key_name}, + tag_category.value_type = key_value.value_type + tag_category.save() + est_type.tag_categories.add( + tag_category + ) + + # create Tag + for tag in key_value.metadata_set.filter( + establishment__id__in=list(existing_establishment.values_list('old_id', flat=True))): + + new_tag, _ = Tag.objects.get_or_create( + label={'en-GB': tag.value}, + value=tag.value, + category=tag_category, + ) + est = existing_establishment.get(old_id=tag.establishment_id) + est.tags.add(new_tag) + est.save() + diff --git a/apps/tag/migrations/0006_auto_20191030_1151.py b/apps/tag/migrations/0006_auto_20191030_1151.py new file mode 100644 index 00000000..b11a4c20 --- /dev/null +++ b/apps/tag/migrations/0006_auto_20191030_1151.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.4 on 2019-10-30 11:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tag', '0005_tagcategory_name_indexing'), + ] + + operations = [ + migrations.AddField( + model_name='tag', + name='value', + field=models.CharField(blank=True, default=None, max_length=255, null=True, unique=True, verbose_name='indexing name'), + ), + migrations.AddField( + model_name='tagcategory', + name='value_type', + field=models.CharField(choices=[('string', 'string'), ('list', 'list'), ('integer', 'integer')], default='list', max_length=255, verbose_name='value type'), + ), + ] diff --git a/apps/tag/migrations/0007_auto_20191030_1514.py b/apps/tag/migrations/0007_auto_20191030_1514.py new file mode 100644 index 00000000..1bcb3deb --- /dev/null +++ b/apps/tag/migrations/0007_auto_20191030_1514.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.4 on 2019-10-30 15:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tag', '0006_auto_20191030_1151'), + ] + + operations = [ + migrations.AlterField( + model_name='tag', + name='value', + field=models.CharField(blank=True, default=None, max_length=255, null=True, verbose_name='indexing name'), + ), + ] diff --git a/apps/tag/models.py b/apps/tag/models.py index 26079849..e3967f0f 100644 --- a/apps/tag/models.py +++ b/apps/tag/models.py @@ -19,6 +19,8 @@ class Tag(TranslatedFieldsMixin, models.Model): label = TJSONField(blank=True, null=True, default=None, verbose_name=_('label'), help_text='{"en-GB":"some text"}') + value = models.CharField(_('indexing name'), max_length=255, blank=True, + null=True, default=None) category = models.ForeignKey('TagCategory', on_delete=models.CASCADE, null=True, related_name='tags', verbose_name=_('Category')) @@ -72,6 +74,16 @@ class TagCategoryQuerySet(models.QuerySet): class TagCategory(TranslatedFieldsMixin, models.Model): """Tag base category model.""" + STRING = 'string' + LIST = 'list' + INTEGER = 'integer' + + VALUE_TYPE_CHOICES = ( + (STRING, _('string')), + (LIST, _('list')), + (INTEGER, _('integer')), + ) + label = TJSONField(blank=True, null=True, default=None, verbose_name=_('label'), help_text='{"en-GB":"some text"}') @@ -80,7 +92,10 @@ class TagCategory(TranslatedFieldsMixin, models.Model): default=None) public = models.BooleanField(default=False) index_name = models.CharField(max_length=255, blank=True, null=True, - verbose_name=_('indexing name'), unique=True) + verbose_name=_('indexing name'), unique=True) + + value_type = models.CharField(_('value type'), max_length=255, + choices=VALUE_TYPE_CHOICES, default=LIST, ) objects = TagCategoryQuerySet.as_manager() diff --git a/apps/transfer/models.py b/apps/transfer/models.py index fbcea0d8..99dfd0ac 100644 --- a/apps/transfer/models.py +++ b/apps/transfer/models.py @@ -841,3 +841,57 @@ class Ads(MigrateMixin): class Meta: managed = False db_table = 'ads' + + +class KeyValueMetadata(MigrateMixin): + using = 'legacy' + + key_name = models.CharField(max_length=255, blank=True, null=True) + value_type = models.CharField(max_length=255, blank=True, null=True) + value_list = models.TextField(blank=True, null=True) + created_at = models.DateTimeField() + updated_at = models.DateTimeField() + public = models.IntegerField(blank=True, null=True) + site_id = models.IntegerField(blank=True, null=True) + + class Meta: + managed = False + db_table = 'key_value_metadata' + + +class Metadata(MigrateMixin): + using = 'legacy' + + key = models.CharField(max_length=255, blank=True, null=True) + value = models.CharField(max_length=255, blank=True, null=True) + establishment = models.ForeignKey('transfer.Establishments', models.DO_NOTHING, blank=True, null=True) + created_at = models.DateTimeField() + updated_at = models.DateTimeField() + key_value_metadatum = models.ForeignKey('transfer.KeyValueMetadata', models.DO_NOTHING, blank=True, null=True) + + class Meta: + managed = False + db_table = 'metadata' + + +class KeyValueMetadatumEstablishments(MigrateMixin): + using = 'legacy' + + name = models.CharField(max_length=255, blank=True, null=True) + created_at = models.DateTimeField() + updated_at = models.DateTimeField() + + class Meta: + managed = False + db_table = 'key_value_metadatum_establishments' + + +class KeyValueMetadatumKeyValueMetadatumEstablishments(MigrateMixin): + using = 'legacy' + + key_value_metadatum_id = models.IntegerField(blank=True, null=True) + key_value_metadatum_establishment_id = models.IntegerField(blank=True, null=True) + + class Meta: + managed = False + db_table = 'key_value_metadatum_key_value_metadatum_establishments' diff --git a/apps/transfer/serializers/news.py b/apps/transfer/serializers/news.py index 82853cad..6842f248 100644 --- a/apps/transfer/serializers/news.py +++ b/apps/transfer/serializers/news.py @@ -15,6 +15,7 @@ class NewsSerializer(serializers.ModelSerializer): state = serializers.CharField() country_code = serializers.CharField(allow_null=True) created_at = serializers.DateTimeField(source='start', format='%m-%d-%Y %H:%M:%S') + summary = serializers.CharField(allow_null=True, allow_blank=True) class Meta: model = News @@ -29,6 +30,7 @@ class NewsSerializer(serializers.ModelSerializer): 'news_type', 'locale', 'country_code', + 'summary' ) def validate(self, data): @@ -38,7 +40,7 @@ class NewsSerializer(serializers.ModelSerializer): 'template': self.get_template(data), 'title': self.get_title(data), 'description': self.get_description(data), - 'subtitle': self.get_description(data), + 'subtitle': self.get_subtitle(data), 'country': self.get_country(data), }) data.pop('country_code') @@ -82,3 +84,10 @@ class NewsSerializer(serializers.ModelSerializer): if data['body']: content = parse_legacy_news_content(data['body']) return {data['locale']: content} + + @staticmethod + def get_subtitle(data): + if 'summary' in data: + content = data.pop('summary') + if content: + return {data['locale']: content}