diff options
author | Kevin McCarthy <kmccarth@redhat.com> | 2007-10-19 15:19:28 -0700 |
---|---|---|
committer | Kevin McCarthy <kmccarth@redhat.com> | 2007-10-19 15:19:28 -0700 |
commit | f881e21f7fae0c6343cc030cd301fdd33c162751 (patch) | |
tree | da2a943c916ea0e8dcf1e8a80df490318e742a29 | |
parent | 1685751b1cd67191793f103afe340be540842b1e (diff) | |
download | freeipa-f881e21f7fae0c6343cc030cd301fdd33c162751.tar.gz freeipa-f881e21f7fae0c6343cc030cd301fdd33c162751.tar.xz freeipa-f881e21f7fae0c6343cc030cd301fdd33c162751.zip |
Add add/edit/show for manager and secretary fields.
9 files changed, 293 insertions, 24 deletions
diff --git a/ipa-server/ipa-gui/ipagui/forms/user.py b/ipa-server/ipa-gui/ipagui/forms/user.py index 9072fe78f..73261cd9e 100644 --- a/ipa-server/ipa-gui/ipagui/forms/user.py +++ b/ipa-server/ipa-gui/ipagui/forms/user.py @@ -36,9 +36,11 @@ class UserFields(): 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") + manager = widgets.HiddenField(name="manager", label="Manager") + manager_cn = widgets.HiddenField(name="manager_cn", label="Manager") roomnumber = widgets.TextField(name="roomnumber", label="Room Number") - secretary = widgets.TextField(name="secretary", label="Secretary") + secretary = widgets.HiddenField(name="secretary", label="Secretary") + secretary_cn = widgets.HiddenField(name="secretary_cn", label="Manager") carlicense = widgets.TextField(name="carlicense", label="Car License") labeleduri = widgets.TextField(name="labeleduri", label="Home Page") @@ -75,6 +77,10 @@ class UserNewForm(widgets.Form): hidden_fields = [ UserFields.dn_to_info_json, + UserFields.manager, + UserFields.manager_cn, + UserFields.secretary, + UserFields.secretary_cn, ] validator = UserNewValidator() @@ -114,6 +120,10 @@ class UserEditForm(widgets.Form): UserFields.editprotected_hidden, UserFields.user_groups_data, UserFields.dn_to_info_json, + UserFields.manager, + UserFields.manager_cn, + UserFields.secretary, + UserFields.secretary_cn, ] validator = UserEditValidator() diff --git a/ipa-server/ipa-gui/ipagui/static/javascript/Makefile.am b/ipa-server/ipa-gui/ipagui/static/javascript/Makefile.am index ecf6164cf..908569afc 100644 --- a/ipa-server/ipa-gui/ipagui/static/javascript/Makefile.am +++ b/ipa-server/ipa-gui/ipagui/static/javascript/Makefile.am @@ -3,6 +3,7 @@ NULL = appdir = $(IPA_DATA_DIR)/ipagui/static/javascript app_DATA = \ dynamicedit.js \ + dynamicselect.js \ effects.js \ ipautil.js \ prototype.js \ diff --git a/ipa-server/ipa-gui/ipagui/static/javascript/dynamicselect.js b/ipa-server/ipa-gui/ipagui/static/javascript/dynamicselect.js new file mode 100644 index 000000000..534646366 --- /dev/null +++ b/ipa-server/ipa-gui/ipagui/static/javascript/dynamicselect.js @@ -0,0 +1,53 @@ +/** + * dynamicselect.js + * + * Shared code, data, and functions for the dynamic select lists on the + * edit user pages. + * + */ + +function enterDoSelectSearch(e, which_select) { + var keyPressed; + if (window.event) { + keyPressed = window.event.keyCode; + } else { + keyPressed = e.which; + } + + if (keyPressed == 13) { + return doSelectSearch(which_select); + } else { + return true; + } +} + +function startSelect(which_select) { + new Effect.Appear($(which_select + '_searcharea'), {duration: 0.25}); + new Effect.Fade($(which_select + '_links'), {duration: 0.25}); + return false; +} + +function doSelect(which_select, select_dn, select_cn) { + select_dn_field = $('form_' + which_select); + select_cn_field = $('form_' + which_select + '_cn'); + select_cn_span = $(which_select + '_select_cn'); + + select_dn_field.value = select_dn; + select_cn_field.value = select_cn; + select_cn_span.update(select_cn); + + new Effect.Fade($(which_select + '_searcharea'), {duration: 0.25}); + new Effect.Appear($(which_select + '_links'), {duration: 0.25}); +} + +function clearSelect(which_select) { + select_dn_field = $('form_' + which_select); + select_cn_field = $('form_' + which_select + '_cn'); + select_cn_span = $(which_select + '_select_cn'); + + select_dn_field.value = ''; + select_cn_field.value = ''; + select_cn_span.update(''); + + return false; +} diff --git a/ipa-server/ipa-gui/ipagui/subcontrollers/user.py b/ipa-server/ipa-gui/ipagui/subcontrollers/user.py index 5b804fd69..a5f99ef05 100644 --- a/ipa-server/ipa-gui/ipagui/subcontrollers/user.py +++ b/ipa-server/ipa-gui/ipagui/subcontrollers/user.py @@ -97,9 +97,9 @@ class UserController(IPAController): 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('manager', kw.get('manager')) new_user.setValue('roomnumber', kw.get('roomnumber')) - # new_user.setValue('secretary', kw.get('secretary')) + new_user.setValue('secretary', kw.get('secretary')) new_user.setValue('carlicense', kw.get('carlicense')) new_user.setValue('labeleduri', kw.get('labeleduri')) @@ -221,11 +221,33 @@ class UserController(IPAController): user_dict['user_orig'] = user_data user_dict['user_groups_data'] = user_groups_data + # grab manager and secretary names + if user.manager: + try: + user_manager = client.get_entry_by_dn(user.manager, + ['givenname', 'sn', 'uid']) + user_dict['manager_cn'] = "%s %s" % ( + user_manager.getValue('givenname', ''), + user_manager.getValue('sn', '')) + except (ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND), + ipaerror.exception_for(ipaerror.LDAP_DATABASE_ERROR)): + pass + if user.secretary: + try: + user_secretary = client.get_entry_by_dn(user.secretary, + ['givenname', 'sn', 'uid']) + user_dict['secretary_cn'] = "%s %s" % ( + user_secretary.getValue('givenname', ''), + user_secretary.getValue('sn', '')) + except (ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND), + ipaerror.exception_for(ipaerror.LDAP_DATABASE_ERROR)): + pass + return dict(form=user_edit_form, user=user_dict, user_groups=user_groups_dicts) except ipaerror.IPAError, e: turbogears.flash("User edit failed: " + str(e)) - raise turbogears.redirect('/user/show', uid=kw.get('uid')) + raise turbogears.redirect('/user/show', uid=uid) @expose() @identity.require(identity.not_anonymous()) @@ -286,9 +308,9 @@ class UserController(IPAController): 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('manager', kw.get('manager')) new_user.setValue('roomnumber', kw.get('roomnumber')) - # new_user.setValue('secretary', kw.get('secretary')) + new_user.setValue('secretary', kw.get('secretary')) new_user.setValue('carlicense', kw.get('carlicense')) new_user.setValue('labeleduri', kw.get('labeleduri')) @@ -421,16 +443,26 @@ class UserController(IPAController): user_reports.sort(self.sort_group_member) user_manager = None + user_secretary = None try: if user.manager: user_manager = client.get_entry_by_dn(user.manager, ['givenname', 'sn', 'uid']) - except ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND): + except (ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND), + ipaerror.exception_for(ipaerror.LDAP_DATABASE_ERROR)): + pass + + try: + if user.secretary: + user_secretary = client.get_entry_by_dn(user.secretary, + ['givenname', 'sn', 'uid']) + except (ipaerror.exception_for(ipaerror.LDAP_NOT_FOUND), + ipaerror.exception_for(ipaerror.LDAP_DATABASE_ERROR)): pass return dict(user=user.toDict(), fields=ipagui.forms.user.UserFields(), user_groups=user_groups, user_reports=user_reports, - user_manager=user_manager) + user_manager=user_manager, user_secretary=user_secretary) except ipaerror.IPAError, e: turbogears.flash("User show failed: " + str(e)) raise turbogears.redirect("/") @@ -534,3 +566,28 @@ class UserController(IPAController): return email return "" + + @expose("ipagui.templates.userselectsearch") + @identity.require(identity.not_anonymous()) + def user_select_search(self, **kw): + """Searches for users and displays list of results in a table. + This method is used for the ajax search for managers + and secrectary on the user pages.""" + client = self.get_ipaclient() + + users = [] + users_counter = 0 + searchlimit = 100 + criteria = kw.get('criteria') + if criteria != None and len(criteria) > 0: + try: + users = client.find_users(criteria.encode('utf-8'), None, + searchlimit) + users_counter = users[0] + users = users[1:] + except ipaerror.IPAError, e: + turbogears.flash("search failed: " + str(e)) + + return dict(users=users, criteria=criteria, + which_select=kw.get('which_select'), + counter=users_counter) diff --git a/ipa-server/ipa-gui/ipagui/templates/Makefile.am b/ipa-server/ipa-gui/ipagui/templates/Makefile.am index 7ff24f393..18db5fffc 100644 --- a/ipa-server/ipa-gui/ipagui/templates/Makefile.am +++ b/ipa-server/ipa-gui/ipagui/templates/Makefile.am @@ -28,6 +28,7 @@ app_DATA = \ userlist.kid \ usernewform.kid \ usernew.kid \ + userselectsearch.kid \ usershow.kid \ welcome.kid \ unhandled_exception.kid \ diff --git a/ipa-server/ipa-gui/ipagui/templates/usereditform.kid b/ipa-server/ipa-gui/ipagui/templates/usereditform.kid index 151760882..4f23e5bea 100644 --- a/ipa-server/ipa-gui/ipagui/templates/usereditform.kid +++ b/ipa-server/ipa-gui/ipagui/templates/usereditform.kid @@ -23,8 +23,13 @@ from ipagui.helpers import ipahelper <script type="text/javascript" charset="utf-8" src="${tg.url('/static/javascript/dynamicedit.js')}"></script> + <script type="text/javascript" charset="utf-8" + src="${tg.url('/static/javascript/dynamicselect.js')}"></script> - <?python searchurl = tg.url('/user/edit_search') ?> + <?python + searchurl = tg.url('/user/edit_search') + selectSearchurl = tg.url('/user/user_select_search') + ?> <script type="text/javascript"> function toggleProtectedFields(checkbox) { @@ -68,6 +73,17 @@ from ipagui.helpers import ipahelper info.name + " ")); } } + + function doSelectSearch(which_select) { + $(which_select + '_searchresults').update("Searching..."); + new Ajax.Updater(which_select + '_searchresults', + '${selectSearchurl}', + { asynchronous:true, + parameters: { criteria: $(which_select + '_criteria').value, + which_select: which_select}, + evalScripts: true }); + return false; + } </script> @@ -513,22 +529,60 @@ from ipagui.helpers import ipahelper </tr> <tr> - <th> + <th valign="top"> <label class="fieldlabel" for="${user.manager.field_id}" py:content="user.manager.label" />: </th> - <td> - TODO + <td valign="top"> + <div> + <span id='manager_select_cn'>${value_for(user.manager_cn)}</span> + <span id='manager_links'> + <a href="#" onclick="return clearSelect('manager');">clear</a> + <a href="#" onclick="return startSelect('manager');">change</a> + </span> + <span py:if="tg.errors.get('manager')" class="fielderror" + py:content="tg.errors.get('manager')" /> + </div> + <div id="manager_searcharea" style="display:none"> + <div> + <input id="manager_criteria" type="text" + onkeypress="return enterDoSelectSearch(event, 'manager');" /> + <input type="button" value="Find" + onclick="return doSelectSearch('manager');" + /> + </div> + <div id="manager_searchresults"> + </div> + </div> </td> </tr> <tr> - <th> + <th valign="top"> <label class="fieldlabel" for="${user.secretary.field_id}" py:content="user.secretary.label" />: </th> - <td> - TODO + <td valign="top"> + <div> + <span id='secretary_select_cn'>${value_for(user.secretary_cn)}</span> + <span id='secretary_links'> + <a href="#" onclick="return clearSelect('secretary');">clear</a> + <a href="#" onclick="return startSelect('secretary');">change</a> + </span> + <span py:if="tg.errors.get('secretary')" class="fielderror" + py:content="tg.errors.get('secretary')" /> + </div> + <div id="secretary_searcharea" style="display:none"> + <div> + <input id="secretary_criteria" type="text" + onkeypress="return enterDoSelectSearch(event, 'secretary');" /> + <input type="button" value="Find" + onclick="return doSelectSearch('secretary');" + /> + </div> + <div id="secretary_searchresults"> + </div> + </div> </td> </tr> </table> diff --git a/ipa-server/ipa-gui/ipagui/templates/usernewform.kid b/ipa-server/ipa-gui/ipagui/templates/usernewform.kid index b0ce8d8e0..a958c1717 100644 --- a/ipa-server/ipa-gui/ipagui/templates/usernewform.kid +++ b/ipa-server/ipa-gui/ipagui/templates/usernewform.kid @@ -17,8 +17,13 @@ from ipagui.helpers import ipahelper <script type="text/javascript" charset="utf-8" src="${tg.url('/static/javascript/dynamicedit.js')}"></script> + <script type="text/javascript" charset="utf-8" + src="${tg.url('/static/javascript/dynamicselect.js')}"></script> - <?python searchurl = tg.url('/user/edit_search') ?> + <?python + searchurl = tg.url('/user/edit_search') + selectSearchurl = tg.url('/user/user_select_search') + ?> <script type="text/javascript"> function doSearch() { @@ -39,6 +44,17 @@ from ipagui.helpers import ipahelper info.name + " ")); } } + + function doSelectSearch(which_select) { + $(which_select + '_searchresults').update("Searching..."); + new Ajax.Updater(which_select + '_searchresults', + '${selectSearchurl}', + { asynchronous:true, + parameters: { criteria: $(which_select + '_criteria').value, + which_select: which_select}, + evalScripts: true }); + return false; + } </script> <div py:for="field in hidden_fields" @@ -501,12 +517,31 @@ from ipagui.helpers import ipahelper </tr> <tr> - <th> + <th valign="top"> <label class="fieldlabel" for="${user.manager.field_id}" py:content="user.manager.label" />: </th> - <td> - TODO + <td valign="top"> + <div> + <span id='manager_select_cn'>${value_for(user.manager)}</span> + <span id='manager_links'> + <a href="#" onclick="return clearSelect('manager');">clear</a> + <a href="#" onclick="return startSelect('manager');">change</a> + </span> + <span py:if="tg.errors.get('manager')" class="fielderror" + py:content="tg.errors.get('manager')" /> + </div> + <div id="manager_searcharea" style="display:none"> + <div> + <input id="manager_criteria" type="text" + onkeypress="return enterDoSelectSearch(event, 'manager');" /> + <input type="button" value="Find" + onclick="return doSelectSearch('manager');" + /> + </div> + <div id="manager_searchresults"> + </div> + </div> </td> </tr> @@ -516,7 +551,26 @@ from ipagui.helpers import ipahelper py:content="user.secretary.label" />: </th> <td> - TODO + <div> + <span id='secretary_select_cn'>${value_for(user.secretary)}</span> + <span id='secretary_links'> + <a href="#" onclick="return clearSelect('secretary');">clear</a> + <a href="#" onclick="return startSelect('secretary');">change</a> + </span> + <span py:if="tg.errors.get('secretary')" class="fielderror" + py:content="tg.errors.get('secretary')" /> + </div> + <div id="secretary_searcharea" style="display:none"> + <div> + <input id="secretary_criteria" type="text" + onkeypress="return enterDoSelectSearch(event, 'secretary');" /> + <input type="button" value="Find" + onclick="return doSelectSearch('secretary');" + /> + </div> + <div id="secretary_searchresults"> + </div> + </div> </td> </tr> </table> diff --git a/ipa-server/ipa-gui/ipagui/templates/userselectsearch.kid b/ipa-server/ipa-gui/ipagui/templates/userselectsearch.kid new file mode 100644 index 000000000..7f42f7255 --- /dev/null +++ b/ipa-server/ipa-gui/ipagui/templates/userselectsearch.kid @@ -0,0 +1,36 @@ +<div xmlns:py="http://purl.org/kid/ns#"> + +<?python +from ipagui.helpers import ipahelper +?> + <div py:if='(users != None) and (len(users) > 0)'> + <div id="search-results-count"> + ${len(users)} results returned: + <span py:if="counter < 0"> + (truncated) + </span> + </div> + + <div py:for="user in users"> + <?python + user_name = "%s %s" % (user.getValue('givenName', ''), + user.getValue('sn', '')) + user_descr = "(%s)" % user.uid + + user_dn_esc = ipahelper.javascript_string_escape(user.dn) + user_name_esc = ipahelper.javascript_string_escape(user_name) + user_descr_esc = ipahelper.javascript_string_escape(user_descr) + which_select_esc = ipahelper.javascript_string_escape(which_select) + ?> + + ${user_name} ${user_descr} + <a href="" + onclick="doSelect('${which_select_esc}', '${user_dn_esc}', '${user_name_esc}'); + return false;" + >select</a> + </div> + </div> + <div py:if='(users != None) and (len(users) == 0)'> + No results found for "${criteria}" + </div> +</div> diff --git a/ipa-server/ipa-gui/ipagui/templates/usershow.kid b/ipa-server/ipa-gui/ipagui/templates/usershow.kid index 3a1c13422..81a75763f 100644 --- a/ipa-server/ipa-gui/ipagui/templates/usershow.kid +++ b/ipa-server/ipa-gui/ipagui/templates/usershow.kid @@ -222,18 +222,21 @@ else: </tr> <tr py:if='user_manager'> <th> - Manager: + <label class="fieldlabel" py:content="fields.manager.label" />: </th> <td> <a href="${tg.url('/user/show', uid=user_manager.uid)}" >${user_manager.givenname} ${user_manager.sn}</a> </td> </tr> - <tr> + <tr py:if='user_secretary'> <th> <label class="fieldlabel" py:content="fields.secretary.label" />: </th> - <td>TODO</td> + <td> + <a href="${tg.url('/user/show', uid=user_secretary.uid)}" + >${user_secretary.givenname} ${user_secretary.sn}</a> + </td> </tr> </table> |