diff --git a/django/sp_sso/saml/forms.py b/django/sp_sso/saml/forms.py index 1ef9f59..c33ecaa 100644 --- a/django/sp_sso/saml/forms.py +++ b/django/sp_sso/saml/forms.py @@ -1,7 +1,9 @@ from django.utils.translation import ugettext_lazy as _ from django import forms from .utils import ldap_get_unites, ldap_get_etablissements, sso_attributes, \ - sso_select_attributes, sso_tupled_attributes, sso_strict_readonly_attributes + sso_select_attributes, sso_tupled_attributes, \ + sso_strict_readonly_attributes, sso_needed_description_attributes, \ + ldap_get_description_etablissements, ldap_get_description_unites AFFILIATION_CHOICES = ( @@ -86,12 +88,34 @@ class RegistrationForm(forms.Form): self.fields[field].widget.attrs['readonly'] = True if kwargs['initial'].get('yet_member', '') is False: - extra_affiliation = (('affiliate', _('Affiliate')),) + extra_affiliation = (('affiliate', 'affiliate'),) else: - extra_affiliation = (('member', _('Member')),) + extra_affiliation = (('member', 'member'),) self.fields['ep_affiliation'].choices = extra_affiliation self.fields['ep_affiliation'].widget.attrs['readonly'] = True + code_etablissement = kwargs['initial'].get('s_etablissement', '') + if code_etablissement != '': + self.fields['s_etablissement_description'].initial = ldap_get_description_etablissements(code_etablissement) + self.fields['s_etablissement_description'].widget.attrs['readonly'] = True + code_unite = kwargs['initial'].get('s_entite_affectation_principale', '') + if code_unite != '': + self.fields['s_entite_affectation_principale_description'].initial = ldap_get_description_unites(code_unite) + #User shouldn't be able to define this field + self.fields['s_entite_affectation_principale_description'].widget.attrs['readonly'] = True + + code_hote_etablissement = kwargs['initial'].get('hote_etablissement', '') + if code_hote_etablissement != '': + self.fields['hote_etablissement'].choices = ((code_hote_etablissement, ldap_get_description_etablissements(code_hote_etablissement)),) + self.fields['hote_etablissement'].widget.attrs['readonly'] = True + self.fields['hote_unite'].widget.attrs['readonly'] = True + code_hote_unite = kwargs['initial'].get('hote_unite', '') + if code_hote_unite != '': + self.fields['hote_unite'].choices = ((code_hote_unite, ldap_get_description_unites(code_hote_unite)),) + #User shouldn't be able to define this field + self.fields['hote_unite'].widget.attrs['readonly'] = True + self.fields['hote_etablissement'].widget.attrs['readonly'] = True + nom = forms.CharField(max_length=100, label=_("Last name")) prenom = forms.CharField(max_length=100, label=_("First name")) email = forms.CharField(max_length=100, label=_("Email address")) @@ -117,11 +141,15 @@ class RegistrationForm(forms.Form): # supannEtablissement s_etablissement = forms.CharField( required=False, max_length=100, label=_("Institution")) - invite_unite = forms.CharField( - required=False, label=_("Research entity or unit"), initial='') + s_etablissement_description = forms.CharField( + required=False, max_length=100, label=_("Institution")) + #invite_unite = forms.CharField( + # required=False, label=_("Research entity or unit"), initial='') # supannEntiteAffectationPrincipale s_entite_affectation_principale = forms.CharField( - required=False, max_length=100, label=_("Assignment unit")) + required=False, label=_("Unit"), initial='') + s_entite_affectation_principale_description = forms.CharField( + required=False, label=_("Unit"), initial='') # supannEntiteAffectation s_entite_affectation = forms.CharField( required=False, max_length=100, label=_("Assignment units")) @@ -139,6 +167,12 @@ class RegistrationForm(forms.Form): hote_unite = forms.ChoiceField( required=False, choices=ldap_get_unites(), label=_("Research entity or unit"), initial=None) + hote_etablissement_description = forms.ChoiceField( + required=False, choices=ldap_get_etablissements(), + label=_("Institution"), initial=None) + hote_unite_description = forms.ChoiceField( + required=False, choices=ldap_get_unites(), + label=_("Research entity or unit"), initial=None) hote_commentaire = forms.CharField( widget=forms.Textarea(), max_length=999, label=_("Comments to your host"), required=False) diff --git a/django/sp_sso/saml/migrations/0005_remove_supannuser_invite_unite.py b/django/sp_sso/saml/migrations/0005_remove_supannuser_invite_unite.py new file mode 100644 index 0000000..7036c3d --- /dev/null +++ b/django/sp_sso/saml/migrations/0005_remove_supannuser_invite_unite.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('saml', '0004_supannuser_invite_unite'), + ] + + operations = [ + migrations.RemoveField( + model_name='supannuser', + name='invite_unite', + ), + ] diff --git a/django/sp_sso/saml/models.py b/django/sp_sso/saml/models.py index 14bdb55..dcbab3c 100644 --- a/django/sp_sso/saml/models.py +++ b/django/sp_sso/saml/models.py @@ -20,7 +20,7 @@ class SupAnnUser(AbstractUser): s_entite_affectation = models.CharField(max_length=100, default="") s_emp_corps = models.CharField(max_length=100, default="") s_etablissement = models.CharField(max_length=100, default="") - invite_unite = models.CharField(max_length=100, default="") + #invite_unite = models.CharField(max_length=100, default="") s_liste_rouge = models.BooleanField(default=False) REQUIRED_FIELDS = [] diff --git a/django/sp_sso/saml/utils.py b/django/sp_sso/saml/utils.py index 5dee1a7..c84271e 100644 --- a/django/sp_sso/saml/utils.py +++ b/django/sp_sso/saml/utils.py @@ -1,6 +1,7 @@ import ldap import json import logging +import unicodedata from urllib2 import build_opener, urlopen, HTTPHandler, Request, HTTPError from random import randint @@ -19,7 +20,7 @@ sso_attributes = [ 'prenom', 'nom', 'email', 'ep_principal_name', 'ep_primary_affiliation', 'ep_affiliation', 's_etablissement', 's_entite_affectation_principale', 's_entite_affectation', 's_emp_corps', 'hote_unite', 'hote_etablissement', - 's_liste_rouge', 'hote_commentaire', 'invite_unite'] + 's_liste_rouge', 'hote_commentaire'] sso_select_attributes = [ 'ep_primary_affiliation', 'hote_unite', 'hote_etablissement'] @@ -28,7 +29,10 @@ sso_tupled_attributes = { 's_emp_corps': 'EMP_CORPS_CHOICES' } -sso_strict_readonly_attributes = ['invite_unite'] +sso_needed_description_attributes = [ + 's_etablissement', 'ep_primary_affiliation'] + +sso_strict_readonly_attributes = ['s_entite_affectation_principale'] supann_host_role_attribute = 'supannRoleGenerique' supann_host_role_value = '{SUPANN}R10' # 'Responsable de mission' @@ -38,7 +42,7 @@ def sorting_key(tuple_input): if type(tuple_input[1]) is unicode: return tuple_input[1].encode('utf-8') else: - return unicode(tuple_input[1], 'utf-8') + return unicodedata.normalize('NFD', unicode(tuple_input[1], 'utf-8')) def render_message(request, message): """Renders a simple message to a base template""" @@ -81,17 +85,32 @@ def ldap_init(): def ldap_get_etablissements(): """Used to fill the choices in hote_etablissemnt form ChoiceField.""" return ldap_get_attribute_from_subtree_nodes( - structures_base, '(objectClass=supannOrg)', 'ou') + structures_base, '(objectClass=supannOrg)', 'supannEtablissement') def ldap_get_code_etablissements(): return ldap_get_attribute_from_subtree_nodes( structures_base, '(objectClass=supannOrg)', 'supannEtablissement') +def ldap_get_description_etablissements(code): + etablissements = ldap_get_attribute_from_subtree_nodes( + structures_base, '(supannEtablissement=%s)'%code, 'description') + if len(etablissements) == 2: + return etablissements[-1][0] + else: + return '' + def ldap_get_unites(): """Used to fill the choices in hote_unite form ChoiceField.""" return ldap_get_attribute_from_subtree_nodes( - structures_base, '(supannTypeEntite=*)', 'ou') + structures_base, '(!(objectClass=supannOrg))', 'supannCodeEntite') +def ldap_get_description_unites(code): + unites = ldap_get_attribute_from_subtree_nodes( + structures_base, '(supannCodeEntite=%s)'%code, 'description') + if len(unites) == 2: + return unites[-1][0] + else: + return '' def ldap_get_affectations(): """ @@ -121,9 +140,8 @@ def ldap_get_attribute_from_subtree_nodes(subtree_base, filter, attribute): attribute_list = node_data.get(attribute) if attribute_list: attribute_value = attribute_list[0] # No need for multi-valued attributes - # at the moment - description = node_data.get('description', [_('No description')])[0] - choices.append((attribute_value, description)) + description = node_data.get('description', [_('No description')])[0] + choices.append((attribute_value, description)) choices.sort(key=sorting_key) return choices