added print, download as pdf. no puppeteer, we'll see

This commit is contained in:
2026-09-22 22:06:06 +03:00
parent 122480cd46
commit 6f614270e7
37 changed files with 3955 additions and 473 deletions
@@ -0,0 +1,21 @@
# Generated by Django 6.0.1 on 2026-09-21 16:21
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
(
"vehicles",
"0006_vehicle_gross_manual_date_vehicle_gross_manual_note_and_more",
),
]
operations = [
migrations.AddField(
model_name="vehicle",
name="driver_name",
field=models.CharField(blank=True, max_length=50, null=True),
),
]
@@ -0,0 +1,55 @@
# Generated by Django 6.0.1 on 2026-09-22 17:53
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("vehicles", "0007_vehicle_driver_name"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name="vehicle",
name="is_void",
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name="vehicle",
name="void_date",
field=models.DateTimeField(blank=True, null=True),
),
migrations.AddField(
model_name="vehicle",
name="void_reason",
field=models.CharField(blank=True, max_length=255, null=True),
),
migrations.AddField(
model_name="vehicle",
name="void_user",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="user_vehicle_void",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="vehicle",
name="vehicle_number",
field=models.CharField(max_length=15),
),
migrations.AddConstraint(
model_name="vehicle",
constraint=models.UniqueConstraint(
condition=models.Q(("doc_number__isnull", True)),
fields=("vehicle_number",),
name="unique_active_vehicle_number",
),
),
]
+15 -2
View File
@@ -8,11 +8,12 @@ from api.models import User
# Create your models here.
class Vehicle(models.Model):
vehicle_number = models.CharField(max_length=15, unique=True)
vehicle_number = models.CharField(max_length=15)
trailer1_number = models.CharField(max_length=15, null=True, blank=True)
trailer2_number = models.CharField(max_length=15, null=True, blank=True)
driver_pid = models.CharField(max_length=50, null=True, blank=True)
driver_name = models.CharField(max_length=50, null=True, blank=True)
tare = models.IntegerField(null=True, blank=True)
tare_date = models.DateTimeField(null=True, blank=True)
tare_user = models.ForeignKey(User, null=True, blank=True, related_name='user_vehicle_tare', on_delete=models.SET_NULL)
@@ -35,7 +36,19 @@ class Vehicle(models.Model):
doc_number = models.CharField(max_length=20, null=True, blank=True, unique=True)
is_void = models.BooleanField(default=False)
void_date = models.DateTimeField(null=True, blank=True)
void_user = models.ForeignKey(User, null=True, blank=True, related_name='user_vehicle_void', on_delete=models.SET_NULL)
void_reason = models.CharField(max_length=255, null=True, blank=True)
class Meta:
constraints = [
models.UniqueConstraint(
fields=['vehicle_number'],
condition=models.Q(doc_number__isnull=True),
name='unique_active_vehicle_number',
),
]
def __str__(self):
return f"{self.vehicle_number}"
+7 -1
View File
@@ -4,4 +4,10 @@ from .models import Vehicle
class VehicleSerializer(serializers.ModelSerializer):
class Meta:
model = Vehicle
fields = ['id', 'vehicle_number', 'trailer1_number', 'trailer2_number', 'driver_pid', 'tare', 'tare_date', 'tare_user', 'gross', 'gross_date', 'gross_user']
fields = ['id', 'vehicle_number', 'trailer1_number', 'trailer2_number', 'driver_pid', 'driver_name', 'tare', 'tare_date', 'tare_user', 'gross', 'gross_date', 'gross_user']
def validate(self, attrs):
"""Require driver_name on creation only; existing vehicles may have it as NULL."""
if self.instance is None and not attrs.get('driver_name'):
raise serializers.ValidationError({'driver_name': 'This field is required.'})
return attrs