diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index fcfdca60a2a..11b94353695 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -17,7 +17,7 @@ This module provides the core of the OpenERP Web Client. "static/lib/datejs/parser.js", "static/lib/datejs/sugarpak.js", "static/lib/datejs/extras.js", - "static/lib/jquery/jquery-1.7.2.js", + "static/lib/jquery/jquery-1.8.2.js", "static/lib/jquery.MD5/jquery.md5.js", "static/lib/jquery.form/jquery.form.js", "static/lib/jquery.validate/jquery.validate.js", @@ -25,7 +25,7 @@ This module provides the core of the OpenERP Web Client. "static/lib/spinjs/spin.js", "static/lib/jquery.autosize/jquery.autosize.js", "static/lib/jquery.blockUI/jquery.blockUI.js", - "static/lib/jquery.ui/js/jquery-ui-1.8.17.custom.min.js", + "static/lib/jquery.ui/js/jquery-ui-1.9.1.custom.js", "static/lib/jquery.ui.timepicker/js/jquery-ui-timepicker-addon.js", "static/lib/jquery.ui.notify/js/jquery.notify.js", "static/lib/jquery.deferred-queue/jquery.deferred-queue.js", @@ -38,7 +38,7 @@ This module provides the core of the OpenERP Web Client. "static/lib/underscore/underscore.string.js", "static/lib/backbone/backbone.js", "static/lib/cleditor/jquery.cleditor.js", - "static/lib/py.js/lib/py.js", + "static/lib/py.js/lib/py.js", "static/src/js/boot.js", "static/src/js/corelib.js", "static/src/js/coresetup.js", @@ -55,7 +55,7 @@ This module provides the core of the OpenERP Web Client. "static/src/js/view_tree.js", ], 'css' : [ - "static/lib/jquery.ui.bootstrap/css/custom-theme/jquery-ui-1.8.16.custom.css", + "static/lib/jquery.ui.bootstrap/css/custom-theme/jquery-ui-1.9.0.custom.css", "static/lib/jquery.ui.timepicker/css/jquery-ui-timepicker-addon.css", "static/lib/jquery.ui.notify/css/ui.notify.css", "static/lib/jquery.tipsy/tipsy.css", @@ -67,4 +67,5 @@ This module provides the core of the OpenERP Web Client. 'qweb' : [ "static/src/xml/*.xml", ], + 'bootstrap': True, } diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 2d2ee30783c..42731c5aa3c 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -81,57 +81,6 @@ def rjsmin(script): ).strip() return result -def sass2scss(src): - # Validated by diff -u of sass2scss against: - # sass-convert -F sass -T scss openerp.sass openerp.scss - block = [] - sass = ('', block) - reComment = re.compile(r'//.*$') - reIndent = re.compile(r'^\s+') - reIgnore = re.compile(r'^\s*(//.*)?$') - reFixes = { re.compile(r'\(\((.*)\)\)') : r'(\1)', } - lastLevel = 0 - prevBlocks = {} - for l in src.split('\n'): - l = l.rstrip() - if reIgnore.search(l): continue - l = reComment.sub('', l) - l = l.rstrip() - indent = reIndent.match(l) - level = indent.end() if indent else 0 - l = l[level:] - if level>lastLevel: - prevBlocks[lastLevel] = block - newBlock = [] - block[-1] = (block[-1], newBlock) - block = newBlock - elif level=0: - out += indent+sass[0]+" {\n" - for e in sass[1]: - out += write(e, level+1) - if level>=0: - out = out.rstrip(" \n") - out += ' }\n' - if level==0: - out += "\n" - else: - out += indent+sass+";\n" - return out - return write(sass) - def db_list(req): dbs = [] proxy = req.session.proxy("db") @@ -142,6 +91,17 @@ def db_list(req): dbs = [i for i in dbs if re.match(r, i)] return dbs +def db_monodb(req): + # if only one db is listed returns it else return False + try: + dbs = db_list(req) + if len(dbs) == 1: + return dbs[0] + except xmlrpclib.Fault: + # ignore access denied + pass + return False + def module_topological_sort(modules): """ Return a list of module names sorted so that their dependencies of the modules are listed before the module itself @@ -231,22 +191,14 @@ def module_installed_bypass_session(dbname): def module_boot(req): server_wide_modules = openerp.conf.server_wide_modules or ['web'] - return [m for m in server_wide_modules if m in openerpweb.addons_manifest] - # TODO the following will be enabled once we separate the module code and translation loading serverside = [] dbside = [] for i in server_wide_modules: if i in openerpweb.addons_manifest: serverside.append(i) - # if only one db load every module at boot - dbs = [] - try: - dbs = db_list(req) - except xmlrpclib.Fault: - # ignore access denied - pass - if len(dbs) == 1: - dbside = module_installed_bypass_session(dbs[0]) + monodb = db_monodb(req) + if monodb: + dbside = module_installed_bypass_session(monodb) dbside = [i for i in dbside if i not in serverside] addons = serverside + dbside return addons @@ -549,7 +501,7 @@ def _local_web_translations(trans_file): messages.append({'id': x.id, 'string': x.string}) return messages -def from_elementtree(el, preserve_whitespaces=False): +def xml2json_from_elementtree(el, preserve_whitespaces=False): """ xml2json-direct Simple and straightforward XML-to-JSON converter in Python New BSD Licensed @@ -569,13 +521,12 @@ def from_elementtree(el, preserve_whitespaces=False): if el.text and (preserve_whitespaces or el.text.strip() != ''): kids.append(el.text) for kid in el: - kids.append(from_elementtree(kid, preserve_whitespaces)) + kids.append(xml2json_from_elementtree(kid, preserve_whitespaces)) if kid.tail and (preserve_whitespaces or kid.tail.strip() != ''): kids.append(kid.tail) res["children"] = kids return res - def content_disposition(filename, req): filename = filename.encode('utf8') escaped = urllib2.quote(filename) @@ -612,8 +563,7 @@ html_template = """ - - + + diff --git a/addons/web_calendar/static/src/js/calendar.js b/addons/web_calendar/static/src/js/calendar.js index 36e37219bf8..437059cbdad 100644 --- a/addons/web_calendar/static/src/js/calendar.js +++ b/addons/web_calendar/static/src/js/calendar.js @@ -2,6 +2,22 @@ * OpenERP web_calendar *---------------------------------------------------------*/ +(function() { + // Monkey patch dhtml scheduler in order to fix a bug. + // It manually implements some kind of dbl click event + // bubbling but fails to do it properly. + if (this.scheduler) { + var old_scheduler_dblclick = scheduler._on_dbl_click; + scheduler._on_dbl_click = function(e, src) { + if (src && !src.className) { + return; + } else { + old_scheduler_dblclick.apply(this, arguments); + } + }; + } +}()); + openerp.web_calendar = function(instance) { var _t = instance.web._t, _lt = instance.web._lt; @@ -96,7 +112,7 @@ instance.web_calendar.CalendarView = instance.web.View.extend({ if (!this.sidebar && this.options.$sidebar) { this.sidebar = new instance.web_calendar.Sidebar(this); - this.has_been_loaded.pipe(this.sidebar.appendTo(this.$el.find('.oe_calendar_sidebar_container'))); + this.has_been_loaded.then(this.sidebar.appendTo(this.$el.find('.oe_calendar_sidebar_container'))); } this.trigger('calendar_view_loaded', data); return this.has_been_loaded.resolve(); @@ -236,7 +252,7 @@ instance.web_calendar.CalendarView = instance.web.View.extend({ } }, reload_event: function(id) { - this.dataset.read_ids([id], _.keys(this.fields)).then(this.proxy('events_loaded')); + this.dataset.read_ids([id], _.keys(this.fields)).done(this.proxy('events_loaded')); }, get_color: function(key) { if (this.color_map[key]) { @@ -347,12 +363,12 @@ instance.web_calendar.CalendarView = instance.web.View.extend({ ranged_search: function() { var self = this; scheduler.clearAll(); - $.when(this.has_been_loaded, this.ready).then(function() { + $.when(this.has_been_loaded, this.ready).done(function() { self.dataset.read_slice(_.keys(self.fields), { offset: 0, domain: self.get_range_domain(), context: self.last_search[1] - }).then(function(events) { + }).done(function(events) { self.dataset_events = events; self.events_loaded(events); }); @@ -367,7 +383,7 @@ instance.web_calendar.CalendarView = instance.web.View.extend({ }, do_show: function () { var self = this; - $.when(this.has_been_loaded).then(function() { + $.when(this.has_been_loaded).done(function() { self.$el.show(); self.do_push_state({}); }); @@ -387,7 +403,7 @@ instance.web_calendar.CalendarView = instance.web.View.extend({ var index = this.dataset.get_id_index(event_id); if (index !== null) { event_id = this.dataset.ids[index]; - this.dataset.write(event_id, data, {}).then(function() { + this.dataset.write(event_id, data, {}).done(function() { self.refresh_minical(); }); } @@ -395,13 +411,13 @@ instance.web_calendar.CalendarView = instance.web.View.extend({ quick_create: function(event_id, event_obj) { var self = this; var data = this.get_event_data(event_obj); - this.dataset.create(data).then(function(r) { + this.dataset.create(data).done(function(r) { var id = r; self.dataset.ids.push(id); scheduler.changeEventId(event_id, id); self.refresh_minical(); self.reload_event(id); - }, function(r, event) { + }).fail(function(r, event) { event.preventDefault(); self.slow_create(event_id, event_obj); }); @@ -472,7 +488,7 @@ instance.web_calendar.CalendarView = instance.web.View.extend({ var self = this; var index = this.dataset.get_id_index(event_id); if (index !== null) { - this.dataset.unlink(event_id).then(function() { + this.dataset.unlink(event_id).done(function() { self.refresh_minical(); }); } diff --git a/addons/web_diagram/static/src/js/diagram.js b/addons/web_diagram/static/src/js/diagram.js index 85c6427b704..7b914922205 100644 --- a/addons/web_diagram/static/src/js/diagram.js +++ b/addons/web_diagram/static/src/js/diagram.js @@ -26,7 +26,7 @@ instance.web.DiagramView = instance.web.View.extend({ }, start: function() { var self = this; - return this.rpc("/web_diagram/diagram/load", {"model": this.model, "view_id": this.view_id}).then(function(r) { + return this.rpc("/web_diagram/diagram/load", {"model": this.model, "view_id": this.view_id}).done(function(r) { self.load_diagram(r); }); }, @@ -105,7 +105,7 @@ instance.web.DiagramView = instance.web.View.extend({ }); this.rpc( - '/web_diagram/diagram/get_diagram_info',params).then(function(result) { + '/web_diagram/diagram/get_diagram_info',params).done(function(result) { self.draw_diagram(result); } ); @@ -256,7 +256,7 @@ instance.web.DiagramView = instance.web.View.extend({ ); pop.on('write_completed', self, function() { - self.dataset.read_index(_.keys(self.fields_view.fields)).pipe(self.on_diagram_loaded); + self.dataset.read_index(_.keys(self.fields_view.fields)).then(self.on_diagram_loaded); }); var form_fields = [self.parent_field]; @@ -290,7 +290,7 @@ instance.web.DiagramView = instance.web.View.extend({ self.context || self.dataset.context ); pop.on("elements_selected", self, function(element_ids) { - self.dataset.read_index(_.keys(self.fields_view.fields)).pipe(self.on_diagram_loaded); + self.dataset.read_index(_.keys(self.fields_view.fields)).then(self.on_diagram_loaded); }); var form_controller = pop.view_form; @@ -320,7 +320,7 @@ instance.web.DiagramView = instance.web.View.extend({ } ); pop.on('write_completed', self, function() { - self.dataset.read_index(_.keys(self.fields_view.fields)).pipe(self.on_diagram_loaded); + self.dataset.read_index(_.keys(self.fields_view.fields)).then(self.on_diagram_loaded); }); }, @@ -342,7 +342,7 @@ instance.web.DiagramView = instance.web.View.extend({ this.context || this.dataset.context ); pop.on("elements_selected", self, function(element_ids) { - self.dataset.read_index(_.keys(self.fields_view.fields)).pipe(self.on_diagram_loaded); + self.dataset.read_index(_.keys(self.fields_view.fields)).then(self.on_diagram_loaded); }); // We want to destroy the dummy edge after a creation cancel. This destroys it even if we save the changes. // This is not a problem since the diagram is completely redrawn on saved changes. @@ -390,7 +390,7 @@ instance.web.DiagramView = instance.web.View.extend({ pager_action_trigger: function(){ var loaded = this.dataset.read_index(_.keys(this.fields_view.fields)) - .pipe(this.on_diagram_loaded); + .then(this.on_diagram_loaded); this.do_update_pager(); return loaded; }, diff --git a/addons/web_diagram/static/src/js/graph.js b/addons/web_diagram/static/src/js/graph.js index bfe5796c0f0..6e3b018d85a 100644 --- a/addons/web_diagram/static/src/js/graph.js +++ b/addons/web_diagram/static/src/js/graph.js @@ -87,12 +87,12 @@ dummy_circle.animate({'r': close_button_radius }, 400, 'linear'); if(entity_type == "node"){ - $.when(GraphNode.destruction_callback(entity)).then(function () { + $.when(GraphNode.destruction_callback(entity)).done(function () { //console.log("remove node",entity); entity.remove(); }); }else if(entity_type == "edge"){ - $.when(GraphEdge.destruction_callback(entity)).then(function () { + $.when(GraphEdge.destruction_callback(entity)).done(function () { //console.log("remove edge",entity); entity.remove(); }); diff --git a/addons/web_gantt/static/src/js/gantt.js b/addons/web_gantt/static/src/js/gantt.js index 040f53568ae..627942d0dbc 100644 --- a/addons/web_gantt/static/src/js/gantt.js +++ b/addons/web_gantt/static/src/js/gantt.js @@ -22,7 +22,7 @@ instance.web_gantt.GanttView = instance.web.View.extend({ var self = this; this.fields_view = fields_view_get; this.$el.addClass(this.fields_view.arch.attrs['class']); - return this.rpc("/web/searchview/fields_get", {"model": this.dataset.model}).pipe(function(fields_get) { + return this.rpc("/web/searchview/fields_get", {"model": this.dataset.model}).then(function(fields_get) { self.fields = fields_get.fields; self.has_been_loaded.resolve(); }); @@ -46,11 +46,11 @@ instance.web_gantt.GanttView = instance.web.View.extend({ })); fields = _.uniq(fields.concat(n_group_bys)); - return $.when(this.has_been_loaded).pipe(function() { + return $.when(this.has_been_loaded).then(function() { return self.dataset.read_slice(fields, { domain: domains, context: contexts - }).pipe(function(data) { + }).then(function(data) { return self.on_data_loaded(data, n_group_bys); }); }); @@ -62,7 +62,7 @@ instance.web_gantt.GanttView = instance.web.View.extend({ on_data_loaded: function(tasks, group_bys) { var self = this; var ids = _.pluck(tasks, "id"); - return this.dataset.name_get(ids).pipe(function(names) { + return this.dataset.name_get(ids).then(function(names) { var ntasks = _.map(tasks, function(task) { return _.extend({__name: _.detect(names, function(name) { return name[0] == task.id; })[1]}, task); }); diff --git a/addons/web_graph/static/src/js/graph.js b/addons/web_graph/static/src/js/graph.js index 8d8d49d0a44..3b73201b154 100644 --- a/addons/web_graph/static/src/js/graph.js +++ b/addons/web_graph/static/src/js/graph.js @@ -94,7 +94,7 @@ instance.web_graph.GraphView = instance.web.View.extend({ if (self.legend == "top") { self.legend = "inside"; } self.forcehtml = true; - self.graph_get_data().then(function (result) { + self.graph_get_data().done(function (result) { self.graph_render_all(result).download.saveImage('png'); }).always(function () { self.forcehtml = false; @@ -243,7 +243,7 @@ instance.web_graph.GraphView = instance.web.View.extend({ var result = []; var ticks = {}; - return obj.call("fields_view_get", [view_id, 'graph']).pipe(function(tmp) { + return obj.call("fields_view_get", [view_id, 'graph']).then(function(tmp) { view_get = tmp; fields = view_get['fields']; var toload = _.select(group_by, function(x) { return fields[x] === undefined }); @@ -251,7 +251,7 @@ instance.web_graph.GraphView = instance.web.View.extend({ return obj.call("fields_get", [toload, context]); else return $.when([]); - }).pipe(function (fields_to_add) { + }).then(function (fields_to_add) { _.extend(fields, fields_to_add); var tree = $($.parseXML(view_get['arch'])); @@ -307,7 +307,7 @@ instance.web_graph.GraphView = instance.web.View.extend({ } if (mode === "pie") { - return obj.call("read_group", [domain, yaxis.concat([xaxis[0]]), [xaxis[0]]], {context: context}).pipe(function(res) { + return obj.call("read_group", [domain, yaxis.concat([xaxis[0]]), [xaxis[0]]], {context: context}).then(function(res) { _.each(res, function(record) { result.push({ 'data': [[_convert(xaxis[0], record[xaxis[0]]), record[yaxis[0]]]], @@ -318,11 +318,11 @@ instance.web_graph.GraphView = instance.web.View.extend({ } else if ((! stacked) || (xaxis.length < 2)) { var defs = []; _.each(xaxis, function(x) { - defs.push(obj.call("read_group", [domain, yaxis.concat([x]), [x]], {context: context}).pipe(function(res) { + defs.push(obj.call("read_group", [domain, yaxis.concat([x]), [x]], {context: context}).then(function(res) { return [x, res]; })); }); - return $.when.apply($, defs).pipe(function() { + return $.when.apply($, defs).then(function() { _.each(_.toArray(arguments), function(res) { var x = res[0]; res = res[1]; @@ -336,15 +336,15 @@ instance.web_graph.GraphView = instance.web.View.extend({ }); } else { xaxis.reverse(); - return obj.call("read_group", [domain, yaxis.concat(xaxis.slice(0, 1)), xaxis.slice(0, 1)], {context: context}).pipe(function(axis) { + return obj.call("read_group", [domain, yaxis.concat(xaxis.slice(0, 1)), xaxis.slice(0, 1)], {context: context}).then(function(axis) { var defs = []; _.each(axis, function(x) { var key = x[xaxis[0]] - defs.push(obj.call("read_group", [domain, yaxis.concat(xaxis.slice(1, 2)), xaxis.slice(1, 2)], {context: context}).pipe(function(res) { + defs.push(obj.call("read_group", [domain, yaxis.concat(xaxis.slice(1, 2)), xaxis.slice(1, 2)], {context: context}).then(function(res) { return [x, key, res]; })); }); - return $.when.apply($, defs).pipe(function() { + return $.when.apply($, defs).then(function() { _.each(_.toArray(arguments), function(res) { var x = res[0]; var key = res[1]; @@ -359,7 +359,7 @@ instance.web_graph.GraphView = instance.web.View.extend({ }); }); } - }).pipe(function() { + }).then(function() { var res = { 'data': result, 'ticks': _.map(ticks, function(el, key) { return [el, key] }) @@ -374,7 +374,7 @@ instance.web_graph.GraphView = instance.web.View.extend({ _.extend(this, options.data); return this.graph_get_data() - .then(this.proxy('graph_render_all')); + .done(this.proxy('graph_render_all')); }, graph_render_all: function (data) { diff --git a/addons/web_kanban/static/src/css/kanban.css b/addons/web_kanban/static/src/css/kanban.css index f968364c987..105e074df1f 100644 --- a/addons/web_kanban/static/src/css/kanban.css +++ b/addons/web_kanban/static/src/css/kanban.css @@ -113,7 +113,7 @@ padding: 0; margin: 0px; } -.openerp .oe_kanban_view .oe_kanban_group_folded .oe_kanban_group_title, .openerp .oe_kanban_view .oe_kanban_group_folded.oe_kanban_column > *, .openerp .oe_kanban_view .oe_kanban_group_folded .oe_kanban_aggregates, .openerp .oe_kanban_view .oe_kanban_group_folded .oe_kanban_add { +.openerp .oe_kanban_view .oe_kanban_group_folded .oe_kanban_group_title, .openerp .oe_kanban_view .oe_kanban_group_folded.oe_kanban_column *, .openerp .oe_kanban_view .oe_kanban_group_folded .oe_kanban_aggregates, .openerp .oe_kanban_view .oe_kanban_group_folded .oe_kanban_add { display: none; } .openerp .oe_kanban_view .oe_kanban_group_folded .oe_kanban_group_title_vertical { diff --git a/addons/web_kanban/static/src/css/kanban.sass b/addons/web_kanban/static/src/css/kanban.sass index 459fc56092d..fbc9e3d8568 100644 --- a/addons/web_kanban/static/src/css/kanban.sass +++ b/addons/web_kanban/static/src/css/kanban.sass @@ -140,7 +140,7 @@ padding: 0 margin: 0px .oe_kanban_group_folded - .oe_kanban_group_title, &.oe_kanban_column > *, .oe_kanban_aggregates, .oe_kanban_add + .oe_kanban_group_title, &.oe_kanban_column *, .oe_kanban_aggregates, .oe_kanban_add display: none .oe_kanban_group_title_vertical display: block diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 76920da6a47..25379e946b6 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -27,6 +27,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ this.group_by = null; this.group_by_field = {}; this.grouped_by_m2o = false; + this.many2manys = []; this.state = { groups : {}, records : {} @@ -130,12 +131,11 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ } switch (node.tag) { case 'field': - if(this.fields_view.fields[ node.attrs['name'] ].type == 'many2many'){ - node.tag = 'div'; - node.attrs['class'] = 'oe_form_field oe_tags'; - node.attrs['model'] = this.fields_view.fields[node.attrs['name']].relation; - node.attrs['t-att-data'] = 'record.' + node.attrs['name'] + '.raw_value'; - }else { + if (this.fields_view.fields[node.attrs.name].type === 'many2many') { + this.many2manys.push(node.attrs.name); + node.tag = 'div'; + node.attrs['class'] = (node.attrs['class'] || '') + ' oe_form_field oe_tags'; + } else { node.tag = QWeb.prefix; node.attrs[QWeb.prefix + '-esc'] = 'record.' + node.attrs['name'] + '.value'; } @@ -198,7 +198,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ var form = am.dialog_widget.views.form.controller; form.on("on_button_cancel", am.dialog, am.dialog.close); form.on('record_created', self, function(r) { - (new instance.web.DataSet(self, self.group_by_field.relation)).name_get([r]).then(function(new_record) { + (new instance.web.DataSet(self, self.group_by_field.relation)).name_get([r]).done(function(new_record) { am.dialog.close(); var domain = self.dataset.domain.slice(0); domain.push([self.group_by, '=', new_record[0][0]]); @@ -212,7 +212,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ aggregates: {}, }; var new_group = new instance.web_kanban.KanbanGroup(self, [], datagroup, dataset); - self.do_add_groups([new_group]).then(function() { + self.do_add_groups([new_group]).done(function() { $(window).scrollTo(self.groups.slice(-1)[0].$el, { axis: 'x' }); }); }); @@ -224,14 +224,14 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ this.search_domain = domain; this.search_context = context; this.search_group_by = group_by; - $.when(this.has_been_loaded).then(function() { + $.when(this.has_been_loaded).done(function() { self.group_by = group_by.length ? group_by[0] : self.fields_view.arch.attrs.default_group_by; self.group_by_field = self.fields_view.fields[self.group_by] || {}; self.grouped_by_m2o = (self.group_by_field.type === 'many2one'); self.$buttons.find('.oe_alternative').toggle(self.grouped_by_m2o); self.$el.toggleClass('oe_kanban_grouped_by_m2o', self.grouped_by_m2o); var grouping = new instance.web.Model(self.dataset.model, context, domain).query().group_by(self.group_by); - $.when(grouping).then(function(groups) { + $.when(grouping).done(function(groups) { if (groups) { self.do_process_groups(groups); } else { @@ -252,7 +252,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ var dataset = new instance.web.DataSetSearch(self, self.dataset.model, new instance.web.CompoundContext(self.dataset.get_context(), group.model.context()), group.model.domain()); return dataset.read_slice(self.fields_keys.concat(['__last_update']), { 'limit': self.limit }) - .pipe(function(records) { + .then(function(records) { self.dataset.ids.push.apply(self.dataset.ids, dataset.ids); groups_array[index] = new instance.web_kanban.KanbanGroup(self, records, group, dataset); if (!remaining--) { @@ -268,16 +268,16 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ this.$el.removeClass('oe_kanban_grouped').addClass('oe_kanban_ungrouped'); this.add_group_mutex.exec(function() { var def = $.Deferred(); - self.dataset.read_slice(self.fields_keys.concat(['__last_update']), { 'limit': self.limit }).then(function(records) { + self.dataset.read_slice(self.fields_keys.concat(['__last_update']), { 'limit': self.limit }).done(function(records) { self.do_clear_groups(); var kgroup = new instance.web_kanban.KanbanGroup(self, records, null, self.dataset); - self.do_add_groups([kgroup]).then(function() { + self.do_add_groups([kgroup]).done(function() { if (_.isEmpty(records)) { self.no_result(); } def.resolve(); }); - }).then(null, function() { + }).done(null, function() { def.reject(); }); return def; @@ -306,7 +306,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ return group.insertBefore($last_td); } }); - return $.when.apply(null, groups_started).then(function () { + return $.when.apply(null, groups_started).done(function () { self.on_groups_started(); self.$el.appendTo($parent); _.each(self.groups, function(group) { @@ -375,7 +375,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ var tmp_group = self.groups.splice(start_index, 1)[0]; self.groups.splice(stop_index, 0, tmp_group); var new_sequence = _.pluck(self.groups, 'value'); - (new instance.web.DataSet(self, self.group_by_field.relation)).resequence(new_sequence).then(function(r) { + (new instance.web.DataSet(self, self.group_by_field.relation)).resequence(new_sequence).done(function(r) { if (r === false) { console.error("Kanban: could not resequence model '%s'. Probably no 'sequence' field.", self.group_by_field.relation); } @@ -388,7 +388,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ } else { this.$el.find('.oe_kanban_draghandle').removeClass('oe_kanban_draghandle'); } - instance.web_kanban.KanbanView.postprocessing_widget_many2many_tags(self); + this.postprocess_m2m_tags(); }, on_record_moved : function(record, old_group, old_index, new_group, new_index) { var self = this; @@ -404,7 +404,7 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ record.group = new_group; var data = {}; data[this.group_by] = new_group.value; - this.dataset.write(record.id, data, {}).then(function() { + this.dataset.write(record.id, data, {}).done(function() { record.do_reload(); new_group.do_save_sequences(); }).fail(function(error, evt) { @@ -470,44 +470,48 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ this.$el.find('.oe_view_nocontent').click(function() { create_nocontent.effect('bounce', {distance: 18, times: 5}, 150); }); + }, + + /* + * postprocessing of fields type many2many + * make the rpc request for all ids/model and insert value inside .oe_tags fields + */ + postprocess_m2m_tags: function() { + var self = this; + if (!this.many2manys.length) { + return; + } + var relations = {}; + this.groups.forEach(function(group) { + group.records.forEach(function(record) { + self.many2manys.forEach(function(name) { + var field = record.record[name]; + var $el = record.$('.oe_form_field.oe_tags[name=' + name + ']'); + if (!relations[field.relation]) { + relations[field.relation] = { ids: [], elements: {}}; + } + var rel = relations[field.relation]; + field.raw_value.forEach(function(id) { + rel.ids.push(id); + if (!rel.elements[id]) { + rel.elements[id] = []; + } + rel.elements[id].push($el[0]); + }); + }); + }); + }); + _.each(relations, function(rel, rel_name) { + var dataset = new instance.web.DataSetSearch(self, rel_name, self.dataset.get_context()); + dataset.name_get(_.uniq(rel.ids)).done(function(result) { + result.forEach(function(nameget) { + $(rel.elements[nameget[0]]).append('' + _.str.escapeHTML(nameget[1]) + ''); + }); + }); + }); } }); -/* -* widget for list of tags/categories -* make the rpc request for all ids/model and insert value inside .oe_tags fields -*/ -instance.web_kanban.KanbanView.postprocessing_widget_many2many_tags = function(self){ - var model_list_id={}; - - // select all widget for the kanban view or the widget inside the record - self.$el.find(".oe_form_field.oe_tags").each(function(){ - var model = $(this).attr("model"); - if(model.length){ - var data = $(this).attr("data"); - var list = data.split(","); - - //select all id (per model) - if(!model_list_id[model]) model_list_id[model]=[]; - for(var t=0;t0){ - var block = self.$el.find(".oe_form_field.oe_tags[model='" + model + "']"); - var dataset = new instance.web.DataSetSearch(self, model, self.session.context); - dataset.name_get(_.uniq( model_list_id[model] )).then( - function(result) { - for(var t=0;t'+result[t][1]+''); - } - } - ); - } - } -} function get_class(name) { return new instance.web.Registry({'tmp' : name}).get_object("tmp"); @@ -557,7 +561,7 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ this.$records = null; this.records = []; - this.$has_been_started.then(function() { + this.$has_been_started.done(function() { self.do_add_records(records); }); }, @@ -638,10 +642,16 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ }, do_show_more: function(evt) { var self = this; - this.dataset.read_slice(this.view.fields_keys.concat(['__last_update']), { + return this.dataset.read_slice(this.view.fields_keys.concat(['__last_update']), { 'limit': self.view.limit, 'offset': self.dataset_offset += self.view.limit - }).then(this.do_add_records); + }).then(function(records) { + records.forEach(function(r) { + self.view.dataset.ids.push(r.id); + }); + self.do_add_records(records); + return records; + }); }, do_add_records: function(records, prepend) { var self = this; @@ -704,7 +714,7 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ do_action_delete: function() { var self = this; if (confirm(_t("Are you sure to remove this column ?"))) { - (new instance.web.DataSet(self, self.view.group_by_field.relation)).unlink([self.value]).then(function(r) { + (new instance.web.DataSet(self, self.view.group_by_field.relation)).unlink([self.value]).done(function(r) { self.view.do_reload(); }); } @@ -724,7 +734,7 @@ instance.web_kanban.KanbanGroup = instance.web.Widget.extend({ quick_created: function (record) { var id = record, self = this; this.dataset.read_ids([id], this.view.fields_keys) - .then(function (records) { + .done(function (records) { self.view.dataset.ids.push(id); self.do_add_records(records, true); }); @@ -838,13 +848,13 @@ instance.web_kanban.KanbanRecord = instance.web.Widget.extend({ if (this.$el.find('.oe_kanban_global_click,.oe_kanban_global_click_edit').length) { this.$el.on('click', function(ev) { - if (!ev.isTrigger && !$(ev.target).data('events')) { + if (!ev.isTrigger && !$._data(ev.target, 'events')) { var trigger = true; var elem = ev.target; var ischild = true; var children = []; while (elem) { - var events = $(elem).data('events'); + var events = $._data(elem, 'events'); if (elem == ev.currentTarget) { ischild = false; } @@ -899,7 +909,7 @@ instance.web_kanban.KanbanRecord = instance.web.Widget.extend({ var color_field = $(this).parents('.oe_kanban_colorpicker').first().data('field') || 'color'; var data = {}; data[color_field] = $(this).data('color'); - self.view.dataset.write(self.id, data, {}).then(function() { + self.view.dataset.write(self.id, data, {}).done(function() { self.record[color_field] = $(this).data('color'); self.do_reload(); }); @@ -909,7 +919,7 @@ instance.web_kanban.KanbanRecord = instance.web.Widget.extend({ do_action_delete: function($action) { var self = this; function do_it() { - return $.when(self.view.dataset.unlink([self.id])).then(function() { + return $.when(self.view.dataset.unlink([self.id])).done(function() { self.group.remove_record(self.id); self.destroy(); }); @@ -933,14 +943,14 @@ instance.web_kanban.KanbanRecord = instance.web.Widget.extend({ }, do_reload: function() { var self = this; - this.view.dataset.read_ids([this.id], this.view.fields_keys.concat(['__last_update'])).then(function(records) { + this.view.dataset.read_ids([this.id], this.view.fields_keys.concat(['__last_update'])).done(function(records) { if (records.length) { self.set_record(records[0]); self.renderElement(); self.$el.data('widget', self); self.bind_events(); self.group.compute_cards_auto_height(); - instance.web_kanban.KanbanView.postprocessing_widget_many2many_tags(self); + self.view.postprocess_m2m_tags(); } else { self.destroy(); } @@ -1063,7 +1073,7 @@ instance.web_kanban.QuickCreate = instance.web.Widget.extend({ this._dataset.call( 'name_create', [self.$input.val() || false, new instance.web.CompoundContext( this._dataset.get_context(), this._context)]) - .pipe(function(record) { + .then(function(record) { self.$input.val(""); self.trigger('added', record[0]); }, function(error, event) { diff --git a/addons/web_tests/static/src/js/web_tests.js b/addons/web_tests/static/src/js/web_tests.js index bc7d16913fb..281e360c872 100644 --- a/addons/web_tests/static/src/js/web_tests.js +++ b/addons/web_tests/static/src/js/web_tests.js @@ -18,7 +18,7 @@ openerp.web_tests = function (instance) { start: function () { $.when( this.dataset.read_slice(), - this.form.appendTo(this.$el)).then(this.on_everything_loaded); + this.form.appendTo(this.$el)).done(this.on_everything_loaded); }, on_everything_loaded: function (slice) { var records = slice[0].records; diff --git a/addons/web_view_editor/static/src/js/view_editor.js b/addons/web_view_editor/static/src/js/view_editor.js index dcccd381009..a844c0f3be8 100644 --- a/addons/web_view_editor/static/src/js/view_editor.js +++ b/addons/web_view_editor/static/src/js/view_editor.js @@ -70,7 +70,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ this.main_view_id = this.parent.fields_view.view_id; this.action_manager = new instance.web.ActionManager(this); this.action_manager.appendTo(this.view_edit_dialog.$el); - $.when(this.action_manager.do_action(action)).then(function() { + $.when(this.action_manager.do_action(action)).done(function() { var viewmanager = self.action_manager.inner_widget; var controller = viewmanager.views[viewmanager.active_view].controller; controller.on('view_loaded', self, function(){ @@ -102,7 +102,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ if (warn) { self.on_valid_create_view(self.create_view_widget); } else { - $.when(self.do_save_view(view_values)).then(function() { + $.when(self.do_save_view(view_values)).done(function() { self.create_view_dialog.close(); var controller = self.action_manager.inner_widget.views[self.action_manager.inner_widget.active_view].controller; controller.reload_content(); @@ -135,7 +135,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ var field_dataset = new instance.web.DataSetSearch(this, this.model, null, null); var model_dataset = new instance.web.DataSetSearch(this, 'ir.model', null, null); var view_string = "", field_name = false, self = this; - field_dataset.call( 'fields_get', []).then(function(fields) { + field_dataset.call( 'fields_get', []).done(function(fields) { _.each(['name', 'x_name'], function(value) { if (_.include(_.keys(fields), value)) { field_name = value; @@ -143,7 +143,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ } }); if (field_name) { - model_dataset.read_slice(['name','field_id'], {"domain": [['model','=',self.model]]}).then(function(records) { + model_dataset.read_slice(['name','field_id'], {"domain": [['model','=',self.model]]}).done(function(records) { if (records) {view_string = records[0].name;} var arch = _.str.sprintf("\n<%s string='%s'>\n\t\n", values.view_type, view_string, field_name, values.view_type); var vals = {'model': self.model, 'name': values.view_name, 'priority': values.priority, 'type': values.view_type, 'arch': arch}; @@ -182,7 +182,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ var self = this; if (confirm(_t("Do you really want to remove this view?"))) { var controller = this.action_manager.inner_widget.views[this.action_manager.inner_widget.active_view].controller; - this.dataset.unlink([this.main_view_id]).then(function() { + this.dataset.unlink([this.main_view_id]).done(function() { controller.reload_content(); self.main_view_id = self.parent.fields_view.view_id; }); @@ -245,12 +245,12 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ get_arch: function() { var self = this; var view_arch_list = []; - this.dataset.read_ids([parseInt(self.main_view_id)], ['arch', 'type','priority']).then(function(arch) { + this.dataset.read_ids([parseInt(self.main_view_id)], ['arch', 'type','priority']).done(function(arch) { if (arch.length) { var arch_object = self.parse_xml(arch[0].arch, self.main_view_id); self.main_view_type = arch[0].type == 'tree'? 'list': arch[0].type; view_arch_list.push({"view_id": self.main_view_id, "arch": arch[0].arch,"priority":arch[0].priority}); - self.dataset.read_slice([], {domain: [['inherit_id','=', parseInt(self.main_view_id)]]}).then(function(result) { + self.dataset.read_slice([], {domain: [['inherit_id','=', parseInt(self.main_view_id)]]}).done(function(result) { _.each(result, function(res) { view_arch_list.push({"view_id": res.id, "arch": res.arch,"priority":res.priority}); self.inherit_view(arch_object, res); @@ -455,7 +455,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ var priority = _.detect(self.one_object['arch'], function(val) {return val.view_id == view_id;}); var arch = _.str.sprintf("\n\t ", val[1]); var vals = {'model': self.model, 'name': view_name, 'priority': priority.priority + 1, 'type': "form", 'arch': arch,'inherit_id':self.main_view_id}; - this.dataset.create(vals).then(function(id) { + this.dataset.create(vals).done(function(id) { var arch_to_obj = self.parse_xml(arch,id); obj.child_id.push(arch_to_obj[0]); self.one_object['parent_child_id'] = self.parent_child_list(self.one_object['main_object'],[]); @@ -538,7 +538,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ var value = _.has(_CHILDREN, element) ? element : _.str.include(html_tag, element)?"html_tag":false; property_to_check.push(value); }); - field_dataset.call( 'fields_get', []).then(function(result) { + field_dataset.call( 'fields_get', []).done(function(result) { var fields = _.keys(result); fields.push(" "),fields.sort(); self.on_add_node(property_to_check, fields); @@ -890,7 +890,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ var arch_val = self.get_object_by_id(this.one_object.clicked_tr_id,this.one_object['main_object'], []); this.edit_node_dialog.$el.append('
'); this.edit_widget = []; - self.ready = $.when(self.on_groups(properties)).then(function () { + self.ready = $.when(self.on_groups(properties)).done(function () { _PROPERTIES_ATTRIBUTES['groups']['selection'] = self.groups; var values = _.keys( instance.web.form.widgets.map); values.push(''); @@ -993,7 +993,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ table_selector.find("td[id^=]").attr("width","100px"); self.add_node_dialog.$el.find('#new_field').click(function() { model_data = new instance.web.DataSetSearch(self,'ir.model', null, null); - model_data.read_slice([], {domain: [['model','=', self.model]]}).then(function(result) { + model_data.read_slice([], {domain: [['model','=', self.model]]}).done(function(result) { self.render_new_field(result[0]); }); }); @@ -1011,7 +1011,7 @@ instance.web_view_editor.ViewEditor = instance.web.Widget.extend({ } }; var action_manager = new instance.web.ActionManager(self); - $.when(action_manager.do_action(action)).then(function() { + $.when(action_manager.do_action(action)).done(function() { var controller = action_manager.dialog_widget.views['form'].controller; controller.on("on_button_cancel", self, function(){ action_manager.destroy();