Can you reproduce the problem with some simpler code? On Tuesday, 21 June 2016 14:42:03 UTC-5, Richard wrote: > > Any clue? > > On Tue, Jun 21, 2016 at 10:51 AM, Richard <ml.richard.vez...@gmail.com> > wrote: > >> 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. >> > >
-- 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.