models.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from django.db import models
  2. class AuthoringDatesModel(models.Model):
  3. created_at = models.DateTimeField(auto_now_add=True, null=True)
  4. modified_at = models.DateTimeField(auto_now=True)
  5. class Meta:
  6. abstract = True
  7. class Source(AuthoringDatesModel):
  8. name = models.CharField(max_length=150)
  9. class OnlineSource(Source):
  10. url = models.URLField(max_length=200)
  11. class PhysicalSource(Source):
  12. # TODO auto add coordinates by searching shop address
  13. latitude = models.FloatField()
  14. longitude = models.FloatField()
  15. class Category(AuthoringDatesModel):
  16. name = models.CharField(max_length=150)
  17. type = models.CharField(
  18. max_length=20,
  19. choices=[
  20. ("Fixed", "Fixed expense"),
  21. ("Variable", "Variable expense"),
  22. ],
  23. default="Variable",
  24. )
  25. # Surcharge de la manière d'afficher un objet sensor
  26. def __str__(self):
  27. return self.name
  28. class Meta:
  29. # db_table = 'book' # Permet de personnaliser le nom de la table en BDD
  30. verbose_name = "Category" # Le nom lisbile du modèle
  31. verbose_name_plural = "Categories" # Le nom au pluriel du modèle
  32. ordering = ("name", "type") # Le tri par défaut dans les listes
  33. class MetaExpense(AuthoringDatesModel):
  34. category = models.OneToOneField(
  35. Category,
  36. related_name="%(app_label)s_%(class)s_related",
  37. on_delete=models.PROTECT,
  38. )
  39. source = models.OneToOneField(
  40. Source, related_name="%(app_label)s_%(class)s_related", on_delete=models.PROTECT
  41. )
  42. class Meta:
  43. abstract = True
  44. class RawExpense(models.Model):
  45. name = models.CharField(max_length=150)
  46. date = models.DateField()
  47. amount = models.DecimalField(max_digits=10, decimal_places=2)
  48. class Expense(RawExpense, MetaExpense):
  49. # Surcharge de la manière d'afficher un objet sensor
  50. def __str__(self):
  51. return self.name
  52. class Meta:
  53. # db_table = 'book' # Permet de personnaliser le nom de la table en BDD
  54. verbose_name = "Expense" # Le nom lisbile du modèle
  55. verbose_name_plural = "Expenses" # Le nom au pluriel du modèle
  56. ordering = ("name", "date", "amount") # Le tri par défaut dans les listes
  57. class MultiplePaymentExepense(MetaExpense):
  58. name = models.CharField(max_length=150)
  59. first_payment_date = models.DateField()
  60. amount = models.DecimalField(max_digits=10, decimal_places=2)
  61. payments = models.ForeignKey(
  62. RawExpense, related_name="multiple_payment_expense", on_delete=models.PROTECT
  63. )
  64. number_of_payment = models.PositiveIntegerField()