diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index 4051e607e21..3d9d1a4333d 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -3,8 +3,10 @@ "category": "Hidden", "description": """ - OpenERP Web core module. - This module provides the core of the OpenERP Web Client. +OpenERP Web core module. +======================== + +This module provides the core of the OpenERP Web Client. """, "depends" : [], 'auto_install': True, diff --git a/addons/web/common/http.py b/addons/web/common/http.py index a70ef53a91c..f1426d76d27 100644 --- a/addons/web/common/http.py +++ b/addons/web/common/http.py @@ -426,10 +426,13 @@ class DisableCacheMiddleware(object): referer = environ.get('HTTP_REFERER', '') parsed = urlparse.urlparse(referer) debug = parsed.query.count('debug') >= 1 - filtered_headers = [(k,v) for k,v in headers if not (k=='Last-Modified' or (debug and (k=='Cache-Control' or k=='Expires')))] + nh = dict(headers) + if 'Last-Modified' in nh: del nh['Last-Modified'] if debug: - filtered_headers.append(('Cache-Control', 'no-cache')) - start_response(status, filtered_headers) + if 'Expires' in nh: del nh['Expires'] + if 'Etag' in nh: del nh['Etag'] + nh['Cache-Control'] = 'no-cache' + start_response(status, nh.items()) return self.app(environ, start_wrapped) class Root(object): diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index da034aa88b6..e4c576fecae 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -997,6 +997,16 @@ class DataSet(openerpweb.Controller): elif isinstance(kwargs[k], common.nonliterals.BaseDomain): kwargs[k] = req.session.eval_domain(kwargs[k]) + # Temporary implements future display_name special field for model#read() + if method == 'read' and kwargs.get('context') and kwargs['context'].get('future_display_name'): + if 'display_name' in args[1]: + names = req.session.model(model).name_get(args[0], **kwargs) + args[1].remove('display_name') + r = getattr(req.session.model(model), method)(*args, **kwargs) + for i in range(len(r)): + r[i]['display_name'] = names[i][1] or "%s#%d" % (model, names[i][0]) + return r + return getattr(req.session.model(model), method)(*args, **kwargs) @openerpweb.jsonrequest diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index a1759397e21..7c4cdf969f1 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -896,7 +896,8 @@ instance.web.Client = instance.web.Widget.extend({ this.$element.on('click', '.oe_dropdown_toggle', function(ev) { ev.preventDefault(); var $toggle = $(this); - var $menu = $toggle.parent().find('.oe_dropdown_menu'); + var $menu = $toggle.siblings('.oe_dropdown_menu'); + $menu = $menu.size() >= 1 ? $menu : $toggle.find('.oe_dropdown_menu'); var state = $menu.is('.oe_opened'); setTimeout(function() { // Do not alter propagation diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index ef1b1ec48b5..707d64879bd 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -267,7 +267,6 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM if (this.$pager) { this.$pager.show(); } - this.$element.show().css('visibility', 'hidden'); this.$element.add(this.$buttons).removeClass('oe_form_dirty'); var shown = this.has_been_loaded; @@ -277,8 +276,10 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM // null index means we should start a new record return self.on_button_new(); } - return self.dataset.read_index(_.keys(self.fields_view.fields), { - context: { 'bin_size': true } + var fields = _.keys(self.fields_view.fields); + fields.push('display_name'); + return self.dataset.read_index(fields, { + context: { 'bin_size': true, 'future_display_name' : true } }).pipe(self.on_record_loaded); }); } @@ -286,7 +287,6 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM if (options.editable) { self.to_edit_mode(); } - self.$element.css('visibility', 'visible'); }); }, do_hide: function () { @@ -302,7 +302,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM this._super(); }, on_record_loaded: function(record) { - var self = this, defs = []; + var self = this, set_values = []; if (!record) { this.set({ 'title' : undefined }); this.do_warn("Form", "The record could not be found in the database.", true); @@ -310,19 +310,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM } this.datarecord = record; this._actualize_mode(); - - var titleDef = $.Deferred(); - if (record.id) { - this.dataset.name_get(record.id).then(function(names) { - self.set({ 'title' : names[0][1] }); - }).always(function() { - titleDef.resolve(); - }); - } else { - this.set({ 'title' : "New record" }); - titleDef.resolve(); - } - defs.push(titleDef); + this.set({ 'title' : record.id ? record.display_name : "New record" }); if (this.qweb) { this.kill_current_form(); @@ -334,9 +322,9 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM _(this.fields).each(function (field, f) { field._dirty_flag = false; var result = field.set_value(self.datarecord[f] || false); - defs.push(result); + set_values.push(result); }); - return $.when.apply(null, defs).pipe(function() { + return $.when.apply(null, set_values).pipe(function() { if (!record.id) { // New record: Second pass in order to trigger the onchanges // respecting the fields order defined in the view @@ -635,8 +623,9 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM */ _actualize_mode: function(switch_to) { var mode = switch_to || this.get("actual_mode"); - if (! this.datarecord.id) + if (! this.datarecord.id) { mode = "create"; + } this.set({actual_mode: mode}); }, check_actual_mode: function(source, options) { @@ -672,8 +661,9 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM }, on_button_save: function() { var self = this; - return this.do_save().then(function(result) { + return this.do_save().then(function(result) { self.to_view_mode(); + self.fields.stage_id.render_list(); }); }, on_button_cancel: function(event) { @@ -693,6 +683,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM }); }, on_button_edit: function() { + this.fields.stage_id.render_list(); return this.to_edit_mode(); }, on_button_create: function() { @@ -776,16 +767,16 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM self.set({'display_invalid_fields': false}); var save_deferral; if (!self.datarecord.id) { - //console.log("FormView(", self, ") : About to create", values); + // console.log("FormView(", self, ") : About to create", values); save_deferral = self.dataset.create(values).pipe(function(r) { return self.on_created(r, undefined, prepend_on_create); }, null); } else if (_.isEmpty(values) && ! self.force_dirty) { - //console.log("FormView(", self, ") : Nothing to save"); + // console.log("FormView(", self, ") : Nothing to save"); save_deferral = $.Deferred().resolve({}).promise(); } else { self.force_dirty = false; - //console.log("FormView(", self, ") : About to save", values); + // console.log("FormView(", self, ") : About to save", values); save_deferral = self.dataset.write(self.datarecord.id, values, {}).pipe(function(r) { return self.on_saved(r); }, null); @@ -868,8 +859,10 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM if (self.dataset.index == null || self.dataset.index < 0) { return $.when(self.on_button_new()); } else { - return self.dataset.read_index(_.keys(self.fields_view.fields), { - context : { 'bin_size' : true } + var fields = _.keys(self.fields_view.fields); + fields.push('display_name'); + return self.dataset.read_index(fields, { + context : { 'bin_size' : true, 'future_display_name' : true } }).pipe(self.on_record_loaded); } }); @@ -2074,7 +2067,7 @@ instance.web.form.FieldChar = instance.web.form.AbstractField.extend(instance.we return this.get('value') === '' || this._super(); }, focus: function() { - this.delay_focus(this.$element.find('input:first')); + this.$element.find('input:first')[0].focus(); } }); @@ -4681,18 +4674,22 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ var content = instance.web.qweb.render("FieldStatus.content", {widget: this, _:_}); this.$element.html(content); clickable = this.node.attrs.clickable; - if (clickable != undefined && (clickable.toLowerCase() === 'true' || clickable === "1")) { + if (clickable != undefined && (clickable.toLowerCase() === 'true' || clickable === "1") /*&& + this.view.get("actual_mode") !== 'view'*/) { var elemts = this.$element.find('.oe_form_steps_item') _.each(elemts, function(element){ $item = $(element); - if($item.attr("data-id") != self.selected_value){ + if ($item.attr("data-id") != self.selected_value) { $item.attr("style", "cursor: pointer;"); $item.click(function(event){ var data_id = parseInt($(this).attr("data-id")) self.view.dataset.call('stage_set', [[self.view.datarecord.id],data_id]).then(function() { - return self.view.reload();}); + return self.view.reload(); + }); }); - }; + } else { + $item.attr("disable", true).addClass("ui-state-disabled"); + } }); } var colors = JSON.parse((this.node.attrs || {}).statusbar_colors || "{}"); diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 1e5b83efb86..fd99b9427f5 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1032,8 +1032,8 @@
  • - - + +
  • diff --git a/addons/web_calendar/__openerp__.py b/addons/web_calendar/__openerp__.py index 755d6fdb1f7..807d7927dc0 100644 --- a/addons/web_calendar/__openerp__.py +++ b/addons/web_calendar/__openerp__.py @@ -1,10 +1,7 @@ { "name": "Web Calendar", "category": "Hidden", - "description": - """ - OpenERP Web Calendar view. - """, + "description":"""OpenERP Web Calendar view.""", "version": "2.0", "depends": ['web'], "js": [ diff --git a/addons/web_dashboard/__openerp__.py b/addons/web_dashboard/__openerp__.py index a48b3f9c0f5..54f9ae294ac 100644 --- a/addons/web_dashboard/__openerp__.py +++ b/addons/web_dashboard/__openerp__.py @@ -1,10 +1,7 @@ { "name": "Web Dashboard", "category": "Hidden", - "description": - """ - OpenERP Web Dashboard view. - """, + "description":"""OpenERP Web Dashboard view.""", "version": "2.0", "depends": ['web'], "js": [ diff --git a/addons/web_diagram/__openerp__.py b/addons/web_diagram/__openerp__.py index 247506cf581..eda044f686f 100644 --- a/addons/web_diagram/__openerp__.py +++ b/addons/web_diagram/__openerp__.py @@ -1,7 +1,7 @@ { "name" : "OpenERP Web Diagram", "category" : "Hidden", - "description":'Openerp Web Diagram view', + "description":"""Openerp Web Diagram view.""", "version" : "2.0", "depends" : ["web"], "js": [ diff --git a/addons/web_gantt/__openerp__.py b/addons/web_gantt/__openerp__.py index 3357dbae53f..09528016c4c 100644 --- a/addons/web_gantt/__openerp__.py +++ b/addons/web_gantt/__openerp__.py @@ -1,10 +1,7 @@ { "name": "Web Gantt", "category": "Hidden", - "description": - """ - OpenERP Web Gantt chart view. - """, + "description":"""OpenERP Web Gantt chart view.""", "version": "2.0", "depends": ['web'], "js": [ diff --git a/addons/web_graph/__openerp__.py b/addons/web_graph/__openerp__.py index 84412a9c240..31c66863ebf 100644 --- a/addons/web_graph/__openerp__.py +++ b/addons/web_graph/__openerp__.py @@ -1,14 +1,16 @@ { "name": "Graph Views", "category" : "Hidden", - "description":"""Graph Views for Web Client + "description":""" +Graph Views for Web Client. +=========================== -* Parse a view but allows changing dynamically the presentation -* Graph Types: pie, lines, areas, bars, radar -* Stacked/Not Stacked for areas and bars -* Legends: top, inside (top/left), hidden -* Features: download as PNG or CSV, browse data grid, switch orientation -* Unlimited "Group By" levels (not stacked), two cross level analysis (stacked) + * Parse a view but allows changing dynamically the presentation + * Graph Types: pie, lines, areas, bars, radar + * Stacked/Not Stacked for areas and bars + * Legends: top, inside (top/left), hidden + * Features: download as PNG or CSV, browse data grid, switch orientation + * Unlimited "Group By" levels (not stacked), two cross level analysis (stacked) """, "version": "3.0", "depends": ['web'], diff --git a/addons/web_hello/__openerp__.py b/addons/web_hello/__openerp__.py index b7e17a520a8..0c733fb6b64 100644 --- a/addons/web_hello/__openerp__.py +++ b/addons/web_hello/__openerp__.py @@ -1,10 +1,7 @@ { "name": "Hello", "category": "Hidden", - "description": - """ - OpenERP Web example module. - """, + "description":"""OpenERP Web example module.""", "version": "2.0", "depends": [], "js": ["static/*/*.js", "static/*/js/*.js"], diff --git a/addons/web_kanban/__openerp__.py b/addons/web_kanban/__openerp__.py index 8a769342461..d283acfe91f 100644 --- a/addons/web_kanban/__openerp__.py +++ b/addons/web_kanban/__openerp__.py @@ -1,10 +1,7 @@ { "name" : "Base Kanban", "category": "Hidden", - "description": - """ - OpenERP Web kanban view. - """, + "description":"""OpenERP Web kanban view.""", "version" : "2.0", "depends" : ["web"], "js": [ diff --git a/addons/web_mobile/__openerp__.py b/addons/web_mobile/__openerp__.py index cd5a4836a5a..614315a8a83 100644 --- a/addons/web_mobile/__openerp__.py +++ b/addons/web_mobile/__openerp__.py @@ -1,10 +1,7 @@ { "name" : "OpenERP Web Mobile", "category": "Hidden", - "description": - """ - OpenERP Web Mobile. - """, + "description":"""OpenERP Web Mobile.""", "version" : "2.0", "depends" : [], 'auto_install': True, diff --git a/addons/web_process/__openerp__.py b/addons/web_process/__openerp__.py index b488ddb95d2..9aea38a0676 100644 --- a/addons/web_process/__openerp__.py +++ b/addons/web_process/__openerp__.py @@ -1,10 +1,7 @@ { "name" : "Process", "version": "2.0", - "description": - """ - OpenERP Web process view. - """, + "description":"""OpenERP Web process view.""", "depends" : ["web_diagram"], "js": [ 'static/lib/dracula/*.js', diff --git a/addons/web_rpc/__openerp__.py b/addons/web_rpc/__openerp__.py index 27ec39f5748..44946d27cb5 100644 --- a/addons/web_rpc/__openerp__.py +++ b/addons/web_rpc/__openerp__.py @@ -1,7 +1,7 @@ { "name" : "OpenERP Web Web", "category" : "Hidden", - "description":'Openerp Web Web', + "description":"""Openerp Web Web.""", "version" : "2.0", "depends" : [], "installable" : False, diff --git a/addons/web_tests/__openerp__.py b/addons/web_tests/__openerp__.py index dc26ecc42ad..b76028b9418 100644 --- a/addons/web_tests/__openerp__.py +++ b/addons/web_tests/__openerp__.py @@ -1,10 +1,7 @@ { "name": "Tests", "category": "Hidden", - "description": - """ - OpenERP Web test suite. - """, + "description":"""OpenERP Web test suite.""", "version": "2.0", "depends": [], "js": ["static/src/js/*.js"],