From 11a63151e0a03d76e4aab0b32d758268e6edec60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Fri, 22 Mar 2013 18:13:01 +0100 Subject: [PATCH] Working on permissions and groups generation --- greenmine/base/admin.py | 4 ++++ greenmine/profile/models.py | 24 ++++++++++++++++++++---- greenmine/profile/services.py | 19 +++++++++++++------ greenmine/profile/sigdispatch.py | 26 -------------------------- greenmine/scrum/sigdispatch.py | 11 +++++++++++ 5 files changed, 48 insertions(+), 36 deletions(-) create mode 100644 greenmine/base/admin.py delete mode 100644 greenmine/profile/sigdispatch.py diff --git a/greenmine/base/admin.py b/greenmine/base/admin.py new file mode 100644 index 00000000..4027d384 --- /dev/null +++ b/greenmine/base/admin.py @@ -0,0 +1,4 @@ +from django.contrib import admin +from django.contrib.auth.models import Group + +admin.site.unregister(Group) diff --git a/greenmine/profile/models.py b/greenmine/profile/models.py index 4f950b8e..66d74c80 100644 --- a/greenmine/profile/models.py +++ b/greenmine/profile/models.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- from django.db import models +from django.db.models.signals import post_save +from django.dispatch import receiver from django.utils.translation import ugettext_lazy as _ -from django.contrib.auth.models import Permission, Group - +from django.contrib.auth.models import User, Group class Profile(models.Model): user = models.OneToOneField("auth.User", related_name='profile') @@ -23,7 +24,7 @@ class Profile(models.Model): class Role(models.Model): name = models.CharField(max_length=200) slug = models.SlugField(max_length=250, unique=True, blank=True) - permissions = models.ManyToManyField(Permission, + permissions = models.ManyToManyField('auth.Permission', verbose_name=_('permissions'), blank=True) def __unicode__(self): @@ -34,4 +35,19 @@ if not hasattr(Group, 'role'): field.contribute_to_class(Group, 'role') -from . import sigdispatch +@receiver(post_save, sender=User) +def user_post_save(sender, instance, created, **kwargs): + """ + Create void user profile if instance is a new user. + """ + if created and not Profile.objects.filter(user=instance).exists(): + Profile.objects.create(user=instance) + +@receiver(post_save, sender=Role) +def role_post_save(sender, instance, **kwargs): + from greenmine.profile.services import RoleGroupsService + + """ + Recalculate projects groups + """ + RoleGroupsService().replicate_role_on_all_projects(instance) diff --git a/greenmine/profile/services.py b/greenmine/profile/services.py index e5509fe7..308b4ca4 100644 --- a/greenmine/profile/services.py +++ b/greenmine/profile/services.py @@ -1,6 +1,7 @@ from django.contrib.auth.models import Group from greenmine.scrum.models import Project +from greenmine.profile.models import Role class RoleGroupsService(object): def replicate_role_on_all_projects(self, role): @@ -9,15 +10,21 @@ class RoleGroupsService(object): for project in Project.objects.all(): self._replicate_role_on_project_if_needed(role, project) + def replicate_all_roles_on_one_project(self, project): + for role in Role.objects.all(): + group = Group(name="p%d-r%d" % (project.pk, role.pk), role=role) + group.save() + self._replicate_role_permissions_on_group(role, group) + + def _replicate_role_on_project_if_needed(self, role, project): + if project.groups.filter(role=role).count() == 0: + group = Group(name="p%d-r%d" % (project.pk, role.pk), role=role) + group.save() + self._replicate_role_permissions_on_group(role, group) + def _replicate_role_permissions_on_group(self, role, group): group.permissions.clear() for permission in role.permissions.all(): group.permissions.add(permission) group.save() - def _replicate_role_on_project_if_needed(self, role, project): - if project.groups.filter(role=role).count() == 0: - group = Group(name="p%d-r%d" % (project.pk, role.pk), role=role) - group.save() - role.groups.add(group) - self._replicate_role_permissions_on_group(role, group) diff --git a/greenmine/profile/sigdispatch.py b/greenmine/profile/sigdispatch.py deleted file mode 100644 index be79a2a4..00000000 --- a/greenmine/profile/sigdispatch.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import absolute_import - -from django.db.models.signals import post_save -from django.dispatch import receiver -from django.contrib.auth.models import User - -from .models import Profile, Role -from .services import RoleGroupsService - - -@receiver(post_save, sender=User) -def user_post_save(sender, instance, created, **kwargs): - """ - Create void user profile if instance is a new user. - """ - if created and not Profile.objects.filter(user=instance).exists(): - Profile.objects.create(user=instance) - -@receiver(post_save, sender=Role) -def role_post_save(sender, instance, created, **kwargs): - """ - Recalculate projects groups - """ - RoleGroupsService().replicate_role_on_all_projects(instance) diff --git a/greenmine/scrum/sigdispatch.py b/greenmine/scrum/sigdispatch.py index 01ee5efb..e3134f10 100644 --- a/greenmine/scrum/sigdispatch.py +++ b/greenmine/scrum/sigdispatch.py @@ -4,12 +4,15 @@ from django.dispatch import receiver from django.conf import settings from django.utils.translation import ugettext from django.template.loader import render_to_string +from django.db.models.signals import post_save from django.contrib.auth.models import User from greenmine.base import signals from greenmine.base.utils.auth import set_token from greenmine.base.mail.tasks import send_mail, send_bulk_mail +from greenmine.scrum.models import Project +from greenmine.profile.services import RoleGroupsService @receiver(signals.mail_new_user) @@ -105,3 +108,11 @@ def mail_task_assigned(sender, task, user, **kwargs): subject = ugettext("Greenmine: task assigned") send_mail.delay(subject, template, [task.assigned_to.email]) + +@receiver(post_save, sender=Project) +def project_post_save(sender, instance, created, **kwargs): + """ + Recalculate project groups + """ + if created: + RoleGroupsService().replicate_all_roles_on_one_project(instance)