openerp-dev-web team mailing list archive
-
openerp-dev-web team
-
Mailing list archive
-
Message #05273
[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