mirror of https://github.com/OCA/web.git
[ADD] web_readonly_bypass: allow to save an onchange modifications on readonly fields
parent
b81959e97e
commit
749b47ee15
|
@ -0,0 +1,28 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Authors: Nemry Jonathan & Laetitia Gangloff
|
||||
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
|
||||
# All Rights Reserved
|
||||
#
|
||||
# WARNING: This program as such is intended to be used by professional
|
||||
# programmers who take the whole responsibility of assessing all potential
|
||||
# consequences resulting from its eventual inadequacies and bugs.
|
||||
# End users who are looking for a ready-to-use solution with commercial
|
||||
# guarantees and support are strongly advised to contact a Free Software
|
||||
# Service Company.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
|
@ -0,0 +1,61 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Authors: Nemry Jonathan & Laetitia Gangloff
|
||||
# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu)
|
||||
# All Rights Reserved
|
||||
#
|
||||
# WARNING: This program as such is intended to be used by professional
|
||||
# programmers who take the whole responsibility of assessing all potential
|
||||
# consequences resulting from its eventual inadequacies and bugs.
|
||||
# End users who are looking for a ready-to-use solution with commercial
|
||||
# guarantees and support are strongly advised to contact a Free Software
|
||||
# Service Company.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
{
|
||||
'name': 'Read Only ByPass',
|
||||
'version': '1.0',
|
||||
"author": "ACSONE SA/NV",
|
||||
"maintainer": "ACSONE SA/NV",
|
||||
"website": "http://www.acsone.eu",
|
||||
'category': 'Technical Settings',
|
||||
'depends': [
|
||||
'base',
|
||||
'web',
|
||||
],
|
||||
'description': """
|
||||
Read Only ByPass
|
||||
================
|
||||
This Module provides a solution to the problem of the interaction between
|
||||
'readonly' attribute and 'on_change' attribute when used together
|
||||
|
||||
Behavior: add `readonly_fields` changed by `on_change` into the fields passing
|
||||
into an update or create. If `filter_out_readonly` is into the context and set
|
||||
True then apply native behavior.
|
||||
""",
|
||||
'images': [],
|
||||
'data': [
|
||||
'views/readonly_bypass.xml',
|
||||
],
|
||||
'qweb': [
|
||||
],
|
||||
'css': [],
|
||||
'demo': [],
|
||||
'test': [],
|
||||
'installable': True,
|
||||
'auto_install': False,
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
/*
|
||||
* Allow to bypass readonly fi the value is changed
|
||||
*/
|
||||
|
||||
openerp.readonly_bypass = function(instance) {
|
||||
|
||||
var QWeb = instance.web.qweb, _t = instance.web._t;
|
||||
/**
|
||||
* ignore readonly: place options['readonly_fields'] into the data
|
||||
* if nothing is specified into the context
|
||||
*
|
||||
* create mode: remove read-only keys having a 'false' value
|
||||
*
|
||||
* @param boolean mode: True case of create, false case of write
|
||||
* @param {Object} context->filter_out_readonly
|
||||
* @param {Object} data field values to possibly be updated
|
||||
* @param {Object} options Dictionary that can contain the following keys:
|
||||
* - readonly_fields: Values from readonly fields to merge into the data object
|
||||
*/
|
||||
function ignore_readonly(data, options, mode, context){
|
||||
if (options){
|
||||
if (!('filter_out_readonly' in context && context['filter_out_readonly'] == true
|
||||
&& 'readonly_fields' in options && options['readonly_fields'])) {
|
||||
if(mode){
|
||||
$.each( options.readonly_fields, function( key, value ) {
|
||||
if(value==false){
|
||||
delete(options.readonly_fields[key]);
|
||||
}
|
||||
});
|
||||
}
|
||||
data = $.extend(data,options['readonly_fields'])
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
instance.web.BufferedDataSet.include({
|
||||
|
||||
init : function() {
|
||||
this._super.apply(this, arguments);
|
||||
},
|
||||
/**
|
||||
* Creates Overriding
|
||||
*
|
||||
* @param {Object} data field values to set on the new record
|
||||
* @param {Object} options Dictionary that can contain the following keys:
|
||||
* - readonly_fields: Values from readonly fields that were updated by
|
||||
* on_changes. Only used by the BufferedDataSet to make the o2m work correctly.
|
||||
* @returns super {$.Deferred}
|
||||
*/
|
||||
create : function(data, options) {
|
||||
var self = this;
|
||||
ignore_readonly(data, options, true, self.context);
|
||||
return self._super(data,options);
|
||||
},
|
||||
/**
|
||||
* Creates Overriding
|
||||
*
|
||||
* @param {Object} data field values to set on the new record
|
||||
* @param {Object} options Dictionary that can contain the following keys:
|
||||
* - readonly_fields: Values from readonly fields that were updated by
|
||||
* on_changes. Only used by the BufferedDataSet to make the o2m work correctly.
|
||||
* @returns super {$.Deferred}
|
||||
*/
|
||||
write : function(id, data, options) {
|
||||
var self = this;
|
||||
ignore_readonly(data, options, false, self.context);
|
||||
return self._super(id,data,options);
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
instance.web.DataSet.include({
|
||||
/*
|
||||
BufferedDataSet: case of 'add an item' into a form view
|
||||
*/
|
||||
init : function() {
|
||||
this._super.apply(this, arguments);
|
||||
},
|
||||
/**
|
||||
* Creates Overriding
|
||||
*
|
||||
* @param {Object} data field values to set on the new record
|
||||
* @param {Object} options Dictionary that can contain the following keys:
|
||||
* - readonly_fields: Values from readonly fields that were updated by
|
||||
* on_changes. Only used by the BufferedDataSet to make the o2m work correctly.
|
||||
* @returns super {$.Deferred}
|
||||
*/
|
||||
create : function(data, options) {
|
||||
var self = this;
|
||||
ignore_readonly(data, options, true, self.context);
|
||||
return self._super(data,options);
|
||||
},
|
||||
/**
|
||||
* Creates Overriding
|
||||
*
|
||||
* @param {Object} data field values to set on the new record
|
||||
* @param {Object} options Dictionary that can contain the following keys:
|
||||
* - readonly_fields: Values from readonly fields that were updated by
|
||||
* on_changes. Only used by the BufferedDataSet to make the o2m work correctly.
|
||||
* @returns super {$.Deferred}
|
||||
*/
|
||||
write : function(id, data, options) {
|
||||
var self = this;
|
||||
ignore_readonly(data, options, false, self.context);
|
||||
return self._super(id,data,options);
|
||||
},
|
||||
|
||||
});
|
||||
};
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- vim:fdn=3:
|
||||
-->
|
||||
<openerp>
|
||||
<data>
|
||||
<template id="assets_backend" name="readonly_bypass" inherit_id="web.assets_backend">
|
||||
<xpath expr="." position="inside">
|
||||
<script type="text/javascript" src="/readonly_bypass/static/src/js/readonly_bypass.js"></script>
|
||||
</xpath>
|
||||
</template>
|
||||
</data>
|
||||
</openerp>
|
Loading…
Reference in New Issue