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