import --> tag distribution / tag disstribution batch / remove distribution / cancel distributions

This commit is contained in:
2026-01-24 10:09:54 +03:30
parent f2aab5c6b6
commit 757ad85688
5 changed files with 105 additions and 0 deletions

View File

@@ -0,0 +1,28 @@
# Generated by Django 5.0 on 2026-01-24 05:58
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('tag', '0037_tagdistribution_dist_identity_and_more'),
]
operations = [
migrations.AddField(
model_name='tagdistributionbatch',
name='distribution_type',
field=models.CharField(choices=[('random', 'RANDOM'), ('batch', 'BATCH')], default='batch', max_length=20,
null=True),
),
migrations.AddField(
model_name='tagdistributionbatch',
name='remaining_tag_count',
field=models.PositiveBigIntegerField(default=0),
),
migrations.AddField(
model_name='tagdistributionbatch',
name='total_distributed_tag_count',
field=models.PositiveBigIntegerField(default=0),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.0 on 2026-01-24 06:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('tag', '0038_tagdistributionbatch_distribution_type_and_more'),
]
operations = [
migrations.AddField(
model_name='tagbatch',
name='total_distributed_tags',
field=models.PositiveBigIntegerField(default=0),
),
]

View File

@@ -69,6 +69,7 @@ class TagBatch(BaseModel):
species_code = models.IntegerField(default=0)
serial_from = models.PositiveBigIntegerField(default=0)
serial_to = models.PositiveBigIntegerField(default=0)
total_distributed_tags = models.PositiveBigIntegerField(default=0)
status = models.CharField(
max_length=20,
@@ -145,6 +146,8 @@ class TagDistributionBatch(BaseModel):
)
distributions = models.ManyToManyField(TagDistribution, related_name='tag_distribution_batch')
total_tag_count = models.IntegerField(default=0)
total_distributed_tag_count = models.PositiveBigIntegerField(default=0)
remaining_tag_count = models.PositiveBigIntegerField(default=0)
is_closed = models.BooleanField(default=False)
def __str__(self):

View File

@@ -1,6 +1,7 @@
import random
from django.db import transaction
from django.db.models import Sum
from apps.authentication.models import Organization
from apps.tag.exceptions import TagException
@@ -147,3 +148,16 @@ class TagDistributionService:
dist_batch.distributions.add(*distributions)
return {'tag_distributions': distributions, 'distributions_batch': dist_batch}
def distribution_batch_main_dashboard(self, org: Organization):
"""
distribution batch main page dashboard detail
"""
distributions_batch = TagDistributionBatch.objects.prefetch_related('distributions')
distributions_batch.aggregate(
total_tag_count=Sum('total_tag_count'),
total_distributed_tag_count=Sum('total_distributed_tag_count'),
remaining_tag_count=Sum('remaining_tag_count'),
)

View File

@@ -440,6 +440,27 @@ class TagDistributionViewSet(
return Response(status=status.HTTP_200_OK)
@action(
methods=['get'],
detail=False,
url_path='close_distributions_list',
url_name='close_distributions_list',
name='close_distributions_list',
)
def close_distributions_list(self, request):
"""
list of closed distributions
"""
queryset = self.get_queryset(visibility_by_org_scope=True).filter(is_closed=True).order_by('-create_date')
queryset = self.filter_query(queryset)
page = self.paginate_queryset(queryset)
if page is not None: # noqa
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
return Response(self.serializer_class(queryset).data)
class TagDistributionBatchViewSet(
BaseViewSet,
@@ -490,3 +511,24 @@ class TagDistributionBatchViewSet(
dist_batch.distributions.all().update(is_closed=True) # close distributions of batch
return Response(status=status.HTTP_200_OK)
@action(
methods=['get'],
detail=False,
url_path='closed_tag_dist_batch_list',
url_name='closed_tag_dist_batch_list',
name='closed_tag_dist_batch_list',
)
def close_tag_dist_batch_list(self, request):
"""
list of closed tag distributions batch
"""
queryset = self.get_queryset(visibility_by_org_scope=True).filter(is_closed=True).order_by('create_date')
queryset = self.filter_query(self.filter_queryset(queryset))
page = self.paginate_queryset(queryset)
if page is not None: # noqa
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
return Response(self.serializer_class(queryset).data)