fix --> siganl of distribute to change some values in batch

This commit is contained in:
2026-02-01 09:16:40 +03:30
parent 8c9f7aca02
commit d643237a77

View File

@@ -1,26 +1,60 @@
from django.db import transaction
from django.db.models import Count
from django.db.models.signals import m2m_changed
from django.db.models.signals import post_save
from django.dispatch import receiver
from apps.tag.models import TagDistribution, TagDistributionBatch, Tag
from apps.tag.models import TagDistribution, TagDistributionBatch
@receiver(post_save, sender=TagDistribution)
def calculate_tag_batch_details(sender, instance: TagDistribution, **kwargs):
"""
calculate distribution & remaining tag count from batch
"""
distributions = TagDistribution.objects.filter(batch=instance.batch)
# @receiver(post_save, sender=TagDistribution)
# def calculate_tag_batch_details(sender, instance: TagDistribution, **kwargs):
# """
# calculate distribution & remaining tag count from batch
# """
# distributions = TagDistribution.objects.filter(batch=instance.batch)
#
# distributed_tags = distributions.aggregate(count=Count('tag'))['count']
#
# instance.batch.total_distributed_tags = distributed_tags \
# if not instance.batch.total_distributed_tags != 0 \
# else instance.total_tag_count
# instance.batch.total_remaining_tags = int(instance.batch.request_number) - distributed_tags
# instance.batch.save(update_fields=['total_distributed_tags', 'total_remaining_tags'])
distributed_tags = distributions.aggregate(count=Count('tag'))['count']
@receiver(m2m_changed, sender=TagDistribution.tag.through)
def update_batch_on_distribution_change(
sender, instance: TagDistribution, action, **kwargs
):
if action not in ['post_add', 'post_remove', 'post_clear']:
return
instance.batch.total_distributed_tags = distributed_tags \
if not instance.batch.total_distributed_tags != 0 \
else instance.total_tag_count
instance.batch.total_remaining_tags = int(instance.batch.request_number) - distributed_tags
instance.batch.save(update_fields=['total_distributed_tags', 'total_remaining_tags'])
if not instance.batch:
return
batch = instance.batch
distributions = TagDistribution.objects.filter(batch=batch)
distributed_tags = distributions.aggregate(
total=Count('tag')
)['total'] or 0
batch.total_distributed_tags = distributed_tags
batch.total_remaining_tags = (
int(batch.request_number) - distributed_tags
)
batch.status = (
'distributed'
if batch.total_remaining_tags == 0
else 'created'
)
batch.save(update_fields=[
'total_distributed_tags',
'total_remaining_tags',
'status'
])
@receiver(post_save, sender=TagDistributionBatch)