vidhin mehta[Open Erp] has proposed merging lp:~openerp-dev/openerp-web/trunk-View_Editor-parsing_Qweb-vme into lp:~openerp-dev/openerp-web/trunk-view-editor-ysa.
Requested reviews: OpenERP R&D Team (openerp-dev) For more details, see: https://code.launchpad.net/~openerp-dev/openerp-web/trunk-View_Editor-parsing_Qweb-vme/+merge/81679 xml parsing is done with Qweb and other small fixing. -- https://code.launchpad.net/~openerp-dev/openerp-web/trunk-View_Editor-parsing_Qweb-vme/+merge/81679 Your team OpenERP R&D Team is requested to review the proposed merge of lp:~openerp-dev/openerp-web/trunk-View_Editor-parsing_Qweb-vme into lp:~openerp-dev/openerp-web/trunk-view-editor-ysa.
=== modified file 'addons/web/static/src/js/view_editor.js' --- addons/web/static/src/js/view_editor.js 2011-11-09 06:07:47 +0000 +++ addons/web/static/src/js/view_editor.js 2011-11-09 06:55:36 +0000 @@ -5,7 +5,7 @@ this._super(parent); this.element_id = element_id this.parent = parent - this.dataset = dataset; + this.dataset = new openerp.web.DataSetSearch(this, 'ir.ui.view', null, null); this.model = dataset.model; this.xml_element_id = 0; this.property = openerp.web.ViewEditor.property_widget; @@ -18,7 +18,7 @@ var action = { name: _.sprintf("Manage Views (%s)", this.model), context: this.session.user_context, - domain: [["model", "=", this.dataset.model]], + domain: [["model", "=", this.model]], res_model: 'ir.ui.view', views: [[false, 'list']], type: 'ir.actions.act_window', @@ -67,85 +67,86 @@ }); }); }, - convert_tag_to_obj: function(xml, level) { - var obj = { - 'child_id': [], - 'id': this.xml_element_id++, - 'level': level + 1, + add_node_name : function(node) { + if(node.tagName.toLowerCase() == "button" || node.tagName.toLowerCase() == "field"){ + return (node.getAttribute('name'))? + _.sprintf( "<%s name='%s'>",node.tagName.toLowerCase(), node.getAttribute('name')): + _.sprintf( "<%s>",node.tagName.toLowerCase()); + }else if(node.tagName.toLowerCase() == "group"){ + return (node.getAttribute('string'))? + _.sprintf( "<%s>",node.getAttribute('string')): + _.sprintf( "<%s>",node.tagName.toLowerCase()); + }else{ + return (node.getAttribute('string'))? + _.sprintf( "<%s string='%s'>",node.tagName.toLowerCase(), node.getAttribute('string')): + _.sprintf( "<%s>",node.tagName.toLowerCase()); + } + }, + + create_View_Node: function(node){ + var self = this; + ViewNode = { + 'level': ($(node).parents()).length + 1, + 'id': self.xml_element_id += 1, 'att_list': [], - 'name': '' - }; - var tag = xml.tagName.toLowerCase(); - obj.att_list.push(tag); - obj.name = "<" + tag; - $(xml).each(function() { - _.each(this.attributes, function(attrs) { - if (tag != 'button' && tag != 'field') { - if (attrs.nodeName == "string" ) { - obj.name += ' ' + attrs.nodeName + '=' + '"' + attrs.nodeValue + '"'; - } - } else { - if (attrs.nodeName == "name") { - obj.name += ' ' + attrs.nodeName + '=' + '"' + attrs.nodeValue + '"'; - } - } - obj.att_list.push([attrs.nodeName, attrs.nodeValue]); - }); - obj.name += ">"; - }); - return obj; + 'name': self.add_node_name(node), + 'child_id': [] + } + ViewNode.att_list.push(node.tagName.toLowerCase()); + _.each(node.attributes ,function(att){ + ViewNode.att_list.push([att.nodeName,att.nodeValue]); + }); + return ViewNode; }, - append_child_object: function(val, parent_list, child_obj_list) { + + append_child_object: function(main_object, parent_id, child_obj_list) { var self = this; - if (val.child_id.length != 0) { - _.each(val.child_id, function(val) { - (val.id == parent_list[0])? - self.append_child_object( val, parent_list.slice(1), child_obj_list) : false; - }); - } else { val.child_id = child_obj_list; } + if(main_object.id == parent_id){ + var pare + main_object.child_id = child_obj_list; + return main_object; + }else{ + _.each(main_object.child_id ,function(child_object){ + self.append_child_object(child_object, parent_id, child_obj_list); + }); + } }, - convert_arch_to_obj: function(xml, parent_list, parent_id, main_object){ + + convert_arch_to_obj: function(xml_Node, main_object, parent_id){ var self = this; var child_obj_list = []; - var children_list = $(xml).children(); - var parents = $(children_list[0]).parents().get(); - _.each(children_list, function(child_node) { - child_obj_list.push(self.convert_tag_to_obj(child_node, parents.length)); - }); - if (children_list.length != 0) { - if (parents.length <= parent_list.length) { parent_list.splice(parents.length - 1);} - parent_list.push(parent_id); - self.append_child_object(main_object[0], parent_list.slice(1), child_obj_list); - } - for (var i = 0; i < children_list.length; i++) { - self.convert_arch_to_obj(children_list[i], parent_list, child_obj_list[i].id, main_object); - } + _.each(xml_Node,function(element){ + child_obj_list.push(self.create_View_Node(element)) ; + }); + this.append_child_object(main_object, parent_id, child_obj_list); + var obj_xml_list = _.zip(xml_Node,child_obj_list); + _.each(obj_xml_list, function(node){ + if(node[0].children.length != 0){ + self.convert_arch_to_obj(node[0].children, main_object, node[1].id);} + }); return main_object; }, + parse_xml: function(arch, view_id) { - var root = $(arch).filter(":first")[0]; - var tag = root.tagName.toLowerCase(); - var view_obj = { - 'child_id': [], - 'id': this.xml_element_id++, + main_object = { 'level': 0, + 'id': this.xml_element_id +=1, 'att_list': [], - 'name': _.sprintf("<view view_id='%d'>", view_id), + 'name': _.sprintf("<view view_id = %s>", view_id), + 'child_id': [] }; - var root_object = this.convert_tag_to_obj(root, 0); - view_obj.child_id = this.convert_arch_to_obj(arch, [], this.xml_element_id, [root_object], []); - return [view_obj]; + var xml_arch = QWeb.load_xml(arch); + return [this.convert_arch_to_obj(xml_arch.childNodes, main_object, this.xml_element_id)]; }, + get_arch: function() { var self = this; var view_arch_list = []; - var view_dataset = new openerp.web.DataSet(this, 'ir.ui.view'); - view_dataset.read_ids([parseInt(self.main_view_id)], ['arch', 'type'], function(arch) { + this.dataset.read_ids([parseInt(self.main_view_id)], ['arch', 'type'], function(arch) { var arch_object = self.parse_xml(arch[0].arch, self.main_view_id); self.main_view_type = arch[0].type view_arch_list.push({"view_id": self.main_view_id, "arch": arch[0].arch}); - dataset = new openerp.web.DataSetSearch(self, 'ir.ui.view', null, null); - dataset.read_slice([], {domain: [['inherit_id','=', parseInt(self.main_view_id)]]}, function(result) { + self.dataset.read_slice([], {domain: [['inherit_id','=', parseInt(self.main_view_id)]]}, function(result) { _.each(result, function(res) { view_arch_list.push({"view_id": res.id, "arch": res.arch}); self.inherit_view(arch_object, res); @@ -166,20 +167,23 @@ }); return parent_list; }, + inherit_view : function(arch_object, result) { var self = this; - var root = $(result.arch).filter('*'); var xml_list = []; - root[0].tagName.toLowerCase() == "data"? xml_list = $(root[0]).children() : xml_list.push(root[0]); + var xml_arch = QWeb.load_xml(result.arch); + (xml_arch.childNodes[0].tagName == "data") + ? xml_list = xml_arch.childNodes[0].children + : xml_list.push(xml_arch.childNodes[0]); _.each(xml_list, function(xml) { var expr_to_list = []; - var xpath_arch_object = self.parse_xml(xml,result.id); - if (xml.tagName.toLowerCase() == "xpath" ) { - var part_expr = _.without($(xml).attr('expr').split("/"), ""); + var xpath_arch_object = self.parse_xml(QWeb.tools.xml_node_to_string(xml), result.id); + if(xml.tagName == "xpath"){ + var part_expr = _.without(xml.getAttribute('expr').split("/"), ""); _.each(part_expr, function(part) { expr_to_list.push(_.without($.trim(part.replace(/[^a-zA-Z 0-9 _]+/g,'!')).split("!"), "")); }); - } else { + }else{ var temp = _.reject(xpath_arch_object[0].child_id[0].att_list, function(list) { return _.include(list, "position") }); @@ -311,14 +315,18 @@ var view_id; var view_xml_id; var view_find = side; + var min_level = clicked_tr_level; while (1) { view_find = view_find.prev(); if ((self.edit_xml_dialog.$element.find(view_find).find('a').text()).search("view_id") != -1 - && parseInt(view_find.attr('level')) < clicked_tr_level) { + && parseInt(view_find.attr('level')) < min_level ) { view_id = parseInt(($(view_find).find('a').text()).replace(/[^0-9]+/g, '')); view_xml_id = (view_find.attr('id')).split('-')[1]; break; } + if(view_find.attr('level') < min_level){ + min_level = parseInt(view_find.attr('level')); + } } switch (this.id) { case "side-add": @@ -411,12 +419,12 @@ var arch = _.detect(one_object['arch'], function(element) {return element.view_id == view_id;}); var obj = self.get_object_by_id(view_xml_id, one_object['main_object'], []); //for finding xpath tag from inherit view - if (($(arch.arch).filter("data")).length != 0 && view_xml_id != 0) { + var xml_arch = QWeb.load_xml(arch.arch); + if (xml_arch.childNodes[0].tagName == "data") { var check_list = _.flatten(obj[0].child_id[0].att_list); - arch.arch = _.detect($(arch.arch).children(), function(xml_child){ - var temp_obj = self.convert_tag_to_obj(xml_child); - var main_list = _.flatten(temp_obj.att_list); - var insert = _.intersection(main_list,_.uniq(check_list)); + arch.arch = _.detect(xml_arch.childNodes[0].children, function(xml_child){ + var temp_obj = self.create_View_Node(xml_child); + var insert = _.intersection(_.flatten(temp_obj.att_list),_.uniq(check_list)); if (insert.length == check_list.length ) {return xml_child;} }); } @@ -439,11 +447,10 @@ do_save_xml: function(arch1, obj, id, child_list, level, view_id, arch, move_direct, update_values){ var self = this; var children_list = $(arch1).children(); - var list_obj_xml = _.zip(children_list,obj.child_id); + var list_obj_xml = _.zip(children_list, obj.child_id); if (id) { if (obj.id == id) { var id; - var parent = $(arch1).parents(); var index = _.indexOf(child_list, obj); if (move_direct == "down") { var next = $(arch1).next(); @@ -459,22 +466,18 @@ _.each(update_values, function(val){ $(arch1).attr(val[0],val[1]); }); - var new_obj = self.convert_tag_to_obj(arch1, obj.level - 1); - new_obj.id = obj.id; - new_obj.child_id = obj.child_id; + var new_obj = self.create_View_Node(arch1); + new_obj.id = obj.id,new_obj.child_id = obj.child_id; self.edit_xml_dialog.$element.find("tr[id='viewedit-"+id+"']").find('a').text(new_obj.name); child_list.splice(index, 1, new_obj); } - parent = parent[parent.length - 1]; - var convert_to_utf = self.xml2Str(parent); - if (convert_to_utf) { - convert_to_utf = convert_to_utf.replace('xmlns="http://www.w3.org/1999/xhtml"', ""); - convert_to_utf = '<?xml version="1.0"?>' + convert_to_utf; - arch.arch = convert_to_utf; - dataset = new openerp.web.DataSet(this, 'ir.ui.view'); - dataset.write(parseInt(view_id),{"arch": convert_to_utf}, function(result) { - }); - } + var parent = $(arch1).parents(); + var convert_to_utf = QWeb.tools.xml_node_to_string(parent[parent.length-1]); + convert_to_utf = convert_to_utf.replace('xmlns="http://www.w3.org/1999/xhtml"', ""); + convert_to_utf = '<?xml version="1.0"?>' + convert_to_utf; + arch.arch = convert_to_utf; + this.dataset.write(parseInt(view_id),{"arch":convert_to_utf}, function(r) { + }); } if (obj.level <= level) { _.each(list_obj_xml, function(child_node) { @@ -482,20 +485,7 @@ }); } } - }, - xml2Str: function(xmlNode) { - try { - return (new XMLSerializer()).serializeToString(xmlNode); - } - catch (exception) { - try { - return xmlNode.xml; - } - catch (exception) { - return false; - } - } - }, + }, on_expand: function(expand_img){ var level = parseInt($(expand_img).closest("tr[id^='viewedit-']").attr('level')); var cur_tr = $(expand_img).closest("tr[id^='viewedit-']"); @@ -809,4 +799,4 @@ 'type': 'openerp.web.ViewEditor.ButtonTypeProperty', 'target': 'openerp.web.ViewEditor.ButtonTargetProperty' }); -}; \ No newline at end of file +};
_______________________________________________ Mailing list: https://launchpad.net/~openerp-dev-gtk Post to : openerp-dev-gtk@lists.launchpad.net Unsubscribe : https://launchpad.net/~openerp-dev-gtk More help : https://help.launchpad.net/ListHelp