Add MonthlyTrip model and MonthlyTripView
This commit is contained in:
parent
0a4f3da34c
commit
646845e44d
7 changed files with 169 additions and 42 deletions
|
@ -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):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue