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, unique=True) 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) 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) 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})"