summaryrefslogtreecommitdiff
path: root/addons/web
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web')
-rw-r--r--addons/web/controllers/main.py29
-rw-r--r--addons/web/static/src/js/view_form.js28
-rw-r--r--addons/web/static/src/js/view_list_editable.js5
-rw-r--r--addons/web/static/src/js/view_tree.js22
-rw-r--r--addons/web/static/src/xml/base.xml9
-rw-r--r--addons/web/views/database_manager.html4
-rw-r--r--addons/web/views/database_selector.html2
7 files changed, 60 insertions, 39 deletions
diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py
index e95e8f3c58b..cec9ae94837 100644
--- a/addons/web/controllers/main.py
+++ b/addons/web/controllers/main.py
@@ -744,24 +744,21 @@ class Database(http.Controller):
return {'error': _('Could not drop database !'), 'title': _('Drop Database')}
@http.route('/web/database/backup', type='http', auth="none")
- def backup(self, backup_db, backup_pwd, token, **kwargs):
+ def backup(self, backup_db, backup_pwd, token, backup_format='zip'):
try:
- format = kwargs.get('format')
- ext = "zip" if format == 'zip' else "dump"
- db_dump = base64.b64decode(
- request.session.proxy("db").dump(backup_pwd, backup_db, format))
- filename = "%(db)s_%(timestamp)s.%(ext)s" % {
- 'db': backup_db,
- 'timestamp': datetime.datetime.utcnow().strftime(
- "%Y-%m-%d_%H-%M-%SZ"),
- 'ext': ext
- }
- return request.make_response(db_dump,
- [('Content-Type', 'application/octet-stream; charset=binary'),
- ('Content-Disposition', content_disposition(filename))],
- {'fileToken': token}
- )
+ openerp.service.security.check_super(backup_pwd)
+ ts = datetime.datetime.utcnow().strftime("%Y-%m-%d_%H-%M-%S")
+ filename = "%s_%s.%s" % (backup_db, ts, backup_format)
+ headers = [
+ ('Content-Type', 'application/octet-stream; charset=binary'),
+ ('Content-Disposition', content_disposition(filename)),
+ ]
+ dump_stream = openerp.service.db.dump_db(backup_db, None, backup_format)
+ response = werkzeug.wrappers.Response(dump_stream, headers=headers, direct_passthrough=True)
+ response.set_cookie('fileToken', token)
+ return response
except Exception, e:
+ _logger.exception('Database.backup')
return simplejson.dumps([[],[{'error': openerp.tools.ustr(e), 'title': _('Backup Database')}]])
@http.route('/web/database/restore', type='http', auth="none")
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 296c78d8d6d..abbc1330804 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -3554,7 +3554,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
reinit_value: function(val) {
this.internal_set_value(val);
this.floating = false;
- if (this.is_started)
+ if (this.is_started && !this.no_rerender)
this.render_value();
},
initialize_field: function() {
@@ -3805,7 +3805,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
}
if (! no_recurse) {
var dataset = new instance.web.DataSetStatic(this, this.field.relation, self.build_context());
- this.alive(dataset.name_get([self.get("value")])).done(function(data) {
+ var def = this.alive(dataset.name_get([self.get("value")])).done(function(data) {
if (!data[0]) {
self.do_warn(_t("Render"), _t("No value found for the field "+self.field.string+" for value "+self.get("value")));
return;
@@ -3818,6 +3818,9 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
self.display_value["" + self.get("value")] = self.display_value_backup["" + self.get("value")];
self.render_value(true);
});
+ if (this.view && this.view.render_value_defs){
+ this.view.render_value_defs.push(def);
+ }
}
},
display_string: function(str) {
@@ -4293,7 +4296,7 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({
this.dataset.index = 0;
}
this.trigger_on_change();
- if (this.is_started) {
+ if (this.is_started && !this.no_rerender) {
return self.reload_current_view();
} else {
return $.when();
@@ -4437,12 +4440,19 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
return true;
}
var r;
- return _.every(this.records.records, function(record){
+ if (_.isEmpty(this.records.records)){
+ return true;
+ }
+ current_values = {};
+ _.each(this.editor.form.fields, function(field){
+ field._inhibit_on_change_flag = true;
+ field.no_rerender = true;
+ current_values[field.name] = field.get('value');
+ });
+ var valid = _.every(this.records.records, function(record){
r = record;
_.each(self.editor.form.fields, function(field){
- field._inhibit_on_change_flag = true;
field.set_value(r.attributes[field.name]);
- field._inhibit_on_change_flag = false;
});
return _.every(self.editor.form.fields, function(field){
field.process_modifiers();
@@ -4450,6 +4460,12 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
return field.is_valid();
});
});
+ _.each(this.editor.form.fields, function(field){
+ field.set('value', current_values[field.name]);
+ field._inhibit_on_change_flag = false;
+ field.no_rerender = false;
+ });
+ return valid;
},
do_add_record: function () {
if (this.editable()) {
diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js
index 831d383c731..77559504060 100644
--- a/addons/web/static/src/js/view_list_editable.js
+++ b/addons/web/static/src/js/view_list_editable.js
@@ -231,8 +231,9 @@
this.records.add(record, {
at: this.prepends_on_create() ? 0 : null});
}
-
- return this.ensure_saved().then(function () {
+ return this.ensure_saved().then(function(){
+ return $.when.apply(null, self.editor.form.render_value_defs);
+ }).then(function () {
var $recordRow = self.groups.get_row_for(record);
var cells = self.get_cells_for($recordRow);
var fields = {};
diff --git a/addons/web/static/src/js/view_tree.js b/addons/web/static/src/js/view_tree.js
index 68915077a48..06e19e28ca9 100644
--- a/addons/web/static/src/js/view_tree.js
+++ b/addons/web/static/src/js/view_tree.js
@@ -222,27 +222,25 @@ instance.web.TreeView = instance.web.View.extend(/** @lends instance.web.TreeVie
var local_context = {
active_model: self.dataset.model,
active_id: id,
- active_ids: [id]};
+ active_ids: [id]
+ };
+ var ctx = instance.web.pyeval.eval(
+ 'context', new instance.web.CompoundContext(
+ this.dataset.get_context(), local_context));
return this.rpc('/web/treeview/action', {
id: id,
model: this.dataset.model,
- context: instance.web.pyeval.eval(
- 'context', new instance.web.CompoundContext(
- this.dataset.get_context(), local_context))
+ context: ctx
}).then(function (actions) {
if (!actions.length) { return; }
var action = actions[0][2];
- var c = new instance.web.CompoundContext(local_context);
+ var c = new instance.web.CompoundContext(local_context).set_eval_context(ctx);
if (action.context) {
c.add(action.context);
}
- return instance.web.pyeval.eval_domains_and_contexts({
- contexts: [c], domains: []
- }).then(function (res) {
- action.context = res.context;
- return self.do_action(action);
- }, null);
- }, null);
+ action.context = c;
+ return self.do_action(action);
+ });
},
// show & hide the contents
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index b0bceafc5a3..7d053f81700 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -216,6 +216,15 @@
</td>
</tr>
<tr>
+ <td><label for="backup_format">Backup format:</label></td>
+ <td class="oe_form_field oe_form_field_selection">
+ <select name="backup_format">
+ <option value="zip">zip (includes filestore)</option>
+ <option value="dump">pg_dump custom format (without filestore)</option>
+ </select>
+ </td>
+ </tr>
+ <tr>
<td><label for="backup_pwd">Master Password:</label></td>
<td><input type="password" name="backup_pwd" class="required" /></td>
</tr>
diff --git a/addons/web/views/database_manager.html b/addons/web/views/database_manager.html
index da2c1a9f41a..79a193f283f 100644
--- a/addons/web/views/database_manager.html
+++ b/addons/web/views/database_manager.html
@@ -3,7 +3,7 @@
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
- <title>OpenERP</title>
+ <title>Odoo</title>
<link rel="shortcut icon" href="/web/static/src/img/favicon.ico" type="image/x-icon"/>
<link rel="stylesheet" href="/web/static/src/css/full.css" />
<script src="/web/static/lib/es5-shim/es5-shim.min.js" type="text/javascript"></script>
@@ -104,4 +104,4 @@
<script>CFInstall.check({mode: "overlay"});</script>
<![endif]-->
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/addons/web/views/database_selector.html b/addons/web/views/database_selector.html
index 8164ddb9498..67c82c6c260 100644
--- a/addons/web/views/database_selector.html
+++ b/addons/web/views/database_selector.html
@@ -2,7 +2,7 @@
<html style="height: 100%">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
- <title>OpenERP</title>
+ <title>Odoo</title>
<link rel="shortcut icon" href="/web/static/src/img/favicon.ico" type="image/x-icon">
<link rel="stylesheet" href="/web/static/src/css/full.css">
<link rel="stylesheet" href="/web/static/lib/fontawesome/css/font-awesome.css">