fixed product related tags
This commit is contained in:
parent
cf04f55bd3
commit
688bc851bb
23
apps/location/migrations/0025_auto_20191114_0809.py
Normal file
23
apps/location/migrations/0025_auto_20191114_0809.py
Normal 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'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -173,9 +173,9 @@ class WineRegion(models.Model, TranslatedFieldsMixin):
|
||||||
description = TJSONField(blank=True, null=True, default=None,
|
description = TJSONField(blank=True, null=True, default=None,
|
||||||
verbose_name=_('description'),
|
verbose_name=_('description'),
|
||||||
help_text='{"en-GB":"some text"}')
|
help_text='{"en-GB":"some text"}')
|
||||||
tag_categories = models.ManyToManyField('tag.TagCategory', blank=True,
|
tags = models.ManyToManyField('tag.Tag', blank=True,
|
||||||
related_name='wine_regions',
|
related_name='wine_regions',
|
||||||
help_text='attribute from legacy db')
|
help_text='attribute from legacy db')
|
||||||
|
|
||||||
objects = WineRegionQuerySet.as_manager()
|
objects = WineRegionQuerySet.as_manager()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,18 @@
|
||||||
from django.core.management.base import BaseCommand
|
from django.core.management.base import BaseCommand
|
||||||
|
|
||||||
from transfer.models import Assemblages
|
from transfer.models import Cepages
|
||||||
from transfer.serializers.product import AssemblageTagSerializer
|
from transfer.serializers.tag import CepageTagSerializer
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
help = 'Add assemblage tag to product'
|
help = 'Add cepage tags'
|
||||||
|
|
||||||
def handle(self, *args, **kwarg):
|
def handle(self, *args, **kwarg):
|
||||||
|
|
||||||
errors = []
|
errors = []
|
||||||
legacy_products = Assemblages.objects.filter(product_id__isnull=False)
|
queryset = Cepages.objects.all()
|
||||||
serialized_data = AssemblageTagSerializer(
|
serialized_data = CepageTagSerializer(
|
||||||
data=list(legacy_products.values()),
|
data=list(queryset.values()),
|
||||||
many=True)
|
many=True)
|
||||||
if serialized_data.is_valid():
|
if serialized_data.is_valid():
|
||||||
serialized_data.save()
|
serialized_data.save()
|
||||||
|
|
@ -1,17 +1,17 @@
|
||||||
from django.core.management.base import BaseCommand
|
from django.core.management.base import BaseCommand
|
||||||
|
|
||||||
from transfer.models import CepageRegions
|
from transfer.models import CepageRegions
|
||||||
from transfer.serializers.location import CepageWineRegionsSerializer
|
from transfer.serializers.location import CepageWineRegionSerializer
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
help = 'Add cepage tag category to wine region'
|
help = 'Add cepage tag to wine region'
|
||||||
|
|
||||||
def handle(self, *args, **kwarg):
|
def handle(self, *args, **kwarg):
|
||||||
errors = []
|
errors = []
|
||||||
legacy_products = CepageRegions.objects.exclude(cepage_id__isnull=True) \
|
legacy_products = CepageRegions.objects.exclude(cepage_id__isnull=True) \
|
||||||
.exclude(wine_region_id__isnull=True)
|
.exclude(wine_region_id__isnull=True)
|
||||||
serialized_data = CepageWineRegionsSerializer(
|
serialized_data = CepageWineRegionSerializer(
|
||||||
data=list(legacy_products.values()),
|
data=list(legacy_products.values()),
|
||||||
many=True)
|
many=True)
|
||||||
if serialized_data.is_valid():
|
if serialized_data.is_valid():
|
||||||
|
|
@ -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'))
|
||||||
|
|
@ -349,7 +349,10 @@ class WineVillage(TransferSerializerMixin):
|
||||||
return attrs
|
return attrs
|
||||||
|
|
||||||
|
|
||||||
class CepageWineRegionsSerializer(TransferSerializerMixin):
|
class CepageWineRegionSerializer(TransferSerializerMixin):
|
||||||
|
|
||||||
|
CATEGORY_LABEL = 'Cepage'
|
||||||
|
CATEGORY_INDEX_NAME = slugify(CATEGORY_LABEL)
|
||||||
|
|
||||||
cepage_id = serializers.PrimaryKeyRelatedField(
|
cepage_id = serializers.PrimaryKeyRelatedField(
|
||||||
queryset=Cepages.objects.all())
|
queryset=Cepages.objects.all())
|
||||||
|
|
@ -363,15 +366,9 @@ class CepageWineRegionsSerializer(TransferSerializerMixin):
|
||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
obj = self.get_wine_region(validated_data['wine_region_id'])
|
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():
|
if obj and tag not in obj.tags.all():
|
||||||
obj.tag_categories.add(tag_category)
|
obj.tags.add(tag)
|
||||||
return obj
|
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()
|
|
||||||
|
|
|
||||||
|
|
@ -569,49 +569,3 @@ class ProductNoteSerializer(TransferSerializerMixin):
|
||||||
qs = models.Product.objects.filter(old_id=old_id)
|
qs = models.Product.objects.filter(old_id=old_id)
|
||||||
if qs.exists():
|
if qs.exists():
|
||||||
return qs.first()
|
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()
|
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ class AssemblageTagSerializer(TransferSerializerMixin):
|
||||||
value = self.get_tag_value(cepage, percent)
|
value = self.get_tag_value(cepage, percent)
|
||||||
|
|
||||||
attrs['label'] = {settings.FALLBACK_LOCALE: value}
|
attrs['label'] = {settings.FALLBACK_LOCALE: value}
|
||||||
attrs['value'] = slugify(cepage.name)
|
attrs['value'] = slugify(value)
|
||||||
attrs['category'] = self.tag_category
|
attrs['category'] = self.tag_category
|
||||||
return attrs
|
return attrs
|
||||||
|
|
||||||
|
|
@ -42,3 +42,26 @@ class AssemblageTagSerializer(TransferSerializerMixin):
|
||||||
def get_tag_value(self, cepage, percent):
|
def get_tag_value(self, cepage, percent):
|
||||||
if cepage and percent:
|
if cepage and percent:
|
||||||
return f'{cepage.name} - {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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user