mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2026-10-13 08:52:01 -05:00
Group edit page
This commit is contained in:
1 parent
c4ab64cabc
commit
0e355a734f
8 files changed
+279
-9
No files matched your search
@@ -34,6 +34,8 @@ client = ipa.ipaclient.IPAClient(True)
|
||||
|
||||
user_fields = ['*', 'nsAccountLock']
|
||||
|
||||
group_fields = ['*']
|
||||
|
||||
def restrict_post():
|
||||
if cherrypy.request.method != "POST":
|
||||
turbogears.flash("This method only accepts posts")
|
||||
@@ -58,7 +60,7 @@ class Root(controllers.RootController):
|
||||
if kw.get('searchtype') == "Users":
|
||||
return self.userlist(uid=kw.get('searchvalue'))
|
||||
else:
|
||||
return self.index()
|
||||
return self.grouplist(criteria=kw.get('searchvalue'))
|
||||
|
||||
|
||||
|
||||
@@ -160,9 +162,9 @@ class Root(controllers.RootController):
|
||||
if kw.get('userpassword'):
|
||||
new_user.setValue('userpassword', kw.get('userpassword'))
|
||||
if kw.get('uidnumber'):
|
||||
new_user.setValue('uidnumber', kw.get('uidnumber'))
|
||||
new_user.setValue('uidnumber', str(kw.get('uidnumber')))
|
||||
if kw.get('gidnumber'):
|
||||
new_user.setValue('gidnumber', kw.get('gidnumber'))
|
||||
new_user.setValue('gidnumber', str(kw.get('gidnumber')))
|
||||
|
||||
#
|
||||
# this is a hack until we decide on the policy for names/cn/sn/givenName
|
||||
@@ -183,7 +185,7 @@ class Root(controllers.RootController):
|
||||
@expose("ipagui.templates.userlist")
|
||||
@identity.require(identity.not_anonymous())
|
||||
def userlist(self, **kw):
|
||||
"""Retrieve a list of all users and display them in one huge list"""
|
||||
"""Searches for users and displays list of results"""
|
||||
client.set_principal(identity.current.user_name)
|
||||
users = None
|
||||
counter = 0
|
||||
@@ -379,6 +381,88 @@ class Root(controllers.RootController):
|
||||
turbogears.flash("Group add failed: " + str(e) + "<br/>" + str(e.detail))
|
||||
return dict(form=group_new_form, tg_template='ipagui.templates.groupnew')
|
||||
|
||||
|
||||
@expose("ipagui.templates.groupedit")
|
||||
@identity.require(identity.not_anonymous())
|
||||
def groupedit(self, cn, tg_errors=None):
|
||||
"""Displays the edit group form"""
|
||||
if tg_errors:
|
||||
turbogears.flash("There was a problem with the form!")
|
||||
|
||||
client.set_principal(identity.current.user_name)
|
||||
group = client.get_group_by_cn(cn, group_fields)
|
||||
group_dict = group.toDict()
|
||||
|
||||
# store a copy of the original group for the update later
|
||||
group_data = b64encode(dumps(group_dict))
|
||||
group_dict['group_orig'] = group_data
|
||||
return dict(form=group_edit_form, group=group_dict)
|
||||
|
||||
@expose()
|
||||
@identity.require(identity.not_anonymous())
|
||||
def groupupdate(self, **kw):
|
||||
"""Updates an existing group"""
|
||||
restrict_post()
|
||||
client.set_principal(identity.current.user_name)
|
||||
if kw.get('submit') == 'Cancel Edit':
|
||||
turbogears.flash("Edit group cancelled")
|
||||
raise turbogears.redirect('/groupshow', cn=kw.get('cn'))
|
||||
|
||||
tg_errors, kw = self.groupupdatevalidate(**kw)
|
||||
if tg_errors:
|
||||
return dict(form=group_edit_form, group=kw,
|
||||
tg_template='ipagui.templates.groupedit')
|
||||
|
||||
try:
|
||||
orig_group_dict = loads(b64decode(kw.get('group_orig')))
|
||||
|
||||
new_group = ipa.group.Group(orig_group_dict)
|
||||
new_group.setValue('description', kw.get('description'))
|
||||
if kw.get('gidnumber'):
|
||||
new_group.setValue('gidnumber', str(kw.get('gidnumber')))
|
||||
|
||||
rv = client.update_group(new_group)
|
||||
turbogears.flash("%s updated!" % kw['cn'])
|
||||
raise turbogears.redirect('/groupshow', cn=kw['cn'])
|
||||
except ipaerror.IPAError, e:
|
||||
turbogears.flash("User update failed: " + str(e))
|
||||
return dict(form=group_edit_form, group=kw,
|
||||
tg_template='ipagui.templates.groupedit')
|
||||
|
||||
@expose("ipagui.templates.grouplist")
|
||||
@identity.require(identity.not_anonymous())
|
||||
def grouplist(self, **kw):
|
||||
"""Search for groups and display results"""
|
||||
client.set_principal(identity.current.user_name)
|
||||
groups = None
|
||||
# counter = 0
|
||||
criteria = kw.get('criteria')
|
||||
if criteria != None and len(criteria) > 0:
|
||||
try:
|
||||
groups = client.find_groups(criteria.encode('utf-8'))
|
||||
# counter = groups[0]
|
||||
# groups = groups[1:]
|
||||
# if counter == -1:
|
||||
# turbogears.flash("These results are truncated.<br />" +
|
||||
# "Please refine your search and try again.")
|
||||
except ipaerror.IPAError, e:
|
||||
turbogears.flash("Find groups failed: " + str(e))
|
||||
raise turbogears.redirect("/grouplist")
|
||||
|
||||
return dict(groups=groups, criteria=criteria, fields=forms.group.GroupFields())
|
||||
|
||||
@expose("ipagui.templates.groupshow")
|
||||
@identity.require(identity.not_anonymous())
|
||||
def groupshow(self, cn):
|
||||
"""Retrieve a single group for display"""
|
||||
client.set_principal(identity.current.user_name)
|
||||
try:
|
||||
group = client.get_group_by_cn(cn, group_fields)
|
||||
return dict(group=group.toDict(), fields=forms.group.GroupFields())
|
||||
except ipaerror.IPAError, e:
|
||||
turbogears.flash("Group show failed: " + str(e))
|
||||
raise turbogears.redirect("/")
|
||||
|
||||
@validate(form=group_new_form)
|
||||
@identity.require(identity.not_anonymous())
|
||||
def groupcreatevalidate(self, tg_errors=None, **kw):
|
||||
|
||||
@@ -32,13 +32,15 @@ class GroupNewForm(widgets.Form):
|
||||
|
||||
|
||||
class GroupEditValidator(validators.Schema):
|
||||
gidnumber = widgets.TextField(name="gidnumber", label="GID")
|
||||
description = widgets.TextField(name="description", label="Description")
|
||||
gidnumber = validators.Int(not_empty=False)
|
||||
description = validators.String(not_empty=False)
|
||||
|
||||
class GroupEditForm(widgets.Form):
|
||||
params = ['group']
|
||||
|
||||
fields = [GroupFields.gidnumber, GroupFields.description]
|
||||
fields = [GroupFields.gidnumber, GroupFields.description,
|
||||
GroupFields.cn_hidden,
|
||||
GroupFields.group_orig]
|
||||
|
||||
validator = GroupEditValidator()
|
||||
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#"
|
||||
py:extends="'grouplayout.kid'">
|
||||
<head>
|
||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/>
|
||||
<title>Edit Group</title>
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
<div style="float:right">
|
||||
<input type="checkbox"
|
||||
onclick="toggleProtectedFields(this);">
|
||||
<span class="small">edit protected fields</span>
|
||||
</input>
|
||||
</div>
|
||||
<h2>Edit Group</h2>
|
||||
</div>
|
||||
|
||||
${form.display(action="groupupdate", value=group)}
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,82 @@
|
||||
<div xmlns:py="http://purl.org/kid/ns#"
|
||||
class="simpleroster">
|
||||
<form action="${action}" name="${name}" method="${method}" class="tableform">
|
||||
|
||||
<script type="text/javascript">
|
||||
function toggleProtectedFields(checkbox) {
|
||||
gidnumberField = document.getElementById('form_gidnumber');
|
||||
if (checkbox.checked) {
|
||||
gidnumberField.disabled = false;
|
||||
} else {
|
||||
gidnumberField.disabled = true;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<div py:for="field in hidden_fields"
|
||||
py:replace="field.display(value_for(field), **params_for(field))"
|
||||
/>
|
||||
|
||||
<div class="formsection">Group Details</div>
|
||||
<table class="formtable" cellpadding="2" cellspacing="0" border="0">
|
||||
<tr>
|
||||
<th>
|
||||
<label class="fieldlabel" for="${group.cn.field_id}"
|
||||
py:content="group.cn.label" />:
|
||||
</th>
|
||||
<td>
|
||||
<!-- <span py:replace="group.cn.display(value_for(group.cn))" />
|
||||
<span py:if="tg.errors.get('cn')" class="fielderror"
|
||||
py:content="tg.errors.get('cn')" /> -->
|
||||
${value_for(group.cn)}
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>
|
||||
<label class="fieldlabel" for="${group.description.field_id}"
|
||||
py:content="group.description.label" />:
|
||||
</th>
|
||||
<td>
|
||||
<span py:replace="group.description.display(value_for(group.description))" />
|
||||
<span py:if="tg.errors.get('description')" class="fielderror"
|
||||
py:content="tg.errors.get('description')" />
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>
|
||||
<label class="fieldlabel" for="${group.gidnumber.field_id}"
|
||||
py:content="group.gidnumber.label" />:
|
||||
</th>
|
||||
<td>
|
||||
<span py:replace="group.gidnumber.display(value_for(group.gidnumber))" />
|
||||
<span py:if="tg.errors.get('gidnumber')" class="fielderror"
|
||||
py:content="tg.errors.get('gidnumber')" />
|
||||
|
||||
<script type="text/javascript">
|
||||
document.getElementById('form_gidnumber').disabled = true;
|
||||
</script>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="formtable" cellpadding="2" cellspacing="0" border="0">
|
||||
<tr>
|
||||
<th>
|
||||
<br />
|
||||
<input type="submit" class="submitbutton" name="submit"
|
||||
value="Update Group"/>
|
||||
</th>
|
||||
<td>
|
||||
<br />
|
||||
<input type="submit" class="submitbutton" name="submit"
|
||||
value="Cancel Edit" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,43 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#"
|
||||
py:extends="'grouplayout.kid'">
|
||||
<head>
|
||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/>
|
||||
<title>Find Groups</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="search">
|
||||
<form action="${tg.url('/grouplist')}" method="post">
|
||||
<input id="criteria" type="text" name="criteria" value="${criteria}" />
|
||||
<input type="submit" value="Find Groups"/>
|
||||
</form>
|
||||
<script type="text/javascript">
|
||||
document.getElementById("criteria").focus();
|
||||
</script>
|
||||
</div>
|
||||
<div py:if='(groups != None) and (len(groups) > 0)'>
|
||||
<h2>${len(groups)} results returned:</h2>
|
||||
<table id="resultstable">
|
||||
<tr>
|
||||
<th>
|
||||
<label class="fieldlabel" py:content="fields.cn.label" />
|
||||
</th>
|
||||
<th>
|
||||
<label class="fieldlabel" py:content="fields.description.label" />
|
||||
</th>
|
||||
</tr>
|
||||
<tr py:for="group in groups">
|
||||
<td>
|
||||
<a href="${tg.url('/groupshow',cn=group.cn)}">${group.cn}</a>
|
||||
</td>
|
||||
<td>
|
||||
${group.description}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div py:if='(groups != None) and (len(groups) == 0)'>
|
||||
<h2>No results found for "${criteria}"</h2>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,6 +1,6 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#"
|
||||
py:extends="'userlayout.kid'">
|
||||
py:extends="'grouplayout.kid'">
|
||||
<head>
|
||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/>
|
||||
<title>Add Group</title>
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#"
|
||||
py:extends="'grouplayout.kid'">
|
||||
<head>
|
||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/>
|
||||
<title>View Group</title>
|
||||
</head>
|
||||
<body>
|
||||
<h2>View Group</h2>
|
||||
|
||||
<div class="formsection">Group Details</div>
|
||||
<table class="formtable" cellpadding="2" cellspacing="0" border="0">
|
||||
<tr>
|
||||
<th>
|
||||
<label class="fieldlabel" py:content="fields.cn.label" />:
|
||||
</th>
|
||||
<td>${group.get("cn")}</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>
|
||||
<label class="fieldlabel" py:content="fields.description.label" />:
|
||||
</th>
|
||||
<td>${group.get("description")}</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>
|
||||
<label class="fieldlabel" py:content="fields.gidnumber.label" />:
|
||||
</th>
|
||||
<td>${group.get("gidnumber")}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<a href="${tg.url('/groupedit', cn=group.get('cn'))}">edit</a>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -70,7 +70,7 @@
|
||||
</p>
|
||||
<p>
|
||||
<a href="${tg.url('/groupnew')}">Add Group</a><br/>
|
||||
<a href="${tg.url('/groupindex')}">Find Groups</a><br/>
|
||||
<a href="${tg.url('/grouplist')}">Find Groups</a><br/>
|
||||
</p>
|
||||
<p>
|
||||
<a href="${tg.url('/')}">Manage Policy</a><br/>
|
||||
|
||||
Reference in new issue
Block a user