Add MonthlyTrip model and MonthlyTripView

This commit is contained in:
Nyymix 2025-08-10 17:00:43 +03:00
parent 0a4f3da34c
commit 646845e44d
7 changed files with 169 additions and 42 deletions

View file

@ -1,20 +1,41 @@
from datetime import date
from django.db import models
from django.db.models import F, Q
from django.db.models import Q
class MonthlyTrip(models.Model):
MONTH_CHOICES = [
(1, 'January'), (2, 'February'), (3, 'March'), (4, 'April'),
(5, 'May'), (6, 'June'), (7, 'July'), (8, 'August'),
(9, 'September'), (10, 'October'), (11, 'November'), (12, 'December'),
]
year = models.PositiveIntegerField(verbose_name="Year")
month = models.PositiveSmallIntegerField(choices=MONTH_CHOICES, verbose_name="Month")
kilometers = models.PositiveIntegerField(default=0, verbose_name="Kilometers")
class Meta:
constraints = [
models.UniqueConstraint(fields=['year', 'month'], name='unique_monthly_trip')
]
verbose_name = "Monthly Trip"
verbose_name_plural = "Monthly Trips"
def __str__(self):
return f"{self.month:02d}.{self.year} : {self.kilometers} km"
class FuelPurchase(models.Model):
GAS_STATION_CHOICES = [
(0, '-'),
(0, 'Unknown'),
(1, 'Neste'),
(2, 'Teboil'),
(3, 'ABC'),
(4, 'Shell'),
(5, 'St1'),
(6, 'SEO'),
(7, 'ysi5'),
(7, 'Ysi5'),
]
OCTANE_CHOICES = [
@ -23,19 +44,20 @@ class FuelPurchase(models.Model):
]
CAR_CHOICES = [
(0, '_'),
(0, 'Unknown'),
(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")
purchase_date = models.DateField(default=date.today, verbose_name="Purchase Date")
total_cost = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="Total Cost (€)")
price_per_litre = models.DecimalField(max_digits=6, decimal_places=3, verbose_name="Price per Litre (€)")
amount_litres = models.DecimalField(max_digits=7, decimal_places=2, verbose_name="Amount (litres)")
octane = models.PositiveSmallIntegerField(choices=OCTANE_CHOICES, default=95, verbose_name="Octane")
gas_station = models.PositiveSmallIntegerField(choices=GAS_STATION_CHOICES, default=0, verbose_name="Gas Station")
car = models.PositiveSmallIntegerField(choices=CAR_CHOICES, default=0, verbose_name="Car")
monthly_trip = models.ForeignKey(MonthlyTrip, on_delete=models.CASCADE, related_name='fuel_purchases', verbose_name="Monthly Trip")
class Meta:
constraints = [
@ -51,25 +73,28 @@ class FuelPurchase(models.Model):
],
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"
),
models.CheckConstraint(check=Q(total_cost__gt=0) & Q(total_cost__lt=1000), 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
if not self.monthly_trip_id:
month = self.purchase_date.month
year = self.purchase_date.year
monthly_trip, created = MonthlyTrip.objects.get_or_create(
year=year,
month=month,
defaults={'kilometers': 0}
)
self.monthly_trip = monthly_trip
super().save(*args, **kwargs)
def __str__(self):