100 lines
3.0 KiB
Python
100 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
Proxy User Model
|
|
"""
|
|
|
|
from django.db import models
|
|
from django.contrib.auth.models import User as AuthUser, Group
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
class PolynumUser(AuthUser):
|
|
def get_ldap_attributes(self):
|
|
from polynum.base.backends import CASBackend
|
|
return CASBackend().get_ldap_attributes(self)
|
|
|
|
def display_name(self):
|
|
name = self.get_full_name().strip()
|
|
if name:
|
|
return name
|
|
return self.username
|
|
|
|
def get_preferred_entities(self):
|
|
return []
|
|
|
|
def get_preferred_financial_codes(self):
|
|
return []
|
|
|
|
def has_roles(self):
|
|
return self.roleassociation_set.exists()
|
|
|
|
def update_groups_from_roles(self):
|
|
roles = rbac.Role.objects.all()
|
|
def names(qs):
|
|
return qs.distinct().values_list('name')
|
|
to_add = names(roles.filter(roleassociation__user=self))
|
|
to_remove = names(roles.exclude(roleassociation__user=self))
|
|
group_to_keep = self.groups.exclude(name__in=to_remove)
|
|
group_to_add = Group.objects.filter(name__in=to_add)
|
|
new_groups = group_to_keep | group_to_add
|
|
self.groups = list(new_groups)
|
|
if new_groups:
|
|
self.is_staff = True
|
|
self.save()
|
|
elif not self.is_superuser and not self.groups:
|
|
self.is_staff = False
|
|
self.save()
|
|
|
|
def __unicode__(self):
|
|
return self.display_name()
|
|
|
|
class Meta:
|
|
proxy = True
|
|
app_label = 'auth'
|
|
verbose_name = _(u'Utilisateur')
|
|
User = PolynumUser
|
|
|
|
import rbac
|
|
from django.db.models.signals import post_save, post_delete
|
|
|
|
from django.dispatch import receiver
|
|
|
|
|
|
"""Try to maintain user/group link based on similar names for groups and roles"""
|
|
|
|
def update_user_groups_on_users_after_role_association_change(sender,
|
|
instance, **kwargs):
|
|
role_association = instance
|
|
role_association.user.update_groups_from_roles()
|
|
|
|
post_save.connect(update_user_groups_on_users_after_role_association_change,
|
|
sender=rbac.RoleAssociation)
|
|
post_delete.connect(update_user_groups_on_users_after_role_association_change,
|
|
sender=rbac.RoleAssociation)
|
|
|
|
@receiver(post_save, sender=Group)
|
|
def update_user_groups_on_user_after_group_creation(sender,
|
|
instance, **kwargs):
|
|
group = instance
|
|
for user in User.objects.filter(roleassociation__role__name=group.name):
|
|
user.update_groups_from_roles()
|
|
|
|
@receiver(post_save, sender=rbac.Role)
|
|
def update_user_groups_on_role_modification(sender,
|
|
instance, **kwargs):
|
|
role = instance
|
|
for user in User.objects.filter(roleassociation__role=role):
|
|
user.update_groups_from_roles()
|
|
|
|
class PolynumProfile(models.Model):
|
|
user = models.OneToOneField(AuthUser)
|
|
phone = models.CharField(max_length=32, verbose_name=_(u'Téléphone'),
|
|
default='')
|
|
accepted_cgu = models.BooleanField(
|
|
verbose_name=_(u"A accepté les conditions générales "
|
|
"d'utilisation"),
|
|
blank=True, default=False)
|
|
|
|
class Meta:
|
|
app_label = 'base'
|