from django.contrib.auth.models import User from django.db import models from martor.models import MartorField class BaseModel(models.Model): created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) objects = models.Manager() class Meta: abstract = True def model_name(self): return self._meta.verbose_name class Project(BaseModel): class Meta: verbose_name = "projet" verbose_name_plural = "projets" name = models.CharField(max_length=200) description = models.TextField(default="", blank=True) # icon owner = models.ForeignKey(User, on_delete=models.PROTECT, null=True, related_name="projects", related_query_name="project") def __str__(self): return self.name class Epic(BaseModel): class Meta: verbose_name = "epic" verbose_name_plural = "epics" ordering = ('-value', ) SIZES = (("XXS","XXS (< 1 sprints)"), ("XS", "XS (1 sprint)"), ("S", "S (1-2 sprints)"), ("M", "M (2-3 sprints)"), ("L", "L (3-4 sprints)"), ("XL", "XL (4-6 sprints)"), ("XXL", "XXL (> 6 sprints)")) name = models.CharField(max_length=200, default="", verbose_name="Nom") size = models.CharField(max_length=10, default="M", choices=SIZES, verbose_name="Taille") value = models.IntegerField(default=0, verbose_name="Valeur") description = models.TextField(default="", blank=True, verbose_name="Description") project = models.ForeignKey(Project, on_delete=models.PROTECT, null=True, verbose_name="Projet") closed = models.BooleanField(default=False, verbose_name="Clôturée") def __str__(self): return self.name def nb_stories(self): return len(self.stories.all()) def nb_closed_stories(self): return len(self.stories.filter(closed=True)) class Sprint(BaseModel): class Meta: verbose_name_plural = "sprint" verbose_name_plural = "sprints" ordering = ('-date_start', ) date_start = models.DateField() date_end = models.DateField() def __str__(self): return "Sprint #{} ({:%d/%m/%Y} > {:%d/%m/%Y})".format(self.id, self.date_start, self.date_end) class Story(BaseModel): class Meta: verbose_name = "story" verbose_name_plural = "stories" ordering = ('closed', '-updated') epic = models.ForeignKey(Epic, on_delete=models.PROTECT, null=True, related_name="stories", verbose_name="Epic") name = models.CharField(max_length=200, default="", verbose_name="Nom") description = MartorField(verbose_name="Description") closed = models.BooleanField(default=False, verbose_name="Clôturée") author = models.ForeignKey(User, on_delete=models.PROTECT, null=True, related_name="stories", related_query_name="story", verbose_name="Auteur") assignees = models.ManyToManyField(User, related_name="assigned", verbose_name="Assignés") sprints = models.ManyToManyField(Sprint, related_name="stories", related_query_name="story", verbose_name="Sprints") def __str__(self): return self.name