[Freeipa-devel] [PATCH] Autosuggest for uid and email

Kevin McCarthy kmccarth at redhat.com
Thu Aug 30 22:11:27 UTC 2007


This patch adds auto-suggest for the uid and email fields.
Email searching isn't there yet, so we don't verify email uniqueness
yet, but it's done for uid.

-Kevin

-------------- next part --------------
# HG changeset patch
# User Kevin McCarthy <kmccarth at redhat.com>
# Date 1188511848 25200
# Node ID 42d6af7a569d31d85c2351524c4f8037991cc111
# Parent  675c7ce08099b78888c6c36ebe9d9bf1bd1a2358
Add auto-suggest for uid and email fields.

diff -r 675c7ce08099 -r 42d6af7a569d ipa-server/ipa-gui/ipagui/controllers.py
--- a/ipa-server/ipa-gui/ipagui/controllers.py	Thu Aug 30 15:05:12 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/controllers.py	Thu Aug 30 15:10:48 2007 -0700
@@ -189,6 +189,82 @@ class Root(controllers.RootController):
 
         return password
 
+    @expose()
+    def suggest_uid(self, givenname, sn):
+        if (len(givenname) == 0) or (len(sn) == 0):
+            return ""
+
+        uid = givenname[0] + sn[:7]
+        try:
+            client.get_user_by_uid(uid)
+        except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND):
+            return uid
+
+        uid = givenname[:7] + sn[0]
+        try:
+            client.get_user_by_uid(uid)
+        except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND):
+            return uid
+
+        uid = (givenname + sn)[:8]
+        try:
+            client.get_user_by_uid(uid)
+        except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND):
+            return uid
+
+        uid = sn[:8]
+        try:
+            client.get_user_by_uid(uid)
+        except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND):
+            return uid
+
+        suffix = 2
+        template = givenname[0] + sn[:7]
+        while suffix < 20:
+            uid = template[:8 - len(str(suffix))] + str(suffix)
+            try:
+                client.get_user_by_uid(uid)
+            except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND):
+                return uid
+            suffix += 1
+
+        return ""
+
+    @expose()
+    def suggest_email(self, givenname, sn):
+        if (len(givenname) == 0) or (len(sn) == 0):
+            return ""
+
+        # TODO - get from config
+        domain = "freeipa.org"
+
+        return "%s.%s@%s" % (givenname, sn, domain)
+
+
+        # TODO - mail is currently not indexed nor searchable.
+        #        implement when it's done
+        # email = givenname + "." + sn + domain
+        # users = client.find_users(email, ['mail'])
+        # if len(filter(lambda u: u['mail'] == email, users[1:])) == 0:
+        #     return email
+
+        # email = self.suggest_uid(givenname, sn) + domain
+        # users = client.find_users(email, ['mail'])
+        # if len(filter(lambda u: u['mail'] == email, users[1:])) == 0:
+        #     return email
+
+        # suffix = 2
+        # template = givenname + "." + sn
+        # while suffix < 20:
+        #     email = template + str(suffix) + domain
+        #     users = client.find_users(email, ['mail'])
+        #     if len(filter(lambda u: u['mail'] == email, users[1:])) == 0:
+        #         return email
+        #     suffix += 1
+
+        # return ""
+
+
 
     #########
     # Group #
diff -r 675c7ce08099 -r 42d6af7a569d ipa-server/ipa-gui/ipagui/templates/master.kid
--- a/ipa-server/ipa-gui/ipagui/templates/master.kid	Thu Aug 30 15:05:12 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/templates/master.kid	Thu Aug 30 15:10:48 2007 -0700
@@ -10,6 +10,7 @@
     @import "${tg.url('/static/css/style.css')}";
     </style>
     <script type="text/javascript" charset="utf-8" src="${tg.url('/static/javascript/prototype.js')}"></script>
+    <script type="text/javascript" charset="utf-8" src="${tg.url('/static/javascript/scriptaculous.js?load=effects')}"></script>
 </head>
 
 <body py:match="item.tag=='{http://www.w3.org/1999/xhtml}body'" py:attrs="item.items()">
diff -r 675c7ce08099 -r 42d6af7a569d ipa-server/ipa-gui/ipagui/templates/usereditform.kid
--- a/ipa-server/ipa-gui/ipagui/templates/usereditform.kid	Thu Aug 30 15:05:12 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/templates/usereditform.kid	Thu Aug 30 15:10:48 2007 -0700
@@ -6,6 +6,34 @@
   <div py:for="field in hidden_fields"
     py:replace="field.display(value_for(field), **params_for(field))" 
     />
+
+    <div class="formsection">Identity Details</div>
+    <table class="formtable" cellpadding="2" cellspacing="0" border="0">
+      <tr>
+        <th>
+          <label class="fieldlabel" for="${user.givenname.field_id}"
+            py:content="user.givenname.label" />:
+        </th>
+        <td>
+          <span py:replace="user.givenname.display(value_for(user.givenname))" />
+          <span py:if="tg.errors.get('givenname')" class="fielderror"
+              py:content="tg.errors.get('givenname')" />
+
+        </td>
+      </tr>
+
+      <tr>
+        <th>
+          <label class="fieldlabel" for="${user.sn.field_id}"
+            py:content="user.sn.label" />:
+        </th>
+        <td>
+          <span py:replace="user.sn.display(value_for(user.sn))" />
+          <span py:if="tg.errors.get('sn')" class="fielderror"
+              py:content="tg.errors.get('sn')" />
+        </td>
+      </tr>
+    </table>
 
     <div class="formsection">Account Details</div>
     <table class="formtable" cellpadding="2" cellspacing="0" border="0">
@@ -85,34 +113,6 @@
       </tr>
     </table>
 
-    <div class="formsection">Identity Details</div>
-    <table class="formtable" cellpadding="2" cellspacing="0" border="0">
-      <tr>
-        <th>
-          <label class="fieldlabel" for="${user.givenname.field_id}"
-            py:content="user.givenname.label" />:
-        </th>
-        <td>
-          <span py:replace="user.givenname.display(value_for(user.givenname))" />
-          <span py:if="tg.errors.get('givenname')" class="fielderror"
-              py:content="tg.errors.get('givenname')" />
-
-        </td>
-      </tr>
-
-      <tr>
-        <th>
-          <label class="fieldlabel" for="${user.sn.field_id}"
-            py:content="user.sn.label" />:
-        </th>
-        <td>
-          <span py:replace="user.sn.display(value_for(user.sn))" />
-          <span py:if="tg.errors.get('sn')" class="fielderror"
-              py:content="tg.errors.get('sn')" />
-        </td>
-      </tr>
-    </table>
-
     <div class="formsection">Contact Details</div>
     <table class="formtable" cellpadding="2" cellspacing="0" border="0">
       <tr>
diff -r 675c7ce08099 -r 42d6af7a569d ipa-server/ipa-gui/ipagui/templates/usernewform.kid
--- a/ipa-server/ipa-gui/ipagui/templates/usernewform.kid	Thu Aug 30 15:05:12 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/templates/usernewform.kid	Thu Aug 30 15:10:48 2007 -0700
@@ -1,6 +1,67 @@
 <div xmlns:py="http://purl.org/kid/ns#"
   class="simpleroster">
   <form action="${action}" name="${name}" method="${method}" class="tableform">
+
+    <div class="formsection">Identity Details</div>
+    <table class="formtable" cellpadding="2" cellspacing="0" border="0">
+      <tr>
+        <th>
+          <label class="fieldlabel" for="${user.givenname.field_id}"
+            py:content="user.givenname.label" />:
+        </th>
+        <td>
+          <span py:replace="user.givenname.display(value_for(user.givenname))" />
+          <span py:if="tg.errors.get('givenname')" class="fielderror"
+              py:content="tg.errors.get('givenname')" />
+
+        </td>
+      </tr>
+
+      <tr>
+        <th>
+          <label class="fieldlabel" for="${user.sn.field_id}"
+            py:content="user.sn.label" />:
+        </th>
+        <td>
+          <span py:replace="user.sn.display(value_for(user.sn))" />
+          <span py:if="tg.errors.get('sn')" class="fielderror"
+              py:content="tg.errors.get('sn')" />
+          <script type="text/javascript">
+            function autofill(self) {
+              givenname = document.getElementById('form_givenname');
+              sn = document.getElementById('form_sn');
+              if ((givenname.value == "") || (sn.value == "")) {
+                return;
+              }
+              uid = document.getElementById('form_uid');
+              mail = document.getElementById('form_mail');
+              if (uid.value == "") {
+                new Ajax.Request('${tg.url('/suggest_uid')}', {
+                    method: 'get',
+                    parameters: {'givenname': givenname.value, 'sn': sn.value},
+                    onSuccess: function(transport) {
+                        uid.value = transport.responseText;
+                        new Effect.Highlight(uid);
+                      }
+                    });
+              }
+              if (mail.value == "") {
+                new Ajax.Request('${tg.url('/suggest_email')}', {
+                    method: 'get',
+                    parameters: {'givenname': givenname.value, 'sn': sn.value},
+                    onSuccess: function(transport) {
+                        mail.value = transport.responseText;
+                        new Effect.Highlight(mail);
+                      }
+                    });
+              }
+            }
+            document.getElementById('form_givenname').onchange = autofill
+            document.getElementById('form_sn').onchange = autofill
+          </script>
+        </td>
+      </tr>
+    </table>
 
     <div class="formsection">Account Details</div>
     <table class="formtable" cellpadding="2" cellspacing="0" border="0">
@@ -63,34 +124,6 @@
       </tr>
     </table>
 
-    <div class="formsection">Identity Details</div>
-    <table class="formtable" cellpadding="2" cellspacing="0" border="0">
-      <tr>
-        <th>
-          <label class="fieldlabel" for="${user.givenname.field_id}"
-            py:content="user.givenname.label" />:
-        </th>
-        <td>
-          <span py:replace="user.givenname.display(value_for(user.givenname))" />
-          <span py:if="tg.errors.get('givenname')" class="fielderror"
-              py:content="tg.errors.get('givenname')" />
-
-        </td>
-      </tr>
-
-      <tr>
-        <th>
-          <label class="fieldlabel" for="${user.sn.field_id}"
-            py:content="user.sn.label" />:
-        </th>
-        <td>
-          <span py:replace="user.sn.display(value_for(user.sn))" />
-          <span py:if="tg.errors.get('sn')" class="fielderror"
-              py:content="tg.errors.get('sn')" />
-        </td>
-      </tr>
-    </table>
-
     <div class="formsection">Contact Details</div>
     <table class="formtable" cellpadding="2" cellspacing="0" border="0">
       <tr>
diff -r 675c7ce08099 -r 42d6af7a569d ipa-server/ipa-gui/ipagui/templates/usershow.kid
--- a/ipa-server/ipa-gui/ipagui/templates/usershow.kid	Thu Aug 30 15:05:12 2007 -0700
+++ b/ipa-server/ipa-gui/ipagui/templates/usershow.kid	Thu Aug 30 15:10:48 2007 -0700
@@ -7,6 +7,22 @@
 </head>
 <body>
     <h2>View Person</h2>
+
+    <div class="formsection">Identity Details</div>
+    <table class="formtable" cellpadding="2" cellspacing="0" border="0">
+        <tr>
+          <th>
+            <label class="fieldlabel" py:content="fields.givenname.label" />:
+          </th>
+          <td>${user.get("givenname")}</td>
+        </tr>
+        <tr>
+          <th>
+            <label class="fieldlabel" py:content="fields.sn.label" />:
+          </th>
+          <td>${user.get("sn")}</td>
+        </tr>
+    </table>
 
     <div class="formsection">Account Details</div>
     <table class="formtable" cellpadding="2" cellspacing="0" border="0">
@@ -30,22 +46,6 @@
         </tr>
     </table>
 
-    <div class="formsection">Identity Details</div>
-    <table class="formtable" cellpadding="2" cellspacing="0" border="0">
-        <tr>
-          <th>
-            <label class="fieldlabel" py:content="fields.givenname.label" />:
-          </th>
-          <td>${user.get("givenname")}</td>
-        </tr>
-        <tr>
-          <th>
-            <label class="fieldlabel" py:content="fields.sn.label" />:
-          </th>
-          <td>${user.get("sn")}</td>
-        </tr>
-    </table>
-
     <div class="formsection">Contact Details</div>
     <table class="formtable" cellpadding="2" cellspacing="0" border="0">
         <tr>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 2228 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/freeipa-devel/attachments/20070830/166c19ad/attachment.bin>


More information about the Freeipa-devel mailing list