From 8fb3bf5dc98140eb44b4e9ce047d8166adb99430 Mon Sep 17 00:00:00 2001 From: Mojtaba-z Date: Wed, 7 Jan 2026 15:36:22 +0330 Subject: [PATCH] fix - tag code generation in tags --- .../0029_alter_tag_tag_code_tagbatch.py | 46 +++++++++++++++++ apps/tag/models.py | 8 +-- apps/tag/services/tag_services.py | 49 +++++++++++++------ 3 files changed, 82 insertions(+), 21 deletions(-) create mode 100644 apps/tag/migrations/0029_alter_tag_tag_code_tagbatch.py diff --git a/apps/tag/migrations/0029_alter_tag_tag_code_tagbatch.py b/apps/tag/migrations/0029_alter_tag_tag_code_tagbatch.py new file mode 100644 index 0000000..30a0ce4 --- /dev/null +++ b/apps/tag/migrations/0029_alter_tag_tag_code_tagbatch.py @@ -0,0 +1,46 @@ +# Generated by Django 5.0 on 2026-01-07 11:55 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0060_organization_ownership_code'), + ('tag', '0028_tagbatch'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AlterField( + model_name='tag', + name='tag_code', + field=models.CharField(max_length=20, null=True), + ), + migrations.CreateModel( + name='TagBatch', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_date', models.DateTimeField(auto_now_add=True)), + ('modify_date', models.DateTimeField(auto_now=True)), + ('creator_info', models.CharField(max_length=100, null=True)), + ('modifier_info', models.CharField(max_length=100, null=True)), + ('trash', models.BooleanField(default=False)), + ('request_number', models.CharField(default='0', max_length=50, null=True)), + ('species_code', models.IntegerField(default=0)), + ('serial_from', models.PositiveBigIntegerField(default=0)), + ('serial_to', models.PositiveBigIntegerField(default=0)), + ('status', models.CharField(choices=[('created', 'CREATED'), ('distributed', 'DISTRIBUTED')], default='created', max_length=20, null=True)), + ('description', models.TextField(blank=True, null=True)), + ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_createddby', to=settings.AUTH_USER_MODEL)), + ('modified_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_modifiedby', to=settings.AUTH_USER_MODEL)), + ('organization', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tag_batches', to='authentication.organization')), + ('tag', models.ManyToManyField(related_name='tags', to='tag.tag')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/tag/models.py b/apps/tag/models.py index 773d284..259488a 100644 --- a/apps/tag/models.py +++ b/apps/tag/models.py @@ -15,7 +15,7 @@ class Tag(BaseModel): ownership_code = models.IntegerField(default=0, help_text='ownership code of organizations like: 51, 52, etc') species_code = models.IntegerField(default=0, help_text='code of livestock type like: 1->sheep') serial = models.CharField(max_length=8, help_text='7 digit number as serial on tag code') - tag_code = models.CharField(max_length=20, unique=True, null=True) + tag_code = models.CharField(max_length=20, null=True) organization = models.ForeignKey( auth_models.Organization, on_delete=models.CASCADE, @@ -29,12 +29,6 @@ class Tag(BaseModel): ) status = models.CharField(max_length=20, default="F") - # class Meta: - # indexes = [ - # models.Index(fields=['ownership_code', 'species_code']), - # models.Index(fields=['status']), - # ] - def __str__(self): return f'{self.id}-{self.tag_code}' diff --git a/apps/tag/services/tag_services.py b/apps/tag/services/tag_services.py index a1b276e..ef1758e 100644 --- a/apps/tag/services/tag_services.py +++ b/apps/tag/services/tag_services.py @@ -5,6 +5,7 @@ from apps.authentication.models import Organization from apps.livestock.web.api.v1.serializers import LiveStockSerializer from apps.tag.exceptions import TagException from apps.tag.models import Tag, TagBatch +from apps.tag.tools import tag_code_serial_scanning class TagService: @@ -12,6 +13,24 @@ class TagService: Different Services of Livestock Tags """ + def tag_code_compelition(self, tag_data: dict, serial, ownership_code, organization): + """ + complete data of tag + """ + + tag_data.update({ + 'serial': serial, + 'ownership_code': ownership_code, + 'organization': organization, + 'tag_code': f"{tag_data.get('country_code')}" + f"{tag_data.get('static_code')}" + f"{ownership_code}" + f"{tag_data.get('species_code')}" + f"{tag_code_serial_scanning(str(serial))}" + }) + + return tag_data + def create_tag( self, serial_start_range: int = None, @@ -24,7 +43,7 @@ class TagService: """ # create tag batch - request_number = serial_end_range - serial_start_range + request_number = (serial_end_range - serial_start_range) + 1 batch = TagBatch.objects.create( organization=org, request_number=request_number if request_number > 0 else 1, @@ -36,12 +55,13 @@ class TagService: tag_list = [] while serial_start_range <= serial_end_range: - data.update({ - 'serial': str(serial_start_range), - 'ownership_code': org.ownership_code, - 'organization': org, - }) - tag_list.append(Tag(**data)) + tag_data = self.tag_code_compelition( + tag_data=data, + serial=serial_start_range, + organization=org, + ownership_code=org.ownership_code + ) + tag_list.append(Tag(**tag_data)) if Tag.objects.filter(serial=serial_start_range, species_code=data.get('species_code')).exists(): raise TagException(f' پلاک با مشخصات مورد نظر {serial_start_range} وجود دارد ', status_code=403) # noqa @@ -66,7 +86,7 @@ class TagService: """ # update tag batch - request_number = serial_end_range - serial_start_range + request_number = (serial_end_range - serial_start_range) + 1 batch = TagBatch.objects.get(id=batch_id) batch.request_number = request_number batch.species_code = data.get('species_code') @@ -77,12 +97,13 @@ class TagService: # recreate tags for batch tag_list = [] while serial_start_range <= serial_end_range: - data.update({ - 'serial': str(serial_start_range), - 'ownership_code': org.ownership_code, - 'organization': org, - }) - tag_list.append(Tag(**data)) + tag_data = self.tag_code_compelition( + tag_data=data, + serial=serial_start_range, + organization=org, + ownership_code=org.ownership_code + ) + tag_list.append(Tag(**tag_data)) if Tag.objects.filter( serial=serial_start_range,