mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
Split userform into edit and new forms.
(They will likely diverge so no sense forcing them together). Add css for required fields. Add "_orig" hidden fields to the edit form in prep for sending only modified fields.
This commit is contained in:
parent
2e1f317b09
commit
10cbfe8787
@ -7,7 +7,6 @@ from turbogears import error_handler
|
|||||||
# from model import *
|
# from model import *
|
||||||
# import logging
|
# import logging
|
||||||
# log = logging.getLogger("ipagui.controllers")
|
# log = logging.getLogger("ipagui.controllers")
|
||||||
# import ipa.rpcclient
|
|
||||||
import ipa.config
|
import ipa.config
|
||||||
import ipa.ipaclient
|
import ipa.ipaclient
|
||||||
import ipa.user
|
import ipa.user
|
||||||
@ -15,7 +14,8 @@ import xmlrpclib
|
|||||||
import forms.user
|
import forms.user
|
||||||
|
|
||||||
ipa.config.init_config()
|
ipa.config.init_config()
|
||||||
user_form = forms.user.UserFormWidget()
|
user_new_form = forms.user.UserNewForm()
|
||||||
|
user_edit_form = forms.user.UserEditForm()
|
||||||
|
|
||||||
client = ipa.ipaclient.IPAClient(True)
|
client = ipa.ipaclient.IPAClient(True)
|
||||||
client.set_principal("test@FREEIPA.ORG")
|
client.set_principal("test@FREEIPA.ORG")
|
||||||
@ -32,8 +32,12 @@ def user_to_hash(user):
|
|||||||
'sn' : user.getValue('sn'),
|
'sn' : user.getValue('sn'),
|
||||||
'mail' : user.getValue('mail'),
|
'mail' : user.getValue('mail'),
|
||||||
'telephoneNumber': user.getValue('telephoneNumber'),
|
'telephoneNumber': user.getValue('telephoneNumber'),
|
||||||
'uidNumber': user.getValue('uidNumber'),
|
'uidNumber' : user.getValue('uidNumber'),
|
||||||
'gidNumber': user.getValue('gidNumber'),
|
'gidNumber' : user.getValue('gidNumber'),
|
||||||
|
'givenName_orig' : user.getValue('givenName'),
|
||||||
|
'sn_orig' : user.getValue('sn'),
|
||||||
|
'mail_orig' : user.getValue('mail'),
|
||||||
|
'telephoneNumber_orig': user.getValue('telephoneNumber'),
|
||||||
}
|
}
|
||||||
|
|
||||||
class Root(controllers.RootController):
|
class Root(controllers.RootController):
|
||||||
@ -53,7 +57,7 @@ class Root(controllers.RootController):
|
|||||||
if tg_errors:
|
if tg_errors:
|
||||||
turbogears.flash("There was a problem with the form!")
|
turbogears.flash("There was a problem with the form!")
|
||||||
|
|
||||||
return dict(form=user_form)
|
return dict(form=user_new_form)
|
||||||
|
|
||||||
@expose()
|
@expose()
|
||||||
def usercreate(self, **kw):
|
def usercreate(self, **kw):
|
||||||
@ -63,12 +67,11 @@ class Root(controllers.RootController):
|
|||||||
turbogears.flash("Add user cancelled")
|
turbogears.flash("Add user cancelled")
|
||||||
raise turbogears.redirect('/userlist')
|
raise turbogears.redirect('/userlist')
|
||||||
|
|
||||||
tg_errors, kw = self.uservalidate(**kw)
|
tg_errors, kw = self.usercreatevalidate(**kw)
|
||||||
if tg_errors:
|
if tg_errors:
|
||||||
return dict(form=user_form, tg_template='ipagui.templates.usernew')
|
return dict(form=user_new_form, tg_template='ipagui.templates.usernew')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# rv = ipa.rpcclient.add_user(kw)
|
|
||||||
newuser = ipa.user.User(None)
|
newuser = ipa.user.User(None)
|
||||||
newuser.setValue('uid', kw['uid'])
|
newuser.setValue('uid', kw['uid'])
|
||||||
newuser.setValue('givenName', kw['givenName'])
|
newuser.setValue('givenName', kw['givenName'])
|
||||||
@ -87,7 +90,7 @@ class Root(controllers.RootController):
|
|||||||
raise turbogears.redirect('/usershow', uid=kw['uid'])
|
raise turbogears.redirect('/usershow', uid=kw['uid'])
|
||||||
except xmlrpclib.Fault, f:
|
except xmlrpclib.Fault, f:
|
||||||
turbogears.flash("User add failed: " + str(f.faultString))
|
turbogears.flash("User add failed: " + str(f.faultString))
|
||||||
return dict(form=user_form, tg_template='ipagui.templates.usernew')
|
return dict(form=user_new_form, tg_template='ipagui.templates.usernew')
|
||||||
|
|
||||||
|
|
||||||
@expose("ipagui.templates.useredit")
|
@expose("ipagui.templates.useredit")
|
||||||
@ -96,9 +99,8 @@ class Root(controllers.RootController):
|
|||||||
if tg_errors:
|
if tg_errors:
|
||||||
turbogears.flash("There was a problem with the form!")
|
turbogears.flash("There was a problem with the form!")
|
||||||
|
|
||||||
# user = ipa.rpcclient.get_user(uid)
|
|
||||||
user = client.get_user(uid)
|
user = client.get_user(uid)
|
||||||
return dict(form=user_form, user=user_to_hash(user))
|
return dict(form=user_edit_form, user=user_to_hash(user))
|
||||||
|
|
||||||
@expose()
|
@expose()
|
||||||
def userupdate(self, **kw):
|
def userupdate(self, **kw):
|
||||||
@ -108,24 +110,24 @@ class Root(controllers.RootController):
|
|||||||
turbogears.flash("Edit user cancelled")
|
turbogears.flash("Edit user cancelled")
|
||||||
raise turbogears.redirect('/usershow', uid=kw.get('uid'))
|
raise turbogears.redirect('/usershow', uid=kw.get('uid'))
|
||||||
|
|
||||||
tg_errors, kw = self.uservalidate(**kw)
|
tg_errors, kw = self.userupdatevalidate(**kw)
|
||||||
if tg_errors:
|
if tg_errors:
|
||||||
return dict(form=user_form, user={}, tg_template='ipagui.templates.useredit')
|
return dict(form=user_edit_form, user=kw,
|
||||||
|
tg_template='ipagui.templates.useredit')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# rv = ipa.rpcclient.add_user(kw)
|
|
||||||
turbogears.flash("%s updated!" % kw['uid'])
|
turbogears.flash("%s updated!" % kw['uid'])
|
||||||
raise turbogears.redirect('/usershow', uid=kw['uid'])
|
raise turbogears.redirect('/usershow', uid=kw['uid'])
|
||||||
except xmlrpclib.Fault, f:
|
except xmlrpclib.Fault, f:
|
||||||
turbogears.flash("User add failed: " + str(f.faultString))
|
turbogears.flash("User add failed: " + str(f.faultString))
|
||||||
return dict(form=user_form, user={}, tg_template='ipagui.templates.useredit')
|
return dict(form=user_edit_form, user=kw,
|
||||||
|
tg_template='ipagui.templates.useredit')
|
||||||
|
|
||||||
|
|
||||||
@expose("ipagui.templates.userlist")
|
@expose("ipagui.templates.userlist")
|
||||||
@paginate('users', limit=3, allow_limit_override=True)
|
@paginate('users', limit=3, allow_limit_override=True)
|
||||||
def userlist(self):
|
def userlist(self):
|
||||||
"""Retrieve a list of all users and display them in one huge list"""
|
"""Retrieve a list of all users and display them in one huge list"""
|
||||||
# users = ipa.rpcclient.get_all_users()
|
|
||||||
users = client.get_all_users()
|
users = client.get_all_users()
|
||||||
return dict(users=users)
|
return dict(users=users)
|
||||||
|
|
||||||
@ -134,15 +136,18 @@ class Root(controllers.RootController):
|
|||||||
def usershow(self, uid):
|
def usershow(self, uid):
|
||||||
"""Retrieve a single user for display"""
|
"""Retrieve a single user for display"""
|
||||||
try:
|
try:
|
||||||
# user = ipa.rpcclient.get_user(uid)
|
|
||||||
user = client.get_user(uid)
|
user = client.get_user(uid)
|
||||||
return dict(user=user_to_hash(user))
|
return dict(user=user_to_hash(user))
|
||||||
except xmlrpclib.Fault, f:
|
except xmlrpclib.Fault, f:
|
||||||
turbogears.flash("User show failed: " + str(f.faultString))
|
turbogears.flash("User show failed: " + str(f.faultString))
|
||||||
raise turbogears.redirect("/")
|
raise turbogears.redirect("/")
|
||||||
|
|
||||||
@validate(form=user_form)
|
@validate(form=user_new_form)
|
||||||
def uservalidate(self, tg_errors=None, **kw):
|
def usercreatevalidate(self, tg_errors=None, **kw):
|
||||||
|
return tg_errors, kw
|
||||||
|
|
||||||
|
@validate(form=user_edit_form)
|
||||||
|
def userupdatevalidate(self, tg_errors=None, **kw):
|
||||||
return tg_errors, kw
|
return tg_errors, kw
|
||||||
|
|
||||||
@expose()
|
@expose()
|
||||||
|
@ -19,27 +19,49 @@ class UserFields():
|
|||||||
# validators.PhoneNumber may be a bit too picky, requiring an area code
|
# validators.PhoneNumber may be a bit too picky, requiring an area code
|
||||||
telephoneNumber.validator = validators.PlainText(not_empty=True)
|
telephoneNumber.validator = validators.PlainText(not_empty=True)
|
||||||
|
|
||||||
|
uid_hidden = widgets.HiddenField(name="uid")
|
||||||
|
uidNumber_hidden = widgets.HiddenField(name="uidNumber")
|
||||||
|
gidNumber_hidden = widgets.HiddenField(name="gidNumber")
|
||||||
|
givenName_orig = widgets.HiddenField(name="givenName_orig")
|
||||||
|
sn_orig = widgets.HiddenField(name="sn_orig")
|
||||||
|
mail_orig = widgets.HiddenField(name="mail_orig")
|
||||||
|
telephoneNumber_orig = widgets.HiddenField(name="telephoneNumber_orig")
|
||||||
|
|
||||||
class UserFormWidget(widgets.Form):
|
|
||||||
|
class UserNewForm(widgets.Form):
|
||||||
params = ['user']
|
params = ['user']
|
||||||
# fields = [UserFields.uid, UserFields.userPassword, UserFields.givenName,
|
|
||||||
# UserFields.sn, UserFields.mail]
|
|
||||||
fields = [UserFields.uid, UserFields.givenName,
|
fields = [UserFields.uid, UserFields.givenName,
|
||||||
UserFields.uidNumber, UserFields.gidNumber,
|
UserFields.uidNumber, UserFields.gidNumber,
|
||||||
UserFields.sn, UserFields.mail]
|
UserFields.sn, UserFields.mail]
|
||||||
|
|
||||||
def __init__(self, *args, **kw):
|
def __init__(self, *args, **kw):
|
||||||
super(UserFormWidget,self).__init__(*args, **kw)
|
super(UserNewForm,self).__init__(*args, **kw)
|
||||||
(self.template_c, self.template) = widgets.meta.load_kid_template("ipagui.templates.userform")
|
(self.template_c, self.template) = widgets.meta.load_kid_template("ipagui.templates.usernewform")
|
||||||
self.user = UserFields
|
self.user = UserFields
|
||||||
|
|
||||||
def update_params(self, params):
|
def update_params(self, params):
|
||||||
super(UserFormWidget,self).update_params(params)
|
super(UserNewForm,self).update_params(params)
|
||||||
params['has_foo'] = self.has_foo
|
params['has_foo'] = self.has_foo
|
||||||
|
|
||||||
def has_foo(self):
|
def has_foo(self):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
class UserEditForm(widgets.Form):
|
||||||
|
params = ['user']
|
||||||
|
|
||||||
|
fields = [UserFields.givenName, UserFields.sn, UserFields.mail,
|
||||||
|
UserFields.givenName_orig, UserFields.sn_orig, UserFields.mail_orig,
|
||||||
|
UserFields.uid_hidden,
|
||||||
|
UserFields.uidNumber_hidden, UserFields.gidNumber_hidden]
|
||||||
|
|
||||||
|
def __init__(self, *args, **kw):
|
||||||
|
super(UserEditForm,self).__init__(*args, **kw)
|
||||||
|
(self.template_c, self.template) = widgets.meta.load_kid_template("ipagui.templates.usereditform")
|
||||||
|
self.user = UserFields
|
||||||
|
|
||||||
|
|
||||||
# TODO - add dynamic field retrieval:
|
# TODO - add dynamic field retrieval:
|
||||||
# myfields=[]
|
# myfields=[]
|
||||||
# schema = ipa.rpcclient.get_add_schema ()
|
# schema = ipa.rpcclient.get_add_schema ()
|
||||||
|
@ -144,3 +144,7 @@ body {
|
|||||||
color: red;
|
color: red;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.requiredfield {
|
||||||
|
background: #eebbbb;
|
||||||
|
}
|
||||||
|
124
ipa-server/ipa-gui/ipagui/templates/usereditform.kid
Normal file
124
ipa-server/ipa-gui/ipagui/templates/usereditform.kid
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
<div xmlns:py="http://purl.org/kid/ns#"
|
||||||
|
class="simpleroster">
|
||||||
|
<form action="${action}" name="${name}" method="${method}" class="tableform">
|
||||||
|
|
||||||
|
|
||||||
|
<div py:for="field in hidden_fields"
|
||||||
|
py:replace="field.display(value_for(field), **params_for(field))"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<div class="formsection">Account Details</div>
|
||||||
|
<table class="formtable" cellpadding="2" cellspacing="0" border="0">
|
||||||
|
<tr>
|
||||||
|
<th>
|
||||||
|
<label class="fieldlabel" for="${user.uid.field_id}"
|
||||||
|
py:content="user.uid.label" />
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
${value_for(user.uid)}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<!-- <tr>
|
||||||
|
<th>
|
||||||
|
<label class="fieldlabel" for="${user.userPassword.field_id}"
|
||||||
|
py:content="user.userPassword.label" />
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<span py:replace="user.userPassword.display(value_for(user.userPassword))" />
|
||||||
|
<span py:if="tg.errors.get('userPassword')" class="fielderror"
|
||||||
|
py:content="tg.errors.get('userPassword')" />
|
||||||
|
</td>
|
||||||
|
</tr> -->
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th>
|
||||||
|
<label class="fieldlabel" for="${user.uidNumber.field_id}"
|
||||||
|
py:content="user.uidNumber.label" />
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
${value_for(user.uidNumber)}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th>
|
||||||
|
<label class="fieldlabel" for="${user.gidNumber.field_id}"
|
||||||
|
py:content="user.gidNumber.label" />
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
${value_for(user.gidNumber)}
|
||||||
|
</td>
|
||||||
|
</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>
|
||||||
|
<th>
|
||||||
|
<label class="fieldlabel" for="${user.mail.field_id}"
|
||||||
|
py:content="user.mail.label" />
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<span py:replace="user.mail.display(value_for(user.mail))" />
|
||||||
|
<span py:if="tg.errors.get('mail')" class="fielderror"
|
||||||
|
py:content="tg.errors.get('mail')" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>
|
||||||
|
<label class="fieldlabel" for="${user.telephoneNumber.field_id}"
|
||||||
|
py:content="user.telephoneNumber.label" />
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<span py:replace="user.telephoneNumber.display(value_for(user.telephoneNumber))" />
|
||||||
|
<span py:if="tg.errors.get('telephoneNumber')" class="fielderror"
|
||||||
|
py:content="tg.errors.get('telephoneNumber')" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<table class="formtable" cellpadding="2" cellspacing="0" border="0">
|
||||||
|
<tr>
|
||||||
|
<th>
|
||||||
|
<br />
|
||||||
|
<input type="submit" class="submitbutton" name="submit" value="Submit"/>
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<br />
|
||||||
|
<input type="submit" class="submitbutton" name="submit" value="Cancel" />
|
||||||
|
</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
</div>
|
Loading…
Reference in New Issue
Block a user