예제 #1
0
파일: viewed.py 프로젝트: hectord/unifield
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
예제 #2
0
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
예제 #3
0
파일: viewed.py 프로젝트: hectord/unifield
    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)
예제 #4
0
    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)
예제 #5
0
    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)
예제 #6
0
    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))
예제 #7
0
파일: viewed.py 프로젝트: hectord/unifield
    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))
예제 #8
0
파일: viewed.py 프로젝트: hectord/unifield
    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)
예제 #9
0
    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)
예제 #10
0
파일: viewed.py 프로젝트: hectord/unifield
    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)
예제 #11
0
파일: viewed.py 프로젝트: hectord/unifield
    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)
예제 #12
0
    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)
예제 #13
0
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)