84 lines
3.6 KiB
Python
84 lines
3.6 KiB
Python
import hashlib
|
|
import json
|
|
|
|
from typing import Required
|
|
from django.db import models
|
|
|
|
from api.models import User
|
|
|
|
# Create your models here.
|
|
class Vehicle(models.Model):
|
|
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)
|
|
tare_manual = models.BooleanField(default=False)
|
|
tare_manual_user = models.ForeignKey(User, null=True, blank=True, related_name='user_vehicle_tare_manual', on_delete=models.SET_NULL)
|
|
tare_manual_date = models.DateTimeField(null=True, blank=True)
|
|
tare_manual_note = models.CharField(max_length=255, null=True, blank=True)
|
|
|
|
gross = models.IntegerField(null=True, blank=True)
|
|
gross_date = models.DateTimeField(null=True, blank=True)
|
|
gross_user = models.ForeignKey(User, null=True, blank=True, related_name='user_vehicle_gross', on_delete=models.SET_NULL)
|
|
gross_manual = models.BooleanField(default=False)
|
|
gross_manual_user = models.ForeignKey(User, null=True, blank=True, related_name='user_vehicle_gross_manual', on_delete=models.SET_NULL)
|
|
gross_manual_date = models.DateTimeField(null=True, blank=True)
|
|
gross_manual_note = models.CharField(max_length=255, null=True, blank=True)
|
|
|
|
net = models.IntegerField(null=True, blank=True)
|
|
net_date = models.DateTimeField(null=True, blank=True)
|
|
net_user = models.ForeignKey(User, null=True, blank=True, related_name='user_vehicle_net', on_delete=models.SET_NULL)
|
|
|
|
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}"
|
|
|
|
class VehicleExtra(models.Model):
|
|
vehicle = models.OneToOneField(
|
|
Vehicle, on_delete=models.CASCADE, related_name="extra"
|
|
)
|
|
data = models.JSONField(default=dict)
|
|
|
|
|
|
def combination_hash(data):
|
|
"""Order-independent canonical hash of a {nomenclature_code: entry_id} dict."""
|
|
canonical = json.dumps(data, sort_keys=True, separators=(',', ':'))
|
|
return hashlib.sha256(canonical.encode('utf-8')).hexdigest()
|
|
|
|
|
|
class ExtraCombination(models.Model):
|
|
"""A previously-used combination of lookup nomenclature values for a vehicle's extra data."""
|
|
data = models.JSONField(default=dict)
|
|
data_hash = models.CharField(max_length=64, unique=True, editable=False)
|
|
use_count = models.IntegerField(default=1)
|
|
last_used = models.DateTimeField(auto_now_add=True)
|
|
|
|
class Meta:
|
|
ordering = ["-last_used"]
|
|
|
|
def save(self, *args, **kwargs):
|
|
self.data_hash = combination_hash(self.data)
|
|
super().save(*args, **kwargs)
|
|
|
|
def __str__(self):
|
|
return f"{self.data} (x{self.use_count})" |