def _get_model(node, parent_model): parents = [] pnode = node.parentNode while pnode: if pnode.localName == 'field': ch = utils.xml_locate('./form[1]', pnode) \ + utils.xml_locate('./tree[1]', pnode) \ + utils.xml_locate('./graph[1]', pnode) \ + utils.xml_locate('./calendar[1]', pnode) if ch: parents.append(pnode.getAttribute('name')) pnode = pnode.parentNode parents.reverse() for parent in parents: field = rpc.RPCProxy(parent_model).fields_get([parent], rpc.session.context) if field: if field[parent].get('relation'): parent_model = field[parent]['relation'] return parent_model
def add(self, view_id, xpath_expr): view_id = int(view_id) res = rpc.RPCProxy('ir.ui.view').read([view_id], ['model', 'arch'])[0] doc = xml.dom.minidom.parseString(res['arch'].encode('utf-8')) model = res['model'] field_node = utils.xml_locate(xpath_expr, doc)[0] model = _get_model(field_node, parent_model=model) # get the fields fields = rpc.RPCProxy(model).fields_get(False, rpc.session.context).keys() nodes = _CHILDREN.keys() nodes.remove('view') nodes.sort() fields.sort() positions = [('inside', 'Inside'), ('after', 'After'), ('before', 'Before')] if field_node.localName in [k for k,v in _CHILDREN.items() if not v] + ['field']: positions = [('after', 'After'), ('before', 'Before'), ('inside', 'Inside')] return dict(view_id=view_id, xpath_expr=xpath_expr, nodes=nodes, fields=fields, model=model, positions=positions)
def create_view(self, view_id=False, xpath_expr=None, **kw): view_id = int(view_id) proxy = rpc.RPCProxy('ir.ui.view') res = proxy.read([view_id], ['model', 'type', 'arch'])[0] model = res['model'] view_type = res['type'] error = None record = None if view_id: doc = xml.dom.minidom.parseString(res['arch'].encode('utf-8')) node = utils.xml_locate(xpath_expr, doc)[0] new_node = doc.createElement('view') if node.localName == 'field': data = { 'name': res['model'] + '.' + str(random.randint(0, 100000)) + '.inherit', 'model': res['model'], 'priority': 16, 'type': view_type, 'inherit_id': view_id } arch = """<?xml version="1.0"?> <field name="%s" position="after"> </field>""" % (node.getAttribute('name')) data['arch'] = arch try: view_id = proxy.create(data) record = self.get_node_instance(new_node, model, view_id, view_type).get_record() node.setAttribute('position', 'after') record['children'] = [ self.get_node_instance(node, model, view_id, view_type).get_record() ] except: error = _("Unable to create inherited view.") else: error = _("Can't create inherited view here.") else: error = _("Not implemented yet!") try: cache.clear() except Exception: pass return dict(record=record, error=error)
def add(self, view_id, xpath_expr): view_id = int(view_id) res = rpc.RPCProxy('ir.ui.view').read([view_id], ['model', 'arch'])[0] doc = xml.dom.minidom.parseString(res['arch'].encode('utf-8')) model = res['model'] field_node = utils.xml_locate(xpath_expr, doc)[0] model = _get_model(field_node, parent_model=model) # get the fields fields = rpc.RPCProxy(model).fields_get(False, rpc.session.context).keys() nodes = _CHILDREN.keys() nodes.remove('view') nodes.sort() fields.sort() positions = [('inside', 'Inside'), ('after', 'After'), ('before', 'Before')] if field_node.localName in [k for k, v in _CHILDREN.items() if not v ] + ['field']: positions = [('after', 'After'), ('before', 'Before'), ('inside', 'Inside')] return dict(view_id=view_id, xpath_expr=xpath_expr, nodes=nodes, fields=fields, model=model, positions=positions)
def save(self, _terp_what, view_id, xpath_expr, **kw): view_id = int(view_id) proxy = rpc.RPCProxy('ir.ui.view') res = proxy.read([view_id], ['model', 'type', 'arch'])[0] model = res['model'] view_type = res['type'] doc = xml.dom.minidom.parseString(res['arch'].encode('utf-8')) node = utils.xml_locate(xpath_expr, doc)[0] new_node = None record = None if _terp_what == "properties": attrs = utils.node_attributes(node) for attr in attrs: node.removeAttribute(attr) for attr, val in kw.items(): if val: node.setAttribute(attr, val) elif _terp_what == "node" and node.parentNode: new_node = doc.createElement(kw['node']) if new_node.localName == "field": new_node.setAttribute('name', kw.get('name', new_node.localName)) elif new_node.localName == "notebook": page = doc.createElement('page') page.setAttribute('string', 'Page 1') new_node.appendChild(page) pnode = node.parentNode position = kw['position'] try: if position == 'after': pnode.insertBefore(new_node, node.nextSibling) if position == 'before': pnode.insertBefore(new_node, node) if position == 'inside': node.appendChild(new_node) except Exception, e: return dict(error=ustr(e))
def create_view(self, view_id=False, xpath_expr=None, **kw): view_id = int(view_id) proxy = rpc.RPCProxy('ir.ui.view') res = proxy.read([view_id], ['model', 'type', 'arch'])[0] model = res['model'] view_type = res['type'] error = None record = None if view_id: doc = xml.dom.minidom.parseString(res['arch'].encode('utf-8')) node = utils.xml_locate(xpath_expr, doc)[0] new_node = doc.createElement('view') if node.localName == 'field': data = {'name' : res['model'] + '.' + str(random.randint(0, 100000)) + '.inherit', 'model' : res['model'], 'priority' : 16, 'type' : view_type, 'inherit_id' : view_id} arch = """<?xml version="1.0"?> <field name="%s" position="after"> </field>""" % (node.getAttribute('name')) data['arch'] = arch try: view_id = proxy.create(data) record = self.get_node_instance(new_node, model, view_id, view_type).get_record() node.setAttribute('position', 'after') record['children'] = [self.get_node_instance(node, model, view_id, view_type).get_record()] except: error = _("Unable to create inherited view.") else: error = _("Can't create inherited view here.") else: error = _("Not implemented yet!") try: cache.clear() except Exception: pass return dict(record=record, error=error)
def edit(self, view_id, xpath_expr): view_id = int(view_id) proxy = rpc.RPCProxy('ir.ui.view') res = proxy.read([view_id], ['model', 'arch'])[0] doc = xml.dom.minidom.parseString(res['arch'].encode('utf-8')) field = utils.xml_locate(xpath_expr, doc)[0] attrs = utils.node_attributes(field) editors = [] properties = _PROPERTIES.get(field.localName, []) if field.localName == 'field': kind = 'char' try: model = _get_model(field, parent_model=res['model']) attrs2 = cache.fields_get(model, [attrs['name']], rpc.session.context)[attrs['name']] attrs2.update(attrs) if attrs2.get('widget', False): if attrs2['widget'] == 'one2many_list': attrs2['widget'] = 'one2many' attrs2['type'] = attrs2['widget'] kind = attrs2.get('type', kind) except: pass properties = _PROPERTIES_FIELDS.get(kind) or properties properties = properties[:] properties.extend(list(set(attrs.keys()) - set(properties))) for prop in properties: if field.localName == 'action' and prop == 'name': ed = ActionProperty(prop, attrs.get(prop)) elif field.localName == 'button' and prop in _PROPERTY_WIDGETS_BUTTON: ed = _PROPERTY_WIDGETS_BUTTON[prop](prop, attrs.get(prop)) else: ed = get_property_widget(prop, attrs.get(prop)) ed.label = prop editors.append(ed) return dict(view_id=view_id, xpath_expr=xpath_expr, editors=editors)
def edit(self, view_id, xpath_expr): view_id = int(view_id) proxy = rpc.RPCProxy('ir.ui.view') res = proxy.read([view_id], ['model', 'arch'])[0] doc = xml.dom.minidom.parseString(res['arch'].encode('utf-8')) field = utils.xml_locate(xpath_expr, doc)[0] attrs = utils.node_attributes(field) editors = [] properties = _PROPERTIES.get(field.localName, []) if field.localName == 'field': kind = 'char' try: model = _get_model(field, parent_model=res['model']) attrs2 = cache.fields_get(model, [attrs['name']], rpc.session.context)[attrs['name']] attrs2.update(attrs) if attrs2.get('widget', False): if attrs2['widget']=='one2many_list': attrs2['widget']='one2many' attrs2['type'] = attrs2['widget'] kind = attrs2.get('type', kind) except: pass properties = _PROPERTIES_FIELDS.get(kind) or properties properties = properties[:] properties.extend(list(set(attrs.keys()) - set(properties))) for prop in properties: if field.localName == 'action' and prop == 'name': ed = ActionProperty(prop, attrs.get(prop)) elif field.localName == 'button' and prop in _PROPERTY_WIDGETS_BUTTON: ed = _PROPERTY_WIDGETS_BUTTON[prop](prop, attrs.get(prop)) else: ed = get_property_widget(prop, attrs.get(prop)) ed.label = prop editors.append(ed) return dict(view_id=view_id, xpath_expr=xpath_expr, editors=editors)
def update_dashboard(self, view_id, dst, src, ref=None): error = None view_id = int(view_id) views = rpc.RPCProxy('ir.ui.view') data = views.read([view_id])[0] doc = xml.dom.minidom.parseString(data['arch'].encode('utf-8')) pnode = utils.xml_locate(dst, doc)[0] src = xml_getElementsByTagAndName('*', src, doc)[0] if ref: ref = xml_getElementsByTagAndName('*', ref, doc)[0] pnode.insertBefore(src, ref) del data['id'] try: views.write(view_id, {'arch': doc.toxml(encoding="utf-8")}) except Exception, e: error = str(e)
class ViewEd(SecuredController): _cp_path = "/openerp/viewed" @expose(template="/openerp/controllers/templates/viewed.mako") def default(self, view_id): try: view_id = eval(view_id) except: pass if isinstance(view_id, basestring) or not view_id: raise common.message(_("Invalid view id.")) res = rpc.RPCProxy('ir.ui.view').read([view_id], ['model', 'type'])[0] model = res['model'] view_type = res['type'] headers = [{ 'string': 'Name', 'name': 'string', 'type': 'char' }, { 'string': '', 'name': 'add', 'type': 'image', 'width': 2 }, { 'string': '', 'name': 'delete', 'type': 'image', 'width': 2 }, { 'string': '', 'name': 'edit', 'type': 'image', 'width': 2 }, { 'string': '', 'name': 'up', 'type': 'image', 'width': 2 }, { 'string': '', 'name': 'down', 'type': 'image', 'width': 2 }] tree = widgets.treegrid.TreeGrid( 'view_tree', model=model, headers=headers, url=url('/openerp/viewed/data?view_id=' + str(view_id))) tree.showheaders = False tree.onselection = 'onSelect' tree.onbuttonclick = 'onButtonClick' tree.expandall = True return dict(view_id=view_id, view_type=view_type, model=model, tree=tree) def view_get(self, view_id=None): def _inherit_apply(src, inherit, inherited_id): def _find(node, node2): # Check if xpath query or normal inherit (with field matching) if node2.nodeType == node2.ELEMENT_NODE and node2.localName == 'xpath': res = utils.get_xpath(node2.getAttribute('expr'), node) return res and res[0] else: if node.nodeType == node.ELEMENT_NODE and node.localName == node2.localName: res = True for attr in node2.attributes.keys(): if attr == 'position': continue if node.hasAttribute(attr): if node.getAttribute( attr) == node2.getAttribute(attr): continue res = False if res: return node for child in node.childNodes: res = _find(child, node2) if res: return res return None doc_src = xml.dom.minidom.parseString(src.encode('utf-8')) doc_dest = xml.dom.minidom.parseString(inherit.encode('utf-8')) for node2 in doc_dest.childNodes: if node2.localName == 'data': continue if not node2.nodeType == node2.ELEMENT_NODE: continue node = _find(doc_src, node2) if node: vnode = doc_dest.createElement('view') vnode.setAttribute('view_id', str(inherited_id)) vnode.appendChild(node2) node.appendChild(vnode) else: attrs = ''.join([ ' %s="%s"' % (attr, node2.getAttribute(attr)) for attr in node2.attributes.keys() if attr != 'position' ]) tag = "<%s%s>" % (node2.localName, attrs) raise AttributeError, "Couldn't find tag '%s' in parent view" % tag return doc_src.toxml().replace('\t', '') views = rpc.RPCProxy('ir.ui.view') res = views.read([view_id])[0] def _inherit_apply_rec(result, inherit_id): # get all views which inherit from (ie modify) this view inherit_ids = views.search([('inherit_id', '=', inherit_id)], 0, 0, 'priority') inherit_res = views.read(inherit_ids, ['arch', 'id']) for res2 in inherit_res: result = _inherit_apply(result, res2['arch'], res2['id']) result = _inherit_apply_rec(result, res2['id']) return result doc_arch = _inherit_apply_rec(res['arch'], view_id) doc_arch = xml.dom.minidom.parseString(doc_arch.encode('utf-8')) new_doc = xml.dom.getDOMImplementation().createDocument( None, 'view', None) new_doc.documentElement.setAttribute('view_id', str(view_id)) new_doc.documentElement.appendChild(doc_arch.documentElement) return { 'model': res['model'], 'view_id': view_id, 'view_type': res['type'], 'arch': new_doc.toxml().replace('\t', '') } def get_node_instance(self, node, model, view_id=False, view_type='form'): field_attrs = _get_field_attrs(node, parent_model=model) attrs = utils.node_attributes(node) view_id = attrs.get('view_id', view_id) view_type = attrs.get('view_type', view_type) attrs['view_id'] = view_id attrs['view_type'] = view_type attrs['__localName__'] = node.localName attrs['__id__'] = random.randrange(1, 10000) attrs.setdefault('name', node.localName) field_attrs.update(attrs) return _NODES.get(node.localName, Node)(field_attrs) def parse(self, root=None, model=None, view_id=False, view_type='form'): result = [] for node in root.childNodes: if not node.nodeType == node.ELEMENT_NODE: continue attrs = utils.node_attributes(node) view_id = attrs.get('view_id', view_id) view_type = attrs.get('view_type', view_type) children = [] if node.childNodes: children = self.parse(node, model=model, view_id=view_id, view_type=view_type) node_instance = self.get_node_instance(node, model=model, view_id=view_id, view_type=view_type) node_instance.children = children result.append(node_instance) return result @expose('json') def data(self, view_id, **kw): view_id = int(view_id) res = self.view_get(view_id) model = res['model'] view_type = res['view_type'] arch = res['arch'] doc = xml.dom.minidom.parseString(arch.encode('utf-8')) result = self.parse(root=doc, model=model, view_id=view_id, view_type=view_type) records = [rec.get_record() for rec in result] return dict(records=records) @expose(template="/openerp/controllers/templates/viewed_edit.mako", methods=('POST', )) def edit(self, view_id, xpath_expr): view_id = int(view_id) proxy = rpc.RPCProxy('ir.ui.view') res = proxy.read([view_id], ['model', 'arch'])[0] doc = xml.dom.minidom.parseString(res['arch'].encode('utf-8')) field = utils.xml_locate(xpath_expr, doc)[0] attrs = utils.node_attributes(field) editors = [] properties = _PROPERTIES.get(field.localName, []) if field.localName == 'field': kind = 'char' try: model = _get_model(field, parent_model=res['model']) attrs2 = cache.fields_get(model, [attrs['name']], rpc.session.context)[attrs['name']] attrs2.update(attrs) if attrs2.get('widget', False): if attrs2['widget'] == 'one2many_list': attrs2['widget'] = 'one2many' attrs2['type'] = attrs2['widget'] kind = attrs2.get('type', kind) except: pass properties = _PROPERTIES_FIELDS.get(kind) or properties properties = properties[:] properties.extend(list(set(attrs.keys()) - set(properties))) for prop in properties: if field.localName == 'action' and prop == 'name': ed = ActionProperty(prop, attrs.get(prop)) elif field.localName == 'button' and prop in _PROPERTY_WIDGETS_BUTTON: ed = _PROPERTY_WIDGETS_BUTTON[prop](prop, attrs.get(prop)) else: ed = get_property_widget(prop, attrs.get(prop)) ed.label = prop editors.append(ed) return dict(view_id=view_id, xpath_expr=xpath_expr, editors=editors) @expose(template="/openerp/controllers/templates/viewed_add.mako") def add(self, view_id, xpath_expr): view_id = int(view_id) res = rpc.RPCProxy('ir.ui.view').read([view_id], ['model', 'arch'])[0] doc = xml.dom.minidom.parseString(res['arch'].encode('utf-8')) model = res['model'] field_node = utils.xml_locate(xpath_expr, doc)[0] model = _get_model(field_node, parent_model=model) # get the fields fields = rpc.RPCProxy(model).fields_get(False, rpc.session.context).keys() nodes = _CHILDREN.keys() nodes.remove('view') nodes.sort() fields.sort() positions = [('inside', 'Inside'), ('after', 'After'), ('before', 'Before')] if field_node.localName in [k for k, v in _CHILDREN.items() if not v ] + ['field']: positions = [('after', 'After'), ('before', 'Before'), ('inside', 'Inside')] return dict(view_id=view_id, xpath_expr=xpath_expr, nodes=nodes, fields=fields, model=model, positions=positions) @expose('json', methods=('POST', )) def create_view(self, view_id=False, xpath_expr=None, **kw): view_id = int(view_id) proxy = rpc.RPCProxy('ir.ui.view') res = proxy.read([view_id], ['model', 'type', 'arch'])[0] model = res['model'] view_type = res['type'] error = None record = None if view_id: doc = xml.dom.minidom.parseString(res['arch'].encode('utf-8')) node = utils.xml_locate(xpath_expr, doc)[0] new_node = doc.createElement('view') if node.localName == 'field': data = { 'name': res['model'] + '.' + str(random.randint(0, 100000)) + '.inherit', 'model': res['model'], 'priority': 16, 'type': view_type, 'inherit_id': view_id } arch = """<?xml version="1.0"?> <field name="%s" position="after"> </field>""" % (node.getAttribute('name')) data['arch'] = arch try: view_id = proxy.create(data) record = self.get_node_instance(new_node, model, view_id, view_type).get_record() node.setAttribute('position', 'after') record['children'] = [ self.get_node_instance(node, model, view_id, view_type).get_record() ] except: error = _("Unable to create inherited view.") else: error = _("Can't create inherited view here.") else: error = _("Not implemented yet!") try: cache.clear() except Exception: pass return dict(record=record, error=error) @expose('json', methods=('POST', )) def remove_view(self, view_id, **kw): view_id = int(view_id) if view_id: rpc.RPCProxy('ir.ui.view').unlink(view_id) try: cache.clear() except Exception: pass return dict() @expose('json', methods=('POST', )) def save(self, _terp_what, view_id, xpath_expr, **kw): view_id = int(view_id) proxy = rpc.RPCProxy('ir.ui.view') res = proxy.read([view_id], ['model', 'type', 'arch'])[0] model = res['model'] view_type = res['type'] doc = xml.dom.minidom.parseString(res['arch'].encode('utf-8')) node = utils.xml_locate(xpath_expr, doc)[0] new_node = None record = None if _terp_what == "properties": attrs = utils.node_attributes(node) for attr in attrs: node.removeAttribute(attr) for attr, val in kw.items(): if val: node.setAttribute(attr, val) elif _terp_what == "node" and node.parentNode: new_node = doc.createElement(kw['node']) if new_node.localName == "field": new_node.setAttribute('name', kw.get('name', new_node.localName)) elif new_node.localName == "notebook": page = doc.createElement('page') page.setAttribute('string', 'Page 1') new_node.appendChild(page) pnode = node.parentNode position = kw['position'] try: if position == 'after': pnode.insertBefore(new_node, node.nextSibling) if position == 'before': pnode.insertBefore(new_node, node) if position == 'inside': node.appendChild(new_node) except Exception, e: return dict(error=ustr(e)) elif _terp_what == "move": refNode = None try: refNode = utils.xml_locate(kw['xpath_ref'], doc)[0] except: pass pnode = node.parentNode newNode = pnode.removeChild(node) pnode.insertBefore(newNode, refNode)