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:
Kevin McCarthy 2007-08-10 16:31:59 -07:00
parent 2e1f317b09
commit 10cbfe8787
5 changed files with 181 additions and 26 deletions

View File

@ -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()

View File

@ -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 ()

View File

@ -144,3 +144,7 @@ body {
color: red; color: red;
font-weight: bold; font-weight: bold;
} }
.requiredfield {
background: #eebbbb;
}

View 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>