77 lines
2.6 KiB
Python
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"
|