From b56829accc101d40cfd45162cb3dc0ae7317396d Mon Sep 17 00:00:00 2001 From: Anatoly Date: Wed, 13 Nov 2019 16:30:30 +0300 Subject: [PATCH] added command add_cepage_tag_category to link cepage tag category with wine region --- apps/location/management/__init__.py | 0 apps/location/management/commands/__init__.py | 0 .../commands/add_cepage_tag_category.py | 22 ++++++++++++++ .../0024_wineregion_tag_categories.py | 19 ++++++++++++ apps/location/models.py | 3 ++ apps/location/transfer_data.py | 8 ++--- apps/transfer/mixins.py | 6 ++++ apps/transfer/models.py | 11 +++++++ apps/transfer/serializers/location.py | 30 +++++++++++++++++-- 9 files changed, 93 insertions(+), 6 deletions(-) create mode 100644 apps/location/management/__init__.py create mode 100644 apps/location/management/commands/__init__.py create mode 100644 apps/location/management/commands/add_cepage_tag_category.py create mode 100644 apps/location/migrations/0024_wineregion_tag_categories.py diff --git a/apps/location/management/__init__.py b/apps/location/management/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/location/management/commands/__init__.py b/apps/location/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/location/management/commands/add_cepage_tag_category.py b/apps/location/management/commands/add_cepage_tag_category.py new file mode 100644 index 00000000..c8a8c08c --- /dev/null +++ b/apps/location/management/commands/add_cepage_tag_category.py @@ -0,0 +1,22 @@ +from django.core.management.base import BaseCommand + +from transfer.models import CepageRegions +from transfer.serializers.location import CepageWineRegionsSerializer + + +class Command(BaseCommand): + help = 'Add cepage tag category 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( + data=list(legacy_products.values()), + many=True) + if serialized_data.is_valid(): + serialized_data.save() + else: + for d in serialized_data.errors: errors.append(d) if d else None + + self.stdout.write(self.style.WARNING(f'Error count: {len(errors)}\nErrors: {errors}')) diff --git a/apps/location/migrations/0024_wineregion_tag_categories.py b/apps/location/migrations/0024_wineregion_tag_categories.py new file mode 100644 index 00000000..63c456fe --- /dev/null +++ b/apps/location/migrations/0024_wineregion_tag_categories.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.7 on 2019-11-13 12:40 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tag', '0014_tag_old_id_meta_product'), + ('location', '0023_auto_20191112_0104'), + ] + + operations = [ + migrations.AddField( + model_name='wineregion', + name='tag_categories', + field=models.ManyToManyField(blank=True, help_text='attribute from legacy db', related_name='wine_regions', to='tag.TagCategory'), + ), + ] diff --git a/apps/location/models.py b/apps/location/models.py index cb3794be..33487662 100644 --- a/apps/location/models.py +++ b/apps/location/models.py @@ -173,6 +173,9 @@ class WineRegion(models.Model): 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') objects = WineRegionQuerySet.as_manager() diff --git a/apps/location/transfer_data.py b/apps/location/transfer_data.py index d11123dc..0d90461a 100644 --- a/apps/location/transfer_data.py +++ b/apps/location/transfer_data.py @@ -181,10 +181,10 @@ def update_flags(): data_types = { "dictionaries": [ - # transfer_countries, - # transfer_regions, - # transfer_cities, - # transfer_addresses, + transfer_countries, + transfer_regions, + transfer_cities, + transfer_addresses, transfer_wine_region, transfer_wine_sub_region, transfer_wine_village, diff --git a/apps/transfer/mixins.py b/apps/transfer/mixins.py index 31d2bc2d..7b43b210 100644 --- a/apps/transfer/mixins.py +++ b/apps/transfer/mixins.py @@ -4,6 +4,7 @@ from rest_framework import serializers from tag import models as tag_models from django.conf import settings from product.models import ProductType, ProductSubType, Product +from location.models import WineRegion from django.utils.text import slugify @@ -109,3 +110,8 @@ class TransferSerializerMixin(serializers.ModelSerializer): product_qs = Product.objects.filter(old_id=old_id) if product_qs.exists(): return product_qs.first() + + def get_wine_region(self, parent_id): + qs = WineRegion.objects.filter(old_id=parent_id) + if qs.exists(): + return qs.first() diff --git a/apps/transfer/models.py b/apps/transfer/models.py index b03536d3..d0c44609 100644 --- a/apps/transfer/models.py +++ b/apps/transfer/models.py @@ -1167,6 +1167,17 @@ class Assemblages(MigrateMixin): db_table = 'assemblages' +class CepageRegions(MigrateMixin): + using = 'legacy' + + cepage = models.ForeignKey('Cepages', on_delete=models.DO_NOTHING) + wine_region_id = models.IntegerField() + + class Meta: + managed = False + db_table = 'cepage_regions' + + class Cepages(MigrateMixin): using = 'legacy' diff --git a/apps/transfer/serializers/location.py b/apps/transfer/serializers/location.py index b3f49f3c..d8dca98c 100644 --- a/apps/transfer/serializers/location.py +++ b/apps/transfer/serializers/location.py @@ -5,6 +5,9 @@ from rest_framework import serializers from location import models from transfer.mixins import TransferSerializerMixin from utils.methods import get_point_from_coordinates +from transfer.models import Cepages +from tag.models import TagCategory +from django.utils.text import slugify class CountrySerializer(serializers.ModelSerializer): @@ -345,7 +348,30 @@ class WineVillage(TransferSerializerMixin): attrs['wine_region'] = self.get_wine_region(parent_id) return attrs - def get_wine_region(self, parent_id): - qs = models.WineRegion.objects.filter(old_id=parent_id) + +class CepageWineRegionsSerializer(TransferSerializerMixin): + + cepage_id = serializers.PrimaryKeyRelatedField( + queryset=Cepages.objects.all()) + wine_region_id = serializers.IntegerField() + + class Meta(WineRegion.Meta): + fields = [ + 'cepage_id', + 'wine_region_id', + ] + + 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']) + + if obj and tag_category not in obj.tag_categories.all(): + obj.tag_categories.add(tag_category) + 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()