* payment_proof is now a single image + migration from m2m

+ split_payment_proof
This commit is contained in:
Phil Zhitnikov 2023-08-21 16:24:52 +04:00
parent 3d3bab53b0
commit 9eb9b8bebc
3 changed files with 69 additions and 15 deletions

View File

@ -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='Подтверждение оплаты сплита'),
),
]

View File

@ -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)

View File

@ -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()