diff --git a/apps/establishment/migrations/0059_establishmentnote.py b/apps/establishment/migrations/0059_establishmentnote.py new file mode 100644 index 00000000..5b55f701 --- /dev/null +++ b/apps/establishment/migrations/0059_establishmentnote.py @@ -0,0 +1,33 @@ +# Generated by Django 2.2.7 on 2019-11-12 10:07 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('establishment', '0058_merge_20191106_0921'), + ] + + operations = [ + migrations.CreateModel( + name='EstablishmentNote', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Date created')), + ('modified', models.DateTimeField(auto_now=True, verbose_name='Date updated')), + ('old_id', models.PositiveIntegerField(blank=True, null=True)), + ('text', models.TextField(verbose_name='text')), + ('establishment', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='establishment_notes', to='establishment.Establishment', verbose_name='establishment')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='establishment_notes', to=settings.AUTH_USER_MODEL, verbose_name='author')), + ], + options={ + 'verbose_name': 'product notes', + 'verbose_name_plural': 'product note', + }, + ), + ] diff --git a/apps/establishment/models.py b/apps/establishment/models.py index 75d3f6e9..ef3630c4 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -520,6 +520,30 @@ class Establishment(ProjectBaseMixin, URLImageMixin, TranslatedFieldsMixin): return self.products.wines() +class EstablishmentNoteQuerySet(models.QuerySet): + """QuerySet for model EstablishmentNote.""" + + +class EstablishmentNote(ProjectBaseMixin): + """Note model for Establishment entity.""" + old_id = models.PositiveIntegerField(null=True, blank=True) + text = models.TextField(verbose_name=_('text')) + establishment = models.ForeignKey(Establishment, on_delete=models.PROTECT, + related_name='establishment_notes', + verbose_name=_('establishment')) + user = models.ForeignKey('account.User', on_delete=models.PROTECT, + null=True, + related_name='establishment_notes', + verbose_name=_('author')) + + objects = EstablishmentNoteQuerySet.as_manager() + + class Meta: + """Meta class.""" + verbose_name_plural = _('product note') + verbose_name = _('product notes') + + class Position(BaseAttributes, TranslatedFieldsMixin): """Position model.""" diff --git a/apps/establishment/transfer_data.py b/apps/establishment/transfer_data.py index d0042519..b3dc58f9 100644 --- a/apps/establishment/transfer_data.py +++ b/apps/establishment/transfer_data.py @@ -4,8 +4,9 @@ from django.db.models import Q, F from establishment.models import Establishment from location.models import Address -from transfer.models import Establishments, Dishes -from transfer.serializers.establishment import EstablishmentSerializer +from transfer.models import Establishments, Dishes, EstablishmentNotes +from transfer.serializers.establishment import EstablishmentSerializer, \ + EstablishmentNoteSerializer from transfer.serializers.plate import PlateSerializer @@ -124,10 +125,26 @@ def transfer_establishment_addresses(): establishment.save() +def transfer_establishment_note(): + errors = [] + queryset = EstablishmentNotes.objects.exclude(text__exact='') \ + .exclude(text__isnull=True) \ + .exclude(establishment_id__isnull=True) + serialized_data = EstablishmentNoteSerializer( + data=list(queryset.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 + pprint(f"transfer_establishment_note errors: {errors}") + + data_types = { "establishment": [ transfer_establishment, ], + "establishment_note": [transfer_establishment_note], "location_establishment": [ transfer_establishment_addresses ], diff --git a/apps/product/migrations/0012_auto_20191112_0937.py b/apps/product/migrations/0012_auto_20191112_1007.py similarity index 78% rename from apps/product/migrations/0012_auto_20191112_0937.py rename to apps/product/migrations/0012_auto_20191112_1007.py index 9df6a9bc..66d61bc5 100644 --- a/apps/product/migrations/0012_auto_20191112_0937.py +++ b/apps/product/migrations/0012_auto_20191112_1007.py @@ -1,4 +1,4 @@ -# Generated by Django 2.2.7 on 2019-11-12 09:37 +# Generated by Django 2.2.7 on 2019-11-12 10:07 from django.conf import settings from django.db import migrations, models @@ -24,9 +24,10 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Date created')), ('modified', models.DateTimeField(auto_now=True, verbose_name='Date updated')), + ('old_id', models.PositiveIntegerField(blank=True, null=True)), ('text', models.TextField(verbose_name='text')), - ('product', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='notes', to='product.Product', verbose_name='product')), - ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='notes', to=settings.AUTH_USER_MODEL, verbose_name='author')), + ('product', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='product_notes', to='product.Product', verbose_name='product')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='product_notes', to=settings.AUTH_USER_MODEL, verbose_name='author')), ], options={ 'verbose_name': 'product notes', diff --git a/apps/product/models.py b/apps/product/models.py index 79cf5ded..2f964627 100644 --- a/apps/product/models.py +++ b/apps/product/models.py @@ -414,13 +414,14 @@ class ProductNoteQuerySet(models.QuerySet): class ProductNote(ProjectBaseMixin): """Note model for Product entity.""" + old_id = models.PositiveIntegerField(null=True, blank=True) text = models.TextField(verbose_name=_('text')) product = models.ForeignKey(Product, on_delete=models.PROTECT, - related_name='notes', + related_name='product_notes', verbose_name=_('product')) user = models.ForeignKey('account.User', on_delete=models.PROTECT, null=True, - related_name='notes', + related_name='product_notes', verbose_name=_('author')) objects = ProductNoteQuerySet.as_manager() diff --git a/apps/product/transfer_data.py b/apps/product/transfer_data.py index 77e7cd89..8e4a26fa 100644 --- a/apps/product/transfer_data.py +++ b/apps/product/transfer_data.py @@ -101,6 +101,7 @@ def transfer_wine_classifications(): def transfer_product(): + errors = [] queryset = transfer_models.Products.objects.all() serialized_data = product_serializers.ProductSerializer( data=list(queryset.values()), @@ -108,12 +109,12 @@ def transfer_product(): if serialized_data.is_valid(): serialized_data.save() else: - errors = [] for d in serialized_data.errors: errors.append(d) if d else None pprint(f"transfer_product errors: {errors}") def transfer_product_note(): + errors = [] queryset = transfer_models.ProductNotes.objects.exclude(text='') serialized_data = product_serializers.ProductNoteSerializer( data=list(queryset.values()), @@ -121,12 +122,12 @@ def transfer_product_note(): if serialized_data.is_valid(): serialized_data.save() else: - errors = [] for d in serialized_data.errors: errors.append(d) if d else None pprint(f"transfer_product_note errors: {errors}") def transfer_plate(): + errors = [] queryset = transfer_models.Merchandise.objects.all() serialized_data = product_serializers.PlateSerializer( data=list(queryset.values()), @@ -134,12 +135,12 @@ def transfer_plate(): if serialized_data.is_valid(): serialized_data.save() else: - errors = [] for d in serialized_data.errors: errors.append(d) if d else None pprint(f"transfer_plates errors: {errors}") def transfer_plate_image(): + errors = [] queryset = transfer_models.Merchandise.objects.all() serialized_data = product_serializers.PlateImageSerializer( data=list(queryset.values()), @@ -147,7 +148,6 @@ def transfer_plate_image(): if serialized_data.is_valid(): serialized_data.save() else: - errors = [] for d in serialized_data.errors: errors.append(d) if d else None pprint(f"transfer_plates_images errors: {errors}") diff --git a/apps/transfer/management/commands/transfer.py b/apps/transfer/management/commands/transfer.py index d2cfaf41..7f0b5f4b 100644 --- a/apps/transfer/management/commands/transfer.py +++ b/apps/transfer/management/commands/transfer.py @@ -34,6 +34,7 @@ class Command(BaseCommand): 'product', 'product_note', 'souvenir', + 'establishment_note', ] def handle(self, *args, **options): diff --git a/apps/transfer/models.py b/apps/transfer/models.py index 8b5ba081..2c7fe726 100644 --- a/apps/transfer/models.py +++ b/apps/transfer/models.py @@ -447,6 +447,18 @@ class Establishments(MigrateMixin): db_table = 'establishments' +class EstablishmentNotes(MigrateMixin): + using = 'legacy' + + establishment_id = models.IntegerField(null=True, blank=True) + account_id = models.IntegerField(null=True, blank=True) + text = models.TextField(null=True) + + class Meta: + managed = False + db_table = 'notes' + + class Descriptions(MigrateMixin): using = 'legacy' @@ -973,7 +985,7 @@ class Products(MigrateMixin): class ProductNotes(MigrateMixin): using = 'legacy' - product = models.ForeignKey(Products, on_delete=models.DO_NOTHING) + product_id = models.IntegerField(null=True, blank=True) text = models.CharField(max_length=255) win_import_id = models.CharField(max_length=255) diff --git a/apps/transfer/serializers/establishment.py b/apps/transfer/serializers/establishment.py index f9127d6e..0e5f55d4 100644 --- a/apps/transfer/serializers/establishment.py +++ b/apps/transfer/serializers/establishment.py @@ -1,16 +1,17 @@ from django.conf import settings from django.core.exceptions import MultipleObjectsReturned, ValidationError from django.db import transaction +from django.utils.text import slugify from rest_framework import serializers -from establishment.models import Establishment, ContactEmail, ContactPhone, EstablishmentType, \ - EstablishmentSubType +from account.models import User +from establishment.models import Establishment, ContactEmail, ContactPhone, \ + EstablishmentType, EstablishmentSubType, EstablishmentNote from location.models import Address from timetable.models import Timetable from utils.legacy_parser import parse_legacy_schedule_content from utils.serializers import TimeZoneChoiceField from utils.slug_generator import generate_unique_slug -from django.utils.text import slugify class EstablishmentSerializer(serializers.ModelSerializer): @@ -173,3 +174,45 @@ class EstablishmentSerializer(serializers.ModelSerializer): index_name=slugify(subtype_name), establishment_type_id=establishment_type_id) return subtype + + +class EstablishmentNoteSerializer(serializers.ModelSerializer): + + id = serializers.IntegerField() + establishment_id = serializers.IntegerField() + account_id = serializers.IntegerField(allow_null=True) + text = serializers.CharField(allow_blank=True, allow_null=True) + + class Meta: + model = EstablishmentNote + fields = ( + 'id', + 'establishment_id', + 'account_id', + 'text', + ) + + def validate(self, attrs): + attrs['old_id'] = attrs['id'] + attrs['establishment'] = self.get_establishment(attrs.pop('establishment_id')) + attrs['user'] = self.get_user(attrs.pop('account_id')) + return attrs + + def create(self, validated_data): + qs = self.Meta.model.objects.filter(**validated_data) + establishment = validated_data.get('establishment') + + if not qs.exists() and establishment: + obj = super().create(validated_data) + return obj + + def get_establishment(self, old_id): + if old_id: + qs = Establishment.objects.filter(old_id=old_id) + if qs.exists(): + return qs.first() + + def get_user(self, old_id): + qs = User.objects.exclude(old_id__isnull=True).filter(old_id=old_id) + if qs.exists(): + return qs.first() diff --git a/apps/transfer/serializers/product.py b/apps/transfer/serializers/product.py index 0d6e938b..75508677 100644 --- a/apps/transfer/serializers/product.py +++ b/apps/transfer/serializers/product.py @@ -543,25 +543,34 @@ class PlateImageSerializer(serializers.ModelSerializer): return product_qs.first() -class ProductNoteSerializer(TransferSerializerMixin): - product_id = serializers.PrimaryKeyRelatedField( - queryset=transfer_models.Products.objects.all()) +class ProductNoteSerializer(serializers.ModelSerializer): + + id = serializers.IntegerField() + product_id = serializers.IntegerField() text = serializers.CharField(allow_blank=True) class Meta: model = models.ProductNote fields = ( + 'id', 'product_id', 'text', ) def validate(self, attrs): + attrs['old_id'] = attrs['id'] attrs['product'] = self.get_product(attrs.pop('product_id')) return attrs - def get_product(self, product): - if product: - old_id = product.id if hasattr(product, 'id') else product + def create(self, validated_data): + qs = self.Meta.model.objects.filter(**validated_data) + product = validated_data.get('product') + + if not qs.exists() and product: + return super().create(validated_data) + + def get_product(self, old_id): + if old_id: qs = models.Product.objects.filter(old_id=old_id) if qs.exists(): return qs.first()