models.py 3.4 KB

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