models.py 3.3 KB

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