70 lines
2.1 KiB
Python
70 lines
2.1 KiB
Python
from rest_framework.exceptions import ValidationError
|
|
from django.db import transaction
|
|
from .models import Vehicle, WorkOrder, VehicleServiceRecord
|
|
from decimal import Decimal
|
|
|
|
|
|
class VehicleService:
|
|
@staticmethod
|
|
def create_vehicle(data: dict) -> Vehicle:
|
|
vehicle = Vehicle(**data)
|
|
try:
|
|
vehicle.full_clean()
|
|
except Exception as e:
|
|
raise ValidationError({"detail": str(e)})
|
|
|
|
vehicle.save()
|
|
return vehicle
|
|
|
|
@staticmethod
|
|
def update_vehicle(instance: Vehicle, data: dict) -> Vehicle:
|
|
for k, v in data.items():
|
|
setattr(instance, k, v)
|
|
try:
|
|
instance.full_clean()
|
|
except Exception as e:
|
|
raise ValidationError({"detail": str(e)})
|
|
instance.save()
|
|
return instance
|
|
|
|
@staticmethod
|
|
def create_work_order(data: dict) -> WorkOrder:
|
|
# expecting creator in data
|
|
wo = WorkOrder(**data)
|
|
try:
|
|
wo.full_clean()
|
|
except Exception as e:
|
|
raise ValidationError({"detail": str(e)})
|
|
|
|
# save will handle updating vehicle mileage if end_mileage set
|
|
with transaction.atomic():
|
|
wo.save()
|
|
return wo
|
|
|
|
@staticmethod
|
|
def update_work_order(instance: WorkOrder, data: dict) -> WorkOrder:
|
|
for k, v in data.items():
|
|
setattr(instance, k, v)
|
|
try:
|
|
instance.full_clean()
|
|
except Exception as e:
|
|
raise ValidationError({"detail": str(e)})
|
|
with transaction.atomic():
|
|
instance.save()
|
|
return instance
|
|
|
|
@staticmethod
|
|
def create_service_record(data: dict) -> VehicleServiceRecord:
|
|
rec = VehicleServiceRecord(**data)
|
|
try:
|
|
rec.full_clean()
|
|
except Exception as e:
|
|
raise ValidationError({"detail": str(e)})
|
|
with transaction.atomic():
|
|
rec.save()
|
|
# optionally update vehicle.current_mileage if rec.mileage > current
|
|
v = rec.vehicle
|
|
if rec.mileage and rec.mileage > (v.current_mileage or 0):
|
|
v.current_mileage = rec.mileage
|
|
v.save()
|
|
return rec |