[Freeipa-devel] [PATCH] managers and direct reports

Kevin McCarthy kmccarth at redhat.com
Tue Sep 25 22:40:36 UTC 2007


This patch adds manager and direct reports to the usershow page.

It depends on the freeipa-212-usergrouplist.patch, as it fixes a bug in
it.

-Kevin

-------------- next part --------------
# HG changeset patch
# User Kevin McCarthy <kmccarth at redhat.com>
# Date 1190760289 25200
# Node ID 18ac2f4b2b71549356300b311b59d9781b304a32
# Parent  a481d970fdc257ff919f72b7a9dc8d0459eab0d3
Adds manager and direct reports to usershow page.
Fixes a bug with the group by member where is wasn't trapping not found errors.

diff -r a481d970fdc2 -r 18ac2f4b2b71 ipa-python/ipaclient.py
--- a/ipa-python/ipaclient.py	Tue Sep 25 13:35:43 2007 -0700
+++ b/ipa-python/ipaclient.py	Tue Sep 25 15:44:49 2007 -0700
@@ -68,6 +68,15 @@ class IPAClient:
         result = self.transport.get_user_by_dn(dn,sattrs)
         return user.User(result)
 
+    def get_users_by_manager(self,manager_dn,sattrs=None):
+        """Gets the users the report to a particular manager.
+           If sattrs is not None then only those
+           attributes will be returned, otherwise all available
+           attributes are returned. The result is a list of groups."""
+        results = self.transport.get_users_by_manager(manager_dn, sattrs)
+
+        return map(lambda result: user.User(result), results)
+
     def add_user(self,user,user_container=None):
         """Add a user. user is a ipa.user.User object"""
 
diff -r a481d970fdc2 -r 18ac2f4b2b71 ipa-python/rpcclient.py
--- a/ipa-python/rpcclient.py	Tue Sep 25 13:35:43 2007 -0700
+++ b/ipa-python/rpcclient.py	Tue Sep 25 15:44:49 2007 -0700
@@ -101,6 +101,23 @@ class RPCClient:
 
         return ipautil.unwrap_binary_data(result)
 
+    def get_users_by_manager(self,manager_dn,sattrs=None):
+        """Gets the users that report to a manager.
+           If sattrs is not None then only those
+           attributes will be returned, otherwise all available
+           attributes are returned. The result is a list of dicts."""
+        server = self.setup_server()
+        if sattrs is None:
+            sattrs = "__NONE__"
+        try:
+            result = server.get_users_by_manager(manager_dn, sattrs)
+        except xmlrpclib.Fault, fault:
+            raise ipaerror.gen_exception(fault.faultCode, fault.faultString)
+        except socket.error, (value, msg):
+            raise xmlrpclib.Fault(value, msg)
+
+        return ipautil.unwrap_binary_data(result)
+
     def add_user(self,user,user_container=None):
         """Add a new user. Takes as input a dict where the key is the
            attribute name and the value is either a string or in the case
diff -r a481d970fdc2 -r 18ac2f4b2b71 ipa-server/ipa-gui/ipagui/controllers.py
--- a/ipa-server/ipa-gui/ipagui/controllers.py	Tue Sep 25 13:35:43 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/controllers.py	Tue Sep 25 15:44:49 2007 -0700
@@ -252,8 +252,20 @@ class Root(controllers.RootController):
         try:
             user = client.get_user_by_uid(uid, user_fields)
             user_groups = client.get_groups_by_member(user.dn, ['cn'])
+            user_reports = client.get_users_by_manager(user.dn,
+                    ['givenname', 'sn', 'uid'])
+
+            user_manager = None
+            try:
+                if user.manager:
+                    user_manager = client.get_user_by_dn(user.manager,
+                        ['givenname', 'sn', 'uid'])
+            except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND):
+                pass
+
             return dict(user=user.toDict(), fields=forms.user.UserFields(),
-                        user_groups=user_groups)
+                        user_groups=user_groups, user_reports=user_reports,
+                        user_manager=user_manager)
         except ipaerror.IPAError, e:
             turbogears.flash("User show failed: " + str(e))
             raise turbogears.redirect("/")
diff -r a481d970fdc2 -r 18ac2f4b2b71 ipa-server/ipa-gui/ipagui/templates/usershow.kid
--- a/ipa-server/ipa-gui/ipagui/templates/usershow.kid	Tue Sep 25 13:35:43 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/templates/usershow.kid	Tue Sep 25 15:44:49 2007 -0700
@@ -78,6 +78,15 @@ else:
           </th>
           <td>${user.get("telephonenumber")}</td>
         </tr>
+        <tr py:if='user_manager'>
+          <th>
+            Manager:
+          </th>
+          <td>
+            <a href="${tg.url('/usershow', uid=user_manager.uid)}"
+              >${user_manager.givenname} ${user_manager.sn}</a>
+          </td>
+        </tr>
     </table>
 
     <div class="formsection">Account Status</div>
@@ -90,6 +99,12 @@ else:
       </tr>
     </table>
 
+    <div class="formsection" py:if='len(user_reports) > 0'>Direct Reports</div>
+    <div py:for="report in user_reports">
+      <a href="${tg.url('/usershow', uid=report.uid)}"
+        >${report.givenname} ${report.sn}</a>
+    </div>
+
     <div class="formsection">Groups</div>
     <div py:for="group in user_groups">
       <a href="${tg.url('/groupshow', cn=group.cn)}">${group.cn}</a>
diff -r a481d970fdc2 -r 18ac2f4b2b71 ipa-server/xmlrpc-server/funcs.py
--- a/ipa-server/xmlrpc-server/funcs.py	Tue Sep 25 13:35:43 2007 -0700
+++ b/ipa-server/xmlrpc-server/funcs.py	Tue Sep 25 15:44:49 2007 -0700
@@ -308,7 +308,18 @@ class IPAServer:
 
         filter = "(objectClass=*)"
         return self.__get_entry(dn, filter, sattrs, opts)
-    
+
+    def get_users_by_manager (self, manager_dn, sattrs=None, opts=None):
+        """Gets the users that report to a particular manager.
+        """
+
+        filter = "(&(objectClass=person)(manager=%s))" % manager_dn
+
+        try:
+            return self.__get_list(self.basedn, filter, sattrs, opts)
+        except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND):
+            return []
+
     def add_user (self, user, user_container=None, opts=None):
         """Add a user in LDAP. Takes as input a dict where the key is the
            attribute name and the value is either a string or in the case
@@ -615,7 +626,10 @@ class IPAServer:
 
         filter = "(&(objectClass=posixGroup)(uniqueMember=%s))" % member_dn
 
-        return self.__get_list(self.basedn, filter, sattrs, opts)
+        try:
+            return self.__get_list(self.basedn, filter, sattrs, opts)
+        except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND):
+            return []
 
     def add_group (self, group, group_container=None, opts=None):
         """Add a group in LDAP. Takes as input a dict where the key is the
diff -r a481d970fdc2 -r 18ac2f4b2b71 ipa-server/xmlrpc-server/ipaxmlrpc.py
--- a/ipa-server/xmlrpc-server/ipaxmlrpc.py	Tue Sep 25 13:35:43 2007 -0700
+++ b/ipa-server/xmlrpc-server/ipaxmlrpc.py	Tue Sep 25 15:44:49 2007 -0700
@@ -316,6 +316,7 @@ def handler(req, profiling=False):
             h = ModXMLRPCRequestHandler()
             h.register_function(f.get_user_by_uid)
             h.register_function(f.get_user_by_dn)
+            h.register_function(f.get_users_by_manager)
             h.register_function(f.add_user)
             h.register_function(f.get_add_schema)
             h.register_function(f.get_all_users)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 4054 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/freeipa-devel/attachments/20070925/c7e001e1/attachment.bin>


More information about the Freeipa-devel mailing list