As you which!!
# Controllers
Form 1
def phone_numbers_form():
"""
phone_numbers_form() allow to create/update/display phone(s) number(s).
Args (vars):
readonlyform: If set to "True" the function only display phones
numbers in row, no create form and buttons
to modify add phone number is available.
remove_phone_number_id: If phone number id is passed through url
with this vars phone number specify id
record is deleted.
request_modify_phone_id: The passed phone number with this vars
will make the phone_numbers_form() to return
an update form for the specified phone
number id record.
"""
user_id = None
# To display only the phone numbers
readonlyform = False
if request.vars.readonlyform:
if request.vars.readonlyform in ['True']:
readonlyform = True
if request.args(0) is not None:
try:
user_id = int(request.args(0))
except:
user_id = db(db.auth_user.username ==
request.args(0)).select(db.auth_user.id).first().id
if user_id is None:
user_id = auth.user_id
if request.vars.remove_phone_number_id is not None:
db(db.phone_number.id ==
int(request.vars.remove_phone_number_id)).delete()
record_to_modify = request.vars.request_modify_phone_id
phone_numbers = db(db.phone_number.user_id == user_id).select()
db.phone_number.user_id.default = user_id
db.phone_number.user_id.update = user_id
if record_to_modify is None:
buttons = [
TAG.button(I('', _class='icon-ban-circle icon-large
icon-white'), _type='button',
_onClick='web2py_component("%s","phone_number_component");' %
URL(c='directory',
f='phone_numbers_form',
extension='load',
args=request.args(0)),
_class='btn btn-mini btn-inverse'),
TAG.button((I('', _class='icon-ok icon-large icon-white'),
CAT(' '), STRONG(T('Add'))), _type='submit',
_class='btn btn-mini btn-primary',
_style='white-space: nowrap;')]
else:
buttons = [
TAG.button(I('', _class='icon-ban-circle icon-large
icon-white'), _type='button',
_onClick='web2py_component("%s","phone_number_component");' %
URL(c='directory',
f='phone_numbers_form',
extension='load',
args=request.args(0)),
_class='btn btn-mini btn-inverse'),
TAG.button((I('', _class='icon-ok icon-large icon-white'),
CAT(' '), STRONG(T('Ok'))), _type='submit',
_class='btn btn-mini btn-primary')]
# form.element(_type='submit')['_value'] = T('ok')
# form.element(_type='submit')['_class'] = 'btn btn-mini pull-right'
form = SQLFORM(db.phone_number, record=None if record_to_modify is None
else int(record_to_modify),
buttons=buttons if readonlyform is False else None,
readonly=True if readonlyform is True else False,
_id='phone_number_form_id')
if form.process(formname='phone_number_form').accepted:
if record_to_modify is not None:
response.flash = T('Successfully inserted')
else:
response.flash = T('Successfully updated')
response.js =
'web2py_component("%(URL)s","phone_number_component");' % {'URL':
URL(c='directory',
f='phone_numbers_form',
extension='load',
args=request.args(0))}
elif form.errors:
response.flash = T('Errors...')
#
-----------------------------------------------------------------------------
# <script>
# $(document).ready(function() {
# var add_phone_number_translation = "{{=T('Add a phone
number')}}"
# $("tr#input_new_phone_number").children().hide();
# $("tr#input_new_phone_number").append('<td colspan="3"
id="new_phone_number"><button type="button" class="btn btn-small
pull-right" onclick="$(\'tr#input_new_phone_number\').children().show();
$(\'td#new_phone_number\').hide();"><strong>' +
add_phone_number_translation + '</strong></button></td>');
# });
# </script>
# What below is a replacement for the jQuery code above
if readonlyform is False:
controller_view_js = \
common_functions.flash_message_from_js(tr_id='new_phone_number',
colspan='3',
button_text='Add a phone
number',
flash_text='Please add
your phone number...',
form_id='phone_number_form_id')
else:
controller_view_js = ''
#
-----------------------------------------------------------------------------
return dict(phone_numbers=phone_numbers,
form=form,
controller_view_js=controller_view_js,
readonlyform=readonlyform)
Form 2
def group_membership():
if not auth.has_membership('admin'):
redirect(URL(c='permission', f='not_authorized'))
user_id = None
if request.args(0) is not None:
try:
user_id = int(request.args(0))
except ValueError:
user_id = db(db.auth_user.username ==
request.args(0)).select(db.auth_user.id).first().id
# if user_id is None:
# user_id = auth.user_id # Extrêmement douteux...
if request.vars.remove_membership_id is not None:
db(db.auth_membership.id ==
int(request.vars.remove_membership_id)).delete()
record_to_modify = request.vars.request_modify_membership_id
memberships = db(db.auth_membership.user_id == user_id
).select(db.auth_membership.ALL,
db.auth_group.ALL,
join=db.auth_group.on(db.auth_group.id ==
db.auth_membership.group_id),
orderby=db.auth_group.role_gui)
db.auth_membership.user_id.default = user_id
db.auth_membership.user_id.update = user_id
#
------------------------------------------------------------------------------------------------------------------
# We don't need all the user id to be present in the drop down as group
selected should apply to only a single user
#
------------------------------------------------------------------------------------------------------------------
user_id_set = db(db.auth_user.id == user_id)
db.auth_membership.user_id.requires = IS_IN_DB(user_id_set,
'auth_user.id', '%(first_name)s %(last_name)s (%(id)s)')
#
------------------------------------------------------------------------------------------------------------------
#
------------------------------------------------------------------------------------------------------------------
# We don't need other user_X groups as the user can't be assign to
other user group
#
------------------------------------------------------------------------------------------------------------------
groups_set = db(~db.auth_group.role.startswith('user_'))
db.auth_membership.group_id.requires = IS_IN_DB(groups_set,
'auth_group.id', '%(role)s-%(description)s (%(id)s)')
#
------------------------------------------------------------------------------------------------------------------
if record_to_modify is None:
buttons = [
TAG.button(I('', _class='icon-ban-circle icon-large
icon-white'), _type='button',
_onClick='web2py_component("%s","membership_component");' %
URL(c='directory',
f='group_membership',
extension='load',
args=request.args(0)),
_class='btn btn-mini btn-inverse'),
TAG.button((I('', _class='icon-ok icon-large icon-white'),
CAT(' '), STRONG(T('Add'))), _type='submit',
_class='btn btn-mini btn-primary',
_style='white-space: nowrap;')]
else:
buttons = [
TAG.button(I('', _class='icon-ban-circle icon-large
icon-white'), _type='button',
_onClick='web2py_component("%s","membership_component");' %
URL(c='directory',
f='group_membership',
extension='load',
args=request.args(0)),
_class='btn btn-mini btn-inverse'),
TAG.button((I('', _class='icon-ok icon-large icon-white'),
CAT(' '), STRONG(T('Ok'))), _type='submit',
_class='btn btn-mini btn-primary')]
# form.element(_type='submit')['_value'] = T('ok')
# form.element(_type='submit')['_class'] = 'btn btn-mini pull-right'
form = SQLFORM(db.auth_membership, record=None if record_to_modify is
None else int(record_to_modify),
buttons=buttons, _id='membership_form_id')
if form.process(formname='membership_form').accepted:
if record_to_modify is None:
response.flash = T('Successfully inserted')
else:
response.flash = T('Successfully updated')
response.js = 'web2py_component("%(URL)s","membership_component");'
% {'URL': URL(c='directory',
f='group_membership',
extension='load',
args=request.args(0))}
elif form.errors:
response.flash = T('Errors...')
thead = THEAD(TR(TH(T('Role(s)'))))
trs = []
for r in memberships:
if request.vars.request_modify_membership_id is not None and \
r.auth_membership.id ==
int(request.vars.request_modify_membership_id):
trs.append(TR(TD(form.custom.widget.group_id,
DIV(A(I('', _class='icon-ban-circle icon-large
icon-white'),
_class='btn btn-mini btn-inverse',
_href=URL('group_membership',
extension='load',
args=request.args(0)),
cid=request.cid),
BUTTON(I('', _class='icon-ok icon-large
icon-white'),
_class='btn btn-mini btn-primary',
_type='submit'),
_class='pull-right'))))
else:
trs.append(TR(TD(T(r.auth_group.role_gui),
DIV(A(I('', _class='icon-edit icon-large'),
_class='btn btn-mini',
_href=URL('group_membership',
extension='load', args=request.args(0),
vars=dict(request_modify_membership_id=r.auth_membership.id)),
cid=request.cid),
A(I('', _class='icon-remove icon-large
icon-white'), _class='btn btn-mini btn-danger',
_href=URL('group_membership',
extension='load', args=request.args(0),
vars=dict(remove_membership_id=r.auth_membership.id)), cid=request.cid),
_class='pull-right'))))
if request.vars.request_modify_membership_id == None:
trs.append(TR(TD(form.custom.widget.group_id,
SPAN(form.custom.widget.user_id, _style='display:
none;'), # There is an issue with this...
# NO form.vars.user_id available
# for update form!!
SPAN(form.custom.submit, _class='pull-right')),
_id='input_new_membership'))
memberships_table = TABLE(thead, TBODY(*trs), _class='table
table-condensed table-hover')
#
-----------------------------------------------------------------------------
# $(document).ready(function() {
# var add_membership_translation = '{{=T('Add membership')}}'
# $("tr#input_new_membership").children().hide();
# $("tr#input_new_membership").append('<td colspan="3"
id="new_membership"><button type="button" class="btn btn-small pull-right"
onclick="$(\'tr#input_new_membership\').children().show();
$(\'td#new_membership\').hide();"><strong>' + add_membership_translation +
'</strong></button></td>');
# });
# What below is a replacement for the jQuery code above
controller_view_js = \
common_functions.flash_message_from_js(tr_id='new_membership',
colspan='3',
button_text='Add membership',
flash_text='Please select a
role...',
form_id='membership_form_id')
#
-----------------------------------------------------------------------------
return dict(memberships_table=memberships_table, form=form,
controller_view_js=controller_view_js)
Container page controller
@auth.requires_login()
def manage_users():
if not auth.has_membership('manage_users'):
redirect(URL(c='permission', f='not_authorized'))
if request.args(0) is not None:
try:
user_id = int(request.args(0))
except ValueError:
user_id = db(db.auth_user.username ==
request.args(0)).select(db.auth_user.id).first().id
else:
user_id = None
db.auth_user.address_id.requires = \
IS_EMPTY_OR(IS_IN_DB(db, db.address.id, '%(address_code)s -
%(door_number)s, %(street)s'))
db.auth_user.initials.requires = \
IS_EMPTY_OR(IS_NOT_IN_DB(db, 'auth_user.initials',
error_message=T('Initials already exist!')))
db.auth_user.password.requires =
IS_EMPTY_OR(CRYPT(min_length=auth.settings.password_min_length,
error_message=T('too short')))
for field in db.auth_user.fields:
db.auth_user[field].readable = False
db.auth_user[field].writable = False
fields = (db.auth_user.first_name,
db.auth_user.last_name,
db.auth_user.address_id,
db.auth_user.email,
db.auth_user.initials,
db.auth_user.title_fr,
db.auth_user.title_en,
db.auth_user.manager_id,
db.auth_user.gender,
db.auth_user.registration_key,
db.auth_user.picture)
for field in fields:
field.readable = True
field.writable = True
db.auth_user.registration_key.requires =
IS_EMPTY_OR(IS_IN_SET(['pending', 'disabled']))
db.auth_user.registration_key.default = 'pending'
buttons = [TAG.button((I('', _class='icon-ban-circle icon-large
icon-white'), CAT(' '), STRONG(T('Cancel'))),
_type='button',
_onClick="javascript:void(history.go(-1))",
_class='btn btn-small btn-inverse'),
TAG.button((I('', _class='icon-ok icon-large icon-white'),
CAT(' '), STRONG(T('Update'))),
_type='submit',
_class='btn btn-small btn-primary')]
form = SQLFORM(db.auth_user, record=user_id, buttons=buttons,
formstyle=formstyle, separator=separator)
if form.process(dbio=False).accepted:
if user_id is None:
session.flash = T('User created')
form.vars.ceo = False
form.vars.note = ''
if form.vars.email is not None:
form.vars.username = form.vars.email.split('@')[0]
id = db.auth_user.insert(**{str(var): form.vars[var] for var in
form.vars})
user_id_role_exist = db(db.auth_group.role == 'user_%d' %
id).count() == 1
if user_id_role_exist is False:
db.auth_group.insert(role='user_%d' % id,
description='Individual user group user_ + user id',
role_gui=form.vars.username)
member_of_basic_access_group = \
db((db.auth_membership.user_id == id) &
(db.auth_membership.group_id == db(db.auth_group.role ==
'basic_access'
).select(db.auth_group.id).first().id)
).count() == 1
if member_of_basic_access_group is False:
db.auth_membership.insert(user_id=id,
group_id=db(db.auth_group.role ==
'basic_access'
).select(db.auth_group.id).first().id)
# Push new user into Redmine
redmine_utility.push_active_user_into_redmine(db=db)
else:
session.flash = T('User updated')
db(db.auth_user.id == user_id).update(**{str(var):
form.vars[var] for var in form.vars})
if form.vars.title_fr is not None and form.vars.title_fr != '' \
and form.vars.title_en is not None and form.vars.title_en
!= '':
common_functions.value_translation_update(en_field_name='title_en',
fr_field_name='title_fr', form=form)
if request.args(0) is not None:
username = request.args(0)
elif form.vars.username is not None:
username = form.vars.username
else:
username = None
redirect(URL(c='directory', f='employee', args=username))
elif form.errors:
response.flash = T('Form has error')
else:
response.flash = T('Please complete or update the form')
return dict(form=form)
# View ".load"
Form 1
<strong>{{=T('Phone numbers')}}</strong>
{{=form.custom.begin}}
<table class="table table-condensed table-hover">
<tbody>
{{for phone_number in phone_numbers:}}
<tr>
{{if request.vars.request_modify_phone_id is not None and
phone_number.id == int(request.vars.request_modify_phone_id):}}
<td>{{=form.custom.widget.phone_number_kind_id}}</td>
<td>{{=form.custom.widget.phone_number}}</td>
<td>
<span style="display:
none;">{{=form.custom.widget.user_id}}</span>
{{=form.custom.widget.extension}}
<div class="pull-right">
{{=A(I('', _class='icon-ban-circle icon-white'),
_class='btn btn-mini btn-inverse',
_href=URL('phone_numbers_form',
extension='load', args=request.args(0)), cid=request.cid)}}
{{=BUTTON(I('', _class='icon-ok icon-white'),
_class='btn btn-mini btn-primary', _type='submit')}}
</div>
</td>
{{else:}}
<td>{{=db.phone_number_kind[phone_number.phone_number_kind_id].phone_number_kind}}</td>
<td>{{=phone_number.phone_number}}</td>
<td>
{{if phone_number.extension is not None and
phone_number.extension != '':}}
({{=phone_number.extension}})
{{pass}}
{{if readonlyform is False:}}
<div class="pull-right">
{{=A(I('',_class='icon-edit'), _class='btn
btn-mini',
_href=URL('phone_numbers_form',
extension='load', args=request.args(0),
vars=dict(request_modify_phone_id=phone_number.id)), cid=request.cid)}}
{{=A(I('',_class='icon-remove icon-white'),
_class='btn btn-mini btn-danger',
_href=URL('phone_numbers_form',
extension='load', args=request.args(0),
vars=dict(remove_phone_number_id=phone_number.id)), cid=request.cid)}}
</div>
{{pass}}
</td>
{{pass}}
</tr>
{{pass}}
{{if readonlyform is False:}}
{{if request.vars.request_modify_phone_id == None:}}
<tr id="input_new_phone_number">
<td>{{=form.custom.widget.phone_number_kind_id}}</td>
<td>{{=form.custom.widget.phone_number}}</td>
<td>{{=form.custom.widget.extension}}
<span style="display:
none;">{{=form.custom.widget.user_id}}</span>
<span
class='pull-right'>{{=form.custom.submit}}</span>
</td>
</tr>
{{pass}}
{{pass}}
</tbody>
</table>
{{=form.custom.end}}
<script>
{{=XML(controller_view_js)}}
</script>
Form 2
<strong>{{=T('User membership')}}</strong>
{{=form.custom.begin}}
{{=memberships_table}}
{{=form.custom.end}}
<script>
{{=XML(controller_view_js)}}
</script>
Container page
{{extend 'layout_form.html'}}
<div class="span4">
<div class="thumbnail">
<div>
{{=form}}
</div>
</div>
</div>
{{if request.args(0) is not None:}}
<div class="span6">
<div class="thumbnail">
<div>
{{=LOAD(c='directory', f='phone_numbers_form',
extension='load',
args=request.args(0), ajax=True,
target='phone_number_component')}}
</div>
</div>
</div>
{{if auth.has_membership('admin') and request.args(0) is not None:}}
<div class="span6">
<div class="thumbnail">
<div>
{{=LOAD(c='directory', f='group_membership',
extension='load',
args=request.args(0), ajax=True,
target='membership_component')}}
</div>
</div>
</div>
{{pass}}
{{pass}}
# modules JS generation snippet
def flash_message_from_js(tr_id, colspan, button_text, flash_text,
form_id=None):
"""
Set flash message with $.web2py.flash() so the flash message get fire
in the right context
Need this in view :
<script>
{{=XML(controller_view_js)}}
</script>
NOTE: We now generate this piece of JS from python to solve issue with
quoting escape cause by to many single
and double quotes. The code breaks when whe translate "Please
fill out the form..." with
"S'il vous plaît remplir le formulaire..." the single quote were
not escape properly with the Javascript
implementation.
NOTE: The issue has multiple facet... Mainly the issue is related to
the fact that we want to translate flash
message and for this reason we need to generate JS at some level
from python even if it only the content of
a string variable. Then since we need to generating also HTML
from Javascript it makes multiple level of
abstraction and a lot of quoting... When you add over all that
there is single quote using in the translated
text and that we deal with byte (python str) and not unicode...
That were you end up...
:param colspan:
:param tr_id:
:param flash_text:
:param button_text:
"""
elements_to_be_added = \
TD(TAG.button(STRONG(current.T(button_text).decode('utf8')),
_type='button',
_class='btn btn-small pull-right',
_onclick='$("tr#input_%s").children().show(); '
'$("td#%s").hide(); '
'$.web2py.flash("%s");' % (tr_id, tr_id,
current.T(flash_text).decode('utf8'))),
_colspan=colspan,
_id=tr_id)
controller_view_js = \
'''$(document).ready(function() {
if(!$('#%s .error').length) {
$("tr#input_%s").children().hide();
$("tr#input_%s").append('%s');
}
});''' % (form_id, tr_id, tr_id, elements_to_be_added)
#
-----------------------------------------------------------------------------
return controller_view_js
You have everything...
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.