diff --git a/greenmine/scrum/choices.py b/greenmine/scrum/choices.py index 9dcfcc7a..06c31134 100644 --- a/greenmine/scrum/choices.py +++ b/greenmine/scrum/choices.py @@ -45,18 +45,18 @@ ISSUETYPES = ( ) POINTS_CHOICES = ( - (-1, u'?'), - (0, u'0'), - (-2, u'1/2'), - (1, u'1'), - (2, u'2'), - (3, u'3'), - (5, u'5'), - (8, u'8'), - (10, u'10'), - (15, u'15'), - (20, u'20'), - (40, u'40'), + (1, u'?', None), + (2, u'0', 0), + (3, u'1/2', 0.5), + (4, u'1', 1), + (5, u'2', 2), + (6, u'3', 3), + (7, u'5', 5), + (8, u'8', 8), + (9, u'10', 10), + (10, u'15', 15), + (11, u'20', 20), + (12, u'40', 40), ) diff --git a/greenmine/scrum/management/commands/sample_data.py b/greenmine/scrum/management/commands/sample_data.py index 8447d05a..32767513 100644 --- a/greenmine/scrum/management/commands/sample_data.py +++ b/greenmine/scrum/management/commands/sample_data.py @@ -149,10 +149,17 @@ class Command(BaseCommand): status=self.sd.db_object_from_queryset(UserStoryStatus.objects.filter(project=project)), tags=[] ) - if milestone: - us.points=self.sd.db_object_from_queryset(Points.objects.filter(project=project).exclude(order=0)) - else: - us.points=self.sd.db_object_from_queryset(Points.objects.filter(project=project)) + + for role in project.list_roles: + if milestone: + points=self.sd.db_object_from_queryset(Points.objects.filter(project=project).exclude(order=0)) + else: + points=self.sd.db_object_from_queryset(Points.objects.filter(project=project)) + + RolePoints.objects.create( + user_story=us, + points=points, + role=role) for tag in self.sd.words().split(" "): us.tags.append(tag) diff --git a/greenmine/scrum/models.py b/greenmine/scrum/models.py index 23638756..e5e3a3cb 100644 --- a/greenmine/scrum/models.py +++ b/greenmine/scrum/models.py @@ -6,6 +6,7 @@ from django.dispatch import receiver from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes import generic from django.utils.translation import ugettext_lazy as _ +from django.db.models.loading import get_model from picklefield.fields import PickledObjectField @@ -144,6 +145,8 @@ class Points(models.Model): verbose_name=_('name')) order = models.IntegerField(default=10, null=False, blank=False, verbose_name=_('order')) + value = models.FloatField(default=None, null=True, blank=True, + verbose_name=_('value')) project = models.ForeignKey('Project', null=False, blank=False, related_name='points', verbose_name=_('project')) @@ -169,7 +172,8 @@ class Points(models.Model): class Membership(models.Model): user = models.ForeignKey('base.User', null=False, blank=False) - project = models.ForeignKey('Project', null=False, blank=False) + project = models.ForeignKey('Project', null=False, blank=False, + related_name="memberships") role = models.ForeignKey('base.Role', null=False, blank=False) class Meta: @@ -243,6 +247,11 @@ class Project(models.Model): } for milestone in self.milestones.all().order_by('estimated_start') ] + @property + def list_roles(self): + role_model = get_model('base', 'Role') + return role_model.objects.filter(id__in=list(self.memberships.values_list('role', flat=True))) + class Milestone(models.Model): uuid = models.CharField( @@ -345,6 +354,18 @@ class Milestone(models.Model): return sum(points) +class RolePoints(models.Model): + user_story = models.ForeignKey('UserStory', null=False, blank=False, + related_name='role_points', + verbose_name=_('user story')) + role = models.ForeignKey('base.Role', null=False, blank=False, + related_name='role_points', + verbose_name=_('role')) + points = models.ForeignKey('Points', null=False, blank=False, + related_name='role_points', + verbose_name=_('points')) + + class UserStory(models.Model): uuid = models.CharField(max_length=40, unique=True, null=False, blank=True, verbose_name=_('uuid')) @@ -362,9 +383,10 @@ class UserStory(models.Model): status = models.ForeignKey('UserStoryStatus', null=False, blank=False, related_name='user_stories', verbose_name=_('status')) - points = models.ForeignKey('Points', null=False, blank=False, + points = models.ManyToManyField('Points', null=False, blank=False, related_name='userstories', - verbose_name=_('points')) + verbose_name=_('points'), + through="RolePoints") order = models.PositiveSmallIntegerField(null=False, blank=False, default=100, verbose_name=_('order')) created_date = models.DateTimeField(auto_now_add=True, null=False, blank=False, @@ -613,8 +635,9 @@ def project_post_save(sender, instance, created, **kwargs): for order, name in SEVERITY_CHOICES: Severity.objects.create(project=instance, name=name, order=order) - for order, name in POINTS_CHOICES: - Points.objects.create(project=instance, name=name, order=order) + for order, name, value in POINTS_CHOICES: + + Points.objects.create(project=instance, name=name, order=order, value=value) for order, name in ISSUETYPES: IssueType.objects.create(project=instance, name=name, order=order)