* payment_proof is now a single image + migration from m2m
+ split_payment_proof
This commit is contained in:
parent
5e76ee775d
commit
5a1afdf07b
|
|
@ -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='Подтверждение оплаты сплита'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -229,7 +229,6 @@ def generate_checklist_id():
|
||||||
class ChecklistQuerySet(models.QuerySet):
|
class ChecklistQuerySet(models.QuerySet):
|
||||||
def with_base_related(self):
|
def with_base_related(self):
|
||||||
return self.select_related('manager', 'category', 'payment_method', 'promocode')\
|
return self.select_related('manager', 'category', 'payment_method', 'promocode')\
|
||||||
.prefetch_related('payment_proof') \
|
|
||||||
.prefetch_related(Prefetch('images', to_attr='_images'))
|
.prefetch_related(Prefetch('images', to_attr='_images'))
|
||||||
|
|
||||||
def default_ordering(self):
|
def default_ordering(self):
|
||||||
|
|
@ -337,7 +336,12 @@ class Checklist(models.Model):
|
||||||
on_delete=models.SET_NULL)
|
on_delete=models.SET_NULL)
|
||||||
|
|
||||||
images = models.ManyToManyField('Image', verbose_name='Изображения', related_name='+', blank=True)
|
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
|
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)
|
delivery = models.CharField('Тип доставки', max_length=15, choices=DeliveryType.CHOICES, null=True, blank=True)
|
||||||
|
|
|
||||||
|
|
@ -97,7 +97,8 @@ class ChecklistSerializer(serializers.ModelSerializer):
|
||||||
paymenttype = serializers.SlugRelatedField(source='payment_method', slug_field='slug',
|
paymenttype = serializers.SlugRelatedField(source='payment_method', slug_field='slug',
|
||||||
queryset=PaymentMethod.objects.all(),
|
queryset=PaymentMethod.objects.all(),
|
||||||
required=False, allow_null=True)
|
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)
|
checkphoto = Base64ImageField(source='receipt', required=False, allow_null=True)
|
||||||
trackid = serializers.CharField(source='poizon_tracking', 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)
|
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):
|
def _collect_images_by_fields(self, validated_data):
|
||||||
images = {}
|
images = {}
|
||||||
for k in ('main_images', 'payment_proof'):
|
for k in ('main_images',):
|
||||||
if k in validated_data:
|
if k in validated_data:
|
||||||
images[k] = validated_data.pop(k)
|
images[k] = validated_data.pop(k)
|
||||||
|
|
||||||
|
|
@ -124,20 +125,11 @@ class ChecklistSerializer(serializers.ModelSerializer):
|
||||||
instance.images.set(img_objs)
|
instance.images.set(img_objs)
|
||||||
instance.generate_preview(next(iter(img_objs), None))
|
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):
|
def create(self, validated_data):
|
||||||
images = self._collect_images_by_fields(validated_data)
|
images = self._collect_images_by_fields(validated_data)
|
||||||
|
|
||||||
instance = super().create(validated_data)
|
instance = super().create(validated_data)
|
||||||
self._create_main_images(instance, images.get('main_images'))
|
self._create_main_images(instance, images.get('main_images'))
|
||||||
self._create_payment_proofs(instance, images.get('payment_proof'))
|
|
||||||
return instance
|
return instance
|
||||||
|
|
||||||
def update(self, instance, validated_data):
|
def update(self, instance, validated_data):
|
||||||
|
|
@ -147,13 +139,12 @@ class ChecklistSerializer(serializers.ModelSerializer):
|
||||||
instance: Checklist = super().update(instance, validated_data)
|
instance: Checklist = super().update(instance, validated_data)
|
||||||
|
|
||||||
self._create_main_images(instance, images.get('main_images'))
|
self._create_main_images(instance, images.get('main_images'))
|
||||||
self._create_payment_proofs(instance, images.get('payment_proof'))
|
|
||||||
|
|
||||||
# Invalidate prefetched images
|
# Invalidate prefetched images
|
||||||
delattr(instance, '_images')
|
delattr(instance, '_images')
|
||||||
|
|
||||||
if instance.status == Checklist.Status.NEW:
|
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:
|
if has_payment_info:
|
||||||
instance.status = Checklist.Status.PAYMENT
|
instance.status = Checklist.Status.PAYMENT
|
||||||
instance.save()
|
instance.save()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user