[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