From 9ad05c699bf634ca6ee0800ac96638529433aae0 Mon Sep 17 00:00:00 2001 From: "Vidhin Mehta (OpenERP)" Date: Mon, 8 Aug 2011 16:46:16 +0530 Subject: [PATCH 02/66] [IMP]Implement shortcut functionality. bzr revid: vme@tinyerp.com-20110808111616-2qi3d6hfebix0uho --- addons/base/controllers/main.py | 6 +- addons/base/static/src/css/base.css | 54 ++++++++++++++++++ addons/base/static/src/img/add-shortcut.png | Bin 0 -> 395 bytes .../base/static/src/img/remove-shortcut.png | Bin 0 -> 559 bytes addons/base/static/src/js/chrome.js | 35 +++++++++++- addons/base/static/src/js/search.js | 32 ++++++++++- addons/base/static/src/xml/base.xml | 11 +++- 7 files changed, 130 insertions(+), 8 deletions(-) create mode 100644 addons/base/static/src/img/add-shortcut.png create mode 100644 addons/base/static/src/img/remove-shortcut.png diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index aaf89853cad..4fd848f1957 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -259,9 +259,9 @@ class Session(openerpweb.Controller): @openerpweb.jsonrequest def sc_list(self, req): - return req.session.model('ir.ui.view_sc').get_sc(req.session._uid, "ir.ui.menu", - req.session.eval_context(req.context)) - + return sorted(req.session.model('ir.ui.view_sc').get_sc(req.session._uid, "ir.ui.menu", + req.session.eval_context(req.context)), key=lambda k: k['id']) + @openerpweb.jsonrequest def get_lang_list(self, req): try: diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index 7f670be071f..15e8979a985 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -1180,3 +1180,57 @@ background: linear-gradient(top, #ffffff 0%,#ebe9e9 100%); /* W3C */ -webkit-box-shadow: none; box-shadow: none; } +/* Shortcuts*/ +#shortcut_add_remove { + height: 20px; + padding: 0; + width: 24px; + cursor: pointer; + display: inline; /*IE7 */ + display: inline-block; +} +.shortcut-add { + background: url(../img/add-shortcut.png) no-repeat; + background-position: bottom; +} +.shortcut-remove{ + background: url(../img/remove-shortcut.png) no-repeat; + background-position: bottom; +} +/* ================ */ +#shortcuts { + position: absolute; + + margin: 0; + padding: 6px 5px; + top: 37px; + left: 197px; + right: 0; + height: 17px; + line-height: 1.2; +} +#shortcuts ul { + display: block; + overflow: hidden; + list-style: none; + white-space: nowrap; + padding: 0; + margin: 0; +} +#shortcuts li { + cursor: pointer; + display: -moz-inline-stack; + display: inline-block; + display: inline; /*IE7 */ + color: #fff; + text-align: center; + border-left: 1px solid #909090; + padding-left: 4px; + font-size: 90%; + font-weight: normal; +} +#shortcuts li:first-child, +#shortcuts li.first { + border-left: none; + padding-left: 0; +} diff --git a/addons/base/static/src/img/add-shortcut.png b/addons/base/static/src/img/add-shortcut.png new file mode 100644 index 0000000000000000000000000000000000000000..bcc0a09eb45dacebcc267e9afdecbb513417b31b GIT binary patch literal 395 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!6#=yXs@#Xw?Acwug)7O>#7P|sMQAR|ROS_(hZsfHSL$jNa`YN^1ZZ%`DZZXP{pQ&{TYqcpOG$q=JO8Mv#o%|~l7Ww&@w!BbYg;4wgM*|BPc3XTNjk3SYmpXpsB!z6 z&pOQkt7qvah&+htUVm!C`*_m>mIdEbIYMfWdp6`a^Iv%PXzsQ|84sLt1D2es_ zw-4e;u4!i`6)eB!YOX!&Z20VJaa~sg3ofRJ*PN_WdFOi8`bUu;BTMuFnHvR{CMWto zJ@}7#!&0-1pfAyU{hZTR|6?g^Uss*;O0!C!Ir#HAhJ)|;8`))RuWgk5S@Oc@*cQ%v n$2w~DAEkr_d|G?@_)msE-)HLi~m% zGp!Pd#X>}=C2iwZ1DVWZUNU)eJOk}QmN*U)##+S)Xvw~mfW)*!`K)K({v*Hy{Hx0T>+c`bhHD z(!;$Dx#OWlTu3P+X1Z5MYlcAs#HnqZ4sONZ1A;dmj_d*tkA8k~(DH4KL4%NgCx}Vf zXW={ZD84vik#nq*z~vvtfbi`(W}JtpY7ko*Yw#L=BZKwAg(f-4NCCFy*`JjWc-CXA zEe?ykmZ%0;HHJjneue7yOCaZYqyT&TyOcd7^P1XV;LTtj0?@ueG)mdS?SK<15DW}I xifig>mUe&0@9Z~pH4|_GZd48W!iOfB^ADG-*}e8}F~R@<002ovPDHLkV1h063mE_a literal 0 HcmV?d00001 diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index fd5fae7727d..876482f2b8d 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -25,6 +25,9 @@ openerp.base.Session = openerp.base.Widget.extend( /** @lends openerp.base.Sessi this.module_list = []; this.module_loaded = {"base": true}; this.context = {}; + this.sc_list ={}; + this.active_id = ""; + this.active_menu_name = ""; }, start: function() { this.session_restore(); @@ -858,8 +861,36 @@ openerp.base.Header = openerp.base.Widget.extend({ do_update: function() { this.$element.html(QWeb.render("Header", this)); this.$element.find(".logout").click(this.on_logout); + this.shortcut_load(); + }, + shortcut_load :function(){ + var self = this; + this.rpc('/base/session/sc_list', {}, function(sc_list_data){ + self.session.sc_list = sc_list_data + self.$element.find('#shortcuts').html(QWeb.render('Shortcuts', {'shortcuts_pass': sc_list_data})); + self.shortcut_menu_load(); + }); + }, + + shortcut_menu_load :function(){ + var self = this + this.$element.find('#shortcuts ul li').click(function(ev, id){ + self.session.active_id = this.id; + self.rpc('/base/menu/action', {'menu_id':this.id},function(ir_menu_data){ + if (ir_menu_data.action.length){ + this.action_manager = new openerp.base.ActionManager(self, "oe_app"); + this.action_manager.do_action(ir_menu_data.action[0][2]); + self.session.active_menu_name = ir_menu_data.action[0][2]['name']; + } + }); + }); + }, + on_logout: function() { + this.remove(); + }, + remove:function(){ + this.$element.find('#shortcuts').html(QWeb.render('Shortcuts', {'shortcuts_pass': {}})); }, - on_logout: function() {} }); openerp.base.Menu = openerp.base.Widget.extend({ @@ -921,6 +952,7 @@ openerp.base.Menu = openerp.base.Widget.extend({ $secondary.show(); if (id) { + this.session.active_id = id; this.rpc('/base/menu/action', {'menu_id': id}, this.on_menu_action_loaded); } @@ -935,6 +967,7 @@ openerp.base.Menu = openerp.base.Widget.extend({ on_menu_action_loaded: function(data) { var self = this; if (data.action.length) { + this.session.active_menu_name = data.action[0][2]['name']; var action = data.action[0][2]; self.on_action(action); } diff --git a/addons/base/static/src/js/search.js b/addons/base/static/src/js/search.js index 0a1f2396123..aeadfa66008 100644 --- a/addons/base/static/src/js/search.js +++ b/addons/base/static/src/js/search.js @@ -144,7 +144,7 @@ openerp.base.SearchView = openerp.base.Widget.extend({ $.when.apply(null, widget_starts).then(function () { self.ready.resolve(); }); - + this.shortcut_check(); this.reload_managed_filters(); }, reload_managed_filters: function() { @@ -344,7 +344,34 @@ openerp.base.SearchView = openerp.base.Widget.extend({ // triggers refresh this.$element.find('form').submit(); } - } + }, + shortcut_check: function(){ + var img = "shortcut-add"; + for(var list_shortcut=0; list_shortcut +
+
+ + +
    +
  • + +
  • +
@@ -867,7 +876,7 @@ -

+

From bd95f542addb4b1abb121bf5c38c2eafce336343 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 11 Aug 2011 18:39:33 +0200 Subject: [PATCH 03/66] [imp] setup i18n bzr revid: nicolas.vanhoren@openerp.com-20110811163933-lcs6zv2e3kn8b09j --- addons/base/controllers/main.py | 16 +++++++++++++ addons/base/po/base.pot | 23 ++++++++++++++++++ addons/base/po/fr.po | 23 ++++++++++++++++++ babel.cfg | 13 +++++++++++ gen_translations.sh | 41 +++++++++++++++++++++++++++++++++ 5 files changed, 116 insertions(+) create mode 100644 addons/base/po/base.pot create mode 100644 addons/base/po/fr.po create mode 100644 babel.cfg create mode 100755 gen_translations.sh diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index aaf89853cad..155c50a449a 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -18,6 +18,7 @@ import openerpweb import openerpweb.ast import openerpweb.nonliterals +from babel.messages.pofile import read_po # Should move to openerpweb.Xml2Json class Xml2Json: @@ -156,6 +157,21 @@ class WebClient(openerpweb.Controller): 'css': css } return r + + @openerpweb.jsonrequest + def translations(self, addon_name, lang): + f_name = os.path.join(openerpweb.path_addons, addon_name, "po", lang + ".po") + with open(f_name) as t_file: + po = read_po(t_file) + + transl = {"messages":[]} + + for x in po: + if x.id: + transl["messages"].append({'id': x.id, 'string': x.string}) + + return transl + class Database(openerpweb.Controller): _cp_path = "/base/database" diff --git a/addons/base/po/base.pot b/addons/base/po/base.pot new file mode 100644 index 00000000000..1609924cac3 --- /dev/null +++ b/addons/base/po/base.pot @@ -0,0 +1,23 @@ +# Translations template for PROJECT. +# Copyright (C) 2011 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR , 2011. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2011-08-09 17:30+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.4\n" + +#: addons/base/static/src/js/core.js:11 +msgid "I am a sweet chicken." +msgstr "" + diff --git a/addons/base/po/fr.po b/addons/base/po/fr.po new file mode 100644 index 00000000000..c1483c0e9ca --- /dev/null +++ b/addons/base/po/fr.po @@ -0,0 +1,23 @@ +# Translations template for PROJECT. +# Copyright (C) 2011 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# niv , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2011-08-09 17:30+0200\n" +"PO-Revision-Date: 2011-08-09 17:31+0200\n" +"Last-Translator: niv \n" +"Language-Team: French\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.4\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: addons/base/static/src/js/core.js:11 +msgid "I am a sweet chicken." +msgstr "Je suis un gentil poulet." diff --git a/babel.cfg b/babel.cfg new file mode 100644 index 00000000000..bcfd3572f3e --- /dev/null +++ b/babel.cfg @@ -0,0 +1,13 @@ +## Extraction from Python source files +#[python: **.py] +## Extraction from Genshi HTML and text templates +#[genshi: **/templates/**.html] +#ignore_tags = script,style +#include_attrs = alt title summary +#[genshi: **/templates/**.txt] +#template_class = genshi.template:TextTemplate +#encoding = ISO-8819-15 +## Extraction from JavaScript files +[javascript: **.js] +[javascript: **.xml] + diff --git a/gen_translations.sh b/gen_translations.sh new file mode 100755 index 00000000000..9c3a14e2dcc --- /dev/null +++ b/gen_translations.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +usage() +{ +cat << EOF +usage: $0 -a +usage: $0 DIR OUTPUT_FILE + +OPTIONS: + -a recreate the .pot file for all addons + -h print this message +EOF +exit 0 +} + +do_all= + +while getopts "a" opt +do + case "$opt" in + a) + do_all=true;; + h) + usage;; + \?) + usage;; + esac +done + +shift $((OPTIND-1)) + +if [ -n "$do_all" ] +then + echo "Extracting all the translations" + $0 addons/base/static/src/ addons/base/po/base.pot +elif [ -n "$2" ] +then + pybabel extract -F babel.cfg -o $2 -k _t --no-default-keywords $1 +else + usage +fi From f17f4bbd481ec40b66a122a8c694675994e19603 Mon Sep 17 00:00:00 2001 From: "Vidhin Mehta (OpenERP)" Date: Fri, 12 Aug 2011 12:42:48 +0530 Subject: [PATCH 04/66] [IMP]checked that shortcut are from either ir.ui.menu or it is tree view bzr revid: vme@tinyerp.com-20110812071248-y9oqa8t1wx61xciu --- addons/base/controllers/main.py | 2 +- addons/base/static/src/css/base.css | 4 +-- addons/base/static/src/js/chrome.js | 29 ++++++++-------- addons/base/static/src/js/search.js | 28 --------------- addons/base/static/src/js/views.js | 53 +++++++++++++++++++++++++++-- addons/base/static/src/xml/base.xml | 8 +++-- 6 files changed, 75 insertions(+), 49 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 4fd848f1957..c5ca4730856 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -259,7 +259,7 @@ class Session(openerpweb.Controller): @openerpweb.jsonrequest def sc_list(self, req): - return sorted(req.session.model('ir.ui.view_sc').get_sc(req.session._uid, "ir.ui.menu", + return sorted(req.session.model('ir.ui.view_sc').get_sc(req.session._uid, "ir.ui.menu", req.session.eval_context(req.context)), key=lambda k: k['id']) @openerpweb.jsonrequest diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index 15e8979a985..b99dcd5a077 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -1190,11 +1190,11 @@ background: linear-gradient(top, #ffffff 0%,#ebe9e9 100%); /* W3C */ display: inline-block; } .shortcut-add { - background: url(../img/add-shortcut.png) no-repeat; + background: url(/base/static/src/img/add-shortcut.png) no-repeat; background-position: bottom; } .shortcut-remove{ - background: url(../img/remove-shortcut.png) no-repeat; + background: url(/base/static/src/img/remove-shortcut.png) no-repeat; background-position: bottom; } /* ================ */ diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index 876482f2b8d..9c46251d54e 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -27,7 +27,6 @@ openerp.base.Session = openerp.base.Widget.extend( /** @lends openerp.base.Sessi this.context = {}; this.sc_list ={}; this.active_id = ""; - this.active_menu_name = ""; }, start: function() { this.session_restore(); @@ -860,37 +859,37 @@ openerp.base.Header = openerp.base.Widget.extend({ }, do_update: function() { this.$element.html(QWeb.render("Header", this)); - this.$element.find(".logout").click(this.on_logout); this.shortcut_load(); + this.shortcut_menu_load(); + this.$element.find(".logout").click(this.on_logout); }, shortcut_load :function(){ var self = this; this.rpc('/base/session/sc_list', {}, function(sc_list_data){ - self.session.sc_list = sc_list_data + self.session.sc_list = sc_list_data; self.$element.find('#shortcuts').html(QWeb.render('Shortcuts', {'shortcuts_pass': sc_list_data})); - self.shortcut_menu_load(); + }); }, shortcut_menu_load :function(){ - var self = this + var self = this; this.$element.find('#shortcuts ul li').click(function(ev, id){ self.session.active_id = this.id; + self.active_shortcut = "ir.ui.menu"; self.rpc('/base/menu/action', {'menu_id':this.id},function(ir_menu_data){ if (ir_menu_data.action.length){ - this.action_manager = new openerp.base.ActionManager(self, "oe_app"); - this.action_manager.do_action(ir_menu_data.action[0][2]); - self.session.active_menu_name = ir_menu_data.action[0][2]['name']; + self.on_action(ir_menu_data.action[0][2]); } }); }); }, + on_action: function(action) { + }, + on_logout: function() { - this.remove(); - }, - remove:function(){ - this.$element.find('#shortcuts').html(QWeb.render('Shortcuts', {'shortcuts_pass': {}})); - }, + this.$element.find('#shortcuts ul li').remove(); + } }); openerp.base.Menu = openerp.base.Widget.extend({ @@ -953,6 +952,7 @@ openerp.base.Menu = openerp.base.Widget.extend({ if (id) { this.session.active_id = id; + this.active_shortcut = "ir.ui.menu"; this.rpc('/base/menu/action', {'menu_id': id}, this.on_menu_action_loaded); } @@ -967,7 +967,6 @@ openerp.base.Menu = openerp.base.Widget.extend({ on_menu_action_loaded: function(data) { var self = this; if (data.action.length) { - this.session.active_menu_name = data.action[0][2]['name']; var action = data.action[0][2]; self.on_action(action); } @@ -1014,6 +1013,8 @@ openerp.base.WebClient = openerp.base.Widget.extend({ this.menu = new openerp.base.Menu(this, "oe_menu", "oe_secondary_menu"); this.menu.on_action.add(this.on_menu_action); + this.header.on_action.add(this.on_menu_action); + }, start: function() { diff --git a/addons/base/static/src/js/search.js b/addons/base/static/src/js/search.js index aeadfa66008..96781b46307 100644 --- a/addons/base/static/src/js/search.js +++ b/addons/base/static/src/js/search.js @@ -144,7 +144,6 @@ openerp.base.SearchView = openerp.base.Widget.extend({ $.when.apply(null, widget_starts).then(function () { self.ready.resolve(); }); - this.shortcut_check(); this.reload_managed_filters(); }, reload_managed_filters: function() { @@ -345,33 +344,6 @@ openerp.base.SearchView = openerp.base.Widget.extend({ this.$element.find('form').submit(); } }, - shortcut_check: function(){ - var img = "shortcut-add"; - for(var list_shortcut=0; list_shortcut
  • - +
+
@@ -419,6 +420,9 @@
+ + +
-

+

From 313dcc6f45f1098326a94fa8bdc19facb205b53f Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 12 Aug 2011 11:54:49 +0200 Subject: [PATCH 05/66] [imp] improvements to python-side translations gathering method bzr revid: nicolas.vanhoren@openerp.com-20110812095449-m1u7hwh9583n769t --- addons/base/controllers/main.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 83a1a94e90b..99b8ff49ef4 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -159,18 +159,23 @@ class WebClient(openerpweb.Controller): return r @openerpweb.jsonrequest - def translations(self, addon_name, lang): - f_name = os.path.join(openerpweb.path_addons, addon_name, "po", lang + ".po") - with open(f_name) as t_file: - po = read_po(t_file) - - transl = {"messages":[]} - - for x in po: - if x.id: - transl["messages"].append({'id': x.id, 'string': x.string}) - - return transl + def translations(self, mods, lang): + transs = {} + for addon_name in mods: + transl = {"messages":[]} + transs[addon_name] = transl + f_name = os.path.join(openerpweb.path_addons, addon_name, "po", lang + ".po") + if not os.path.exists(f_name): + continue + try: + with open(f_name) as t_file: + po = read_po(t_file) + except: + continue + for x in po: + if x.id: + transl["messages"].append({'id': x.id, 'string': x.string}) + return transs class Database(openerpweb.Controller): From 64571fa4ab444b899629d57ccfe54e875ddaaf59 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 12 Aug 2011 12:19:52 +0200 Subject: [PATCH 06/66] [imp] refactoring of Session to not inherit Widget anymore bzr revid: nicolas.vanhoren@openerp.com-20110812101952-qw12p8xhdfa3kmzu --- addons/base/static/src/js/boot.js | 1 + addons/base/static/src/js/chrome.js | 2 +- addons/base/static/src/js/core.js | 31 +++++++++++++++++------------ 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/addons/base/static/src/js/boot.js b/addons/base/static/src/js/boot.js index 3d1d1e75e7c..2791bf2bc27 100644 --- a/addons/base/static/src/js/boot.js +++ b/addons/base/static/src/js/boot.js @@ -53,6 +53,7 @@ *---------------------------------------------------------*/ openerp.base = function(instance) { + openerp.base._t = function(x) { return x; }; openerp.base.core(instance); openerp.base.formats(instance); openerp.base.chrome(instance); diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index 7e7f5ae6ab6..49d2099c948 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -681,7 +681,7 @@ openerp.base.WebClient = openerp.base.Widget.extend({ } this.$element.html(QWeb.render("Interface", params)); - this.session = new openerp.base.Session(this,"oe_errors"); + this.session = new openerp.base.Session(); this.loading = new openerp.base.Loading(this,"oe_loading"); this.crashmanager = new openerp.base.CrashManager(this); this.crashmanager.start(); diff --git a/addons/base/static/src/js/core.js b/addons/base/static/src/js/core.js index 859c96645a1..7f294775410 100644 --- a/addons/base/static/src/js/core.js +++ b/addons/base/static/src/js/core.js @@ -305,16 +305,8 @@ openerp.base.Registry = openerp.base.Class.extend( /** @lends openerp.base.Regis } }); -/** - * Utility class that any class is allowed to extend to easy common manipulations. - * - * It provides rpc calls, callback on all methods preceded by "on_" or "do_" and a - * logging facility. - */ -openerp.base.SessionAware = openerp.base.Class.extend({ - init: function(session) { - this.session = session; - +openerp.base.CallbackEnabled = openerp.base.Class.extend({ + init: function() { // Transform on_* method into openerp.base.callbacks for (var name in this) { if(typeof(this[name]) == "function") { @@ -325,6 +317,19 @@ openerp.base.SessionAware = openerp.base.Class.extend({ } } } + } +}); + +/** + * Utility class that any class is allowed to extend to easy common manipulations. + * + * It provides rpc calls, callback on all methods preceded by "on_" or "do_" and a + * logging facility. + */ +openerp.base.SessionAware = openerp.base.CallbackEnabled.extend({ + init: function(session) { + this._super(); + this.session = session; }, /** * Performs a JSON-RPC call @@ -611,15 +616,15 @@ openerp.base.OldWidget = openerp.base.Widget.extend({ } }); -openerp.base.Session = openerp.base.Widget.extend( /** @lends openerp.base.Session# */{ +openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.base.Session# */{ /** * @constructs * @param element_id to use for exception reporting * @param server * @param port */ - init: function(parent, element_id, server, port) { - this._super(parent, element_id); + init: function(server, port) { + this._super(); this.server = (server == undefined) ? location.hostname : server; this.port = (port == undefined) ? location.port : port; this.rpc_mode = (server == location.hostname) ? "ajax" : "jsonp"; From 5f0eb9e11b9c530937f50acbdc91b570484ae797 Mon Sep 17 00:00:00 2001 From: "Vidhin Mehta (OpenERP)" Date: Fri, 12 Aug 2011 18:05:59 +0530 Subject: [PATCH 07/66] [IMP] imporve code and re implement shortcut check functionality bzr revid: vme@tinyerp.com-20110812123559-va1fumifmld75tdc --- addons/base/static/src/js/chrome.js | 3 +- addons/base/static/src/js/views.js | 73 +++++++++++++---------------- 2 files changed, 33 insertions(+), 43 deletions(-) diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index 9c46251d54e..740fe7412c0 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -860,7 +860,6 @@ openerp.base.Header = openerp.base.Widget.extend({ do_update: function() { this.$element.html(QWeb.render("Header", this)); this.shortcut_load(); - this.shortcut_menu_load(); this.$element.find(".logout").click(this.on_logout); }, shortcut_load :function(){ @@ -868,7 +867,7 @@ openerp.base.Header = openerp.base.Widget.extend({ this.rpc('/base/session/sc_list', {}, function(sc_list_data){ self.session.sc_list = sc_list_data; self.$element.find('#shortcuts').html(QWeb.render('Shortcuts', {'shortcuts_pass': sc_list_data})); - + self.shortcut_menu_load(); }); }, diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index b5b69f0cbec..7158a254df5 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -15,7 +15,6 @@ openerp.base.ActionManager = openerp.base.Widget.extend({ // Will use parent to find it when implementation will be done. this.session.action_manager = this; }, - do_action: function(action, on_closed) { action.flags = _.extend({ sidebar : action.target != 'new', @@ -88,7 +87,7 @@ openerp.base.ActionManager = openerp.base.Widget.extend({ this.current_dialog.stop(); this.current_dialog = null; } - }, + } }); openerp.base.ActionDialog = openerp.base.Dialog.extend({ @@ -127,10 +126,12 @@ openerp.base.ViewManager = openerp.base.Widget.extend({ this._super(); var self = this; this.dataset.start(); + this.$element.html(QWeb.render("ViewManager", {"prefix": this.element_id, views: this.views_src})); this.$element.find('.oe_vm_switch button').click(function() { self.on_mode_switch($(this).data('view-type')); }); + _.each(this.views_src, function(view) { self.views[view.view_type] = $.extend({}, view, { controller : null, @@ -168,7 +169,7 @@ openerp.base.ViewManager = openerp.base.Widget.extend({ if (view.embedded_view) { controller.set_embedded_view(view.embedded_view); } - if (view_type === 'list' && this.flags.search_view === false && this.action && this.action['auto_search']) { + if (view_type === 'list' && this.flags.search_view === false && this.action && this.action['auto_search']) { // In case the search view is not instantiated: manually call ListView#search var domains = !_(self.action.domain).isEmpty() ? [self.action.domain] : [], @@ -272,51 +273,43 @@ openerp.base.ViewManager = openerp.base.Widget.extend({ contexts: function () { return []; }, - shortcut_check: function(view_id,view_type){ - var self = this; - $('#shortcut_add_remove').show(); - if (view_type == "tree" || typeof view_id != "boolean" && this.views_src[0].view_id == view_id - //to check view is either from menu or it is tree view... - { + shortcut_check : function(view_id,view_type){ + main_view = this.session.action_manager.viewmanager.views_src[0]; + if (view_type == "tree" || main_view.view_id == view_id && main_view.view_type == view_type && + this.element_id == "oe_app"){ + $('#shortcut_add_remove').show(); var img = "shortcut-add"; - for(var list_shortcut=0; list_shortcut Date: Fri, 12 Aug 2011 17:17:36 +0200 Subject: [PATCH 08/66] [imp] added translation database bzr revid: nicolas.vanhoren@openerp.com-20110812151736-ycx4jejdj0rpep5j --- addons/base/controllers/main.py | 4 +-- addons/base/static/src/js/boot.js | 1 - addons/base/static/src/js/core.js | 55 ++++++++++++++++++++++++++----- 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 0379628fa1e..08c1851b85e 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -159,7 +159,7 @@ class WebClient(openerpweb.Controller): return r @openerpweb.jsonrequest - def translations(self, mods, lang): + def translations(self, req, mods, lang): transs = {} for addon_name in mods: transl = {"messages":[]} @@ -175,7 +175,7 @@ class WebClient(openerpweb.Controller): for x in po: if x.id: transl["messages"].append({'id': x.id, 'string': x.string}) - return transs + return {"modules": transs} class Database(openerpweb.Controller): diff --git a/addons/base/static/src/js/boot.js b/addons/base/static/src/js/boot.js index 2791bf2bc27..3d1d1e75e7c 100644 --- a/addons/base/static/src/js/boot.js +++ b/addons/base/static/src/js/boot.js @@ -53,7 +53,6 @@ *---------------------------------------------------------*/ openerp.base = function(instance) { - openerp.base._t = function(x) { return x; }; openerp.base.core(instance); openerp.base.formats(instance); openerp.base.chrome(instance); diff --git a/addons/base/static/src/js/core.js b/addons/base/static/src/js/core.js index c8647170ba5..2c1bcb3e76d 100644 --- a/addons/base/static/src/js/core.js +++ b/addons/base/static/src/js/core.js @@ -563,6 +563,38 @@ openerp.base.OldWidget = openerp.base.Widget.extend({ } }); +openerp.base.TranslationDataBase = openerp.base.Class.extend({ + init: function() { + this.db = {}; + }, + set_bundle: function(translation_bundle) { + var self = this; + this.db = {}; + _.each(translation_bundle.modules, function(mod, name) { + var tmp = self.db[name] = {}; + _.each(mod.messages, function(message) { + tmp[message.id] = message.string; + }); + }); + }, + build_translation_function: function(addon_name) { + var self = this; + var fcnt = function(str) { + var tmp = self.get(addon_name, str); + return tmp === undefined ? str : tmp; + } + fcnt.database = this; + return fcnt; + }, + get: function(addon_name, key) { + if (this.db[addon_name] && this.db[addon_name].messages[key]) + this.db[addon_name].message[key]; + return undefined; + } +}); + +openerp.base._t = new openerp.base.TranslationDataBase().build_translation_function(); + openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.base.Session# */{ /** * @constructs @@ -786,15 +818,19 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b var self = this; this.rpc('/base/session/modules', {}, function(result) { self.module_list = result; - var modules = self.module_list.join(','); - if(self.debug || true) { - self.rpc('/base/webclient/csslist', {"mods": modules}, self.do_load_css); - self.rpc('/base/webclient/jslist', {"mods": modules}, self.do_load_js); - } else { - self.do_load_css(["/base/webclient/css?mods="+modules]); - self.do_load_js(["/base/webclient/js?mods="+modules]); - } - openerp._modules_loaded = true; + self.rpc('/base/webclient/translations', {mods: ["base"].concat(result), lang: "fr"}) + .then(function(transs) { + openerp.base._t.database.set_bundle(transs); + var modules = self.module_list.join(','); + if(self.debug || true) { + self.rpc('/base/webclient/csslist', {"mods": modules}, self.do_load_css); + self.rpc('/base/webclient/jslist', {"mods": modules}, self.do_load_js); + } else { + self.do_load_css(["/base/webclient/css?mods="+modules]); + self.do_load_js(["/base/webclient/js?mods="+modules]); + } + openerp._modules_loaded = true; + }); }); }, do_load_css: function (files) { @@ -832,6 +868,7 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b openerp[mod] = {}; // init module mod if(openerp._openerp[mod] != undefined) { + openerp._openerp[mod]._T = openerp.base._t.database.build_translation_function(mod); openerp._openerp[mod](openerp); this.module_loaded[mod] = true; } From 7342931a847e98d246d95f242a86907733dc8025 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 12 Aug 2011 17:34:15 +0200 Subject: [PATCH 09/66] [imp] removed multi-module functionnality bzr revid: nicolas.vanhoren@openerp.com-20110812153415-2u4irohduvv3yfsm --- addons/base/static/src/js/core.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/addons/base/static/src/js/core.js b/addons/base/static/src/js/core.js index 2c1bcb3e76d..f4c29617cea 100644 --- a/addons/base/static/src/js/core.js +++ b/addons/base/static/src/js/core.js @@ -570,25 +570,29 @@ openerp.base.TranslationDataBase = openerp.base.Class.extend({ set_bundle: function(translation_bundle) { var self = this; this.db = {}; - _.each(translation_bundle.modules, function(mod, name) { - var tmp = self.db[name] = {}; + var modules = _.keys(translation_bundle.modules); + if (_.include(modules, "base")) { + modules = _.without(modules, "base").concat(["base"]); + } + _.each(modules, function(name) { + var mod = translation_bundle.modules[name]; _.each(mod.messages, function(message) { - tmp[message.id] = message.string; + self.db[message.id] = message.string; }); }); }, - build_translation_function: function(addon_name) { + build_translation_function: function() { var self = this; var fcnt = function(str) { - var tmp = self.get(addon_name, str); + var tmp = self.get(str); return tmp === undefined ? str : tmp; } fcnt.database = this; return fcnt; }, - get: function(addon_name, key) { - if (this.db[addon_name] && this.db[addon_name].messages[key]) - this.db[addon_name].message[key]; + get: function(key) { + if (this.db[key]) + return this.db[key]; return undefined; } }); @@ -868,7 +872,7 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b openerp[mod] = {}; // init module mod if(openerp._openerp[mod] != undefined) { - openerp._openerp[mod]._T = openerp.base._t.database.build_translation_function(mod); + openerp._openerp[mod]._T = openerp.base._t.database.build_translation_function(); openerp._openerp[mod](openerp); this.module_loaded[mod] = true; } From e63f70d9b02192760417f8d85186c17bb91ff1b9 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 12 Aug 2011 17:49:15 +0200 Subject: [PATCH 10/66] [imp] used the user language bzr revid: nicolas.vanhoren@openerp.com-20110812154915-n7o666qfrc99aas8 --- addons/base/controllers/main.py | 2 ++ addons/base/static/src/js/core.js | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 08c1851b85e..d4d420590ab 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -272,10 +272,12 @@ class Session(openerpweb.Controller): @openerpweb.jsonrequest def login(self, req, db, login, password): req.session.login(db, login, password) + ctx = req.session.get_context() return { "session_id": req.session_id, "uid": req.session._uid, + "context": ctx } @openerpweb.jsonrequest diff --git a/addons/base/static/src/js/core.js b/addons/base/static/src/js/core.js index f4c29617cea..c4609ba3ba7 100644 --- a/addons/base/static/src/js/core.js +++ b/addons/base/static/src/js/core.js @@ -615,6 +615,7 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b this.db = ""; this.login = ""; this.password = ""; + this.user_context= {}; this.uid = false; this.session_id = false; this.module_list = []; @@ -741,6 +742,7 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b this.rpc("/base/session/login", params, function(result) { self.session_id = result.session_id; self.uid = result.uid; + self.user_context = result.context; self.session_save(); self.on_session_valid(); if (success_callback) @@ -758,6 +760,7 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b this.session_id = this.get_cookie('session_id'); this.db = this.get_cookie('db'); this.login = this.get_cookie('login'); + this.user_context = this.get_cookie("user_context"); // we should do an rpc to confirm that this session_id is valid and if it is retrieve the information about db and login // then call on_session_valid this.on_session_valid(); @@ -770,6 +773,7 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b this.set_cookie('session_id', this.session_id); this.set_cookie('db', this.db); this.set_cookie('login', this.login); + this.set_cookie('user_context', this.user_context); }, logout: function() { delete this.uid; @@ -822,7 +826,9 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b var self = this; this.rpc('/base/session/modules', {}, function(result) { self.module_list = result; - self.rpc('/base/webclient/translations', {mods: ["base"].concat(result), lang: "fr"}) + self.rpc('/base/webclient/translations',{ + mods: ["base"].concat(result), + lang: self.user_context.lang}) .then(function(transs) { openerp.base._t.database.set_bundle(transs); var modules = self.module_list.join(','); From 6301669581dceedd84683d51c361a5dba785e3a8 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 16 Aug 2011 09:54:05 +0200 Subject: [PATCH 11/66] [imp] improvements to TranslationDatabase + small translations in forms bzr revid: nicolas.vanhoren@openerp.com-20110816075405-o46ytaiw5sqkwgjw --- addons/base/po/base.pot | 15 ++++++++++++--- addons/base/po/{fr.po => fr_FR.po} | 16 +++++++++++++--- addons/base/static/src/js/core.js | 18 ++++++++++++------ addons/base/static/src/js/form.js | 10 ++++++---- 4 files changed, 43 insertions(+), 16 deletions(-) rename addons/base/po/{fr.po => fr_FR.po} (60%) diff --git a/addons/base/po/base.pot b/addons/base/po/base.pot index 1609924cac3..84f7ebfe6db 100644 --- a/addons/base/po/base.pot +++ b/addons/base/po/base.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2011-08-09 17:30+0200\n" +"POT-Creation-Date: 2011-08-16 09:44+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,7 +17,16 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.4\n" -#: addons/base/static/src/js/core.js:11 -msgid "I am a sweet chicken." +#: addons/base/static/src/js/form.js:1459 +msgid "   Search More..." +msgstr "" + +#: addons/base/static/src/js/form.js:1472 +#, python-format +msgid "   Create \"%s\"" +msgstr "" + +#: addons/base/static/src/js/form.js:1478 +msgid "   Create and Edit..." msgstr "" diff --git a/addons/base/po/fr.po b/addons/base/po/fr_FR.po similarity index 60% rename from addons/base/po/fr.po rename to addons/base/po/fr_FR.po index c1483c0e9ca..08905cac036 100644 --- a/addons/base/po/fr.po +++ b/addons/base/po/fr_FR.po @@ -18,6 +18,16 @@ msgstr "" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: addons/base/static/src/js/core.js:11 -msgid "I am a sweet chicken." -msgstr "Je suis un gentil poulet." +#: addons/base/static/src/js/form.js:1459 +msgid "   Search More..." +msgstr "   Chercher plus..." + +#: addons/base/static/src/js/form.js:1472 +#, python-format +msgid "   Create \"%s\"" +msgstr "   Créer \"%s\"" + +#: addons/base/static/src/js/form.js:1478 +msgid "   Create and Edit..." +msgstr "   Créer et éditer..." + diff --git a/addons/base/static/src/js/core.js b/addons/base/static/src/js/core.js index c4609ba3ba7..8efae36863a 100644 --- a/addons/base/static/src/js/core.js +++ b/addons/base/static/src/js/core.js @@ -570,15 +570,20 @@ openerp.base.TranslationDataBase = openerp.base.Class.extend({ set_bundle: function(translation_bundle) { var self = this; this.db = {}; - var modules = _.keys(translation_bundle.modules); + var modules = _.keys(translation_bundle.modules).sort(); if (_.include(modules, "base")) { - modules = _.without(modules, "base").concat(["base"]); + modules = ["base"].concat(_.without(modules, "base")); } _.each(modules, function(name) { - var mod = translation_bundle.modules[name]; - _.each(mod.messages, function(message) { + self.add_module_translation(translation_bundle.modules[name]); + }); + }, + add_module_translation: function(mod) { + var self = this; + _.each(mod.messages, function(message) { + if (self.db[message.id] === undefined) { self.db[message.id] = message.string; - }); + } }); }, build_translation_function: function() { @@ -826,9 +831,10 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b var self = this; this.rpc('/base/session/modules', {}, function(result) { self.module_list = result; + var lang = self.user_context.lang; self.rpc('/base/webclient/translations',{ mods: ["base"].concat(result), - lang: self.user_context.lang}) + lang: lang}) .then(function(transs) { openerp.base._t.database.set_bundle(transs); var modules = self.module_list.join(','); diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 4e7876b1768..6eeff025e1f 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1,4 +1,6 @@ openerp.base.form = function (openerp) { + +var _t = openerp.base._t; openerp.base.views.add('form', 'openerp.base.FormView'); openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormView# */{ @@ -1454,7 +1456,7 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ // search more... if more results that max if (values.length > self.limit) { values = values.slice(0, self.limit); - values.push({label: "   Search More...", action: function() { + values.push({label: _t("   Search More..."), action: function() { dataset.name_search(search_val, self.build_domain(), 'ilike' , false, function(data) { self._change_int_value(null); @@ -1467,13 +1469,13 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ if (search_val.length > 0 && !_.include(raw_result, search_val) && (!self.value || search_val !== self.value[1])) { - values.push({label: '   Create "' + - $('').text(search_val).html() + '"', action: function() { + values.push({label: _.sprintf(_t('   Create "%s"'), + $('').text(search_val).html()), action: function() { self._quick_create(search_val); }}); } // create... - values.push({label: "   Create and Edit...", action: function() { + values.push({label: _t("   Create and Edit..."), action: function() { self._change_int_value(null); self._search_create_popup("form", undefined, {"default_name": search_val}); }}); From 5b522f5d062a526b7c065ebe39b1879b20c3cf12 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 16 Aug 2011 12:09:40 +0200 Subject: [PATCH 12/66] [imp] setup infrastructure for qweb message extraction bzr revid: nicolas.vanhoren@openerp.com-20110816100940-h7mxs3ajvoem9ujj --- babel.cfg | 17 +-- gen_translations.sh | 2 +- npybabel.py | 26 +++++ setup.py | 245 +++++++++++++++----------------------------- 4 files changed, 112 insertions(+), 178 deletions(-) create mode 100755 npybabel.py mode change 100755 => 100644 setup.py diff --git a/babel.cfg b/babel.cfg index bcfd3572f3e..c8542bbdf80 100644 --- a/babel.cfg +++ b/babel.cfg @@ -1,13 +1,6 @@ -## Extraction from Python source files -#[python: **.py] -## Extraction from Genshi HTML and text templates -#[genshi: **/templates/**.html] -#ignore_tags = script,style -#include_attrs = alt title summary -#[genshi: **/templates/**.txt] -#template_class = genshi.template:TextTemplate -#encoding = ISO-8819-15 -## Extraction from JavaScript files -[javascript: **.js] -[javascript: **.xml] + +[extractors] +qweb = npybabel:extract_qweb +[javascript: **.js] +[qweb: **.xml] diff --git a/gen_translations.sh b/gen_translations.sh index 9c3a14e2dcc..7d5ec68b82a 100755 --- a/gen_translations.sh +++ b/gen_translations.sh @@ -35,7 +35,7 @@ then $0 addons/base/static/src/ addons/base/po/base.pot elif [ -n "$2" ] then - pybabel extract -F babel.cfg -o $2 -k _t --no-default-keywords $1 + ./npybabel.py extract -F babel.cfg -o $2 -k _t --no-default-keywords $1 else usage fi diff --git a/npybabel.py b/npybabel.py new file mode 100755 index 00000000000..d2a5553fc80 --- /dev/null +++ b/npybabel.py @@ -0,0 +1,26 @@ +#!/usr/bin/python +# EASY-INSTALL-ENTRY-SCRIPT: 'Babel==0.9.6','console_scripts','pybabel' +__requires__ = 'Babel==0.9.6' +import sys +from pkg_resources import load_entry_point + +if __name__ == '__main__': + sys.exit( + load_entry_point('Babel==0.9.6', 'console_scripts', 'pybabel')() + ) + +def extract_qweb(fileobj, keywords, comment_tags, options): + """Extract messages from XXX files. + :param fileobj: the file-like object the messages should be extracted + from + :param keywords: a list of keywords (i.e. function names) that should + be recognized as translation functions + :param comment_tags: a list of translator tags to search for and + include in the results + :param options: a dictionary of additional options (optional) + :return: an iterator over ``(lineno, funcname, message, comments)`` + tuples + :rtype: ``iterator`` + """ + content = fileobj.read() + return [] diff --git a/setup.py b/setup.py old mode 100755 new mode 100644 index e36662b16cc..91248a0ea73 --- a/setup.py +++ b/setup.py @@ -1,174 +1,89 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# 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 . -# -############################################################################## -# setup from TinERP -# taken from straw http://www.nongnu.org/straw/index.html -# taken from gnomolicious http://www.nongnu.org/gnomolicious/ -# adapted by Nicolas Évrard -# -# doc/migrate is not included since about 6.1-dev -# doc/tests is not included -# python25-compat/*py should be in the openerp (and imported appropriately) - -import sys import os -from os.path import join, isfile -import glob +import re +import sys +from setuptools import setup -from setuptools import setup, find_packages +name = 'openerp-web-proto' +version = '6.0.1' +description = "Web Client of OpenERP, the Enterprise Management Software" +long_description = "OpenERP Web is the web client of the OpenERP, a free enterprise management software" +author = "OpenERP S.A." +author_email = "info@openerp.com" +support_email = 'support@openerp.com' +url = "http://www.openerp.com/" +download_url = '' +license = "OEPL" -# Backports os.walk with followlinks from python 2.6. -# Needed to add all addons files to data_files for Windows packaging. -def walk_followlinks(top, topdown=True, onerror=None, followlinks=False): - from os.path import join, isdir, islink - from os import listdir, error - - try: - names = listdir(top) - except error, err: - if onerror is not None: - onerror(err) - return - - dirs, nondirs = [], [] - for name in names: - if isdir(join(top, name)): - dirs.append(name) - else: - nondirs.append(name) - - if topdown: - yield top, dirs, nondirs - for name in dirs: - path = join(top, name) - if followlinks or not islink(path): - for x in walk_followlinks(path, topdown, onerror, followlinks): - yield x - if not topdown: - yield top, dirs, nondirs - -if sys.version_info < (2, 6): - os.walk = walk_followlinks - -py2exe_keywords = {} -py2exe_data_files = [] -if os.name == 'nt': +version_dash_incompatible = False +if 'bdist_rpm' in sys.argv: + version_dash_incompatible = True +try: import py2exe - py2exe_keywords['console'] = [ - { "script": "openerp-server", - "icon_resources": [(1, join("pixmaps","openerp-icon.ico"))], - }] - py2exe_keywords['options'] = { - "py2exe": { - "skip_archive": 1, - "optimize": 2, - "dist_dir": 'dist', - "packages": [ - "lxml", "lxml.builder", "lxml._elementpath", "lxml.etree", - "lxml.objectify", "decimal", "xml", "xml", "xml.dom", "xml.xpath", - "encodings", "dateutil", "pychart", "PIL", "pyparsing", - "pydot", "asyncore","asynchat", "reportlab", "vobject", - "HTMLParser", "select", "mako", "poplib", - "imaplib", "smtplib", "email", "yaml", "DAV", - "uuid", "commands", "openerp", - ], - "excludes" : ["Tkconstants","Tkinter","tcl"], - } - } - # TODO is it still necessary now that we don't use the library.zip file? - def data_files(): - '''For Windows, we consider all the addons as data files. - It seems also that package_data below isn't honored by py2exe.''' - files = [] - os.chdir('openerp') - for (dp, dn, names) in os.walk('addons'): - files.append((join('openerp',dp), map(lambda x: join('openerp', dp, x), names))) - os.chdir('..') - files.append(('openerp', [join('openerp', 'import_xml.rng'),])) + from py2exe_utils import opts + version_dash_incompatible = True +except ImportError: + opts = {} +if version_dash_incompatible: + version = version.split('-')[0] - # copy pytz/timzeone - # TODO check if we have to also copy dateutil's timezone data. - import pytz - # Make sure the layout of pytz hasn't changed - assert (pytz.__file__.endswith('__init__.pyc') or - pytz.__file__.endswith('__init__.py')), pytz.__file__ - pytz_dir = os.path.dirname(pytz.__file__) +FILE_PATTERNS = \ + r'.+\.(py|cfg|po|pot|mo|txt|rst|gif|png|jpg|ico|mako|html|js|css|htc|swf)$' +def find_data_files(source, patterns=FILE_PATTERNS): + file_matcher = re.compile(patterns, re.I) + out = [] + for base, _, files in os.walk(source): + cur_files = [] + for f in files: + if file_matcher.match(f): + cur_files.append(os.path.join(base, f)) + if cur_files: + out.append( + (base, cur_files)) - saved_dir = os.getcwd() - os.chdir(pytz_dir) - for dp, dn, names in os.walk('zoneinfo'): - files.append((join('pytz',dp), map(lambda x: join(pytz_dir, dp, x), names))) - os.chdir(saved_dir) + return out - return files - py2exe_data_files = data_files() - -execfile(join('openerp', 'release.py')) - -setup(name = name, - version = version, - description = description, - long_description = long_desc, - url = url, - author = author, - author_email = author_email, - classifiers = filter(None, classifiers.split("\n")), - license = license, - data_files = [ - (join('man', 'man1'), ['man/openerp-server.1']), - (join('man', 'man5'), ['man/openerp_serverrc.5']), - ('doc', filter(isfile, glob.glob('doc/*'))), - ] + py2exe_data_files, - scripts = ['openerp-server'], - packages = find_packages(), - include_package_data = True, - package_data = { - '': ['*.yml', '*.xml', '*.po', '*.pot', '*.csv'], - }, - dependency_links = ['http://download.gna.org/pychart/'], - install_requires = [ - # We require the same version as caldav for lxml. - 'lxml==2.1.5', - 'mako', - 'python-dateutil', - 'psycopg2', - # TODO the pychart package we include in openerp corresponds to PyChart 1.37. - # It seems there is a single difference, which is a spurious print in generate_docs.py. - # It is probably safe to move to PyChart 1.39 (the latest one). - # (Let setup.py choose the latest one, and we should check we can remove pychart from - # our tree.) - 'pychart', - 'pydot', - 'pytz', - 'reportlab', - 'caldav', - 'pyyaml', - 'pywebdav', - 'feedparser', - 'simplejson >= 2.0', - ], - extras_require = { - 'SSL' : ['pyopenssl'], - }, - **py2exe_keywords +setup( + name=name, + version=version, + description=description, + long_description=long_description, + author=author, + author_email=author_email, + url=url, + download_url=download_url, + license=license, + install_requires=[ + "CherryPy >= 3.1.2", + "Babel >= 0.9.6", + "simplejson >= 2.0.9", + "python-dateutil >= 1.4.1", + "pytz", + ], + tests_require=[ + 'unittest2', + 'mock', + ], + test_suite = 'unittest2.collector', + zip_safe=False, + packages=[ + 'addons', + 'addons.base', + 'addons.base.controllers', + 'addons.base_calendar', + 'addons.base_hello', + 'openerpweb', + ], + classifiers=[ + 'Development Status :: 6 - Production/Stable', + 'Operating System :: OS Independent', + 'Programming Language :: Python', + 'Environment :: Web Environment', + 'Topic :: Office/Business :: Financial', + ], + scripts=['scripts/openerp-web'], + data_files=(find_data_files('addons') + + opts.pop('data_files', []) + ), + **opts ) - From a7ab1b607f05dfc43cd649984bcdaa234836e113 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 16 Aug 2011 12:11:10 +0200 Subject: [PATCH 13/66] [FIX] don't re-sort shortcuts based on whatever, just display them as returned by get_sc bzr revid: xmo@openerp.com-20110816101110-3n6hc9ttxrx8pfwu --- addons/base/controllers/main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index c5ca4730856..6526c81b4a8 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -259,9 +259,9 @@ class Session(openerpweb.Controller): @openerpweb.jsonrequest def sc_list(self, req): - return sorted(req.session.model('ir.ui.view_sc').get_sc(req.session._uid, "ir.ui.menu", - req.session.eval_context(req.context)), key=lambda k: k['id']) - + return req.session.model('ir.ui.view_sc').get_sc( + req.session._uid, "ir.ui.menu", req.session.eval_context(req.context)) + @openerpweb.jsonrequest def get_lang_list(self, req): try: From b1e8671583108397dc95c185bb281b69947f4295 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 16 Aug 2011 12:26:20 +0200 Subject: [PATCH 14/66] [IMP] remove some dead code, simplify shortcuts template, replace shortcut id by class bzr revid: xmo@openerp.com-20110816102620-b7zodiqoi91rz0m1 --- addons/base/static/src/css/base.css | 10 ++++---- addons/base/static/src/js/chrome.js | 36 ++++++++++++----------------- addons/base/static/src/xml/base.xml | 16 ++++++------- 3 files changed, 27 insertions(+), 35 deletions(-) diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index b99dcd5a077..2b85cedd6a9 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -1198,7 +1198,7 @@ background: linear-gradient(top, #ffffff 0%,#ebe9e9 100%); /* W3C */ background-position: bottom; } /* ================ */ -#shortcuts { +.oe-shortcuts { position: absolute; margin: 0; @@ -1209,7 +1209,7 @@ background: linear-gradient(top, #ffffff 0%,#ebe9e9 100%); /* W3C */ height: 17px; line-height: 1.2; } -#shortcuts ul { +.oe-shortcuts ul { display: block; overflow: hidden; list-style: none; @@ -1217,7 +1217,7 @@ background: linear-gradient(top, #ffffff 0%,#ebe9e9 100%); /* W3C */ padding: 0; margin: 0; } -#shortcuts li { +.oe-shortcuts li { cursor: pointer; display: -moz-inline-stack; display: inline-block; @@ -1229,8 +1229,8 @@ background: linear-gradient(top, #ffffff 0%,#ebe9e9 100%); /* W3C */ font-size: 90%; font-weight: normal; } -#shortcuts li:first-child, -#shortcuts li.first { +.oe-shortcuts li:first-child, +.oe-shortcuts li.first { border-left: none; padding-left: 0; } diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index 740fe7412c0..e071a71b23d 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -855,33 +855,28 @@ openerp.base.Header = openerp.base.Widget.extend({ this._super(parent, element_id); }, start: function() { - this.do_update(); + return this.do_update(); }, - do_update: function() { + do_update: function () { this.$element.html(QWeb.render("Header", this)); - this.shortcut_load(); this.$element.find(".logout").click(this.on_logout); + return this.shortcut_load(); }, shortcut_load :function(){ var self = this; - this.rpc('/base/session/sc_list', {}, function(sc_list_data){ - self.session.sc_list = sc_list_data; - self.$element.find('#shortcuts').html(QWeb.render('Shortcuts', {'shortcuts_pass': sc_list_data})); - self.shortcut_menu_load(); + return this.rpc('/base/session/sc_list', {}, function(shortcuts) { + self.session.sc_list = shortcuts; + self.$element.find('.oe-shortcuts') + .html(QWeb.render('Shortcuts', {'shortcuts': shortcuts})) + .delegate('li', 'click', function() { + self.session.active_id = this.id; + self.rpc('/base/menu/action', {'menu_id':this.id}, function(ir_menu_data) { + if (ir_menu_data.action.length){ + self.on_action(ir_menu_data.action[0][2]); + } + }); + }); }); - }, - - shortcut_menu_load :function(){ - var self = this; - this.$element.find('#shortcuts ul li').click(function(ev, id){ - self.session.active_id = this.id; - self.active_shortcut = "ir.ui.menu"; - self.rpc('/base/menu/action', {'menu_id':this.id},function(ir_menu_data){ - if (ir_menu_data.action.length){ - self.on_action(ir_menu_data.action[0][2]); - } - }); - }); }, on_action: function(action) { }, @@ -951,7 +946,6 @@ openerp.base.Menu = openerp.base.Widget.extend({ if (id) { this.session.active_id = id; - this.active_shortcut = "ir.ui.menu"; this.rpc('/base/menu/action', {'menu_id': id}, this.on_menu_action_loaded); } diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index 3004e9ef408..c41952785de 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -360,16 +360,14 @@
-
-
- - -
    -
  • - -
  • -
+
+
    +
  • +
From be46b05129b13d70e30056973cdcc143e2728dc7 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 16 Aug 2011 12:42:19 +0200 Subject: [PATCH 15/66] [imp] improved qweb scanning function bzr revid: nicolas.vanhoren@openerp.com-20110816104219-wt0rl0kpfn5rcvz7 --- npybabel.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/npybabel.py b/npybabel.py index d2a5553fc80..0c79e5d7d1e 100755 --- a/npybabel.py +++ b/npybabel.py @@ -3,12 +3,15 @@ __requires__ = 'Babel==0.9.6' import sys from pkg_resources import load_entry_point +import re if __name__ == '__main__': sys.exit( load_entry_point('Babel==0.9.6', 'console_scripts', 'pybabel')() ) +QWEB_EXPR = re.compile(r"""(?:\< *t\-tr *\>(.*?)\< *\/t\-tr *\>)|(?:\_t *\( *((?:\".*?\")|(?:\'.*?\')) *\))""") + def extract_qweb(fileobj, keywords, comment_tags, options): """Extract messages from XXX files. :param fileobj: the file-like object the messages should be extracted @@ -23,4 +26,15 @@ def extract_qweb(fileobj, keywords, comment_tags, options): :rtype: ``iterator`` """ content = fileobj.read() - return [] + found = QWEB_EXPR.finditer(content) + result = [] + index = 0 + line_nbr = 0 + for f in found: + group = 1 if f.group(1) else 2 + while index < f.start(): + if content[index] == "\n": + line_nbr += 1 + index += 1 + result.append((line_nbr, None, f.group(group), "")) + return result From 840f25e1436c64faedf8c5f18e7c22c015edf0c8 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 16 Aug 2011 13:17:46 +0200 Subject: [PATCH 16/66] [FIX] remove events during re-render, so they're not registered multiple times bzr revid: xmo@openerp.com-20110816111746-hiv9699dfjss6njv --- addons/base/static/src/js/chrome.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index e071a71b23d..922ba876504 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -868,7 +868,9 @@ openerp.base.Header = openerp.base.Widget.extend({ self.session.sc_list = shortcuts; self.$element.find('.oe-shortcuts') .html(QWeb.render('Shortcuts', {'shortcuts': shortcuts})) - .delegate('li', 'click', function() { + .undelegate('li', 'click') + .delegate('li', 'click', function(e) { + e.stopPropagation(); self.session.active_id = this.id; self.rpc('/base/menu/action', {'menu_id':this.id}, function(ir_menu_data) { if (ir_menu_data.action.length){ From f713807311f84d2534bba1084b9839363f466dc3 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 16 Aug 2011 13:34:00 +0200 Subject: [PATCH 17/66] [imp] improved wqweb scanning for translations bzr revid: nicolas.vanhoren@openerp.com-20110816113400-f1laiorv1nx58yo9 --- npybabel.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/npybabel.py b/npybabel.py index 0c79e5d7d1e..3d9deaec676 100755 --- a/npybabel.py +++ b/npybabel.py @@ -4,14 +4,17 @@ __requires__ = 'Babel==0.9.6' import sys from pkg_resources import load_entry_point import re +import json if __name__ == '__main__': sys.exit( load_entry_point('Babel==0.9.6', 'console_scripts', 'pybabel')() ) -QWEB_EXPR = re.compile(r"""(?:\< *t\-tr *\>(.*?)\< *\/t\-tr *\>)|(?:\_t *\( *((?:\".*?\")|(?:\'.*?\')) *\))""") - +QWEB_EXPR = re.compile(r"""(?:\< *t\-tr *\>(.*?)\< *\/t\-tr *\>)|(?:\_t *\( *((?:"(?:[^"\\]|\\.)*")|(?:'(?:[^'\\]|\\.)*')) *\))""") +XML_GROUP = 1 +JS_GROUP = 2 + def extract_qweb(fileobj, keywords, comment_tags, options): """Extract messages from XXX files. :param fileobj: the file-like object the messages should be extracted @@ -31,10 +34,13 @@ def extract_qweb(fileobj, keywords, comment_tags, options): index = 0 line_nbr = 0 for f in found: - group = 1 if f.group(1) else 2 + group = XML_GROUP if f.group(XML_GROUP) else JS_GROUP + mes = f.group(group) + if group == JS_GROUP: + mes = json.loads(mes) while index < f.start(): if content[index] == "\n": line_nbr += 1 index += 1 - result.append((line_nbr, None, f.group(group), "")) + result.append((line_nbr, None, mes, "")) return result From 81ea898b8c0a05e2f538bb7450e9d64e4ef8c470 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 16 Aug 2011 14:24:50 +0200 Subject: [PATCH 18/66] [imp] added loading of encoding parameters bzr revid: nicolas.vanhoren@openerp.com-20110816122450-1cpa3oq8j31hr4xd --- addons/base/controllers/main.py | 10 +++++++++- addons/base/static/src/js/core.js | 9 +++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index d4d420590ab..71f2d480dd2 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -175,7 +175,15 @@ class WebClient(openerpweb.Controller): for x in po: if x.id: transl["messages"].append({'id': x.id, 'string': x.string}) - return {"modules": transs} + lang_model = req.session.model('res.lang') + ids = lang_model.search([("code", "=", lang)]) + if ids: + lang_obj = lang_model.read(ids[0], ["direction", "date_format", "time_format", + "grouping", "decimal_point", "thousands_sep"]) + else: + lang_obj = None + return {"modules": transs, + "lang_parameters": lang_obj} class Database(openerpweb.Controller): diff --git a/addons/base/static/src/js/core.js b/addons/base/static/src/js/core.js index 8efae36863a..b7fc7704c10 100644 --- a/addons/base/static/src/js/core.js +++ b/addons/base/static/src/js/core.js @@ -566,6 +566,12 @@ openerp.base.OldWidget = openerp.base.Widget.extend({ openerp.base.TranslationDataBase = openerp.base.Class.extend({ init: function() { this.db = {}; + this.parameters = {"direction": 'ltr', + "date_format": '%m/%d/%Y', + "time_format": '%H:%M:%S', + "grouping": "[]", + "decimal_point": ".", + "thousands_sep": ","}; }, set_bundle: function(translation_bundle) { var self = this; @@ -577,6 +583,9 @@ openerp.base.TranslationDataBase = openerp.base.Class.extend({ _.each(modules, function(name) { self.add_module_translation(translation_bundle.modules[name]); }); + if (translation_bundle.lang_parameters) { + this.parameters = translation_bundle.lang_parameters; + } }, add_module_translation: function(mod) { var self = this; From 1d5f8506c8aa1677a13b89509a5f0d4903db085a Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 16 Aug 2011 14:35:10 +0200 Subject: [PATCH 19/66] [IMP] cleanup shortcuts toggle code bzr revid: xmo@openerp.com-20110816123510-gcx0dk8b2sgox5oi --- addons/base/static/src/css/base.css | 12 ++--- addons/base/static/src/js/views.js | 80 +++++++++++++++-------------- addons/base/static/src/xml/base.xml | 6 +-- 3 files changed, 48 insertions(+), 50 deletions(-) diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index 2b85cedd6a9..11fa3015f01 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -1181,21 +1181,17 @@ background: linear-gradient(top, #ffffff 0%,#ebe9e9 100%); /* W3C */ box-shadow: none; } /* Shortcuts*/ -#shortcut_add_remove { +.oe-shortcut-toggle { height: 20px; padding: 0; width: 24px; cursor: pointer; display: inline; /*IE7 */ display: inline-block; + background: url(/base/static/src/img/add-shortcut.png) no-repeat bottom; } -.shortcut-add { - background: url(/base/static/src/img/add-shortcut.png) no-repeat; - background-position: bottom; -} -.shortcut-remove{ - background: url(/base/static/src/img/remove-shortcut.png) no-repeat; - background-position: bottom; +.oe-shortcut-remove{ + background: url(/base/static/src/img/remove-shortcut.png) no-repeat bottom; } /* ================ */ .oe-shortcuts { diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 7158a254df5..4df26c60ae8 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -160,7 +160,6 @@ openerp.base.ViewManager = openerp.base.Widget.extend({ view_promise; this.active_view = view_type; var view = this.views[view_type]; - this.shortcut_check(view.view_id,view_type); if (!view.controller) { // Lazy loading of views var controllerclass = this.registry.get_object(view_type); @@ -272,44 +271,7 @@ openerp.base.ViewManager = openerp.base.Widget.extend({ */ contexts: function () { return []; - }, - shortcut_check : function(view_id,view_type){ - main_view = this.session.action_manager.viewmanager.views_src[0]; - if (view_type == "tree" || main_view.view_id == view_id && main_view.view_type == view_type && - this.element_id == "oe_app"){ - $('#shortcut_add_remove').show(); - var img = "shortcut-add"; - for(var list_shortcut=0; list_shortcut
- - - - +
+

Code:

+
+QWeb = new QWeb2.Engine();
+var o_db = openerp.init();
+var o_sess = new o_db.Session();
+//.base.webclient("oe");
+        
+

div id="ex1res" to output results:

+
+   +
+ + + From 89c8ed860bc3bd2e76c56b64b3709abe12baf600 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Thu, 18 Aug 2011 22:58:20 +0200 Subject: [PATCH 47/66] [IMP] web_rpc partial example bzr revid: al@openerp.com-20110818205820-japmg7a9dsr6k6yn --- addons/web_rpc/static/src/example.html | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/addons/web_rpc/static/src/example.html b/addons/web_rpc/static/src/example.html index c94c43e319e..6f96c609527 100644 --- a/addons/web_rpc/static/src/example.html +++ b/addons/web_rpc/static/src/example.html @@ -6,17 +6,28 @@ -

Example 1

+

Example 1: Display all res_users in an html table

Code:

 QWeb = new QWeb2.Engine();
 var o_db = openerp.init();
-var o_sess = new o_db.Session();
-//.base.webclient("oe");
+var o_sess = new o_db.base.Session();
+o_sess.debug = 1;
+o_sess.session_login("web_trunk", "admin", "admin", function() {
+    var o_ds = new o_db.base.DataSet(o_sess,"res.users",{});
+    // search for res.users
+    //o_ds.sear()
+    // read res.users
+    // display them
+    $("#ex1res").html(o_sess.debug.toString());
+});
         

div id="ex1res" to output results:

From e9d031cb0bc047fbc9e0af072b8c3c697bf9bd08 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Thu, 18 Aug 2011 23:26:35 +0200 Subject: [PATCH 48/66] [IMP] web_rpc example page bzr revid: al@openerp.com-20110818212635-pewkb53nab2tq7ca --- addons/web_rpc/static/src/example.html | 41 +++++++++++++++++--------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/addons/web_rpc/static/src/example.html b/addons/web_rpc/static/src/example.html index 6f96c609527..8e466e63971 100644 --- a/addons/web_rpc/static/src/example.html +++ b/addons/web_rpc/static/src/example.html @@ -3,7 +3,15 @@ OpenERP RPC example - + + + + + +

OpenERP web_rpc module examples

Example 1: Display all res_users in an html table

Code:

-
-QWeb = new QWeb2.Engine();
-var o_db = openerp.init();
-var o_sess = new o_db.base.Session();
-o_sess.debug = 1;
-o_sess.session_login("web_trunk", "admin", "admin", function() {
-    var o_ds = new o_db.base.DataSet(o_sess,"res.users",{});
-    // search for res.users
-    //o_ds.sear()
-    // read res.users
-    // display them
-    $("#ex1res").html(o_sess.debug.toString());
-});
+        
+<script type="text/javascript" src="/base/webclient/js?mods=web_rpc"></script> 
+<script type="text/javascript">
+
+    QWeb = new QWeb2.Engine();
+    var o_db = openerp.init();
+    var o_sess = new o_db.base.Session();
+    o_sess.debug = 1;
+    o_sess.session_login("web-trunk", "admin", "admin", function() {
+        var o_ds = new o_db.base.DataSet(o_sess,"res.users",{});
+        // search for res.users
+        //o_ds.sear()
+        // read res.users
+        // display them
+        $("#ex1res").html(o_sess.debug.toString());
+    });
+
</script>

div id="ex1res" to output results:

From 47e709eb735f0fab8ee53c802e1352ee445d52cc Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Fri, 19 Aug 2011 00:57:21 +0200 Subject: [PATCH 49/66] [IMP] read_slice fields outside option [] are probably bugs bzr revid: al@openerp.com-20110818225721-tn1vl2450tbe11d6 --- addons/base/static/src/js/data.js | 15 +++++++----- addons/base/static/src/js/form.js | 4 +--- addons/base/static/src/js/list.js | 11 ++++----- addons/base/static/src/js/view_tree.js | 2 +- addons/base/static/src/js/views.js | 24 +++++++++++++++++++ .../base_calendar/static/src/js/calendar.js | 3 +-- .../base_dashboard/static/src/js/dashboard.js | 10 +++----- .../base_default_home/static/src/js/home.js | 2 +- addons/base_gantt/static/src/js/gantt.js | 4 ++-- addons/base_graph/static/src/js/graph.js | 4 ++-- .../web_mobile/static/src/js/form_mobile.js | 2 +- 11 files changed, 50 insertions(+), 31 deletions(-) diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index 244c057d544..2dac0bb5ae4 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -286,14 +286,16 @@ openerp.base.DataSet = openerp.base.Widget.extend( /** @lends openerp.base.Data * Read a slice of the records represented by this DataSet, based on its * domain and context. * + * @param {Array} [fields] fields to read and return, by default all fields are returned * @params {Object} options - * @param {Array} [options.fields] fields to read and return, by default all fields are returned * @param {Number} [options.offset=0] The index from which selected records should be returned * @param {Number} [options.limit=null] The maximum number of records to return * @param {Function} callback function called with read_slice result * @returns {$.Deferred} */ - read_slice: function (options, callback) { return null; }, + read_slice: function (fields, options, callback) { + return null; + }, /** * Reads the current dataset record (from its index) * @@ -478,11 +480,12 @@ openerp.base.DataSetStatic = openerp.base.DataSet.extend({ // all local records this.ids = ids || []; }, - read_slice: function (options, callback) { + read_slice: function (fields, options, callback) { + // TODO remove fields from options var self = this, offset = options.offset || 0, limit = options.limit || false, - fields = options.fields || false; + fields = fields || false; var end_pos = limit && limit !== -1 ? offset + limit : undefined; return this.read_ids(this.ids.slice(offset, end_pos), fields, callback); }, @@ -532,12 +535,12 @@ openerp.base.DataSetSearch = openerp.base.DataSet.extend({ * @param {Function} callback function called with read_slice result * @returns {$.Deferred} */ - read_slice: function (options, callback) { + read_slice: function (fields, options, callback) { var self = this; var offset = options.offset || 0; return this.rpc('/base/dataset/search_read', { model: this.model, - fields: options.fields || false, + fields: fields || false, domain: this.get_domain(options.domain), context: this.get_context(options.context), sort: this.sort(), diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index d3056e618bf..c85d1fd4cb2 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -458,9 +458,7 @@ openerp.base.form.SidebarAttachments = openerp.base.Widget.extend({ ['res_model', '=', this.view.dataset.model], ['res_id', '=', this.view.datarecord.id], ['type', 'in', ['binary', 'url']] - ])).read_slice( - {fields: ['name', 'url', 'type']}, - this.on_attachments_loaded); + ])).read_slice(['name', 'url', 'type'], this.on_attachments_loaded); } }, on_attachments_loaded: function(attachments) { diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index a0440221520..d715c3600be 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -476,7 +476,8 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi */ do_activate_record: function (index, id, dataset) { var self = this; - this.dataset.read_slice({ + // TODO is it needed ? + this.dataset.read_slice([],{ context: dataset.get_context(), domain: dataset.get_domain() }, function () { @@ -1034,11 +1035,9 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas d = new $.Deferred(), page = this.datagroup.openable ? this.page : view.page; - dataset.read_slice({ - fields: _.pluck(_.select(this.columns, function(x) {return x.tag == "field"}), 'name'), - offset: page * limit, - limit: limit - }, function (records) { + var fields = _.pluck(_.select(this.columns, function(x) {return x.tag == "field"}), 'name'); + var options = { offset: page * limit, limit: limit }; + dataset.read_slice(fields, options , function (records) { if (!self.datagroup.openable) { view.configure_pager(dataset); } else { diff --git a/addons/base/static/src/js/view_tree.js b/addons/base/static/src/js/view_tree.js index 5c3c7457e1c..59544a998b3 100644 --- a/addons/base/static/src/js/view_tree.js +++ b/addons/base/static/src/js/view_tree.js @@ -72,7 +72,7 @@ openerp.base.TreeView = openerp.base.View.extend({ 'toolbar': has_toolbar })); - this.dataset.read_slice({fields: this.fields_list()}, function (records) { + this.dataset.read_slice(this.fields_list(), {}, function (records) { if (!has_toolbar) { // WARNING: will do a second read on the same ids, but only on // first load so not very important diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index f21c6387d32..ad75268156f 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -17,6 +17,7 @@ openerp.base.ActionManager = openerp.base.Widget.extend({ this.dialog = null; this.dialog_viewmanager = null; this.client_widget = null; + this.url = {} }, render: function() { return "
"; @@ -35,6 +36,28 @@ openerp.base.ActionManager = openerp.base.Widget.extend({ this.inner_viewmanager = null; } }, + url_update: function(action) { + // this.url = { + // "model": action.model, + // "domain": action.domain, + // }; + // action.res_model + // action.domain + // action.context + // after + // action.views + // action.res_id + // mode + // menu + }, + url_stringify: function(action) { + }, + url_parse: function(action) { + }, + on_url_update: function(url) { + }, + do_url_action: function(url) { + }, do_action: function(action, on_close) { var type = action.type.replace(/\./g,'_'); var popup = action.target === 'new'; @@ -69,6 +92,7 @@ openerp.base.ActionManager = openerp.base.Widget.extend({ this.inner_stop(); this.inner_viewmanager = new openerp.base.ViewManagerAction(this, action); this.inner_viewmanager.appendTo(this.$element); + this.url_update(action); } /* new window code this.rpc("/base/session/save_session_action", { the_action : action}, function(key) { diff --git a/addons/base_calendar/static/src/js/calendar.js b/addons/base_calendar/static/src/js/calendar.js index d02fbe490e2..8b0f1e995b6 100644 --- a/addons/base_calendar/static/src/js/calendar.js +++ b/addons/base_calendar/static/src/js/calendar.js @@ -302,8 +302,7 @@ openerp.base_calendar.CalendarView = openerp.base.View.extend({ // TODO: handle non-empty results.group_by with read_group self.dataset.context = self.context = results.context; self.dataset.domain = self.domain = results.domain; - self.dataset.read_slice({ - fields: _.keys(self.fields), + self.dataset.read_slice(_.keys(self.fields), { offset:0, limit: self.limit }, function(events) { diff --git a/addons/base_dashboard/static/src/js/dashboard.js b/addons/base_dashboard/static/src/js/dashboard.js index 422d279a485..727e5e5519c 100644 --- a/addons/base_dashboard/static/src/js/dashboard.js +++ b/addons/base_dashboard/static/src/js/dashboard.js @@ -290,7 +290,7 @@ openerp.base_dashboard.ConfigOverview = openerp.base.View.extend({ this.dataset.domain = [['type', '=', 'manual']]; }, start: function () { - $.when(this.dataset.read_slice({fields: ['state', 'action_id', 'category_id']}), + $.when(this.dataset.read_slice(['state', 'action_id', 'category_id']), this.dataset.call('progress')) .then(this.on_records_loaded); }, @@ -352,9 +352,7 @@ openerp.base_dashboard.ApplicationTiles = openerp.base.View.extend({ }, start: function () { var self = this; - this.dataset.read_slice( - {fields: ['name', 'web_icon_data', 'web_icon_hover_data']}, - function (applications) { + this.dataset.read_slice( ['name', 'web_icon_data', 'web_icon_hover_data'], {}, function (applications) { // Create a matrix of 3*x applications var rows = []; while (applications.length) { @@ -384,9 +382,7 @@ openerp.base_dashboard.Widgets = openerp.base.View.extend({ this.widgets = new openerp.base.DataSetSearch(this, 'res.widget'); }, start: function () { - this.user_widgets.read_slice( - {fields: ['widget_id', 'user_id']}, - this.on_widgets_list_loaded); + this.user_widgets.read_slice(['widget_id', 'user_id'], {}, this.on_widgets_list_loaded); }, on_widgets_list_loaded: function (user_widgets) { var self = this; diff --git a/addons/base_default_home/static/src/js/home.js b/addons/base_default_home/static/src/js/home.js index ebdf7ea7d00..e1f96c89da7 100644 --- a/addons/base_default_home/static/src/js/home.js +++ b/addons/base_default_home/static/src/js/home.js @@ -86,7 +86,7 @@ openerp.base_default_home = function (openerp) { $.blockUI({ message: '' }); - Modules.read_slice({fields: ['id']}, function (records) { + Modules.read_slice(['id'], function (records) { if (!(records.length === 1)) { return; } Modules.call('state_update', [_.pluck(records, 'id'), 'to install', ['uninstalled']], diff --git a/addons/base_gantt/static/src/js/gantt.js b/addons/base_gantt/static/src/js/gantt.js index 307dc94c6b8..6a5342f9c55 100644 --- a/addons/base_gantt/static/src/js/gantt.js +++ b/addons/base_gantt/static/src/js/gantt.js @@ -79,7 +79,7 @@ init: function(parent, element_id, dataset, view_id) { get_events: function() { var self = this; - this.dataset.read_slice({}, function(result) { + this.dataset.read_slice([],{}, function(result) { self.load_event(result); }); @@ -498,7 +498,7 @@ init: function(parent, element_id, dataset, view_id) { reload_gantt: function() { var self = this; - this.dataset.read_slice({}, function(response) { + this.dataset.read_slice([],{}, function(response) { ganttChartControl.clearAll(); jQuery("#GanttDiv").children().remove(); self.load_event(response); diff --git a/addons/base_graph/static/src/js/graph.js b/addons/base_graph/static/src/js/graph.js index f7c949dc194..e76d38b33bc 100644 --- a/addons/base_graph/static/src/js/graph.js +++ b/addons/base_graph/static/src/js/graph.js @@ -89,7 +89,7 @@ openerp.base_graph.GraphView = openerp.base.View.extend({ } this.dataset.domain = domain; this.dataset.context = this.view_manager.dataset.context; - this.dataset.read_slice({fields: _(this.fields).keys()}, function(res) { + this.dataset.read_slice(_(this.fields).keys(),{}, function(res) { self.schedule_chart(res); }); } @@ -468,7 +468,7 @@ openerp.base_graph.GraphView = openerp.base.View.extend({ } self.dataset.context = results.context; self.dataset.domain = results.domain; - self.dataset.read_slice({}, $.proxy(self, 'load_chart')); + self.dataset.read_slice([],{}, $.proxy(self, 'load_chart')); }); } }); diff --git a/addons/web_mobile/static/src/js/form_mobile.js b/addons/web_mobile/static/src/js/form_mobile.js index a8c7bcc480e..793d944ddcd 100644 --- a/addons/web_mobile/static/src/js/form_mobile.js +++ b/addons/web_mobile/static/src/js/form_mobile.js @@ -12,7 +12,7 @@ openerp.web_mobile.FormView = openerp.base.Widget.extend({ view_id = this.action.views[1][0]; this.dataset = new openerp.base.DataSetSearch(this.session, this.action.res_model, null, null); - this.dataset.read_slice({}, function (result) { + this.dataset.read_slice([],{}, function (result) { for (var i = 0; i < result.length; i++) { if (result[i].id == id) { From 056a91f72439ae99f1df02a75c30aafc13bd3648 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Fri, 19 Aug 2011 01:38:11 +0200 Subject: [PATCH 50/66] [IMP] web_rpc example bzr revid: al@openerp.com-20110818233811-yiee3czhbtc6p3ob --- addons/base/static/src/js/core.js | 2 +- addons/base/static/src/js/data.js | 1 + .../base_default_home/static/src/js/home.js | 8 ++-- addons/web_rpc/static/src/example.html | 37 ++++++++++--------- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/addons/base/static/src/js/core.js b/addons/base/static/src/js/core.js index 58d19de9008..e0ec45c3e6f 100644 --- a/addons/base/static/src/js/core.js +++ b/addons/base/static/src/js/core.js @@ -323,7 +323,6 @@ openerp.base.CallbackEnabled = openerp.base.Class.extend({ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.base.Session# */{ /** * @constructs - * @param element_id to use for exception reporting * @param server * @param port */ @@ -344,6 +343,7 @@ openerp.base.Session = openerp.base.CallbackEnabled.extend( /** @lends openerp.b this.context = {}; this.shortcuts = []; this.active_id = null; + this.session = this; }, start: function() { this.session_restore(); diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index 2dac0bb5ae4..04c23224806 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -537,6 +537,7 @@ openerp.base.DataSetSearch = openerp.base.DataSet.extend({ */ read_slice: function (fields, options, callback) { var self = this; + var options = options || {}; var offset = options.offset || 0; return this.rpc('/base/dataset/search_read', { model: this.model, diff --git a/addons/base_default_home/static/src/js/home.js b/addons/base_default_home/static/src/js/home.js index e1f96c89da7..7470b2914ce 100644 --- a/addons/base_default_home/static/src/js/home.js +++ b/addons/base_default_home/static/src/js/home.js @@ -78,15 +78,13 @@ openerp.base_default_home = function (openerp) { }); }, install_module: function (module_name) { - var Modules = new openerp.base.DataSetSearch( - this, 'ir.module.module', null, - [['name', '=', module_name], ['state', '=', 'uninstalled']]), - Upgrade = new openerp.base.DataSet(this, 'base.module.upgrade'); + var Modules = new openerp.base.DataSetSearch( this, 'ir.module.module', null, [['name', '=', module_name], ['state', '=', 'uninstalled']]); + var Upgrade = new openerp.base.DataSet(this, 'base.module.upgrade'); $.blockUI({ message: '' }); - Modules.read_slice(['id'], function (records) { + Modules.read_slice(['id'], {}, function (records) { if (!(records.length === 1)) { return; } Modules.call('state_update', [_.pluck(records, 'id'), 'to install', ['uninstalled']], diff --git a/addons/web_rpc/static/src/example.html b/addons/web_rpc/static/src/example.html index 8e466e63971..7242a3716a5 100644 --- a/addons/web_rpc/static/src/example.html +++ b/addons/web_rpc/static/src/example.html @@ -2,7 +2,7 @@ - OpenERP RPC example + OpenERP web_rpc example @@ -15,37 +15,40 @@ -

OpenERP web_rpc module examples

-

Example 1: Display all res_users in an html table

+

OpenERP web_rpc examples

+

Example 1: Display a list of defined ir.model

Code:

 <script type="text/javascript" src="/base/webclient/js?mods=web_rpc"></script> 
 <script type="text/javascript">
 
-    QWeb = new QWeb2.Engine();
-    var o_db = openerp.init();
-    var o_sess = new o_db.base.Session();
-    o_sess.debug = 1;
-    o_sess.session_login("web-trunk", "admin", "admin", function() {
-        var o_ds = new o_db.base.DataSet(o_sess,"res.users",{});
-        // search for res.users
-        //o_ds.sear()
-        // read res.users
-        // display them
-        $("#ex1res").html(o_sess.debug.toString());
-    });
+    var c = openerp.init(); // get a new webclient
+    c._modules_loaded = true; // Hack to prevent loading of additional modules
+
+    var s = new c.base.Session(); // setup a Session
+    s.session_login("web-trunk", "admin", "admin", function() {
+
+            var ds = new c.base.DataSetSearch(s, "ir.model"); // DataSetSearch used to search, read
+            ds.read_slice(['name','model'], {}, function(users){
+                for(var i in users) { 
+                    $("#ex1res").append("<li>" + users[i].model + " (" + users[i].name + ") </li>")
+                }
+            });
+        }
+    );
 
</script>
-

div id="ex1res" to output results:

+

Div for output:

 
+

Help me to complete this example page on launchpad

From 8f785e16a87321e505504c74ef8c1c8a0f82ff16 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Fri, 19 Aug 2011 02:06:15 +0200 Subject: [PATCH 51/66] [FIX] remove wrong paste of ie7 css bzr revid: al@openerp.com-20110819000615-8cv9mqtrwzgxo1pd --- addons/web_rpc/static/src/example.html | 3 --- 1 file changed, 3 deletions(-) diff --git a/addons/web_rpc/static/src/example.html b/addons/web_rpc/static/src/example.html index 7242a3716a5..724de9d2885 100644 --- a/addons/web_rpc/static/src/example.html +++ b/addons/web_rpc/static/src/example.html @@ -3,9 +3,6 @@ OpenERP web_rpc example - - -