158 lines
5.4 KiB
Python
158 lines
5.4 KiB
Python
# -*- coding: UTF-8 -*-
|
|
|
|
""" PcfAnnuaire Class """
|
|
|
|
import os
|
|
import time
|
|
import calendar
|
|
import ldap
|
|
|
|
from interfaces import IPcfAnnuaire
|
|
from zope.interface import implements
|
|
from Products.Archetypes.public import *
|
|
from Products.CMFCore.utils import getToolByName
|
|
from Acquisition import aq_base
|
|
|
|
schema = BaseSchema
|
|
|
|
def get_sn(x):
|
|
return getattr(x, 'sn')
|
|
|
|
class PcfAnnuaireEntry:
|
|
def __init__(self, ldap_dn, ldap_entry):
|
|
def get_attr(x):
|
|
try:
|
|
return ldap_entry.get(x)[0]
|
|
except (IndexError, TypeError):
|
|
return None
|
|
self._debug_entry = ldap_entry
|
|
self.dn = ldap_dn
|
|
self.cn = get_attr('cn')
|
|
self.sn = get_attr('sn')
|
|
self.telephoneNumbers = ldap_entry.get('telephoneNumber')
|
|
if self.telephoneNumbers:
|
|
self.shortTelephoneNumber = self.telephoneNumbers[0][-3:]
|
|
else:
|
|
self.shortTelephoneNumber = None
|
|
self.givenName = get_attr('givenName')
|
|
self.mobile = get_attr('mobile')
|
|
self.service = get_attr('department')
|
|
self.building = get_attr('destinationIndicator')
|
|
self.floor = get_attr('extensionAttribute1')
|
|
self.office = get_attr('physicalDeliveryOfficeName')
|
|
self.fax = get_attr('facsimileTelephoneNumber')
|
|
self.email = get_attr('mail')
|
|
self.division = get_attr('division')
|
|
self.title = get_attr('title')
|
|
self.company = get_attr('company')
|
|
self.manager = get_attr('manager')
|
|
|
|
class PcfAnnuaireService:
|
|
pass
|
|
|
|
|
|
class PcfAnnuaire(BaseContent):
|
|
|
|
implements(IPcfAnnuaire)
|
|
|
|
schema = schema
|
|
_at_rename_after_creation = True
|
|
|
|
def get_ldap_conn(self):
|
|
portal = getToolByName(self, 'portal_url').getPortalObject()
|
|
ldapdir = aq_base(portal.acl_users.ldap)
|
|
luf = ldapdir._getLDAPUserFolder()
|
|
server = luf._delegate.getServers()[0]
|
|
ldap_conn = ldap.initialize('%(protocol)s://%(host)s:%(port)s' % server)
|
|
ldap_conn.simple_bind_s(luf._binduid, luf._bindpwd)
|
|
return ldap_conn
|
|
|
|
def get_users_base(self):
|
|
portal = getToolByName(self, 'portal_url').getPortalObject()
|
|
ldapdir = aq_base(portal.acl_users.ldap)
|
|
luf = ldapdir._getLDAPUserFolder()
|
|
users_base = luf.users_base
|
|
return users_base
|
|
|
|
def getObjectEntries(self):
|
|
ldap_conn = self.get_ldap_conn()
|
|
result = ldap_conn.search_s(self.get_users_base(),
|
|
ldap.SCOPE_SUBTREE, 'objectClass=person')
|
|
return [PcfAnnuaireEntry(*x) for x in result]
|
|
|
|
def getEntries(self):
|
|
return [x for x in self.getObjectEntries() if \
|
|
x.givenName and x.company == 'Parlement de la Communauté française de Belgique']
|
|
|
|
def getServices(self):
|
|
entries = self.getObjectEntries()
|
|
services = {}
|
|
for entry in entries:
|
|
if not entry.division:
|
|
continue
|
|
if not entry.division in services:
|
|
service = Service()
|
|
service.name = entry.division
|
|
service.agents = []
|
|
services[division] = service
|
|
service = services.get(entry.division)
|
|
service.agents.append(entry)
|
|
def get_name(x): return getattr(x, 'name')
|
|
def get_sn(x): return getattr(x, 'sn')
|
|
services = sorted([x for x in services.values()], key=get_name)
|
|
for service in services:
|
|
services.agents.sort(key=get_sn)
|
|
return services
|
|
|
|
def getEntriesWithPhone(self):
|
|
def get_sn(x): return getattr(x, 'sn')
|
|
return sorted([x for x in self.getEntries() if x.telephoneNumbers], key=get_sn)
|
|
|
|
def getSecretaireGeneral(self):
|
|
try:
|
|
return [x for x in self.getEntries() if x.title == 'Secrétaire Général'][0]
|
|
except IndexError:
|
|
raise KeyError
|
|
|
|
def getServices(self):
|
|
services = {}
|
|
for entry in self.getEntries():
|
|
services[entry.service] = True
|
|
services = sorted(services.keys())
|
|
return services
|
|
|
|
def getServiceManagers(self, service):
|
|
sec_gen = self.getSecretaireGeneral()
|
|
entries = [x for x in self.getEntries() if x.service == service and x.manager == sec_gen.dn]
|
|
return sorted(entries, key=get_sn)
|
|
|
|
def getServiceNonManagers(self, service):
|
|
service_managers = [x.dn for x in self.getServiceManagers(service)]
|
|
entries = [x for x in self.getEntries() if \
|
|
x.service == service and x.manager in service_managers and not x.division]
|
|
return sorted(entries, key=get_sn)
|
|
|
|
def getCellules(self, service):
|
|
service_managers = [x.dn for x in self.getServiceManagers(service)]
|
|
entries = [x for x in self.getEntries() if x.manager in service_managers]
|
|
cells = {}
|
|
for entry in entries:
|
|
if entry.division:
|
|
cells[entry.division] = True
|
|
cells = sorted(cells.keys())
|
|
return cells
|
|
|
|
def getCelluleManager(self, cellule):
|
|
entries = [x for x in self.getEntries() if x.division == cellule]
|
|
dns = [x.dn for x in entries]
|
|
manager = [x for x in entries if x.manager not in dns][0]
|
|
return manager
|
|
|
|
def getCellulePeople(self, cellule):
|
|
entries = [x for x in self.getEntries() if x.division == cellule]
|
|
cellule_manager = self.getCelluleManager()
|
|
return sorted(entries, key=get_sn)
|
|
|
|
|
|
registerType(PcfAnnuaire)
|