from django.db import models class AuthoringDatesModel(models.Model): created_at = models.DateTimeField(auto_now_add=True, null=True) modified_at = models.DateTimeField(auto_now=True) class Meta: abstract = True class Source(AuthoringDatesModel): name = models.CharField(max_length=150) class OnlineSource(Source): url = models.URLField(max_length=200) class PhysicalSource(Source): # TODO auto add coordinates by searching shop address latitude = models.FloatField() longitude = models.FloatField() class Category(AuthoringDatesModel): name = models.CharField(max_length=150) type = models.CharField( max_length=20, choices=[ ("Fixed", "Fixed expense"), ("Variable", "Variable expense"), ], default="Variable", ) # Surcharge de la manière d'afficher un objet sensor def __str__(self): return self.name class Meta: # db_table = 'book' # Permet de personnaliser le nom de la table en BDD verbose_name = "Category" # Le nom lisbile du modèle verbose_name_plural = "Categories" # Le nom au pluriel du modèle ordering = ("name", "type") # Le tri par défaut dans les listes class MetaExpense(AuthoringDatesModel): category = models.OneToOneField( Category, related_name="%(app_label)s_%(class)s_related", on_delete=models.PROTECT, ) source = models.OneToOneField( Source, related_name="%(app_label)s_%(class)s_related", on_delete=models.PROTECT ) class Meta: abstract = True class RawExpense(models.Model): name = models.CharField(max_length=150) date = models.DateField() amount = models.DecimalField(max_digits=10, decimal_places=2) class Expense(RawExpense, MetaExpense): # Surcharge de la manière d'afficher un objet sensor def __str__(self): return self.name class Meta: # db_table = 'book' # Permet de personnaliser le nom de la table en BDD verbose_name = "Expense" # Le nom lisbile du modèle verbose_name_plural = "Expenses" # Le nom au pluriel du modèle ordering = ("name", "date", "amount") # Le tri par défaut dans les listes class MultiplePaymentExepense(MetaExpense): name = models.CharField(max_length=150) first_payment_date = models.DateField() amount = models.DecimalField(max_digits=10, decimal_places=2) payments = models.ForeignKey( RawExpense, related_name="multiple_payment_expense", on_delete=models.PROTECT ) number_of_payment = models.PositiveIntegerField()