From 992c7bc76ec78e0aad4f258ec8e246476ec72511 Mon Sep 17 00:00:00 2001 From: Mantavya Gajjar Date: Mon, 1 Aug 2011 17:15:43 +0530 Subject: [PATCH 02/68] [FIX]: fix a problem of sending email if we are using sendmail tool with server action it was coded in such way that we can not send email without --email-from parameter, but in case if we are using sendmail, we can user user's emails or auto generated email to define email-from bzr revid: mga@openerp.com-20110801114543-hi12oqciol8a62pc --- openerp/addons/base/ir/ir_actions.py | 30 ++++++++++++++++++---------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py index 7c8a2414d25..8e7bd8dd167 100644 --- a/openerp/addons/base/ir/ir_actions.py +++ b/openerp/addons/base/ir/ir_actions.py @@ -32,6 +32,7 @@ import copy import os from xml import dom from report.report_sxw import report_sxw, report_rml +from socket import gethostname class actions(osv.osv): _name = 'ir.actions.actions' @@ -598,16 +599,18 @@ class actions_server(osv.osv): logger = logging.getLogger(self._name) if context is None: context = {} + user = self.pool.get('res.users').browse(cr, uid, uid) for action in self.browse(cr, uid, ids, context): obj_pool = self.pool.get(action.model_id.model) obj = obj_pool.browse(cr, uid, context['active_id'], context=context) cxt = { - 'context': dict(context), # copy context to prevent side-effects of eval - 'object': obj, + 'context':dict(context), # copy context to prevent side-effects of eval + 'object':obj, 'time':time, - 'cr': cr, - 'pool' : self.pool, - 'uid' : uid + 'cr':cr, + 'pool':self.pool, + 'uid':uid, + 'user':user } expr = eval(str(action.condition), cxt) if not expr: @@ -629,13 +632,14 @@ class actions_server(osv.osv): 'uid': uid, 'object':obj, 'obj': obj, + 'user':user } eval(action.code, localdict, mode="exec", nocopy=True) # nocopy allows to return 'action' if 'action' in localdict: return localdict['action'] if action.state == 'email': - user = config['email_from'] + email_from = config['email_from'] address = str(action.email) try: address = eval(str(action.email), cxt) @@ -643,16 +647,20 @@ class actions_server(osv.osv): pass if not address: - logger.info('Partner Email address not Specified!') + logger.info('Partner email address not specified!') continue - if not user: - logger.info('Email-From address not Specified at server!') - raise osv.except_osv(_('Error'), _("Please specify server option --email-from !")) + + if not email_from: + logger.info('Email from address not specify at server option --email-from !') + if user.user_email: + email_from = user.user_email + else: + email_from = "%s@%s" % (user.login, gethostname()) subject = self.merge_message(cr, uid, action.subject, action, context) body = self.merge_message(cr, uid, action.message, action, context) - if tools.email_send(user, [address], subject, body, debug=False, subtype='html') == True: + if tools.email_send(email_from, [address], subject, body, debug=False, subtype='html') == True: logger.info('Email successfully sent to: %s', address) else: logger.warning('Failed to send email to: %s', address) From 9ad05c699bf634ca6ee0800ac96638529433aae0 Mon Sep 17 00:00:00 2001 From: "Vidhin Mehta (OpenERP)" Date: Mon, 8 Aug 2011 16:46:16 +0530 Subject: [PATCH 03/68] [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 04/68] [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 05/68] [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 06/68] [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 07/68] [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 08/68] [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 09/68] [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 10/68] [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 11/68] [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 cdbd7dd7d6be2af6d0ccdadba7b67ee218706de5 Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Tue, 16 Aug 2011 04:34:37 +0000 Subject: [PATCH 12/68] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20110816043437-2ik9gp5alwecpla8 --- addons/project_scrum/i18n/zh_CN.po | 311 ++++++++++++++----------- addons/resource/i18n/es_EC.po | 359 +++++++++++++++++++++++++++++ 2 files changed, 531 insertions(+), 139 deletions(-) create mode 100644 addons/resource/i18n/es_EC.po diff --git a/addons/project_scrum/i18n/zh_CN.po b/addons/project_scrum/i18n/zh_CN.po index c1f7edc0304..829a279304a 100644 --- a/addons/project_scrum/i18n/zh_CN.po +++ b/addons/project_scrum/i18n/zh_CN.po @@ -7,24 +7,24 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:15+0000\n" -"PO-Revision-Date: 2010-03-20 10:28+0000\n" -"Last-Translator: Black Jack \n" +"PO-Revision-Date: 2011-08-16 03:16+0000\n" +"Last-Translator: openerp-china.black-jack \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-04-29 04:54+0000\n" -"X-Generator: Launchpad (build 12758)\n" +"X-Launchpad-Export-Date: 2011-08-16 04:34+0000\n" +"X-Generator: Launchpad (build 13687)\n" #. module: project_scrum #: help:project.scrum.email,scrum_master_email:0 msgid "Email Id of Scrum Master" -msgstr "" +msgstr "Scrum主管的邮件地址" #. module: project_scrum #: view:project.scrum.backlog.assign.sprint:0 msgid "_Assign" -msgstr "" +msgstr "指派(_A)" #. module: project_scrum #: field:project.scrum.meeting,name:0 @@ -34,13 +34,13 @@ msgstr "会议名称" #. module: project_scrum #: model:process.transition,note:project_scrum.process_transition_backlogtask0 msgid "From backlog create task." -msgstr "从Backlog创建任务" +msgstr "从需求创建任务" #. module: project_scrum #: view:project.scrum.product.backlog:0 #: field:project.scrum.product.backlog,user_id:0 msgid "Author" -msgstr "" +msgstr "建立者" #. module: project_scrum #: model:ir.module.module,description:project_scrum.module_meta_information @@ -68,12 +68,28 @@ msgid "" " * http://controlchaos.com\n" " " msgstr "" +"\n" +" 这个模块实现了IT公司使用的SCRUM项目管理方法中的所有概念:\n" +" 项目包含产品负责人、Scrum主管\n" +" 冲刺有验收、每日会议、总结等\n" +" 产品需求列表\n" +" 冲刺的需求列表\n" +" 为项目管理模块增加了一些概念:\n" +" 中长期路线图\n" +" 客户业务需求和技术需求\n" +"\n" +"此模块还新增一个报告:\n" +" 燃尽图\n" +" SCRUM的项目和任务都是基于传统的项目和任务的,所以 你可以继续关注你自己的任务列表(其中包括SCRUM项目的任务)\n" +"\n" +"更多该方法的信息请参照 http://controlchaos.com\n" +" " #. module: project_scrum #: view:project.scrum.meeting:0 #: view:project.scrum.sprint:0 msgid "What did you do since the last meeting?" -msgstr "" +msgstr "你昨天做了什么?" #. module: project_scrum #: model:ir.actions.act_window,help:project_scrum.action_sprint_all_tree @@ -83,18 +99,20 @@ msgid "" "which the team implements a list of product backlogs. The sprint review is " "organized when the team presents its work to the customer and product owner." msgstr "" +"叫做SCRUM的敏捷方法用于软件开发项目。在这个理论中,冲刺是一个固定长度的期间(比如一个月),在这个期间内开发团队完成产品的一部分功能。冲刺验收会议用于" +"向客户和产品经理演示开发成果。" #. module: project_scrum #: view:project.scrum.meeting:0 #: view:project.scrum.product.backlog:0 #: view:project.scrum.sprint:0 msgid "Group By..." -msgstr "" +msgstr "分组..." #. module: project_scrum #: model:process.node,note:project_scrum.process_node_productbacklog0 msgid "Create task from backlogs" -msgstr "从backlogs创建任务" +msgstr "从需求创建任务" #. module: project_scrum #: model:ir.module.module,shortdesc:project_scrum.module_meta_information @@ -104,7 +122,7 @@ msgstr "Scrum敏捷开发方法" #. module: project_scrum #: field:project.scrum.product.backlog,progress:0 msgid "Progress" -msgstr "进行" +msgstr "进度" #. module: project_scrum #: field:project.scrum.meeting,user_id:0 @@ -117,18 +135,18 @@ msgstr "Scrum主管" #: code:addons/project_scrum/project_scrum.py:83 #, python-format msgid "The sprint '%s' has been opened." -msgstr "" +msgstr "冲刺'%s' 已开始" #. module: project_scrum #: constraint:project.project:0 msgid "Error! project start-date must be lower then project end-date." -msgstr "" +msgstr "错误!项目的开始日期必须小于项目的结束日期" #. module: project_scrum #: view:project.scrum.meeting:0 #: view:project.scrum.sprint:0 msgid "Are your Sprint Backlog estimate accurate ?" -msgstr "你的Sprint Backlob是否估计准确?" +msgstr "你的冲刺需求是否估计准确?" #. module: project_scrum #: view:project.scrum.sprint:0 @@ -138,75 +156,75 @@ msgstr "回顾" #. module: project_scrum #: view:project.scrum.meeting:0 msgid "Send Email" -msgstr "" +msgstr "发送邮件" #. module: project_scrum #: constraint:project.task:0 msgid "Error ! You cannot create recursive tasks." -msgstr "" +msgstr "错误!不能创建循环引用的任务" #. module: project_scrum #: model:ir.actions.act_window,name:project_scrum.dblc_proj msgid "View project's backlog" -msgstr "项目Backlog视图" +msgstr "项目需求视图" #. module: project_scrum #: view:project.scrum.product.backlog:0 #: view:project.scrum.sprint:0 msgid "Set to Draft" -msgstr "" +msgstr "设为草稿" #. module: project_scrum #: model:ir.model,name:project_scrum.model_project_scrum_backlog_merge msgid "Merge Product Backlogs" -msgstr "" +msgstr "合并产品需求" #. module: project_scrum #: model:ir.actions.act_window,name:project_scrum.action_scrum_backlog_merge #: view:project.scrum.backlog.merge:0 msgid "Merge Backlogs" -msgstr "" +msgstr "合并需求" #. module: project_scrum #: code:addons/project_scrum/wizard/project_scrum_email.py:53 #, python-format msgid "Scrum Meeting : %s" -msgstr "" +msgstr "早会: %s" #. module: project_scrum #: view:project.task:0 msgid "Backlog" -msgstr "" +msgstr "需求" #. module: project_scrum #: model:ir.model,name:project_scrum.model_project_scrum_email msgid "project.scrum.email" -msgstr "" +msgstr "project.scrum.email" #. module: project_scrum #: constraint:project.project:0 msgid "Error! You cannot assign escalation to the same project!" -msgstr "" +msgstr "不能升级到相同的项目" #. module: project_scrum #: field:project.scrum.sprint,name:0 msgid "Sprint Name" -msgstr "Sprint名称" +msgstr "冲刺名称" #. module: project_scrum #: model:ir.model,name:project_scrum.model_project_task msgid "Task" -msgstr "" +msgstr "任务" #. module: project_scrum #: view:postpone.wizard:0 msgid "Ok" -msgstr "" +msgstr "确定" #. module: project_scrum #: view:project.scrum.product.backlog:0 msgid "Spent hours" -msgstr "" +msgstr "花费工时" #. module: project_scrum #: model:ir.actions.act_window,help:project_scrum.action_meeting_form @@ -214,19 +232,19 @@ msgid "" "The scrum agile methodology is used in software development projects. In " "this methodology, a daily meeting is organized by the scrum master with his " "team in order to detect the difficulties the team faced/will face." -msgstr "" +msgstr "SCRUM敏捷方法用于软件开发项目。在这个方法中,Scrum主管组织所有项目成员参加早会以便发现团队正在或将要面临的问题。" #. module: project_scrum #: code:addons/project_scrum/project_scrum.py:316 #, python-format msgid "Please provide email address for product owner defined on sprint." -msgstr "" +msgstr "请输入这个冲刺的产品负责人的邮件地址" #. module: project_scrum #: code:addons/project_scrum/project_scrum.py:327 #, python-format msgid "Scrum Meeting of %s" -msgstr "" +msgstr "早会:%s" #. module: project_scrum #: code:addons/project_scrum/wizard/project_scrum_backlog_sprint.py:57 @@ -238,7 +256,7 @@ msgstr "" #: code:addons/project_scrum/wizard/project_scrum_backlog_sprint.py:62 #, python-format msgid "Product Backlog '%s' is assigned sprint:%s" -msgstr "" +msgstr "产品需求'%s' 分配的冲刺:%s" #. module: project_scrum #: code:addons/project_scrum/wizard/project_scrum_backlog_sprint.py:57 @@ -248,7 +266,7 @@ msgstr "" #: field:project.task,product_backlog_id:0 #, python-format msgid "Product Backlog" -msgstr "" +msgstr "产品需求" #. module: project_scrum #: model:ir.model,name:project_scrum.model_project_project @@ -264,7 +282,7 @@ msgstr "项目" #. module: project_scrum #: view:project.scrum.product.backlog:0 msgid "Start Task" -msgstr "" +msgstr "启动任务" #. module: project_scrum #: code:addons/project_scrum/wizard/project_scrum_email.py:90 @@ -272,17 +290,17 @@ msgstr "" #: code:addons/project_scrum/wizard/project_scrum_email.py:96 #, python-format msgid "None" -msgstr "" +msgstr "无" #. module: project_scrum #: view:project.scrum.product.backlog:0 msgid "Change Stage" -msgstr "" +msgstr "修改阶段" #. module: project_scrum #: view:project.scrum.sprint:0 msgid "Sprint Info" -msgstr "Sprint信息" +msgstr "冲刺信息" #. module: project_scrum #: field:project.scrum.sprint,date_stop:0 @@ -293,28 +311,28 @@ msgstr "终止日期" #: view:project.scrum.meeting:0 #: view:project.scrum.sprint:0 msgid "Links" -msgstr "" +msgstr "链接" #. module: project_scrum #: help:project.scrum.sprint,effective_hours:0 msgid "Computed using the sum of the task work done." -msgstr "任务工作完成的合计" +msgstr "任务完成的工作时间合计" #. module: project_scrum #: code:addons/project_scrum/wizard/project_scrum_email.py:91 #, python-format msgid "Task for Today" -msgstr "" +msgstr "今日任务" #. module: project_scrum #: field:project.scrum.backlog.assign.sprint,state_open:0 msgid "Open Backlog" -msgstr "" +msgstr "待实现的需求" #. module: project_scrum #: view:project.scrum.product.backlog:0 msgid "Total Spent Hours" -msgstr "" +msgstr "累计工时" #. module: project_scrum #: field:project.scrum.sprint,date_start:0 @@ -325,24 +343,24 @@ msgstr "开始日期" #: code:addons/project_scrum/wizard/project_scrum_email.py:94 #, python-format msgid "Blocking points encountered:" -msgstr "" +msgstr "估算点数" #. module: project_scrum #: view:project.scrum.sprint:0 msgid "Planning" -msgstr "" +msgstr "正在计划" #. module: project_scrum #: view:project.scrum.backlog.assign.sprint:0 #: view:project.scrum.backlog.create.task:0 #: view:project.scrum.email:0 msgid "_Cancel" -msgstr "" +msgstr "取消(_C)" #. module: project_scrum #: help:project.scrum.sprint,scrum_master_id:0 msgid "The person who is maintains the processes for the product" -msgstr "" +msgstr "管理产品开发流程的人" #. module: project_scrum #: view:project.scrum.product.backlog:0 @@ -354,7 +372,7 @@ msgstr "计划时间" #. module: project_scrum #: field:project.scrum.email,subject:0 msgid "Subject" -msgstr "" +msgstr "主题" #. module: project_scrum #: view:board.board:0 @@ -364,28 +382,28 @@ msgstr "" #: view:project.scrum.product.backlog:0 #: view:project.scrum.sprint:0 msgid "Sprints" -msgstr "" +msgstr "冲刺" #. module: project_scrum #: code:addons/project_scrum/project_scrum.py:314 #, python-format msgid "Email notification could not be sent to the product owner %s" -msgstr "" +msgstr "提醒邮件无法发送给产品负责人 %s" #. module: project_scrum #: field:project.scrum.backlog.assign.sprint,convert_to_task:0 msgid "Convert To Task" -msgstr "" +msgstr "转为任务" #. module: project_scrum #: view:project.scrum.backlog.merge:0 msgid "Are you sure you want to merge these Backlogs?" -msgstr "" +msgstr "您确认要合并这些需求?" #. module: project_scrum #: help:project.scrum.backlog.create.task,user_id:0 msgid "Responsible user who can work on task" -msgstr "" +msgstr "任务的负责人" #. module: project_scrum #: view:project.scrum.product.backlog:0 @@ -398,7 +416,7 @@ msgstr "状态" #. module: project_scrum #: model:ir.actions.act_window,name:project_scrum.action_sprint_task_open msgid "View sprint Tasks" -msgstr "Sprint任务视图" +msgstr "查看冲刺任务列表" #. module: project_scrum #: field:project.scrum.sprint,meeting_ids:0 @@ -408,14 +426,14 @@ msgstr "每日Scrum" #. module: project_scrum #: view:project.scrum.backlog.create.task:0 msgid "C_onvert" -msgstr "" +msgstr "转换(_O)" #. module: project_scrum #: model:ir.actions.act_window,name:project_scrum.action_product_backlog_form #: model:ir.ui.menu,name:project_scrum.menu_action_product_backlog_form #: view:project.scrum.product.backlog:0 msgid "Product Backlogs" -msgstr "" +msgstr "产品需求" #. module: project_scrum #: code:addons/project_scrum/project_scrum.py:301 @@ -424,23 +442,23 @@ msgstr "" #: code:addons/project_scrum/project_scrum.py:316 #, python-format msgid "Error !" -msgstr "" +msgstr "错误!" #. module: project_scrum #: field:project.scrum.product.backlog,create_date:0 msgid "Creation Date" -msgstr "" +msgstr "创建日期" #. module: project_scrum #: view:project.scrum.meeting:0 #: view:project.scrum.sprint:0 msgid "Are there anything blocking you?" -msgstr "" +msgstr "有什么问题和困难么?" #. module: project_scrum #: model:ir.ui.menu,name:project_scrum.menu_scrum msgid "Scrum" -msgstr "" +msgstr "SCRUM" #. module: project_scrum #: field:project.scrum.meeting,question_today:0 @@ -459,32 +477,32 @@ msgstr "昨天到现在的任务" #: code:addons/project_scrum/wizard/project_scrum_backlog_merger.py:71 #, python-format msgid "Warning" -msgstr "" +msgstr "警告" #. module: project_scrum #: model:ir.model,name:project_scrum.model_project_scrum_backlog_assign_sprint msgid "Assign sprint to backlogs" -msgstr "" +msgstr "为需求分配冲刺" #. module: project_scrum #: help:project.scrum.sprint,expected_hours:0 msgid "Estimated time to do the task." -msgstr "" +msgstr "估算任务的工时" #. module: project_scrum #: field:project.scrum.product.backlog,task_hours:0 msgid "Task Hours" -msgstr "" +msgstr "任务工时" #. module: project_scrum #: view:project.scrum.sprint:0 msgid "Dates" -msgstr "" +msgstr "日期" #. module: project_scrum #: view:project.scrum.sprint:0 msgid "Send to Scrum Master" -msgstr "" +msgstr "发送给Scrum主管" #. module: project_scrum #: selection:project.scrum.product.backlog,state:0 @@ -504,38 +522,40 @@ msgid "" "Hello , \n" "I am sending you Scrum Meeting : %s for the Sprint '%s' of Project '%s'" msgstr "" +"您好,\n" +"现将 %s 的早会报告('%s'项目的冲刺'%s')发给你。" #. module: project_scrum #: view:project.scrum.meeting:0 msgid "Daily" -msgstr "" +msgstr "每天" #. module: project_scrum #: field:project.scrum.sprint,backlog_ids:0 msgid "Sprint Backlog" -msgstr "" +msgstr "冲刺的需求" #. module: project_scrum #: view:project.scrum.product.backlog:0 msgid "Delegate" -msgstr "" +msgstr "委派" #. module: project_scrum #: view:board.board:0 msgid "My Board" -msgstr "" +msgstr "我的控制台" #. module: project_scrum #: view:postpone.wizard:0 msgid "Postpone Backlog" -msgstr "" +msgstr "需求延期" #. module: project_scrum #: view:board.board:0 #: model:ir.actions.act_window,name:project_scrum.action_view_task_progress_graph #: view:project.task:0 msgid "Task Progress" -msgstr "" +msgstr "任务进度" #. module: project_scrum #: field:project.scrum.meeting,date:0 @@ -554,67 +574,67 @@ msgstr "任务" #. module: project_scrum #: field:project.scrum.email,product_owner_email:0 msgid "Product Owner Email" -msgstr "" +msgstr "产品负责人邮件" #. module: project_scrum #: view:project.scrum.email:0 msgid "_Send" -msgstr "" +msgstr "发送(_S)" #. module: project_scrum #: help:project.scrum.backlog.assign.sprint,sprint_id:0 msgid "Select Sprint to assign backlog." -msgstr "" +msgstr "选择冲刺这个需求" #. module: project_scrum #: help:project.scrum.product.backlog,progress:0 #: help:project.scrum.sprint,progress:0 msgid "Computed as: Time Spent / Total Time." -msgstr "计算:花费的时间/总时间" +msgstr "计算方式:花费时间 / 总时间" #. module: project_scrum #: view:project.scrum.meeting:0 #: view:project.scrum.sprint:0 msgid "Month" -msgstr "" +msgstr "月份" #. module: project_scrum #: field:project.scrum.meeting,question_blocks:0 msgid "Blocks encountered" -msgstr "" +msgstr "已统计的需求" #. module: project_scrum #: help:project.scrum.backlog.assign.sprint,state_open:0 msgid "Change the state of product backlogs to open if its in draft state" -msgstr "" +msgstr "将草稿状态的需求设为待实现" #. module: project_scrum #: view:project.scrum.email:0 #: field:project.scrum.email,message:0 msgid "Message" -msgstr "" +msgstr "消息" #. module: project_scrum #: field:project.scrum.email,scrum_master_email:0 msgid "Scrum Master Email" -msgstr "" +msgstr "Scrum主管邮件" #. module: project_scrum #: help:project.project,product_owner_id:0 #: help:project.scrum.sprint,product_owner_id:0 msgid "The person who is responsible for the product" -msgstr "" +msgstr "谁去负责这个产品" #. module: project_scrum #: view:project.scrum.meeting:0 #: view:project.scrum.sprint:0 msgid "Scrum Sprint" -msgstr "" +msgstr "SCRUM冲刺" #. module: project_scrum #: view:project.scrum.sprint:0 msgid "Product owner" -msgstr "" +msgstr "产品负责人" #. module: project_scrum #: view:project.scrum.sprint:0 @@ -624,7 +644,7 @@ msgstr "复审" #. module: project_scrum #: field:project.scrum.sprint,retrospective:0 msgid "Sprint Retrospective" -msgstr "Sprint回顾" +msgstr "冲刺回顾" #. module: project_scrum #: field:project.scrum.product.backlog,note:0 @@ -641,20 +661,20 @@ msgstr "草稿" #: help:project.task,product_backlog_id:0 msgid "" "Related product backlog that contains this task. Used in SCRUM methodology" -msgstr "" +msgstr "这个任务相关的产品需求。用于SCRUM方法" #. module: project_scrum #: view:project.scrum.meeting:0 #: view:project.scrum.sprint:0 msgid "What do you plan to do till the next meeting?" -msgstr "" +msgstr "今天你计划做什么" #. module: project_scrum #: model:ir.actions.act_window,name:project_scrum.action_postpone_wizard #: view:postpone.wizard:0 #: view:project.scrum.product.backlog:0 msgid "Postpone" -msgstr "" +msgstr "推迟" #. module: project_scrum #: view:project.scrum.product.backlog:0 @@ -668,17 +688,17 @@ msgstr "未决" #: view:project.scrum.meeting:0 #: view:project.scrum.sprint:0 msgid "Optional Info" -msgstr "" +msgstr "可选信息" #. module: project_scrum #: model:ir.model,name:project_scrum.model_project_scrum_backlog_create_task msgid "Create Tasks from Product Backlogs" -msgstr "" +msgstr "根据需求创建任务" #. module: project_scrum #: help:project.project,sprint_size:0 msgid "Number of days allocated for sprint" -msgstr "" +msgstr "冲刺的天数" #. module: project_scrum #: field:project.project,product_owner_id:0 @@ -689,18 +709,18 @@ msgstr "产品负责人" #. module: project_scrum #: help:project.scrum.product.backlog,sequence:0 msgid "Gives the sequence order when displaying a list of product backlog." -msgstr "" +msgstr "输入序号用于对需求列表排序" #. module: project_scrum #: model:process.node,name:project_scrum.process_node_productbacklog0 #: view:project.scrum.product.backlog:0 msgid "Product backlog" -msgstr "" +msgstr "产品需求" #. module: project_scrum #: model:ir.actions.act_window,name:project_scrum.act_scrum_sprint_2_product_backlog msgid "Backlogs" -msgstr "" +msgstr "需求" #. module: project_scrum #: code:addons/project_scrum/project_scrum.py:326 @@ -711,7 +731,7 @@ msgstr "" #. module: project_scrum #: help:project.scrum.backlog.assign.sprint,convert_to_task:0 msgid "Create Task for Product Backlog" -msgstr "" +msgstr "根据需求创建任务" #. module: project_scrum #: field:project.scrum.product.backlog,active:0 @@ -722,39 +742,39 @@ msgstr "有效" #: model:ir.actions.act_window,name:project_scrum.action_meeting_form #: model:ir.ui.menu,name:project_scrum.menu_action_meeting_form msgid "Scrum Meetings" -msgstr "" +msgstr "早会" #. module: project_scrum #: help:project.scrum.product.backlog,expected_hours:0 msgid "Estimated total time to do the Backlog" -msgstr "" +msgstr "实现需求的估算工时" #. module: project_scrum #: help:project.scrum.backlog.merge,project_id:0 msgid "Select project for the new product backlog" -msgstr "" +msgstr "选择需求所属项目" #. module: project_scrum #: view:project.scrum.backlog.merge:0 msgid "Merge" -msgstr "" +msgstr "合并" #. module: project_scrum #: model:ir.actions.act_window,name:project_scrum.action_sprint_backlog_open msgid "View sprint backlog" -msgstr "Sprint Backlog视图" +msgstr "冲刺需求的视图" #. module: project_scrum #: field:project.scrum.meeting,question_backlog:0 msgid "Backlog Accurate" -msgstr "Blacklog正确" +msgstr "需求正确" #. module: project_scrum #: model:ir.actions.act_window,name:project_scrum.action_scrum_backlog_to_task #: view:project.scrum.backlog.create.task:0 #: view:project.scrum.product.backlog:0 msgid "Convert to Task" -msgstr "" +msgstr "转为任务" #. module: project_scrum #: help:project.scrum.sprint,project_id:0 @@ -771,20 +791,20 @@ msgstr "序列" #. module: project_scrum #: view:project.scrum.sprint:0 msgid "Send to Product Owner" -msgstr "" +msgstr "发送给产品负责人" #. module: project_scrum #: view:board.board:0 #: model:ir.actions.act_window,name:project_scrum.action_view_backlog_progress_graph #: view:project.scrum.product.backlog:0 msgid "Backlog Progress" -msgstr "" +msgstr "需求进展" #. module: project_scrum #: code:addons/project_scrum/project_scrum.py:301 #, python-format msgid "Email notification could not be sent to the scrum master %s" -msgstr "" +msgstr "提醒邮件无法发送给Scrum主管 %s" #. module: project_scrum #: view:project.scrum.product.backlog:0 @@ -804,7 +824,7 @@ msgstr "取消" #: view:project.scrum.product.backlog:0 #: view:project.scrum.sprint:0 msgid "Close" -msgstr "" +msgstr "结束" #. module: project_scrum #: view:project.scrum.product.backlog:0 @@ -833,7 +853,7 @@ msgstr "剩余时间" #. module: project_scrum #: view:project.scrum.sprint:0 msgid "Responsible" -msgstr "" +msgstr "负责人" #. module: project_scrum #: field:project.scrum.product.backlog,name:0 @@ -846,17 +866,17 @@ msgstr "特征" #: view:project.scrum.sprint:0 #: view:project.task:0 msgid "Current" -msgstr "" +msgstr "当前的" #. module: project_scrum #: view:project.scrum.product.backlog:0 msgid "My Backlogs" -msgstr "" +msgstr "我的需求列表" #. module: project_scrum #: view:project.scrum.email:0 msgid "Send Email for Scrum Meeting Details" -msgstr "" +msgstr "发送早会的信息" #. module: project_scrum #: model:ir.actions.act_window,help:project_scrum.action_product_backlog_form @@ -866,11 +886,13 @@ msgid "" "can be planified in a development sprint and may be split into several " "tasks. The product backlog is managed by the product owner of the project." msgstr "" +"SCRUM敏捷开发方法用于软件开发项目。产品需求是一个要实现的功能列表。一个需求会被划分给某个冲刺来实现,可能会被分成多个任务。需求列表由项目中的产品负责" +"人统一维护。" #. module: project_scrum #: model:process.transition,name:project_scrum.process_transition_backlogtask0 msgid "Backlog Task" -msgstr "Backlog任务" +msgstr "需求任务" #. module: project_scrum #: view:project.scrum.product.backlog:0 @@ -885,13 +907,13 @@ msgstr "计划时间" #: view:project.scrum.meeting:0 #: view:project.scrum.sprint:0 msgid "Scrum Meeting" -msgstr "Scrum会议" +msgstr "早会" #. module: project_scrum #: model:ir.actions.report.xml,name:project_scrum.report_scrum_sprint_burndown_chart #: view:project.scrum.sprint:0 msgid "Burndown Chart" -msgstr "" +msgstr "燃尽图" #. module: project_scrum #: view:project.scrum.sprint:0 @@ -901,17 +923,17 @@ msgstr "每日会议" #. module: project_scrum #: view:project.scrum.sprint:0 msgid "Expected hours" -msgstr "" +msgstr "预计工时" #. module: project_scrum #: field:project.project,sprint_size:0 msgid "Sprint Days" -msgstr "" +msgstr "冲刺天数" #. module: project_scrum #: help:project.scrum.email,product_owner_email:0 msgid "Email Id of Product Owner" -msgstr "" +msgstr "产品负责人的邮件地址" #. module: project_scrum #: field:project.scrum.sprint,progress:0 @@ -926,6 +948,9 @@ msgid "" " \n" "I am sending you Daily Meeting Details of date %s for the Sprint %s\n" msgstr "" +"您好 %s\n" +"\n" +"我发给您 %s 每天会议的详情对冲刺 %s\n" #. module: project_scrum #: code:addons/project_scrum/project_scrum.py:325 @@ -940,18 +965,26 @@ msgid "" "*Blocks encountered:\n" "_______________________ %s" msgstr "" +"\n" +"*任务从昨天:\n" +"_______________________%s\n" +"*任务到今天:\n" +"_______________________ %s\n" +"\n" +"*遇到的困难:\n" +"_______________________ %s" #. module: project_scrum #: help:project.scrum.product.backlog,active:0 msgid "" "If Active field is set to true, it will allow you to hide the product " "backlog without removing it." -msgstr "" +msgstr "如果启用的勾去掉,可以不需要删除就隐藏需求" #. module: project_scrum #: help:project.scrum.product.backlog,task_hours:0 msgid "Estimated time of the total hours of the tasks" -msgstr "" +msgstr "估算任务工时" #. module: project_scrum #: view:project.project:0 @@ -961,12 +994,12 @@ msgstr "Scrum数据" #. module: project_scrum #: field:project.project,scrum:0 msgid "Is a Scrum Project" -msgstr "" +msgstr "该项目使用SCRUM方法管理" #. module: project_scrum #: view:project.scrum.product.backlog:0 msgid "Edit" -msgstr "" +msgstr "编辑" #. module: project_scrum #: field:project.scrum.product.backlog,tasks_id:0 @@ -976,86 +1009,86 @@ msgstr "任务详情" #. module: project_scrum #: model:ir.model,name:project_scrum.model_postpone_wizard msgid "postpone.wizard" -msgstr "" +msgstr "postpone.wizard" #. module: project_scrum #: view:project.scrum.product.backlog:0 msgid "Total Planned Hours" -msgstr "" +msgstr "计划时间合计" #. module: project_scrum #: view:project.scrum.backlog.merge:0 msgid "" "This wizard merge backlogs and create one new backlog with draft state (Old " "backlogs Will be deleted). And it also merge old tasks from backlogs" -msgstr "" +msgstr "本向导合并所选需求并创建一个草稿状态的需求(旧需求将被删除)。旧需求相关的任务也会合并。" #. module: project_scrum #: code:addons/project_scrum/project_scrum.py:303 #, python-format msgid "Please provide email address for scrum master defined on sprint." -msgstr "" +msgstr "请输入该冲刺的Scrum主管邮件地址" #. module: project_scrum #: view:project.scrum.backlog.merge:0 msgid "Select the project for merged backlogs" -msgstr "" +msgstr "选择合并后的需求所属的项目" #. module: project_scrum #: view:board.board:0 #: model:ir.actions.act_window,name:project_scrum.action_view_my_scrum_sprint_tree msgid "My Sprint" -msgstr "" +msgstr "我的冲刺" #. module: project_scrum #: field:project.scrum.product.backlog,effective_hours:0 msgid "Spent Hours" -msgstr "" +msgstr "花费时间" #. module: project_scrum #: help:project.scrum.product.backlog,effective_hours:0 msgid "Computed using the sum of the time spent on every related tasks" -msgstr "" +msgstr "是需求相关的任务工时的合计" #. module: project_scrum #: model:ir.actions.act_window,name:project_scrum.open_board_project_scrum #: model:ir.ui.menu,name:project_scrum.menu_deshboard_scurm msgid "Scrum Dashboard" -msgstr "" +msgstr "SCRUM控制台" #. module: project_scrum #: model:ir.model,name:project_scrum.model_project_scrum_sprint msgid "Project Scrum Sprint" -msgstr "" +msgstr "项目SCRUM冲刺" #. module: project_scrum #: view:project.scrum.product.backlog:0 msgid "Feature Description" -msgstr "" +msgstr "功能描述" #. module: project_scrum #: code:addons/project_scrum/wizard/project_scrum_backlog_merger.py:71 #, python-format msgid "Please select any Project." -msgstr "" +msgstr "请选择一个项目" #. module: project_scrum #: code:addons/project_scrum/wizard/project_scrum_email.py:97 #, python-format msgid "Thank you," -msgstr "" +msgstr "感谢您," #. module: project_scrum #: code:addons/project_scrum/project_scrum.py:90 #, python-format msgid "The sprint '%s' has been closed." -msgstr "" +msgstr "冲刺 '%s' 已结束" #. module: project_scrum #: model:ir.actions.act_window,name:project_scrum.action_scrum_backlog_to_sprint #: view:project.scrum.backlog.assign.sprint:0 msgid "Assign Sprint" -msgstr "" +msgstr "分配冲刺" #. module: project_scrum #: field:project.scrum.backlog.create.task,user_id:0 @@ -1065,7 +1098,7 @@ msgstr "分配给" #. module: project_scrum #: view:postpone.wizard:0 msgid "Are you sure to postpone Backlog ?" -msgstr "" +msgstr "确实要推迟需求" #. module: project_scrum #: field:project.scrum.backlog.assign.sprint,sprint_id:0 @@ -1076,18 +1109,18 @@ msgstr "" #: view:project.task:0 #: field:project.task,sprint_id:0 msgid "Sprint" -msgstr "" +msgstr "冲刺" #. module: project_scrum #: code:addons/project_scrum/wizard/project_scrum_backlog_merger.py:39 #, python-format msgid "Please select at least two product Backlogs" -msgstr "" +msgstr "请至少选择两个需求" #. module: project_scrum #: field:project.scrum.sprint,review:0 msgid "Sprint Review" -msgstr "Sprint复审" +msgstr "冲刺复审" #~ msgid "All Tasks" #~ msgstr "所有任务" diff --git a/addons/resource/i18n/es_EC.po b/addons/resource/i18n/es_EC.po new file mode 100644 index 00000000000..372eb597b47 --- /dev/null +++ b/addons/resource/i18n/es_EC.po @@ -0,0 +1,359 @@ +# Spanish (Ecuador) translation for openobject-addons +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:16+0000\n" +"PO-Revision-Date: 2011-08-16 03:52+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Spanish (Ecuador) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-08-16 04:34+0000\n" +"X-Generator: Launchpad (build 13687)\n" + +#. module: resource +#: help:resource.calendar.leaves,resource_id:0 +msgid "" +"If empty, this is a generic holiday for the company. If a resource is set, " +"the holiday/leave is only for this resource" +msgstr "" +"Si está vacío, es un día festivo para toda la compañía. Si hay un recurso " +"seleccionado, el festivo/ausencia es solo para ese recurso." + +#. module: resource +#: selection:resource.calendar.attendance,dayofweek:0 +msgid "Friday" +msgstr "Viernes" + +#. module: resource +#: field:resource.resource,resource_type:0 +msgid "Resource Type" +msgstr "Tipo de Recurso" + +#. module: resource +#: model:ir.model,name:resource.model_resource_calendar_leaves +#: view:resource.calendar.leaves:0 +msgid "Leave Detail" +msgstr "Detalle ausencia" + +#. module: resource +#: model:ir.actions.act_window,name:resource.resource_calendar_resources_leaves +msgid "Resources Leaves" +msgstr "Ausencias de recursos" + +#. module: resource +#: model:ir.actions.act_window,name:resource.action_resource_calendar_form +#: view:resource.calendar:0 +#: field:resource.calendar,attendance_ids:0 +#: view:resource.calendar.attendance:0 +msgid "Working Time" +msgstr "Horario de trabajo" + +#. module: resource +#: selection:resource.calendar.attendance,dayofweek:0 +msgid "Thursday" +msgstr "Jueves" + +#. module: resource +#: view:resource.calendar.leaves:0 +#: view:resource.resource:0 +msgid "Group By..." +msgstr "Agrupar por..." + +#. module: resource +#: selection:resource.calendar.attendance,dayofweek:0 +msgid "Sunday" +msgstr "Domingo" + +#. module: resource +#: view:resource.resource:0 +msgid "Search Resource" +msgstr "Buscar recurso" + +#. module: resource +#: view:resource.resource:0 +msgid "Type" +msgstr "Tipo" + +#. module: resource +#: model:ir.actions.act_window,name:resource.action_resource_resource_tree +#: view:resource.resource:0 +msgid "Resources" +msgstr "Recursos" + +#. module: resource +#: field:resource.calendar,manager:0 +msgid "Workgroup manager" +msgstr "Responsable del grupo de trabajo" + +#. module: resource +#: help:resource.calendar.attendance,hour_from:0 +msgid "Working time will start from" +msgstr "El horario de trabajo empezará desde" + +#. module: resource +#: constraint:resource.calendar.leaves:0 +msgid "Error! leave start-date must be lower then leave end-date." +msgstr "" +"¡Error! La fecha inicial de ausencia debe ser anterior a la fecha final de " +"ausencia." + +#. module: resource +#: model:ir.model,name:resource.model_resource_calendar +msgid "Resource Calendar" +msgstr "Calendario recurso" + +#. module: resource +#: field:resource.calendar,company_id:0 +#: view:resource.calendar.leaves:0 +#: field:resource.calendar.leaves,company_id:0 +#: view:resource.resource:0 +#: field:resource.resource,company_id:0 +msgid "Company" +msgstr "Compañía" + +#. module: resource +#: selection:resource.resource,resource_type:0 +msgid "Material" +msgstr "Maquinaria" + +#. module: resource +#: field:resource.calendar.attendance,dayofweek:0 +msgid "Day of week" +msgstr "Día de la semana" + +#. module: resource +#: help:resource.calendar.attendance,hour_to:0 +msgid "Working time will end at" +msgstr "El horario de trabajo terminará a" + +#. module: resource +#: field:resource.calendar.attendance,date_from:0 +msgid "Starting date" +msgstr "Fecha de inicio" + +#. module: resource +#: view:resource.calendar:0 +msgid "Search Working Time" +msgstr "Buscar horario de trabajo" + +#. module: resource +#: view:resource.calendar.leaves:0 +msgid "Reason" +msgstr "Motivo" + +#. module: resource +#: view:resource.resource:0 +#: field:resource.resource,user_id:0 +msgid "User" +msgstr "Usuario" + +#. module: resource +#: view:resource.calendar.leaves:0 +msgid "Date" +msgstr "Fecha" + +#. module: resource +#: view:resource.calendar.leaves:0 +msgid "Search Working Period Leaves" +msgstr "Buscar ausencias en periodos de trabajo" + +#. module: resource +#: field:resource.calendar.leaves,date_to:0 +msgid "End Date" +msgstr "Fecha Final" + +#. module: resource +#: model:ir.actions.act_window,name:resource.resource_calendar_closing_days +msgid "Closing Days" +msgstr "Días cerrados" + +#. module: resource +#: model:ir.module.module,shortdesc:resource.module_meta_information +#: model:ir.ui.menu,name:resource.menu_resource_config +#: view:resource.calendar.leaves:0 +#: field:resource.calendar.leaves,resource_id:0 +#: view:resource.resource:0 +msgid "Resource" +msgstr "Recurso" + +#. module: resource +#: view:resource.calendar:0 +#: field:resource.calendar,name:0 +#: field:resource.calendar.attendance,name:0 +#: field:resource.calendar.leaves,name:0 +#: field:resource.resource,name:0 +msgid "Name" +msgstr "Nombre" + +#. module: resource +#: model:ir.module.module,description:resource.module_meta_information +msgid "" +"\n" +" Module for resource management\n" +" A resource represent something that can be scheduled\n" +" (a developer on a task or a workcenter on manufacturing orders).\n" +" This module manages a resource calendar associated to every resource.\n" +" It also manages the leaves of every resource.\n" +"\n" +" " +msgstr "" + +#. module: resource +#: selection:resource.calendar.attendance,dayofweek:0 +msgid "Wednesday" +msgstr "Miércoles" + +#. module: resource +#: view:resource.calendar.leaves:0 +#: view:resource.resource:0 +#: field:resource.resource,calendar_id:0 +msgid "Working Period" +msgstr "Período de trabajo" + +#. module: resource +#: model:ir.model,name:resource.model_resource_resource +msgid "Resource Detail" +msgstr "Detalle de recurso" + +#. module: resource +#: field:resource.resource,active:0 +msgid "Active" +msgstr "Activo" + +#. module: resource +#: help:resource.resource,active:0 +msgid "" +"If the active field is set to False, it will allow you to hide the resource " +"record without removing it." +msgstr "" +"Si el campo activo se desmarca, permite ocultar el registro del recurso sin " +"eliminarlo." + +#. module: resource +#: field:resource.calendar.attendance,calendar_id:0 +msgid "Resource's Calendar" +msgstr "Calendario del recurso" + +#. module: resource +#: help:resource.resource,user_id:0 +msgid "Related user name for the resource to manage its access." +msgstr "Usuario relacionado con el recurso para gestionar su acceso." + +#. module: resource +#: help:resource.resource,calendar_id:0 +msgid "Define the schedule of resource" +msgstr "Define el horario del recurso." + +#. module: resource +#: field:resource.calendar.attendance,hour_from:0 +msgid "Work from" +msgstr "Trabajar desde" + +#. module: resource +#: field:resource.resource,code:0 +msgid "Code" +msgstr "Código" + +#. module: resource +#: selection:resource.calendar.attendance,dayofweek:0 +msgid "Monday" +msgstr "Lunes" + +#. module: resource +#: field:resource.calendar.attendance,hour_to:0 +msgid "Work to" +msgstr "Trabajar hasta" + +#. module: resource +#: help:resource.resource,time_efficiency:0 +msgid "" +"This field depict the efficiency of the resource to complete tasks. e.g " +"resource put alone on a phase of 5 days with 5 tasks assigned to him, will " +"show a load of 100% for this phase by default, but if we put a efficency of " +"200%, then his load will only be 50%." +msgstr "" +"Este campo indica la eficiencia del recurso para completar tareas. Por " +"ejemplo un recurso único en una fase de 5 días con 5 tareas asignadas a él, " +"indicará una carga del 100% para esta fase por defecto, pero si ponemos una " +"eficiencia de 200%, su carga será únicamente del 50%." + +#. module: resource +#: selection:resource.calendar.attendance,dayofweek:0 +msgid "Tuesday" +msgstr "Martes" + +#. module: resource +#: field:resource.calendar.leaves,calendar_id:0 +msgid "Working time" +msgstr "Tiempo de trabajo" + +#. module: resource +#: model:ir.actions.act_window,name:resource.action_resource_calendar_leave_tree +#: model:ir.ui.menu,name:resource.menu_view_resource_calendar_leaves_search +msgid "Resource Leaves" +msgstr "Ausencias de recursos" + +#. module: resource +#: view:resource.resource:0 +msgid "General Information" +msgstr "Información general" + +#. module: resource +#: model:ir.actions.act_window,help:resource.action_resource_resource_tree +msgid "" +"Resources allow you to create and manage resources that should be involved " +"in a specific project phase. You can also set their efficiency level and " +"workload based on their weekly working hours." +msgstr "" +"Los recursos le permiten crear y gestionar los recursos que deben participar " +"en una cierta fase de un proyecto. También puede definir su nivel de " +"eficiencia y carga de trabajo en base a sus horas de trabajo semanales." + +#. module: resource +#: view:resource.resource:0 +msgid "Inactive" +msgstr "Inactivo" + +#. module: resource +#: code:addons/resource/faces/resource.py:340 +#, python-format +msgid "(vacation)" +msgstr "(ausencia)" + +#. module: resource +#: field:resource.resource,time_efficiency:0 +msgid "Efficiency factor" +msgstr "Factor de eficiciencia" + +#. module: resource +#: selection:resource.resource,resource_type:0 +msgid "Human" +msgstr "Humano" + +#. module: resource +#: model:ir.model,name:resource.model_resource_calendar_attendance +msgid "Work Detail" +msgstr "Detalle del trabajo" + +#. module: resource +#: field:resource.calendar.leaves,date_from:0 +msgid "Start Date" +msgstr "Fecha Inicio" + +#. module: resource +#: code:addons/resource/resource.py:246 +#, python-format +msgid " (copy)" +msgstr " (copia)" + +#. module: resource +#: selection:resource.calendar.attendance,dayofweek:0 +msgid "Saturday" +msgstr "Sábado" From 6301669581dceedd84683d51c361a5dba785e3a8 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 16 Aug 2011 09:54:05 +0200 Subject: [PATCH 13/68] [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 14/68] [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 15/68] [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 16/68] [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 17/68] [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 18/68] [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 19/68] [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 20/68] [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 21/68] [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 49/68] [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 50/68] [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 51/68] [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 52/68] [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 53/68] [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 - - -