fixed product related tags

This commit is contained in:
Anatoly 2019-11-14 12:38:15 +03:00
parent cf04f55bd3
commit 688bc851bb
10 changed files with 86 additions and 70 deletions

View File

@ -0,0 +1,23 @@
# Generated by Django 2.2.7 on 2019-11-14 08:09
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('tag', '0014_tag_old_id_meta_product'),
('location', '0024_wineregion_tag_categories'),
]
operations = [
migrations.RemoveField(
model_name='wineregion',
name='tag_categories',
),
migrations.AddField(
model_name='wineregion',
name='tags',
field=models.ManyToManyField(blank=True, help_text='attribute from legacy db', related_name='wine_regions', to='tag.Tag'),
),
]

View File

@ -173,9 +173,9 @@ class WineRegion(models.Model, TranslatedFieldsMixin):
description = TJSONField(blank=True, null=True, default=None,
verbose_name=_('description'),
help_text='{"en-GB":"some text"}')
tag_categories = models.ManyToManyField('tag.TagCategory', blank=True,
related_name='wine_regions',
help_text='attribute from legacy db')
tags = models.ManyToManyField('tag.Tag', blank=True,
related_name='wine_regions',
help_text='attribute from legacy db')
objects = WineRegionQuerySet.as_manager()

View File

@ -1,17 +1,18 @@
from django.core.management.base import BaseCommand
from transfer.models import Assemblages
from transfer.serializers.product import AssemblageTagSerializer
from transfer.models import Cepages
from transfer.serializers.tag import CepageTagSerializer
class Command(BaseCommand):
help = 'Add assemblage tag to product'
help = 'Add cepage tags'
def handle(self, *args, **kwarg):
errors = []
legacy_products = Assemblages.objects.filter(product_id__isnull=False)
serialized_data = AssemblageTagSerializer(
data=list(legacy_products.values()),
queryset = Cepages.objects.all()
serialized_data = CepageTagSerializer(
data=list(queryset.values()),
many=True)
if serialized_data.is_valid():
serialized_data.save()

View File

@ -1,17 +1,17 @@
from django.core.management.base import BaseCommand
from transfer.models import CepageRegions
from transfer.serializers.location import CepageWineRegionsSerializer
from transfer.serializers.location import CepageWineRegionSerializer
class Command(BaseCommand):
help = 'Add cepage tag category to wine region'
help = 'Add cepage tag to wine region'
def handle(self, *args, **kwarg):
errors = []
legacy_products = CepageRegions.objects.exclude(cepage_id__isnull=True) \
.exclude(wine_region_id__isnull=True)
serialized_data = CepageWineRegionsSerializer(
serialized_data = CepageWineRegionSerializer(
data=list(legacy_products.values()),
many=True)
if serialized_data.is_valid():

View File

@ -0,0 +1,18 @@
from django.core.management.base import BaseCommand
from location.models import WineRegion
from transfer.models import CepageRegions
class Command(BaseCommand):
help = 'Cleared wine region tag categories (cleared M2M relation with tag categories)'
def handle(self, *args, **kwarg):
cepage_wine_regions = CepageRegions.objects.exclude(cepage_id__isnull=True) \
.exclude(wine_region_id__isnull=True)\
.distinct() \
.values_list('wine_region_id', flat=True)
wine_regions = WineRegion.objects.filter(id__in=tuple(cepage_wine_regions))
for region in wine_regions:
region.tags.clear()
self.stdout.write(self.style.WARNING(f'Cleared wine region tag categories'))

View File

@ -349,7 +349,10 @@ class WineVillage(TransferSerializerMixin):
return attrs
class CepageWineRegionsSerializer(TransferSerializerMixin):
class CepageWineRegionSerializer(TransferSerializerMixin):
CATEGORY_LABEL = 'Cepage'
CATEGORY_INDEX_NAME = slugify(CATEGORY_LABEL)
cepage_id = serializers.PrimaryKeyRelatedField(
queryset=Cepages.objects.all())
@ -363,15 +366,9 @@ class CepageWineRegionsSerializer(TransferSerializerMixin):
def create(self, validated_data):
obj = self.get_wine_region(validated_data['wine_region_id'])
tag_category = self.get_tag_category(validated_data['cepage_id'])
cepage = validated_data.get('cepage_id')
tag = self.get_tag(cepage.name, self.CATEGORY_INDEX_NAME)
if obj and tag_category not in obj.tag_categories.all():
obj.tag_categories.add(tag_category)
if obj and tag not in obj.tags.all():
obj.tags.add(tag)
return obj
def get_tag_category(self, tag_category):
if isinstance(tag_category, Cepages):
tag_category = tag_category.name
qs = TagCategory.objects.filter(index_name=slugify(tag_category))
if qs.exists():
return qs.first()

View File

@ -569,49 +569,3 @@ class ProductNoteSerializer(TransferSerializerMixin):
qs = models.Product.objects.filter(old_id=old_id)
if qs.exists():
return qs.first()
class AssemblageTagSerializer(TransferSerializerMixin):
percent = serializers.FloatField()
cepage_id = serializers.PrimaryKeyRelatedField(
queryset=transfer_models.Cepages.objects.all())
product_id = serializers.IntegerField()
class Meta(ProductSerializer.Meta):
fields = (
'percent',
'cepage_id', # tag category
'product_id',
)
def validate(self, attrs):
tag_category = attrs.pop('cepage_id')
tag = str(attrs.pop('percent'))
attrs['product'] = self.get_product(attrs.pop('product_id'))
attrs['tag'] = self.get_tag(tag, self.get_tag_category(tag_category))
return attrs
def create(self, validated_data):
obj = validated_data.pop('product', None)
tag = validated_data.pop('tag', None)
if obj and tag:
if tag not in obj.tags.all():
obj.tags.add(tag)
return obj
def get_tag(self, tag, tag_category):
if tag and tag_category:
qs = tag_models.Tag.objects.filter(category=tag_category,
value=tag)
if qs.exists():
return qs.first()
def get_tag_category(self, tag_category):
if isinstance(tag_category, transfer_models.Cepages):
tag_category = tag_category.name
qs = tag_models.TagCategory.objects.filter(index_name=slugify(tag_category))
if qs.exists():
return qs.first()

View File

@ -29,7 +29,7 @@ class AssemblageTagSerializer(TransferSerializerMixin):
value = self.get_tag_value(cepage, percent)
attrs['label'] = {settings.FALLBACK_LOCALE: value}
attrs['value'] = slugify(cepage.name)
attrs['value'] = slugify(value)
attrs['category'] = self.tag_category
return attrs
@ -42,3 +42,26 @@ class AssemblageTagSerializer(TransferSerializerMixin):
def get_tag_value(self, cepage, percent):
if cepage and percent:
return f'{cepage.name} - {percent}%'
class CepageTagSerializer(TransferSerializerMixin):
CATEGORY_LABEL = 'Cepage'
CATEGORY_INDEX_NAME = slugify(CATEGORY_LABEL)
name = serializers.CharField()
class Meta:
model = Tag
fields = (
'name',
)
def validate(self, attrs):
name = attrs.pop('name')
attrs['label'] = {settings.FALLBACK_LOCALE: name}
attrs['value'] = slugify(name)
attrs['category'] = self.tag_category
return attrs