Add auto-suggest for uid and email fields.

This commit is contained in:
Kevin McCarthy
2007-08-30 15:10:48 -07:00
parent 59f843517d
commit 90a34f3865
5 changed files with 182 additions and 72 deletions

View File

@@ -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 #

View File

@@ -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()">

View File

@@ -7,6 +7,34 @@
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">
<tr>
@@ -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>

View File

@@ -2,6 +2,67 @@
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">
<tr>
@@ -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>

View File

@@ -8,6 +8,22 @@
<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">
<tr>
@@ -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>