diff --git a/apps/product/management/commands/add_product_tag.py b/apps/product/management/commands/add_product_tag.py index 9e63d213..a0f56b71 100644 --- a/apps/product/management/commands/add_product_tag.py +++ b/apps/product/management/commands/add_product_tag.py @@ -1,10 +1,11 @@ from django.core.management.base import BaseCommand from django.db import connections -from social_django.models import UserSocialAuth from establishment.management.commands.add_position import namedtuplefetchall -from account.models import User from tag.models import Tag, TagCategory +from product.models import Product from tqdm import tqdm +from django.db.models.functions import Lower + class Command(BaseCommand): help = '''Add add product tags networks from old db to new db. @@ -13,26 +14,89 @@ class Command(BaseCommand): def category_sql(self): with connections['legacy'].cursor() as cursor: cursor.execute(''' - select DISTINCT - id, - key_name as category, - value_type as value_type - from product_key_value_metadata + select + DISTINCT + trim(CONVERT(v.key_name USING utf8)) as category, + trim(CONVERT(v.value_type USING utf8)) as value_type + FROM product_metadata m + JOIN product_key_value_metadata v on v.id = m.product_key_value_metadatum_id + ''') return namedtuplefetchall(cursor) def add_category_tag(self): objects = [] - for c in tqdm(self.category_sql()): - cat = TagCategory.objects.filter(index_name=c.category, - value_type=c.value_type, - label={'en-GB':c.category}) - if not cat.exists(): - objects.append(TagCategory(index_name=c.category, - value_type=c.value_type, - label={'en-GB': c.category})) + for c in tqdm(self.category_sql(), desc='Add category tags'): + categories = TagCategory.objects.filter(index_name=c.category, + value_type=c.value_type + ) + if not categories.exists(): + objects.append( + TagCategory(label={"en-GB": c.category}, + value_type=c.value_type, + index_name=c.category + ) + ) TagCategory.objects.bulk_create(objects) - self.stdout.write(self.style.WARNING(f'Created tag category.')) + self.stdout.write(self.style.WARNING(f'Add or get tag category objects.')) + + def tag_sql(self): + with connections['legacy'].cursor() as cursor: + cursor.execute(''' + select + DISTINCT + trim(CONVERT(m.value USING utf8)) as tag_value, + trim(CONVERT(v.key_name USING utf8)) as tag_category + FROM product_metadata m + join product_key_value_metadata v on v.id = m.product_key_value_metadatum_id + ''') + return namedtuplefetchall(cursor) + + def add_tag(self): + objects = [] + for t in tqdm(self.tag_sql(), desc='Add tags'): + category = TagCategory.objects.get(index_name=t.tag_category) + + tag = Tag.objects.filter(label={"en-GB": t.tag_value}, + category=category, + value=t.tag_value + ) + + if not tag.exists(): + objects.append(Tag(label={"en-GB": t.tag_value}, + category=category, + value=t.tag_value + )) + Tag.objects.bulk_create(objects) + self.stdout.write(self.style.WARNING(f'Add or get tag objects.')) + + def product_sql(self): + with connections['legacy'].cursor() as cursor: + cursor.execute(''' + select + DISTINCT + m.product_id, + lower(trim(CONVERT(m.value USING utf8))) as tag_value, + trim(CONVERT(v.key_name USING utf8)) as tag_category + FROM product_metadata m + JOIN product_key_value_metadata v on v.id = m.product_key_value_metadatum_id + ''') + return namedtuplefetchall(cursor) + + def add_product_tag(self): + objects = [] + for t in tqdm(self.product_sql(), desc='Add product tag'): + category = TagCategory.objects.get(index_name=t.tag_category) + tag = Tag.objects.annotate(lower_value=Lower('value')) + tag.filter(lower_value=t.tag_value, category=category) + products = Product.objects.filter(old_id=t.product_id) + if products.exists(): + products.tags.add(tag) + products.save() + + self.stdout.write(self.style.WARNING(f'Add or get tag objects.')) def handle(self, *args, **kwargs): - self.add_category_tag() \ No newline at end of file + self.add_category_tag() + self.add_tag() + self.add_product_tag() \ No newline at end of file diff --git a/apps/tag/migrations/0011_auto_20191112_1203.py b/apps/tag/migrations/0011_auto_20191112_1203.py new file mode 100644 index 00000000..498eccda --- /dev/null +++ b/apps/tag/migrations/0011_auto_20191112_1203.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.7 on 2019-11-12 12:03 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tag', '0010_auto_20191112_0104'), + ] + + operations = [ + migrations.AddField( + model_name='tagcategory', + name='old_id', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='tagcategory', + name='value_type', + field=models.CharField(choices=[('string', 'string'), ('list', 'list'), ('integer', 'integer'), ('float', 'float')], default='list', max_length=255, verbose_name='value type'), + ), + ] diff --git a/apps/tag/models.py b/apps/tag/models.py index d68479e1..4262b446 100644 --- a/apps/tag/models.py +++ b/apps/tag/models.py @@ -36,6 +36,7 @@ class Tag(TranslatedFieldsMixin, models.Model): verbose_name=_('Category')) chosen_tag_settings = models.ManyToManyField(Country, through='ChosenTagSettings') priority = models.PositiveIntegerField(null=True, default=0) + old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None) objects = TagQuerySet.as_manager() diff --git a/project/settings/local.py b/project/settings/local.py index 62298faa..6745d272 100644 --- a/project/settings/local.py +++ b/project/settings/local.py @@ -36,7 +36,7 @@ THUMBNAIL_DEBUG = True # ADDED TRANSFER APP -INSTALLED_APPS.append('transfer.apps.TransferConfig') +# INSTALLED_APPS.append('transfer.apps.TransferConfig') # DATABASES