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"