diff --git a/apps/location/migrations/0025_auto_20191114_0809.py b/apps/location/migrations/0025_auto_20191114_0809.py new file mode 100644 index 00000000..cecff5a2 --- /dev/null +++ b/apps/location/migrations/0025_auto_20191114_0809.py @@ -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'), + ), + ] diff --git a/apps/location/models.py b/apps/location/models.py index 76468d55..648651a6 100644 --- a/apps/location/models.py +++ b/apps/location/models.py @@ -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() diff --git a/apps/product/management/commands/add_assemblage_tag.py b/apps/tag/management/commands/add_cepage_tag.py similarity index 56% rename from apps/product/management/commands/add_assemblage_tag.py rename to apps/tag/management/commands/add_cepage_tag.py index faf07c39..b1d333b7 100644 --- a/apps/product/management/commands/add_assemblage_tag.py +++ b/apps/tag/management/commands/add_cepage_tag.py @@ -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() diff --git a/apps/location/management/commands/add_cepage_tag_category.py b/apps/tag/management/commands/add_cepage_tag_to_wine_region.py similarity index 79% rename from apps/location/management/commands/add_cepage_tag_category.py rename to apps/tag/management/commands/add_cepage_tag_to_wine_region.py index c8a8c08c..d4f98dfd 100644 --- a/apps/location/management/commands/add_cepage_tag_category.py +++ b/apps/tag/management/commands/add_cepage_tag_to_wine_region.py @@ -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(): diff --git a/apps/product/management/commands/fix_wine_color_tag.py b/apps/tag/management/commands/add_wine_color_tag.py similarity index 100% rename from apps/product/management/commands/fix_wine_color_tag.py rename to apps/tag/management/commands/add_wine_color_tag.py diff --git a/apps/product/management/commands/fix_cepage_tag_categories.py b/apps/tag/management/commands/fix_cepage_tag_categories.py similarity index 100% rename from apps/product/management/commands/fix_cepage_tag_categories.py rename to apps/tag/management/commands/fix_cepage_tag_categories.py diff --git a/apps/tag/management/commands/revert_wine_region_cepage_tags.py b/apps/tag/management/commands/revert_wine_region_cepage_tags.py new file mode 100644 index 00000000..3d157955 --- /dev/null +++ b/apps/tag/management/commands/revert_wine_region_cepage_tags.py @@ -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')) diff --git a/apps/transfer/serializers/location.py b/apps/transfer/serializers/location.py index d8dca98c..4a21a63a 100644 --- a/apps/transfer/serializers/location.py +++ b/apps/transfer/serializers/location.py @@ -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() diff --git a/apps/transfer/serializers/product.py b/apps/transfer/serializers/product.py index dc5b088f..0a8d958e 100644 --- a/apps/transfer/serializers/product.py +++ b/apps/transfer/serializers/product.py @@ -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() diff --git a/apps/transfer/serializers/tag.py b/apps/transfer/serializers/tag.py index 56bae02f..c47ffafc 100644 --- a/apps/transfer/serializers/tag.py +++ b/apps/transfer/serializers/tag.py @@ -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