Add tag for product

This commit is contained in:
Виктор Гладких 2019-11-12 17:36:48 +03:00
parent 27bef66398
commit 13db34237b
4 changed files with 106 additions and 18 deletions

View File

@ -1,10 +1,11 @@
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from django.db import connections from django.db import connections
from social_django.models import UserSocialAuth
from establishment.management.commands.add_position import namedtuplefetchall from establishment.management.commands.add_position import namedtuplefetchall
from account.models import User
from tag.models import Tag, TagCategory from tag.models import Tag, TagCategory
from product.models import Product
from tqdm import tqdm from tqdm import tqdm
from django.db.models.functions import Lower
class Command(BaseCommand): class Command(BaseCommand):
help = '''Add add product tags networks from old db to new db. help = '''Add add product tags networks from old db to new db.
@ -13,26 +14,89 @@ class Command(BaseCommand):
def category_sql(self): def category_sql(self):
with connections['legacy'].cursor() as cursor: with connections['legacy'].cursor() as cursor:
cursor.execute(''' cursor.execute('''
select DISTINCT select
id, DISTINCT
key_name as category, trim(CONVERT(v.key_name USING utf8)) as category,
value_type as value_type trim(CONVERT(v.value_type USING utf8)) as value_type
from product_key_value_metadata FROM product_metadata m
JOIN product_key_value_metadata v on v.id = m.product_key_value_metadatum_id
''') ''')
return namedtuplefetchall(cursor) return namedtuplefetchall(cursor)
def add_category_tag(self): def add_category_tag(self):
objects = [] objects = []
for c in tqdm(self.category_sql()): for c in tqdm(self.category_sql(), desc='Add category tags'):
cat = TagCategory.objects.filter(index_name=c.category, categories = TagCategory.objects.filter(index_name=c.category,
value_type=c.value_type, value_type=c.value_type
label={'en-GB':c.category}) )
if not cat.exists(): if not categories.exists():
objects.append(TagCategory(index_name=c.category, objects.append(
value_type=c.value_type, TagCategory(label={"en-GB": c.category},
label={'en-GB': c.category})) value_type=c.value_type,
index_name=c.category
)
)
TagCategory.objects.bulk_create(objects) 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): def handle(self, *args, **kwargs):
self.add_category_tag() self.add_category_tag()
self.add_tag()
self.add_product_tag()

View File

@ -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'),
),
]

View File

@ -36,6 +36,7 @@ class Tag(TranslatedFieldsMixin, models.Model):
verbose_name=_('Category')) verbose_name=_('Category'))
chosen_tag_settings = models.ManyToManyField(Country, through='ChosenTagSettings') chosen_tag_settings = models.ManyToManyField(Country, through='ChosenTagSettings')
priority = models.PositiveIntegerField(null=True, default=0) priority = models.PositiveIntegerField(null=True, default=0)
old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None) old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None)
objects = TagQuerySet.as_manager() objects = TagQuerySet.as_manager()

View File

@ -36,7 +36,7 @@ THUMBNAIL_DEBUG = True
# ADDED TRANSFER APP # ADDED TRANSFER APP
INSTALLED_APPS.append('transfer.apps.TransferConfig') # INSTALLED_APPS.append('transfer.apps.TransferConfig')
# DATABASES # DATABASES