diff --git a/reagents/api/views.py b/reagents/api/views.py index 4e81437..3e6ad19 100644 --- a/reagents/api/views.py +++ b/reagents/api/views.py @@ -2,6 +2,7 @@ from django.http import HttpResponse from django_filters.rest_framework import DjangoFilterBackend from rest_framework import status +from rest_framework.generics import get_object_or_404 from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView @@ -10,7 +11,7 @@ from authentication.api.permissions import IsAdminOrDeviceOrReadOnly from reagents.models import Container from reagents.serializer import ContainerSerializer -from reagents.services import generate_pdf_with_barcode +from reagents.services import generate_pdf_with_barcode, generate_unique_container_id class ContainerModelViewSet(ModelViewSet): @@ -20,6 +21,14 @@ class ContainerModelViewSet(ModelViewSet): filter_backends = [DjangoFilterBackend] filterset_fields = ["precursor"] + def get_object(self): + container_id = self.kwargs["pk"] + return get_object_or_404(Container, container_id=container_id) + + def perform_create(self, serializer): + container_id = generate_unique_container_id() + serializer.save(container_id=container_id) + class ReagentsViewSet(APIView): permission_classes = [IsAuthenticated] diff --git a/reagents/migrations/0002_alter_container_container_id.py b/reagents/migrations/0002_alter_container_container_id.py new file mode 100644 index 0000000..bef3a26 --- /dev/null +++ b/reagents/migrations/0002_alter_container_container_id.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.6 on 2024-09-28 15:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("reagents", "0001_initial"), + ] + + operations = [ + migrations.AlterField( + model_name="container", + name="container_id", + field=models.BigIntegerField(blank=True, unique=True), + ), + ] diff --git a/reagents/models.py b/reagents/models.py index 5a7b7dd..f8ccc02 100644 --- a/reagents/models.py +++ b/reagents/models.py @@ -2,7 +2,7 @@ class Container(models.Model): - container_id = models.IntegerField(unique=True, null=False, blank=False) + container_id = models.BigIntegerField(unique=True, null=False, blank=True) name = models.CharField(max_length=100, null=False, blank=False) formula = models.CharField(max_length=100, null=False, blank=False) mass = models.FloatField(null=False, blank=False) diff --git a/reagents/services.py b/reagents/services.py index 1c0527f..8197008 100644 --- a/reagents/services.py +++ b/reagents/services.py @@ -1,4 +1,5 @@ import io +import random import barcode from barcode.writer import ImageWriter @@ -8,6 +9,17 @@ from reportlab.lib.utils import ImageReader from reportlab.pdfgen import canvas +from reagents.models import Container + + +def generate_unique_container_id() -> int: + """Генерация уникального идентификатора контейнера""" + while True: + container_id = random.randint(100000000000, 999999999999) + + if not Container.objects.filter(container_id=container_id).exists(): + return container_id + def generate_barcode_image(code: str, format_barcode: str) -> io.BytesIO: """Генерация штрих-кода с использованием python-barcode"""