← Back to team overview

openerp-dev-web team mailing list archive

[Merge] lp:~openerp-dev/openobject-client-web/action-feature-niv into lp:~openerp-dev/openobject-client-web/trunk-proto61

 

Nicolas Vanhoren (OpenERP) has proposed merging lp:~openerp-dev/openobject-client-web/action-feature-niv into lp:~openerp-dev/openobject-client-web/trunk-proto61.

Requested reviews:
  Antony Lesuisse (al-openerp)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-client-web/action-feature-niv/+merge/56981

Added handling of external actions (currently only popups working).
-- 
https://code.launchpad.net/~openerp-dev/openobject-client-web/action-feature-niv/+merge/56981
Your team OpenERP R&D Team is subscribed to branch lp:~openerp-dev/openobject-client-web/trunk-proto61.
=== modified file 'addons/base/controllers/main.py'
--- addons/base/controllers/main.py	2011-04-07 13:07:25 +0000
+++ addons/base/controllers/main.py	2011-04-08 17:21:52 +0000
@@ -9,6 +9,8 @@
 import openerpweb.ast
 import openerpweb.nonliterals
 
+import cherrypy
+
 # Should move to openerpweb.Xml2Json
 class Xml2Json:
     # xml2json-direct
@@ -168,26 +170,71 @@
             'domain': domain,
             'group_by': group_by_sequence
         }
+
+    @openerpweb.jsonrequest
+    def save_session_action(self, req, the_action):
+        """
+        This method store an action object in the session object and returns an integer
+        identifying that action. The method get_session_action() can be used to get
+        back the action.
+        
+        :param the_action: The action to save in the session.
+        :type the_action: anything
+        :return: A key identifying the saved action.
+        :rtype: integer
+        """
+        saved_actions = cherrypy.session.get('saved_actions')
+        if not saved_actions:
+            saved_actions = {"next":0, "actions":{}}
+            cherrypy.session['saved_actions'] = saved_actions
+        # we don't allow more than 10 stored actions
+        if len(saved_actions["actions"]) >= 10:
+            del saved_actions["actions"][min(saved_actions["actions"].keys())]
+        key = saved_actions["next"]
+        saved_actions["actions"][key] = the_action
+        saved_actions["next"] = key + 1
+        return key
+
+    @openerpweb.jsonrequest
+    def get_session_action(self, req, key):
+        """
+        Gets back a previously saved action. This method can return None if the action
+        was saved since too much time (this case should be handled in a smart way).
+        
+        :param key: The key given by save_session_action()
+        :type key: integer
+        :return: The saved action or None.
+        :rtype: anything
+        """
+        saved_actions = cherrypy.session.get('saved_actions')
+        if not saved_actions:
+            return None
+        return saved_actions["actions"].get(key)
+        
         
 def load_actions_from_ir_values(req, key, key2, models, meta, context):
     Values = req.session.model('ir.values')
     actions = Values.get(key, key2, models, meta, context)
 
     for _, _, action in actions:
-        # values come from the server, we can just eval them
-        if isinstance(action['context'], basestring):
-            action['context'] = eval(
-                action['context'],
-                req.session.evaluation_context()) or {}
+        clean_action(action, req.session)
 
-        if isinstance(action['domain'], basestring):
-            action['domain'] = eval(
-                action['domain'],
-                req.session.evaluation_context(
-                    action['context'])) or []
-        fix_view_modes(action)
     return actions
 
+def clean_action(action, session):
+    # values come from the server, we can just eval them
+    if isinstance(action['context'], basestring):
+        action['context'] = eval(
+            action['context'],
+            session.evaluation_context()) or {}
+
+    if isinstance(action['domain'], basestring):
+        action['domain'] = eval(
+            action['domain'],
+            session.evaluation_context(
+                action['context'])) or []
+    fix_view_modes(action)
+
 def fix_view_modes(action):
     """ For historical reasons, OpenERP has weird dealings in relation to
     view_mode and the view_type attribute (on window actions):
@@ -354,9 +401,9 @@
         return {'result': r}
 
 class View(openerpweb.Controller):
-    def fields_view_get(self, session, model, view_id, view_type, transform=True):
+    def fields_view_get(self, session, model, view_id, view_type, transform=True, toolbar=False, submenu=False):
         Model = session.model(model)
-        r = Model.fields_view_get(view_id, view_type)
+        r = Model.fields_view_get(view_id, view_type, {}, toolbar, submenu)
         if transform:
             context = {} # TODO: dict(ctx_sesssion, **ctx_action)
             xml = self.transform_view(r['arch'], session, context)
@@ -460,16 +507,16 @@
     _cp_path = "/base/formview"
 
     @openerpweb.jsonrequest
-    def load(self, req, model, view_id):
-        fields_view = self.fields_view_get(req.session, model, view_id, 'form')
+    def load(self, req, model, view_id, toolbar=False):
+        fields_view = self.fields_view_get(req.session, model, view_id, 'form', toolbar=toolbar)
         return {'fields_view': fields_view}
 
 class ListView(View):
     _cp_path = "/base/listview"
 
     @openerpweb.jsonrequest
-    def load(self, req, model, view_id):
-        fields_view = self.fields_view_get(req.session, model, view_id, 'tree')
+    def load(self, req, model, view_id, toolbar=False):
+        fields_view = self.fields_view_get(req.session, model, view_id, 'tree', toolbar=toolbar)
         return {'fields_view': fields_view}
 
 class SearchView(View):
@@ -479,15 +526,6 @@
     def load(self, req, model, view_id):
         fields_view = self.fields_view_get(req.session, model, view_id, 'search')
         return {'fields_view': fields_view}
-    
-class SideBar(View):
-    _cp_path = "/base/sidebar"
-    
-    @openerpweb.jsonrequest
-    def get_actions(self, request, model, object_id=0):
-        result = load_actions_from_ir_values(request, "action", "client_action_multi",
-                                             [[model, object_id]], False, {})
-        return result
 
 class Action(openerpweb.Controller):
     _cp_path = "/base/action"

=== modified file 'addons/base/static/src/js/form.js'
--- addons/base/static/src/js/form.js	2011-04-08 10:37:36 +0000
+++ addons/base/static/src/js/form.js	2011-04-08 17:21:52 +0000
@@ -30,7 +30,8 @@
     },
     start: function() {
         //this.log('Starting FormView '+this.model+this.view_id)
-        return this.rpc("/base/formview/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded);
+        return this.rpc("/base/formview/load", {"model": this.model, "view_id": this.view_id,
+            toolbar:!!this.view_manager.sidebar}, this.on_loaded);
     },
     on_loaded: function(data) {
         var self = this;
@@ -54,7 +55,7 @@
 
         // sidebar stuff
         if (this.view_manager.sidebar) {
-            this.view_manager.sidebar.load_multi_actions();
+            this.view_manager.sidebar.set_toolbar(data.fields_view.toolbar);
         }
     },
     do_show: function () {

=== modified file 'addons/base/static/src/js/list.js'
--- addons/base/static/src/js/list.js	2011-04-08 10:37:36 +0000
+++ addons/base/static/src/js/list.js	2011-04-08 17:21:52 +0000
@@ -36,7 +36,8 @@
     },
     start: function() {
         //this.log('Starting ListView '+this.model+this.view_id)
-        return this.rpc("/base/listview/load", {"model": this.model, "view_id":this.view_id}, this.on_loaded);
+        return this.rpc("/base/listview/load", {"model": this.model, "view_id":this.view_id,
+            toolbar:!!this.view_manager.sidebar}, this.on_loaded);
     },
     on_loaded: function(data) {
         this.fields_view = data.fields_view;
@@ -73,8 +74,9 @@
                 'tr', 'click', this.on_select_row);
 
         // sidebar stuff
-        if (this.view_manager.sidebar)
-            this.view_manager.sidebar.load_multi_actions();
+        if (this.view_manager.sidebar) {
+            this.view_manager.sidebar.set_toolbar(data.fields_view.toolbar);
+        }
     },
     /**
      * Fills the table with the provided records after emptying it

=== modified file 'addons/base/static/src/js/views.js'
--- addons/base/static/src/js/views.js	2011-04-08 10:37:36 +0000
+++ addons/base/static/src/js/views.js	2011-04-08 17:21:52 +0000
@@ -20,7 +20,7 @@
             if (this.viewmanager) {
                 this.viewmanager.stop();
             }
-            this.viewmanager = new openerp.base.ViewManagerAction(this.session,this.element_id, action, false);
+            this.viewmanager = new openerp.base.ViewManagerAction(this.session,this.element_id, action, true);
             this.viewmanager.start();
         }
     }
@@ -158,10 +158,13 @@
                 search_defaults[match[1]] = value;
             }
         });
-        var searchview_loaded = this.setup_search_view(view_id,search_defaults);
+        var searchview_loaded = null;
+        if (view_id) {
+            searchview_loaded = this.setup_search_view(view_id,search_defaults);
+        }
 
         // schedule auto_search
-        if (this.action['auto_search']) {
+        if (searchview_loaded != null && this.action['auto_search']) {
             $.when(searchview_loaded, inital_view_loaded)
                 .then(this.searchview.do_search);
         }
@@ -274,16 +277,16 @@
         this.view_manager = view_manager;
         this.sections = [];
     },
-    load_multi_actions: function() {
-        if (_.detect(this.sections, function(x) {return x.type=="multi_actions";}) != undefined)
-            return;
+    set_toolbar: function(toolbar) {
+        this.sections = [];
         var self = this;
-        this.rpc("/base/sidebar/get_actions",
-                {"model": this.view_manager.dataset.model}, function(result) {
-            self.sections.push({type: "multi_actions", elements:
-            _.map(result, function(x) {return {text:x[2].name, action:x}; })});
-            self.refresh();
+        _.each(["print", "action", "relate"], function(type) {
+            if (toolbar[type].length == 0)
+                return;
+            var section = {elements:toolbar[type]};
+            self.sections.push(section);
         });
+        this.refresh();
     },
     refresh: function() {
         this.$element.html(QWeb.render("ViewManager.sidebar.internal", _.extend({_:_}, this)));
@@ -291,10 +294,10 @@
         this.$element.find("a").click(function(e) {
             var $this = jQuery(this);
             var i = $this.attr("data-i");
-            var j = $this.attr("data-i");
+            var j = $this.attr("data-j");
             var action = self.sections[i].elements[j];
-            // I know this doesn't work, one day it will
-            new openerp.base.ActionManager(this.view_manager, null).do_action(action);
+            (new openerp.base.ExternalActionManager(self.view_manager.session, null))
+                .handle_action(action);
             e.stopPropagation();
             e.preventDefault();
         });
@@ -305,6 +308,32 @@
     }
 });
 
+openerp.base.ExternalActionManager = openerp.base.Controller.extend({
+    handle_action: function(action) {
+        if(action.type=="ir.actions.act_window") {
+            if(action.target=="new") {
+                var element_id = _.uniqueId("act_window_dialog");
+                var dialog = $('<div id="'+element_id+'"></div>');
+                dialog.dialog({
+                    title: action.name
+                });
+                var viewmanager = new openerp.base.ViewManagerAction(this.session
+                        ,element_id, action, false);
+                viewmanager.start();
+            } else if (action.target == "current") {
+                this.rpc("/base/session/save_session_action", {the_action:action}, function(key) {
+                    debugger;
+                    var url = window.location.href;
+                    //window.open();
+                });
+            }
+        }
+        // TODO: show an error like "not implemented" here
+        // since we don't currently have any way to handle errors do you have any better idea
+        // than using todos?
+    }
+});
+
 openerp.base.views.add('calendar', 'openerp.base.CalendarView');
 openerp.base.CalendarView = openerp.base.Controller.extend({
     start: function () {

=== modified file 'addons/base/static/src/xml/base.xml'
--- addons/base/static/src/xml/base.xml	2011-04-07 23:41:30 +0000
+++ addons/base/static/src/xml/base.xml	2011-04-08 17:21:52 +0000
@@ -533,8 +533,8 @@
         <ul>
             <t t-set="j" t-value="0"/>
             <t t-foreach="section.elements" t-as="element">
-                <li><a t-att-data-i="i" t-att-data-j="j" href="#"><t t-esc="element.text"/></a></li>
-                <t t-set="j+1" t-value="0"/>
+                <li><a t-att-data-i="i" t-att-data-j="j" href="#"><t t-esc="element.name"/></a></li>
+                <t t-set="j" t-value="j+1"/>
             </t>
         </ul>
         </t>

=== modified file 'openerpweb/openerpweb.py'
--- openerpweb/openerpweb.py	2011-04-07 16:41:06 +0000
+++ openerpweb/openerpweb.py	2011-04-08 17:21:52 +0000
@@ -18,6 +18,7 @@
 
 import nonliterals
 import xmlrpctimeout
+import logging
 
 #-----------------------------------------------------------
 # Globals
@@ -355,6 +356,8 @@
                 }
             }
         except Exception:
+            cherrypy.log("An error occured while handling a json request",
+                         severity=logging.ERROR, traceback=True)
             error = {
                 'code': 300,
                 'message': "OpenERP WebClient Error",
@@ -495,3 +498,4 @@
     cherrypy.server.subscribe()
     cherrypy.engine.start()
     cherrypy.engine.block()
+


Follow ups