diff --git a/greenmine/base/users/models.py b/greenmine/base/users/models.py index f1637600..e972e990 100644 --- a/greenmine/base/users/models.py +++ b/greenmine/base/users/models.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from django.db import models +from django.dispatch import receiver from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import UserManager, AbstractUser @@ -37,6 +38,7 @@ class Role(models.Model): verbose_name=_('permissions')) order = models.IntegerField(default=10, null=False, blank=False, verbose_name=_("order")) + computable = models.BooleanField(default=True) class Meta: verbose_name = 'role' @@ -45,3 +47,18 @@ class Role(models.Model): def __str__(self): return self.name + + +# On Role object is changed, update all membership +# related to current role. +@receiver(models.signals.post_save, sender=Role, + dispatch_uid='role_post_save') +def role_post_save(sender, instance, created, **kwargs): + # ignore if object is just created + if created: + return + + unique_projects = set(map(lambda x: x.project, instance.memberships.all())) + for project in unique_projects: + project.update_role_points() + diff --git a/greenmine/base/users/serializers.py b/greenmine/base/users/serializers.py index ec8c0c7a..8f2644e9 100644 --- a/greenmine/base/users/serializers.py +++ b/greenmine/base/users/serializers.py @@ -33,4 +33,4 @@ class RecoverySerializer(serializers.Serializer): class RoleSerializer(serializers.ModelSerializer): class Meta: model = Role - fields = ('id', 'name', 'slug', 'permissions',) + fields = ('id', 'name', 'slug', 'permissions', 'computable') diff --git a/greenmine/projects/models.py b/greenmine/projects/models.py index ea79909e..99bed5dc 100644 --- a/greenmine/projects/models.py +++ b/greenmine/projects/models.py @@ -133,7 +133,7 @@ class Project(models.Model): rolepoints_model = get_model("userstories", "RolePoints") # Get all available roles on this project - roles = self.get_roles() + roles = self.get_roles().filter(computable=True) # Get point instance that represent a null/undefined null_points_value = self.points.get(value=None)