def jobs_table(queue_name, _class="table table-bordered"): T = current.T queue = Queue(queue_name) table = TABLE( THEAD( TR(TH(T('Name')), TH(T('Age'), TH(T('Actions')) )) ), _class=_class) if queue.jobs: for j in queue.jobs: icon = I(_class='icon-file') span_desc = SPAN(j.description, _class="description") div_job_id = DIV(j.id, _class="job_id") actions = [] if j.exc_info: span_origin = SPAN(T(' from ') + j.origin, _class="origin") span_ended_at = SPAN( utc_prettydate(j.ended_at), _class="end_date") pre_exc_info = PRE(j.exc_info, _class="exc_info") btn_requeue = A(I(_class="icon-retweet"), T(' Requeue'), _href=URL(args=['job', j.id, queue_name, 'requeue']), _class="btn btn-small", cid=current.request.cid) actions.append(btn_requeue) else: span_origin = '' span_ended_at = '' pre_exc_info = '' span_created_at = SPAN(utc_prettydate(j.created_at), _class="created_at") btn_cancel = A(I(_class="icon-remove"), T(' Cancel'), _href=URL(args=['job', j.id, queue_name, 'cancel']), _class="btn btn-small", cid=current.request.cid) actions.append(btn_cancel) table.append(TR(TD(icon, span_desc, span_origin, div_job_id, span_ended_at, pre_exc_info, ), TD(span_created_at), TD(*actions), ) ) else: table.append(TD(T('No jobs'), _colspan="3")) return table
def generar(self, form, insert=False): prestamo = self.container.prestamo if form.vars.fecha == "" or form.vars.tipo_credito == "" \ or form.vars.monto == "" or form.vars.cuotas == "" or \ form.vars.interes == "": return SPAN("Complete los campos que se encuentran marcados con (*)", _class='label label-important') else: FECHA = date(*[int(i) for i in form.vars.fecha.split('-')]) TIPO_CREDITO = int(form.vars.tipo_credito) MONTO = Decimal(form.vars.monto) CUOTAS = int(form.vars.cuotas) INTERES = int(form.vars.interes) TOTAL = prestamo.monto_total(MONTO, INTERES) VALOR_CUOTA = prestamo.valor_cuota(TOTAL, CUOTAS) fechas = self.f_limite(FECHA, TIPO_CREDITO, CUOTAS) # Insertamos los valores a la base de datos. if insert: dbcuota = self.container.db[self.name_table] for c in range(1, CUOTAS + 1): dbcuota.insert( nro=c, prestamo_id=form.vars.id, valor_cuota=VALOR_CUOTA, fecha_limite=fechas[c - 1] ) dbcuota._db.commit() return else: encabezado = ('Nº Cuota', 'Importe', 'Fecha Pago') thead = THEAD(TR(*[TH(i) for i in encabezado])) table = TABLE(thead, _class='table table-condensed') tbody = TBODY() for c in range(1, CUOTAS + 1): tbody.append(TR( TD(c), TD("$%.2f" % VALOR_CUOTA), TD(fechas[c - 1]) ) ) tbody.append(TR(TD('TOTAL:'), TD("$%.2f" % TOTAL, _style="color:red", _colspan=2))) table.append(tbody) return table
def custom_formstyle(form, fields): col_label_size = 4 label_col_class = "col-sm-%d" % col_label_size col_class = "col-sm-%d" % (12 - col_label_size) offset_class = "col-sm-offset-%d" % col_label_size parent = TABLE(_class='table table-sm', _style='margin-top: 1.5rem') for id, label, controls, help in fields: # wrappers _help = SPAN(help, _class='help-block') # embed _help into _controls _controls = DIV(controls, _help, _class="%s" % (col_class)) if isinstance(controls, INPUT): if controls['_type'] == 'submit': controls.add_class('btn btn-primary') _controls = DIV(controls, _class="%s %s" % (col_class, offset_class)) if controls['_type'] == 'button': controls.add_class('btn btn-secondary') elif controls['_type'] == 'file': controls.add_class('input-file') elif controls['_type'] in ('text', 'password'): controls.add_class('form-control') elif controls['_type'] == 'checkbox' or controls['_type'] == 'radio': controls.add_class('form-check-input') label.add_class('form-check-label') label.insert(0, controls) _controls = DIV( DIV(label, _help, _class="form-check"), _class="%s" % col_class) label = DIV(_class="sm-hidden %s" % label_col_class) elif isinstance(controls, SELECT): controls.add_class('custom-select') elif isinstance(controls, TEXTAREA): controls.add_class('form-control') elif isinstance(controls, SPAN): _controls = P(controls.components, _class="form-control-plaintext %s" % col_class) elif isinstance(controls, UL): for e in controls.elements("input"): e.add_class('form-control') elif isinstance(controls, CAT) and isinstance(controls[0], INPUT): controls[0].add_class('form-control') if isinstance(label, LABEL): label.add_class( 'form-control-label font-weight-bold %s' % label_col_class) parent.append( DIV(label, _controls, _class='form-group row', _id=id)) return parent
def queues_table(_class="table table-bordered"): T = current.T queues = Queue.all() table = TABLE( THEAD( TR(TH(T('Queue')), TH(T('Jobs'))) ), _class=_class) if queues: for q in queues: qlink = A(q.name, _href=URL(args=['overview', q.name])) table.append(TR(TD(qlink), TD(q.count))) else: table.append(TD(T('No queues'), _colspan="2")) return table
def widget(self, f, v): """El widget """ import uuid uid = str(uuid.uuid4())[:8] d_id = "cascade-" + uid wrapper = TABLE(_id=d_id, _class='cascade-widget') parent = None parent_format = None fn = '' vr = 'var dd%s = [];var oi%s = [];\n' % (uid, uid) prompt = [self.prompt(table) for table in self.tables] vr += 'var pr%s = ["' % uid + '","'.join([str(p) for p in prompt]) + '"];\n' f_inp = SQLFORM.widgets.string.widget(f, v) f_id = f_inp['_id'] f_inp['_type'] = "hidden" for tc, table in enumerate(self.tables): db = table._db format = table._format options = db(table['id'] > 0).select() id = str(table) + '_' + format[2:-2] opts = [OPTION(format % opt,_value=opt.id, _parent=opt[str(parent)] if parent else '0') \ for opt in options] opts.insert(0, OPTION(prompt[tc], _value=0)) inp = SELECT(opts ,_parent=str(parent) + \ "_" + str(parent_format), _id=id,_name=id, _disabled="disabled" if parent else None) wrapper.append(TR(inp)) next = str(tc + 1) vr += 'var p%s = jQuery("#%s #%s"); dd%s.push(p%s);\n' % ( tc, d_id, id, uid, tc) vr += 'var i%s = jQuery("option",p%s).clone(); oi%s.push(i%s);\n' % ( tc, tc, uid, tc) fn_in = 'for (i=%s;i<%s;i+=1){dd%s[i].find("option").remove();'\ 'dd%s[i].append(\'<option value="0">\' + pr%s[i] + \'</option>\');'\ 'dd%s[i].attr("disabled","disabled");}\n' % \ (next,len(self.tables),uid,uid,uid,uid) fn_in +='oi%s[%s].each(function(i){'\ 'if (jQuery(this).attr("parent") == dd%s[%s].val()){'\ 'dd%s[%s].append(this);}});' % (uid,next,uid,tc,uid,next) fn_in += 'dd%s[%s].removeAttr("disabled");\n' % (uid, next) fn_in += 'jQuery("#%s").val("");' % f_id if (tc < len(self.tables) - 1): fn += 'dd%s[%s].change(function(){%s});\n' % (uid, tc, fn_in) else: fn_in = 'jQuery("#%s").val(jQuery(this).val());' % f_id fn += 'dd%s[%s].change(function(){%s});\n' % (uid, tc, fn_in) if v: fn += 'dd%s[%s].val(%s);' % (uid, tc, v) parent = table parent_format = format[2:-2] wrapper.append(f_inp) wrapper.append(SCRIPT(vr, fn)) return wrapper
def index(): response.view = 'nas/index.html' response.subtitle = T("Home") gform = DIV( P("Nervatura NAS Admin", _style="font-weight: bold;"), P(SPAN(T("Username: "******"font-weight: bold;"), session.auth.user.username), P(SPAN("Ver.No: " + response.verNo, _class="vernum")), TABLE( TR( TD(IMG(_style="vertical-align: bottom;", _src=URL('static', 'images/icon64_ntura_te.png')), _style="width: 64px;padding-right: 0px;"), TD("OPEN SOURCE", BR(), "BUSINESS", BR(), "MANAGEMENT", _style= "width: 120px;color: #616161;vertical-align: middle;font-size: 13px;" ))), P( A("©2011-2015 Nervatura Framework", _href="http://www.nervatura.com", _target="_blank", _title="Nervatura", _style="font-weight: bold;")), _align="center", _style="padding-top:30px;") return dict(form=gform)
def key_table(keys): return TABLE( TR(TD(B(T("Key"))), TD(B(T("Time in Cache (h:m:s)")))), *[TR(TD(k[0]), TD("%02d:%02d:%02d" % k[1])) for k in keys], **dict( _class="cache-keys", _style="border-collapse: separate; border-spacing: .5em;", ))
def get_view_lst(table): rtable = TABLE(_style="width: 100%;") if table in("address","contact"): nervatype_lst=['', 'customer', 'employee', 'event', 'place', 'product', 'project', 'tool', 'trans'] rtable.append(TR(TD(DIV("nervatype",_class="div_label"),_class="td_label",_style="width: 90px;"), TD(SELECT(*[OPTION(nervatype) for nervatype in nervatype_lst], _id="address_nervatype", _name="nervatype"), _class="td_input", _style="width: 175px;"), TD() )) elif table=="event": nervatype_lst=['', 'customer', 'employee', 'place', 'product', 'project', 'tool', 'trans'] rtable.append(TR(TD(DIV("nervatype",_class="div_label"),_class="td_label",_style="width: 90px;"), TD(SELECT(*[OPTION(nervatype) for nervatype in nervatype_lst], _id="event_nervatype", _name="nervatype"), _class="td_input", _style="width: 175px;"), TD() )) elif table=="fieldvalue": nervatype_lst=['', 'address', 'barcode', 'contact', 'currency', 'customer', 'employee', 'event', 'item', 'link', 'log', 'movement', 'payment', 'price', 'place', 'product', 'project', 'rate', 'tax', 'tool', 'trans', 'setting'] rtable.append(TR(TD(DIV("nervatype",_class="div_label"),_class="td_label",_style="width: 90px;"), TD(SELECT(*[OPTION(nervatype) for nervatype in nervatype_lst], _id="fieldvalue_nervatype", _name="nervatype"), _class="td_input", _style="width: 175px;"), TD() )) elif table=="link": nervatype_lst=['', 'address', 'barcode', 'contact', 'currency', 'customer', 'employee', 'event', 'groups', 'item', 'movement', 'payment', 'price', 'place', 'product', 'project', 'rate', 'tax', 'tool', 'trans'] rtable.append(TR(TD(DIV("nervatype1",_class="div_label"),_class="td_label",_style="width: 90px;"), TD(SELECT(*[OPTION(nervatype) for nervatype in nervatype_lst], _id="link_nervatype1", _name="nervatype1"), _class="td_input", _style="width: 175px;"), TD(DIV("nervatype2",_class="div_label"),_class="td_label",_style="width: 90px;"), TD(SELECT(*[OPTION(nervatype) for nervatype in nervatype_lst], _id="link_nervatype2", _name="nervatype2"), _class="td_input", _style="width: 175px;"), TD() )) # elif table=="log": # nervatype_lst=['notype','customer', 'employee', 'event', 'groups', 'place', 'product', 'project', 'tool', 'trans'] # rtable.append(TR(TD(DIV("nervatype",_class="div_label"),_class="td_label",_style="width: 90px;"), # TD(SELECT(*[OPTION(nervatype) for nervatype in nervatype_lst], _id="log_nervatype", _name="nervatype"), # _class="td_input", _style="width: 175px;"), # TD() # )) return rtable
def table_template(table): from gluon.html import TR, TD, TABLE, TAG def FONT(*args, **kwargs): return TAG.font(*args, **kwargs) def types(field): f_type = field.type if not isinstance(f_type, str): return ' ' elif f_type == 'string': return field.length elif f_type == 'id': return B('pk') elif f_type.startswith('reference') or \ f_type.startswith('list:reference'): return B('fk') else: return ' ' # This is horribe HTML but the only one graphiz understands rows = [] cellpadding = 4 color = "#000000" bgcolor = "#FFFFFF" face = "Helvetica" face_bold = "Helvetica Bold" border = 0 rows.append( TR( TD(FONT(table, _face=face_bold, _color=bgcolor), _colspan=3, _cellpadding=cellpadding, _align="center", _bgcolor=color))) for row in db[table]: rows.append( TR( TD(FONT(row.name, _color=color, _face=face_bold), _align="left", _cellpadding=cellpadding, _border=border), TD(FONT(row.type, _color=color, _face=face), _align="left", _cellpadding=cellpadding, _border=border), TD(FONT(types(row), _color=color, _face=face), _align="center", _cellpadding=cellpadding, _border=border))) return "< %s >" % TABLE( *rows, **dict(_bgcolor=bgcolor, _border=1, _cellborder=0, _cellspacing=0)).xml()
def index(): company_name = ns.valid.get_own_customer().custname customer_count_1 = len(ns.db((ns.db.customer.deleted==0)&(ns.db.customer.custtype!=ns.valid.get_groups_id("custtype", "own"))).select().as_list()) customer_count_2 = ns.db.executesql( "select count(*) as rc from customer where deleted=0 and id not in(select customer.id from customer \ inner join groups on customer.custtype=groups.id and groups.groupvalue='own')",as_dict = True)[0]["rc"] table = TABLE(TR(TD("Database company name: "+company_name)), TR(TD("Customer count 1: "+str(customer_count_1))), TR(TD("Customer count 2: "+str(customer_count_2))), TR(TD("Secret page: ",A(SPAN("Login"), _href=URL("secret_page"), _title=T("Login..."))))) return table
def get_delete_lst(fields_lst): rtable = TABLE(_style="width: 100%;") rtable.append(TR(TD(DIV(T("SELECT ROW"),_class="div_label",_style="color: #FFD700;"),_class="td_label", _style="width: auto;border-bottom-style: double;border-width: 4px;border-color: #8B8B83;"), TD(SPAN("1",_class="div_label",_style=checklabel_style), INPUT(_type="checkbox",_value="on",_checked="checked",_disabled="disabled",_name="selrow",_id="row_1",_class="boolean", _style="vertical-align: middle;"), _class="td_input", _style=checkbox_style), TD(SPAN("2",_class="div_label",_style=checklabel_style), INPUT(_type="checkbox",_value="on",_name="selrow",_id="row_2",_class="boolean", _style="vertical-align: middle;"), _class="td_input", _style=checkbox_style), TD(SPAN("3",_class="div_label",_style=checklabel_style), INPUT(_type="checkbox",_value="on",_name="selrow",_id="row_3",_class="boolean", _style="vertical-align: middle;"), _class="td_input", _style=checkbox_style), TD(SPAN("4",_class="div_label",_style=checklabel_style), INPUT(_type="checkbox",_value="on",_name="selrow",_id="row_4",_class="boolean", _style="vertical-align: middle;"), _class="td_input", _style=checkbox_style), )) for field in fields_lst: if field["fieldcat"]==0: rtable.append(TR(TD(DIV(field["label"],_class="div_label"),_class="td_label",_style="width: auto;"), TD(field["widget"],_class="td_input", _style="width: auto;", _id="1"), TD(field["widget"],_class="td_input", _style="width: auto;", _id="2"), TD(field["widget"],_class="td_input", _style="width: auto;", _id="3"), TD(field["widget"],_class="td_input", _style="width: auto;", _id="4") )) return rtable
def widget(self,f,v): """El widget """ import uuid uid = str(uuid.uuid4())[:8] d_id = "cascade-" + uid wrapper = TABLE(_id=d_id,_class='cascade-widget') parent = None parent_format = None fn = '' vr = 'var dd%s = [];var oi%s = [];\n' % (uid,uid) prompt = [self.prompt(table) for table in self.tables] vr += 'var pr%s = ["' % uid + '","'.join([str(p) for p in prompt]) + '"];\n' f_inp = SQLFORM.widgets.string.widget(f,v) f_id = f_inp['_id'] f_inp['_type'] = "hidden" for tc, table in enumerate(self.tables): db = table._db format = table._format options = db(table['id']>0).select() id = str(table) + '_' + format[2:-2] opts = [OPTION(format % opt,_value=opt.id, _parent=opt[str(parent)] if parent else '0') \ for opt in options] opts.insert(0, OPTION(prompt[tc],_value=0)) inp = SELECT(opts ,_parent=str(parent) + \ "_" + str(parent_format), _id=id,_name=id, _disabled="disabled" if parent else None) wrapper.append(TR(inp)) next = str(tc + 1) vr += 'var p%s = jQuery("#%s #%s"); dd%s.push(p%s);\n' % (tc,d_id,id,uid,tc) vr += 'var i%s = jQuery("option",p%s).clone(); oi%s.push(i%s);\n' % (tc,tc,uid,tc) fn_in = 'for (i=%s;i<%s;i+=1){dd%s[i].find("option").remove();'\ 'dd%s[i].append(\'<option value="0">\' + pr%s[i] + \'</option>\');'\ 'dd%s[i].attr("disabled","disabled");}\n' % \ (next,len(self.tables),uid,uid,uid,uid) fn_in +='oi%s[%s].each(function(i){'\ 'if (jQuery(this).attr("parent") == dd%s[%s].val()){'\ 'dd%s[%s].append(this);}});' % (uid,next,uid,tc,uid,next) fn_in += 'dd%s[%s].removeAttr("disabled");\n' % (uid,next) fn_in += 'jQuery("#%s").val("");' % f_id if (tc < len(self.tables)-1): fn += 'dd%s[%s].change(function(){%s});\n' % (uid,tc,fn_in) else: fn_in = 'jQuery("#%s").val(jQuery(this).val());' % f_id fn += 'dd%s[%s].change(function(){%s});\n' % (uid,tc,fn_in) if v: fn += 'dd%s[%s].val(%s);' % (uid,tc,v) parent = table parent_format = format[2:-2] wrapper.append(f_inp) wrapper.append(SCRIPT(vr,fn)) return wrapper
def worker_table(_class="table table-bordered"): T = current.T workers = Worker.all() table = TABLE( THEAD( TR(TH(T('State'), _width="48px"), TH(T('Worker'), TH(T('Queues')) )) ), _class=_class) if workers: for w in workers: state = 'play' if w.state == 'busy' else 'pause' icon = I(_class='icon-' + state) table.append(TR(TD(icon), TD(w.name), TD(', '.join(w.queue_names())) ) ) else: table.append(TD(T('No workers'), _colspan="3")) return table
def toolbar(self): from html import DIV, SCRIPT, BEAUTIFY, TAG, URL, A BUTTON = TAG.button admin = URL("admin", "default", "design", extension='html', args=current.request.application) from gluon.dal import DAL dbstats = [] dbtables = {} infos = DAL.get_instances() for k,v in infos.iteritems(): dbstats.append(TABLE(*[TR(PRE(row[0]),'%.2fms' % (row[1]*1000)) for row in v['dbstats']])) dbtables[k] = dict(defined=v['dbtables']['defined'] or '[no defined tables]', lazy=v['dbtables']['lazy'] or '[no lazy tables]') u = web2py_uuid() backtotop = A('Back to top', _href="#totop-%s" % u) # Convert lazy request.vars from property to Storage so they # will be displayed in the toolbar. request = copy.copy(current.request) request.update(vars=current.request.vars, get_vars=current.request.get_vars, post_vars=current.request.post_vars) return DIV( BUTTON('design', _onclick="document.location='%s'" % admin), BUTTON('request', _onclick="jQuery('#request-%s').slideToggle()" % u), BUTTON('response', _onclick="jQuery('#response-%s').slideToggle()" % u), BUTTON('session', _onclick="jQuery('#session-%s').slideToggle()" % u), BUTTON('db tables', _onclick="jQuery('#db-tables-%s').slideToggle()" % u), BUTTON('db stats', _onclick="jQuery('#db-stats-%s').slideToggle()" % u), DIV(BEAUTIFY(request), backtotop, _class="hidden", _id="request-%s" % u), DIV(BEAUTIFY(current.session), backtotop, _class="hidden", _id="session-%s" % u), DIV(BEAUTIFY(current.response), backtotop, _class="hidden", _id="response-%s" % u), DIV(BEAUTIFY(dbtables), backtotop, _class="hidden", _id="db-tables-%s" % u), DIV(BEAUTIFY( dbstats), backtotop, _class="hidden", _id="db-stats-%s" % u), SCRIPT("jQuery('.hidden').hide()"), _id="totop-%s" % u )
def show_disabled(self, title): return HTML( HEAD( TITLE(title), LINK(_rel="shortcut icon", _href=URL('static', 'favicon.ico'), _type="image/x-icon")), BODY( DIV(CENTER( TABLE(TR( TD(IMG(_src=URL('static', 'images/dataprotection_min.jpg'), _style="border: solid;border-color: #FFFFFF;"), _style= "text-align: center;vertical-align: middle;font-weight: bold;font-family: Arial, Helvetica, sans-serif;font-size: 20px;" )), _style= "background-color:#FFFFFF;color:#444444;margin-top:30px;" )), _style="width:100%;height:100%;")), _style="background-color:#879FB7;")
def get_update_lst(fields_lst): rtable = TABLE(_style="width: 100%;") rtable.append(TR( TD(_style=checkbox_style2), TD(SPAN("1",_class="div_label",_style=checklabel_style), _class="td_input", _style=checkbox_style2+"padding-left:10px;padding-right:0px;"), TD(SPAN(T("ROW"),_class="div_label",_style=checklabel_style), _class="td_input", _style=checkbox_style2+"padding-left:0px;"), TD(SPAN("2",_class="div_label",_style=checklabel_style), _class="td_input", _style=checkbox_style2+"padding-right:0px;"), TD(SPAN(T("ROW"),_class="div_label",_style=checklabel_style), _class="td_input", _style=checkbox_style2+"padding-left:0px;"), TD(SPAN("3",_class="div_label",_style=checklabel_style), _class="td_input", _style=checkbox_style2+"padding-right:0px;"), TD(SPAN(T("ROW"),_class="div_label",_style=checklabel_style), _class="td_input", _style=checkbox_style2+"padding-left:0px;"), TD(SPAN("4",_class="div_label",_style=checklabel_style), _class="td_input", _style=checkbox_style2+"padding-right:0px;"), TD(SPAN(T("ROW"),_class="div_label",_style=checklabel_style), _class="td_input", _style=checkbox_style2+"padding-left:0px;") )) fieldcat=0 for field in fields_lst: style="width: auto;vertical-align: middle;" if field["fieldcat"]==2: style += "font-style:italic;" if fieldcat<2: style+="border-top-style: double;border-width: 4px;border-color: #8B8B83;" fieldcat=field["fieldcat"] rtable.append(TR( TD(DIV(field["label"],_class="div_label"), _class="td_label",_style=style), TD(INPUT(_type="checkbox",_value="on",_name="selfield",_id="select_"+field["fieldname"]+"_1",_class="boolean", _style="vertical-align: middle;"),_class="td_input", _style=style+"padding-right:0px;padding-left:10px;"), TD(field["widget"],_class="td_input", _style=style+"padding-left:0px;", _id="1"), TD(INPUT(_type="checkbox",_value="on",_name="selfield",_id="select_"+field["fieldname"]+"_2",_class="boolean", _style="vertical-align: middle;"),_class="td_input", _style=style+"padding-right:0px;padding-left:5px;"), TD(field["widget"],_class="td_input", _style=style+"padding-left:0px;", _id="2"), TD(INPUT(_type="checkbox",_value="on",_name="selfield",_id="select_"+field["fieldname"]+"_3",_class="boolean", _style="vertical-align: middle;"),_class="td_input", _style=style+"padding-right:0px;padding-left:5px;"), TD(field["widget"],_class="td_input", _style=style+"padding-left:0px;", _id="3"), TD(INPUT(_type="checkbox",_value="on",_name="selfield",_id="select_"+field["fieldname"]+"_4",_class="boolean", _style="vertical-align: middle;"),_class="td_input", _style=style+"padding-right:0px;padding-left:5px;"), TD(field["widget"],_class="td_input", _style=style+"padding-left:0px;", _id="4") )) return rtable
def test_TABLE(self): self.assertEqual( TABLE('<>', _a='1', _b='2').xml(), b'<table a="1" b="2"><tr><td><></td></tr>' + b'</table>')
def select(): import re db = get_database(request) dbname = request.args[0] regex = re.compile('(?P<table>\w+)\.(?P<field>\w+)=(?P<value>\d+)') if len(request.args) > 1 and hasattr(db[request.args[1]], '_primarykey'): regex = re.compile('(?P<table>\w+)\.(?P<field>\w+)=(?P<value>.+)') if request.vars.query: match = regex.match(request.vars.query) if match: request.vars.query = '%s.%s.%s==%s' % ( request.args[0], match.group('table'), match.group('field'), match.group('value')) else: request.vars.query = session.last_query query = get_query(request) if request.vars.start: start = int(request.vars.start) else: start = 0 nrows = 0 stop = start + 100 table = None rows = [] orderby = request.vars.orderby if orderby: orderby = dbname + '.' + orderby if orderby == session.last_orderby: if orderby[0] == '~': orderby = orderby[1:] else: orderby = '~' + orderby session.last_orderby = orderby session.last_query = request.vars.query form = FORM(TABLE( TR( T('Query:'), '', INPUT(_style='width:400px', _name='query', _value=request.vars.query or '', requires=IS_NOT_EMPTY(error_message=T("Cannot be empty")))), TR( T('Update:'), INPUT(_name='update_check', _type='checkbox', value=False), INPUT(_style='width:400px', _name='update_fields', _value=request.vars.update_fields or '')), TR( T('Delete:'), INPUT(_name='delete_check', _class='delete', _type='checkbox', value=False), ''), TR('', '', INPUT(_type='submit', _value=T('submit')))), _action=URL(r=request, args=request.args)) tb = None if form.accepts(request.vars, formname=None): regex = re.compile(request.args[0] + '\.(?P<table>\w+)\..+') match = regex.match(form.vars.query.strip()) if match: table = match.group('table') try: nrows = db(query).count() if form.vars.update_check and form.vars.update_fields: db(query).update(**eval_in_global_env('dict(%s)' % form.vars.update_fields)) response.flash = T('%s %%{row} updated', nrows) elif form.vars.delete_check: db(query).delete() response.flash = T('%s %%{row} deleted', nrows) nrows = db(query).count() if orderby: rows = db(query, ignore_common_filters=True).select( limitby=(start, stop), orderby=eval_in_global_env(orderby)) else: rows = db(query, ignore_common_filters=True).select(limitby=(start, stop)) except Exception as e: import traceback tb = traceback.format_exc() (rows, nrows) = ([], 0) response.flash = DIV(T('Invalid Query'), PRE(str(e))) # begin handle upload csv csv_table = table or request.vars.table if csv_table: formcsv = FORM( str(T('or import from csv file')) + " ", INPUT(_type='file', _name='csvfile'), INPUT(_type='hidden', _value=csv_table, _name='table'), INPUT(_type='submit', _value=T('import'))) else: formcsv = None if formcsv and formcsv.process().accepted: try: import_csv(db[request.vars.table], request.vars.csvfile.file) response.flash = T('data uploaded') except Exception as e: response.flash = DIV(T('unable to parse csv file'), PRE(str(e))) # end handle upload csv return dict( form=form, table=table, start=start, stop=stop, nrows=nrows, rows=rows, query=request.vars.query, formcsv=formcsv, tb=tb, )
def __init__( self, sqlrows, linkto=None, upload=None, orderby=None, headers={}, truncate=16, columns=None, th_link="", **attributes ): TABLE.__init__(self, **attributes) self.components = [] self.attributes = attributes self.sqlrows = sqlrows (components, row) = (self.components, []) if not columns: columns = sqlrows.colnames ## if headers=='fieldname:capitalize': if not headers: headers = {} for c in columns: headers[c] = " ".join([w.capitalize() for w in c.split(".")[-1].split("_")]) for c in columns: if orderby: row.append(TH(A(headers.get(c, c), _href=th_link + "?orderby=" + c))) else: row.append(TH(headers.get(c, c))) components.append(THEAD(TR(*row))) tbody = [] for (rc, record) in enumerate(sqlrows): row = [] if rc % 2 == 0: _class = "even" else: _class = "odd" for colname in columns: if not table_field.match(colname): r = record._extra[colname] row.append(TD(r)) continue (tablename, fieldname) = colname.split(".") field = sqlrows.db[tablename][fieldname] if tablename in record and isinstance(record, Row) and isinstance(record[tablename], Row): r = record[tablename][fieldname] elif fieldname in record: r = record[fieldname] else: raise SyntaxError, "something wrong in Rows object" r_old = r if field.represent: r = field.represent(r) elif field.type == "blob" and r: r = "DATA" elif field.type == "upload": if upload and r: r = A("file", _href="%s/%s" % (upload, r)) elif r: r = "file" else: r = "" elif field.type in ["string", "text"]: r = str(field.formatter(r)) ur = unicode(r, "utf8") if truncate != None and len(ur) > truncate: r = ur[: truncate - 3].encode("utf8") + "..." ## elif linkto and field.type == 'id': ## try: ## href = linkto(r, 'table', tablename) ## except TypeError: ## href = '%s/%s/%s' % (linkto, tablename, r_old) ## r = A(r, _href=href) ## elif linkto and field.type.startswith('reference'): ## ref = field.type[10:] ## try: ## href = linkto(r, 'reference', ref) ## except TypeError: ## href = '%s/%s/%s' % (linkto, ref, r_old) ## if ref.find('.') >= 0: ## tref,fref = ref.split('.') ## if hasattr(sqlrows.db[tref],'_primarykey'): ## href = '%s/%s?%s' % (linkto, tref, urllib.urlencode({fref:ur})) ## r = A(r, _href=href) ## elif linkto and hasattr(field._table,'_primarykey') and fieldname in field._table._primarykey: ## # have to test this with multi-key tables ## key = urllib.urlencode(dict( [ \ ## ((tablename in record \ ## and isinstance(record, Row) \ ## and isinstance(record[tablename], Row)) and ## (k, record[tablename][k])) or (k, record[k]) \ ## for k in field._table._primarykey ] )) ## r = A(r, _href='%s/%s?%s' % (linkto, tablename, key)) row.append(TD(r)) tbody.append(TR(_class=_class, _style="cursor:pointer;", _onclick="load_record(%s);" % record.id, *row)) components.append(TBODY(*tbody))
def grid( query, fields=None, field_id=None, left=None, join=None, #! orderby=None, groupby=None, groupfields=None, #! having=None, #! headers={}, searchable=False, #True, sortable=True, paginate=20, pagename="page", #! deletable=False, #! True, editable=True, details=False, #! True, selectable=None, create=False, #!True, csv=False, #!True, links=None, links_in_grid=True, upload='<default>', args=[], user_signature=False, #!True, maxtextlengths={}, maxtextlength=20, onvalidation=None, oncreate=None, onupdate=None, ondelete=None, sorter_icons=(XML('↑'), XML('↓')), ui='web2py', showbuttontext=True, _class="web2py_grid", formname='web2py_grid', search_widget='default', ignore_rw=False, formstyle='table3cols', exportclasses=None, formargs={}, createargs={}, editargs={}, viewargs={}, ): # jQuery UI ThemeRoller classes (empty if ui is disabled) if ui == 'jquery-ui': ui = dict( widget='ui-widget', header='ui-widget-header', content='ui-widget-content', default='ui-state-default', cornerall='ui-corner-all', cornertop='ui-corner-top', cornerbottom='ui-corner-bottom', button='ui-button-text-icon-primary', buttontext='ui-button-text', buttonadd='ui-icon ui-icon-plusthick', buttonback='ui-icon ui-icon-arrowreturnthick-1-w', buttonexport='ui-icon ui-icon-transferthick-e-w', buttondelete='ui-icon ui-icon-trash', buttonedit='ui-icon ui-icon-pencil', buttontable='ui-icon ui-icon-triangle-1-e', buttonview='ui-icon ui-icon-zoomin', ) elif ui == 'web2py': ui = dict( widget='', header='', content='', default='', cornerall='', cornertop='', cornerbottom='', button='button btn', buttontext='buttontext button', buttonadd='icon plus icon-plus', buttonback='icon leftarrow icon-arrow-left', buttonexport='icon downarrow icon-download', buttondelete='icon trash icon-trash', buttonedit='icon pen icon-pencil', buttontable='icon rightarrow icon-arrow-right', buttonview='icon magnifier icon-zoom-in', ) elif not isinstance(ui, dict): raise RuntimeError, 'SQLFORM.grid ui argument must be a dictionary' db = query._db T = current.T request = current.request session = current.session response = current.response wenabled = (not user_signature or (session.auth and session.auth.user)) create = wenabled and create editable = wenabled and editable deletable = wenabled and deletable def url(**b): b['args'] = args + b.get('args', []) b['hash_vars'] = False b['user_signature'] = user_signature return URL(**b) def url2(**b): b['args'] = request.args + b.get('args', []) b['hash_vars'] = False b['user_signature'] = user_signature return URL(**b) referrer = session.get('_web2py_grid_referrer_' + formname, url()) # if not user_signature every action is accessible # else forbid access unless # - url is based url # - url has valid signature (vars are not signed, only path_info) # = url does not contain 'create','delete','edit' (readonly) if user_signature: if not ('/'.join(str(a) for a in args) == '/'.join(request.args) # or # URL.verify(request,user_signature=user_signature, # hash_vars=False) or not ('create' in request.args or 'delete' in request.args or 'edit' in request.args)): session.flash = T('not authorized') redirect(referrer) def gridbutton(buttonclass='buttonadd', buttontext='Add', buttonurl=url(args=[]), callback=None, delete=None, trap=True): if showbuttontext: if callback: return A(SPAN(_class=ui.get(buttonclass)), SPAN(T(buttontext), _title=buttontext, _class=ui.get('buttontext')), callback=callback, delete=delete, _class=trap_class(ui.get('button'), trap)) else: return A(SPAN(_class=ui.get(buttonclass)), SPAN(T(buttontext), _title=buttontext, _class=ui.get('buttontext')), _href=buttonurl, _class=trap_class(ui.get('button'), trap)) else: if callback: return A(SPAN(_class=ui.get(buttonclass)), callback=callback, delete=delete, _title=buttontext, _class=trap_class(ui.get('buttontext'), trap)) else: return A(SPAN(_class=ui.get(buttonclass)), _href=buttonurl, _title=buttontext, _class=trap_class(ui.get('buttontext'), trap)) dbset = db(query) tablenames = db._adapter.tables(dbset.query) #if left!=None: tablenames+=db._adapter.tables(left) if left != None: if isinstance(left, list): for _left in left: tablenames = tablenames + db._adapter.tables(_left) else: tablenames = tablenames + db._adapter.tables(left) if join != None: if isinstance(join, list): for _join in join: tablenames = tablenames + db._adapter.tables(_join) else: tablenames = tablenames + db._adapter.tables(join) tables = [db[tablename] for tablename in tablenames] if not fields: fields = reduce(lambda a, b: a + b, [[field for field in table] for table in tables]) if not field_id: field_id = tables[0]._id columns = [str(field) for field in fields \ if field._tablename in tablenames] if not str(field_id) in [str(f) for f in fields]: fields.append(field_id) table = field_id.table tablename = table._tablename if upload == '<default>': upload = lambda filename: url(args=['download', filename]) if len(request.args) > 1 and request.args[-2] == 'download': stream = response.download(request, db) raise HTTP(200, stream, **response.headers) def buttons(edit=False, view=False, record=None): buttons = DIV( gridbutton('buttonback', 'Back', referrer), _class='form_header row_buttons %(header)s %(cornertop)s' % ui) if edit and (not callable(edit) or edit(record)): args = ['edit', table._tablename, request.args[-1]] buttons.append(gridbutton('buttonedit', 'Edit', url(args=args))) if view: args = ['view', table._tablename, request.args[-1]] buttons.append(gridbutton('buttonview', 'View', url(args=args))) if record and links: for link in links: if isinstance(link, dict): buttons.append(link['body'](record)) elif link(record): buttons.append(link(record)) return buttons formfooter = DIV( _class='form_footer row_buttons %(header)s %(cornerbottom)s' % ui) create_form = update_form = view_form = search_form = None sqlformargs = dict(formargs) if create and len(request.args) > 1 and request.args[-2] == 'new': table = db[request.args[-1]] sqlformargs.update(createargs) create_form = SQLFORM(table, ignore_rw=ignore_rw, formstyle=formstyle, _class='web2py_form', **sqlformargs) create_form.process(formname=formname, next=referrer, onvalidation=onvalidation, onsuccess=oncreate) res = DIV(buttons(), create_form, formfooter, _class=_class) res.create_form = create_form res.update_form = update_form res.view_form = view_form res.search_form = search_form return res elif details and len(request.args) > 2 and request.args[-3] == 'view': table = db[request.args[-2]] record = table(request.args[-1]) or redirect(URL('error')) sqlformargs.update(viewargs) view_form = SQLFORM(table, record, upload=upload, ignore_rw=ignore_rw, formstyle=formstyle, readonly=True, _class='web2py_form', **sqlformargs) res = DIV(buttons(edit=editable, record=record), view_form, formfooter, _class=_class) res.create_form = create_form res.update_form = update_form res.view_form = view_form res.search_form = search_form return res # elif editable and len(request.args)>2 and request.args[-3]=='edit': # table = db[request.args[-2]] # record = table(request.args[-1]) or redirect(URL('error')) # sqlformargs.update(editargs) # update_form = SQLFORM(table, record, upload=upload, ignore_rw=ignore_rw, # formstyle=formstyle, deletable=deletable, # _class='web2py_form', # submit_button=T('Submit'), # delete_label=T('Check to delete'), # **sqlformargs) # update_form.process(formname=formname, # onvalidation=onvalidation, # onsuccess=onupdate, # next=referrer) # res = DIV(buttons(view=details, record=record), # update_form, formfooter, _class=_class) # res.create_form = create_form # res.update_form = update_form # res.view_form = view_form # res.search_form = search_form # return res elif deletable and len( request.args) > 2 and request.args[-3] == 'delete': table = db[request.args[-2]] if ondelete: ondelete(table, request.args[-1]) ret = db(table[table._id.name] == request.args[-1]).delete() return ret exportManager = dict( csv_with_hidden_cols=(ExporterCSV,'CSV (hidden cols)'), csv=(ExporterCSV,'CSV'), xml=(ExporterXML, 'XML'), html=(ExporterHTML, 'HTML'), tsv_with_hidden_cols=\ (ExporterTSV,'TSV (Excel compatible, hidden cols)'), tsv=(ExporterTSV, 'TSV (Excel compatible)')) if not exportclasses is None: exportManager.update(exportclasses) export_type = request.vars._export_type if export_type: order = request.vars.order or '' if sortable: if order and not order == 'None': if order[:1] == '~': sign, rorder = '~', order[1:] else: sign, rorder = '', order tablename, fieldname = rorder.split('.', 1) orderby = db[tablename][fieldname] if sign == '~': orderby = ~orderby table_fields = [f for f in fields if f._tablename in tablenames] if export_type in ('csv_with_hidden_cols', 'tsv_with_hidden_cols'): if request.vars.keywords: try: dbset = dbset( SQLFORM.build_query( fields, request.vars.get('keywords', ''))) rows = dbset.select(cacheable=True) except Exception: response.flash = T('Internal Error') rows = [] else: rows = dbset.select(cacheable=True) else: rows = dbset.select(left=left, orderby=orderby, cacheable=True * columns) if export_type in exportManager: value = exportManager[export_type] clazz = value[0] if hasattr(value, '__getitem__') else value oExp = clazz(rows) filename = '.'.join(('rows', oExp.file_ext)) response.headers['Content-Type'] = oExp.content_type response.headers['Content-Disposition'] = \ 'attachment;filename='+filename+';' raise HTTP(200, oExp.export(), **response.headers) elif request.vars.records and not isinstance(request.vars.records, list): request.vars.records = [request.vars.records] elif not request.vars.records: request.vars.records = [] session['_web2py_grid_referrer_' + formname] = url2(vars=request.vars) console = DIV(_class='web2py_console %(header)s %(cornertop)s' % ui) error = None search_actions = DIV(_class='web2py_search_actions') if create: search_actions.append( gridbutton(buttonclass='buttonadd', buttontext=T('Add'), buttonurl=url(args=['new', tablename]))) console.append(search_actions) # if create: # add = gridbutton( # buttonclass='buttonadd', # buttontext='Add', # buttonurl=url(args=['new',tablename])) # if not searchable: # console.append(add) else: add = '' if searchable: sfields = reduce(lambda a, b: a + b, [[f for f in t if f.readable] for t in tables]) if isinstance(search_widget, dict): search_widget = search_widget[tablename] if search_widget == 'default': search_menu = SQLFORM.search_menu(sfields) search_widget = lambda sfield, url: CAT( add, FORM(INPUT( _name='keywords', _value=request.vars.keywords, _id='web2py_keywords', _onfocus= "jQuery('#w2p_query_fields').change();jQuery('#w2p_query_panel').slideDown();" ), INPUT( _type='submit', _value=T('Search'), _class="btn"), INPUT(_type='submit', _value=T('Clear'), _class="btn", _onclick="jQuery('#web2py_keywords').val('');"), _method="GET", _action=url), search_menu) form = search_widget and search_widget(sfields, url()) or '' console.append(form) keywords = request.vars.get('keywords', '') try: if callable(searchable): subquery = searchable(sfields, keywords) else: subquery = SQLFORM.build_query(sfields, keywords) except RuntimeError: subquery = None error = T('Invalid query') else: subquery = None if subquery: dbset = dbset(subquery) try: if groupby: nrows = len( dbset.select(*groupfields, join=join, left=left, groupby=groupby, having=having, cacheable=True)) elif left or join: nrows = dbset.select('count(*)', join=join, left=left, cacheable=True).first()['count(*)'] # if left or groupby: # c = 'count(*)' # nrows = dbset.select(c,left=left,cacheable=True, # groupby=groupby).first()[c] else: nrows = dbset.count() except: nrows = 0 error = T('Unsupported query') order = request.vars.order or '' if sortable: if order and not order == 'None': if groupby: if str(groupby[0]).find(order) > -1: tablename, fieldname = order.split('~')[-1].split( '.', 1) sort_field = db[tablename][fieldname] exception = sort_field.type in ('date', 'datetime', 'time') if exception: orderby = (order[:1] == '~' and sort_field) or ~sort_field else: orderby = (order[:1] == '~' and ~sort_field) or sort_field else: tablename, fieldname = order.split('~')[-1].split( '.', 1) gfields = str(groupfields[0]).split(",") for gfield in gfields: if len(gfield.split(" AS ")) > 1: if gfield.split(" AS ")[1] == fieldname: if str(gfield.split(" AS ")[0]).find( "SUM") > -1: sort_field = db[tablename][ fieldname].sum() elif str(gfield.split(" AS ")[0]).find( "COUNT") > -1: sort_field = db[tablename][ fieldname].count() elif str(gfield.split(" AS ")[0]).find( "MIN") > -1: sort_field = db[tablename][ fieldname].min() elif str(gfield.split(" AS ")[0]).find( "MAX") > -1: sort_field = db[tablename][ fieldname].max() elif str(gfield.split(" AS ")[0]).find( "LENGTH") > -1: sort_field = db[tablename][ fieldname].len() else: break orderby = (order[:1] == '~' and ~sort_field) or sort_field break else: tablename, fieldname = order.split('~')[-1].split('.', 1) sort_field = db[tablename][fieldname] exception = sort_field.type in ('date', 'datetime', 'time') if exception: orderby = (order[:1] == '~' and sort_field) or ~sort_field else: orderby = (order[:1] == '~' and ~sort_field) or sort_field head = TR(_class=ui.get('header')) if selectable: head.append(TH(_class=ui.get('default'))) for field in fields: if columns and not str(field) in columns: continue if not field.readable: continue key = str(field) header = headers.get( str(field), hasattr(field, 'label') and field.label or key) if sortable: if key == order: key, marker = '~' + order, sorter_icons[0] elif key == order[1:]: marker = sorter_icons[1] else: marker = '' header = A( header, marker, _href=url(vars=dict(keywords=request.vars.keywords or '', order=key)), _class=trap_class()) head.append(TH(header, _class=ui.get('default'))) if links and links_in_grid: for link in links: if isinstance(link, dict): head.append(TH(link['header'], _class=ui.get('default'))) # Include extra column for buttons if needed. include_buttons_column = ( details or editable or deletable or (links and links_in_grid and not all([isinstance(link, dict) for link in links]))) if include_buttons_column: head.insert(0, TH(_class=ui.get('default', ''))) # head.append(TH(_class=ui.get('default'))) paginator = UL() if paginate and paginate < nrows: npages, reminder = divmod(nrows, paginate) if reminder: npages += 1 try: page = int(request.vars.page or 1) - 1 except ValueError: page = 0 limitby = (paginate * page, paginate * (page + 1)) def self_link(name, p): d = dict(page=p + 1) if order: d['order'] = order if request.vars.keywords: d['keywords'] = request.vars.keywords return A(name, _href=url(vars=d), _class=trap_class()) NPAGES = 5 # window is 2*NPAGES if page > NPAGES + 1: paginator.append(LI(self_link('<<', 0))) if page > NPAGES: paginator.append(LI(self_link('<', page - 1))) pages = range(max(0, page - NPAGES), min(page + NPAGES, npages)) for p in pages: if p == page: paginator.append( LI(A(p + 1, _onclick='return false'), _class=trap_class('current'))) else: paginator.append(LI(self_link(p + 1, p))) if page < npages - NPAGES: paginator.append(LI(self_link('>', page + 1))) if page < npages - NPAGES - 1: paginator.append(LI(self_link('>>', npages - 1))) else: limitby = None try: table_fields = [f for f in fields if f._tablename in tablenames] if groupby: rows = dbset.select(*groupfields, join=join, left=left, groupby=groupby, having=having, orderby=orderby, limitby=limitby, cacheable=True) else: rows = dbset.select(join=join, left=left, orderby=orderby, limitby=limitby, cacheable=True, *table_fields) # rows = dbset.select(left=left,orderby=orderby, # groupby=groupby,limitby=limitby, # cacheable=True,*table_fields) except SyntaxError: rows = None error = T("Query Not Supported") if nrows: message = error or T('%(nrows)s records found') % dict(nrows=nrows) console.append(DIV(message, _class='web2py_counter')) if rows: htmltable = TABLE(THEAD(head)) tbody = TBODY() numrec = 0 for row in rows: if numrec % 2 == 0: classtr = 'even' else: classtr = 'odd' numrec += 1 id = row[field_id] #@ReservedAssignment if id: rid = id if callable(rid): ### can this ever be callable? rid = rid(row) tr = TR(_id=rid, _class='%s %s' % (classtr, 'with_id')) else: tr = TR(_class=classtr) if selectable: tr.append( INPUT(_type="checkbox", _name="records", _value=id, value=request.vars.records)) for field in fields: if not str(field) in columns: continue if not field.readable: continue if field.type == 'blob': continue value = row[field] maxlength = maxtextlengths.get(str(field), maxtextlength) if field.represent: try: value = field.represent(value, row) except Exception: try: value = field.represent( value, row[field._tablename]) except Exception: pass elif field.type == 'boolean': value = INPUT(_type="checkbox", _checked=value, _disabled=True) elif field.type == 'upload': if value: if callable(upload): value = A(current.T('file'), _href=upload(value)) elif upload: value = A(current.T('file'), _href='%s/%s' % (upload, value)) else: value = '' if isinstance(value, str): value = truncate_string(value, maxlength) elif not isinstance(value, DIV): value = field.formatter(value) if not include_buttons_column: tr.append(TD(value, _style="padding:10px;")) else: tr.append(TD(value)) row_buttons = TD(_class='row_buttons') if links and links_in_grid: for link in links: if isinstance(link, dict): tr.append(TD(link['body'](row))) else: if link(row): row_buttons.append(link(row)) if include_buttons_column: if details and (not callable(details) or details(row)): row_buttons.append( gridbutton('buttonview', 'View', url(args=['view', tablename, id]))) if editable and (not callable(editable) or editable(row)): row_buttons.append( gridbutton('buttonedit', 'Edit', url(args=['edit', tablename, id]))) if deletable and (not callable(deletable) or deletable(row)): row_buttons.append( gridbutton( 'buttondelete', 'Delete', callback=url(args=['delete', tablename, id]), delete='tr')) #tr.append(row_buttons) tr.insert(0, row_buttons) tbody.append(tr) htmltable.append(tbody) htmltable = DIV(htmltable, _style='width:100%;overflow-x:auto') if selectable: htmltable = FORM(htmltable, INPUT(_type="submit")) if htmltable.process(formname=formname).accepted: # htmltable.vars.records = htmltable.vars.records or [] htmltable.vars.records = htmltable.vars.records if type( htmltable.vars.records) == list else [ htmltable.vars.records ] records = [int(r) for r in htmltable.vars.records] selectable(records) redirect(referrer) else: htmltable = DIV(current.T('No records found')) if csv and nrows: export_links = [] for k, v in sorted(exportManager.items()): label = v[1] if hasattr(v, "__getitem__") else k link = url2(vars=dict(order=request.vars.order or '', _export_type=k, keywords=request.vars.keywords or '')) export_links.append(A(T(label), _href=link)) export_menu = \ DIV(T('Export:'),_class="w2p_export_menu",*export_links) else: export_menu = None res = DIV(console, DIV(htmltable, _class="web2py_table"), _class='%s %s' % (_class, ui.get('widget'))) if paginator.components: res.append( DIV(paginator, _class="web2py_paginator %(header)s %(cornerbottom)s" % ui)) if export_menu: res.append(export_menu) res.create_form = create_form res.update_form = update_form res.view_form = view_form res.search_form = search_form return res
def user(): table = TABLE(TR(TD("Back to home: ",A(SPAN("HOME"), _href=URL("index"), _title=T("HOME")))), TR(TD(auth()))) return table
def exportToReport(): if request.vars.database and request.vars.username: if request.vars.code in ("base64", "base64all"): if request.vars.password: password = base64.b64decode(request.vars.password) else: password = None validator = getLogin(base64.b64decode(request.vars.database), base64.b64decode(request.vars.username), password) else: if request.vars.password: password = request.vars.password else: password = None validator = getLogin(request.vars.database, request.vars.username, password) if validator["valid"] == False: return validator["message"] else: return T('Missing login parameter(s)!') params = {} filters = {} if request.vars.reportcode: if request.vars.code in ("base64", "base64all"): params["reportcode"] = base64.b64decode(request.vars.reportcode) else: params["reportcode"] = request.vars.reportcode elif request.vars.report_id: if request.vars.code in ("base64", "base64all"): params["report_id"] = base64.b64decode(request.vars.report_id) else: params["report_id"] = request.vars.report_id else: return T('Missing reportcode or report_id parameter!') if request.vars.filters: if request.vars.code in ("base64", "base64all"): filters = getParamList(base64.b64decode(request.vars.filters))[0] else: filters = getParamList(request.vars.filters)[0] else: return T('Missing filters parameter!') if request.vars.output: if request.vars.code in ("base64", "base64all"): params["output"] = base64.b64decode(request.vars.output) else: params["output"] = request.vars.output else: params["output"] = "html" if request.vars.orientation: if request.vars.code in ("base64", "base64all"): params["orientation"] = base64.b64decode(request.vars.orientation) else: params["orientation"] = request.vars.orientation else: params["orientation"] = "P" if request.vars.size: if request.vars.code in ("base64", "base64all"): params["size"] = base64.b64decode(request.vars.size) else: params["size"] = request.vars.size else: params["size"] = "A4" if params["output"] == "printer": if not request.vars.printername: return T('Missing printername parameter!') printer_prop = dbout.check_printer(request.vars.printername) if printer_prop["state"] == False: return printer_prop["error_message"] params["output"] = "pdf" if request.vars.copies: try: copies = int(request.vars.copies) except: copies = 1 else: copies = 1 else: printer_prop = None report_tmp = dbout.getReport(params, filters) if type(report_tmp).__name__ == "str": if report_tmp == "NODATA": return HTML( HEAD( TITLE("Nervatura Report"), LINK(_rel="shortcut icon", _href=URL('static', 'favicon.ico'), _type="image/x-icon")), BODY( DIV(CENTER( TABLE(TR( TD(IMG( _src=URL('static', 'images/nodata.png'), _style="border: solid;border-color: #FFFFFF;"), _style= "text-align: center;vertical-align: middle;font-weight: bold;font-family: sans-serif;font-size: 20px;" )), _style= "background-color:#FFFFFF;color:#444444;margin-top:200px;" )), _style="width:100%;height:100%")), _style="background-color:#000000;") else: return report_tmp if printer_prop: print_item = dbout.printReport(printer_prop, report_tmp["template"], "Nervatura Report", copies, params["orientation"], params["size"]) if print_item["state"] == False: return print_item["error_message"] return "OK" elif report_tmp["filetype"] == "ntr": if params["output"] == "xml": response.headers['Content-Type'] = 'text/xml' elif params["output"] == "pdf": response.headers['Content-Type'] = 'application/pdf' if request.vars.code == "base64all": return base64.b64encode(report_tmp["template"]) else: return report_tmp["template"] elif report_tmp["filetype"] == "xls": response.headers['Content-Type'] = "application/vnd.ms-excel" response.headers[ 'Content-Disposition'] = 'attachment;filename="NervaturaReport.xls"' if request.vars.code == "base64all": return base64.b64encode(report_tmp["template"]) else: return report_tmp["template"] elif report_tmp["filetype"] == "html": response.view = "default/report.html" response.title = report_tmp["data"]["title"] response.subtitle = "" import StringIO report_tmp["template"] = response.render( StringIO.StringIO(report_tmp["template"]), report_tmp["data"]) return dict(template=XML(report_tmp["template"])) else: if request.vars.code == "base64all": return base64.b64encode(report_tmp["template"]) else: return report_tmp["template"]
def grid(query, fields=None, field_id=None, left=None, join=None, #! orderby=None, groupby=None, groupfields=None, #! having=None, #! headers={}, searchable=False, #True, sortable=True, paginate=20, pagename="page", #! deletable=False, #! True, editable=True, details=False, #! True, selectable=None, create=False, #!True, csv=False, #!True, links=None, links_in_grid=True, upload = '<default>', args=[], user_signature = False, #!True, maxtextlengths={}, maxtextlength=20, onvalidation=None, oncreate=None, onupdate=None, ondelete=None, sorter_icons=(XML('↑'),XML('↓')), ui = 'web2py', showbuttontext=True, _class="web2py_grid", formname='web2py_grid', search_widget='default', ignore_rw = False, formstyle = 'table3cols', exportclasses = None, formargs={}, createargs={}, editargs={}, viewargs={}, ): # jQuery UI ThemeRoller classes (empty if ui is disabled) if ui == 'jquery-ui': ui = dict(widget='ui-widget', header='ui-widget-header', content='ui-widget-content', default='ui-state-default', cornerall='ui-corner-all', cornertop='ui-corner-top', cornerbottom='ui-corner-bottom', button='ui-button-text-icon-primary', buttontext='ui-button-text', buttonadd='ui-icon ui-icon-plusthick', buttonback='ui-icon ui-icon-arrowreturnthick-1-w', buttonexport='ui-icon ui-icon-transferthick-e-w', buttondelete='ui-icon ui-icon-trash', buttonedit='ui-icon ui-icon-pencil', buttontable='ui-icon ui-icon-triangle-1-e', buttonview='ui-icon ui-icon-zoomin', ) elif ui == 'web2py': ui = dict(widget='', header='', content='', default='', cornerall='', cornertop='', cornerbottom='', button='button btn', buttontext='buttontext button', buttonadd='icon plus icon-plus', buttonback='icon leftarrow icon-arrow-left', buttonexport='icon downarrow icon-download', buttondelete='icon trash icon-trash', buttonedit='icon pen icon-pencil', buttontable='icon rightarrow icon-arrow-right', buttonview='icon magnifier icon-zoom-in', ) elif not isinstance(ui,dict): raise RuntimeError,'SQLFORM.grid ui argument must be a dictionary' db = query._db T = current.T request = current.request session = current.session response = current.response wenabled = (not user_signature or (session.auth and session.auth.user)) create = wenabled and create editable = wenabled and editable deletable = wenabled and deletable def url(**b): b['args'] = args+b.get('args',[]) b['hash_vars']=False b['user_signature'] = user_signature return URL(**b) def url2(**b): b['args'] = request.args+b.get('args',[]) b['hash_vars']=False b['user_signature'] = user_signature return URL(**b) referrer = session.get('_web2py_grid_referrer_'+formname, url()) # if not user_signature every action is accessible # else forbid access unless # - url is based url # - url has valid signature (vars are not signed, only path_info) # = url does not contain 'create','delete','edit' (readonly) if user_signature: if not( '/'.join(str(a) for a in args) == '/'.join(request.args) # or # URL.verify(request,user_signature=user_signature, # hash_vars=False) or not ( 'create' in request.args or 'delete' in request.args or 'edit' in request.args)): session.flash = T('not authorized') redirect(referrer) def gridbutton(buttonclass='buttonadd', buttontext='Add', buttonurl=url(args=[]), callback=None, delete=None, trap=True): if showbuttontext: if callback: return A(SPAN(_class=ui.get(buttonclass)), SPAN(T(buttontext),_title=buttontext, _class=ui.get('buttontext')), callback=callback,delete=delete, _class=trap_class(ui.get('button'),trap)) else: return A(SPAN(_class=ui.get(buttonclass)), SPAN(T(buttontext),_title=buttontext, _class=ui.get('buttontext')), _href=buttonurl, _class=trap_class(ui.get('button'),trap)) else: if callback: return A(SPAN(_class=ui.get(buttonclass)), callback=callback,delete=delete, _title=buttontext, _class=trap_class(ui.get('buttontext'),trap)) else: return A(SPAN(_class=ui.get(buttonclass)), _href=buttonurl,_title=buttontext, _class=trap_class(ui.get('buttontext'),trap)) dbset = db(query) tablenames = db._adapter.tables(dbset.query) #if left!=None: tablenames+=db._adapter.tables(left) if left!=None: if isinstance(left,list): for _left in left: tablenames=tablenames+db._adapter.tables(_left) else: tablenames=tablenames+db._adapter.tables(left) if join!=None: if isinstance(join,list): for _join in join: tablenames=tablenames+db._adapter.tables(_join) else: tablenames=tablenames+db._adapter.tables(join) tables = [db[tablename] for tablename in tablenames] if not fields: fields = reduce(lambda a,b:a+b, [[field for field in table] for table in tables]) if not field_id: field_id = tables[0]._id columns = [str(field) for field in fields \ if field._tablename in tablenames] if not str(field_id) in [str(f) for f in fields]: fields.append(field_id) table = field_id.table tablename = table._tablename if upload=='<default>': upload = lambda filename: url(args=['download',filename]) if len(request.args)>1 and request.args[-2]=='download': stream = response.download(request,db) raise HTTP(200,stream,**response.headers) def buttons(edit=False,view=False,record=None): buttons = DIV(gridbutton('buttonback', 'Back', referrer), _class='form_header row_buttons %(header)s %(cornertop)s' % ui) if edit and (not callable(edit) or edit(record)): args = ['edit',table._tablename,request.args[-1]] buttons.append(gridbutton('buttonedit', 'Edit', url(args=args))) if view: args = ['view',table._tablename,request.args[-1]] buttons.append(gridbutton('buttonview', 'View', url(args=args))) if record and links: for link in links: if isinstance(link,dict): buttons.append(link['body'](record)) elif link(record): buttons.append(link(record)) return buttons formfooter = DIV( _class='form_footer row_buttons %(header)s %(cornerbottom)s' % ui) create_form = update_form = view_form = search_form = None sqlformargs = dict(formargs) if create and len(request.args)>1 and request.args[-2] == 'new': table = db[request.args[-1]] sqlformargs.update(createargs) create_form = SQLFORM( table, ignore_rw=ignore_rw, formstyle=formstyle, _class='web2py_form', **sqlformargs) create_form.process(formname=formname, next=referrer, onvalidation=onvalidation, onsuccess=oncreate) res = DIV(buttons(), create_form, formfooter, _class=_class) res.create_form = create_form res.update_form = update_form res.view_form = view_form res.search_form = search_form return res elif details and len(request.args)>2 and request.args[-3]=='view': table = db[request.args[-2]] record = table(request.args[-1]) or redirect(URL('error')) sqlformargs.update(viewargs) view_form = SQLFORM(table, record, upload=upload, ignore_rw=ignore_rw, formstyle=formstyle, readonly=True, _class='web2py_form', **sqlformargs) res = DIV(buttons(edit=editable, record=record), view_form, formfooter, _class=_class) res.create_form = create_form res.update_form = update_form res.view_form = view_form res.search_form = search_form return res # elif editable and len(request.args)>2 and request.args[-3]=='edit': # table = db[request.args[-2]] # record = table(request.args[-1]) or redirect(URL('error')) # sqlformargs.update(editargs) # update_form = SQLFORM(table, record, upload=upload, ignore_rw=ignore_rw, # formstyle=formstyle, deletable=deletable, # _class='web2py_form', # submit_button=T('Submit'), # delete_label=T('Check to delete'), # **sqlformargs) # update_form.process(formname=formname, # onvalidation=onvalidation, # onsuccess=onupdate, # next=referrer) # res = DIV(buttons(view=details, record=record), # update_form, formfooter, _class=_class) # res.create_form = create_form # res.update_form = update_form # res.view_form = view_form # res.search_form = search_form # return res elif deletable and len(request.args)>2 and request.args[-3]=='delete': table = db[request.args[-2]] if ondelete: ondelete(table,request.args[-1]) ret = db(table[table._id.name]==request.args[-1]).delete() return ret exportManager = dict( csv_with_hidden_cols=(ExporterCSV,'CSV (hidden cols)'), csv=(ExporterCSV,'CSV'), xml=(ExporterXML, 'XML'), html=(ExporterHTML, 'HTML'), tsv_with_hidden_cols=\ (ExporterTSV,'TSV (Excel compatible, hidden cols)'), tsv=(ExporterTSV, 'TSV (Excel compatible)')) if not exportclasses is None: exportManager.update(exportclasses) export_type = request.vars._export_type if export_type: order = request.vars.order or '' if sortable: if order and not order=='None': if order[:1]=='~': sign, rorder = '~', order[1:] else: sign, rorder = '', order tablename,fieldname = rorder.split('.',1) orderby=db[tablename][fieldname] if sign=='~': orderby=~orderby table_fields = [f for f in fields if f._tablename in tablenames] if export_type in ('csv_with_hidden_cols','tsv_with_hidden_cols'): if request.vars.keywords: try: dbset = dbset(SQLFORM.build_query( fields,request.vars.get('keywords',''))) rows = dbset.select(cacheable=True) except Exception: response.flash = T('Internal Error') rows = [] else: rows = dbset.select(cacheable=True) else: rows = dbset.select(left=left,orderby=orderby, cacheable=True*columns) if export_type in exportManager: value = exportManager[export_type] clazz = value[0] if hasattr(value, '__getitem__') else value oExp = clazz(rows) filename = '.'.join(('rows', oExp.file_ext)) response.headers['Content-Type'] = oExp.content_type response.headers['Content-Disposition'] = \ 'attachment;filename='+filename+';' raise HTTP(200, oExp.export(),**response.headers) elif request.vars.records and not isinstance( request.vars.records,list): request.vars.records=[request.vars.records] elif not request.vars.records: request.vars.records=[] session['_web2py_grid_referrer_'+formname] = url2(vars=request.vars) console = DIV(_class='web2py_console %(header)s %(cornertop)s' % ui) error = None search_actions = DIV(_class='web2py_search_actions') if create: search_actions.append(gridbutton(buttonclass='buttonadd', buttontext=T('Add'), buttonurl=url(args=['new',tablename]))) console.append(search_actions) # if create: # add = gridbutton( # buttonclass='buttonadd', # buttontext='Add', # buttonurl=url(args=['new',tablename])) # if not searchable: # console.append(add) else: add = '' if searchable: sfields = reduce(lambda a,b:a+b, [[f for f in t if f.readable] for t in tables]) if isinstance(search_widget,dict): search_widget = search_widget[tablename] if search_widget=='default': search_menu = SQLFORM.search_menu(sfields) search_widget = lambda sfield, url: CAT(add,FORM( INPUT(_name='keywords',_value=request.vars.keywords, _id='web2py_keywords',_onfocus="jQuery('#w2p_query_fields').change();jQuery('#w2p_query_panel').slideDown();"), INPUT(_type='submit',_value=T('Search'),_class="btn"), INPUT(_type='submit',_value=T('Clear'),_class="btn", _onclick="jQuery('#web2py_keywords').val('');"), _method="GET",_action=url),search_menu) form = search_widget and search_widget(sfields,url()) or '' console.append(form) keywords = request.vars.get('keywords','') try: if callable(searchable): subquery = searchable(sfields, keywords) else: subquery = SQLFORM.build_query(sfields, keywords) except RuntimeError: subquery = None error = T('Invalid query') else: subquery = None if subquery: dbset = dbset(subquery) try: if groupby: nrows = len(dbset.select(*groupfields, join=join, left=left, groupby=groupby, having=having, cacheable=True)) elif left or join: nrows = dbset.select('count(*)',join=join,left=left, cacheable=True).first()['count(*)'] # if left or groupby: # c = 'count(*)' # nrows = dbset.select(c,left=left,cacheable=True, # groupby=groupby).first()[c] else: nrows = dbset.count() except: nrows = 0 error = T('Unsupported query') order = request.vars.order or '' if sortable: if order and not order=='None': if groupby: if str(groupby[0]).find(order)>-1: tablename,fieldname = order.split('~')[-1].split('.',1) sort_field = db[tablename][fieldname] exception = sort_field.type in ('date','datetime','time') if exception: orderby = (order[:1]=='~' and sort_field) or ~sort_field else: orderby = (order[:1]=='~' and ~sort_field) or sort_field else: tablename,fieldname = order.split('~')[-1].split('.',1) gfields = str(groupfields[0]).split(",") for gfield in gfields: if len(gfield.split(" AS "))>1: if gfield.split(" AS ")[1]==fieldname: if str(gfield.split(" AS ")[0]).find("SUM")>-1: sort_field = db[tablename][fieldname].sum() elif str(gfield.split(" AS ")[0]).find("COUNT")>-1: sort_field = db[tablename][fieldname].count() elif str(gfield.split(" AS ")[0]).find("MIN")>-1: sort_field = db[tablename][fieldname].min() elif str(gfield.split(" AS ")[0]).find("MAX")>-1: sort_field = db[tablename][fieldname].max() elif str(gfield.split(" AS ")[0]).find("LENGTH")>-1: sort_field = db[tablename][fieldname].len() else: break orderby = (order[:1]=='~' and ~sort_field) or sort_field break else: tablename,fieldname = order.split('~')[-1].split('.',1) sort_field = db[tablename][fieldname] exception = sort_field.type in ('date','datetime','time') if exception: orderby = (order[:1]=='~' and sort_field) or ~sort_field else: orderby = (order[:1]=='~' and ~sort_field) or sort_field head = TR(_class=ui.get('header')) if selectable: head.append(TH(_class=ui.get('default'))) for field in fields: if columns and not str(field) in columns: continue if not field.readable: continue key = str(field) header = headers.get(str(field), hasattr(field,'label') and field.label or key) if sortable: if key == order: key, marker = '~'+order, sorter_icons[0] elif key == order[1:]: marker = sorter_icons[1] else: marker = '' header = A(header,marker,_href=url(vars=dict( keywords=request.vars.keywords or '', order=key)),_class=trap_class()) head.append(TH(header, _class=ui.get('default'))) if links and links_in_grid: for link in links: if isinstance(link,dict): head.append(TH(link['header'], _class=ui.get('default'))) # Include extra column for buttons if needed. include_buttons_column = (details or editable or deletable or (links and links_in_grid and not all([isinstance(link, dict) for link in links]))) if include_buttons_column: head.insert(0,TH(_class=ui.get('default',''))) # head.append(TH(_class=ui.get('default'))) paginator = UL() if paginate and paginate<nrows: npages,reminder = divmod(nrows,paginate) if reminder: npages+=1 try: page = int(request.vars.page or 1)-1 except ValueError: page = 0 limitby = (paginate*page,paginate*(page+1)) def self_link(name,p): d = dict(page=p+1) if order: d['order']=order if request.vars.keywords: d['keywords']=request.vars.keywords return A(name,_href=url(vars=d),_class=trap_class()) NPAGES = 5 # window is 2*NPAGES if page>NPAGES+1: paginator.append(LI(self_link('<<',0))) if page>NPAGES: paginator.append(LI(self_link('<',page-1))) pages = range(max(0,page-NPAGES),min(page+NPAGES,npages)) for p in pages: if p == page: paginator.append(LI(A(p+1,_onclick='return false'), _class=trap_class('current'))) else: paginator.append(LI(self_link(p+1,p))) if page<npages-NPAGES: paginator.append(LI(self_link('>',page+1))) if page<npages-NPAGES-1: paginator.append(LI(self_link('>>',npages-1))) else: limitby = None try: table_fields = [f for f in fields if f._tablename in tablenames] if groupby: rows = dbset.select(*groupfields,join=join,left=left,groupby=groupby,having=having,orderby=orderby,limitby=limitby,cacheable=True) else: rows = dbset.select(join=join,left=left,orderby=orderby,limitby=limitby,cacheable=True,*table_fields) # rows = dbset.select(left=left,orderby=orderby, # groupby=groupby,limitby=limitby, # cacheable=True,*table_fields) except SyntaxError: rows = None error = T("Query Not Supported") if nrows: message = error or T('%(nrows)s records found') % dict(nrows=nrows) console.append(DIV(message,_class='web2py_counter')) if rows: htmltable = TABLE(THEAD(head)) tbody = TBODY() numrec=0 for row in rows: if numrec % 2 == 0: classtr = 'even' else: classtr = 'odd' numrec+=1 id = row[field_id] #@ReservedAssignment if id: rid = id if callable(rid): ### can this ever be callable? rid = rid(row) tr = TR(_id=rid, _class='%s %s' % (classtr, 'with_id')) else: tr = TR(_class=classtr) if selectable: tr.append(INPUT(_type="checkbox",_name="records",_value=id, value=request.vars.records)) for field in fields: if not str(field) in columns: continue if not field.readable: continue if field.type=='blob': continue value = row[field] maxlength = maxtextlengths.get(str(field),maxtextlength) if field.represent: try: value=field.represent(value,row) except Exception: try: value=field.represent(value,row[field._tablename]) except Exception: pass elif field.type=='boolean': value = INPUT(_type="checkbox",_checked = value, _disabled=True) elif field.type=='upload': if value: if callable(upload): value = A(current.T('file'), _href=upload(value)) elif upload: value = A(current.T('file'), _href='%s/%s' % (upload, value)) else: value = '' if isinstance(value,str): value = truncate_string(value,maxlength) elif not isinstance(value,DIV): value = field.formatter(value) if not include_buttons_column: tr.append(TD(value,_style="padding:10px;")) else: tr.append(TD(value)) row_buttons = TD(_class='row_buttons') if links and links_in_grid: for link in links: if isinstance(link, dict): tr.append(TD(link['body'](row))) else: if link(row): row_buttons.append(link(row)) if include_buttons_column: if details and (not callable(details) or details(row)): row_buttons.append(gridbutton( 'buttonview', 'View', url(args=['view',tablename,id]))) if editable and (not callable(editable) or editable(row)): row_buttons.append(gridbutton( 'buttonedit', 'Edit', url(args=['edit',tablename,id]))) if deletable and (not callable(deletable) or deletable(row)): row_buttons.append(gridbutton( 'buttondelete', 'Delete', callback=url(args=['delete',tablename,id]), delete='tr')) #tr.append(row_buttons) tr.insert(0,row_buttons) tbody.append(tr) htmltable.append(tbody) htmltable = DIV(htmltable,_style='width:100%;overflow-x:auto') if selectable: htmltable = FORM(htmltable,INPUT(_type="submit")) if htmltable.process(formname=formname).accepted:# htmltable.vars.records = htmltable.vars.records or [] htmltable.vars.records = htmltable.vars.records if type(htmltable.vars.records) == list else [htmltable.vars.records] records = [int(r) for r in htmltable.vars.records] selectable(records) redirect(referrer) else: htmltable = DIV(current.T('No records found')) if csv and nrows: export_links =[] for k,v in sorted(exportManager.items()): label = v[1] if hasattr(v, "__getitem__") else k link = url2(vars=dict( order=request.vars.order or '', _export_type=k, keywords=request.vars.keywords or '')) export_links.append(A(T(label),_href=link)) export_menu = \ DIV(T('Export:'),_class="w2p_export_menu",*export_links) else: export_menu = None res = DIV(console,DIV(htmltable,_class="web2py_table"), _class='%s %s' % (_class, ui.get('widget'))) if paginator.components: res.append( DIV(paginator, _class="web2py_paginator %(header)s %(cornerbottom)s"%ui)) if export_menu: res.append(export_menu) res.create_form = create_form res.update_form = update_form res.view_form = view_form res.search_form = search_form return res
def secret_page(): table = TABLE(TR(TD("Back to home: ",A(SPAN("HOME"), _href=URL("index"), _title=T("HOME")))), TR(TD("Change password: "******"Change password"), _href=URL("user/change_password"), _title=T("Change password...")))), TR(TD("Logout: ",A(SPAN("Exit"), _href=URL("user/logout"), _title=T("Logout..."))))) return table
def report_template(): response.subtitle = T("Edit report template") response.view = 'nas/template.html' #response.cmd_menu = None response.cmd_labels = ui.control.get_mobil_button( label=T("Labels"), href="#", cformat=None, style="text-align: left;", icon="edit", ajax="true", theme="d", onclick="document.getElementById('edit_label').style.display = 'block';" + "document.getElementById('edit_label_update').style.display = 'block';" + "document.getElementById('edit_template_update').style.display = 'none';" + "document.getElementById('view_template').style.display = 'none';" + "document.getElementById('edit_template').style.display = 'none';return true;" ) response.cmd_view = ui.control.get_mobil_button( label=T("View XML"), href="#", cformat=None, style="text-align: left;", icon="page", ajax="true", theme="d", onclick="document.getElementById('edit_label').style.display = 'none';" + "document.getElementById('edit_label_update').style.display = 'none';" + "document.getElementById('edit_template_update').style.display = 'none';" + "document.getElementById('view_template').style.display = 'block';" + "document.getElementById('edit_template').style.display = 'none';return true;" ) response.cmd_edit = ui.control.get_mobil_button( label=T("Edit XML"), href="#", cformat=None, style="text-align: left;", icon="edit", ajax="true", theme="d", onclick="document.getElementById('edit_label').style.display = 'none';" + "document.getElementById('edit_label_update').style.display = 'none';" + "document.getElementById('edit_template_update').style.display = 'block';" + "document.getElementById('view_template').style.display = 'none';" + "document.getElementById('edit_template').style.display = 'block';return true;" ) response.cmd_labels_update = ui.control.get_mobil_button( label=T("Save"), href="#", cformat=None, style="text-align: left;", icon="check", ajax="false", theme="a", onclick="document.forms['frm_labels'].submit();") response.frm_report_update = ui.control.get_mobil_button( label=T("Save"), href="#", cformat=None, style="text-align: left;", icon="check", ajax="false", theme="a", onclick="document.forms['frm_report'].submit();") labels, tmp_view, tmp_edit = "", "", "" response.report_name = "" if ns.local.setEngine( database=db.databases(id=request.vars["database"]).alias, check_ndi=False, created=False, createdb=False): if request.post_vars.has_key("update_labels"): for label_id in request.post_vars.keys(): if label_id not in ("update_labels"): row_id = ns.connect.updateData( "ui_message", values={ "id": label_id, "msg": request.post_vars[label_id] }, validate=False, insert_row=False) if not row_id: response.flash = str(ns.error_message) ns.db.commit() if request.post_vars.has_key("report_template"): row_id = ns.connect.updateData( "ui_report", values={ "id": ns.db.ui_report(reportkey=request.vars["reportkey"])["id"], "report": request.post_vars["report_template"] }, validate=False, insert_row=False) if not row_id: response.flash = str(ns.error_message) ns.db.commit() report = ns.db.ui_report(reportkey=request.vars["reportkey"]) if report: response.report_name = report["repname"] tmp_view = CODE(report["report"]) tmp_edit = TEXTAREA( _name="report_template", value=report["report"], _style="height: auto!important;overflow-y: scroll;", _rows=20) response.update_labels = INPUT(_name="update_labels", _type="hidden", _value="yes") ui_message = ns.db( (ns.db.ui_message.secname.like(report["reportkey"] + "%") )).select(orderby=ns.db.ui_message.secname | ns.db.ui_message.fieldname) labels = TABLE(_style="width: 100%;", _cellpadding="0px;", _cellspacing="0px;") ridlen = len(str(report["reportkey"]).split("_")) for message in ui_message: labels.append( TR( TD(DIV(str(message["secname"]).split("_")[ridlen], _class="label"), _style="padding-right:10px;"), TD(DIV(message["fieldname"], _class="label"), _style="padding-right:10px;"), TD(INPUT(_name=message["id"], _type="text", _value=message["msg"], _style="width: 100%;"), _style="width: 100%;"))) else: response.flash = str(ns.error_message) return dict(labels=labels, tmp_view=tmp_view, tmp_edit=tmp_edit)
def select(): import re db = get_database(request) dbname = request.args[0] try: is_imap = db._uri.startswith("imap://") except (KeyError, AttributeError, TypeError): is_imap = False regex = re.compile('(?P<table>\w+)\.(?P<field>\w+)=(?P<value>\d+)') if len(request.args) > 1 and hasattr(db[request.args[1]], '_primarykey'): regex = re.compile('(?P<table>\w+)\.(?P<field>\w+)=(?P<value>.+)') if request.vars.query: match = regex.match(request.vars.query) if match: request.vars.query = '%s.%s.%s==%s' % (request.args[0], match.group('table'), match.group('field'), match.group('value')) else: request.vars.query = session.last_query query = get_query(request) if request.vars.start: start = int(request.vars.start) else: start = 0 nrows = 0 step = 100 fields = [] if is_imap: step = 3 stop = start + step table = None rows = [] orderby = request.vars.orderby if orderby: orderby = dbname + '.' + orderby if orderby == session.last_orderby: if orderby[0] == '~': orderby = orderby[1:] else: orderby = '~' + orderby session.last_orderby = orderby session.last_query = request.vars.query form = FORM(TABLE(TR(T('Query:'), '', INPUT(_style='width:400px', _name='query', _value=request.vars.query or '', requires=IS_NOT_EMPTY( error_message=T("Cannot be empty")))), TR(T('Update:'), INPUT(_name='update_check', _type='checkbox', value=False), INPUT(_style='width:400px', _name='update_fields', _value=request.vars.update_fields or '')), TR(T('Delete:'), INPUT(_name='delete_check', _class='delete', _type='checkbox', value=False), ''), TR('', '', INPUT(_type='submit', _value=T('submit')))), _action=URL(r=request, args=request.args)) tb = None if form.accepts(request.vars, formname=None): regex = re.compile(request.args[0] + '\.(?P<table>\w+)\..+') match = regex.match(form.vars.query.strip()) if match: table = match.group('table') try: nrows = db(query, ignore_common_filters=True).count() if form.vars.update_check and form.vars.update_fields: db(query, ignore_common_filters=True).update( **eval_in_global_env('dict(%s)' % form.vars.update_fields)) response.flash = T('%s %%{row} updated', nrows) elif form.vars.delete_check: db(query, ignore_common_filters=True).delete() response.flash = T('%s %%{row} deleted', nrows) nrows = db(query, ignore_common_filters=True).count() if is_imap: fields = [db[table][name] for name in ("id", "uid", "created", "to", "sender", "subject")] if orderby: rows = db(query, ignore_common_filters=True).select( *fields, limitby=(start, stop), orderby=eval_in_global_env(orderby)) else: rows = db(query, ignore_common_filters=True).select( *fields, limitby=(start, stop)) except Exception, e: import traceback tb = traceback.format_exc() (rows, nrows) = ([], 0) response.flash = DIV(T('Invalid Query'), PRE(str(e)))
def resumen(self, prestamo_id): #### Resumen de cuotas por prestamo. """ El método presenta un resumen detallado de las cuotas que pertenecen a ciertos prestamos/créditos de un cliente. Forma de presentación: |Nº Cuota| Importe| Fecha Límite| Estado| Fecha de Pago| Btn Abonar NOTA: Btn Abonar llama una acción para poder registar el pago de una cuota """ sepadador = HR(_class='bs-docs-separator') # INPUT que contendrá el IDCuota que será enviado a través de ajax. input_ = INPUT(_type='hidden', _id='IDCuota', _name='idcuota') cuotas = self.search('prestamo_id', 'equal', prestamo_id, orderby=self.container.db[self.name_table].id) fields = self.getFields('fecha_limite', 'estado', 'fecha_pago') tr_head = TR(TH('Nº Couta'), TH('Importe')) [tr_head.append(TH(f.label)) for f in fields] table = TABLE(THEAD(tr_head), _class='table table-striped table-condensed') tbody = TBODY() debe = list() pago = list() for cuota in cuotas: tbody.append(TR( TD(cuota.nro), TD("$%.2f" % cuota.valor_cuota), TD(cuota.fecha_limite, _title=cuota.fecha_limite.strftime('%A %Y/%m/%d')), TD(self.get_estado(cuota)), TD(cuota.fecha_pago or '-'), TD(CENTER(SPAN(I(_class='icon-download-alt'), ' Abonar', _onclick='func_abonar(%s)' % cuota.id, _class='btn btn-mini')) ) if cuota.estado[0] != '2' else '', _id='tr_cuota_%s' % cuota.id ) ) # Analizamos que cuotas pagó y cuales adeuda. if cuota.estado[0] != '2': debe.append(cuota.valor_cuota) else: pago.append(cuota.valor_cuota) tbody.append(TR(TH('Total Pagó'), TH('Total Debe'))) tbody.append(TR( TD('+ $', SPAN("%.2f" % sum(pago), _id='ttpago'), INPUT(_name='pago', _type='hidden', _id='input_pago'), _style='color:green'), TD("- $", SPAN("%.2f" % sum(debe), _id='ttdebe'), INPUT(_name='debe', _type='hidden', _id='input_debe'), _style='color:red') ) ) table.append(tbody) url = URL('cuotas', 'abonar_cuota', user_signature=True) javascript = """ function func_abonar(cuotaid){ jQuery('#IDCuota').val(cuotaid); jQuery('#input_pago').val(jQuery('#ttpago').html()); jQuery('#input_debe').val(jQuery('#ttdebe').html()); if(confirm('Desea aceptar el pago?')){ ajax("%s", ['idcuota', 'pago', 'debe'], ':eval'); } else { alert('Canceló el pago!') } } """ % url return TAG[''](sepadador, input_, table, SCRIPT(javascript))
dbs_reports = [] if frm_filter.vars.repname and frm_filter.vars.repname!="": query = query & ((ns.db.ui_report.repname.lower().like("%"+str(request.post_vars.repname).lower()+"%"))| (ns.db.ui_report.description.lower().like("%"+str(request.post_vars.repname).lower()+"%"))) if frm_filter.vars.label and frm_filter.vars.label!="": groups_id=ns.valid.get_groups_id('nervatype', frm_filter.vars.label) if groups_id: query = query & ((ns.db.ui_report.nervatype==groups_id)) else: query = query & ((ns.db.ui_report.transtype==ns.valid.get_groups_id('transtype', frm_filter.vars.label))) reportkey_rows = ns.db(query).select(ns.db.ui_report.reportkey,orderby=ns.db.ui_report.repname) [dbs_reports.append(row.reportkey) for row in reportkey_rows] else: response.flash = str(ns.error_message) htmltable = TABLE(THEAD(TR(TH(),TH(),TH(),TH(T("Name")+"/"+T("Description"))))) tbody = TBODY() numrec=0 for row in nas_reports["reports"]: cmd_edit = INPUT(_value=T("Edit template"), _disabled="", _type="button") def filter_row(): if frm_filter.vars.repname and frm_filter.vars.repname!="": if str(row["repname"].lower()).find(frm_filter.vars.repname.lower())==-1 and str(row["description"].lower()).find(frm_filter.vars.repname.lower())==-1: return False if frm_filter.vars.label and frm_filter.vars.label!="": if str(row["label"]).find(frm_filter.vars.label)==-1: return False if frm_filter.vars.reptype and frm_filter.vars.reptype!="": if str(row["reptype"]).find(frm_filter.vars.reptype)==-1: return False return True
rows.append(TR(TD(FONT(table, _face=face_bold, _color=bgcolor), _colspan=3, _cellpadding=cellpadding, _align="center", _bgcolor=color))) for row in db[table]: rows.append(TR(TD(FONT(row.name, _color=color, _face=face_bold), _align="left", _cellpadding=cellpadding, _border=border), TD(FONT(row.type, _color=color, _face=face), _align="left", _cellpadding=cellpadding, _border=border), TD(FONT(types(row), _color=color, _face=face), _align="center", _cellpadding=cellpadding, _border=border))) return "< %s >" % TABLE(*rows, **dict(_bgcolor=bgcolor, _border=1, _cellborder=0, _cellspacing=0) ).xml() def bg_graph_model(): graph = pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR') subgraphs = dict() for tablename in db.tables: if hasattr(db[tablename],'_meta_graphmodel'): meta_graphmodel = db[tablename]._meta_graphmodel else: meta_graphmodel = dict(group=request.application, color='#ECECEC') group = meta_graphmodel['group'].replace(' ', '') if group not in subgraphs:
def report_template(): response.subtitle = T("Edit report template") response.view='nas/template.html' #response.cmd_menu = None response.cmd_labels = ui.control.get_mobil_button(label=T("Labels"), href="#", cformat=None, style="text-align: left;", icon="edit", ajax="true", theme="d", onclick= "document.getElementById('edit_label').style.display = 'block';" +"document.getElementById('edit_label_update').style.display = 'block';" +"document.getElementById('edit_template_update').style.display = 'none';" +"document.getElementById('view_template').style.display = 'none';" +"document.getElementById('edit_template').style.display = 'none';return true;") response.cmd_view = ui.control.get_mobil_button(label=T("View XML"), href="#", cformat=None, style="text-align: left;", icon="page", ajax="true", theme="d", onclick= "document.getElementById('edit_label').style.display = 'none';" +"document.getElementById('edit_label_update').style.display = 'none';" +"document.getElementById('edit_template_update').style.display = 'none';" +"document.getElementById('view_template').style.display = 'block';" +"document.getElementById('edit_template').style.display = 'none';return true;") response.cmd_edit = ui.control.get_mobil_button(label=T("Edit XML"), href="#", cformat=None, style="text-align: left;", icon="edit", ajax="true", theme="d", onclick= "document.getElementById('edit_label').style.display = 'none';" +"document.getElementById('edit_label_update').style.display = 'none';" +"document.getElementById('edit_template_update').style.display = 'block';" +"document.getElementById('view_template').style.display = 'none';" +"document.getElementById('edit_template').style.display = 'block';return true;") response.cmd_labels_update = ui.control.get_mobil_button(label=T("Save"), href="#", cformat=None, style="text-align: left;", icon="check", ajax="false", theme="a", onclick= "document.forms['frm_labels'].submit();") response.frm_report_update = ui.control.get_mobil_button(label=T("Save"), href="#", cformat=None, style="text-align: left;", icon="check", ajax="false", theme="a", onclick= "document.forms['frm_report'].submit();") labels,tmp_view,tmp_edit="","","" response.report_name="" if ns.local.setEngine(database=db.databases(id=request.vars["database"]).alias, check_ndi=False, created=False, createdb=False): if request.post_vars.has_key("update_labels"): for label_id in request.post_vars.keys(): if label_id not in("update_labels"): row_id = ns.connect.updateData("ui_message", values={"id":label_id,"msg":request.post_vars[label_id]}, validate=False, insert_row=False) if not row_id: response.flash = str(ns.error_message) ns.db.commit() if request.post_vars.has_key("report_template"): row_id = ns.connect.updateData("ui_report", values={"id":ns.db.ui_report(reportkey=request.vars["reportkey"])["id"],"report":request.post_vars["report_template"]}, validate=False, insert_row=False) if not row_id: response.flash = str(ns.error_message) ns.db.commit() report = ns.db.ui_report(reportkey=request.vars["reportkey"]) if report: response.report_name = report["repname"] tmp_view = CODE(report["report"]) tmp_edit = TEXTAREA(_name="report_template", value=report["report"], _style="height: auto!important;overflow-y: scroll;", _rows=20) response.update_labels = INPUT(_name="update_labels", _type="hidden", _value="yes") ui_message = ns.db((ns.db.ui_message.secname.like(report["reportkey"]+"%"))).select(orderby=ns.db.ui_message.secname|ns.db.ui_message.fieldname) labels = TABLE(_style="width: 100%;",_cellpadding="0px;", _cellspacing="0px;") ridlen = len(str(report["reportkey"]).split("_")) for message in ui_message: labels.append(TR( TD(DIV(str(message["secname"]).split("_")[ridlen],_class="label"),_style="padding-right:10px;"), TD(DIV(message["fieldname"],_class="label"),_style="padding-right:10px;"), TD(INPUT(_name=message["id"], _type="text", _value=message["msg"],_style="width: 100%;"),_style="width: 100%;"))) else: response.flash = str(ns.error_message) return dict(labels=labels, tmp_view=tmp_view, tmp_edit=tmp_edit)
def select(): import re db = get_database(request) dbname = request.args[0] try: is_imap = db._uri.startswith("imap://") except (KeyError, AttributeError, TypeError): is_imap = False regex = re.compile(r"(?P<table>\w+)\.(?P<field>\w+)=(?P<value>\d+)") if len(request.args) > 1 and hasattr(db[request.args[1]], "_primarykey"): regex = re.compile(r"(?P<table>\w+)\.(?P<field>\w+)=(?P<value>.+)") if request.vars.query: match = regex.match(request.vars.query) if match: request.vars.query = "%s.%s.%s==%s" % ( request.args[0], match.group("table"), match.group("field"), match.group("value"), ) else: request.vars.query = session.last_query query = get_query(request) if request.vars.start: start = int(request.vars.start) else: start = 0 nrows = 0 step = 100 fields = [] if is_imap: step = 3 stop = start + step table = None rows = [] orderby = request.vars.orderby if orderby: orderby = dbname + "." + orderby if orderby == session.last_orderby: if orderby[0] == "~": orderby = orderby[1:] else: orderby = "~" + orderby session.last_orderby = orderby session.last_query = request.vars.query form = FORM( TABLE( TR( T("Query:"), "", INPUT( _style="width:400px", _name="query", _value=request.vars.query or "", _class="form-control", requires=IS_NOT_EMPTY(error_message=T("Cannot be empty")), ), ), TR( T("Update:"), INPUT(_name="update_check", _type="checkbox", value=False), INPUT( _style="width:400px", _name="update_fields", _value=request.vars.update_fields or "", _class="form-control", ), ), TR( T("Delete:"), INPUT(_name="delete_check", _class="delete", _type="checkbox", value=False), "", ), TR( "", "", INPUT(_type="submit", _value=T("submit"), _class="btn btn-primary"), ), ), _action=URL(r=request, args=request.args), ) tb = None if form.accepts(request.vars, formname=None): regex = re.compile(request.args[0] + r"\.(?P<table>\w+)\..+") match = regex.match(form.vars.query.strip()) if match: table = match.group("table") try: nrows = db(query, ignore_common_filters=True).count() if form.vars.update_check and form.vars.update_fields: db(query, ignore_common_filters=True).update( **eval_in_global_env("dict(%s)" % form.vars.update_fields)) response.flash = T("%s %%{row} updated", nrows) elif form.vars.delete_check: db(query, ignore_common_filters=True).delete() response.flash = T("%s %%{row} deleted", nrows) nrows = db(query, ignore_common_filters=True).count() if is_imap: fields = [ db[table][name] for name in ("id", "uid", "created", "to", "sender", "subject") ] if orderby: rows = db(query, ignore_common_filters=True).select( *fields, limitby=(start, stop), orderby=eval_in_global_env(orderby)) else: rows = db(query, ignore_common_filters=True).select(*fields, limitby=(start, stop)) except Exception as e: import traceback tb = traceback.format_exc() (rows, nrows) = ([], 0) response.flash = DIV(T("Invalid Query"), PRE(str(e))) # begin handle upload csv csv_table = table or request.vars.table if csv_table: formcsv = FORM( str(T("or import from csv file")) + " ", INPUT(_type="file", _name="csvfile"), INPUT(_type="hidden", _value=csv_table, _name="table"), INPUT(_type="submit", _value=T("import"), _class="btn btn-primary"), ) else: formcsv = None if formcsv and formcsv.process().accepted: try: import_csv(db[request.vars.table], request.vars.csvfile.file) response.flash = T("data uploaded") except Exception as e: response.flash = DIV(T("unable to parse csv file"), PRE(str(e))) # end handle upload csv return dict( form=form, table=table, start=start, stop=stop, step=step, nrows=nrows, rows=rows, query=request.vars.query, formcsv=formcsv, tb=tb, )
def select(): import re db = get_database(request) dbname = request.args[0] regex = re.compile('(?P<table>\w+)\.(?P<field>\w+)=(?P<value>\d+)') if len(request.args) > 1 and hasattr(db[request.args[1]], '_primarykey'): regex = re.compile('(?P<table>\w+)\.(?P<field>\w+)=(?P<value>.+)') if request.vars.query: match = regex.match(request.vars.query) if match: request.vars.query = '%s.%s.%s==%s' % ( request.args[0], match.group('table'), match.group('field'), match.group('value')) else: request.vars.query = session.last_query query = get_query(request) if request.vars.start: start = int(request.vars.start) else: start = 0 nrows = 0 stop = start + 100 table = None rows = [] orderby = request.vars.orderby if orderby: orderby = dbname + '.' + orderby if orderby == session.last_orderby: if orderby[0] == '~': orderby = orderby[1:] else: orderby = '~' + orderby session.last_orderby = orderby session.last_query = request.vars.query form = FORM(TABLE( TR( T('Query:'), '', INPUT(_style='width:400px', _name='query', _value=request.vars.query or '', requires=IS_NOT_EMPTY(error_message=T("Cannot be empty")))), TR( T('Update:'), INPUT(_name='update_check', _type='checkbox', value=False), INPUT(_style='width:400px', _name='update_fields', _value=request.vars.update_fields or '')), TR( T('Delete:'), INPUT(_name='delete_check', _class='delete', _type='checkbox', value=False), ''), TR('', '', INPUT(_type='submit', _value='submit'))), _action=URL(r=request, args=request.args)) if request.vars.csvfile != None: try: import_csv(db[request.vars.table], request.vars.csvfile.file) response.flash = T('data uploaded') except Exception, e: response.flash = DIV(T('unable to parse csv file'), PRE(str(e)))
def resumen_deudas(self, cliente_id): # Datos para el comportamiento AJAX cmd = "ajax('%s', ['%s'], '%s');" cmd_cancel = "ajax('%s', ['%s'], ':eval');" target = "detalle_prestamo" cancel = "cancelar_prestamo" ###################################### fields = self.getFields("id", "fecha", "concepto", "monto", "cuotas", "interes", "monto_total") thead = THEAD(TR(*[TH(f.label) for f in fields])) table = TABLE(thead, _class="table table-striped table-bordered") tbody = TBODY() rows = self.deudas(cliente_id) if not rows: return H4("No presenta deudas", _class="alert alert-success") for row in rows: tbody.append( TR( TD(row.id), TD(row.fecha), TD(row.concepto.nombre), TD(row.monto), TD(row.cuotas), TD(row.interes), TD(row.monto_total), TD( CENTER( SPAN( I(_class="icon-zoom-in"), " detalle", _id=row.id, _title="Ver detalle del prestamos", _class="btn btn-mini", _onclick=cmd % (URL(target, vars=dict(pid=row.id), user_signature=True), None, target), ) ) ), TD( CENTER( SPAN( I(_class="icon-remove"), " cancelar", _id="cancel %s" % row.id, _title="Cancelar el prestamo", _class="btn btn-mini", _onclick="cancelar(%s);" % row.id, ) ) ), _id="dresumen_tr_%s" % row.id, ) ) table.append(tbody) # INPUT que contendrá el IDCuota que será enviado a través de ajax. idprestamo = INPUT(_type="hidden", _id="IDPrestamo", _name="idprestamo") url = URL("prestadmin", "cancelar_prestamo", user_signature=True) javascript = ( """ function cancelar(prestamo){ jQuery('#IDPrestamo').val(prestamo); if(confirm('Desea cancelar el Prestamo?')){ ajax('%s', ['idprestamo'], ':eval'); } else { jQuery('#IDPrestamo').val(''); } } """ % url ) return TAG[""](table, idprestamo, SCRIPT(javascript))
def key_table(keys): return TABLE( TR(TD(B(T('Key'))), TD(B(T('Time in Cache (h:m:s)')))), *[TR(TD(k[0]), TD('%02d:%02d:%02d' % k[1])) for k in keys], **dict(_class='cache-keys', _style="border-collapse: separate; border-spacing: .5em;"))
if frm_filter.vars.label and frm_filter.vars.label != "": groups_id = ns.valid.get_groups_id('nervatype', frm_filter.vars.label) if groups_id: query = query & ((ns.db.ui_report.nervatype == groups_id)) else: query = query & ( (ns.db.ui_report.transtype == ns.valid.get_groups_id( 'transtype', frm_filter.vars.label))) reportkey_rows = ns.db(query).select( ns.db.ui_report.reportkey, orderby=ns.db.ui_report.repname) [dbs_reports.append(row.reportkey) for row in reportkey_rows] else: response.flash = str(ns.error_message) htmltable = TABLE( THEAD(TR(TH(), TH(), TH(), TH(T("Name") + "/" + T("Description"))))) tbody = TBODY() numrec = 0 for row in nas_reports["reports"]: cmd_edit = INPUT(_value=T("Edit template"), _disabled="", _type="button") def filter_row(): if frm_filter.vars.repname and frm_filter.vars.repname != "": if str(row["repname"].lower()).find( frm_filter.vars.repname.lower()) == -1 and str( row["description"].lower()).find( frm_filter.vars.repname.lower()) == -1: return False if frm_filter.vars.label and frm_filter.vars.label != "":