def get_o2m_defaults(self, o2m_values, model, o2m_model, name, view_type, view_id, o2m_view_type, o2m_view_id, editable, limit, offset, o2m_context, o2m_domain): view_id = view_id or False o2m_view_id = ast.literal_eval(o2m_view_id) or False o2m_view_type = o2m_view_type or 'form' context = dict(ast.literal_eval(o2m_context), **rpc.get_session().context) o2m_values = simplejson.loads(o2m_values) for o2m in o2m_values: o2m['id'] = 0 if o2m_view_id: view = cache.fields_view_get(o2m_model, o2m_view_id, o2m_view_type, context) else: view = cache.fields_view_get(model, view_id, view_type, rpc.get_session().context) view = view['fields'][name]['views'][o2m_view_type] list_view = listgrid.List(name, model, view, ids=None, domain=o2m_domain, context=context, default_data=copy.deepcopy(o2m_values), limit=20, editable= editable,o2m=1) view=ustr(list_view.render()) formated_o2m_values = [] for o2m in o2m_values: o2m.pop('id', None) formated_o2m_values.append((0, 0, o2m)) return dict(view=view, formated_o2m_values=ustr(formated_o2m_values))
def multiple_groupby(self, model, name, grp_domain, group_by, view_id, view_type, parent_group, group_level, groups, no_leaf, **kw): grp_domain = ast.literal_eval(grp_domain) view = cache.fields_view_get(model, view_id, view_type, rpc.session.context.copy()) group_by = ast.literal_eval(group_by) domain = grp_domain params = TinyDict(**kw) editable = params.editable selectable = params.selectable or 2 context = params.context or {} context.update({'group_by_no_leaf': int(no_leaf), 'group_by': group_by, '__domain': domain}) group_level = ast.literal_eval(group_level) groups = ast.literal_eval(groups) offset = params.offset or 0 limit = params.limit or 20 args = {'editable': editable, 'view_mode': ['tree', 'form', 'calendar', 'graph'], 'nolinks': 1, 'group_by_ctx': group_by, 'selectable': selectable, 'multiple_group_by': True, 'offset': offset, 'limit': limit, 'sort_key': kw.get('sort_key'), 'sort_order': kw.get('sort_order')} listgrp = listgroup.MultipleGroup(name, model, view, ids=None, domain= domain, parent_group=parent_group, group_level=group_level, groups=groups, context=context, **args) return listgrp.render()
def index(self, domain, context, view_id, search_domain='[]', action_id=None): context = ast.literal_eval(context) if not action_id: # This should not be needed anymore, but just in case users are # running the module with an older version of the web client... # to remove soon-ish action_id = rpc.RPCProxy('ir.actions.act_window').search( [('view_id','=',int(view_id))], context=context) if not action_id: return "" action_id = action_id[0] domain = ast.literal_eval(domain) domain.extend(ast.literal_eval(search_domain)) scheme, netloc, _, _, _ = urlparse.urlsplit(cherrypy.request.base) share_root_url = urlparse.urlunsplit(( scheme, netloc, '/openerp/login', 'db=%(dbname)s&user=%(login)s&password=%(password)s', '')) context.update( #active_ids=share_wiz_id, #active_id=share_wiz_id[0], _terp_view_name='Share Wizard', share_root_url=share_root_url) Share = rpc.RPCProxy('share.wizard') sharing_view_id = Share.create({ 'domain': str(domain), 'action_id': action_id and int(action_id) }, context) return openerp.controllers.actions.execute( Share.go_step_1([sharing_view_id], context), ids=[sharing_view_id], context=context)
def multiple_groupby(self, model, name, grp_domain, group_by, view_id, view_type, parent_group, group_level, groups, no_leaf, **kw): grp_domain = ast.literal_eval(grp_domain) view = cache.fields_view_get(model, view_id, view_type, rpc.session.context.copy()) group_by = ast.literal_eval(group_by) domain = grp_domain group_level = ast.literal_eval(group_level) groups = ast.literal_eval(groups) # build a new TinyDict to correctly handle _terp_* params params = TinyDict(**kw) editable = params.editable selectable = params.selectable or 2 context = params.context or {} context.update({'group_by_no_leaf': int(no_leaf), 'group_by': group_by, '__domain': domain}) # we force offset to 0, as in group_by mode only 'limit' have an effect # (offset pagination in only for base grouping - which is handled by ListGroup) offset = 0 limit = params.limit or 20 args = {'editable': editable, 'view_mode': ['tree', 'form', 'calendar', 'graph'], 'nolinks': 1, 'group_by_ctx': group_by, 'selectable': selectable, 'multiple_group_by': True, 'sort_key': kw.get('sort_key'), 'offset': offset, 'limit': limit, 'sort_order': kw.get('sort_order')} listgrp = listgroup.MultipleGroup(name, model, view, ids=None, domain= domain, parent_group=parent_group, group_level=group_level, groups=groups, context=context, **args) return listgrp.render()
def get_m2m(self, name, model, view_id, view_type, ids): view_id = ast.literal_eval(view_id) or False ids = ast.literal_eval(ids) or [] view = cache.fields_view_get(model, view_id, view_type, rpc.get_session().context) m2m_view = listgrid.List(name, model, view, ids,limit=20, editable=True, m2m=1) m2m_view = ustr(m2m_view.render()) return dict(m2m_view = m2m_view)
def groupbyDrag(self, model, children, domain): domain = ast.literal_eval(domain)[0] children = ast.literal_eval(children) if isinstance(children, list): children = list(children) else: children = [children] rpc.RPCProxy(model).write(children, {domain[0]: domain[2]}) return {}
def get_m2m(self, name, model, view_id, view_type, ids): view_id = ast.literal_eval(view_id) or False ids = ast.literal_eval(ids) or [] view = cache.fields_view_get(model, view_id, view_type, rpc.session.context) m2m_view = listgrid.List(name, model, view, ids, limit=20, editable=True, m2m=1) m2m_view = ustr(m2m_view.render()) return dict(m2m_view=m2m_view)
def multiple_groupby(self, model, name, grp_domain, group_by, view_id, view_type, parent_group, group_level, groups, no_leaf, **kw): grp_domain = ast.literal_eval(grp_domain) view = cache.fields_view_get(model, view_id, view_type, rpc.session.context.copy()) group_by = ast.literal_eval(group_by) domain = grp_domain group_level = ast.literal_eval(group_level) groups = ast.literal_eval(groups) # build a new TinyDict to correctly handle _terp_* params params = TinyDict(**kw) editable = params.editable selectable = params.selectable or 2 context = params.context or {} context.update({ 'group_by_no_leaf': int(no_leaf), 'group_by': group_by, '__domain': domain }) # we force offset to 0, as in group_by mode only 'limit' have an effect # (offset pagination in only for base grouping - which is handled by ListGroup) offset = 0 limit = params.limit or 20 args = { 'editable': editable, 'view_mode': ['tree', 'form', 'calendar', 'graph'], 'nolinks': 1, 'group_by_ctx': group_by, 'selectable': selectable, 'multiple_group_by': True, 'sort_key': kw.get('sort_key'), 'offset': offset, 'limit': limit, 'sort_order': kw.get('sort_order') } listgrp = listgroup.MultipleGroup(name, model, view, ids=None, domain=domain, parent_group=parent_group, group_level=group_level, groups=groups, context=context, **args) return listgrp.render()
def get_text(self): if self.value: if isinstance(self.value, (unicode, str)): return ast.literal_eval(self.value) return int(self.value) return 0
def index(self, payload): decoded_payload = ast.literal_eval( zlib.decompress( base64.urlsafe_b64decode(str(payload)))) action, data = decoded_payload['action'], decoded_payload['data'] cherrypy.request.params.update(decoded_payload) return actions.execute(action, **data)
def menu(self, active=None, next=None): from openerp.widgets import tree_view try: id = int(active) except: id = False form.Form().reset_notebooks() ctx = rpc.session.context.copy() menus = rpc.RPCProxy("ir.ui.menu") domain = [('parent_id', '=', False)] user_menu_action_id = rpc.RPCProxy("res.users").read([rpc.session.uid], ['menu_id'], ctx)[0]['menu_id'] if user_menu_action_id: act = rpc.RPCProxy('ir.actions.act_window').read([user_menu_action_id[0]], ['res_model', 'domain'], ctx)[0] if act['res_model'] == 'ir.ui.menu' and act['domain']: domain = literal_eval(act['domain']) ids = menus.search(domain, 0, 0, 0, ctx) parents = menus.read(ids, ['name', 'action', 'web_icon_data', 'web_icon_hover_data'], ctx) for parent in parents: if parent['id'] == id: parent['active'] = 'active' if parent.get('action') and not next: next = url('/openerp/custom_action', action=id) # If only the hover image exists, use it as regular image as well if parent['web_icon_hover_data'] and not parent['web_icon_data']: parent['web_icon_data'] = parent['web_icon_hover_data'] if next or active: if not id and ids: id = ids[0] ids = menus.search([('parent_id', '=', id)], 0, 0, 0, ctx) tools = menus.read(ids, ['name', 'action'], ctx) #searching id for the hierarchycal tree view of ir.ui.menu view_id = rpc.RPCProxy('ir.ui.view').search([('model','=','ir.ui.menu'),('type','=','tree')],0,0,'id')[0] view = cache.fields_view_get('ir.ui.menu', view_id, 'tree', {}) fields = cache.fields_get(view['model'], False, ctx) for tool in tools: tid = tool['id'] tool['tree'] = tree = tree_view.ViewTree(view, 'ir.ui.menu', tid, domain=[('parent_id', '=', tid)], context=ctx, action="/openerp/tree/action", fields=fields) tree._name = "tree_%s" %(tid) tree.tree.onselection = None tree.tree.onheaderclick = None tree.tree.showheaders = 0 else: # display home action tools = None return dict(parents=parents, tools=tools, load_content=(next and next or ''), welcome_messages=rpc.RPCProxy('publisher_warranty.contract').get_last_user_messages(_MAXIMUM_NUMBER_WELCOME_MESSAGES), show_close_btn=rpc.session.uid == 1, widgets=openobject.pooler.get_pool()\ .get_controller('/openerp/widgets')\ .user_home_widgets(ctx))
def new(self, model, source=None, kind=0, text=None, domain=None, context=None, **kw): """Create new search view... @param model: the model @param source: the source, in case of m2m, m2o search @param kind: 0=normal, 1=m2o, 2=m2m @param text: do `name_search` if text is provided @param domain: the domain @param context: the context """ params = TinyDict() params.model = model params.domain = domain or [] params.context = context or {} params.source = source params.selectable = kind params.limit = params.limit or 50 ctx = dict(rpc.session.context, **(params.context or {})) params.ids = [] proxy = rpc.RPCProxy(model) params.search_text = False # parent's search_view has no business being in m2o or m2m if '_terp_context' in params and 'search_view' in params[ '_terp_context']: params.get('_terp_context').pop('search_view', None) if text: params.search_text = True ids = proxy.name_search(text, params.domain or [], 'ilike', ctx, False) if ids: params.ids = [id[0] for id in ids] # For m2o, when name_search is called, then its result will be added to existing domain params.domain.append(('id', 'in', params.ids)) params.count = len(ids) else: params.context['default_name'] = ustr(text) elif 'default_name' in params.context: del params.context['default_name'] if kw.get('return_to'): params['return_to'] = ast.literal_eval(kw['return_to']) return self.create(params)
def index(self, domain, context, view_id, search_domain='[]', action_id=None): context = ast.literal_eval(context) if not action_id: # This should not be needed anymore, but just in case users are # running the module with an older version of the web client... # to remove soon-ish action_id = rpc.RPCProxy('ir.actions.act_window').search( [('view_id', '=', int(view_id))], context=context) if not action_id: return "" action_id = action_id[0] domain = ast.literal_eval(domain) domain.extend(ast.literal_eval(search_domain)) share_model = 'share.wizard' scheme, netloc, _, _, _ = urlparse.urlsplit(cherrypy.request.base) share_root_url = urlparse.urlunsplit( (scheme, netloc, '/openerp/login', 'db=%(dbname)s&user=%(login)s&password=%(password)s', '')) share_wiz_id = rpc.RPCProxy('ir.ui.menu').search([('name', '=', 'Share Wizard')]) context.update(active_ids=share_wiz_id, active_id=share_wiz_id[0], _terp_view_name='Share Wizard', share_root_url=share_root_url) sharing_view_id = rpc.RPCProxy(share_model).create( { 'domain': str(domain), 'action_id': action_id and int(action_id) }, context) return actions.execute(rpc.session.execute('object', 'execute', share_model, 'go_step_1', [sharing_view_id], context), ids=[sharing_view_id], context=context)
def multiple_groupby(self, model, name, grp_domain, group_by, view_id, view_type, parent_group, group_level, groups, no_leaf, **kw): grp_domain = ast.literal_eval(grp_domain) view = cache.fields_view_get(model, view_id, view_type, rpc.get_session().context.copy()) group_by = ast.literal_eval(group_by) domain = grp_domain group_level = ast.literal_eval(group_level) groups = ast.literal_eval(groups) context = {'group_by_no_leaf': int(no_leaf), 'group_by': group_by, '__domain': domain} args = {'editable': True, 'view_mode': ['tree', 'form', 'calendar', 'graph'], 'nolinks': 1, 'group_by_ctx': group_by, 'selectable': 2, 'multiple_group_by': True, 'sort_key': kw.get('sort_key'), 'sort_order': kw.get('sort_order')} listgrp = listgroup.MultipleGroup(name, model, view, ids=None, domain= domain, parent_group=parent_group, group_level=group_level, groups=groups, context=context, **args) return listgrp.render()
def groupbyDrag(self, model, children, domain, level='0'): """ update records represented by children domain based on groupby domain :param model: model to update :param children: children records domain or children record id :param domain: group_by domain will be convert to values """ domain = ast.literal_eval(domain) children = ast.literal_eval(children) level = ast.literal_eval(level) if isinstance(children, list): children = list(children) else: children = [('id', '=', children)] # convert domain to values values = {} for i, d in enumerate(domain): if len(d) == 3 and i <= level: values[d[0]] = d[2] children_ids = rpc.RPCProxy(model).search(children) rpc.RPCProxy(model).write(children_ids, values) return {}
def groupbyDrag(self, model, children, domain, level='0'): """ update records represented by children domain based on groupby domain :param model: model to update :param children: children records domain or children record id :param domain: group_by domain will be convert to values """ domain = ast.literal_eval(domain) children = ast.literal_eval(children) level = ast.literal_eval(level) if isinstance(children, list): children = list(children) else: children = [('id','=',children)] # convert domain to values values = {} for i, d in enumerate(domain): if len(d) == 3 and i <= level: values[d[0]] = d[2] children_ids = rpc.RPCProxy(model).search(children) rpc.RPCProxy(model).write(children_ids, values) return {}
def new(self, model, source=None, kind=0, text=None, domain=None, context=None, **kw): """Create new search view... @param model: the model @param source: the source, in case of m2m, m2o search @param kind: 0=normal, 1=m2o, 2=m2m @param text: do `name_search` if text is provided @param domain: the domain @param context: the context """ params = TinyDict() params.model = model params.domain = domain or [] params.context = context or {} params.source = source params.selectable = kind params.limit = params.limit or 50 ctx = dict(rpc.session.context, **(params.context or {})) params.ids = [] proxy = rpc.RPCProxy(model) params.search_text = False # parent's search_view has no business being in m2o or m2m if '_terp_context' in params and 'search_view' in params['_terp_context']: params.get('_terp_context').pop('search_view', None) if text: params.search_text = True ids = proxy.name_search(text, params.domain or [], 'ilike', ctx, False) if ids: params.ids = [id[0] for id in ids] # For m2o, when name_search is called, then its result will be added to existing domain params.domain.append(('id','in', params.ids)) params.count = len(ids) else: params.context['default_name'] = ustr(text) elif 'default_name'in params.context: del params.context['default_name'] if kw.get('return_to'): params['return_to'] = ast.literal_eval(kw['return_to']) return self.create(params)
def multiple_groupby(self, model, name, grp_domain, group_by, view_id, view_type, parent_group, group_level, groups, no_leaf, **kw): grp_domain = ast.literal_eval(grp_domain) view = cache.fields_view_get(model, view_id, view_type, rpc.session.context.copy()) group_by = ast.literal_eval(group_by) domain = grp_domain group_level = ast.literal_eval(group_level) groups = ast.literal_eval(groups) context = { 'group_by_no_leaf': int(no_leaf), 'group_by': group_by, '__domain': domain } args = { 'editable': True, 'view_mode': ['tree', 'form', 'calendar', 'graph'], 'nolinks': 1, 'group_by_ctx': group_by, 'selectable': 2, 'multiple_group_by': True, 'sort_key': kw.get('sort_key'), 'sort_order': kw.get('sort_order') } listgrp = listgroup.MultipleGroup(name, model, view, ids=None, domain=domain, parent_group=parent_group, group_level=group_level, groups=groups, context=context, **args) return listgrp.render()
def get_o2m_defaults(self, o2m_values, model, o2m_model, name, view_type, view_id, o2m_view_type, o2m_view_id, editable, limit, offset, o2m_context, o2m_domain): view_id = view_id or False o2m_view_id = ast.literal_eval(o2m_view_id) or False o2m_view_type = o2m_view_type or 'form' context = dict(ast.literal_eval(o2m_context), **rpc.session.context) o2m_values = simplejson.loads(o2m_values) for o2m in o2m_values: o2m['id'] = 0 if o2m_view_id: view = cache.fields_view_get(o2m_model, o2m_view_id, o2m_view_type, context) else: view = cache.fields_view_get(model, view_id, view_type, rpc.session.context) view = view['fields'][name]['views'][o2m_view_type] list_view = listgrid.List(name, model, view, ids=None, domain=o2m_domain, context=context, default_data=copy.deepcopy(o2m_values), limit=20, editable=editable, o2m=1) view = ustr(list_view.render()) formated_o2m_values = [] for o2m in o2m_values: o2m.pop('id', None) formated_o2m_values.append((0, 0, o2m)) return dict(view=view, formated_o2m_values=ustr(formated_o2m_values))
def count_sum(self, model, ids, sum_fields): selected_ids = ast.literal_eval(ids) sum_fields = sum_fields.split(",") ctx = rpc.get_session().context.copy() proxy = rpc.RPCProxy(model) res = proxy.read(selected_ids, sum_fields, ctx) total = [] for field in sum_fields: total.append([]) for i in range(len(selected_ids)): for k in range(len(sum_fields)): total[k].append(res[i][sum_fields[k]]) total_sum = [] for s in total: total_sum.append(str(sum(s))) return dict(sum = total_sum)
def count_sum(self, model, ids, sum_fields): selected_ids = ast.literal_eval(ids) sum_fields = sum_fields.split(",") ctx = rpc.session.context.copy() proxy = rpc.RPCProxy(model) res = proxy.read(selected_ids, sum_fields, ctx) total = [] for field in sum_fields: total.append([]) for i in range(len(selected_ids)): for k in range(len(sum_fields)): total[k].append(res[i][sum_fields[k]]) total_sum = [] for s in total: total_sum.append(str(sum(s))) return dict(sum=total_sum)
def get_fields(self, model, prefix='', name='', field_parent=None, **kw): parent_field = kw.get('ids').split(',')[0].split('/') if len(parent_field) == 1: parent_field = parent_field[0] else: parent_field = parent_field[-2] is_importing = kw.get('is_importing', False) import_compat = bool(int(kw.get('import_compat', True))) try: ctx = ast.literal_eval(kw['context']) except: ctx = {} ctx.update(**rpc.session.context) try: views = ast.literal_eval(kw['views']) except: views = {} fields = _fields_get_all(model, views, ctx) m2ofields = cherrypy.session.get('fld') if m2ofields: for i in m2ofields: if i == parent_field: fields = {} else: m2ofields = [] fields.update({ 'id': { 'string': 'ID' }, '.id': { 'string': 'Database ID' } }) fields_order = fields.keys() fields_order.sort(lambda x, y: -cmp(fields[x].get('string', ''), fields[y].get('string', ''))) records = [] for i, field in enumerate(fields_order): value = fields[field] record = {} if import_compat and value.get('readonly', False): ok = False for sl in value.get('states', {}).values(): for s in sl: ok = ok or (s == ('readonly', False)) if not ok: continue id = prefix + (prefix and '/' or '') + field nm = name + (name and '/' or '') + value['string'] if is_importing and (value.get('type') not in ('reference',)) and (not value.get('readonly') \ or not dict(value.get('states', {}).get('draft', [('readonly', True)])).get('readonly', True)): record.update(id=id, items={'name': nm}, action='javascript: void(0)', target=None, icon=None, children=[], required=value.get('required', False)) records.append(record) elif not is_importing: record.update(id=id, items={'name': nm}, action='javascript: void(0)', target=None, icon=None, children=[]) records.append(record) if len(nm.split('/')) < 3 and value.get('relation', False): if import_compat or is_importing: ref = value.pop('relation') proxy = rpc.RPCProxy(ref) cfields = proxy.fields_get(False, rpc.session.context) if (value['type'] == 'many2many') and not is_importing: record['children'] = None record['params'] = { 'model': ref, 'prefix': id, 'name': nm } elif (value['type'] == 'many2one') or (value['type'] == 'many2many' and is_importing): m2ofields.append(field) cfields_order = cfields.keys() cfields_order.sort( lambda x, y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', ''))) children = [] for j, fld in enumerate(cfields_order): cid = id + '/' + fld cid = cid.replace(' ', '_') children.append(cid) record['children'] = children or None record['params'] = { 'model': ref, 'prefix': id, 'name': nm } cherrypy.session['fld'] = m2ofields else: cfields_order = cfields.keys() cfields_order.sort( lambda x, y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', ''))) children = [] for j, fld in enumerate(cfields_order): cid = id + '/' + fld cid = cid.replace(' ', '_') children.append(cid) record['children'] = children or None record['params'] = { 'model': ref, 'prefix': id, 'name': nm } else: ref = value.pop('relation') proxy = rpc.RPCProxy(ref) cfields = proxy.fields_get(False, rpc.session.context) cfields_order = cfields.keys() cfields_order.sort( lambda x, y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', ''))) children = [] for j, fld in enumerate(cfields_order): cid = id + '/' + fld cid = cid.replace(' ', '_') children.append(cid) record['children'] = children or None record['params'] = {'model': ref, 'prefix': id, 'name': nm} cherrypy.session['fld'] = [] records.reverse() return dict(records=records)
def index(self, payload): decoded_payload = ast.literal_eval( zlib.decompress(base64.urlsafe_b64decode(str(payload)))) action, data = decoded_payload['action'], decoded_payload['data'] cherrypy.request.params.update(decoded_payload) return actions.execute(action, **data)
def eval_domain_filter(self, **kw): all_domains = kw.get('all_domains') custom_domains = kw.get('custom_domain') all_domains = eval(all_domains) domains = all_domains.get('domains') selection_domain = all_domains.get('selection_domain') search_context = all_domains.get('search_context') group_by_ctx = kw.get('group_by_ctx', []) if isinstance(group_by_ctx, str): group_by_ctx = cleanup_group_by(group_by_ctx).split(',') filter_status = all_domains.get('filter_status') if isinstance(filter_status, str): filter_status = ast.literal_eval(filter_status) if domains: domains = eval(domains) ctx = {} for fld_name, src_context in search_context.iteritems(): c = src_context.get('context', {}) v = src_context.get('value') if v and isinstance(v, basestring) and '__' in v: value, operator = v.split('__') v = int(value) ctx.update(expr_eval(c, {'self':v})) context = rpc.session.context if ctx: ctx.update(context) domain = [] check_domain = all_domains.get('check_domain') if check_domain and isinstance(check_domain, basestring): domain = expr_eval(check_domain, context) or [] search_data = {} model = kw.get('model') proxy = rpc.RPCProxy(model) res = proxy.fields_get(False, context) all_error = [] fld = {} if domains: for field, value in domains.iteritems(): if '/' in field: fieldname, bound = field.split('/') else: fieldname = field bound = '' data = {} fld['type'] = res[fieldname].get('type') if fld['type'] == 'many2many': fld['type'] = 'char' fld['value'] = value data[field] = fld try: frm = TinyForm(**data).to_python() except TinyFormError, e: error_field = e.field error = ustr(e) all_error.append(dict(error=error, error_field=error_field)) continue if bound in ('from', 'to'): if bound == 'from': test = '>=' else: test = '<=' convert_format = openobject.i18n.format.convert_date_format_in_domain([(fieldname, test, value)], res, context) domain.append(convert_format[0]) search_data.setdefault(fieldname, {})[bound] = convert_format[0][2] elif isinstance(value, bool) and value: search_data[field] = 1 elif isinstance(value, int) and not isinstance(value, bool): domain.append((field, '=', value)) search_data[field] = value elif 'selection_' in value: domain.append((field, '=', value.split('selection_')[1])) search_data[field] = value.split('selection_')[1] elif fld['type'] == 'selection': domain.append((field, '=', value)) search_data[field] = value else: if not 'm2o_' in value: operator = 'ilike' if '__' in value: value, operator = value.split('__') value = int(value) domain.append((field, operator, value)) search_data[field] = value else: search_data[field] = value.split('m2o_')[1] if all_error: return dict(all_error=all_error)
def get_fields(self, model, prefix='', name='', field_parent=None, **kw): parent_field = kw.get('ids').split(',')[0].split('/') if len(parent_field) == 1: parent_field = parent_field[0] else: parent_field = parent_field[-2] is_importing = kw.get('is_importing', False) import_compat= bool(int(kw.get('import_compat', True))) try: ctx = ast.literal_eval(kw['context']) except: ctx = {} ctx.update(**rpc.get_session().context) try: views = ast.literal_eval(kw['views']) except: views = {} fields = _fields_get_all(model, views, ctx) m2ofields = cherrypy.session.get('fld') if m2ofields: for i in m2ofields: if i == parent_field: fields = {} else: m2ofields = [] fields.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}}) fields_order = fields.keys() fields_order.sort(lambda x,y: -cmp(fields[x].get('string', ''), fields[y].get('string', ''))) records = [] for i, field in enumerate(fields_order): value = fields[field] record = {} if import_compat and value.get('readonly', False): ok = False for sl in value.get('states', {}).values(): for s in sl: ok = ok or (s==('readonly',False)) if not ok: continue id = prefix + (prefix and '/' or '') + field nm = name + (name and '/' or '') + value['string'] if is_importing and (value.get('type') not in ('reference',)) and (not value.get('readonly') \ or not dict(value.get('states', {}).get('draft', [('readonly', True)])).get('readonly', True)): record.update(id=id, items={'name': nm}, action='javascript: void(0)', target=None, icon=None, children=[], required=value.get('required', False)) records.append(record) elif not is_importing: record.update(id=id, items={'name': nm}, action='javascript: void(0)', target=None, icon=None, children=[], required=value.get('required', False)) records.append(record) if len(nm.split('/')) < 3 and value.get('relation', False): if import_compat or is_importing: ref = value.pop('relation') proxy = rpc.RPCProxy(ref) cfields = proxy.fields_get(False, rpc.get_session().context) if (value['type'] == 'many2many') and not is_importing: record['children'] = None record['params'] = {'model': ref, 'prefix': id, 'name': nm} elif (value['type'] == 'many2one') or (value['type'] == 'many2many' and is_importing): m2ofields.append(field) cfields_order = cfields.keys() cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', ''))) children = [] for j, fld in enumerate(cfields_order): cid = id + '/' + fld cid = cid.replace(' ', '_') children.append(cid) record['children'] = children or None record['params'] = {'model': ref, 'prefix': id, 'name': nm} cherrypy.session['fld'] = m2ofields else: cfields_order = cfields.keys() cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', ''))) children = [] for j, fld in enumerate(cfields_order): cid = id + '/' + fld cid = cid.replace(' ', '_') children.append(cid) record['children'] = children or None record['params'] = {'model': ref, 'prefix': id, 'name': nm} else: ref = value.pop('relation') proxy = rpc.RPCProxy(ref) cfields = proxy.fields_get(False, rpc.get_session().context) cfields_order = cfields.keys() cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', ''))) children = [] for j, fld in enumerate(cfields_order): cid = id + '/' + fld cid = cid.replace(' ', '_') children.append(cid) record['children'] = children or None record['params'] = {'model': ref, 'prefix': id, 'name': nm} cherrypy.session['fld'] = [] records.reverse() return dict(records=records)
search_data[field] = value else: search_data[field] = value.split('m2o_')[1] if all_error: return dict(all_error=all_error) if not custom_domains: custom_domains = [] else: try: # from JS custom filters, data is sent as JSON custom_domains = simplejson.loads(custom_domains) except simplejson.decoder.JSONDecodeError: # from switchView, data is sent as Python literals # (with unicode strings and keys) custom_domains = ast.literal_eval(custom_domains) # conversion of the pseudo domain from the javascript to a valid domain ncustom_domain = [] for i in xrange(max(len(custom_domains) - 1, 0)): ncustom_domain.append("|") for and_list in custom_domains: for i in xrange(max(len(and_list) - 1, 0)): ncustom_domain.append("&") ncustom_domain += [tuple(x) for x in and_list] if selection_domain and selection_domain not in ['blk', 'sf', 'mf']: selection_domain = expr_eval(selection_domain) if selection_domain: domain.extend(selection_domain)
def eval_domain_filter(self, **kw): all_domains = kw.get('all_domains') custom_domains = kw.get('custom_domain') all_domains = eval(all_domains) domains = all_domains.get('domains') selection_domain = all_domains.get('selection_domain') search_context = all_domains.get('search_context') group_by_ctx = kw.get('group_by_ctx', []) if isinstance(group_by_ctx, str): group_by_ctx = cleanup_group_by(group_by_ctx).split(',') filter_status = all_domains.get('filter_status') if isinstance(filter_status, str): filter_status = ast.literal_eval(filter_status) if domains: domains = eval(domains) c = search_context.get('context', {}) v = search_context.get('value') if v and isinstance(v, basestring) and '__' in v: value, operator = v.split('__') v = int(value) ctx = expr_eval(c, {'self': v}) context = rpc.session.context if ctx: ctx.update(context) domain = [] check_domain = all_domains.get('check_domain') if check_domain and isinstance(check_domain, basestring): domain = expr_eval(check_domain, context) or [] m2o_filter_domain = all_domains.get('m2o_filter_domain', []) for dom in m2o_filter_domain: domain += expr_eval(dom['domain'], {'self': dom['self']}) or [] search_data = {} model = kw.get('model') proxy = rpc.RPCProxy(model) res = proxy.fields_get(False, context) all_error = [] fld = {} if domains: for field, value in domains.iteritems(): if '/' in field: fieldname, bound = field.split('/') else: fieldname = field bound = '' data = {} fld['type'] = res[fieldname].get('type') if fld['type'] == 'many2many': fld['type'] = 'char' fld['value'] = value data[field] = fld try: frm = TinyForm(**data).to_python() except TinyFormError, e: error_field = e.field error = ustr(e) all_error.append(dict(error=error, error_field=error_field)) continue if bound in ('from', 'to'): if bound == 'from': test = '>=' else: test = '<=' convert_format = openobject.i18n.format.convert_date_format_in_domain( [(fieldname, test, value)], res, context) domain.append(convert_format[0]) search_data.setdefault(fieldname, {})[bound] = convert_format[0][2] elif isinstance(value, bool) and value: search_data[field] = 1 elif isinstance(value, int) and not isinstance(value, bool): domain.append((field, '=', value)) search_data[field] = value elif 'selection_' in value: domain.append((field, '=', value.split('selection_')[1])) search_data[field] = value.split('selection_')[1] elif fld['type'] == 'selection': domain.append((field, '=', value)) search_data[field] = value else: if not 'm2o_' in value: operator = 'ilike' if '__' in value: value, operator = value.split('__') value = int(value) domain.append((field, operator, value)) search_data[field] = value else: search_data[field] = value.split('m2o_')[1] if all_error: return dict(all_error=all_error)