mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
Add auto-suggest for uid and email fields.
This commit is contained in:
@@ -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 #
|
||||
|
||||
@@ -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()">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user