From 9eb9b8bebc16d4b1ee56be1422c2b4de6e96e388 Mon Sep 17 00:00:00 2001 From: phzhik Date: Mon, 21 Aug 2023 16:24:52 +0400 Subject: [PATCH] * payment_proof is now a single image + migration from m2m + split_payment_proof --- ..._checklist_split_payment_proof_and_more.py | 59 +++++++++++++++++++ store/models.py | 8 ++- store/serializers.py | 17 ++---- 3 files changed, 69 insertions(+), 15 deletions(-) create mode 100644 store/migrations/0042_oldchecklist_checklist_split_payment_proof_and_more.py diff --git a/store/migrations/0042_oldchecklist_checklist_split_payment_proof_and_more.py b/store/migrations/0042_oldchecklist_checklist_split_payment_proof_and_more.py new file mode 100644 index 0000000..58b1f27 --- /dev/null +++ b/store/migrations/0042_oldchecklist_checklist_split_payment_proof_and_more.py @@ -0,0 +1,59 @@ +# Generated by Django 4.2.2 on 2023-08-21 10:41 + +from django.db import migrations, models +import django.db.models.deletion + + +def move_m2m_payment_proof_to_image(apps, schema_editor): + Checklist = apps.get_model('store', 'Checklist') + for checklist in Checklist.objects.all(): + img_obj = checklist.payment_proof.all().first() + if img_obj: + checklist._payment_proof = img_obj.image + checklist.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('store', '0041_remove_category_slug_remove_checklist_subcategory_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='OldChecklist', + fields=[ + ('id', models.CharField(max_length=10, primary_key=True, serialize=False)), + ('category_id', models.PositiveIntegerField()), + ('subcategory', models.CharField(blank=True, max_length=20, null=True, verbose_name='Подкатегория')), + ], + options={ + 'db_table': 'store_checklist', + 'managed': False, + }, + ), + migrations.AddField( + model_name='checklist', + name='_payment_proof', + field=models.ImageField(blank=True, null=True, upload_to='docs/', verbose_name='Подтверждение оплаты'), + ), + + migrations.RunPython(code=move_m2m_payment_proof_to_image), + + migrations.RemoveField( + model_name='checklist', + name='payment_proof', + ), + + migrations.RenameField( + model_name='checklist', + old_name='_payment_proof', + new_name='payment_proof', + ), + + migrations.AddField( + model_name='checklist', + name='split_payment_proof', + field=models.ImageField(blank=True, null=True, upload_to='docs/', verbose_name='Подтверждение оплаты сплита'), + ), + ] diff --git a/store/models.py b/store/models.py index 28989cb..cdab3fe 100644 --- a/store/models.py +++ b/store/models.py @@ -229,7 +229,6 @@ def generate_checklist_id(): class ChecklistQuerySet(models.QuerySet): def with_base_related(self): return self.select_related('manager', 'category', 'payment_method', 'promocode')\ - .prefetch_related('payment_proof') \ .prefetch_related(Prefetch('images', to_attr='_images')) def default_ordering(self): @@ -337,7 +336,12 @@ class Checklist(models.Model): on_delete=models.SET_NULL) images = models.ManyToManyField('Image', verbose_name='Изображения', related_name='+', blank=True) - payment_proof = models.ManyToManyField('Image', verbose_name='Подтверждение оплаты', related_name='+', blank=True) # paymentprovement + payment_proof = models.ImageField('Подтверждение оплаты', upload_to=Image.TYPE_TO_UPLOAD_PATH[Image.DOC], + null=True, blank=True) # paymentprovement + split_payment_proof = models.ImageField('Подтверждение оплаты сплита', + upload_to=Image.TYPE_TO_UPLOAD_PATH[Image.DOC], + null=True, blank=True) + receipt = models.ImageField('Фото чека', upload_to=Image.TYPE_TO_UPLOAD_PATH[Image.DOC], null=True, blank=True) # checkphoto delivery = models.CharField('Тип доставки', max_length=15, choices=DeliveryType.CHOICES, null=True, blank=True) diff --git a/store/serializers.py b/store/serializers.py index 4587e08..fc19fdb 100644 --- a/store/serializers.py +++ b/store/serializers.py @@ -97,7 +97,8 @@ class ChecklistSerializer(serializers.ModelSerializer): paymenttype = serializers.SlugRelatedField(source='payment_method', slug_field='slug', queryset=PaymentMethod.objects.all(), required=False, allow_null=True) - paymentprovement = ImageListSerializer(source='payment_proof', required=False, allow_null=True) + paymentprovement = Base64ImageField(source='payment_proof', required=False, allow_null=True) + split_payment_proof = Base64ImageField(required=False, allow_null=True) checkphoto = Base64ImageField(source='receipt', required=False, allow_null=True) trackid = serializers.CharField(source='poizon_tracking', required=False, allow_null=True) cdek_tracking = serializers.CharField(required=False, allow_null=True) @@ -109,7 +110,7 @@ class ChecklistSerializer(serializers.ModelSerializer): def _collect_images_by_fields(self, validated_data): images = {} - for k in ('main_images', 'payment_proof'): + for k in ('main_images',): if k in validated_data: images[k] = validated_data.pop(k) @@ -124,20 +125,11 @@ class ChecklistSerializer(serializers.ModelSerializer): instance.images.set(img_objs) instance.generate_preview(next(iter(img_objs), None)) - def _create_payment_proofs(self, instance, images): - if images is None: - return - - img_objs = [Image(image=img['image'], type=Image.DOC) for img in images] - img_objs = Image.objects.bulk_create(img_objs) - instance.payment_proof.set(img_objs) - def create(self, validated_data): images = self._collect_images_by_fields(validated_data) instance = super().create(validated_data) self._create_main_images(instance, images.get('main_images')) - self._create_payment_proofs(instance, images.get('payment_proof')) return instance def update(self, instance, validated_data): @@ -147,13 +139,12 @@ class ChecklistSerializer(serializers.ModelSerializer): instance: Checklist = super().update(instance, validated_data) self._create_main_images(instance, images.get('main_images')) - self._create_payment_proofs(instance, images.get('payment_proof')) # Invalidate prefetched images delattr(instance, '_images') if instance.status == Checklist.Status.NEW: - has_payment_info = instance.payment_proof.exists() and instance.payment_method is not None + has_payment_info = instance.payment_proof is not None and instance.payment_method is not None if has_payment_info: instance.status = Checklist.Status.PAYMENT instance.save()