This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
polynum/polynum/base/models/user.py

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'