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 web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.