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"],