diff options
-rw-r--r-- | ipa-server/ipa-gui/ipagui/forms/delegate.py | 7 | ||||
-rw-r--r-- | ipa-server/ipa-gui/ipagui/static/css/style.css | 7 | ||||
-rw-r--r-- | ipa-server/ipa-gui/ipagui/static/javascript/dynamicedit.js | 6 | ||||
-rw-r--r-- | ipa-server/ipa-gui/ipagui/static/javascript/ipautil.js | 2 | ||||
-rw-r--r-- | ipa-server/ipa-gui/ipagui/subcontrollers/delegation.py | 50 | ||||
-rw-r--r-- | ipa-server/ipa-gui/ipagui/templates/delegateform.kid (renamed from ipa-server/ipa-gui/ipagui/templates/delegatenewform.kid) | 40 | ||||
-rw-r--r-- | ipa-server/ipa-gui/ipagui/templates/delegatelist.kid | 41 | ||||
-rw-r--r-- | ipa-server/ipa-gui/ipagui/templates/master.kid | 2 |
8 files changed, 125 insertions, 30 deletions
diff --git a/ipa-server/ipa-gui/ipagui/forms/delegate.py b/ipa-server/ipa-gui/ipagui/forms/delegate.py index 668249128..c25d6c0cb 100644 --- a/ipa-server/ipa-gui/ipagui/forms/delegate.py +++ b/ipa-server/ipa-gui/ipagui/forms/delegate.py @@ -41,8 +41,10 @@ aci_attrs = [ aci_checkbox_attrs = [(field.name, field.label) for field in aci_attrs] +aci_name_to_label = dict(aci_checkbox_attrs) + class DelegateFields(): - name = widgets.TextField(name="name", label="ACI Name") + name = widgets.TextField(name="name", label="Name") source_group_dn = widgets.HiddenField(name="source_group_dn") dest_group_dn = widgets.HiddenField(name="dest_group_dn") @@ -81,9 +83,8 @@ class DelegateForm(widgets.Form): def __init__(self, *args, **kw): super(DelegateForm,self).__init__(*args, **kw) - # TODO - rename to delegateform (self.template_c, self.template) = widgets.meta.load_kid_template( - "ipagui.templates.delegatenewform") + "ipagui.templates.delegateform") self.delegate = DelegateFields def update_params(self, params): diff --git a/ipa-server/ipa-gui/ipagui/static/css/style.css b/ipa-server/ipa-gui/ipagui/static/css/style.css index fb97a67a2..625eaa544 100644 --- a/ipa-server/ipa-gui/ipagui/static/css/style.css +++ b/ipa-server/ipa-gui/ipagui/static/css/style.css @@ -77,7 +77,7 @@ body { #main_content { background:#fff; float:right; - width:82%; + width:84%; min-height:500px; border-left: 1px solid #000; padding: 10px; @@ -92,7 +92,7 @@ body { #sidebar { background:#ccc; /* should be same as #page */ float:left; - width:13%; + width:11%; padding: 5px; font-size: medium; } @@ -206,6 +206,9 @@ body { background: #eee; } +.deletebutton { +} + /* * Used for checkboxlist of aci attributes */ diff --git a/ipa-server/ipa-gui/ipagui/static/javascript/dynamicedit.js b/ipa-server/ipa-gui/ipagui/static/javascript/dynamicedit.js index 5d157cb86..d37dd920d 100644 --- a/ipa-server/ipa-gui/ipagui/static/javascript/dynamicedit.js +++ b/ipa-server/ipa-gui/ipagui/static/javascript/dynamicedit.js @@ -117,11 +117,11 @@ function addmember(dn, info) { newdiv.style.display = 'none'; $('newmembers').appendChild(newdiv); - return newdiv + return newdiv; } function addmemberHandler(element, dn, info) { - var newdiv = addmember(dn, info) + var newdiv = addmember(dn, info); if (newdiv != null) { new Effect.Fade(Element.up(element), {duration: 0.75}); new Effect.Appear(newdiv, {duration: 0.75}); @@ -154,7 +154,7 @@ function removemember(dn, info) { newdiv.style.display = 'none'; $('delmembers').appendChild(newdiv); - return newdiv + return newdiv; } function removememberHandler(element, dn, info) { diff --git a/ipa-server/ipa-gui/ipagui/static/javascript/ipautil.js b/ipa-server/ipa-gui/ipagui/static/javascript/ipautil.js index 4aa74f37d..3fdd04ed4 100644 --- a/ipa-server/ipa-gui/ipagui/static/javascript/ipautil.js +++ b/ipa-server/ipa-gui/ipagui/static/javascript/ipautil.js @@ -4,5 +4,5 @@ * it can be embedded inside a dynamically generated string. */ function jsStringEscape(input) { - return input.gsub(/(['"\\])/, function(match){ return "\\" + match[0]} ); + return input.gsub(/(['"\\])/, function(match){ return "\\" + match[0];} ); } diff --git a/ipa-server/ipa-gui/ipagui/subcontrollers/delegation.py b/ipa-server/ipa-gui/ipagui/subcontrollers/delegation.py index 47610a751..c732e8f85 100644 --- a/ipa-server/ipa-gui/ipagui/subcontrollers/delegation.py +++ b/ipa-server/ipa-gui/ipagui/subcontrollers/delegation.py @@ -125,6 +125,8 @@ class DelegationController(IPAController): aci_str_list = aci_entry.getValues('aci') if aci_str_list is None: aci_str_list = [] + if not(isinstance(aci_str_list,list) or isinstance(aci_str_list,tuple)): + aci_str_list = [aci_str_list] try : old_aci_index = aci_str_list.index(kw['orig_acistr']) @@ -171,6 +173,8 @@ class DelegationController(IPAController): aci_str_list = aci_entry.getValues('aci') if aci_str_list is None: aci_str_list = [] + if not(isinstance(aci_str_list,list) or isinstance(aci_str_list,tuple)): + aci_str_list = [aci_str_list] aci_list = [] for aci_str in aci_str_list: @@ -182,7 +186,51 @@ class DelegationController(IPAController): pass group_dn_to_cn = self.extract_group_cns(aci_list, client) - return dict(aci_list=aci_list, group_dn_to_cn=group_dn_to_cn) + # The list page needs to display field labels, not raw + # LDAP attributes + for aci in aci_list: + aci.attrs = map(lambda name: + ipagui.forms.delegate.aci_name_to_label.get(name, name), + aci.attrs) + + return dict(aci_list=aci_list, group_dn_to_cn=group_dn_to_cn, + fields=ipagui.forms.delegate.DelegateFields()) + + @expose() + @identity.require(identity.not_anonymous()) + def delete(self, acistr): + """Display delegate page""" + self.restrict_post() + client = self.get_ipaclient() + + try: + aci_entry = client.get_aci_entry(aci_fields) + + aci_str_list = aci_entry.getValues('aci') + if aci_str_list is None: + aci_str_list = [] + if not(isinstance(aci_str_list,list) or isinstance(aci_str_list,tuple)): + aci_str_list = [aci_str_list] + + try : + old_aci_index = aci_str_list.index(acistr) + except ValueError: + turbogears.flash("Delegation deletion failed:<br />" + + "The delegation you were attempting to delete has been " + + "concurrently modified.") + raise turbogears.redirect('/delegate/list') + + new_aci_str_list = copy.copy(aci_str_list) + del new_aci_str_list[old_aci_index] + aci_entry.setValue('aci', new_aci_str_list) + + client.update_entry(aci_entry) + + turbogears.flash("delegate deleted") + raise turbogears.redirect('/delegate/list') + except (SyntaxError, ipaerror.IPAError), e: + turbogears.flash("Delegation deletion failed: " + str(e)) + raise turbogears.redirect('/delegate/list') @expose("ipagui.templates.delegategroupsearch") @identity.require(identity.not_anonymous()) diff --git a/ipa-server/ipa-gui/ipagui/templates/delegatenewform.kid b/ipa-server/ipa-gui/ipagui/templates/delegateform.kid index 2f31a06b3..26d136531 100644 --- a/ipa-server/ipa-gui/ipagui/templates/delegatenewform.kid +++ b/ipa-server/ipa-gui/ipagui/templates/delegateform.kid @@ -43,8 +43,20 @@ new Effect.Fade($(which_group + '_searcharea'), {duration: 0.25}); new Effect.Appear($(which_group + '_change_link'), {duration: 0.25}); } + + function confirmDelete() { + if (confirm("Are you sure you want to delete this delegation?")) { + $('deleteform').submit(); + } + return false; + } </script> + <form style="display:none" id='deleteform' + method="post" action="${tg.url('/delegate/delete')}"> + <input type="hidden" name="acistr" value="${value.get('orig_acistr')}" /> + </form> + <form action="${action}" name="${name}" method="${method}" class="tableform"> <table class="formtable" cellpadding="2" cellspacing="0" border="0"> @@ -52,12 +64,20 @@ <th> <input type="submit" class="submitbutton" name="submit" value="${actionname} Delegation"/> - <br /> + <br/><br/> </th> <td> <input type="submit" class="submitbutton" name="submit" value="Cancel ${actionname}"/> - <br /> + <br/><br/> + </td> + <td py:if='actionname == "Edit"'> + + <input type="button" class="deletebutton" + value="Delete Delegation" + onclick="return confirmDelete();" + /> + <br/><br/> </td> </tr> </table> @@ -150,21 +170,33 @@ <table class="formtable" cellpadding="2" cellspacing="0" border="0"> <tr> <th> + <br/> <input type="submit" class="submitbutton" name="submit" value="${actionname} Delegation"/> </th> <td> + <br/> <input type="submit" class="submitbutton" name="submit" value="Cancel ${actionname}"/> </td> + <td py:if='actionname == "Edit"'> + <br/> + + <input type="button" class="deletebutton" + value="Delete Delegation" + onclick="return confirmDelete();" + /> + </td> </tr> </table> - <script py:if="not value.get('source_group_dn')"> + <script py:if="not value.get('source_group_dn')" + type="text/javascript"> new Effect.Appear($('source_searcharea'), {duration: 0.25}); new Effect.Fade($('source_change_link'), {duration: 0.25}); </script> - <script py:if="not value.get('dest_group_dn')"> + <script py:if="not value.get('dest_group_dn')" + type="text/javascript"> new Effect.Appear($('dest_searcharea'), {duration: 0.25}); new Effect.Fade($('dest_change_link'), {duration: 0.25}); </script> diff --git a/ipa-server/ipa-gui/ipagui/templates/delegatelist.kid b/ipa-server/ipa-gui/ipagui/templates/delegatelist.kid index 7e3374252..99bd1bb49 100644 --- a/ipa-server/ipa-gui/ipagui/templates/delegatelist.kid +++ b/ipa-server/ipa-gui/ipagui/templates/delegatelist.kid @@ -6,18 +6,35 @@ <title>Delegations</title> </head> <body> + +<?python +from ipagui.helpers import ipahelper +?> + <script type="text/javascript" charset="utf-8" src="${tg.url('/static/javascript/tablekit.js')}"></script> + <script type="text/javascript"> + function editDelegation(acistr) { + $('edit_acistr').value = acistr; + $('editform').submit(); + return false; + } + </script> + + <form style="display:none" id='editform' + method="post" action="${tg.url('/delegate/edit')}"> + <input type="hidden" id="edit_acistr" name="acistr" value="" /> + </form> + <h2>Delegations</h2> <table id="resultstable" class="sortable resizable"> <thead> <tr> - <th>Name</th> - <th>People in Group</th> - <th>Can Modify</th> - <th>For People in Group</th> - <th>Action</th> + <th>${fields.name.label}</th> + <th>${fields.source_group_cn.label}</th> + <th>${fields.attrs.label}</th> + <th>${fields.dest_group_cn.label}</th> </tr> </thead> <tbody> @@ -25,9 +42,12 @@ <?python source_cn = group_dn_to_cn.get(aci.source_group) dest_cn = group_dn_to_cn.get(aci.dest_group) + acistr = aci.orig_acistr + acistr_esc = ipahelper.javascript_string_escape(acistr) ?> <td> - ${aci.name} + <a href="#" onclick="return editDelegation('${acistr_esc}');" + >${aci.name}</a> </td> <td> <a href="${tg.url('/group/show', cn=source_cn)}" @@ -40,15 +60,6 @@ <a href="${tg.url('/group/show', cn=dest_cn)}" >${dest_cn}</a> </td> - <td> - <?python - # it's probably a bad idea to use a GET string here. - # orig_acistr may be quite long - # TODO - change to use a form/POST - # - ?> - <a href="${tg.url('/delegate/edit', acistr=aci.orig_acistr)}">edit</a><br /> - </td> </tr> </tbody> </table> diff --git a/ipa-server/ipa-gui/ipagui/templates/master.kid b/ipa-server/ipa-gui/ipagui/templates/master.kid index 2926c4f90..cf359579a 100644 --- a/ipa-server/ipa-gui/ipagui/templates/master.kid +++ b/ipa-server/ipa-gui/ipagui/templates/master.kid @@ -78,7 +78,7 @@ <a href="${tg.url('/')}">Self Service</a><br/> </p> <p> - <a href="${tg.url('/delegate/list')}">Delegation Mgmt</a><br/> + <a href="${tg.url('/delegate/list')}">Delegations</a><br/> </p> </div> |