People

#!/usr/bin/python # -*- coding: iso-8859-15 -*- import sys import ldap import cgi import cgitb; cgitb.enable() import re import httplib import urlparse import math import urllib import requests form = cgi.FieldStorage() NCOL = 4 # CategoriePrs('Principal investigators', '(membership=pac)', '0') class CategoriePrs: def __init__(self, nom, requete, anchor): self.nom = nom self.requete = requete self.anchor = anchor # Liste des catégories du personnel à afficher listeCat = [CategoriePrs('Principal investigators', '(membership=pac)', '0'), CategoriePrs('Administrative and technical staff', '(membership=pat)', '1'), CategoriePrs('Scientific staff', '(membership=ps)', '2'), CategoriePrs('Affiliated members', '(membership=affilie)', '3'), CategoriePrs('Associate members', '(|(membership=psv*)(membership=pss*))', '4'), CategoriePrs('Visitors', '(membership=pacvisiteur)', '5'), CategoriePrs('Emeritus professors', '(membership=emerite)', '6')] def getLDAP(requete, attribut): ''' Renvoie le résultat de la requête LDAP sur le serveur ICTM ''' l = ldap.initialize('ldap://ldap-ictm.inma.ucl.ac.be') base = 'dc=ucl,dc=ac,dc=be' scope = ldap.SCOPE_SUBTREE result_id = l.search(base, scope, requete, attribut) result_type, result_data = l.result(result_id) # Pemettre le tri 'Nom, Prénom' même si le prénom manque for prs in result_data: if not 'givenName' in prs[1]: prs[1]['givenName'] = [''] result_data.sort(key = lambda tup: (tup[1]['sn'][0].lower(), tup[1]['givenName'])) return result_data def displayNom(prs): ''' Renvoie le 'Nom(, Prénom)' de la personne avec un hyperlien vers la page personnelle si elle existe sinon vers la fiche personnelle. ''' if prs[1]['givenName'][0] == '': nom = '%s' % prs[1]['sn'][0] else: nom = '%s, %s' % (prs[1]['sn'][0], prs[1]['givenName'][0]) #nom = nom.decode('utf-8') #nom = nom.encode('latin-1','ignore') if not 'labeledURI' in prs[1]: return nom else: return '%s' % (prs[1]['labeledURI'][0], nom) def checkUrl(url): ''' Renvoie le code HTTP d'une recherche d'url. ''' r = requests.get(url) return r.status_code #p = urlparse.urlparse(url) #conn = httplib.HTTPConnection(p[1]) #conn.request('HEAD', p[2]) #resp = conn.getresponse() #return resp.status def getPicUrl(prs): ''' Renvoie l'url de la photo d'une personne. Il s'agit de la photo personnalisée de la fiche personnelle (si elle a été mise à jour) sinon, c'est la photo de l'annuaire. Si elle n'existe pas : tant pis. ''' fgs = prs[1]['fgs'][0] url_perso_intra_jpg = 'http://sites.uclouvain.be/' \ 'fiche-personne/photos/%s.jpg' % (fgs) url_perso_intra_gif = 'http://sites.uclouvain.be/' \ 'fiche-personne/photos/%s.gif' % (fgs) #url_perso_intra_jpg = 'http://vs-webhost.sipr-dc.ucl.ac.be/sites/' \ # 'fiche-personne/photos/%s.jpg' % (fgs) #url_perso_intra_gif = 'http://vs-webhost.sipr-dc.ucl.ac.be/sites/' \ # 'fiche-personne/photos/%s.gif' % (fgs) url_annuaire = 'http://photos.carte.uclouvain.be/photos_cp/'\ 'photos/image%s/%s.jpg' % (fgs[4:6], fgs) url_blank = 'https://sites.uclouvain.be/inma/drupal/' \ 'resources/blank.jpg' #url_perso_extra_jpg = 'http://www.uclouvain.be/sites-test/' \ # 'fiche-personne/photos/%s.jpg' % (fgs) #url_perso_extra_gif = 'http://www.uclouvain.be/sites-test/' \ # 'fiche-personne/photos/%s.gif' % (fgs) #return (checkUrl(url_perso_intra_jpg), checkUrl(url_perso_intra_gif), checkUrl(url_annuaire)) if checkUrl(url_perso_intra_jpg) == 200: #data = urllib.urlopen(url_perso_intra_jpg).read() #return "data:image/png;base64,%s" % data.encode("base64") return url_perso_intra_jpg elif checkUrl(url_perso_intra_gif) == 200: #data = urllib.urlopen(url_perso_intra_gif).read() #return "data:image/png;base64,%s" % data.encode("base64") return url_perso_intra_gif elif checkUrl(url_annuaire) == 200: return url_annuaire else: return url_blank def displayPic(prs): ''' Renvoir le code HTML montrant la photo de la personne avec un hyperlien vers la page personnelle si elle existe sinon vers la fiche personnelle. ''' url = getPicUrl(prs) if not 'labeledURI' in prs[1]: return '' % url else: return '' \ % (prs[1]['labeledURI'][0], url) # Catégorie du personnel à afficher. Par défaut on les affiche tous. # liste-ictm?categorie=pac categorie = form.getvalue('categorie') if categorie: if categorie == 'pac': listeCat = [listeCat[0]] elif categorie == 'pat': listeCat = [listeCat[1]] elif categorie == 'ps': listeCat = [listeCat[2]] elif categorie == 'affilie': listeCat = [listeCat[3]] elif categorie == 'psother': listeCat = [listeCat[4]] elif categorie == 'pacvisiteur': listeCat = [listeCat[5]] elif categorie == 'emerite': listeCat = [listeCat[6]] # Pôle à afficher. Par défaut on les affiche tous. # liste-ictm?pole=inma pole = form.getvalue('pole') if pole: for cat in listeCat: cat.requete = '(&(pole=%s)%s)' % (pole, cat.requete) # Nombre de colonnes dans le tableau affiché. Par défaut on prend NCOL. # liste-ictm?col=6 col = form.getvalue('col') if col: NCOL = int(col) # INVERSER POUR DRUPAL print 'Content-type:text/html;charset=utf-8' #print 'Content-type:text/html;charset=iso-8859-1' print '' print '' # Si aucune catégorie n'est passée en argument, on les affiche toutes et # une liste à puce avec des hyperliens vers les catégories est affichées # au dessus du tablea. if not categorie: print '
    ' for cat in listeCat: res = getLDAP(cat.requete, None) if len(res) > 0: print '
  • %s
  • ' % (cat.anchor, cat.nom) print '
' # Affichage du tableau print '' for cat in listeCat: res = getLDAP(cat.requete, None) if len(res) > 0: # Titre de la catégorie print '', \ '' \ '' % (cat.anchor, cat.nom) # Personnes dans la catégorie. Juste un peu tricky pour afficher # le bon nombre par ligne et terminer proprement la dernière ligne. num = int(math.ceil(len(res)/float(NCOL))) for line in range(num): print '' for col in range(NCOL): index = line*NCOL+col if index < len(res): print '' % (displayPic(res[index]), displayNom(res[index])) else: print '' % (' ', ' ') print '' print '
 
%s
 
' \ '%s
%s
' \ '%s
%s
'