def _get_model(node, parent_model): parents = [] pnode = node.parentNode while pnode: if pnode.localName == 'field': ch = [] ch += tools.xml_locate('./form[1]', pnode) ch += tools.xml_locate('./tree[1]', pnode) ch += tools.xml_locate('./graph[1]', pnode) ch += tools.xml_locate('./calendar[1]', pnode) if ch: parents += [pnode.getAttribute('name')] pnode = pnode.parentNode parents.reverse() for parent in parents: proxy = rpc.RPCProxy(parent_model) field = proxy.fields_get([parent]) 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) proxy = rpc.RPCProxy('ir.ui.view') res = proxy.read([view_id], ['model', 'arch'])[0] doc = xml.dom.minidom.parseString(res['arch'].encode('utf-8')) model = res['model'] field_node = tools.xml_locate(xpath_expr, doc)[0] model = _get_model(field_node, parent_model=model) # get the fields proxy = rpc.RPCProxy(model) fields = proxy.fields_get().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 = tools.xml_locate(xpath_expr, doc)[0] new_node = None record = None if _terp_what == "properties": attrs = tools.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 = tools.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: 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 = tools.xml_locate(xpath_expr, doc)[0] attrs = tools.node_attributes(field) editors = [] properties = _PROPERTIES.get(field.localName, []) if field.localName == 'field': kind = 'char' try: model = _get_model(field, parent_model=res['model']) proxy = rpc.RPCProxy(model) attrs2 = proxy.fields_get([attrs['name']])[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 += 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 += [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 reload = False view_id = int(view_id) rec_id = view_id proxy = rpc.RPCProxy('ir.ui.view') data = proxy.read([view_id])[0] doc = xml.dom.minidom.parseString(data['arch'].encode('utf-8')) pnode = tools.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: proxy.write(view_id, dict(arch=doc.toxml(encoding="utf-8"))) except Exception, e: error = str(e)
class ViewEd(SecuredController): new_field = NewField() new_model = NewModel() preview = Preview() @expose(template="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.")) proxy = rpc.RPCProxy('ir.ui.view') res = proxy.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 = tw.treegrid.TreeGrid('view_tree', model=model, headers=headers, url='/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 = tools.get_xpath(node, node2.getAttribute('expr')) 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 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', '') proxy = rpc.RPCProxy('ir.ui.view') res = proxy.read([view_id])[0] def _inherit_apply_rec(result, inherit_id): # get all views which inherit from (ie modify) this view inherit_ids = proxy.search([('inherit_id', '=', inherit_id)], 0, 0, 'priority') inherit_res = proxy.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) res = {'model': res['model'], 'view_id' : view_id, 'view_type': res['type'], 'arch' : new_doc.toxml().replace('\t', '')} return res def get_node_instance(self, node, model, view_id=False, view_type='form'): field_attrs = _get_field_attrs(node, parent_model=model) attrs = tools.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 = tools.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 += [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="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 = tools.xml_locate(xpath_expr, doc)[0] attrs = tools.node_attributes(field) editors = [] properties = _PROPERTIES.get(field.localName, []) if field.localName == 'field': kind = 'char' try: model = _get_model(field, parent_model=res['model']) proxy = rpc.RPCProxy(model) attrs2 = proxy.fields_get([attrs['name']])[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 += 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 += [ed] return dict(view_id=view_id, xpath_expr=xpath_expr, editors=editors) @expose(template="templates/viewed_add.mako") def add(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')) model = res['model'] field_node = tools.xml_locate(xpath_expr, doc)[0] model = _get_model(field_node, parent_model=model) # get the fields proxy = rpc.RPCProxy(model) fields = proxy.fields_get().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 = tools.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: 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: proxy = rpc.RPCProxy('ir.ui.view') proxy.unlink(view_id) try: cache.clear() except: 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 = tools.xml_locate(xpath_expr, doc)[0] new_node = None record = None if _terp_what == "properties": attrs = tools.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 = tools.xml_locate(kw['xpath_ref'], doc)[0] except: pass pnode = node.parentNode newNode = pnode.removeChild(node) pnode.insertBefore(newNode, refNode)