autoilux/main/models.py

77 lines
2.6 KiB
Python

from datetime import date
from django.db import models
from django.db.models import F, Q
class FuelPurchase(models.Model):
GAS_STATION_CHOICES = [
(0, '-'),
(1, 'Neste'),
(2, 'Teboil'),
(3, 'ABC'),
(4, 'Shell'),
(5, 'St1'),
(6, 'SEO'),
(7, 'ysi5'),
]
OCTANE_CHOICES = [
(95, '95'),
(98, '98'),
]
CAR_CHOICES = [
(0, '_'),
(1, 'Renault'),
(2, 'Nissan'),
(3, 'Smart'),
]
purchase_date = models.DateField(null=False, blank=False, default=date.today, verbose_name="Purchase Date")
total_cost = models.DecimalField(null=False, blank=False, max_digits=10, decimal_places=2, verbose_name="Total Cost (€)")
price_per_litre = models.DecimalField(null=False, blank=False, max_digits=6, decimal_places=3, verbose_name="Price per Litre (€)")
amount_litres = models.DecimalField(null=False, blank=False, max_digits=7, decimal_places=2, verbose_name="Amount (litres)")
octane = models.IntegerField(choices=OCTANE_CHOICES, default=95, verbose_name="Octane")
gas_station = models.IntegerField(choices=GAS_STATION_CHOICES, default=1, verbose_name="Gas Station")
car = models.IntegerField(choices=CAR_CHOICES, default=3, verbose_name="Car")
class Meta:
constraints = [
models.UniqueConstraint(
fields=[
'purchase_date',
'total_cost',
'price_per_litre',
'amount_litres',
'octane',
'gas_station',
'car',
],
name='unique_fuel_purchase'
),
models.CheckConstraint(
check=Q(total_cost__gt=0) & Q(total_cost__lt=100),
name="total_cost_range"
),
models.CheckConstraint(
check=Q(price_per_litre__gt=0) & Q(price_per_litre__lt=5),
name="price_per_litre_range"
),
models.CheckConstraint(
check=Q(amount_litres__gt=0) & Q(amount_litres__lt=100),
name="amount_litres_range"
),
]
verbose_name = "Fuel Purchase"
verbose_name_plural = "Fuel Purchases"
def save(self, *args, **kwargs):
if not self.amount_litres and self.price_per_litre:
self.amount_litres = self.total_cost / self.price_per_litre
super().save(*args, **kwargs)
def __str__(self):
date_str = self.purchase_date.strftime("%d.%m.%Y")
return f"{date_str} : {self.total_cost} € - {self.price_per_litre} €/L"