def cancel(self, **kw): params, data = TinyDict.split(kw) if params.button: res = self.button_action(params) if res: return res raise redirect('/') if not params.id and params.ids: params.id = params.ids[0] if params.id and params.editable: raise redirect(self.path + "/view", model=params.model, id=params.id, ids=ustr(params.ids), view_ids=ustr(params.view_ids), view_mode=ustr(params.view_mode), domain=ustr(params.domain), context=ustr(params.context), offset=params.offset, limit=params.limit, count=params.count, search_domain=ustr(params.search_domain)) params.view_type = 'tree' return self.create(params)
def duplicate(self, **kw): params, data = TinyDict.split(kw) id = params.id ctx = params.context model = params.model proxy = rpc.RPCProxy(model) new_id = proxy.copy(id, {}, ctx) if new_id: params.id = new_id params.ids += [int(new_id)] params.count += 1 args = { 'model': params.model, 'id': params.id, 'ids': ustr(params.ids), 'view_ids': ustr(params.view_ids), 'view_mode': ustr(params.view_mode), 'domain': ustr(params.domain), 'context': ustr(params.context), 'offset': params.offset, 'limit': params.limit, 'count': params.count, 'search_domain': ustr(params.search_domain) } if new_id: raise redirect(self.path + '/edit', **args) raise redirect(self.path + '/view', **args)
def duplicate(self, **kw): params, data = TinyDict.split(kw) id = params.id ctx = params.context model = params.model proxy = rpc.RPCProxy(model) new_id = proxy.copy(id, {}, ctx) if new_id: params.id = new_id params.ids += [int(new_id)] params.count += 1 args = {'model': params.model, 'id': params.id, 'ids': ustr(params.ids), 'view_ids': ustr(params.view_ids), 'view_mode': ustr(params.view_mode), 'domain': ustr(params.domain), 'context': ustr(params.context), 'offset': params.offset, 'limit': params.limit, 'count': params.count, 'search_domain': ustr(params.search_domain)} if new_id: raise redirect(self.path + '/edit', **args) raise redirect(self.path + '/view', **args)
def create(self, model, **kw): wkf_name = kw.get('name') on_create = kw.get('on_create') if not wkf_name: raise redirect('/workflowlist', model=model) proxy = rpc.RPCProxy('workflow') proxy.create(dict(osv=model, name=wkf_name, on_create=on_create)) raise redirect('/workflowlist', model=model)
def clear_binary_data(self, **kw): params, data = TinyDict.split(kw) proxy = rpc.RPCProxy(params.model) ctx = tools.context_with_concurrency_info(params.context, params.concurrency_info) if params.fname: proxy.write([params.id], { params.field: False, params.fname: False }, ctx) else: proxy.write([params.id], {params.field: False}, ctx) args = { 'model': params.model, 'id': params.id, 'ids': ustr(params.ids), 'view_ids': ustr(params.view_ids), 'view_mode': ustr(params.view_mode), 'domain': ustr(params.domain), 'context': ustr(params.context), 'offset': params.offset, 'limit': params.limit, 'count': params.count, 'search_domain': ustr(params.search_domain) } raise redirect(self.path + '/edit', **args)
def execute_url(**data): url = data.get('url') or '' if not ('://' in url or url.startswith('/')): raise common.message(_('Relative URLs are not supported!')) raise tools.redirect(url)
def delete(self, model, id): id = int(id) proxy = rpc.RPCProxy('workflow') proxy.unlink(id) raise redirect('/workflowlist', model=model)
def delete_listname(self, **kw): params, data = TinyDict.split(kw) proxy = rpc.RPCProxy('ir.exports') proxy.unlink(params.id) raise redirect('/impex/exp', **kw)
def delete(self, model, id): id = int(id) proxy = rpc.RPCProxy('ir.ui.view') proxy.unlink(id) raise redirect('/viewlist', model=model)
def add(self, id): id = int(id) proxy = rpc.RPCProxy('ir.ui.view_sc') sc = cherrypy.session.get('terp_shortcuts', False) if sc: for s in sc: if s['res_id'] == id: raise redirect('/tree/open', id=id, model='ir.ui.menu') name = rpc.RPCProxy('ir.ui.menu').name_get([id], rpc.session.context)[0][1] proxy.create({'user_id': rpc.session.uid, 'res_id': id, 'resource': 'ir.ui.menu', 'name': name}) sc = proxy.get_sc(rpc.session.uid, 'ir.ui.menu', rpc.session.context) cherrypy.session['terp_shortcuts'] = sc raise redirect('/tree/open', id=id, model='ir.ui.menu')
def delete(self, **kw): params, data = TinyDict.split(kw) current = params.chain_get(params.source or '') or params proxy = rpc.RPCProxy(current.model) idx = -1 if current.id: ctx = tools.context_with_concurrency_info(current.context, params.concurrency_info) res = proxy.unlink([current.id], ctx) idx = current.ids.index(current.id) current.ids.remove(current.id) params.count = 0 # invalidate count if idx == len(current.ids): idx = -1 current.id = (current.ids or None) and current.ids[idx] self.reset_notebooks() args = { 'model': params.model, 'id': params.id, 'ids': ustr(params.ids), 'view_ids': ustr(params.view_ids), 'view_mode': ustr(params.view_mode), 'domain': ustr(params.domain), 'context': ustr(params.context), 'offset': params.offset, 'limit': params.limit, 'count': params.count, 'search_domain': ustr(params.search_domain) } if not params.id: raise redirect(self.path + '/edit', **args) raise redirect(self.path + '/view', **args)
def save_exp(self, **kw): params, data = TinyDict.split(kw) selected_list = data.get('fields') name = data.get('savelist_name') proxy = rpc.RPCProxy('ir.exports') if selected_list and name: if isinstance(selected_list, basestring): selected_list = [selected_list] proxy.create({'name' : name, 'resource' : params.model, 'export_fields' : [(0, 0, {'name' : f}) for f in selected_list]}) raise redirect('/impex/exp', **kw)
def logout(self): """ Logout method, will terminate the current session. """ #When logout clear sesssion_id and expiration date import check_user_online if rpc.session.storage.get(check_user_online.MODULE_NAME): rpc.session.storage[check_user_online.MODULE_NAME]=False check_user_online.clear_session() rpc.session.logout() raise redirect('/')
def activate(self, model, id): activate_id = int(id) proxy = rpc.RPCProxy('workflow') search_ids = proxy.search([('osv', '=', model)], 0, 0, 0, rpc.session.context) for id in search_ids: if id==activate_id: proxy.write([id], {'on_create': True}) else: proxy.write([id], {'on_create': False}) raise redirect('/workflowlist', model=model)
def delete(self, **kw): params, data = TinyDict.split(kw) current = params.chain_get(params.source or '') or params proxy = rpc.RPCProxy(current.model) idx = -1 if current.id: ctx = tools.context_with_concurrency_info(current.context, params.concurrency_info) res = proxy.unlink([current.id], ctx) idx = current.ids.index(current.id) current.ids.remove(current.id) params.count = 0 # invalidate count if idx == len(current.ids): idx = -1 current.id = (current.ids or None) and current.ids[idx] self.reset_notebooks() args = {'model': params.model, 'id': params.id, 'ids': ustr(params.ids), 'view_ids': ustr(params.view_ids), 'view_mode': ustr(params.view_mode), 'domain': ustr(params.domain), 'context': ustr(params.context), 'offset': params.offset, 'limit': params.limit, 'count': params.count, 'search_domain': ustr(params.search_domain)} if not params.id: raise redirect(self.path + '/edit', **args) raise redirect(self.path + '/view', **args)
def create(self, model, **kw): view_name = kw.get('name') view_type = kw.get('type') priority = kw.get('priority', 16) if not view_name: raise redirect('/viewlist', model=model) proxy = rpc.RPCProxy(model) fields = proxy.fields_get({}).keys() string = "Unknown" try: proxy2 = rpc.RPCProxy('ir.model') mid = proxy2.search([('model','=',model)])[0] string = proxy2.read([mid], ['name'])[0]['name'] except: pass fname = None for n in ('name', 'x_name'): if n in fields: fname = n break if fname: arch = """<?xml version="1.0"?> <%s string="%s"> <field name="%s"/> </%s> """ % (view_type, string, fname, view_type) proxy = rpc.RPCProxy('ir.ui.view') proxy.create(dict(model=model, name=view_name, type=view_type, priority=priority, arch=arch)) raise redirect('/viewlist', model=model)
def save_as(self, **kw): model = kw.get('model') id = int(kw.get('id')) field = kw.get('field') proxy = rpc.RPCProxy(model) res = proxy.read([id], [field])[0] res = res.get(field) if not res: raise redirect('/image', **kw) return base64.decodestring(res)
def activate(self, model, id): activate_id = int(id) proxy = rpc.RPCProxy('workflow') search_ids = proxy.search([('osv', '=', model)], 0, 0, 0, rpc.session.context) for id in search_ids: if id == activate_id: proxy.write([id], {'on_create': True}) else: proxy.write([id], {'on_create': False}) raise redirect('/workflowlist', model=model)
def user_action(self, id='action_id'): """Perform default user action. @param id: `action_id` or `menu_id` """ proxy = rpc.RPCProxy("res.users") act_id = proxy.read([rpc.session.uid], [id, 'name'], rpc.session.context) if not act_id[0][id]: common.warning(_('You can not log into the system!\nAsk the administrator to verify\nyou have an action defined for your user.'), _('Access Denied!')) rpc.session.logout() raise redirect('/'); act_id = act_id[0][id][0] return controllers.actions.execute_by_id(act_id)
def login(self, db=None, user=None, password=None, style=None, location=None, **kw): location = url(location or '/', kw or {}) if db and user and user.startswith("anonymous"): if rpc.session.login(db, user, password): raise redirect(location) if cherrypy.request.params.get('tg_format') == 'json': if rpc.session.login(db, user, password) > 0: return dict(result=1) return dict(result=0) if style in ('ajax', 'ajax_small'): return dict(db=db, user=user, password=password, location=location, style=style, cp_template="templates/login_ajax.mako") return tiny_login(target=location, db=db, user=user, password=password, action="login")
def save_exp(self, **kw): params, data = TinyDict.split(kw) selected_list = data.get('fields') name = data.get('savelist_name') proxy = rpc.RPCProxy('ir.exports') if selected_list and name: if isinstance(selected_list, basestring): selected_list = [selected_list] proxy.create({ 'name': name, 'resource': params.model, 'export_fields': [(0, 0, { 'name': f }) for f in selected_list] }) raise redirect('/impex/exp', **kw)
def clear_binary_data(self, **kw): params, data = TinyDict.split(kw) proxy = rpc.RPCProxy(params.model) ctx = tools.context_with_concurrency_info(params.context, params.concurrency_info) if params.fname: proxy.write([params.id], {params.field: False, params.fname: False}, ctx) else: proxy.write([params.id], {params.field: False}, ctx) args = {'model': params.model, 'id': params.id, 'ids': ustr(params.ids), 'view_ids': ustr(params.view_ids), 'view_mode': ustr(params.view_mode), 'domain': ustr(params.domain), 'context': ustr(params.context), 'offset': params.offset, 'limit': params.limit, 'count': params.count, 'search_domain': ustr(params.search_domain)} raise redirect(self.path + '/edit', **args)
def save(self, terp_save_only=False, **kw): """Controller method to save/button actions... @param tg_errors: TG special arg, used durring validation @param kw: keyword arguments @return: form view """ params, data = TinyDict.split(kw) # remember the current page (tab) of notebooks cherrypy.session['remember_notebooks'] = True # bypass save, for button action in non-editable view if not (params.button and not params.editable and params.id): proxy = rpc.RPCProxy(params.model) if not params.id: ctx = params.context or {} ctx.update(rpc.session.context.copy()) id = proxy.create(data, ctx) params.ids = (params.ids or []) + [int(id)] params.id = int(id) params.count += 1 else: ctx = tools.context_with_concurrency_info(params.context, params.concurrency_info) id = proxy.write([params.id], data, ctx) button = params.button # perform button action if params.button: res = self.button_action(params) if res: return res current = params.chain_get(params.source or '') if current: current.id = None if not params.id: params.id = int(id) elif not button: params.editable = True if terp_save_only: return dict(params=params, data=data) def get_params(p, f): pp = p.chain_get(f) px = rpc.RPCProxy(p.model) _ids = pp.ids _all = px.read([p.id], [f])[0][f] _new = [i for i in _all if i not in _ids] pp.ids = _all if _new: pp.id = _new[0] return pp if params.source and len(params.source.split("/")) > 1: path = params.source.split("/") p = params for f in path: p = get_params(p, f) return self.create(params) args = {'model': params.model, 'id': params.id, 'ids': ustr(params.ids), 'view_ids': ustr(params.view_ids), 'view_mode': ustr(params.view_mode), 'domain': ustr(params.domain), 'context': ustr(params.context), 'offset': params.offset, 'limit': params.limit, 'count': params.count, 'search_domain': ustr(params.search_domain)} if not int(cherrypy.request.params.get('_terp_header_footer', 1)): args['target'] = 'new' if params.editable or params.source or params.return_edit: raise redirect(self.path + '/edit', source=params.source, **args) raise redirect(self.path + '/view', **args)
def execute(self, params): action = params.name model = params.model state = params.state datas = params.datas form = None buttons = [] if model: action = model.replace('wizard.', '', 1) else: model = 'wizard.' + action params.name = action params.model = model params.view_mode = [] if 'form' not in datas: datas['form'] = {} wiz_id = params.wiz_id or rpc.session.execute('wizard', 'create', action) while state != 'end': ctx = rpc.session.context.copy() ctx.update(datas.get('context' or {}) or {}) res = rpc.session.execute('wizard', 'execute', wiz_id, datas, state, ctx) if 'datas' in res: datas['form'].update(res['datas']) else: res['datas'] = {} if res['type']=='form': fields = res['fields'] form_values = {} for f in fields: if 'value' in fields[f]: form_values[f] = fields[f]['value'] if f in datas['form'] and fields[f]['type'] == "one2many": datas['form'][f] = [(1, d, {}) for d in datas['form'][f]] form_values.update(datas['form']) datas['form'] = form_values res['datas'].update(datas['form']) params.is_wizard = True params.view_mode = ['form'] params.view_type = 'form' params.views = {'form': res} # keep track of datas and some other required information params.hidden_fields = [tw.form.Hidden(name='_terp_datas', default=ustr(datas)), tw.form.Hidden(name='_terp_state2', default=state), tw.form.Hidden(name='_terp_wiz_id', default=wiz_id)] form = tw.form_view.ViewForm(params, name="view_form", action="/wizard/action") buttons = [] for x in res.get('state', []): x = list(x) x[1] = re.sub('_(?!_)', '', x[1]) # remove mnemonic if len(x) >= 3: x[2] = icons.get_icon(x[2]) buttons.append(tuple(x)) params.state = state target = getattr(cherrypy.request, '_terp_view_target', None) return dict(form=form, buttons=buttons, show_header_footer=target!='new') elif res['type']=='action': from openerp.controllers import actions act_res = actions.execute(res['action'], **datas) if act_res: return act_res state = res['state'] elif res['type']=='print': from openerp.controllers import actions datas['report_id'] = res.get('report_id', False) if res.get('get_id_from_action', False): backup_ids = datas['ids'] datas['ids'] = datas['form']['ids'] return actions.execute_report(res['report'], **datas) elif res['type']=='state': state = res['state'] raise redirect('/wizard/end')
def ok(self, **kw): params, data = TinyDict.split(kw) proxy = rpc.RPCProxy('res.users') proxy.write([rpc.session.uid], data) rpc.session.context_reload() raise redirect('/pref/create')
def index(self, *args, **kw): raise tools.redirect('/')
def logout(self): """ Logout method, will terminate the current session. """ rpc.session.logout() raise redirect('/')
def index(self, *args, **kw): raise redirect('/database/create')
class Database(object): @expose() def index(self, *args, **kw): raise redirect('/database/create') @expose(template="templates/database.mako") def create(self, tg_errors=None, **kw): form = _FORMS['create'] return dict(form=form) @expose() @validate(form=_FORMS['create']) @error_handler(create) def do_create(self, password, dbname, admin_password, confirm_password, demo_data=False, language=None, **kw): if not re.match('^[a-zA-Z][a-zA-Z0-9_]+$', dbname): raise common.warning( _('The database name must contain only normal characters or "_".\nYou must avoid all accents, space or special characters.' ), _('Bad database name!')) ok = False try: res = rpc.session.execute_db('create', password, dbname, demo_data, language, admin_password) while True: try: progress, users = rpc.session.execute_db( 'get_progress', password, res) if progress == 1.0: for x in users: if x['login'] == 'admin': rpc.session.login(dbname, 'admin', password) ok = True break else: time.sleep(1) except: raise Exception('DbFailed') except Exception, e: if e.args == ('DbExist', ): raise common.warning(_("Could not create database."), _('Database already exists!')) elif e.args == ('DbFailed'): raise common.warning( _("The server crashed during installation.\nWe suggest you to drop this database." ), _("Error during database creation!")) elif getattr(e, 'faultCode', False) == 'AccessDenied': raise common.warning(_('Bad database administrator password!'), _("Could not create database.")) else: raise common.warning(_("Could not create database.")) if ok: raise redirect('/') raise redirect('/login', db=dbname)
def save(self, terp_save_only=False, **kw): """Controller method to save/button actions... @param tg_errors: TG special arg, used durring validation @param kw: keyword arguments @return: form view """ params, data = TinyDict.split(kw) # remember the current page (tab) of notebooks cherrypy.session['remember_notebooks'] = True # bypass save, for button action in non-editable view if not (params.button and not params.editable and params.id): proxy = rpc.RPCProxy(params.model) if not params.id: ctx = params.context or {} ctx.update(rpc.session.context.copy()) id = proxy.create(data, ctx) params.ids = (params.ids or []) + [int(id)] params.id = int(id) params.count += 1 else: ctx = tools.context_with_concurrency_info( params.context, params.concurrency_info) id = proxy.write([params.id], data, ctx) button = params.button # perform button action if params.button: res = self.button_action(params) if res: return res current = params.chain_get(params.source or '') if current: current.id = None if not params.id: params.id = int(id) elif not button: params.editable = False if terp_save_only: return dict(params=params, data=data) def get_params(p, f): pp = p.chain_get(f) px = rpc.RPCProxy(p.model) _ids = pp.ids _all = px.read([p.id], [f])[0][f] _new = [i for i in _all if i not in _ids] pp.ids = _all if _new: pp.id = _new[0] return pp if params.source and len(params.source.split("/")) > 1: path = params.source.split("/") p = params for f in path: p = get_params(p, f) return self.create(params) args = { 'model': params.model, 'id': params.id, 'ids': ustr(params.ids), 'view_ids': ustr(params.view_ids), 'view_mode': ustr(params.view_mode), 'domain': ustr(params.domain), 'context': ustr(params.context), 'offset': params.offset, 'limit': params.limit, 'count': params.count, 'search_domain': ustr(params.search_domain) } if not int(cherrypy.request.params.get('_terp_header_footer', 1)): args['target'] = 'new' if params.editable or params.source or params.return_edit: raise redirect(self.path + '/edit', source=params.source, **args) raise redirect(self.path + '/view', **args)
def execute(self, params): action = params.name model = params.model state = params.state datas = params.datas form = None buttons = [] if model: action = model.replace('wizard.', '', 1) else: model = 'wizard.' + action params.name = action params.model = model params.view_mode = [] if 'form' not in datas: datas['form'] = {} wiz_id = params.wiz_id or rpc.session.execute('wizard', 'create', action) while state != 'end': ctx = rpc.session.context.copy() ctx.update(datas.get('context' or {}) or {}) res = rpc.session.execute('wizard', 'execute', wiz_id, datas, state, ctx) if 'datas' in res: datas['form'].update(res['datas']) else: res['datas'] = {} if res['type'] == 'form': fields = res['fields'] form_values = {} for f in fields: if 'value' in fields[f]: form_values[f] = fields[f]['value'] if f in datas['form'] and fields[f]['type'] == "one2many": datas['form'][f] = [(1, d, {}) for d in datas['form'][f]] form_values.update(datas['form']) datas['form'] = form_values res['datas'].update(datas['form']) params.is_wizard = True params.view_mode = ['form'] params.view_type = 'form' params.views = {'form': res} # keep track of datas and some other required information params.hidden_fields = [ tw.form.Hidden(name='_terp_datas', default=ustr(datas)), tw.form.Hidden(name='_terp_state2', default=state), tw.form.Hidden(name='_terp_wiz_id', default=wiz_id) ] form = tw.form_view.ViewForm(params, name="view_form", action="/wizard/action") buttons = [] for x in res.get('state', []): x = list(x) x[1] = re.sub('_(?!_)', '', x[1]) # remove mnemonic if len(x) >= 3: x[2] = icons.get_icon(x[2]) buttons.append(tuple(x)) params.state = state target = getattr(cherrypy.request, '_terp_view_target', None) return dict(form=form, buttons=buttons, show_header_footer=target != 'new') elif res['type'] == 'action': from openerp.controllers import actions act_res = actions.execute(res['action'], **datas) if act_res: return act_res state = res['state'] elif res['type'] == 'print': from openerp.controllers import actions datas['report_id'] = res.get('report_id', False) if res.get('get_id_from_action', False): backup_ids = datas['ids'] datas['ids'] = datas['form']['ids'] return actions.execute_report(res['report'], **datas) elif res['type'] == 'state': state = res['state'] raise redirect('/wizard/end')
return dict(form=form) @expose() @validate(form=_FORMS['drop']) @error_handler(drop) def do_drop(self, dbname, password, **kw): try: rpc.session.execute_db('drop', password, dbname) except Exception, e: if getattr(e, 'faultCode', False) == 'AccessDenied': raise common.warning(_('Bad database administrator password!'), _("Could not drop database.")) else: raise common.warning(_("Couldn't drop database")) raise redirect("/database/drop") @expose(template="templates/database.mako") def backup(self, tg_errors=None, **kw): form = _FORMS['backup'] return dict(form=form) @expose() @validate(form=_FORMS['backup']) @error_handler(backup) def do_backup(self, dbname, password, **kw): try: res = rpc.session.execute_db('dump', password, dbname) if res: cherrypy.response.headers['Content-Type'] = "application/data" cherrypy.response.headers[
form = _FORMS['drop'] return dict(form=form) @expose() @validate(form=_FORMS['drop']) @error_handler(drop) def do_drop(self, dbname, password, **kw): try: rpc.session.execute_db('drop', password, dbname) except Exception, e: if getattr(e, 'faultCode', False) == 'AccessDenied': raise common.warning(_('Bad database administrator password!'), _("Could not drop database.")) else: raise common.warning(_("Couldn't drop database")) raise redirect("/database/drop") @expose(template="templates/database.mako") def backup(self, tg_errors=None, **kw): form = _FORMS['backup'] return dict(form=form) @expose() @validate(form=_FORMS['backup']) @error_handler(backup) def do_backup(self, dbname, password, **kw): try: res = rpc.session.execute_db('dump', password, dbname) if res: cherrypy.response.headers['Content-Type'] = "application/data" cherrypy.response.headers['Content-Disposition'] = 'filename="' + dbname + '.dump"';