summaryrefslogtreecommitdiffstats
path: root/ipa-server
diff options
context:
space:
mode:
authorKevin McCarthy <kmccarth@redhat.com>2007-10-03 13:53:14 -0700
committerKevin McCarthy <kmccarth@redhat.com>2007-10-03 13:53:14 -0700
commit1cef67e2e16ec137a1d04f9f4f99694ed36e3d28 (patch)
treeefa10de0ae86b04f0dcff943056068d2c7d512d0 /ipa-server
parent3ef4a374f723b61f8497c4a4d8921cc18d7f4070 (diff)
downloadfreeipa-1cef67e2e16ec137a1d04f9f4f99694ed36e3d28.tar.gz
freeipa-1cef67e2e16ec137a1d04f9f4f99694ed36e3d28.tar.xz
freeipa-1cef67e2e16ec137a1d04f9f4f99694ed36e3d28.zip
Add the rest of the user fields to the user pages.
Diffstat (limited to 'ipa-server')
-rw-r--r--ipa-server/ipa-gui/ipagui/controllers.py71
-rw-r--r--ipa-server/ipa-gui/ipagui/forms/user.py68
-rw-r--r--ipa-server/ipa-gui/ipagui/templates/usereditform.kid316
-rw-r--r--ipa-server/ipa-gui/ipagui/templates/usernewform.kid351
-rw-r--r--ipa-server/ipa-gui/ipagui/templates/usershow.kid160
-rw-r--r--ipa-server/xmlrpc-server/funcs.py2
6 files changed, 908 insertions, 60 deletions
diff --git a/ipa-server/ipa-gui/ipagui/controllers.py b/ipa-server/ipa-gui/ipagui/controllers.py
index bdb7b102f..792b97a3e 100644
--- a/ipa-server/ipa-gui/ipagui/controllers.py
+++ b/ipa-server/ipa-gui/ipagui/controllers.py
@@ -139,11 +139,41 @@ class Root(controllers.RootController):
#
try:
new_user = ipa.user.User()
- new_user.setValue('uid', kw.get('uid'))
+ new_user.setValue('title', kw.get('title'))
new_user.setValue('givenname', kw.get('givenname'))
new_user.setValue('sn', kw.get('sn'))
+ new_user.setValue('cn', kw.get('cn'))
+ new_user.setValue('displayname', kw.get('displayname'))
+ new_user.setValue('initials', kw.get('initials'))
+
+ new_user.setValue('uid', kw.get('uid'))
+ new_user.setValue('loginshell', kw.get('loginshell'))
+ new_user.setValue('gecos', kw.get('gecos'))
+
new_user.setValue('mail', kw.get('mail'))
new_user.setValue('telephonenumber', kw.get('telephonenumber'))
+ new_user.setValue('facsimiletelephonenumber',
+ kw.get('facsimiletelephonenumber'))
+ new_user.setValue('mobile', kw.get('mobile'))
+ new_user.setValue('pager', kw.get('pager'))
+ new_user.setValue('homephone', kw.get('homephone'))
+
+ new_user.setValue('street', kw.get('street'))
+ new_user.setValue('l', kw.get('l'))
+ new_user.setValue('st', kw.get('st'))
+ new_user.setValue('postalcode', kw.get('postalcode'))
+
+ new_user.setValue('ou', kw.get('ou'))
+ new_user.setValue('businesscategory', kw.get('businesscategory'))
+ new_user.setValue('description', kw.get('description'))
+ new_user.setValue('employeetype', kw.get('employeetype'))
+ # new_user.setValue('manager', kw.get('manager'))
+ new_user.setValue('roomnumber', kw.get('roomnumber'))
+ # new_user.setValue('secretary', kw.get('secretary'))
+
+ new_user.setValue('carlicense', kw.get('carlicense'))
+ new_user.setValue('labeleduri', kw.get('labeleduri'))
+
if kw.get('nsAccountLock'):
new_user.setValue('nsAccountLock', 'true')
@@ -293,10 +323,41 @@ class Root(controllers.RootController):
orig_user_dict = loads(b64decode(kw.get('user_orig')))
new_user = ipa.user.User(orig_user_dict)
+ new_user.setValue('title', kw.get('title'))
new_user.setValue('givenname', kw.get('givenname'))
new_user.setValue('sn', kw.get('sn'))
+ new_user.setValue('cn', kw.get('cn'))
+ new_user.setValue('displayname', kw.get('displayname'))
+ new_user.setValue('initials', kw.get('initials'))
+
+ new_user.setValue('loginshell', kw.get('loginshell'))
+ new_user.setValue('gecos', kw.get('gecos'))
+
new_user.setValue('mail', kw.get('mail'))
new_user.setValue('telephonenumber', kw.get('telephonenumber'))
+ new_user.setValue('facsimiletelephonenumber',
+ kw.get('facsimiletelephonenumber'))
+ new_user.setValue('mobile', kw.get('mobile'))
+ new_user.setValue('pager', kw.get('pager'))
+ new_user.setValue('homephone', kw.get('homephone'))
+
+ new_user.setValue('street', kw.get('street'))
+ new_user.setValue('l', kw.get('l'))
+ new_user.setValue('st', kw.get('st'))
+ new_user.setValue('postalcode', kw.get('postalcode'))
+
+ new_user.setValue('ou', kw.get('ou'))
+ new_user.setValue('businesscategory', kw.get('businesscategory'))
+ new_user.setValue('description', kw.get('description'))
+ new_user.setValue('employeetype', kw.get('employeetype'))
+ # new_user.setValue('manager', kw.get('manager'))
+ new_user.setValue('roomnumber', kw.get('roomnumber'))
+ # new_user.setValue('secretary', kw.get('secretary'))
+
+ new_user.setValue('carlicense', kw.get('carlicense'))
+ new_user.setValue('labeleduri', kw.get('labeleduri'))
+
+
if kw.get('nsAccountLock'):
new_user.setValue('nsAccountLock', 'true')
else:
@@ -306,13 +367,7 @@ class Root(controllers.RootController):
password_change = True
new_user.setValue('uidnumber', str(kw.get('uidnumber')))
new_user.setValue('gidnumber', str(kw.get('gidnumber')))
-
- #
- # this is a hack until we decide on the policy for names/cn/sn/givenName
- #
- new_user.setValue('cn',
- "%s %s" % (new_user.getValue('givenname'),
- new_user.getValue('sn')))
+ new_user.setValue('homedirectory', str(kw.get('homedirectory')))
rv = client.update_user(new_user)
#
diff --git a/ipa-server/ipa-gui/ipagui/forms/user.py b/ipa-server/ipa-gui/ipagui/forms/user.py
index 8beac5100..9072fe78f 100644
--- a/ipa-server/ipa-gui/ipagui/forms/user.py
+++ b/ipa-server/ipa-gui/ipagui/forms/user.py
@@ -2,17 +2,47 @@ import turbogears
from turbogears import validators, widgets
class UserFields():
+ givenname = widgets.TextField(name="givenname", label="Given Name")
+ sn = widgets.TextField(name="sn", label="Family Name")
+ cn = widgets.TextField(name="cn", label="Common Names")
+ title = widgets.TextField(name="title", label="Title")
+ displayname = widgets.TextField(name="displayname", label="Display Name")
+ initials = widgets.TextField(name="initials", label="Initials")
+
uid = widgets.TextField(name="uid", label="Login")
userpassword = widgets.PasswordField(name="userpassword", label="Password")
userpassword_confirm = widgets.PasswordField(name="userpassword_confirm",
label="Confirm Password")
uidnumber = widgets.TextField(name="uidnumber", label="UID")
gidnumber = widgets.TextField(name="gidnumber", label="GID")
- givenname = widgets.TextField(name="givenname", label="Given Name")
- sn = widgets.TextField(name="sn", label="Family Name")
+ homedirectory = widgets.TextField(name="homedirectory", label="Home Directory")
+ loginshell = widgets.TextField(name="loginshell", label="Login Shell")
+ gecos = widgets.TextField(name="gecos", label="GECOS")
+
mail = widgets.TextField(name="mail", label="E-mail Address")
- telephonenumber = widgets.TextField(name="telephonenumber", label="Phone")
- # nsAccountLock = widgets.CheckBox(name="nsAccountLock", label="Account Deactivated")
+ telephonenumber = widgets.TextField(name="telephonenumber", label="Work Number")
+ facsimiletelephonenumber = widgets.TextField(name="facsimiletelephonenumber",
+ label="Fax Number")
+ mobile = widgets.TextField(name="mobile", label="Cell Number")
+ pager = widgets.TextField(name="pager", label="Pager Number")
+ homephone = widgets.TextField(name="homephone", label="Home Number")
+
+ street = widgets.TextField(name="street", label="Street Address")
+ l = widgets.TextField(name="l", label="City")
+ st = widgets.TextField(name="st", label="State")
+ postalcode = widgets.TextField(name="postalcode", label="ZIP")
+
+ ou = widgets.TextField(name="ou", label="Org Unit")
+ businesscategory = widgets.TextField(name="businesscategory", label="Tags")
+ description = widgets.TextField(name="description", label="Description")
+ employeetype = widgets.TextField(name="employeetype", label="Employee Type")
+ manager = widgets.TextField(name="manager", label="Manager")
+ roomnumber = widgets.TextField(name="roomnumber", label="Room Number")
+ secretary = widgets.TextField(name="secretary", label="Secretary")
+
+ carlicense = widgets.TextField(name="carlicense", label="Car License")
+ labeleduri = widgets.TextField(name="labeleduri", label="Home Page")
+
nsAccountLock = widgets.SingleSelectField(name="nsAccountLock",
label="Account Status",
options = [("", "active"), ("true", "inactive")])
@@ -34,8 +64,6 @@ class UserNewValidator(validators.Schema):
givenname = validators.String(not_empty=True)
sn = validators.String(not_empty=True)
mail = validators.Email(not_empty=True)
- # validators.PhoneNumber may be a bit too picky, requiring an area code
- # telephonenumber = validators.PlainText(not_empty=False)
chained_validators = [
validators.FieldsMatch('userpassword', 'userpassword_confirm')
@@ -45,10 +73,9 @@ class UserNewValidator(validators.Schema):
class UserNewForm(widgets.Form):
params = ['user']
- fields = [UserFields.uid, UserFields.givenname,
- UserFields.sn, UserFields.mail,
- UserFields.dn_to_info_json,
- ]
+ hidden_fields = [
+ UserFields.dn_to_info_json,
+ ]
validator = UserNewValidator()
@@ -59,10 +86,6 @@ class UserNewForm(widgets.Form):
def update_params(self, params):
super(UserNewForm,self).update_params(params)
- params['has_foo'] = self.has_foo
-
- def has_foo(self):
- return False
class UserEditValidator(validators.Schema):
userpassword = validators.String(not_empty=False)
@@ -72,8 +95,6 @@ class UserEditValidator(validators.Schema):
mail = validators.Email(not_empty=True)
uidnumber = validators.Int(not_empty=False)
gidnumber = validators.Int(not_empty=False)
- # validators.PhoneNumber may be a bit too picky, requiring an area code
- # telephonenumber = validators.PlainText(not_empty=False)
pre_validators = [
validators.RequireIfPresent(required='uidnumber', present='editprotected'),
@@ -87,14 +108,13 @@ class UserEditValidator(validators.Schema):
class UserEditForm(widgets.Form):
params = ['user']
- fields = [UserFields.givenname, UserFields.sn, UserFields.mail,
- UserFields.uid_hidden, UserFields.user_orig,
- UserFields.uidnumber, UserFields.gidnumber,
- UserFields.krbPasswordExpiration_hidden,
- UserFields.editprotected_hidden,
- UserFields.user_groups_data,
- UserFields.dn_to_info_json,
- ]
+ hidden_fields = [
+ UserFields.uid_hidden, UserFields.user_orig,
+ UserFields.krbPasswordExpiration_hidden,
+ UserFields.editprotected_hidden,
+ UserFields.user_groups_data,
+ UserFields.dn_to_info_json,
+ ]
validator = UserEditValidator()
diff --git a/ipa-server/ipa-gui/ipagui/templates/usereditform.kid b/ipa-server/ipa-gui/ipagui/templates/usereditform.kid
index 135f352a0..a21f0b7d1 100644
--- a/ipa-server/ipa-gui/ipagui/templates/usereditform.kid
+++ b/ipa-server/ipa-gui/ipagui/templates/usereditform.kid
@@ -32,17 +32,20 @@ from ipagui.helpers import ipahelper
passwordConfirmField = document.getElementById('form_userpassword_confirm');
uidnumberField = document.getElementById('form_uidnumber');
gidnumberField = document.getElementById('form_gidnumber');
+ homedirectoryField = document.getElementById('form_homedirectory');
if (checkbox.checked) {
passwordField.disabled = false;
passwordConfirmField.disabled = false;
uidnumberField.disabled = false;
gidnumberField.disabled = false;
+ homedirectoryField.disabled = false;
$('form_editprotected').value = 'true';
} else {
passwordField.disabled = true;
passwordConfirmField.disabled = true;
uidnumberField.disabled = true;
gidnumberField.disabled = true;
+ homedirectoryField.disabled = true;
$('form_editprotected').value = '';
}
}
@@ -76,6 +79,19 @@ from ipagui.helpers import ipahelper
<table class="formtable" cellpadding="2" cellspacing="0" border="0">
<tr>
<th>
+ <label class="fieldlabel" for="${user.title.field_id}"
+ py:content="user.title.label" />:
+ </th>
+ <td>
+ <span py:replace="user.title.display(value_for(user.title))" />
+ <span py:if="tg.errors.get('title')" class="fielderror"
+ py:content="tg.errors.get('title')" />
+
+ </td>
+ </tr>
+
+ <tr>
+ <th>
<label class="fieldlabel" for="${user.givenname.field_id}"
py:content="user.givenname.label" />:
</th>
@@ -98,12 +114,62 @@ from ipagui.helpers import ipahelper
py:content="tg.errors.get('sn')" />
</td>
</tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.cn.field_id}"
+ py:content="user.cn.label" />:
+ </th>
+ <td>
+ <span py:replace="user.cn.display(value_for(user.cn))" />
+ <span py:if="tg.errors.get('cn')" class="fielderror"
+ py:content="tg.errors.get('cn')" />
+
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.displayname.field_id}"
+ py:content="user.displayname.label" />:
+ </th>
+ <td>
+ <span py:replace="user.displayname.display(value_for(user.displayname))" />
+ <span py:if="tg.errors.get('displayname')" class="fielderror"
+ py:content="tg.errors.get('displayname')" />
+
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.initials.field_id}"
+ py:content="user.initials.label" />:
+ </th>
+ <td>
+ <span py:replace="user.initials.display(value_for(user.initials))" />
+ <span py:if="tg.errors.get('initials')" class="fielderror"
+ py:content="tg.errors.get('initials')" />
+
+ </td>
+ </tr>
</table>
<div class="formsection">Account Details</div>
<table class="formtable" cellpadding="2" cellspacing="0" border="0">
<tr>
<th>
+ <label class="fieldlabel" for="${user.nsAccountLock.field_id}"
+ py:content="user.nsAccountLock.label" />:
+ </th>
+ <td>
+ <span py:replace="user.nsAccountLock.display(value_for(user.nsAccountLock))" />
+ <span py:if="tg.errors.get('nsAccountLock')" class="fielderror"
+ py:content="tg.errors.get('nsAccountLock')" />
+ </td>
+ </tr>
+ <tr>
+ <th>
<label class="fieldlabel" for="${user.uid.field_id}"
py:content="user.uid.label" />:
</th>
@@ -213,6 +279,49 @@ from ipagui.helpers import ipahelper
</script>
</td>
</tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.homedirectory.field_id}"
+ py:content="user.homedirectory.label" />:
+ </th>
+ <td>
+ <span py:replace="user.homedirectory.display(
+ value_for(user.homedirectory))" />
+ <span py:if="tg.errors.get('homedirectory')" class="fielderror"
+ py:content="tg.errors.get('homedirectory')" />
+
+ <script type="text/javascript">
+ document.getElementById('form_homedirectory').disabled = true;
+ </script>
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.loginshell.field_id}"
+ py:content="user.loginshell.label" />:
+ </th>
+ <td>
+ <span py:replace="user.loginshell.display(
+ value_for(user.loginshell))" />
+ <span py:if="tg.errors.get('loginshell')" class="fielderror"
+ py:content="tg.errors.get('loginshell')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.gecos.field_id}"
+ py:content="user.gecos.label" />:
+ </th>
+ <td>
+ <span py:replace="user.gecos.display(
+ value_for(user.gecos))" />
+ <span py:if="tg.errors.get('gecos')" class="fielderror"
+ py:content="tg.errors.get('gecos')" />
+ </td>
+ </tr>
</table>
<div class="formsection">Contact Details</div>
@@ -228,6 +337,7 @@ from ipagui.helpers import ipahelper
py:content="tg.errors.get('mail')" />
</td>
</tr>
+
<tr>
<th>
<label class="fieldlabel" for="${user.telephonenumber.field_id}"
@@ -239,23 +349,217 @@ from ipagui.helpers import ipahelper
py:content="tg.errors.get('telephonenumber')" />
</td>
</tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.facsimiletelephonenumber.field_id}"
+ py:content="user.facsimiletelephonenumber.label" />:
+ </th>
+ <td>
+ <span py:replace="user.facsimiletelephonenumber.display(value_for(user.facsimiletelephonenumber))" />
+ <span py:if="tg.errors.get('facsimiletelephonenumber')" class="fielderror"
+ py:content="tg.errors.get('facsimiletelephonenumber')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.mobile.field_id}"
+ py:content="user.mobile.label" />:
+ </th>
+ <td>
+ <span py:replace="user.mobile.display(value_for(user.mobile))" />
+ <span py:if="tg.errors.get('mobile')" class="fielderror"
+ py:content="tg.errors.get('mobile')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.pager.field_id}"
+ py:content="user.pager.label" />:
+ </th>
+ <td>
+ <span py:replace="user.pager.display(value_for(user.pager))" />
+ <span py:if="tg.errors.get('pager')" class="fielderror"
+ py:content="tg.errors.get('pager')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.homephone.field_id}"
+ py:content="user.homephone.label" />:
+ </th>
+ <td>
+ <span py:replace="user.homephone.display(value_for(user.homephone))" />
+ <span py:if="tg.errors.get('homephone')" class="fielderror"
+ py:content="tg.errors.get('homephone')" />
+ </td>
+ </tr>
</table>
- <div class="formsection">Account Status</div>
+ <div class="formsection">Mailing Address</div>
<table class="formtable" cellpadding="2" cellspacing="0" border="0">
<tr>
<th>
- <label class="fieldlabel" for="${user.nsAccountLock.field_id}"
- py:content="user.nsAccountLock.label" />:
+ <label class="fieldlabel" for="${user.street.field_id}"
+ py:content="user.street.label" />:
</th>
<td>
- <span py:replace="user.nsAccountLock.display(value_for(user.nsAccountLock))" />
- <span py:if="tg.errors.get('nsAccountLock')" class="fielderror"
- py:content="tg.errors.get('nsAccountLock')" />
+ <span py:replace="user.street.display(value_for(user.street))" />
+ <span py:if="tg.errors.get('street')" class="fielderror"
+ py:content="tg.errors.get('street')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.l.field_id}"
+ py:content="user.l.label" />:
+ </th>
+ <td>
+ <span py:replace="user.l.display(value_for(user.l))" />
+ <span py:if="tg.errors.get('l')" class="fielderror"
+ py:content="tg.errors.get('l')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.st.field_id}"
+ py:content="user.st.label" />:
+ </th>
+ <td>
+ <span py:replace="user.st.display(value_for(user.st))" />
+ <span py:if="tg.errors.get('st')" class="fielderror"
+ py:content="tg.errors.get('st')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.postalcode.field_id}"
+ py:content="user.postalcode.label" />:
+ </th>
+ <td>
+ <span py:replace="user.postalcode.display(value_for(user.postalcode))" />
+ <span py:if="tg.errors.get('postalcode')" class="fielderror"
+ py:content="tg.errors.get('postalcode')" />
+ </td>
+ </tr>
+ </table>
+
+ <div class="formsection">Employee Information</div>
+ <table class="formtable" cellpadding="2" cellspacing="0" border="0">
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.ou.field_id}"
+ py:content="user.ou.label" />:
+ </th>
+ <td>
+ <span py:replace="user.ou.display(value_for(user.ou))" />
+ <span py:if="tg.errors.get('ou')" class="fielderror"
+ py:content="tg.errors.get('ou')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.businesscategory.field_id}"
+ py:content="user.businesscategory.label" />:
+ </th>
+ <td>
+ <span py:replace="user.businesscategory.display(value_for(user.businesscategory))" />
+ <span py:if="tg.errors.get('businesscategory')" class="fielderror"
+ py:content="tg.errors.get('businesscategory')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.description.field_id}"
+ py:content="user.description.label" />:
+ </th>
+ <td>
+ <span py:replace="user.description.display(value_for(user.description))" />
+ <span py:if="tg.errors.get('description')" class="fielderror"
+ py:content="tg.errors.get('description')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.employeetype.field_id}"
+ py:content="user.employeetype.label" />:
+ </th>
+ <td>
+ <span py:replace="user.employeetype.display(value_for(user.employeetype))" />
+ <span py:if="tg.errors.get('employeetype')" class="fielderror"
+ py:content="tg.errors.get('employeetype')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.manager.field_id}"
+ py:content="user.manager.label" />:
+ </th>
+ <td>
+ TODO
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.roomnumber.field_id}"
+ py:content="user.roomnumber.label" />:
+ </th>
+ <td>
+ <span py:replace="user.roomnumber.display(value_for(user.roomnumber))" />
+ <span py:if="tg.errors.get('roomnumber')" class="fielderror"
+ py:content="tg.errors.get('roomnumber')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.secretary.field_id}"
+ py:content="user.secretary.label" />:
+ </th>
+ <td>
+ TODO
</td>
</tr>
</table>
+ <div class="formsection">Misc Information</div>
+ <table class="formtable" cellpadding="2" cellspacing="0" border="0">
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.carlicense.field_id}"
+ py:content="user.carlicense.label" />:
+ </th>
+ <td>
+ <span py:replace="user.carlicense.display(value_for(user.carlicense))" />
+ <span py:if="tg.errors.get('carlicense')" class="fielderror"
+ py:content="tg.errors.get('carlicense')" />
+ </td>
+ </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.labeleduri.field_id}"
+ py:content="user.labeleduri.label" />:
+ </th>
+ <td>
+ <span py:replace="user.labeleduri.display(value_for(user.labeleduri))" />
+ <span py:if="tg.errors.get('labeleduri')" class="fielderror"
+ py:content="tg.errors.get('labeleduri')" />
+ </td>
+ </tr>
+ </table>
+
+
<div>
<div class="formsection">Groups</div>
diff --git a/ipa-server/ipa-gui/ipagui/templates/usernewform.kid b/ipa-server/ipa-gui/ipagui/templates/usernewform.kid
index fd79e5ed8..de1e21302 100644
--- a/ipa-server/ipa-gui/ipagui/templates/usernewform.kid
+++ b/ipa-server/ipa-gui/ipagui/templates/usernewform.kid
@@ -49,6 +49,19 @@ from ipagui.helpers import ipahelper
<table class="formtable" cellpadding="2" cellspacing="0" border="0">
<tr>
<th>
+ <label class="fieldlabel" for="${user.title.field_id}"
+ py:content="user.title.label" />:
+ </th>
+ <td>
+ <span py:replace="user.title.display(value_for(user.title))" />
+ <span py:if="tg.errors.get('title')" class="fielderror"
+ py:content="tg.errors.get('title')" />
+
+ </td>
+ </tr>
+
+ <tr>
+ <th>
<label class="fieldlabel" for="${user.givenname.field_id}"
py:content="user.givenname.label" />:
</th>
@@ -70,17 +83,25 @@ from ipagui.helpers import ipahelper
<span py:if="tg.errors.get('sn')" class="fielderror"
py:content="tg.errors.get('sn')" />
<script type="text/javascript">
- var uid_suggest = ""
- var mail_suggest = ""
+ var uid_suggest = "";
+ var mail_suggest = "";
+ var cn_suggest = "";
+ var displayname_suggest = "";
+ var initials_suggest = "";
function autofill(self) {
- givenname = document.getElementById('form_givenname');
- sn = document.getElementById('form_sn');
+ var givenname = $('form_givenname');
+ var sn = $('form_sn');
if ((givenname.value == "") || (sn.value == "")) {
return;
}
- uid = document.getElementById('form_uid');
- mail = document.getElementById('form_mail');
+
+ var uid = $('form_uid');
+ var mail = $('form_mail');
+ var cn = $('form_cn');
+ var displayname = $('form_displayname');
+ var initials = $('form_initials');
+
if ((uid.value == "") || (uid.value == uid_suggest)) {
new Ajax.Request('${tg.url('/suggest_uid')}', {
method: 'get',
@@ -92,6 +113,7 @@ from ipagui.helpers import ipahelper
}
});
}
+
if ((mail.value == "") || (mail.value == mail_suggest)) {
new Ajax.Request('${tg.url('/suggest_email')}', {
method: 'get',
@@ -103,18 +125,89 @@ from ipagui.helpers import ipahelper
}
});
}
+
+ if ((cn.value == "") || (cn.value == cn_suggest)) {
+ cn.value = givenname.value + " " + sn.value;
+ cn_suggest = cn.value;
+ new Effect.Highlight(cn);
+ }
+
+ if ((displayname.value == "") ||
+ (displayname.value == displayname_suggest)) {
+ displayname.value = givenname.value + " " + sn.value;
+ displayname_suggest = displayname.value;
+ new Effect.Highlight(displayname);
+ }
+
+ if ((displayname.value == "") ||
+ (displayname.value == displayname_suggest)) {
+ initials.value = givenname.value[0] + sn.value[0];
+ initials_suggest = initials.value;
+ new Effect.Highlight(initials);
+ }
}
- document.getElementById('form_givenname').onchange = autofill
- document.getElementById('form_sn').onchange = autofill
+
+ document.getElementById('form_givenname').onchange = autofill;
+ document.getElementById('form_sn').onchange = autofill;
</script>
</td>
</tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.cn.field_id}"
+ py:content="user.cn.label" />:
+ </th>
+ <td>
+ <span py:replace="user.cn.display(value_for(user.cn))" />
+ <span py:if="tg.errors.get('cn')" class="fielderror"
+ py:content="tg.errors.get('cn')" />
+
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.displayname.field_id}"
+ py:content="user.displayname.label" />:
+ </th>
+ <td>
+ <span py:replace="user.displayname.display(value_for(user.displayname))" />
+ <span py:if="tg.errors.get('displayname')" class="fielderror"
+ py:content="tg.errors.get('displayname')" />
+
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.initials.field_id}"
+ py:content="user.initials.label" />:
+ </th>
+ <td>
+ <span py:replace="user.initials.display(value_for(user.initials))" />
+ <span py:if="tg.errors.get('initials')" class="fielderror"
+ py:content="tg.errors.get('initials')" />
+
+ </td>
+ </tr>
</table>
<div class="formsection">Account Details</div>
<table class="formtable" cellpadding="2" cellspacing="0" border="0">
<tr>
<th>
+ <label class="fieldlabel" for="${user.nsAccountLock.field_id}"
+ py:content="user.nsAccountLock.label" />:
+ </th>
+ <td>
+ <span py:replace="user.nsAccountLock.display(value_for(user.nsAccountLock))" />
+ <span py:if="tg.errors.get('nsAccountLock')" class="fielderror"
+ py:content="tg.errors.get('nsAccountLock')" />
+ </td>
+ </tr>
+ <tr>
+ <th>
<label class="fieldlabel" for="${user.uid.field_id}"
py:content="user.uid.label" />:
</th>
@@ -181,6 +274,42 @@ from ipagui.helpers import ipahelper
Generated by server
</td>
</tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.homedirectory.field_id}"
+ py:content="user.homedirectory.label" />:
+ </th>
+ <td>
+ Generated by server
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.loginshell.field_id}"
+ py:content="user.loginshell.label" />:
+ </th>
+ <td>
+ <span py:replace="user.loginshell.display(
+ value_for(user.loginshell))" />
+ <span py:if="tg.errors.get('loginshell')" class="fielderror"
+ py:content="tg.errors.get('loginshell')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.gecos.field_id}"
+ py:content="user.gecos.label" />:
+ </th>
+ <td>
+ <span py:replace="user.gecos.display(
+ value_for(user.gecos))" />
+ <span py:if="tg.errors.get('gecos')" class="fielderror"
+ py:content="tg.errors.get('gecos')" />
+ </td>
+ </tr>
</table>
<div class="formsection">Contact Details</div>
@@ -196,6 +325,7 @@ from ipagui.helpers import ipahelper
py:content="tg.errors.get('mail')" />
</td>
</tr>
+
<tr>
<th>
<label class="fieldlabel" for="${user.telephonenumber.field_id}"
@@ -207,19 +337,212 @@ from ipagui.helpers import ipahelper
py:content="tg.errors.get('telephonenumber')" />
</td>
</tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.facsimiletelephonenumber.field_id}"
+ py:content="user.facsimiletelephonenumber.label" />:
+ </th>
+ <td>
+ <span py:replace="user.facsimiletelephonenumber.display(value_for(user.facsimiletelephonenumber))" />
+ <span py:if="tg.errors.get('facsimiletelephonenumber')" class="fielderror"
+ py:content="tg.errors.get('facsimiletelephonenumber')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.mobile.field_id}"
+ py:content="user.mobile.label" />:
+ </th>
+ <td>
+ <span py:replace="user.mobile.display(value_for(user.mobile))" />
+ <span py:if="tg.errors.get('mobile')" class="fielderror"
+ py:content="tg.errors.get('mobile')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.pager.field_id}"
+ py:content="user.pager.label" />:
+ </th>
+ <td>
+ <span py:replace="user.pager.display(value_for(user.pager))" />
+ <span py:if="tg.errors.get('pager')" class="fielderror"
+ py:content="tg.errors.get('pager')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.homephone.field_id}"
+ py:content="user.homephone.label" />:
+ </th>
+ <td>
+ <span py:replace="user.homephone.display(value_for(user.homephone))" />
+ <span py:if="tg.errors.get('homephone')" class="fielderror"
+ py:content="tg.errors.get('homephone')" />
+ </td>
+ </tr>
</table>
- <div class="formsection">Account Status</div>
+ <div class="formsection">Mailing Address</div>
<table class="formtable" cellpadding="2" cellspacing="0" border="0">
<tr>
<th>
- <label class="fieldlabel" for="${user.nsAccountLock.field_id}"
- py:content="user.nsAccountLock.label" />:
+ <label class="fieldlabel" for="${user.street.field_id}"
+ py:content="user.street.label" />:
</th>
<td>
- <span py:replace="user.nsAccountLock.display(value_for(user.nsAccountLock))" />
- <span py:if="tg.errors.get('nsAccountLock')" class="fielderror"
- py:content="tg.errors.get('nsAccountLock')" />
+ <span py:replace="user.street.display(value_for(user.street))" />
+ <span py:if="tg.errors.get('street')" class="fielderror"
+ py:content="tg.errors.get('street')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.l.field_id}"
+ py:content="user.l.label" />:
+ </th>
+ <td>
+ <span py:replace="user.l.display(value_for(user.l))" />
+ <span py:if="tg.errors.get('l')" class="fielderror"
+ py:content="tg.errors.get('l')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.st.field_id}"
+ py:content="user.st.label" />:
+ </th>
+ <td>
+ <span py:replace="user.st.display(value_for(user.st))" />
+ <span py:if="tg.errors.get('st')" class="fielderror"
+ py:content="tg.errors.get('st')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.postalcode.field_id}"
+ py:content="user.postalcode.label" />:
+ </th>
+ <td>
+ <span py:replace="user.postalcode.display(value_for(user.postalcode))" />
+ <span py:if="tg.errors.get('postalcode')" class="fielderror"
+ py:content="tg.errors.get('postalcode')" />
+ </td>
+ </tr>
+ </table>
+
+ <div class="formsection">Employee Information</div>
+ <table class="formtable" cellpadding="2" cellspacing="0" border="0">
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.ou.field_id}"
+ py:content="user.ou.label" />:
+ </th>
+ <td>
+ <span py:replace="user.ou.display(value_for(user.ou))" />
+ <span py:if="tg.errors.get('ou')" class="fielderror"
+ py:content="tg.errors.get('ou')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.businesscategory.field_id}"
+ py:content="user.businesscategory.label" />:
+ </th>
+ <td>
+ <span py:replace="user.businesscategory.display(value_for(user.businesscategory))" />
+ <span py:if="tg.errors.get('businesscategory')" class="fielderror"
+ py:content="tg.errors.get('businesscategory')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.description.field_id}"
+ py:content="user.description.label" />:
+ </th>
+ <td>
+ <span py:replace="user.description.display(value_for(user.description))" />
+ <span py:if="tg.errors.get('description')" class="fielderror"
+ py:content="tg.errors.get('description')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.employeetype.field_id}"
+ py:content="user.employeetype.label" />:
+ </th>
+ <td>
+ <span py:replace="user.employeetype.display(value_for(user.employeetype))" />
+ <span py:if="tg.errors.get('employeetype')" class="fielderror"
+ py:content="tg.errors.get('employeetype')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.manager.field_id}"
+ py:content="user.manager.label" />:
+ </th>
+ <td>
+ TODO
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.roomnumber.field_id}"
+ py:content="user.roomnumber.label" />:
+ </th>
+ <td>
+ <span py:replace="user.roomnumber.display(value_for(user.roomnumber))" />
+ <span py:if="tg.errors.get('roomnumber')" class="fielderror"
+ py:content="tg.errors.get('roomnumber')" />
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.secretary.field_id}"
+ py:content="user.secretary.label" />:
+ </th>
+ <td>
+ TODO
+ </td>
+ </tr>
+ </table>
+
+ <div class="formsection">Misc Information</div>
+ <table class="formtable" cellpadding="2" cellspacing="0" border="0">
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.carlicense.field_id}"
+ py:content="user.carlicense.label" />:
+ </th>
+ <td>
+ <span py:replace="user.carlicense.display(value_for(user.carlicense))" />
+ <span py:if="tg.errors.get('carlicense')" class="fielderror"
+ py:content="tg.errors.get('carlicense')" />
+ </td>
+ </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" for="${user.labeleduri.field_id}"
+ py:content="user.labeleduri.label" />:
+ </th>
+ <td>
+ <span py:replace="user.labeleduri.display(value_for(user.labeleduri))" />
+ <span py:if="tg.errors.get('labeleduri')" class="fielderror"
+ py:content="tg.errors.get('labeleduri')" />
</td>
</tr>
</table>
diff --git a/ipa-server/ipa-gui/ipagui/templates/usershow.kid b/ipa-server/ipa-gui/ipagui/templates/usershow.kid
index 818dd78b5..311500289 100644
--- a/ipa-server/ipa-gui/ipagui/templates/usershow.kid
+++ b/ipa-server/ipa-gui/ipagui/templates/usershow.kid
@@ -37,6 +37,12 @@ else:
<table class="formtable" cellpadding="2" cellspacing="0" border="0">
<tr>
<th>
+ <label class="fieldlabel" py:content="fields.title.label" />:
+ </th>
+ <td>${user.get("title")}</td>
+ </tr>
+ <tr>
+ <th>
<label class="fieldlabel" py:content="fields.givenname.label" />:
</th>
<td>${user.get("givenname")}</td>
@@ -47,12 +53,36 @@ else:
</th>
<td>${user.get("sn")}</td>
</tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.cn.label" />:
+ </th>
+ <td>${user.get("cn")}</td>
+ </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.displayname.label" />:
+ </th>
+ <td>${user.get("displayname")}</td>
+ </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.initials.label" />:
+ </th>
+ <td>${user.get("initials")}</td>
+ </tr>
</table>
<div class="formsection">Account Details</div>
<table class="formtable" cellpadding="2" cellspacing="0" border="0">
<tr>
<th>
+ <label class="fieldlabel" py:content="fields.nsAccountLock.label" />:
+ </th>
+ <td>${userhelper.account_status_display(user.get("nsAccountLock"))}</td>
+ </tr>
+ <tr>
+ <th>
<label class="fieldlabel" py:content="fields.uid.label" />:
</th>
<td>${user.get("uid")}</td>
@@ -69,6 +99,24 @@ else:
</th>
<td>${user.get("gidnumber")}</td>
</tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.homedirectory.label" />:
+ </th>
+ <td>${user.get("homedirectory")}</td>
+ </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.loginshell.label" />:
+ </th>
+ <td>${user.get("loginshell")}</td>
+ </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.gecos.label" />:
+ </th>
+ <td>${user.get("gecos")}</td>
+ </tr>
</table>
<div class="formsection">Contact Details</div>
@@ -85,6 +133,86 @@ else:
</th>
<td>${user.get("telephonenumber")}</td>
</tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.facsimiletelephonenumber.label" />:
+ </th>
+ <td>${user.get("facsimiletelephonenumber")}</td>
+ </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.mobile.label" />:
+ </th>
+ <td>${user.get("mobile")}</td>
+ </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.pager.label" />:
+ </th>
+ <td>${user.get("pager")}</td>
+ </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.homephone.label" />:
+ </th>
+ <td>${user.get("homephone")}</td>
+ </tr>
+ </table>
+
+ <div class="formsection">Mailing Address</div>
+ <table class="formtable" cellpadding="2" cellspacing="0" border="0">
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.street.label" />:
+ </th>
+ <td>${user.get("street")}</td>
+ </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.l.label" />:
+ </th>
+ <td>${user.get("l")}</td>
+ </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.st.label" />:
+ </th>
+ <td>${user.get("st")}</td>
+ </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.postalcode.label" />:
+ </th>
+ <td>${user.get("postalcode")}</td>
+ </tr>
+ </table>
+
+ <div class="formsection">Employee Information</div>
+ <table class="formtable" cellpadding="2" cellspacing="0" border="0">
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.ou.label" />:
+ </th>
+ <td>${user.get("ou")}</td>
+ </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.businesscategory.label" />:
+ </th>
+ <td>${user.get("businesscategory")}</td>
+ </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.description.label" />:
+ </th>
+ <td>${user.get("description")}</td>
+ </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.employeetype.label" />:
+ </th>
+ <td>${user.get("employeetype")}</td>
+ </tr>
<tr py:if='user_manager'>
<th>
Manager:
@@ -94,16 +222,34 @@ else:
>${user_manager.givenname} ${user_manager.sn}</a>
</td>
</tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.roomnumber.label" />:
+ </th>
+ <td>${user.get("roomnumber")}</td>
+ </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.secretary.label" />:
+ </th>
+ <td>TODO</td>
+ </tr>
</table>
- <div class="formsection">Account Status</div>
+ <div class="formsection">Misc Information</div>
<table class="formtable" cellpadding="2" cellspacing="0" border="0">
- <tr>
- <th>
- <label class="fieldlabel" py:content="fields.nsAccountLock.label" />:
- </th>
- <td>${userhelper.account_status_display(user.get("nsAccountLock"))}</td>
- </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.carlicense.label" />:
+ </th>
+ <td>${user.get("carlicense")}</td>
+ </tr>
+ <tr>
+ <th>
+ <label class="fieldlabel" py:content="fields.labeleduri.label" />:
+ </th>
+ <td>${user.get("labeleduri")}</td>
+ </tr>
</table>
<div class="formsection" py:if='len(user_reports) &gt; 0'>Direct Reports</div>
diff --git a/ipa-server/xmlrpc-server/funcs.py b/ipa-server/xmlrpc-server/funcs.py
index 63df1ca8e..0f4850e9e 100644
--- a/ipa-server/xmlrpc-server/funcs.py
+++ b/ipa-server/xmlrpc-server/funcs.py
@@ -352,7 +352,7 @@ class IPAServer:
# Let us add in some missing attributes
if user.get('homedirectory') is None:
user['homedirectory'] = '/home/%s' % user.get('uid')
- if not user.get('gecos') is None:
+ if user.get('gecos') is None:
user['gecos'] = user['uid']
# FIXME: This can be removed once the DS plugin is installed