A more "service orientated" view

This commit is contained in:
Frédéric Péters 2009-11-02 15:17:40 +01:00
parent 42fb686758
commit 134d04dc80
2 changed files with 95 additions and 10 deletions

View File

@ -15,14 +15,18 @@ from Acquisition import aq_base
schema = BaseSchema
def get_sn(x):
return getattr(x, 'sn')
class PcfAnnuaireEntry:
def __init__(self, ldap_entry):
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')
@ -32,7 +36,8 @@ class PcfAnnuaireEntry:
self.shortTelephoneNumber = None
self.givenName = get_attr('givenName')
self.mobile = get_attr('mobile')
self.building = get_attr('location')
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')
@ -40,6 +45,7 @@ class PcfAnnuaireEntry:
self.division = get_attr('division')
self.title = get_attr('title')
self.company = get_attr('company')
self.manager = get_attr('manager')
class PcfAnnuaireService:
pass
@ -72,7 +78,7 @@ class PcfAnnuaire(BaseContent):
ldap_conn = self.get_ldap_conn()
result = ldap_conn.search_s(self.get_users_base(),
ldap.SCOPE_SUBTREE, 'objectClass=person')
return [PcfAnnuaireEntry(x[1]) for x in result]
return [PcfAnnuaireEntry(*x) for x in result]
def getEntries(self):
return [x for x in self.getObjectEntries() if \
@ -102,4 +108,50 @@ class PcfAnnuaire(BaseContent):
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)

View File

@ -19,7 +19,8 @@
<metal:main fill-slot="main">
<tal:main-macro metal:define-macro="main"
tal:define="kssClassesView context/@@kss_field_decorator_view;
getKssClasses nocall:kssClassesView/getKssClassesInlineEditable;">
getKssClasses nocall:kssClassesView/getKssClassesInlineEditable;
service python:context.REQUEST.get('service')">
<div tal:replace="structure provider:plone.abovecontenttitle" />
<h1 metal:use-macro="here/kss_generic_macros/macros/generic_title_view">
@ -35,12 +36,44 @@
Description
</div>
<ul>
<li tal:repeat="entry python: context.getEntries()">
<span tal:replace="entry/givenName">givenName</span>
<span tal:replace="entry/sn">sn</span>
</li>
</ul>
<div tal:condition="python: not(service)">
<h2>Secr&eacute;taire G&eacute;n&eacute;ral</h2>
<ul>
<li tal:repeat="entry python: [context.getSecretaireGeneral()]">
<span tal:replace="entry/givenName">givenName</span>
<span tal:replace="entry/sn">sn</span>
</li>
</ul>
<h2>Services</h2>
<ul>
<li tal:repeat="service python: context.getServices()">
<a tal:attributes="href string:?service=${service}" tal:content="service">service</a>
</li>
</ul>
</div>
<div tal:condition="python: not(not(service))">
<h2 tal:content="python: service">service name</h2>
<ul>
<li tal:repeat="entry python: context.getServiceManagers(service)">
<span tal:replace="entry/givenName">givenName</span>
<span tal:replace="entry/sn">sn</span>
</li>
</ul>
<ul tal:repeat="cellule python: context.getCellules(service)">
<a href="xx" tal:content="cellule">cellule</a>
</ul>
<ul>
<li tal:repeat="entry python: context.getServiceNonManagers(service)">
<span tal:replace="entry/givenName">givenName</span>
<span tal:replace="entry/sn">sn</span>
</li>
</ul>
</div>
<div tal:replace="structure provider:plone.belowcontentbody" />
</tal:main-macro>