models.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. from django.contrib.auth.models import User
  2. from django.db import models
  3. from martor.models import MartorField
  4. class BaseModel(models.Model):
  5. created = models.DateTimeField(auto_now_add=True)
  6. updated = models.DateTimeField(auto_now=True)
  7. objects = models.Manager()
  8. class Meta:
  9. abstract = True
  10. def model_name(self):
  11. return self._meta.verbose_name
  12. class Project(BaseModel):
  13. class Meta:
  14. verbose_name = "projet"
  15. verbose_name_plural = "projets"
  16. name = models.CharField(max_length=200)
  17. description = models.TextField(default="", blank=True)
  18. # icon
  19. owner = models.ForeignKey(User,
  20. on_delete=models.PROTECT,
  21. null=True,
  22. related_name="projects",
  23. related_query_name="project")
  24. def __str__(self):
  25. return self.name
  26. class Epic(BaseModel):
  27. class Meta:
  28. verbose_name = "epic"
  29. verbose_name_plural = "epics"
  30. ordering = ('-value', )
  31. SIZES = (("XXS","XXS (< 1 sprints)"),
  32. ("XS", "XS (1 sprint)"),
  33. ("S", "S (1-2 sprints)"),
  34. ("M", "M (2-3 sprints)"),
  35. ("L", "L (3-4 sprints)"),
  36. ("XL", "XL (4-6 sprints)"),
  37. ("XXL", "XXL (> 6 sprints)"))
  38. name = models.CharField(max_length=200, default="", verbose_name="Nom")
  39. size = models.CharField(max_length=10, default="M", choices=SIZES, verbose_name="Taille")
  40. value = models.IntegerField(default=0, verbose_name="Valeur")
  41. description = models.TextField(default="", blank=True, verbose_name="Description")
  42. project = models.ForeignKey(Project, on_delete=models.PROTECT, null=True, verbose_name="Projet")
  43. closed = models.BooleanField(default=False, verbose_name="Clôturée")
  44. def __str__(self):
  45. return self.name
  46. def nb_stories(self):
  47. return len(self.stories.all())
  48. def nb_closed_stories(self):
  49. return len(self.stories.filter(closed=True))
  50. class Sprint(BaseModel):
  51. class Meta:
  52. verbose_name_plural = "sprint"
  53. verbose_name_plural = "sprints"
  54. ordering = ('-date_start', )
  55. date_start = models.DateField()
  56. date_end = models.DateField()
  57. def __str__(self):
  58. return "Sprint #{} ({:%d/%m/%Y} > {:%d/%m/%Y})".format(self.id, self.date_start, self.date_end)
  59. class Story(BaseModel):
  60. class Meta:
  61. verbose_name = "story"
  62. verbose_name_plural = "stories"
  63. ordering = ('closed', '-updated')
  64. epic = models.ForeignKey(Epic, on_delete=models.PROTECT, null=True, related_name="stories", verbose_name="Epic")
  65. name = models.CharField(max_length=200, default="", verbose_name="Nom")
  66. description = MartorField(verbose_name="Description")
  67. closed = models.BooleanField(default=False, verbose_name="Clôturée")
  68. author = models.ForeignKey(User,
  69. on_delete=models.PROTECT,
  70. null=True,
  71. related_name="stories",
  72. related_query_name="story",
  73. verbose_name="Auteur")
  74. assignees = models.ManyToManyField(User,
  75. related_name="assigned",
  76. verbose_name="Assignés")
  77. sprints = models.ManyToManyField(Sprint,
  78. related_name="stories",
  79. related_query_name="story",
  80. verbose_name="Sprints")
  81. def __str__(self):
  82. return self.name