Browse Source

Ajusta criação de user profile

pull/159/head
Sesostris Vieira 2 years ago
parent
commit
f8c0eed692
  1. 42
      sigi/apps/servidores/models.py

42
sigi/apps/servidores/models.py

@ -1,7 +1,10 @@
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db import models from django.db import models
from django.db.models.signals import post_save, pre_save from django.db.models.signals import post_save, pre_save
from django.contrib.auth.models import Group
from django.dispatch import receiver
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from django_auth_ldap.backend import populate_user, LDAPBackend
class Servico(models.Model): class Servico(models.Model):
@ -92,23 +95,52 @@ User.servidor = property(
# Sinal para ao criar um usuário criar um servidor # Sinal para ao criar um usuário criar um servidor
# baseado no nome contido no LDAP # baseado no nome contido no LDAP
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs): def create_user_profile(sender, instance, created, **kwargs):
if created: sigla_servico = instance.ldap_user.attrs.get("department", [""])[0].split(
"-"
)[-1]
servico = Servico.objects.filter(sigla=sigla_servico).first()
if created and instance.is_staff:
Servidor.objects.create( Servidor.objects.create(
user=instance, user=instance,
nome_completo="%s %s" % (instance.first_name, instance.last_name), nome_completo="%s %s" % (instance.first_name, instance.last_name),
servico=servico,
) )
elif (
not created
and instance.is_staff
and instance.servidor is not None
and instance.servidor.servico != servico
):
servidor = instance.servidor
servidor.servico = servico
servidor.save()
post_save.connect(create_user_profile, sender=User)
# Hack horrível para ajustar o first_name e o last_name do User criado pelo # Hack horrível para ajustar o first_name e o last_name do User criado pelo
# Django-ldap. Os campos first_name e last_name têm o tamanho máximo de # Django-ldap. Os campos first_name e last_name têm o tamanho máximo de
# 30 caracteres, mas o LDAP não tem esse limite, e alguns usuários podem ter # 30 caracteres, mas o LDAP não tem esse limite, e alguns usuários podem ter
# nomes maiores que isso, o que provoca erro ao salvar o usuário.j # nomes maiores que isso, o que provoca erro ao salvar o usuário.
@receiver(pre_save, sender=User)
def ajusta_nome_usuario(sender, instance, *args, **kwargs): def ajusta_nome_usuario(sender, instance, *args, **kwargs):
instance.first_name = instance.first_name[:30] instance.first_name = instance.first_name[:30]
instance.last_name = instance.last_name[:30] instance.last_name = instance.last_name[:30]
pre_save.connect(ajusta_nome_usuario, sender=User) # Identifica se um usuário do LDAP é membro da equipe (is_staff) verificando se
# a propriedade Department, do LDAP, é uma unidade do ILB. Também desmembra
# o campo Department para gerar os nomes dos grupos que o User vai integrar
@receiver(populate_user, sender=LDAPBackend)
def user_staff_and_group(user, ldap_user, **kwargs):
dep = ldap_user.attrs.get("department", [""])[0]
title = ldap_user.attrs.get("title", [""])[0]
group_names = [dep.split("-")[-1], title]
group_names.extend(title.split("-", 1))
group_names = [s.strip().upper() for s in group_names]
user.is_staff = "ILB" in dep
user.save()
user.groups.clear()
for name in group_names:
group, created = Group.objects.get_or_create(name=name)
user.groups.add(group)

Loading…
Cancel
Save