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.