models.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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="")
  39. size = models.CharField(max_length=10, default="M", choices=SIZES)
  40. value = models.IntegerField(default=0)
  41. description = models.TextField(default="", blank=True)
  42. project = models.ForeignKey(Project, on_delete=models.PROTECT, null=True)
  43. def __str__(self):
  44. return self.name
  45. class Sprint(BaseModel):
  46. class Meta:
  47. verbose_name_plural = "sprint"
  48. verbose_name_plural = "sprints"
  49. ordering = ('date_start', )
  50. date_start = models.DateField()
  51. date_end = models.DateField()
  52. def __str__(self):
  53. return "Sprint #{} ({:%d/%m/%Y} > {:%d/%m/%Y})".format(self.id, self.date_start, self.date_end)
  54. class Story(BaseModel):
  55. class Meta:
  56. verbose_name = "story"
  57. verbose_name_plural = "stories"
  58. ordering = ('-updated', )
  59. epic = models.ForeignKey(Epic, on_delete=models.PROTECT, null=True)
  60. name = models.CharField(max_length=200, default="")
  61. description = MartorField()
  62. closed = models.BooleanField(default=False)
  63. author = models.ForeignKey(User,
  64. on_delete=models.PROTECT,
  65. null=True,
  66. related_name="stories",
  67. related_query_name="story")
  68. assignees = models.ManyToManyField(User,
  69. related_name="assigned")
  70. sprints = models.ManyToManyField(Sprint,
  71. related_name="stories",
  72. related_query_name="story")
  73. def __str__(self):
  74. return self.name