← Back to team overview

openerp-dev-web team mailing list archive

[Merge] lp:~openerp-dev/openobject-client-web/one2many-onchange into lp:openobject-client-web

 

sma (Open ERP) has proposed merging lp:~openerp-dev/openobject-client-web/one2many-onchange into lp:openobject-client-web.

Requested reviews:
  OpenERP SA's Web Client R&D (openerp-dev-web)
Related bugs:
  #671608 customer payment doesn't work in web version
  https://bugs.launchpad.net/bugs/671608


Implement onchange for one2many widget.
For testing refer Bug #671608.
-- 
https://code.launchpad.net/~openerp-dev/openobject-client-web/one2many-onchange/+merge/41437
Your team OpenERP R&D Team is subscribed to branch lp:~openerp-dev/openobject-client-web/one2many-onchange.
=== modified file 'addons/openerp/controllers/listgrid.py'
--- addons/openerp/controllers/listgrid.py	2010-11-17 12:21:33 +0000
+++ addons/openerp/controllers/listgrid.py	2010-11-22 11:22:18 +0000
@@ -26,6 +26,8 @@
 # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html
 #
 ###############################################################################
+import copy
+
 import cherrypy
 from openerp.controllers import SecuredController
 from openerp.utils import rpc, TinyDict, TinyForm, TinyFormError, context_with_concurrency_info, cache
@@ -141,6 +143,39 @@
         o2m_value.pop(int(index))
         return dict(o2m_value=ustr(o2m_value))
 
+    @expose('json')
+    def get_o2m_defaults(self, o2m_values, model, o2m_model, name, view_type, view_id,
+                         o2m_view_type, o2m_view_id, editable, limit, offset, o2m_context, o2m_domain):
+
+        view_id = view_id or False
+        o2m_view_id = eval(o2m_view_id) or False
+
+        context = dict((eval(o2m_context) or {}), **rpc.session.context)
+
+        import simplejson
+        o2m_values = simplejson.loads(o2m_values)
+
+        if o2m_values and isinstance(o2m_values, unicode):
+            o2m_values = eval(o2m_values)
+
+        for o2m in o2m_values:
+            o2m['id'] = 0
+
+        if o2m_view_id:
+            view = cache.fields_view_get(o2m_model, o2m_view_id, o2m_view_type, context)
+        else:
+            view = cache.fields_view_get(model, view_id, view_type, rpc.session.context)
+            view = view['fields'].get(name).get('views').get(o2m_view_type)
+
+        list_view = listgrid.List(name, model, view, ids=None, domain=o2m_domain, context=context, default_data=copy.deepcopy(o2m_values), limit=20, editable= editable,o2m=1)
+        view=ustr(list_view.render())
+        formated_o2m_values = []
+        for o2m in o2m_values:
+            o2m.pop('id', None)
+            formated_o2m_values.append((0, 0, o2m))
+
+        return dict(view=view, formated_o2m_values=ustr(formated_o2m_values))
+
     @expose()
     def multiple_groupby(self, model, name, grp_domain, group_by, view_id, view_type, parent_group, group_level, groups, no_leaf, **kw):
         grp_domain = ast.literal_eval(grp_domain)

=== modified file 'addons/openerp/static/javascript/form.js'
--- addons/openerp/static/javascript/form.js	2010-11-18 15:08:20 +0000
+++ addons/openerp/static/javascript/form.js	2010-11-22 11:22:18 +0000
@@ -525,6 +525,59 @@
 
                 var kind = jQuery(fld).attr('kind');
 
+                if (!kind) {
+                    var class = jQuery(fld).attr('class');
+                    if (class=='gridview'){
+                        if (getElement('_terp_default_o2m/'+k) && !value) {
+                            if (getElement('_terp_default_o2m/'+k).value=='' && !value)
+                                continue;
+                            else if(getElement('_terp_default_o2m/'+k).value && !value) {
+                                getElement('_terp_default_o2m/'+k).value = '';
+                                new ListView(k).reload();
+                            }
+                        }
+                        else if (value) {
+                            var parentmodel = openobject.dom.get('_terp_model').value;
+                            var o2m_model = openobject.dom.get(prefix + k + '/_terp_model').value;
+                            var view_type = openobject.dom.get('_terp_view_type').value;
+                            var view_id = openobject.dom.get('_terp_view_id').value;
+                            var o2m_view_type = openobject.dom.get(prefix + k + '/_terp_view_type').value;
+                            var o2m_view_id = openobject.dom.get(prefix + k + '/_terp_view_id').value;
+                            var o2m_editable = openobject.dom.get(prefix + k + '/_terp_editable').value;
+                            var o2m_limit = openobject.dom.get(prefix + k + '/_terp_limit').value;
+                            var o2m_offset = openobject.dom.get(prefix + k + '/_terp_offset').value;
+                            var o2m_context = openobject.dom.get(prefix + k + '/_terp_context').value;
+                            var o2m_domain = openobject.dom.get(prefix + k + '/_terp_domain').value;
+                            var request = openobject.http.postJSON('/openerp/listgrid/get_o2m_defaults', { 'o2m_values': serializeJSON(value),
+                                   'model': parentmodel,
+                                   'o2m_model': o2m_model,
+                                   'name': k,
+                                   'view_type': view_type,
+                                   'view_id': view_id,
+                                   'o2m_view_type':o2m_view_type,
+                                   'o2m_view_id':o2m_view_id,
+                                   'editable': o2m_editable,
+                                   'limit': o2m_limit,
+                                   'offset': o2m_offset,
+                                   'o2m_context': o2m_context,
+                                   'o2m_domain': o2m_domain
+                            });
+                            request.addCallback(function(obj){
+                                jQuery(fld).closest('.list-a').replaceWith(obj.view);
+                                if (openobject.dom.get('_terp_default_o2m/'+k)) {
+                                    openobject.dom.get('_terp_default_o2m/'+k).value = obj.formated_o2m_values;
+                                }
+                                else {
+                                    var input = INPUT({'type': 'hidden', 'value': obj.formated_o2m_values, 'id': '_terp_default_o2m/'+k, 'name': '_terp_default_o2m/'+k})
+                                    getFirstParentByTagAndClassName(k, 'td', 'o2m_cell').appendChild(input);
+                                }
+                            });
+                        }
+                    }
+                    fld.__lock_onchange = true;
+                    return;
+                }
+
                 switch (kind) {
                     case 'picture':
                         fld.src = value;

=== modified file 'addons/openerp/widgets/form/_form.py'
--- addons/openerp/widgets/form/_form.py	2010-11-17 11:02:00 +0000
+++ addons/openerp/widgets/form/_form.py	2010-11-22 11:22:18 +0000
@@ -438,7 +438,7 @@
 #            self.default = 0.0
 
     def set_value(self, value):
-        self.default = value
+        self.default = value or 0.0
 
 register_widget(Float, ["float"])
 
@@ -502,8 +502,11 @@
                 self.options = proxy.name_get(ids, ctx)
             except:
                 self.options = []
+
+        if self.options and self.options[0][0] == '' and isinstance(self.options[0][0], unicode):
+            self.validator = validators.Selection()
         # determine the actual type
-        if self.options and isinstance(self.options[0][0], basestring):
+        elif self.options and isinstance(self.options[0][0], basestring):
             self.kind = 'char'
             self.validator = validators.String()
         else:

=== modified file 'addons/openerp/widgets/listgrid.py'
--- addons/openerp/widgets/listgrid.py	2010-11-17 11:02:00 +0000
+++ addons/openerp/widgets/listgrid.py	2010-11-22 11:22:18 +0000
@@ -153,7 +153,7 @@
 
         proxy = rpc.RPCProxy(model)
 
-        if not self.o2m and not self.m2m and not terp_params.get('_terp_search_text'):
+        if not kw.get('default_data') and not self.o2m and not self.m2m and not terp_params.get('_terp_search_text'):
             if self.limit > 0:
                 if self.sort_key:
                     ids = proxy.search(search_param, self.offset, self.limit, self.sort_key + ' ' +self.sort_order, context)


Follow ups