def add_qc(): if 'flash' in request.vars: response.flash= request.vars['flash'] form = SQLFORM(db.episode, fields=['name', 'file', 'video_link', 'is_h', 'is_public', 'allow_qcteam']) if form.process().accepted: try: subs = ssa_parser.importSubsFromSSA(request.vars.file.value) except Exception, e: response.flash = "Errors importing the subs (%s)" % e.message db(db.episode.id == form.vars.id).delete() else: try: subsNb=0 for s in subs: if 'Text' in s and len(s['Text'])>0: actor= None if 'Actor' in s: actor= s['Actor'] db.sub.insert(episode=form.vars.id ,start_time= s['Start'] ,end_time= s['End'] ,style= s['Style'] ,text= s['Text'] ,actor= actor) subsNb+=1 db(db.episode.id == form.vars.id).update(subs_nb=subsNb) except Exception, e: response.flash= "Errors inserting the subs in the database (%s)" % e.message else:
def update(): (db, table) = get_table(request) keyed = hasattr(db[table],'_primarykey') record = None if keyed: key = [f for f in request.vars if f in db[table]._primarykey] if key: record = db(db[table][key[0]] == request.vars[key[0]]).select().first() else: record = db(db[table].id == request.args(2)).select().first() if not record: qry = query_by_table_type(table, db) session.flash = T('record does not exist') redirect(URL('select', args=request.args[:1], vars=dict(query=qry))) if keyed: for k in db[table]._primarykey: db[table][k].writable=False form = SQLFORM(db[table], record, deletable=True, delete_label=T('Check to delete'), ignore_rw=ignore_rw and not keyed, linkto=URL('select', args=request.args[:1]), upload=URL(r=request, f='download', args=request.args[:1])) if form.accepts(request.vars, session): session.flash = T('done!') qry = query_by_table_type(table, db) redirect(URL('select', args=request.args[:1], vars=dict(query=qry))) return dict(form=form,table=db[table])
def edit(): table, row = validate(request.args(0), request.args(1)) #row = db.patient(request.args(0)) or redirect(URL('index')) # specify custom labels labels ={'lname':'Last Name', 'mrn': 'MRN'} form = SQLFORM(db.patient, record = row, fields=['mrn','lname', 'ethnicity', 'date_of_birth'], labels = labels, #formstyle="divs", showid=False, submit_button='Save') if form.accepts(request.vars, session): session.flash = '%s %s successfully updated.' % (singular(table), row['id']) redirect(URL('list_patient', args=table)) elif form.errors: response.flash = 'Error. Please correct the issues marked in red below.' return dict(table=table, row=row, form=form)
def zznew(): ''' patient registration form creation - ??use custom sql form?? ''' print '>>> process ptreg form <<<' #form = SQLFORM(db.patient) labels ={'lname':'Last Name', 'mrn': 'MRN'} form = SQLFORM(db.patient, 0, fields=['mrn','lname', 'ethnicity', 'date_of_birth'], labels = labels, #formstyle="divs", showid=False, submit_button='Add New') #if form.process(session=None, formname='patient_reg').accepted: if form.process(session=None, formname=None).accepted: response.flash = 'form accepted' # redirect after entry redirect(URL('status')) elif form.errors: response.flash = ' form has errors' else: response.flash = 'please enter form data' return dict(form = form)
def update(): (db, table) = get_table(request) keyed = hasattr(db[table], '_primarykey') record = None if keyed: key = [f for f in request.vars if f in db[table]._primarykey] if key: record = db( db[table][key[0]] == request.vars[key[0]]).select().first() else: record = db(db[table].id == request.args(2)).select().first() if not record: qry = query_by_table_type(table, db) session.flash = T('record does not exist') redirect(URL('select', args=request.args[:1], vars=dict(query=qry))) if keyed: for k in db[table]._primarykey: db[table][k].writable = False form = SQLFORM(db[table], record, deletable=True, delete_label=T('Check to delete'), ignore_rw=ignore_rw and not keyed, linkto=URL('select', args=request.args[:1]), upload=URL(r=request, f='download', args=request.args[:1])) if form.accepts(request.vars, session): session.flash = T('done!') qry = query_by_table_type(table, db) redirect(URL('select', args=request.args[:1], vars=dict(query=qry))) return dict(form=form, table=db[table])
def test_represent_SQLFORM(self): self.db.t0.tt.represent = lambda value: value.capitalize() self.db.t0.tt.writable = False self.db.t0.tt.readable = True form = SQLFORM(self.db.t0) self.assertTrue(b'Web2py' in form.xml()) self.db.t0.tt.represent = lambda value, row: value.capitalize() form = SQLFORM(self.db.t0) self.assertTrue(b'Web2py' in form.xml())
def contact(): from models.contact import Contact db = application.db(models=[Contact]) form = SQLFORM(db.Contact, _action=URL('experiments', 'default', 'contact')) if form.process(session=application.session).accepted: redirect(URL()) return {'form': form}
def update_project(): response.view = 'company/details_project.html' projectid = request.args(1, cast = int) form = SQLFORM(db.co_project, projectid, showid = False) if form.process().accepted: response.flash = 'Project updated' elif form.errors: response.flash = 'Errors occurs!' return locals()
def create_project(): response.view = 'company/details_project.html' form = SQLFORM(db.co_project) if form.process().accepted: session.flash = 'Project created' redirect(URL('list_project')) elif form.errors: response.flash = 'Errors occurs!' return locals()
def questions(): """ At this stage, the user the following workflow will be implemented: - User adds questions via the drop down or clicks "Add Question" to add a new one. """ table = db["survey_questions"] record = request.args(0) template = db( db.survey_template.id == session.rcvars.survey_template).select( limitby=(0, 1)).first() if not template: session.error = T("No template found!") redirect(URL(r=request, f="template")) if not record: questions_query = (db.survey_template_link.survey_questions_id == db.survey_questions.id) & ( template.id == db.survey_template_link.survey_template_id) record = db(questions_query).select(db.survey_questions.id, limitby=(0, 1)).first() if record: redirect(URL(r=request, f="questions", args=[record.id])) questions_form = SQLFORM(table, record, deletable=True, keepvalues=True) all_questions = db().select(db.survey_question.ALL) output = dict(all_questions=all_questions) # Let's avoid blowing up -- this loads questions try: query = (template.id == db.survey_template_link.survey_template_id) contained_questions = db(query).select(db.survey_question.id) if len(contained_questions) > 0: output.update(contained_questions=contained_questions) else: output.update(contained_questions=contained_questions) except: output.update(contained_questions=[]) pass # this means we didn't pass an id, e.g., making a new section! if questions_form.accepts(request.vars, session, keepvalues=True): questions = request.post_vars.questions if questions: for question in questions: if not has_dupe_questions(template.id, question): db.survey_template_link.insert( survey_template_id=session.rcvars.survey_template, survey_questions_id=questions_form.vars.id, survey_question_id=question) elif questions_form.errors: response.error = T("Please correct all errors.") output.update(form=questions_form) return output
def view_task(): taskid = request.args(1, cast = int) projectid = db(db.co_task.id == taskid).select(db.co_task.project).first().project task = SQLFORM(db.co_task, taskid, showid = False, readonly = True) posts = db(db.co_taskpost.task == taskid).select(orderby = db.co_taskpost.created_on) db.co_taskpost.task.default = taskid post = SQLFORM(db.co_taskpost) if post.process().accepted: session.flash = 'Post added' redirect(URL('view_task', args = ('view', taskid))) elif post.errors: response.flash = 'Errors occurs!' return locals()
def update_task(): response.view = 'company/details_task.html' taskid = request.args(1, cast = int) projectid = db(db.co_task.id == taskid).select(db.co_task.project).first().project projectname = db.co_project(projectid).name form = SQLFORM(db.co_task, taskid, showid = False) if form.process().accepted: response.flash = 'Task updated' elif form.errors: response.flash = 'Errors occurs!' return locals()
def do_form_update(self, record_id): response = current.response T = current.T table = self.table action = 'update' self.nav = self.navegate(action) record = None if isinstance(record_id, str): record_id = int(record_id) record = table[ record_id ] if not record: raise HTTP(404, 'Record ID invalid!') if isinstance(table._format,str): record_label = table._format % record else: record_label = table._format(record) response.title = T(table._plural) response.subtitle = T('Editing')+': '+record_label response.breadcrumbs = record_label buttons = self.get_form_buttons(action, record_id) attr = dict( onsuccess=self.customize.on_form_success) hidden = self.get_hidden_fields(action, record.id) if hidden.get('_next'): attr['next'] = hidden['_next'] self.customize.on_before_init(self, action) form = SQLFORM( table, record=record, buttons=buttons, deletable=False, formstyle=formstyle_onx, fields=self.customize.on_fields_list(self, action), hidden=hidden ) if self.save_and_add_enabled: form[0].append(self.js_submit_and_add()) self.customize.on_after_init(self, form, action) if form.process(**attr).accepted: response.flash = T('Record Updated') elif form.errors: response.flash = form.errors return dict(content=form)
def checkForm(self, table): formnamemodal = "formmodal_%s" % self.key form = SQLFORM(table, formname=formnamemodal, _class="form-horizontal", formstyle='bootstrap-modal', fields=self.fields, kwargs=self.kwargs) if self.script: form.append(SCRIPT(self.script)) if form.process().accepted: command = "jQuery('#%s').modal('hide');" % (self.modal_id) command += self.cmd self.response.flash = self.flash self.response.js = command elif form.errors: self.response.flash = self.errormsg return form
def create_task(): response.view = 'company/details_task.html' projectid = request.args(1, cast = int) projectname = db.co_project(projectid).name db.co_task.project.default = projectid form = SQLFORM(db.co_task) if form.process().accepted: session.flash = 'Task created' redirect(URL('list_task', args = (projectid))) elif form.errors: response.flash = 'Errors occurs!' return locals()
def create_employee(): response.view = 'company/details_employee.html' form = SQLFORM(db.co_employee) if form.process().accepted: newuserid = db.auth_user.insert(first_name = form.vars.firstname, last_name = form.vars.lastname, email = form.vars.email, password = db.auth_user.password.validate('Pa$$w0rd')[0]) employee = db(db.co_employee.id == form.vars.id).select().first() employee.update_record(authuser = newuserid) session.flash = 'Employee created' redirect(URL('list_employee')) elif form.errors: response.flash = 'Errors occurs!' return locals()
def index(): """ example action using the internationalization operator T and flash rendered by views/default/index.html or views/generic.html """ form = SQLFORM(db.notes, fields=['content'], _name='myform', showid=True, labels = {'content': 'Your notes'}, hidden=dict(lat="", lng="")) if form.accepts(request.vars, session): response.flash = 'form accepted' elif form.errors: response.flash = 'form has errors' else: response.flash = 'please fill out the form' response.flash = T('Welcome to web2py') return dict(form=form, message=T('Hello World'))
def update_vacation(): response.view = 'company/details_vacation.html' vacationid = request.args(1, cast = int) db.co_vacation.status.writable = False db.co_vacation.employee.readable = False db.co_vacation.employee.writable = False form = SQLFORM(db.co_vacation, vacationid, showid = False) if form.process().accepted: response.flash = 'Employee updated' elif form.errors: response.flash = 'Errors occurs!' return locals()
def get_form(self, query,field_id,orderby,fields=None,headers={},frm_type="view",priority="0,1",create=True): gform = SQLFORM.grid(query=query, field_id=field_id, fields=fields, headers=headers, orderby=orderby, paginate=20, maxtextlength=25, searchable=False, csv=False, details=False, showbuttontext=False, create=create, deletable=False, editable=True, selectable=False, ignore_common_filters=False) if type(gform[1][0][0]).__name__!="TABLE": if frm_type in ("edit","new"): gform = self.set_input_form(gform) if frm_type == "edit": gform[1][0][0] = "" else: htable = gform.elements("div.web2py_htmltable") if len(htable)>0: self.set_htmltable_style(htable[0][0],"form_search",priority) htable[0][0]["_width"]="100%" counter = gform.elements("div.web2py_counter") if len(counter)>0: if counter[0][0]==None: counter[0][0] = "" if gform[len(gform)-1]["_class"].startswith("web2py_paginator"): pages = gform[len(gform)-1].elements("a") for i in range(len(pages)): pages[i]["_data-ajax"] = "false" return gform
def create_vacation(): response.view = 'company/details_vacation.html' db.co_vacation.employee.default = db(db.co_employee.authuser == auth.user.id).select().first().id db.co_vacation.status.writable = False db.co_vacation.employee.readable = False db.co_vacation.employee.writable = False form = SQLFORM(db.co_vacation) if form.process().accepted: session.flash = 'Vacation application created' redirect(URL('list_vacation')) elif form.errors: response.flash = 'Errors occurs!' return locals()
def grid(self): def get_unique(form): slug = IS_SLUG()(form.vars.f_title)[0] form.vars.f_slug_key = slug fields = [self.db.t_page.f_title, self.db.t_page.f_lang_code, self.db.t_page.f_tags, self.db.t_page.f_is_active] links = [ lambda row: A('Preview', _target='_blank', _class="btn-success btn-mini", _href=URL('page', 'show', args=[str(row.id)]))] grid = SQLFORM.grid(self.db.t_page, ui='web2py', fields=fields, #orderby=fields[-2], links=links, csv=False, searchable=True, create=True, details=True, editable=True, deletable=True, onvalidation=get_unique, #oncreate=get_unique, ) return grid
def change_password(): id = request.args(0) form = SQLFORM.factory( Field('password', 'password', requires=db.auth_user['password'].requires), Field('password_again', 'password', requires=IS_EQUAL_TO( request.vars.password, error_message=T('Passwords do not match.')))) if form.accepts(request.vars, session): dbutils.log_event(db, user_id=auth.user.id, item_id=id, table_name='auth_user', access='change password', details='') db.auth_user[id] = dict(password=form.vars.password) session.flash = T('Password successfully changed.') redirect(URL('read', args=id)) return dict(form=form)
def membership(): if "new" in request.args: form = SQLFORM(db.auth_membership) else: form = SQLFORM(db.auth_membership, db.auth_membership(request.args(1))) if "view" in request.args: form.custom.widget.user_id["_disabled"] = "disabled" form.custom.widget.group_id["_disabled"] = "disabled" if form.process().accepted: session.flash = "Group updated!" redirect(URL("memberships")) elif form.errors: response.flash = "Errors occurs!" return locals()
def test_factory(self): factory_form = SQLFORM.factory( Field('field_one', 'string', IS_NOT_EMPTY()), Field('field_two', 'string')) self.assertEqual( factory_form.xml(), b'<form action="#" enctype="multipart/form-data" method="post"><table><tr id="no_table_field_one__row"><td class="w2p_fl"><label class="" for="no_table_field_one" id="no_table_field_one__label">Field One: </label></td><td class="w2p_fw"><input class="string" id="no_table_field_one" name="field_one" type="text" value="" /></td><td class="w2p_fc"></td></tr><tr id="no_table_field_two__row"><td class="w2p_fl"><label class="" for="no_table_field_two" id="no_table_field_two__label">Field Two: </label></td><td class="w2p_fw"><input class="string" id="no_table_field_two" name="field_two" type="text" value="" /></td><td class="w2p_fc"></td></tr><tr id="submit_record__row"><td class="w2p_fl"></td><td class="w2p_fw"><input type="submit" value="Submit" /></td><td class="w2p_fc"></td></tr></table></form>' )
def update_employee(): response.view = 'company/details_employee.html' employeeid = request.args(1, cast = int) form = SQLFORM(db.co_employee, employeeid, showid = False) if form.process().accepted: authuser = db(db.co_employee.id == employeeid).select().first() if authuser.authuser: user = db(db.auth_user.id == authuser.authuser).select().first() user.update_record(first_name = form.vars.firstname, last_name = form.vars.lastname, email = form.vars.email) session.flash = 'Employee updated' redirect(URL('list_employee')) elif form.errors: response.flash = 'Errors occurs!' return locals()
def questions(): """ At this stage, the user the following workflow will be implemented: - User adds questions via the drop down or clicks "Add Question" to add a new one. """ table = db["survey_questions"] record = request.args(0) template = db(db.survey_template.id == session.rcvars.survey_template).select(limitby=(0, 1)).first() if not template: session.error = T("No template found!") redirect(URL(r=request, f="template")) if not record: questions_query = (db.survey_template_link.survey_questions_id == db.survey_questions.id) & (template.id == db.survey_template_link.survey_template_id) record = db(questions_query).select(db.survey_questions.id, limitby=(0, 1)).first() if record: redirect(URL(r=request, f="questions", args=[record.id])) questions_form = SQLFORM(table, record, deletable=True, keepvalues=True) all_questions = db().select(db.survey_question.ALL) output = dict(all_questions=all_questions) # Let's avoid blowing up -- this loads questions try: query = (template.id == db.survey_template_link.survey_template_id) contained_questions = db(query).select(db.survey_question.id) if len(contained_questions) > 0: output.update(contained_questions=contained_questions) else: output.update(contained_questions=contained_questions) except: output.update(contained_questions=[]) pass # this means we didn't pass an id, e.g., making a new section! if questions_form.accepts(request.vars, session, keepvalues=True): questions = request.post_vars.questions if questions: for question in questions: if not has_dupe_questions(template.id, question): db.survey_template_link.insert(survey_template_id=session.rcvars.survey_template, survey_questions_id=questions_form.vars.id, survey_question_id=question) elif questions_form.errors: response.error = T("Please correct all errors.") output.update(form=questions_form) return output
def confirm_vacation(): db.co_vacation.id.readable = False subordinates = db(db.co_employee.superior == db(db.co_employee.authuser == auth.user.id).select(db.co_employee.id).first().id).select() vacations = SQLFORM.grid(db.co_vacation.employee.belongs(subordinates) & (db.co_vacation.status == 'Awaiting'), orderby = ~db.co_vacation.startdate, create = False, details = False, editable = False, deletable = False, links = [lambda row: A(T('Accept'), _href = URL('accept_vacation', args = row.id), _class = 'btn'), lambda row: A(T('Reject'), _href = URL('reject_vacation', args = row.id), _class = 'btn')]) return locals()
def myform(): form = SQLFORM.factory(Field("first_name", "string"), Field("last_name", "string")) def onvalidation(form): pass if form.process(session=application.session, onvaliidation=onvalidation).accepted: redirect(URL()) return dict(form=form)
def grid(self): grid = SQLFORM.grid(self.db.t_post, formstyle='table2cols', csv=False, searchable=False, create=True, details=True, editable=True, deletable=True, ) return grid
def checkForm(self, table): formnamemodal = "formmodal_%s" % self.key form = SQLFORM(table, formname=formnamemodal) if form.accepts(self.request.vars, self.session, formname=formnamemodal): options = TAG[''](*[OPTION(v, _value=k, _selected=str(form.vars.id) == str(k)) for (k, v) in self.field.requires.options()]) _cmd = "jQuery('#%s').html('%s');" _cmd += "jQuery('#%s').modal('hide')" command = _cmd % (self.key, options.xml().replace("'", "\'"), self.modal_id ) self.response.flash = 'Se creó el registro' self.response.js = command elif form.errors: self.response.flash = "Controle el formulario" return form
def create(): msg_id = request.args(0) contact = get_contact(auth.user) db.msg_attachment.msg_id.default = msg_id db.msg_attachment.attach_by.default = contact.id form = SQLFORM(db.msg_attachment) if form.accepts(request.vars, session, dbio=False): filename = request.vars.attachment.filename form.vars.filename = filename form.vars.attachment_type = filename[filename.rindex('.') + 1:] msg_attachment_id = db.msg_attachment.insert( **db.msg_attachment._filter_fields(form.vars)) subject = db.msg[msg_id].subject dbutils.log_event(db, user_id=auth.user.id, item_id=msg_attachment_id, table_name='msg_attachment', access='create', details=','.join([subject,filename,msg_id])) session.flash = 'File successfully attached.' redirect(URL('messages','read', args=msg_id)) return dict(form = form)
def users(): if "new" in request.args: redirect(URL("user", args=("new"))) elif "edit" in request.args: redirect(URL("user", args=("edit", request.args(2)))) elif "view" in request.args: redirect(URL("user", args=("view", request.args(2)))) else: db.auth_user.id.readable = False grid = SQLFORM.grid(db.auth_user, orderby=db.auth_user.last_name, maxtextlength=50) return locals()
def memberships(): if "new" in request.args: redirect(URL("membership", args=("new"))) elif "edit" in request.args: redirect(URL("membership", args=("edit", request.args(2)))) elif "view" in request.args: redirect(URL("membership", args=("view", request.args(2)))) else: db.auth_membership.id.readable = False grid = SQLFORM.grid(db.auth_membership, maxtextlength=50) return locals()
def file_upload(): form = SQLFORM.factory(Field('file', 'upload', uploadfolder=application.config.upload_folder, requires=IS_IMAGE(extensions=('jpg', 'jpeg'))), _action=URL()) if form.process().accepted: redirect(URL()) return {'form': form}
def myform(): form = SQLFORM.factory(Field('first_name', 'string'), Field('last_name', 'string')) def onvalidation(form): pass if form.process(session=application.session, onvaliidation=onvalidation).accepted: redirect(URL()) return dict(form=form)
def groups(): if "new" in request.args: redirect(URL("group", args=("new"))) elif "edit" in request.args: redirect(URL("group", args=("edit", request.args(2)))) elif "view" in request.args: redirect(URL("group", args=("view", request.args(2)))) else: db.auth_group.id.readable = False grid = SQLFORM.grid(db.auth_group, orderby=db.auth_group.role, maxtextlength=50) return locals()
def grid(self): grid = SQLFORM.grid( self.db.t_post, formstyle='table2cols', csv=False, searchable=False, create=True, details=True, editable=True, deletable=True, ) return grid
def content(self): formnamemodal = "form_%s" % self.modal_key table = self.field._db[self.field.type[10:]] _cmd, params = None, {} form = SQLFORM(table, formname=formnamemodal) if form.accepts(current.request.vars, current.session, formname=formnamemodal): if self.autocomplete in ('option', 'OPTION', OPTION): options = TAG[''](*[OPTION(v, _value=k, _selected=str(form.vars.id) == str(k)) for (k, v) in self.field.requires.options()]) _cmd += "$('#%(modal_key)s').html('%(options)s');" params = {'modal_key': self.modal_key, 'options': options.xml().replace("'", "\'")} elif isinstance(self.autocomplete, Field): fieldtarget = str(table[self.autocomplete.name]).replace('.', '_') _cmd += "$('#%(modal_key)s').val('%(autocomplete)s');" _cmd += "$('#_autocomplete_%(ftarget)s_auto').val(%(id)s);" params = {'modal_key': self.modal_key, 'autocomplete': form.vars[self.autocomplete.name], 'id': form.vars.id, 'ftarget': fieldtarget} current.response.flash = "Se creó el registro" current.response.js = self.js(form, _cmd, **params) elif form.errors: current.response.flash = "Controle el formulario" return form
def edit(): form = SQLFORM.factory( Field('first_name', 'string', requires=IS_NOT_EMPTY(error_message='Please enter first name')), Field('last_name', 'string', requires=IS_NOT_EMPTY(error_message='Please enter last name')), _action=URL('experiments', 'default', 'edit')) if form.process(session=application.session).accepted: redirect(URL()) return {'form': form}
def test_factory_applies_default_validators(self): from gluon import current factory_form = SQLFORM.factory(Field('a_date', type='date'), ) # Fake user input current.request.post_vars.update({ '_formname': 'no_table/create', 'a_date': '2018-09-14', '_formkey': '123', }) # Fake the formkey current.session['_formkey[no_table/create]'] = ['123'] self.assertTrue(factory_form.process().accepted) self.assertIsInstance(factory_form.vars.a_date, datetime.date)
def create_form(self): """ Build form for subscription settings """ T = current.T db = current.db response = current.response user = current.auth.user.pe_id stable = current.s3db.pr_subscription formstyle = current.deployment_settings.get_ui_formstyle() query = (stable.pe_id == user) & \ (stable.deleted != True) row = db(query).select(stable.id, stable.frequency, stable.email_format, limitby=(0, 1)) messages = Storage( ERROR=T("Error: could not update subscription settings"), SUCCESS=T("Settings updated"), ) if row: # Subscription exists, build form freq_field = stable.frequency format_field = stable.email_format freq_field.default = row[0].frequency format_field.default = row[0].email_format form = SQLFORM.factory(freq_field, format_field, formstyle=formstyle) if form.accepts(current.request.post_vars, current.session, keepvalues=True): formvars = form.vars from templates.SSF.config import TaskSubscriptions sub = TaskSubscriptions() sub.subscription["frequency"] = formvars.frequency sub.subscription["email_format"] = formvars.email_format if sub.update_subscription(): response.confirmation = messages.SUCCESS else: response.error = messages.ERROR return form else: return None
def create(): groups = db(db.auth_group.role != 'Admin').select( db.auth_group.id, db.auth_group.role, orderby=db.auth_group.role).json() form = SQLFORM.factory(db.auth_user, db.contact, Field('password_again', 'password', requires=IS_EQUAL_TO( request.vars.password, error_message='Passwords do not match.')), Field('is_active', 'boolean'), Field('groups', label='Search groups'), submit_button='Create User', hidden=dict(groups_new=None), table_name='user') form.element(_name='groups')['_onkeyup'] = "showgroups()" form.element(_name='groups')['_autocomplete'] = 'off' form.element( _name='contact_info')['_placeholder'] = 'insert contact details here' form.vars.is_active = 'on' if form.accepts(request.vars, session): if form.vars.is_active: form.vars.registration_key = '' else: form.vars.registration_key = 'blocked' id = db.auth_user.insert(**db.auth_user._filter_fields(form.vars)) form.vars.user_id = id db.contact.insert(**db.contact._filter_fields(form.vars)) if request.vars.groups_new: insert_groups(request.vars.groups_new.split(',')[:-1], id) dbutils.log_event(db, user_id=auth.user.id, item_id=id, table_name='auth_user', access='create') session.flash = T('User successfully added.') redirect(URL('index')) return dict(form=form, json=SCRIPT('var groups=%s' % groups))
def get_form(self, query, field_id, orderby, fields=None, headers={}, frm_type="view", priority="0,1", create=True): gform = SQLFORM.grid(query=query, field_id=field_id, fields=fields, headers=headers, orderby=orderby, paginate=20, maxtextlength=25, searchable=False, csv=False, details=False, showbuttontext=False, create=create, deletable=False, editable=True, selectable=False, ignore_common_filters=False) if type(gform[1][0][0]).__name__ != "TABLE": if frm_type in ("edit", "new"): gform = self.set_input_form(gform) if frm_type == "edit": gform[1][0][0] = "" else: htable = gform.elements("div.web2py_htmltable") if len(htable) > 0: self.set_htmltable_style(htable[0][0], "form_search", priority) htable[0][0]["_width"] = "100%" counter = gform.elements("div.web2py_counter") if len(counter) > 0: if counter[0][0] == None: counter[0][0] = "" if gform[len(gform) - 1]["_class"].startswith("web2py_paginator"): pages = gform[len(gform) - 1].elements("a") for i in range(len(pages)): pages[i]["_data-ajax"] = "false" return gform
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 __call__(self): output = {} T = current.T request = current.request response = current.response s3 = response.s3 # Check logged in and permissions auth = current.auth settings = current.deployment_settings roles = current.session.s3.roles system_roles = auth.get_system_roles() AUTHENTICATED = system_roles.AUTHENTICATED # Login/Registration forms self_registration = current.deployment_settings.get_security_self_registration( ) registered = False login_form = None login_div = None register_form = None register_div = None # Contact Form request_email = settings.get_frontpage("request_email") if request_email: from gluon.dal import Field from gluon.validators import IS_NOT_EMPTY from gluon.sqlhtml import SQLFORM fields = [ Field( "name", label="Your name", requires=IS_NOT_EMPTY(), ), Field( "address", label="Your e-mail address", requires=IS_NOT_EMPTY(), ), Field( "subject", label="Subject", requires=IS_NOT_EMPTY(), ), Field( "message", "text", label="Message", requires=IS_NOT_EMPTY(), ), ] from s3 import s3_mark_required labels, required = s3_mark_required(fields) s3.has_required = required response.form_label_separator = "" contact_form = SQLFORM.factory( formstyle=settings.get_ui_formstyle(), submit_button=T("Submit"), labels=labels, separator="", table_name="contact", # Dummy table name _id="mailform", *fields) if contact_form.accepts(request.post_vars, current.session, formname="contact_form", keepvalues=False, hideerror=False): # Processs Contact Form form_vars = contact_form.vars sender = "%s <%s>" % (form_vars.name, form_vars.address) result = current.msg.send_email( to=request_email, sender=sender, subject=form_vars.subject, message=form_vars.message, reply_to=form_vars.address, ) if result: response.confirmation = "Thank you for your message - we'll be in touch shortly" if s3.cdn: if s3.debug: s3.scripts.append( "http://ajax.aspnetcdn.com/ajax/jquery.validate/1.9/jquery.validate.js" ) else: s3.scripts.append( "http://ajax.aspnetcdn.com/ajax/jquery.validate/1.9/jquery.validate.min.js" ) else: if s3.debug: s3.scripts.append("/%s/static/scripts/jquery.validate.js" % request.application) else: s3.scripts.append( "/%s/static/scripts/jquery.validate.min.js" % request.application) validation_script = ''' $('#mailform').validate({ errorClass:'req', rules:{ name:{ required:true }, address: { required:true, email:true }, subject:{ required:true }, message:{ required:true } }, messages:{ name:"Enter your name", subject:"Enter a subject", message:"Enter a message", address:{ required:"Please enter a valid email address", email:"Please enter a valid email address" } }, errorPlacement:function(error,element){ error.appendTo(element.parents('div.controls')) }, submitHandler:function(form){ form.submit() } })''' s3.jquery_ready.append(validation_script) else: contact_form = "" if AUTHENTICATED not in roles: login_buttons = DIV(A(T("Login"), _id="show-login", _class="tiny secondary button"), _id="login-buttons") script = ''' $('#show-mailform').click(function(e){ e.preventDefault() $('#intro').slideDown(400, function() { $('#login_box').hide() }); }) $('#show-login').click(function(e){ e.preventDefault() $('#login_form').show() $('#register_form').hide() $('#login_box').show() $('#intro').slideUp() })''' s3.jquery_ready.append(script) # This user isn't yet logged-in if request.cookies.has_key("registered"): # This browser has logged-in before registered = True if self_registration is True: # Provide a Registration box on front page login_buttons.append( A(T("Register"), _id="show-register", _class="tiny secondary button", _style="margin-left:5px")) script = ''' $('#show-register').click(function(e){ e.preventDefault() $('#login_form').hide() $('#register_form').show() $('#login_box').show() $('#intro').slideUp() })''' s3.jquery_ready.append(script) register_form = auth.register() register_div = DIV(H3(T("Register")), P(XML(T("If you would like to help, then please %(sign_up_now)s") % \ dict(sign_up_now=B(T("sign-up now")))))) register_script = ''' $('#register-btn').click(function(e){ e.preventDefault() $('#register_form').show() $('#login_form').hide() }) $('#login-btn').click(function(e){ e.preventDefault() $('#register_form').hide() $('#login_form').show() })''' s3.jquery_ready.append(register_script) # Provide a login box on front page auth.messages.submit_button = T("Login") login_form = auth.login(inline=True) login_div = DIV(H3(T("Login")), P(XML(T("Registered users can %(login)s to access the system") % \ dict(login=B(T("login")))))) else: login_buttons = "" output["login_buttons"] = login_buttons output["self_registration"] = self_registration output["registered"] = registered output["login_div"] = login_div output["login_form"] = login_form output["register_div"] = register_div output["register_form"] = register_form output["contact_form"] = contact_form # Slick slider if s3.debug: s3.scripts.append("/%s/static/scripts/slick.js" % request.application) else: s3.scripts.append("/%s/static/scripts/slick.min.js" % request.application) script = ''' $(document).ready(function(){ $('#title-image').slick({ autoplay:true, autoplaySpeed:5000, speed:1000, fade:true, cssEase:'linear' }); });''' s3.jquery_ready.append(script) self._view(TEMPLATE, "index.html") return output
def __call__(self): output = {} T = current.T request = current.request response = current.response s3 = response.s3 # Check logged in and permissions auth = current.auth settings = current.deployment_settings roles = current.session.s3.roles system_roles = auth.get_system_roles() AUTHENTICATED = system_roles.AUTHENTICATED # Login/Registration forms self_registration = settings.get_security_registration_visible() registered = False login_form = None login_div = None register_form = None register_div = None # Project Links project_links = DIV(_class="title-links hide-for-small") project_description = settings.get_frontpage("project_description") if project_description: project_links.append( A( ICON("link"), T("Project Description"), _class="action-lnk", _href=project_description, _target="_blank", )) project_links.append( A( ICON("link"), T("User Manual"), _class="action-lnk", _href=URL( c="default", f="index", args=["docs"], vars={"name": "UserManual"}, ), _target="_blank", )) mailing_list = settings.get_frontpage("mailing_list") if mailing_list: project_links.append( A( ICON("link"), T("Mailing List"), _class="action-lnk", _href=mailing_list, _target="_blank", )) # Contact Form request_email = settings.get_frontpage("request_email") if request_email: from s3dal import Field from gluon.validators import IS_NOT_EMPTY from gluon.sqlhtml import SQLFORM fields = [ Field( "name", label="Your name", requires=IS_NOT_EMPTY(), ), Field( "address", label="Your e-mail address", requires=IS_NOT_EMPTY(), ), Field( "subject", label="Subject", requires=IS_NOT_EMPTY(), ), Field( "message", "text", label="Message", requires=IS_NOT_EMPTY(), ), ] from s3 import s3_mark_required labels, required = s3_mark_required(fields) s3.has_required = required response.form_label_separator = "" contact_form = SQLFORM.factory( formstyle=settings.get_ui_formstyle(), submit_button=T("Submit"), labels=labels, separator="", table_name="contact", # Dummy table name _id="mailform", *fields) if contact_form.accepts(request.post_vars, current.session, formname="contact_form", keepvalues=False, hideerror=False): # Processs Contact Form form_vars = contact_form.vars sender = "%s <%s>" % (form_vars.name, form_vars.address) result = current.msg.send_email( to=request_email, sender=sender, subject=form_vars.subject, message=form_vars.message, reply_to=form_vars.address, ) if result: response.confirmation = "Thank you for your message - we'll be in touch shortly" if s3.cdn: if s3.debug: s3.scripts.append( "http://ajax.aspnetcdn.com/ajax/jquery.validate/1.9/jquery.validate.js" ) else: s3.scripts.append( "http://ajax.aspnetcdn.com/ajax/jquery.validate/1.9/jquery.validate.min.js" ) else: if s3.debug: s3.scripts.append("/%s/static/scripts/jquery.validate.js" % request.application) else: s3.scripts.append( "/%s/static/scripts/jquery.validate.min.js" % request.application) validation_script = ''' $('#mailform').validate({ errorClass:'req', rules:{ name:{ required:true }, address: { required:true, email:true }, subject:{ required:true }, message:{ required:true } }, messages:{ name:"Enter your name", subject:"Enter a subject", message:"Enter a message", address:{ required:"Please enter a valid email address", email:"Please enter a valid email address" } }, errorPlacement:function(error,element){ error.appendTo(element.parents('div.controls')) }, submitHandler:function(form){ form.submit() } })''' s3.jquery_ready.append(validation_script) else: contact_form = "" if AUTHENTICATED not in roles: login_buttons = DIV(A(T("Login"), _id="show-login", _class="tiny secondary button"), _id="login-buttons") script = ''' $('#show-mailform').click(function(e){ e.preventDefault() $('#login_box').fadeOut(function(){$('#intro').fadeIn()}) }) $('#show-login').click(function(e){ e.preventDefault() $('#login_form').show() $('#register_form').hide() $('#intro').fadeOut(function(){$('#login_box').fadeIn()}) })''' s3.jquery_ready.append(script) # This user isn't yet logged-in if request.cookies.has_key("registered"): # This browser has logged-in before registered = True if self_registration is True: # Provide a Registration box on front page login_buttons.append( A(T("Register"), _id="show-register", _class="tiny secondary button", _style="margin-left:5px")) script = ''' $('#show-register').click(function(e){ e.preventDefault() $('#login_form').hide() $('#register_form').show() $('#intro').fadeOut(function(){$('#login_box').fadeIn()}) })''' s3.jquery_ready.append(script) register_form = auth.register() register_div = DIV(H3(T("Register")), P(XML(T("If you would like to help, then please %(sign_up_now)s") % \ dict(sign_up_now=B(T("sign-up now")))))) register_script = ''' $('#register-btn').click(function(e){ e.preventDefault() $('#login_form').fadeOut(function(){$('#register_form').fadeIn()}) }) $('#login-btn').click(function(e){ e.preventDefault() $('#register_form').fadeOut(function(){$('#login_form').fadeIn()}) })''' s3.jquery_ready.append(register_script) # Provide a login box on front page auth.messages.submit_button = T("Login") login_form = auth.login(inline=True) login_div = DIV(H3(T("Login")), P(XML(T("Registered users can %(login)s to access the system") % \ dict(login=B(T("login")))))) else: login_buttons = "" # Create output dict output = { "login_buttons": login_buttons, "self_registration": self_registration, "registered": registered, "login_div": login_div, "login_form": login_form, "register_div": register_div, "register_form": register_form, "contact_form": contact_form, "project_links": project_links, } # Count records (@todo: provide total/updated counters?) s3db = current.s3db db = current.db # Organisations table = s3db.org_organisation query = (table.deleted != True) count = table.id.count() row = db(query).select(count).first() output["total_organisations"] = row[count] # Service Locations (@todo) #table = s3db.org_service_location #query = (table.deleted != True) #count = table.id.count() #row = db(query).select(count).first() output["total_services"] = 0 #row[count] # Needs lists table = s3db.req_organisation_needs query = (table.deleted != True) count = table.id.count() row = db(query).select(count).first() output["total_needs"] = row[count] # Frontpage Feed Control if settings.frontpage.rss: s3.external_stylesheets.append( "http://www.google.com/uds/solutions/dynamicfeed/gfdynamicfeedcontrol.css" ) s3.scripts.append( "http://www.google.com/jsapi?key=notsupplied-wizard") s3.scripts.append( "http://www.google.com/uds/solutions/dynamicfeed/gfdynamicfeedcontrol.js" ) counter = 0 feeds = "" for feed in settings.frontpage.rss: counter += 1 feeds = "".join((feeds, "{title:'%s',\n" % feed["title"], "url:'%s'}" % feed["url"])) # Don't add a trailing comma for old IEs if counter != len(settings.frontpage.rss): feeds += ",\n" # feedCycleTime: milliseconds before feed is reloaded (5 minutes) feed_control = "".join((''' function LoadDynamicFeedControl(){ var feeds=[ ''', feeds, ''' ] var options={ feedCycleTime:300000, numResults:5, stacked:true, horizontal:false, title:"''', str(T("News")), '''" } new GFdynamicFeedControl(feeds,'feed-control',options) } google.load('feeds','1') google.setOnLoadCallback(LoadDynamicFeedControl)''')) s3.js_global.append(feed_control) s3.stylesheets.append("../themes/RW/homepage.css") self._view(TEMPLATE, "index.html") return output
def insert(): (db, table) = get_table(request) form = SQLFORM(db[table], ignore_rw=ignore_rw) if form.accepts(request.vars, session): response.flash = T('new record inserted') return dict(form=form, table=db[table])
def test_smartgrid(self): smartgrid_form = SQLFORM.smartgrid(self.db.auth_user) self.assertEqual(smartgrid_form.xml()[:4], b'<div')
def test_grid(self): grid_form = SQLFORM.grid(self.db.auth_user) self.assertEqual(grid_form.xml()[:4], b'<div')
def test_factory(self): factory_form = SQLFORM.factory( Field('field_one', 'string', IS_NOT_EMPTY()), Field('field_two', 'string')) self.assertEqual(factory_form.xml()[:5], b'<form')
def test_SQLFORM(self): form = SQLFORM(self.db.auth_user) self.assertEqual(form.xml()[:5], b'<form')
def create_fieldlist(table): fields_lst = [] # if table=="setting": # table="fieldvalue" fields = ns.db[table].fields for fname in fields: fieldcat=1 if fname in("id","deleted"): continue if ns.db[table][fname].type=="text": ns.db[table][fname].widget=lambda field,value: SQLFORM.widgets.string.widget(field,value) if type(ns.db[table][fname].requires).__name__=="check_boolean": fields_lst.append({"fieldname":fname,"label":ns.db[table][fname].label, "widget":SELECT([OPTION("", _value=""),OPTION(T("YES"), _value="1"),OPTION(T("NO"), _value="0",)], _id=table+"_"+fname, _name=fname), "fieldcat":1}) continue if table in("address","contact"): if fname=="nervatype": ns.db[table].nervatype.requires = IS_IN_SET(('customer', 'employee', 'event', 'place', 'product', 'project', 'tool', 'trans')) fieldcat=0 elif fname=="ref_id": fields_lst.append({"fieldname":"refnumber","label":T('Ref.No.'), "widget":INPUT(_type="text",_value="",_name="refnumber",_id=table+"_refnumber",_class="string"), "fieldcat":0}) fields_lst.append({"fieldname":"rownumber","label":T('Row No.'), "widget":INPUT(_type="text",_value="0",_name="rownumber",_id=table+"_rownumber",_class="integer"), "fieldcat":0}) continue elif table=="barcode": if fname=="code": fields_lst.append({"fieldname":"code","label":T('Barcode'), "widget":INPUT(_type="text",_value="",_name="code",_id=table+"_code",_class="string"), "fieldcat":0}) continue elif fname=="product_id": fields_lst.append({"fieldname":"partnumber","label":T('Product No.'), "widget":INPUT(_type="text",_value="",_name="partnumber",_id=table+"_partnumber",_class="string"), "fieldcat":1}) continue elif fname=="barcodetype": ns.db.barcode.barcodetype.requires = IS_IN_DB(ns.db(ns.db.groups.groupname.like('barcodetype')), ns.db.groups.groupvalue, '%(groupvalue)s') elif table=="currency": if fname=="curr": fieldcat=0 elif table=="customer": if fname=="custnumber": fieldcat=0 elif fname=="custtype": ns.db.customer.custtype.requires = IS_IN_DB(ns.db(ns.db.groups.groupname.like('custtype')&(ns.db.groups.groupvalue!="own")), ns.db.groups.groupvalue, '%(groupvalue)s') elif table=="deffield": if fname=="fieldname": fieldcat=0 elif fname=="nervatype": ns.db[table].nervatype.requires = IS_IN_SET(('address', 'barcode', 'contact', 'currency', 'customer', 'employee', 'event', 'item', 'link', 'log', 'movement', 'payment', 'price', 'place', 'product', 'project', 'rate', 'tax', 'tool', 'trans', 'setting')) elif fname=="subtype": ns.db[table][fname].widget=lambda field,value: SQLFORM.widgets.string.widget(field,value) elif fname=="fieldtype": ns.db.deffield.fieldtype.requires = IS_IN_DB(ns.db((ns.db.groups.groupname.like('fieldtype')) &(ns.db.groups.groupvalue!="checkbox")&(ns.db.groups.groupvalue!="trans")), ns.db.groups.groupvalue, '%(groupvalue)s') elif table=="employee": if fname=="empnumber": fieldcat=0 elif fname=="usergroup": ns.db.employee.usergroup.requires = IS_IN_DB(ns.db((ns.db.groups.groupname.like('usergroup'))&(ns.db.groups.deleted==0)), ns.db.groups.groupvalue, '%(groupvalue)s') elif fname=="department": ns.db.employee.department.requires = IS_EMPTY_OR(IS_IN_DB(ns.db((ns.db.groups.groupname.like('department')) &(ns.db.groups.deleted==0)), ns.db.groups.groupvalue, '%(groupvalue)s')) elif fname in("password","registration_key","reset_password_key","registration_id"): continue elif table=="event": if fname=="calnumber": fieldcat=0 elif fname=="ref_id": fields_lst.append({"fieldname":"refnumber","label":T('Ref. No.'), "widget":INPUT(_type="text",_value="",_name="refnumber",_id=table+"_refnumber",_class="string"), "fieldcat":1}) continue elif fname=="nervatype": ns.db[table].nervatype.requires = IS_IN_SET(('customer', 'employee', 'place', 'product', 'project', 'tool', 'trans')) elif fname=="eventgroup": ns.db[table][fname].widget=lambda field,value: SQLFORM.widgets.string.widget(field,value) elif table=="groups": if fname in("groupname","groupvalue"): fieldcat=0 elif table=="item": if fname=="trans_id": fields_lst.append({"fieldname":"transnumber","label":T('Doc.No.'), "widget":INPUT(_type="text",_value="",_name="transnumber",_id=table+"_transnumber",_class="string"), "fieldcat":0}) fields_lst.append({"fieldname":"rownumber","label":T('Row No.'), "widget":INPUT(_type="text",_value="0",_name="rownumber",_id=table+"_rownumber",_class="integer"), "fieldcat":0}) fields_lst.append({"fieldname":"inputmode","label":T('Input mode'), "widget":SELECT([OPTION("", _value=""),OPTION(T("fxprice"), _value="fxprice"), OPTION(T("netamount"), _value="netamount"),OPTION(T("amount"), _value="amount") ], _id="item_inputmode", _name="inputmode"), "fieldcat":1}) fields_lst.append({"fieldname":"inputvalue","label":T('Input value'), "widget":INPUT(_type="text",_value="0",_name="inputvalue",_id=table+"_inputvalue",_class="double"), "fieldcat":1}) continue elif fname=="product_id": fields_lst.append({"fieldname":"partnumber","label":T('Product No.'), "widget":INPUT(_type="text",_value="",_name="partnumber",_id=table+"_partnumber",_class="string"), "fieldcat":1}) continue elif fname=="tax_id": taxcode = ns.db(ns.db.tax.inactive==0).select(ns.db.tax.taxcode) widget=SELECT(*[OPTION(field.taxcode) for field in taxcode], _id="item_taxcode", _name="taxcode") widget.insert(0, OPTION("")) fields_lst.append({"fieldname":"taxcode","label":T('Tax'), "widget":widget, "fieldcat":1}) continue elif fname in("fxprice","netamount","vatamount","amount"): continue elif table=="link": nervatype_lst=['address', 'barcode', 'contact', 'currency', 'customer', 'employee', 'event', 'groups', 'item', 'movement', 'payment', 'price', 'place', 'product', 'project', 'rate', 'tax', 'tool', 'trans'] if fname == "nervatype_1": widget=SELECT(*[OPTION(nervatype) for nervatype in nervatype_lst], _id="link_nervatype1", _name="nervatype1") widget.insert(0, OPTION("")) fields_lst.append({"fieldname":"nervatype1","label":T('Nervatype 1'), "widget":widget, "fieldcat":0}) continue elif fname == "nervatype_2": widget=SELECT(*[OPTION(nervatype) for nervatype in nervatype_lst], _id="link_nervatype2", _name="nervatype2") widget.insert(0, OPTION("")) fields_lst.append({"fieldname":"nervatype2","label":T('Nervatype 2'), "widget":widget, "fieldcat":0}) continue elif fname=="ref_id_1": fields_lst.append({"fieldname":"refnumber1","label":T('Ref. No. 1'), "widget":INPUT(_type="text",_value="",_name="refnumber1",_id=table+"_refnumber1",_class="string"), "fieldcat":0}) continue elif fname=="ref_id_2": fields_lst.append({"fieldname":"refnumber2","label":T('Ref. No. 2'), "widget":INPUT(_type="text",_value="",_name="refnumber2",_id=table+"_refnumber2",_class="string"), "fieldcat":0}) continue elif table=="log": nervatype_lst=['address', 'barcode', 'contact', 'currency', 'customer', 'employee', 'deffield', 'event', 'groups', 'item', 'link', 'movement', 'payment', 'price', 'place', 'product', 'project', 'rate', 'tax', 'tool', 'trans', 'setting'] if fname=="employee_id": fields_lst.append({"fieldname":"empnumber","label":T('Employee No.'), "widget":INPUT(_type="text",_value="",_name="empnumber",_id=table+"_empnumber",_class="string"), "fieldcat":0}) continue elif fname=="crdate": fieldcat=0 elif fname == "nervatype": widget=SELECT(*[OPTION(nervatype) for nervatype in nervatype_lst], _id="log_nervatype", _name="nervatype") widget.insert(0, OPTION("")) fields_lst.append({"fieldname":"nervatype","label":T('Nervatype'), "widget":widget, "fieldcat":1}) continue elif fname == "logstate": widget=SELECT(*[OPTION(logstate.groupvalue) for logstate in ns.db(ns.db.groups.groupname.like('logstate')).select(ns.db.groups.groupvalue)], _id="log_logstate", _name="logstate") widget.insert(0, OPTION("")) fields_lst.append({"fieldname":"logstate","label":T('State'), "widget":widget, "fieldcat":1}) continue elif fname=="ref_id": fields_lst.append({"fieldname":"refnumber","label":T('Ref.No.'), "widget":INPUT(_type="text",_value="",_name="refnumber",_id=table+"_refnumber",_class="string"), "fieldcat":1}) continue elif table=="movement": if fname=="trans_id": fields_lst.append({"fieldname":"transnumber","label":T('Doc.No.'), "widget":INPUT(_type="text",_value="",_name="transnumber",_id=table+"_transnumber",_class="string"), "fieldcat":0}) fields_lst.append({"fieldname":"rownumber","label":T('Row No.'), "widget":INPUT(_type="text",_value="0",_name="rownumber",_id=table+"_rownumber",_class="integer"), "fieldcat":0}) continue elif fname=="movetype": ns.db.movement.movetype.requires = IS_IN_DB(ns.db(ns.db.groups.groupname.like('movetype') & ns.db.groups.groupvalue.belongs(('inventory', 'store', 'tool')) ), ns.db.groups.groupvalue, '%(groupvalue)s') elif fname=="product_id": fields_lst.append({"fieldname":"partnumber","label":T('Product No.'), "widget":INPUT(_type="text",_value="",_name="partnumber",_id=table+"_partnumber",_class="string"), "fieldcat":1}) continue elif fname=="tool_id": fields_lst.append({"fieldname":"serial","label":T('Serial'), "widget":INPUT(_type="text",_value="",_name="serial",_id=table+"_serial",_class="string"), "fieldcat":1}) continue elif fname=="place_id": fields_lst.append({"fieldname":"planumber","label":T('Place No.'), "widget":INPUT(_type="text",_value="",_name="planumber",_id=table+"_planumber",_class="string"), "fieldcat":1}) continue elif table=="numberdef": if fname=="numberkey": fieldcat=0 elif table=="pattern": if fname=="description": fieldcat=0 elif fname=="transtype": ns.db.pattern.transtype.requires = IS_IN_DB(ns.db(ns.db.groups.groupname.like('transtype')), ns.db.groups.groupvalue, '%(groupvalue)s') elif table=="payment": if fname=="trans_id": fields_lst.append({"fieldname":"transnumber","label":T('Doc.No.'), "widget":INPUT(_type="text",_value="",_name="transnumber",_id=table+"_transnumber",_class="string"), "fieldcat":0}) fields_lst.append({"fieldname":"rownumber","label":T('Row No.'), "widget":INPUT(_type="text",_value="0",_name="rownumber",_id=table+"_rownumber",_class="integer"), "fieldcat":0}) continue elif table=="place": if fname=="planumber": fieldcat=0 elif fname=="place_id": fields_lst.append({"fieldname":"ref_planumber","label":T('Ref. No.'), "widget":INPUT(_type="text",_value="",_name="ref_planumber",_id=table+"_ref_planumber",_class="string"), "fieldcat":1}) continue elif fname=="placetype": ns.db.place.placetype.requires = IS_IN_DB(ns.db(ns.db.groups.groupname.like('placetype')), ns.db.groups.groupvalue, '%(groupvalue)s') elif fname=="storetype": continue elif table=="price": if fname=="product_id": fields_lst.append({"fieldname":"partnumber","label":T('Product No.'), "widget":INPUT(_type="text",_value="",_name="partnumber",_id=table+"_partnumber",_class="string"), "fieldcat":0}) fields_lst.append({"fieldname":"pricetype","label":T('Type'), "widget":SELECT([OPTION("", _value=""),OPTION(T("price"), _value="price"), OPTION(T("discount"), _value="discount") ], _id=table+"_pricetype", _name="pricetype"), "fieldcat":0}) continue elif fname=="validfrom": fieldcat=0 elif fname=="curr": fieldcat=0 elif fname=="qty": fieldcat=0 elif fname=="pricevalue": ns.db.price.pricevalue.label = T("Value/limit") elif fname=="calcmode": ns.db.price.calcmode.requires = IS_IN_DB(ns.db(ns.db.groups.groupname.like('calcmode')), ns.db.groups.groupvalue, '%(description)s') elif table=="product": if fname=="partnumber": fieldcat=0 elif fname=="protype": ns.db.product.protype.requires = IS_IN_DB(ns.db(ns.db.groups.groupname.like('protype')), ns.db.groups.groupvalue, '%(groupvalue)s') elif fname=="tax_id": taxcode = ns.db(ns.db.tax.inactive==0).select(ns.db.tax.taxcode) widget=SELECT(*[OPTION(field.taxcode) for field in taxcode], _id="product_taxcode", _name="taxcode") widget.insert(0, OPTION("")) fields_lst.append({"fieldname":"taxcode","label":T('Tax'), "widget":widget, "fieldcat":1}) continue elif table=="project": if fname=="pronumber": fieldcat=0 elif fname=="customer_id": fields_lst.append({"fieldname":"custnumber","label":T('Customer No.'), "widget":INPUT(_type="text",_value="",_name="custnumber",_id=table+"_custnumber",_class="string"), "fieldcat":1}) continue elif table=="rate": if fname == "ratetype": fieldcat=0 ns.db.rate.ratetype.requires = IS_IN_DB(ns.db(ns.db.groups.groupname.like('ratetype')), ns.db.groups.groupvalue, '%(groupvalue)s') elif fname in("ratedate","curr"): fieldcat=0 elif fname=="place_id": fields_lst.append({"fieldname":"planumber","label":T('Place No.'), "widget":INPUT(_type="text",_value="",_name="planumber",_id=table+"_planumber",_class="string"), "fieldcat":0}) continue elif fname == "rategroup": ns.db.rate.rategroup.requires = IS_EMPTY_OR(IS_IN_DB(ns.db((ns.db.groups.deleted==0) &ns.db.groups.groupname.like('rategroup')), ns.db.groups.groupvalue, '%(groupvalue)s')) elif table=="tax": if fname=="taxcode": fieldcat=0 elif table=="tool": if fname=="serial": fieldcat=0 elif fname=="product_id": fields_lst.append({"fieldname":"partnumber","label":T('Product No.'), "widget":INPUT(_type="text",_value="",_name="partnumber",_id=table+"_partnumber",_class="string"), "fieldcat":1}) continue elif fname == "toolgroup": ns.db.tool.toolgroup.requires = IS_EMPTY_OR(IS_IN_DB(ns.db((ns.db.groups.deleted==0) &ns.db.groups.groupname.like('toolgroup')), ns.db.groups.groupvalue, '%(groupvalue)s')) elif table=="trans": if fname=="transnumber": fieldcat=0 elif fname == "transtype": ns.db.trans.transtype.requires = IS_IN_DB(ns.db(ns.db.groups.groupname.like('transtype')), ns.db.groups.groupvalue, '%(groupvalue)s') elif fname == "direction": ns.db.trans.direction.requires = IS_IN_DB(ns.db(ns.db.groups.groupname.like('direction')), ns.db.groups.groupvalue, '%(groupvalue)s') elif fname == "paidtype": ns.db.trans.paidtype.requires = IS_EMPTY_OR(IS_IN_DB(ns.db((ns.db.groups.deleted==0) &ns.db.groups.groupname.like('paidtype')), ns.db.groups.groupvalue, '%(groupvalue)s')) elif fname == "department": ns.db.trans.department.requires = IS_EMPTY_OR(IS_IN_DB(ns.db((ns.db.groups.deleted==0) &ns.db.groups.groupname.like('department')), ns.db.groups.groupvalue, '%(groupvalue)s')) elif fname == "transtate": ns.db.trans.transtate.requires = IS_IN_DB(ns.db(ns.db.groups.groupname.like('transtate')), ns.db.groups.groupvalue, '%(groupvalue)s') elif fname=="customer_id": fields_lst.append({"fieldname":"custnumber","label":T('Customer No.'), "widget":INPUT(_type="text",_value="",_name="custnumber",_id=table+"_custnumber",_class="string"), "fieldcat":1}) continue elif fname=="employee_id": fields_lst.append({"fieldname":"empnumber","label":T('Employee No.'), "widget":INPUT(_type="text",_value="",_name="empnumber",_id=table+"_empnumber",_class="string"), "fieldcat":1}) continue elif fname=="project_id": fields_lst.append({"fieldname":"pronumber","label":T('Project No.'), "widget":INPUT(_type="text",_value="",_name="pronumber",_id=table+"_pronumber",_class="string"), "fieldcat":1}) continue elif fname=="place_id": fields_lst.append({"fieldname":"planumber","label":T('Place No.'), "widget":INPUT(_type="text",_value="",_name="planumber",_id=table+"_planumber",_class="string"), "fieldcat":1}) continue elif fname=="cruser_id": continue elif table=="fieldvalue": if fname=="fieldname": fields_lst.append({"fieldname":"fieldname","label":T('Fieldname'), "widget":INPUT(_type="text",_value="",_name="fieldname",_id=table+"_fieldname",_class="string"), "fieldcat":0}) continue elif fname=="ref_id": fields_lst.append({"fieldname":"refnumber","label":T('Ref.No.'), "widget":INPUT(_type="text",_value="",_name="refnumber",_id=table+"_refnumber",_class="string"), "fieldcat":0}) fields_lst.append({"fieldname":"rownumber","label":T('Row No.'), "widget":INPUT(_type="text",_value="1",_name="rownumber",_id=table+"_rownumber",_class="integer"), "fieldcat":0}) continue elif fname=="fieldtype": ns.db.fieldvalue.fieldtype.requires = IS_IN_DB(ns.db((ns.db.groups.groupname.like('fieldtype')) &(ns.db.groups.groupvalue!="checkbox")&(ns.db.groups.groupvalue!="trans")), ns.db.groups.id, '%(groupvalue)s') form = SQLFORM(ns.db[table]) fields_lst.append({"fieldname":fname,"label":form.custom.label[fname], "widget":form.custom.widget[fname],"fieldcat":fieldcat}) if table in("address", "barcode", "contact", "currency", "customer", "employee", "event", "groups", "item", "link", "log", "movement", "price", "place", "product", "project", "rate", "tax", "tool", "trans"): nervatype = ns.db((ns.db.groups.groupname=="nervatype")&(ns.db.groups.groupvalue==table)).select().as_list()[0]["id"] deffields = ns.db((ns.db.deffield.deleted==0)&(ns.db.deffield.visible==1)&(ns.db.deffield.nervatype==nervatype) &(ns.db.deffield.readonly==0)&(ns.db.deffield.fieldtype==ns.db.groups.id)).select( ns.db.deffield.fieldname,ns.db.groups.groupvalue,ns.db.deffield.description,ns.db.deffield.valuelist) for deffield in deffields: if deffield.groups.groupvalue=="bool": fields_lst.append({"fieldname":deffield.deffield.fieldname,"label":deffield.deffield.description, "widget":INPUT(_type="checkbox",_value="on",_name=deffield.deffield.fieldname,_id=table+"_"+deffield.deffield.fieldname,_class="boolean"), "fieldcat":2}) elif deffield.groups.groupvalue=="integer": fields_lst.append({"fieldname":deffield.deffield.fieldname,"label":deffield.deffield.description, "widget":INPUT(_type="text",_value="0",_name=deffield.deffield.fieldname,_id=table+"_"+deffield.deffield.fieldname,_class="integer"), "fieldcat":2}) elif deffield.groups.groupvalue=="float": fields_lst.append({"fieldname":deffield.deffield.fieldname,"label":deffield.deffield.description, "widget":INPUT(_type="text",_value="0",_name=deffield.deffield.fieldname,_id=table+"_"+deffield.deffield.fieldname,_class="double"), "fieldcat":2}) elif deffield.groups.groupvalue=="date": fields_lst.append({"fieldname":deffield.deffield.fieldname,"label":deffield.deffield.description, "widget":INPUT(_type="text",_value="",_name=deffield.deffield.fieldname,_id=table+"_"+deffield.deffield.fieldname,_class="date"), "fieldcat":2}) elif deffield.groups.groupvalue=="valuelist": widget = SELECT(*[OPTION(field) for field in deffield.deffield.valuelist.split("|")], _name=deffield.deffield.fieldname,_id=table+"_"+deffield.deffield.fieldname) widget.insert(0, OPTION("", _value="")) fields_lst.append({"fieldname":deffield.deffield.fieldname,"label":deffield.deffield.description,"widget":widget,"fieldcat":2}) else: fields_lst.append({"fieldname":deffield.deffield.fieldname,"label":deffield.deffield.description, "widget":INPUT(_type="text",_value="",_name=deffield.deffield.fieldname,_id=table+"_"+deffield.deffield.fieldname,_class="string"), "fieldcat":2}) return fields_lst
def test_SQLFORM(self): form = SQLFORM(self.db.auth_user) self.assertEqual(form.xml(), b'<form action="#" enctype="multipart/form-data" method="post"><table><tr id="auth_user_first_name__row"><td class="w2p_fl"><label class="" for="auth_user_first_name" id="auth_user_first_name__label">First name: </label></td><td class="w2p_fw"><input class="string" id="auth_user_first_name" name="first_name" type="text" value="" /></td><td class="w2p_fc"></td></tr><tr id="auth_user_last_name__row"><td class="w2p_fl"><label class="" for="auth_user_last_name" id="auth_user_last_name__label">Last name: </label></td><td class="w2p_fw"><input class="string" id="auth_user_last_name" name="last_name" type="text" value="" /></td><td class="w2p_fc"></td></tr><tr id="auth_user_email__row"><td class="w2p_fl"><label class="" for="auth_user_email" id="auth_user_email__label">E-mail: </label></td><td class="w2p_fw"><input class="string" id="auth_user_email" name="email" type="text" value="" /></td><td class="w2p_fc"></td></tr><tr id="auth_user_username__row"><td class="w2p_fl"><label class="" for="auth_user_username" id="auth_user_username__label">Username: </label></td><td class="w2p_fw"><input class="string" id="auth_user_username" name="username" type="text" value="" /></td><td class="w2p_fc"></td></tr><tr id="auth_user_password__row"><td class="w2p_fl"><label class="" for="auth_user_password" id="auth_user_password__label">Password: </label></td><td class="w2p_fw"><input class="password" id="auth_user_password" name="password" type="password" value="" /></td><td class="w2p_fc"></td></tr><tr id="submit_record__row"><td class="w2p_fl"></td><td class="w2p_fw"><input type="submit" value="Submit" /></td><td class="w2p_fc"></td></tr></table></form>')
def test_smartgrid(self): smartgrid_form = SQLFORM.smartgrid(self.db.auth_user) self.assertEqual(smartgrid_form.xml(), b'<div class="web2py_grid "><div class="web2py_breadcrumbs"><ul class=""><li class="active w2p_grid_breadcrumb_elem"><a href="/a/c/f/auth_user">Auth users</a></li></ul></div><div class="web2py_console "><form action="/a/c/f/auth_user" enctype="multipart/form-data" method="GET"><input class="form-control" id="w2p_keywords" name="keywords" onfocus="jQuery('#w2p_query_fields').change();jQuery('#w2p_query_panel').slideDown();" type="text" value="" /><input class="btn btn-default" type="submit" value="Search" /><input class="btn btn-default" onclick="jQuery('#w2p_keywords').val('');" type="submit" value="Clear" /></form><div id="w2p_query_panel" style="display:none;"><select class="form-control" id="w2p_query_fields" onchange="jQuery('.w2p_query_row').hide();jQuery('#w2p_field_'+jQuery('#w2p_query_fields').val().replace('.','-')).show();" style="float:left"><option value="auth_user.id">Id</option><option value="auth_user.first_name">First name</option><option value="auth_user.last_name">Last name</option><option value="auth_user.email">E-mail</option><option value="auth_user.username">Username</option></select><div class="w2p_query_row" id="w2p_field_auth_user-id" style="display:none"><select class="form-control"><option value="=">=</option><option value="!=">!=</option><option value="<"><</option><option value=">">></option><option value="<="><=</option><option value=">=">>=</option><option value="in">in</option><option value="not in">not in</option></select><input class="id form-control" id="w2p_value_auth_user-id" type="text" /><input class="btn btn-default" onclick="w2p_build_query('new','auth_user.id')" title="Start building a new search" type="button" value="New Search" /><input class="btn btn-default" onclick="w2p_build_query('and','auth_user.id')" title="Add this to the search as an AND term" type="button" value="+ And" /><input class="btn btn-default" onclick="w2p_build_query('or','auth_user.id')" title="Add this to the search as an OR term" type="button" value="+ Or" /><input class="btn btn-default" onclick="jQuery('#w2p_query_panel').slideUp()" type="button" value="Close" /></div><div class="w2p_query_row" id="w2p_field_auth_user-first_name" style="display:none"><select class="form-control"><option value="=">=</option><option value="!=">!=</option><option value="<"><</option><option value=">">></option><option value="<="><=</option><option value=">=">>=</option><option value="starts with">starts with</option><option value="contains">contains</option><option value="in">in</option><option value="not in">not in</option></select><input class="string form-control" id="w2p_value_auth_user-first_name" type="text" /><input class="btn btn-default" onclick="w2p_build_query('new','auth_user.first_name')" title="Start building a new search" type="button" value="New Search" /><input class="btn btn-default" onclick="w2p_build_query('and','auth_user.first_name')" title="Add this to the search as an AND term" type="button" value="+ And" /><input class="btn btn-default" onclick="w2p_build_query('or','auth_user.first_name')" title="Add this to the search as an OR term" type="button" value="+ Or" /><input class="btn btn-default" onclick="jQuery('#w2p_query_panel').slideUp()" type="button" value="Close" /></div><div class="w2p_query_row" id="w2p_field_auth_user-last_name" style="display:none"><select class="form-control"><option value="=">=</option><option value="!=">!=</option><option value="<"><</option><option value=">">></option><option value="<="><=</option><option value=">=">>=</option><option value="starts with">starts with</option><option value="contains">contains</option><option value="in">in</option><option value="not in">not in</option></select><input class="string form-control" id="w2p_value_auth_user-last_name" type="text" /><input class="btn btn-default" onclick="w2p_build_query('new','auth_user.last_name')" title="Start building a new search" type="button" value="New Search" /><input class="btn btn-default" onclick="w2p_build_query('and','auth_user.last_name')" title="Add this to the search as an AND term" type="button" value="+ And" /><input class="btn btn-default" onclick="w2p_build_query('or','auth_user.last_name')" title="Add this to the search as an OR term" type="button" value="+ Or" /><input class="btn btn-default" onclick="jQuery('#w2p_query_panel').slideUp()" type="button" value="Close" /></div><div class="w2p_query_row" id="w2p_field_auth_user-email" style="display:none"><select class="form-control"><option value="=">=</option><option value="!=">!=</option><option value="<"><</option><option value=">">></option><option value="<="><=</option><option value=">=">>=</option><option value="starts with">starts with</option><option value="contains">contains</option><option value="in">in</option><option value="not in">not in</option></select><input class="string form-control" id="w2p_value_auth_user-email" type="text" /><input class="btn btn-default" onclick="w2p_build_query('new','auth_user.email')" title="Start building a new search" type="button" value="New Search" /><input class="btn btn-default" onclick="w2p_build_query('and','auth_user.email')" title="Add this to the search as an AND term" type="button" value="+ And" /><input class="btn btn-default" onclick="w2p_build_query('or','auth_user.email')" title="Add this to the search as an OR term" type="button" value="+ Or" /><input class="btn btn-default" onclick="jQuery('#w2p_query_panel').slideUp()" type="button" value="Close" /></div><div class="w2p_query_row" id="w2p_field_auth_user-username" style="display:none"><select class="form-control"><option value="=">=</option><option value="!=">!=</option><option value="<"><</option><option value=">">></option><option value="<="><=</option><option value=">=">>=</option><option value="starts with">starts with</option><option value="contains">contains</option><option value="in">in</option><option value="not in">not in</option></select><input class="string form-control" id="w2p_value_auth_user-username" type="text" /><input class="btn btn-default" onclick="w2p_build_query('new','auth_user.username')" title="Start building a new search" type="button" value="New Search" /><input class="btn btn-default" onclick="w2p_build_query('and','auth_user.username')" title="Add this to the search as an AND term" type="button" value="+ And" /><input class="btn btn-default" onclick="w2p_build_query('or','auth_user.username')" title="Add this to the search as an OR term" type="button" value="+ Or" /><input class="btn btn-default" onclick="jQuery('#w2p_query_panel').slideUp()" type="button" value="Close" /></div></div><script><!--\n\n jQuery(\'#w2p_query_fields input,#w2p_query_fields select\').css(\n \'width\',\'auto\');\n jQuery(function(){web2py_ajax_fields(\'#w2p_query_fields\');});\n function w2p_build_query(aggregator,a) {\n var b=a.replace(\'.\',\'-\');\n var option = jQuery(\'#w2p_field_\'+b+\' select\').val();\n var value;\n var $value_item = jQuery(\'#w2p_value_\'+b);\n if ($value_item.is(\':checkbox\')){\n if ($value_item.is(\':checked\'))\n value = \'True\';\n else value = \'False\';\n }\n else\n { value = $value_item.val().replace(\'"\',\'\\\\"\')}\n var s=a+\' \'+option+\' "\'+value+\'"\';\n var k=jQuery(\'#w2p_keywords\');\n var v=k.val();\n if(aggregator==\'new\') k.val(s); else k.val((v?(v+\' \'+ aggregator +\' \'):\'\')+s);\n }\n \n//--></script><div class="web2py_counter">1 records found</div></div><div class="web2py_table"><div class="web2py_htmltable" style="width:100%;overflow-x:auto;-ms-overflow-x:scroll"><table><colgroup><col data-column="1" id="auth_user-id" /><col data-column="2" id="auth_user-first_name" /><col data-column="3" id="auth_user-last_name" /><col data-column="4" id="auth_user-email" /><col data-column="5" id="auth_user-username" /><col data-column="6" /></colgroup><thead><tr class=""><th class=""><a href="/a/c/f/auth_user?keywords=&order=auth_user.id">Id</a></th><th class=""><a href="/a/c/f/auth_user?keywords=&order=auth_user.first_name">First name</a></th><th class=""><a href="/a/c/f/auth_user?keywords=&order=auth_user.last_name">Last name</a></th><th class=""><a href="/a/c/f/auth_user?keywords=&order=auth_user.email">E-mail</a></th><th class=""><a href="/a/c/f/auth_user?keywords=&order=auth_user.username">Username</a></th><th class=""></th></tr></thead><tbody><tr class="w2p_odd odd with_id" id="1"><td>1</td><td>Bart</td><td>Simpson</td><td>[email protected]</td><td>user1</td><td class="row_buttons" nowrap="nowrap"><a href="/a/c/f/auth_user/auth_membership.user_id/1"><span>Auth memberships</span></a><a href="/a/c/f/auth_user/auth_event.user_id/1"><span>Auth events</span></a><a href="/a/c/f/auth_user/auth_cas.user_id/1"><span>Auth cases</span></a><a href="/a/c/f/auth_user/t0.created_by/1"><span>T0s(created_by)</span></a><a href="/a/c/f/auth_user/t0.modified_by/1"><span>T0s(modified_by)</span></a><a href="/a/c/f/auth_user/t0_archive.created_by/1"><span>T0 archives(created_by)</span></a><a href="/a/c/f/auth_user/t0_archive.modified_by/1"><span>T0 archives(modified_by)</span></a><a class="button btn btn-default" href="/a/c/f/auth_user/view/auth_user/1"><span class="icon magnifier icon-zoom-in glyphicon glyphicon-zoom-in"></span> <span class="buttontext button" title="View">View</span></a></td></tr></tbody></table></div></div><div class="w2p_export_menu">Export:<a class="btn btn-default" href="/a/c/f/auth_user?_export_type=csv&keywords=&order=" title="Comma-separated export of visible columns. Fields from other tables are exported as they appear on-screen but this may be slow for many rows">CSV</a><a class="btn btn-default" href="/a/c/f/auth_user?_export_type=csv_with_hidden_cols&keywords=&order=" title="Comma-separated export including columns not shown; fields from other tables are exported as raw values for faster export">CSV (hidden cols)</a><a class="btn btn-default" href="/a/c/f/auth_user?_export_type=html&keywords=&order=" title="HTML export of visible columns">HTML</a><a class="btn btn-default" href="/a/c/f/auth_user?_export_type=json&keywords=&order=" title="JSON export of visible columns">JSON</a><a class="btn btn-default" href="/a/c/f/auth_user?_export_type=tsv&keywords=&order=" title="Spreadsheet-optimised export of tab-separated content, visible columns only. May be slow.">TSV (Spreadsheets)</a><a class="btn btn-default" href="/a/c/f/auth_user?_export_type=tsv_with_hidden_cols&keywords=&order=" title="Spreadsheet-optimised export of tab-separated content including hidden columns. May be slow">TSV (Spreadsheets, hidden cols)</a><a class="btn btn-default" href="/a/c/f/auth_user?_export_type=xml&keywords=&order=" title="XML export of columns shown">XML</a></div></div>')
def __new__(cls, **kwargs): instance = super(PERSON_FORM, cls).__new__(cls) instance.person = kwargs.get('person') # PERSON type instance.readonly = kwargs.get('readonly') or False instance.readonly_fields = kwargs.get('readonly_fields') or [] my_logger.debug(message='instance.person:%s' % instance.person) my_logger.debug(message='instance.person.creator:%s' % instance.person.creator) if instance.person is not None: current.db.person.first_name.default = instance.person.first_name if 'first_name' in instance.readonly_fields: current.db.person.first_name.writable = False current.db.person.last_name.default = instance.person.last_name if 'last_name' in instance.readonly_fields: current.db.person.last_name.writable = False current.db.person.email.default = instance.person.email if 'email' in instance.readonly_fields: current.db.person.email.writable = False current.db.person.contact.default = instance.person.contact if 'contact' in instance.readonly_fields: current.db.person.contact.writable = False current.db.person.email.requires = [ IS_NOT_EMPTY(), IS_EMAIL(), IS_NOT_IN_DB( current.db(current.db.person.id != instance.person.id), current.db.person.email) ] # creator is a computed field and then not shown by web2py # we need to add it manually instance.form = SQLFORM.factory(Field('creator', 'string', writable=not 'creator' in instance.readonly_fields, label=cc.get_string("PERSON_CREATOR_LABEL"), default=instance.person.creator.email \ if instance.person.creator is not None \ else ''), # creator should exists - backward compatibility current.db.person, Field('is_all_entity', 'boolean', label=cc.get_string("PERSON_IS_ALL_ENTITY_LABEL"), comment=cc.get_string("PERSON_IS_ALL_ENTITY_COMMENT"), represent=lambda r: current.T(str(instance.person.is_all_entity())), # disabled if the user is not admin readable=current.auth.has_membership('all_entity') or \ current.auth.has_membership('admin_entity') or \ current.auth.has_permission('admin'), # admin_ENTITY: backward compatibility writable=(current.auth.has_membership('all_entity') or \ current.auth.has_membership('admin_entity') or \ current.auth.has_permission('admin')) and \ not 'custom_entity' in instance.readonly_fields, # for an update request, pre populating the widget if the user is in all entities default=instance.person.is_all_entity(), ), Field('custom_entity', 'list:reference entity', comment=cc.get_string("PERSON_ENTITY_COMMENT"), label=cc.get_string("PERSON_ENTITY_LABEL"), required=True, notnull=True, writable=not 'custom_entity' in instance.readonly_fields, # for an update request, pre populating the widget given the user entities default=[_entity.id for _entity in instance.person.entities] \ if instance.person.entities is not None \ else [], requires=[IS_IN_DB_AND_USER_ENTITY(current.db(current.db.entity.id > 0), current.db.entity.id, current.db.entity._format, multiple=True), IS_ONE_SELECTED(db=current.db, table=current.db.entity, table_set=~current.db.entity.role.like('user_%'))], represent=lambda r: XML(' <br/>'.join(['%s' % (e.name) \ for e in instance.person.entities])) \ if (not instance.person.is_all_entity() and instance.person.entities is not None) else 'X', widget=lambda field, value: SQLFORM.widgets.multiple.widget(field, value, _class='required')), Field('is_admin', 'boolean', label=cc.get_string("PERSON_IS_ADMIN_LABEL"), comment=cc.get_string("PERSON_IS_ADMIN_COMMENT"), represent=lambda r: current.T(str(instance.person.is_admin())), # disabled if the user is not admin readable=current.auth.has_permission('admin'), writable=current.auth.has_permission('admin') and not 'is_admin' in instance.readonly_fields, # for an update request, pre populating the widget if the user is admin default=instance.person.is_admin(), ), Field('custom_permission', 'string', # this does not matter given that we define our own permission widget label=cc.get_string("PERSON_ENTITY_PERMISSION_LABEL"), required=True, notnull=True, writable=not 'custom_permission' in instance.readonly_fields, # for an update request, pre populating the widget given the user permissions default=[_permission.name for _permission in instance.person.permissions], comment=cc.get_string("PERSON_ENTITY_PERMISSION_COMMENT"), requires=IS_CHIMITHEQUE_PERMISSION(), represent=lambda r: PermissionWidget.represent(r), widget=lambda field, value: PermissionWidget.widget(field, value, _class='required', auth_user_permissions=[_permission.name for _permission in PERSON_MAPPER().find_permissions(current.auth.user.id)] \ if not current.auth.has_permission('admin') \ else None)), readonly=instance.readonly, comments=not instance.readonly, next=URL(current.request.application, 'user', 'list'), submit_button=cc.get_string("SUBMIT") ) else: instance.form = SQLFORM.factory( Field('None', 'string', writable=False, readable=False)) return instance