diff --git a/debian/po/bg.po b/debian/po/bg.po
index 2be9fbfc542..c4a52d31048 100644
--- a/debian/po/bg.po
+++ b/debian/po/bg.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/ca.po b/debian/po/ca.po
index dab45f35285..d83dad535b9 100644
--- a/debian/po/ca.po
+++ b/debian/po/ca.po
@@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/cs.po b/debian/po/cs.po
index 7070c39bfe7..8b8f9f0e943 100644
--- a/debian/po/cs.po
+++ b/debian/po/cs.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/da.po b/debian/po/da.po
index 92a196aed27..b656e329af0 100644
--- a/debian/po/da.po
+++ b/debian/po/da.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/de.po b/debian/po/de.po
index f7ef796dcdf..3079de41243 100644
--- a/debian/po/de.po
+++ b/debian/po/de.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/el.po b/debian/po/el.po
index 25a5a61e586..a95226b6bb1 100644
--- a/debian/po/el.po
+++ b/debian/po/el.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/en_GB.po b/debian/po/en_GB.po
index 820b8efd210..4188564ceb0 100644
--- a/debian/po/en_GB.po
+++ b/debian/po/en_GB.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:46+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/es.po b/debian/po/es.po
index ef08984f483..5025a67b192 100644
--- a/debian/po/es.po
+++ b/debian/po/es.po
@@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:46+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/es_CL.po b/debian/po/es_CL.po
index 07c0546022a..454fa9705eb 100644
--- a/debian/po/es_CL.po
+++ b/debian/po/es_CL.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:46+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/es_EC.po b/debian/po/es_EC.po
index 73646c98738..4e221ba2c73 100644
--- a/debian/po/es_EC.po
+++ b/debian/po/es_EC.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:46+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/fa.po b/debian/po/fa.po
index aa3ff2f702b..74c7d386521 100644
--- a/debian/po/fa.po
+++ b/debian/po/fa.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/fi.po b/debian/po/fi.po
index 9d31f4cfd5e..4af4f533ddf 100644
--- a/debian/po/fi.po
+++ b/debian/po/fi.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/fr.po b/debian/po/fr.po
index 7aa771f0e29..50f4bd33d56 100644
--- a/debian/po/fr.po
+++ b/debian/po/fr.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/gl.po b/debian/po/gl.po
index cad0d0e92fd..7b091419269 100644
--- a/debian/po/gl.po
+++ b/debian/po/gl.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/he.po b/debian/po/he.po
index 728398ce562..935838ebb97 100644
--- a/debian/po/he.po
+++ b/debian/po/he.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/hr.po b/debian/po/hr.po
index b6b71dd6cba..83457705987 100644
--- a/debian/po/hr.po
+++ b/debian/po/hr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/hu.po b/debian/po/hu.po
index 785983233f9..9455447a512 100644
--- a/debian/po/hu.po
+++ b/debian/po/hu.po
@@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/it.po b/debian/po/it.po
index 714ecce6204..e4e70cddcc7 100644
--- a/debian/po/it.po
+++ b/debian/po/it.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/ja.po b/debian/po/ja.po
index 496d03ddf78..b060104d807 100644
--- a/debian/po/ja.po
+++ b/debian/po/ja.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/ko.po b/debian/po/ko.po
index 79dca04c8f6..a080f159ee6 100644
--- a/debian/po/ko.po
+++ b/debian/po/ko.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/lv.po b/debian/po/lv.po
index b73c15f4795..2470ad8d487 100644
--- a/debian/po/lv.po
+++ b/debian/po/lv.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/mn.po b/debian/po/mn.po
index d60234e3aad..eee8600609c 100644
--- a/debian/po/mn.po
+++ b/debian/po/mn.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/nb.po b/debian/po/nb.po
index 3a54327e6ee..488baaf8e03 100644
--- a/debian/po/nb.po
+++ b/debian/po/nb.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/nl.po b/debian/po/nl.po
index d4924a2d4c9..3b9fc417eba 100644
--- a/debian/po/nl.po
+++ b/debian/po/nl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/pl.po b/debian/po/pl.po
index 8cd337f61ba..6d9211b41a5 100644
--- a/debian/po/pl.po
+++ b/debian/po/pl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/pt.po b/debian/po/pt.po
index 134470a3eee..e055d3f059f 100644
--- a/debian/po/pt.po
+++ b/debian/po/pt.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/pt_BR.po b/debian/po/pt_BR.po
index febc67232d9..941b61931d1 100644
--- a/debian/po/pt_BR.po
+++ b/debian/po/pt_BR.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:46+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/ro.po b/debian/po/ro.po
index dbcc00c2216..da6babe8c10 100644
--- a/debian/po/ro.po
+++ b/debian/po/ro.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/ru.po b/debian/po/ru.po
index 70b4f1c3be5..61b4a0b0858 100644
--- a/debian/po/ru.po
+++ b/debian/po/ru.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/sk.po b/debian/po/sk.po
index 40d45226d03..1702240e85a 100644
--- a/debian/po/sk.po
+++ b/debian/po/sk.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:46+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/sq.po b/debian/po/sq.po
index 792cad95ae0..c828018e1db 100644
--- a/debian/po/sq.po
+++ b/debian/po/sq.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/sr.po b/debian/po/sr.po
index c8eb8efe5e5..4936cbe6d62 100644
--- a/debian/po/sr.po
+++ b/debian/po/sr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/sv.po b/debian/po/sv.po
index ff359bbc4c3..11787106bc3 100644
--- a/debian/po/sv.po
+++ b/debian/po/sv.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:46+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
"X-Poedit-Language: Swedish\n"
#. Type: string
diff --git a/debian/po/tr.po b/debian/po/tr.po
index 009c827456a..d2c89ae20f7 100644
--- a/debian/po/tr.po
+++ b/debian/po/tr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:46+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/uk.po b/debian/po/uk.po
index de7020b8ee9..22b0fc04789 100644
--- a/debian/po/uk.po
+++ b/debian/po/uk.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:46+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/vi.po b/debian/po/vi.po
index f6e921793d8..4cc7447aafc 100644
--- a/debian/po/vi.po
+++ b/debian/po/vi.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:46+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/zh_CN.po b/debian/po/zh_CN.po
index 50c59ed2f03..6a16c115e3d 100644
--- a/debian/po/zh_CN.po
+++ b/debian/po/zh_CN.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:46+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. Type: string
#. Description
diff --git a/debian/po/zh_TW.po b/debian/po/zh_TW.po
index dc03e7a9d2c..17230e8c04d 100644
--- a/debian/po/zh_TW.po
+++ b/debian/po/zh_TW.po
@@ -12,8 +12,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:46+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
"X-Poedit-Country: TAIWAN\n"
"X-Poedit-Language: Chinese\n"
"X-Poedit-SourceCharset: utf-8\n"
diff --git a/openerp-server b/openerp-server
index 00da3ac640a..2698307ff42 100755
--- a/openerp-server
+++ b/openerp-server
@@ -30,9 +30,6 @@ GNU Public Licence.
(c) 2003-TODAY, Fabien Pinckaers - OpenERP s.a.
"""
-#----------------------------------------------------------
-# python imports
-#----------------------------------------------------------
import logging
import os
import signal
@@ -45,139 +42,140 @@ import openerp
__author__ = openerp.release.author
__version__ = openerp.release.version
-if os.name == 'posix':
- import pwd
- # We DON't log this using the standard logger, because we might mess
- # with the logfile's permissions. Just do a quick exit here.
- if pwd.getpwuid(os.getuid())[0] == 'root' :
- sys.stderr.write("Attempted to run OpenERP server as root. This is not good, aborting.\n")
+def check_root_user():
+ """ Exit if the process's user is 'root' (on POSIX system)."""
+ if os.name == 'posix':
+ import pwd
+ if pwd.getpwuid(os.getuid())[0] == 'root' :
+ sys.stderr.write("Running as user 'root' is a security risk, aborting.\n")
+ sys.exit(1)
+
+def check_postgres_user():
+ """ Exit if the configured database user is 'postgres'.
+
+ This function assumes the configuration has been initialized.
+ """
+ config = openerp.tools.config
+ if config['db_user'] == 'postgres':
+ sys.stderr.write("Using the database user 'postgres' is a security risk, aborting.")
sys.exit(1)
-#-----------------------------------------------------------------------
-# parse the command line
-#-----------------------------------------------------------------------
-openerp.tools.config.parse_config(sys.argv[1:])
-config = openerp.tools.config
+def report_configuration():
+ """ Log the server version and some configuration values.
-#----------------------------------------------------------
-# get logger
-#----------------------------------------------------------
-openerp.netsvc.init_logger()
-logger = logging.getLogger('server')
+ This function assumes the configuration has been initialized.
+ """
+ config = openerp.tools.config
+ logger = logging.getLogger('server')
+ logger.info("OpenERP version %s", __version__)
+ for name, value in [('addons paths', config['addons_path']),
+ ('database hostname', config['db_host'] or 'localhost'),
+ ('database port', config['db_port'] or '5432'),
+ ('database user', config['db_user'])]:
+ logger.info("%s: %s", name, value)
-logger.info("OpenERP version - %s", __version__)
-for name, value in [('addons_path', config['addons_path']),
- ('database hostname', config['db_host'] or 'localhost'),
- ('database port', config['db_port'] or '5432'),
- ('database user', config['db_user'])]:
- logger.info("%s - %s", name, value)
+def setup_pid_file():
+ """ Create a file with the process id written in it.
-# Don't allow if the connection to PostgreSQL done by postgres user
-if config['db_user'] == 'postgres':
- logger.error("Connecting to the database as 'postgres' user is forbidden, as it present major security issues. Shutting down.")
- sys.exit(1)
+ This function assumes the configuration has been initialized.
+ """
+ config = openerp.tools.config
+ if config['pidfile']:
+ fd = open(config['pidfile'], 'w')
+ pidtext = "%d" % (os.getpid())
+ fd.write(pidtext)
+ fd.close()
-#----------------------------------------------------------
-# init net service
-#----------------------------------------------------------
-logger.info('initialising distributed objects services')
+def preload_registry(dbname):
+ """ Preload a registry, and start the cron."""
+ db, pool = openerp.pooler.get_db_and_pool(dbname, update_module=config['init'] or config['update'], pooljobs=False)
+ pool.get('ir.cron').restart(db.dbname)
-#----------------------------------------------------------
-# Load and update databases if requested
-#----------------------------------------------------------
+def run_test_file(dbname, test_file):
+ """ Preload a registry, possibly run a test file, and start the cron."""
+ db, pool = openerp.pooler.get_db_and_pool(dbname, update_module=config['init'] or config['update'], pooljobs=False)
-if not ( config["stop_after_init"] or \
- config["translate_in"] or \
- config["translate_out"] ):
- openerp.osv.osv.start_object_proxy()
- openerp.service.web_services.start_web_services()
+ cr = db.cursor()
+ logger = logging.getLogger('server')
+ logger.info('loading test file %s', test_file)
+ openerp.tools.convert_yaml_import(cr, 'base', file(test_file), {}, 'test', True)
+ cr.rollback()
+ cr.close()
+
+def export_translation():
+ config = openerp.tools.config
+ dbname = config['db_name']
+ logger = logging.getLogger('server')
+
+ if config["language"]:
+ msg = "language %s" % (config["language"],)
+ else:
+ msg = "new language"
+ logger.info('writing translation file for %s to %s', msg,
+ config["translate_out"])
+
+ fileformat = os.path.splitext(config["translate_out"])[-1][1:].lower()
+ buf = file(config["translate_out"], "w")
+ cr = openerp.pooler.get_db(dbname).cursor()
+ openerp.tools.trans_export(config["language"],
+ config["translate_modules"] or ["all"], buf, fileformat, cr)
+ cr.close()
+ buf.close()
+
+ logger.info('translation file written successfully')
+
+def import_translation():
+ config = openerp.tools.config
+ context = {'overwrite': config["overwrite_existing_translations"]}
+ dbname = config['db_name']
+
+ cr = openerp.pooler.get_db(dbname).cursor()
+ openerp.tools.trans_load( cr, config["translate_in"], config["language"],
+ context=context)
+ openerp.tools.trans_update_res_ids(cr)
+ cr.commit()
+ cr.close()
+
+def start_services():
http_server = openerp.service.http_server
netrpc_server = openerp.service.netrpc_server
+
+ # Instantiate local services (this is a legacy design).
+ openerp.osv.osv.start_object_proxy()
+ # Export (for RPC) services.
+ openerp.service.web_services.start_web_services()
+
+ # Initialize the HTTP stack.
http_server.init_servers()
http_server.init_xmlrpc()
http_server.init_static_http()
netrpc_server.init_servers()
-if config['db_name']:
- for dbname in config['db_name'].split(','):
- db, pool = openerp.pooler.get_db_and_pool(dbname, update_module=config['init'] or config['update'], pooljobs=False)
- cr = db.cursor()
+ # Start the main cron thread.
+ openerp.netsvc.start_agent()
- if config["test_file"]:
- logger.info('loading test file %s', config["test_file"])
- openerp.tools.convert_yaml_import(cr, 'base', file(config["test_file"]), {}, 'test', True)
- cr.rollback()
-
- pool.get('ir.cron').restart(db.dbname)
-
- cr.close()
-
-#----------------------------------------------------------
-# translation stuff
-#----------------------------------------------------------
-if config["translate_out"]:
- if config["language"]:
- msg = "language %s" % (config["language"],)
- else:
- msg = "new language"
- logger.info('writing translation file for %s to %s', msg, config["translate_out"])
-
- fileformat = os.path.splitext(config["translate_out"])[-1][1:].lower()
- buf = file(config["translate_out"], "w")
- dbname = config['db_name']
- cr = openerp.pooler.get_db(dbname).cursor()
- openerp.tools.trans_export(config["language"], config["translate_modules"] or ["all"], buf, fileformat, cr)
- cr.close()
- buf.close()
-
- logger.info('translation file written successfully')
- sys.exit(0)
-
-if config["translate_in"]:
- context = {'overwrite': config["overwrite_existing_translations"]}
- dbname = config['db_name']
- cr = openerp.pooler.get_db(dbname).cursor()
- openerp.tools.trans_load(cr,
- config["translate_in"],
- config["language"],
- context=context)
- openerp.tools.trans_update_res_ids(cr)
- cr.commit()
- cr.close()
- sys.exit(0)
-
-#----------------------------------------------------------------------------------
-# if we don't want the server to continue to run after initialization, we quit here
-#----------------------------------------------------------------------------------
-if config["stop_after_init"]:
- sys.exit(0)
-
-openerp.netsvc.start_agent()
-
-#----------------------------------------------------------
-# Launch Servers
-#----------------------------------------------------------
-
-LST_SIGNALS = ['SIGINT', 'SIGTERM']
-
-SIGNALS = dict(
- [(getattr(signal, sign), sign) for sign in LST_SIGNALS]
-)
+ # Start the top-level servers threads (normally HTTP, HTTPS, and NETRPC).
+ openerp.netsvc.Server.startAll()
+# Variable keeping track of the number of calls to the signal handler defined
+# below. This variable is monitored by ``quit_on_signals()``.
quit_signals_received = 0
-def handler(signum, frame):
- """
- :param signum: the signal number
+def signal_handler(sig, frame):
+ """ Signal handler: exit ungracefully on the second handled signal.
+
+ :param sig: the signal number
:param frame: the interrupted stack frame or None
"""
global quit_signals_received
quit_signals_received += 1
if quit_signals_received > 1:
+ # logging.shutdown was already called at this point.
sys.stderr.write("Forced shutdown.\n")
os._exit(0)
-def dumpstacks(signum, frame):
+def dumpstacks(sig, frame):
+ """ Signal handler: dump a stack trace for each existing thread."""
# code from http://stackoverflow.com/questions/132058/getting-stack-trace-from-a-running-python-application#answer-2569696
# modified for python 2.5 compatibility
thread_map = dict(threading._active, **threading._limbo)
@@ -191,20 +189,33 @@ def dumpstacks(signum, frame):
code.append(" %s" % (line.strip()))
logging.getLogger('dumpstacks').info("\n".join(code))
-for signum in SIGNALS:
- signal.signal(signum, handler)
+def setup_signal_handlers():
+ """ Register the signal handler defined above. """
+ SIGNALS = map(lambda x: getattr(signal, "SIG%s" % x), "INT TERM".split())
+ map(lambda sig: signal.signal(sig, signal_handler), SIGNALS)
+ if os.name == 'posix':
+ signal.signal(signal.SIGQUIT, dumpstacks)
-if os.name == 'posix':
- signal.signal(signal.SIGQUIT, dumpstacks)
+def quit_on_signals():
+ """ Wait for one or two signals then shutdown the server.
+
+ The first SIGINT or SIGTERM signal will initiate a graceful shutdown while
+ a second one if any will force an immediate exit.
+
+ """
+ # Wait for a first signal to be handled. (time.sleep will be interrupted
+ # by the signal handler.)
+ while quit_signals_received == 0:
+ time.sleep(60)
-def quit():
openerp.netsvc.Agent.quit()
openerp.netsvc.Server.quitAll()
+ config = openerp.tools.config
if config['pidfile']:
os.unlink(config['pidfile'])
- logger = logging.getLogger('shutdown')
- logger.info("Initiating OpenERP Server shutdown")
- logger.info("Hit CTRL-C again or send a second signal to immediately terminate the server...")
+ logger = logging.getLogger('server')
+ logger.info("Initiating shutdown")
+ logger.info("Hit CTRL-C again or send a second signal to force the sutdown.")
logging.shutdown()
# manually join() all threads before calling sys.exit() to allow a second signal
@@ -219,19 +230,40 @@ def quit():
time.sleep(0.05)
sys.exit(0)
-if config['pidfile']:
- fd = open(config['pidfile'], 'w')
- pidtext = "%d" % (os.getpid())
- fd.write(pidtext)
- fd.close()
+if __name__ == "__main__":
-openerp.netsvc.Server.startAll()
+ check_root_user()
+ openerp.tools.config.parse_config(sys.argv[1:])
+ check_postgres_user()
+ openerp.netsvc.init_logger()
+ report_configuration()
-logger.info('OpenERP server is running, waiting for connections...')
+ config = openerp.tools.config
-while quit_signals_received == 0:
- time.sleep(60)
+ if config["test_file"]:
+ run_test_file(config['db_name'], config['test_file'])
+ sys.exit(0)
-quit()
+ if config["translate_out"]:
+ export_translation()
+ sys.exit(0)
+
+ if config["translate_in"]:
+ import_translation()
+ sys.exit(0)
+
+ if config['db_name']:
+ for dbname in config['db_name'].split(','):
+ preload_registry(dbname)
+
+ if config["stop_after_init"]:
+ sys.exit(0)
+
+ setup_pid_file()
+ setup_signal_handlers()
+ start_services()
+ logger = logging.getLogger('server')
+ logger.info('OpenERP server is running, waiting for connections...')
+ quit_on_signals()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/openerp/addons/base/__openerp__.py b/openerp/addons/base/__openerp__.py
index c36dcecdf30..37f26edc177 100644
--- a/openerp/addons/base/__openerp__.py
+++ b/openerp/addons/base/__openerp__.py
@@ -59,18 +59,18 @@
'res/res_request_view.xml',
'res/res_lang_view.xml',
'res/res_log_view.xml',
- 'res/partner/partner_report.xml',
- 'res/partner/partner_view.xml',
- 'res/partner/partner_shortcut_data.xml',
- 'res/partner/bank_view.xml',
- 'res/country_view.xml',
+ 'res/res_partner_report.xml',
+ 'res/res_partner_view.xml',
+ 'res/res_partner_shortcut_data.xml',
+ 'res/res_bank_view.xml',
+ 'res/res_country_view.xml',
'res/res_currency_view.xml',
- 'res/partner/crm_view.xml',
- 'res/partner/wizard/partner_sms_send_view.xml',
- 'res/partner/wizard/partner_wizard_spam_view.xml',
- 'res/partner/wizard/partner_clear_ids_view.xml',
- 'res/partner/wizard/partner_wizard_ean_check_view.xml',
- 'res/partner/partner_data.xml',
+ 'res/res_partner_event_view.xml',
+ 'res/wizard/partner_sms_send_view.xml',
+ 'res/wizard/partner_wizard_spam_view.xml',
+ 'res/wizard/partner_clear_ids_view.xml',
+ 'res/wizard/partner_wizard_ean_check_view.xml',
+ 'res/res_partner_data.xml',
'res/ir_property_view.xml',
'security/base_security.xml',
'publisher_warranty/publisher_warranty_view.xml',
@@ -81,8 +81,7 @@
],
'demo_xml': [
'base_demo.xml',
- 'res/partner/partner_demo.xml',
- 'res/partner/crm_demo.xml',
+ 'res/res_partner_demo.xml',
'res/res_widget_demo.xml',
],
'test': [
diff --git a/openerp/addons/base/base_update.xml b/openerp/addons/base/base_update.xml
index 6f4dbf6a1f9..cef36dda8e4 100644
--- a/openerp/addons/base/base_update.xml
+++ b/openerp/addons/base/base_update.xml
@@ -224,16 +224,18 @@
-
-
-
-
-
+
+
+
+
+
+
-
+
+
@@ -242,10 +244,10 @@
-
+
-
+
diff --git a/openerp/addons/base/i18n/af.po b/openerp/addons/base/i18n/af.po
index 289eaffc77d..72547d34bc1 100644
--- a/openerp/addons/base/i18n/af.po
+++ b/openerp/addons/base/i18n/af.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:57+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:38+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/am.po b/openerp/addons/base/i18n/am.po
index c049a4d392f..7fa923c0660 100644
--- a/openerp/addons/base/i18n/am.po
+++ b/openerp/addons/base/i18n/am.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:57+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:39+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/ar.po b/openerp/addons/base/i18n/ar.po
index 01f007455ab..b50c02ca98d 100644
--- a/openerp/addons/base/i18n/ar.po
+++ b/openerp/addons/base/i18n/ar.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:57+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:39+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/bg.po b/openerp/addons/base/i18n/bg.po
index 555264c7049..02da984c8b3 100644
--- a/openerp/addons/base/i18n/bg.po
+++ b/openerp/addons/base/i18n/bg.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:58+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:39+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/bs.po b/openerp/addons/base/i18n/bs.po
index 86e4fb4de8c..80691631cf8 100644
--- a/openerp/addons/base/i18n/bs.po
+++ b/openerp/addons/base/i18n/bs.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:58+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:39+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/ca.po b/openerp/addons/base/i18n/ca.po
index 4cace5b61d9..58c927285eb 100644
--- a/openerp/addons/base/i18n/ca.po
+++ b/openerp/addons/base/i18n/ca.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:58+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:39+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/cs.po b/openerp/addons/base/i18n/cs.po
index e130defc95f..5161c860eb2 100644
--- a/openerp/addons/base/i18n/cs.po
+++ b/openerp/addons/base/i18n/cs.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:58+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:40+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
"X-Poedit-Language: Czech\n"
#. module: base
@@ -120,6 +120,8 @@ msgid ""
"You can not write in this document (%s) ! Be sure your user belongs to one "
"of these groups: %s."
msgstr ""
+"Nemůžete zapisovat do tohoto dokumentu (%s)! Ujistěte se, že váš uživatel "
+"patří do některé z těchto skupin: %s."
#. module: base
#: help:ir.model.fields,domain:0
@@ -128,6 +130,8 @@ msgid ""
"specified as a Python expression defining a list of triplets. For example: "
"[('color','=','red')]"
msgstr ""
+"Volitelná doména k omezení možných hodnot pro pole, specifikovaná jako výraz "
+"v Pythonu obsahující seznam trojic. Například: [('color','=','red')]"
#. module: base
#: field:res.partner,ref:0
@@ -152,6 +156,9 @@ msgid ""
"Properties of base fields cannot be altered in this manner! Please modify "
"them through Python code, preferably through a custom addon!"
msgstr ""
+"Vlastnosti základních polí (base fields) nemohou být takto měněny! "
+"Modifikujte je pomocí kódu v Pythonu, nejlépe prostřednictvím vlastního add-"
+"onu!"
#. module: base
#: code:addons/osv.py:133
@@ -206,7 +213,7 @@ msgstr "Struktura společnosti"
#. module: base
#: selection:base.language.install,lang:0
msgid "Inuktitut / ᐃᓄᒃᑎᑐᑦ"
-msgstr ""
+msgstr "Inuktitut / ᐃᓄᒃᑎᑐᑦ"
#. module: base
#: view:res.partner:0
@@ -395,6 +402,8 @@ msgid ""
"If you check this, then the second time the user prints with same attachment "
"name, it returns the previous report."
msgstr ""
+"Pokud toto zaškrtnute, příště když uživatel bude tisknout přílohu se stejným "
+"názvem, vrátí se mu předchozí report."
#. module: base
#: code:addons/orm.py:904
@@ -405,7 +414,7 @@ msgstr "U tohoto objektu není vytvořena čtecí metoda."
#. module: base
#: help:res.lang,iso_code:0
msgid "This ISO code is the name of po files to use for translations"
-msgstr ""
+msgstr "ISO kód je název .po souborů použitých pro překlady"
#. module: base
#: view:base.module.upgrade:0
@@ -445,6 +454,8 @@ msgid ""
"The ISO country code in two chars.\n"
"You can use this field for quick search."
msgstr ""
+"ISO kód země - dvě písmena.\n"
+"Toto pole můžete použít pro rychlé hledání."
#. module: base
#: model:res.country,name:base.pw
@@ -466,6 +477,8 @@ msgstr "Nepřeložené"
msgid ""
"Context dictionary as Python expression, empty by default (Default: {})"
msgstr ""
+"Kontextový slovník jako výraz Pythonu, výchozí hodnota je prázdný slovník "
+"(výchozí: {})"
#. module: base
#: model:ir.actions.act_window,name:base.ir_action_wizard
@@ -509,7 +522,7 @@ msgstr "Popis modelu"
#: help:ir.actions.act_window,src_model:0
msgid ""
"Optional model name of the objects on which this action should be visible"
-msgstr ""
+msgstr "Volitelné jméno modelu objektů, u kterých má tato akce být dostupná"
#. module: base
#: field:workflow.transition,trigger_expr_id:0
@@ -591,7 +604,7 @@ msgstr "Zobrazení průvodce"
#. module: base
#: model:res.country,name:base.kh
msgid "Cambodia, Kingdom of"
-msgstr ""
+msgstr "Kambodžské království"
#. module: base
#: model:ir.actions.act_window,name:base.ir_sequence_form
diff --git a/openerp/addons/base/i18n/da.po b/openerp/addons/base/i18n/da.po
index 7f1451b8a30..da07b07a1e9 100644
--- a/openerp/addons/base/i18n/da.po
+++ b/openerp/addons/base/i18n/da.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:58+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:40+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/de.po b/openerp/addons/base/i18n/de.po
index 2ddf9359e6b..4dbe8f4c0cf 100644
--- a/openerp/addons/base/i18n/de.po
+++ b/openerp/addons/base/i18n/de.po
@@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:59+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:40+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/el.po b/openerp/addons/base/i18n/el.po
index b802b8fdeb3..4bca6580496 100644
--- a/openerp/addons/base/i18n/el.po
+++ b/openerp/addons/base/i18n/el.po
@@ -12,8 +12,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:59+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:41+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
"X-Poedit-Country: GREECE\n"
"X-Poedit-Language: Greek\n"
"X-Poedit-SourceCharset: utf-8\n"
diff --git a/openerp/addons/base/i18n/en_GB.po b/openerp/addons/base/i18n/en_GB.po
index e0cdb0400eb..e9c4a7b1bc0 100644
--- a/openerp/addons/base/i18n/en_GB.po
+++ b/openerp/addons/base/i18n/en_GB.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:03+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:44+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/es.po b/openerp/addons/base/i18n/es.po
index 81cb3cada41..75c938bb99f 100644
--- a/openerp/addons/base/i18n/es.po
+++ b/openerp/addons/base/i18n/es.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:02+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:43+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/es_CL.po b/openerp/addons/base/i18n/es_CL.po
index 1571b86b51b..6a7b66979ae 100644
--- a/openerp/addons/base/i18n/es_CL.po
+++ b/openerp/addons/base/i18n/es_CL.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:03+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/es_EC.po b/openerp/addons/base/i18n/es_EC.po
index 0558be7f560..172217838e6 100644
--- a/openerp/addons/base/i18n/es_EC.po
+++ b/openerp/addons/base/i18n/es_EC.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:03+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
@@ -1238,7 +1238,7 @@ msgstr "Información asistente"
#: model:ir.actions.act_window,name:base.action_wizard_lang_export
#: model:ir.ui.menu,name:base.menu_wizard_lang_export
msgid "Export Translation"
-msgstr "Traducción de exportación"
+msgstr "Exportar Traducción"
#. module: base
#: help:res.log,secondary:0
@@ -3373,7 +3373,7 @@ msgstr "Ucraniano / українська"
#: model:ir.actions.act_window,name:base.action_translation
#: model:ir.ui.menu,name:base.menu_action_translation
msgid "Translation Terms"
-msgstr "Condiciones de Traducción"
+msgstr "Términos de Traducción"
#. module: base
#: model:res.country,name:base.sn
@@ -3728,7 +3728,7 @@ msgstr ""
#. module: base
#: model:ir.ui.menu,name:base.menu_translation_app
msgid "Application Terms"
-msgstr "Condiciones de aplicación"
+msgstr "Términos de aplicación"
#. module: base
#: help:res.config.users,context_tz:0
diff --git a/openerp/addons/base/i18n/et.po b/openerp/addons/base/i18n/et.po
index a5da2202625..6062726cdc9 100644
--- a/openerp/addons/base/i18n/et.po
+++ b/openerp/addons/base/i18n/et.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:58+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:40+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/eu.po b/openerp/addons/base/i18n/eu.po
index 0152f5da6ac..8b92327e5ac 100644
--- a/openerp/addons/base/i18n/eu.po
+++ b/openerp/addons/base/i18n/eu.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:57+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:39+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/fa.po b/openerp/addons/base/i18n/fa.po
index 8a4a248668a..584d51a545e 100644
--- a/openerp/addons/base/i18n/fa.po
+++ b/openerp/addons/base/i18n/fa.po
@@ -9,8 +9,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:00+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:42+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
"X-Poedit-Language: Persian\n"
diff --git a/openerp/addons/base/i18n/fa_AF.po b/openerp/addons/base/i18n/fa_AF.po
index da75466b958..d730070ecf9 100644
--- a/openerp/addons/base/i18n/fa_AF.po
+++ b/openerp/addons/base/i18n/fa_AF.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/fi.po b/openerp/addons/base/i18n/fi.po
index 7dcf4ab11e5..16526bf9807 100644
--- a/openerp/addons/base/i18n/fi.po
+++ b/openerp/addons/base/i18n/fi.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:58+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:40+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/fr.po b/openerp/addons/base/i18n/fr.po
index ace489f902f..6fb9188fd3c 100644
--- a/openerp/addons/base/i18n/fr.po
+++ b/openerp/addons/base/i18n/fr.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:58+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:40+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/gl.po b/openerp/addons/base/i18n/gl.po
index 6eaa9bf58a0..8547223c29c 100644
--- a/openerp/addons/base/i18n/gl.po
+++ b/openerp/addons/base/i18n/gl.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:59+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:41+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/he.po b/openerp/addons/base/i18n/he.po
index 330e9c4bba7..0e14797c6ee 100644
--- a/openerp/addons/base/i18n/he.po
+++ b/openerp/addons/base/i18n/he.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:59+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:41+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/hr.po b/openerp/addons/base/i18n/hr.po
index 62ba51b821a..e82d8fb80cc 100644
--- a/openerp/addons/base/i18n/hr.po
+++ b/openerp/addons/base/i18n/hr.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:01+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:43+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
"Language: hr\n"
#. module: base
diff --git a/openerp/addons/base/i18n/hu.po b/openerp/addons/base/i18n/hu.po
index e333b152b6c..043b188ece7 100644
--- a/openerp/addons/base/i18n/hu.po
+++ b/openerp/addons/base/i18n/hu.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:59+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:41+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/hy.po b/openerp/addons/base/i18n/hy.po
index 55a38ea1773..f47eb825bc2 100644
--- a/openerp/addons/base/i18n/hy.po
+++ b/openerp/addons/base/i18n/hy.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:57+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:39+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/id.po b/openerp/addons/base/i18n/id.po
index 4e26b857fcb..969f42eb804 100644
--- a/openerp/addons/base/i18n/id.po
+++ b/openerp/addons/base/i18n/id.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:59+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:41+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/is.po b/openerp/addons/base/i18n/is.po
index 5342263dc20..f0973c0a8e4 100644
--- a/openerp/addons/base/i18n/is.po
+++ b/openerp/addons/base/i18n/is.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:59+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:41+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/it.po b/openerp/addons/base/i18n/it.po
index 09390bcb03f..3a106c0498a 100644
--- a/openerp/addons/base/i18n/it.po
+++ b/openerp/addons/base/i18n/it.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:59+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:41+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/ja.po b/openerp/addons/base/i18n/ja.po
index 0a4cefda827..2d6310e5312 100644
--- a/openerp/addons/base/i18n/ja.po
+++ b/openerp/addons/base/i18n/ja.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:59+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:41+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/ko.po b/openerp/addons/base/i18n/ko.po
index 12287f13df9..0025fb970e6 100644
--- a/openerp/addons/base/i18n/ko.po
+++ b/openerp/addons/base/i18n/ko.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:00+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:42+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/lt.po b/openerp/addons/base/i18n/lt.po
index 7d6c264ba12..2a31023df0f 100644
--- a/openerp/addons/base/i18n/lt.po
+++ b/openerp/addons/base/i18n/lt.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:00+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:42+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/lv.po b/openerp/addons/base/i18n/lv.po
index a82c2e94ff0..cd1ef4c77fe 100644
--- a/openerp/addons/base/i18n/lv.po
+++ b/openerp/addons/base/i18n/lv.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:00+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:42+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/mk.po b/openerp/addons/base/i18n/mk.po
index 116f44fe324..bb8f47fcf7c 100644
--- a/openerp/addons/base/i18n/mk.po
+++ b/openerp/addons/base/i18n/mk.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:00+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:42+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/mn.po b/openerp/addons/base/i18n/mn.po
index a964f7951b5..12c8460790f 100644
--- a/openerp/addons/base/i18n/mn.po
+++ b/openerp/addons/base/i18n/mn.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:00+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:42+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/nb.po b/openerp/addons/base/i18n/nb.po
index 960c16efb5e..c62673f2b19 100644
--- a/openerp/addons/base/i18n/nb.po
+++ b/openerp/addons/base/i18n/nb.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:00+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:42+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
@@ -1190,7 +1190,7 @@ msgstr "Navn på stat"
#. module: base
#: selection:ir.property,type:0
msgid "Float"
-msgstr ""
+msgstr "Flyttall"
#. module: base
#: model:ir.model,name:base.model_res_request_link
@@ -1561,6 +1561,8 @@ msgid ""
"Example: GLOBAL_RULE_1 AND GLOBAL_RULE_2 AND ( (GROUP_A_RULE_1 AND "
"GROUP_A_RULE_2) OR (GROUP_B_RULE_1 AND GROUP_B_RULE_2) )"
msgstr ""
+"Eksempel: GLOBAL_RULE_1 AND GLOBAL_RULE_2 AND ( (GROUP_A_RULE_1 AND "
+"GROUP_A_RULE_2) OR (GROUP_B_RULE_1 AND GROUP_B_RULE_2) )"
#. module: base
#: model:ir.actions.act_window,help:base.action_ui_view
@@ -3155,7 +3157,7 @@ msgstr ""
#. module: base
#: view:base.module.configuration:0
msgid "System Configuration Done"
-msgstr ""
+msgstr "Systemkonfigurasjon fullført"
#. module: base
#: code:addons/orm.py:929
@@ -3631,7 +3633,7 @@ msgstr "Britisk Engelsk"
#. module: base
#: selection:base.language.install,lang:0
msgid "Japanese / 日本語"
-msgstr ""
+msgstr "Japansk / 日本語"
#. module: base
#: help:workflow.transition,act_from:0
@@ -3670,7 +3672,7 @@ msgstr ""
#. module: base
#: model:ir.model,name:base.model_publisher_warranty_contract
msgid "publisher_warranty.contract"
-msgstr ""
+msgstr "publisher_warranty.contract"
#. module: base
#: model:res.country,name:base.et
@@ -4194,7 +4196,7 @@ msgstr "United Kingdom"
#: view:res.config.users:0
#: view:res.config.view:0
msgid "res_config_contents"
-msgstr ""
+msgstr "res_config_contents"
#. module: base
#: help:res.partner.category,active:0
@@ -4378,7 +4380,7 @@ msgstr "Stat (USA)"
#. module: base
#: field:ir.actions.server,copy_object:0
msgid "Copy Of"
-msgstr ""
+msgstr "Kopi av"
#. module: base
#: field:ir.model,osv_memory:0
@@ -4487,7 +4489,7 @@ msgstr ""
#: code:addons/base/module/module.py:198
#, python-format
msgid "The name of the module must be unique !"
-msgstr ""
+msgstr "Modulnavnet må være unikt!"
#. module: base
#: model:res.country,name:base.mz
@@ -4497,7 +4499,7 @@ msgstr "Mosambik"
#. module: base
#: model:ir.ui.menu,name:base.menu_project_long_term
msgid "Long Term Planning"
-msgstr ""
+msgstr "Langtidsplanlegging"
#. module: base
#: field:ir.actions.server,message:0
@@ -4657,7 +4659,7 @@ msgstr "Spanish (MX) / Español (MX)"
#. module: base
#: view:res.log:0
msgid "My Logs"
-msgstr ""
+msgstr "Mine logger"
#. module: base
#: model:res.country,name:base.bt
@@ -4667,7 +4669,7 @@ msgstr "Bhutan"
#. module: base
#: help:ir.sequence,number_next:0
msgid "Next number of this sequence"
-msgstr ""
+msgstr "Neste nummer på denne sekvensen"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_11
@@ -4804,7 +4806,7 @@ msgstr "Myanmar"
#. module: base
#: selection:base.language.install,lang:0
msgid "Chinese (CN) / 简体中文"
-msgstr ""
+msgstr "Kinesisk (CN) / 简体中文"
#. module: base
#: field:res.bank,street:0
@@ -5304,12 +5306,12 @@ msgstr ""
#: code:addons/orm.py:158
#, python-format
msgid "Object %s does not exists"
-msgstr ""
+msgstr "Object %s finnes ikke"
#. module: base
#: selection:base.language.install,lang:0
msgid "Slovenian / slovenščina"
-msgstr ""
+msgstr "Slovensk / slovenščina"
#. module: base
#: field:ir.actions.report.xml,attachment_use:0
@@ -5565,7 +5567,7 @@ msgstr "Veiledning"
#. module: base
#: view:ir.ui.view:0
msgid "Architecture"
-msgstr ""
+msgstr "Arkitektur"
#. module: base
#: model:res.country,name:base.ml
@@ -5585,7 +5587,7 @@ msgstr ""
#. module: base
#: selection:base.language.install,lang:0
msgid "Flemish (BE) / Vlaams (BE)"
-msgstr ""
+msgstr "Flamsk (BE) / Vlaams (BE)"
#. module: base
#: field:ir.cron,interval_number:0
@@ -5650,7 +5652,7 @@ msgstr "Tilpassede snarveier"
#. module: base
#: selection:base.language.install,lang:0
msgid "Vietnamese / Tiếng Việt"
-msgstr ""
+msgstr "Vietnamesisk / Tiếng Việt"
#. module: base
#: model:res.country,name:base.dz
@@ -5665,7 +5667,7 @@ msgstr "Belgia"
#. module: base
#: model:ir.model,name:base.model_osv_memory_autovacuum
msgid "osv_memory.autovacuum"
-msgstr ""
+msgstr "osv_memory.autovacuum"
#. module: base
#: field:base.language.export,lang:0
@@ -5703,19 +5705,19 @@ msgstr "%H - Time (24-times klokke) [00,23]."
#. module: base
#: model:ir.model,name:base.model_res_widget
msgid "res.widget"
-msgstr ""
+msgstr "res.widget"
#. module: base
#: code:addons/base/ir/ir_model.py:258
#, python-format
msgid "Model %s does not exist!"
-msgstr ""
+msgstr "Model %s finnes ikke!"
#. module: base
#: code:addons/base/res/res_lang.py:159
#, python-format
msgid "You cannot delete the language which is User's Preferred Language !"
-msgstr ""
+msgstr "Du kan ikke slette et språk som benyttes av en bruker !"
#. module: base
#: code:addons/fields.py:103
@@ -6168,7 +6170,7 @@ msgstr ""
#. module: base
#: selection:base.language.install,lang:0
msgid "Chinese (TW) / 正體字"
-msgstr ""
+msgstr "Kinesisk (TW) / 正體字"
#. module: base
#: model:ir.model,name:base.model_res_request
@@ -6183,7 +6185,7 @@ msgstr ""
#. module: base
#: view:ir.actions.todo:0
msgid "Todo"
-msgstr ""
+msgstr "Gjøremål"
#. module: base
#: field:ir.attachment,datas:0
@@ -6220,7 +6222,7 @@ msgstr "Gibraltar"
#. module: base
#: field:ir.actions.report.xml,report_name:0
msgid "Service Name"
-msgstr ""
+msgstr "Tjenestenavn"
#. module: base
#: model:res.country,name:base.pn
@@ -6282,7 +6284,7 @@ msgstr ""
#. module: base
#: sql_constraint:res.lang:0
msgid "The code of the language must be unique !"
-msgstr ""
+msgstr "Språkkoden må være unik !"
#. module: base
#: model:ir.actions.act_window,name:base.action_attachment
@@ -6349,7 +6351,7 @@ msgstr "Italia"
#: view:ir.actions.todo:0
#: selection:ir.actions.todo,state:0
msgid "To Do"
-msgstr ""
+msgstr "Gjøremål"
#. module: base
#: selection:base.language.install,lang:0
@@ -6376,7 +6378,7 @@ msgstr "Python handlinger"
#. module: base
#: selection:base.language.install,lang:0
msgid "English (US)"
-msgstr ""
+msgstr "Engelsk (US)"
#. module: base
#: model:ir.actions.act_window,name:base.action_model_data
@@ -6450,7 +6452,7 @@ msgstr "Aktivitet"
#: view:res.partner:0
#: view:res.partner.address:0
msgid "Postal Address"
-msgstr ""
+msgstr "Postadresse"
#. module: base
#: field:res.company,parent_id:0
diff --git a/openerp/addons/base/i18n/nl.po b/openerp/addons/base/i18n/nl.po
index 71e0b31bba5..2bb60f29b38 100644
--- a/openerp/addons/base/i18n/nl.po
+++ b/openerp/addons/base/i18n/nl.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:58+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:40+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/nl_BE.po b/openerp/addons/base/i18n/nl_BE.po
index 03e6388d576..09b17071edd 100644
--- a/openerp/addons/base/i18n/nl_BE.po
+++ b/openerp/addons/base/i18n/nl_BE.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:03+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/pl.po b/openerp/addons/base/i18n/pl.po
index 667e3b8e3ca..9b8f0c8769c 100644
--- a/openerp/addons/base/i18n/pl.po
+++ b/openerp/addons/base/i18n/pl.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:00+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:42+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/pt.po b/openerp/addons/base/i18n/pt.po
index 20655f28be8..88b097ffe71 100644
--- a/openerp/addons/base/i18n/pt.po
+++ b/openerp/addons/base/i18n/pt.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:01+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:43+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/pt_BR.po b/openerp/addons/base/i18n/pt_BR.po
index 344b19a8157..254c642a060 100644
--- a/openerp/addons/base/i18n/pt_BR.po
+++ b/openerp/addons/base/i18n/pt_BR.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:03+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:44+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/ro.po b/openerp/addons/base/i18n/ro.po
index 46537a16e92..7f6e34b2edc 100644
--- a/openerp/addons/base/i18n/ro.po
+++ b/openerp/addons/base/i18n/ro.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:01+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:43+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/ru.po b/openerp/addons/base/i18n/ru.po
index 8ec951dbde0..48133981214 100644
--- a/openerp/addons/base/i18n/ru.po
+++ b/openerp/addons/base/i18n/ru.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:01+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:43+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
@@ -6839,7 +6839,7 @@ msgstr "Управление банковскими документами ис
#. module: base
#: view:base.module.import:0
msgid "Import module"
-msgstr "Модуль импорта"
+msgstr "Импорт модуля"
#. module: base
#: field:ir.actions.server,loop_action:0
diff --git a/openerp/addons/base/i18n/sk.po b/openerp/addons/base/i18n/sk.po
index f3a0449504e..df5f44b9ef4 100644
--- a/openerp/addons/base/i18n/sk.po
+++ b/openerp/addons/base/i18n/sk.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:02+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:43+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/sl.po b/openerp/addons/base/i18n/sl.po
index 31737932ade..fc0c7518e38 100644
--- a/openerp/addons/base/i18n/sl.po
+++ b/openerp/addons/base/i18n/sl.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:02+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:43+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/sq.po b/openerp/addons/base/i18n/sq.po
index 439f12b44f5..4d38cd56221 100644
--- a/openerp/addons/base/i18n/sq.po
+++ b/openerp/addons/base/i18n/sq.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 04:57+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:39+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/sr.po b/openerp/addons/base/i18n/sr.po
index 19889b98dff..04a1487c320 100644
--- a/openerp/addons/base/i18n/sr.po
+++ b/openerp/addons/base/i18n/sr.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:01+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:43+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/sr@latin.po b/openerp/addons/base/i18n/sr@latin.po
index 9787b7345fe..a545d3854a8 100644
--- a/openerp/addons/base/i18n/sr@latin.po
+++ b/openerp/addons/base/i18n/sr@latin.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:04+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/sv.po b/openerp/addons/base/i18n/sv.po
index f2870d694a0..5dd00cab0ba 100644
--- a/openerp/addons/base/i18n/sv.po
+++ b/openerp/addons/base/i18n/sv.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:02+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:43+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/th.po b/openerp/addons/base/i18n/th.po
index 359da71cd6d..d785c5d635b 100644
--- a/openerp/addons/base/i18n/th.po
+++ b/openerp/addons/base/i18n/th.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:02+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:44+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/tlh.po b/openerp/addons/base/i18n/tlh.po
index 798e0c670cb..dede310a722 100644
--- a/openerp/addons/base/i18n/tlh.po
+++ b/openerp/addons/base/i18n/tlh.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:02+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:44+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/tr.po b/openerp/addons/base/i18n/tr.po
index c5e28425eed..a1661ed041e 100644
--- a/openerp/addons/base/i18n/tr.po
+++ b/openerp/addons/base/i18n/tr.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:02+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:44+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/uk.po b/openerp/addons/base/i18n/uk.po
index 1d28d14eca3..a024978394c 100644
--- a/openerp/addons/base/i18n/uk.po
+++ b/openerp/addons/base/i18n/uk.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:02+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:44+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/ur.po b/openerp/addons/base/i18n/ur.po
index 57feba2d53e..2457121dad1 100644
--- a/openerp/addons/base/i18n/ur.po
+++ b/openerp/addons/base/i18n/ur.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:03+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:44+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/vi.po b/openerp/addons/base/i18n/vi.po
index 87b57a173c9..417c64daba6 100644
--- a/openerp/addons/base/i18n/vi.po
+++ b/openerp/addons/base/i18n/vi.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:03+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:44+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/zh_CN.po b/openerp/addons/base/i18n/zh_CN.po
index 4a17bcda152..ccc8619e189 100644
--- a/openerp/addons/base/i18n/zh_CN.po
+++ b/openerp/addons/base/i18n/zh_CN.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:03+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/i18n/zh_TW.po b/openerp/addons/base/i18n/zh_TW.po
index 72e31dab7ae..76f346231dc 100644
--- a/openerp/addons/base/i18n/zh_TW.po
+++ b/openerp/addons/base/i18n/zh_TW.po
@@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-08-23 05:03+0000\n"
-"X-Generator: Launchpad (build 13697)\n"
+"X-Launchpad-Export-Date: 2011-09-01 04:45+0000\n"
+"X-Generator: Launchpad (build 13827)\n"
#. module: base
#: view:ir.filters:0
diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py
index 0b60d389287..67c36b277dd 100644
--- a/openerp/addons/base/ir/ir_actions.py
+++ b/openerp/addons/base/ir/ir_actions.py
@@ -936,10 +936,9 @@ class act_client(osv.osv):
for record in self.browse(cr, uid, ids, context=context)
])
- def _set_params(self, cr, uid, ids, field_name, field_value, arg, context):
+ def _set_params(self, cr, uid, id, field_name, field_value, arg, context):
assert isinstance(field_value, dict), "params can only be dictionaries"
- for record in self.browse(cr, uid, ids, context=context):
- record.write({field_name: repr(field_value)})
+ self.write(cr, uid, id, {'params_store': repr(field_value)}, context=context)
_columns = {
'tag': fields.char('Client action tag', size=64, required=True,
diff --git a/openerp/addons/base/ir/ir_attachment.py b/openerp/addons/base/ir/ir_attachment.py
index 2c3d4e61e84..95a4cd8cab0 100644
--- a/openerp/addons/base/ir/ir_attachment.py
+++ b/openerp/addons/base/ir/ir_attachment.py
@@ -33,7 +33,6 @@ class ir_attachment(osv.osv):
"""
if not ids:
return
- ima = self.pool.get('ir.model.access')
res_ids = {}
if ids:
if isinstance(ids, (int, long)):
@@ -47,12 +46,13 @@ class ir_attachment(osv.osv):
if 'res_model' in values and 'res_id' in values:
res_ids.setdefault(values['res_model'],set()).add(values['res_id'])
+ ima = self.pool.get('ir.model.access')
for model, mids in res_ids.items():
# ignore attachments that are not attached to a resource anymore when checking access rights
# (resource was deleted but attachment was not)
cr.execute('select id from '+self.pool.get(model)._table+' where id in %s', (tuple(mids),))
mids = [x[0] for x in cr.fetchall()]
- ima.check(cr, uid, model, mode, context=context)
+ ima.check(cr, uid, model, mode)
self.pool.get(model).check_access_rule(cr, uid, mids, mode, context=context)
def search(self, cr, uid, args, offset=0, limit=None, order=None,
@@ -80,7 +80,7 @@ class ir_attachment(osv.osv):
# performed in batch as much as possible.
ima = self.pool.get('ir.model.access')
for model, targets in model_attachments.iteritems():
- if not ima.check(cr, uid, model, 'read', raise_exception=False, context=context):
+ if not ima.check(cr, uid, model, 'read', False):
# remove all corresponding attachment ids
for attach_id in itertools.chain(*targets.values()):
ids.remove(attach_id)
diff --git a/openerp/addons/base/ir/ir_model.py b/openerp/addons/base/ir/ir_model.py
index d3dfd987638..a9d2a21b7a5 100644
--- a/openerp/addons/base/ir/ir_model.py
+++ b/openerp/addons/base/ir/ir_model.py
@@ -466,6 +466,7 @@ class ir_model_access(osv.osv):
a.perm_''' + access_mode, (model_name,))
return [x[0] for x in cr.fetchall()]
+ @tools.ormcache()
def check(self, cr, uid, model, mode='read', raise_exception=True, context=None):
if uid==1:
# User root have all accesses
@@ -520,8 +521,6 @@ class ir_model_access(osv.osv):
raise except_orm(_('AccessError'), msgs[mode] % (model_name, groups) )
return r
- check = tools.cache()(check)
-
__cache_clearing_methods = []
def register_cache_clearing_method(self, model, method):
@@ -535,7 +534,7 @@ class ir_model_access(osv.osv):
pass
def call_cache_clearing_methods(self, cr):
- self.check.clear_cache(cr.dbname) # clear the cache of check function
+ self.check.clear_cache(self) # clear the cache of check function
for model, method in self.__cache_clearing_methods:
object_ = self.pool.get(model)
if object_:
@@ -599,7 +598,7 @@ class ir_model_data(osv.osv):
if not cr.fetchone():
cr.execute('CREATE INDEX ir_model_data_module_name_index ON ir_model_data (module, name)')
- @tools.cache()
+ @tools.ormcache()
def _get_id(self, cr, uid, module, xml_id):
"""Returns the id of the ir.model.data record corresponding to a given module and xml_id (cached) or raise a ValueError if not found"""
ids = self.search(cr, uid, [('module','=',module), ('name','=', xml_id)])
@@ -608,7 +607,7 @@ class ir_model_data(osv.osv):
# the sql constraints ensure us we have only one result
return ids[0]
- @tools.cache()
+ @tools.ormcache()
def get_object_reference(self, cr, uid, module, xml_id):
"""Returns (model, res_id) corresponding to a given module and xml_id (cached) or raise ValueError if not found"""
data_id = self._get_id(cr, uid, module, xml_id)
@@ -637,10 +636,8 @@ class ir_model_data(osv.osv):
def unlink(self, cr, uid, ids, context=None):
""" Regular unlink method, but make sure to clear the caches. """
- ref_ids = self.browse(cr, uid, ids, context=context)
- for ref_id in ref_ids:
- self._get_id.clear_cache(cr.dbname, uid, ref_id.module, ref_id.name)
- self.get_object_reference.clear_cache(cr.dbname, uid, ref_id.module, ref_id.name)
+ self._get_id.clear_cache(self)
+ self.get_object_reference.clear_cache(self)
return super(ir_model_data,self).unlink(cr, uid, ids, context=context)
def _update(self,cr, uid, model, module, values, xml_id=False, store=True, noupdate=False, mode='init', res_id=False, context=None):
@@ -666,8 +663,8 @@ class ir_model_data(osv.osv):
results = cr.fetchall()
for imd_id2,res_id2,real_id2 in results:
if not real_id2:
- self._get_id.clear_cache(cr.dbname, uid, module, xml_id)
- self.get_object_reference.clear_cache(cr.dbname, uid, module, xml_id)
+ self._get_id.clear_cache(self, uid, module, xml_id)
+ self.get_object_reference.clear_cache(self, uid, module, xml_id)
cr.execute('delete from ir_model_data where id=%s', (imd_id2,))
res_id = False
else:
diff --git a/openerp/addons/base/ir/ir_rule.py b/openerp/addons/base/ir/ir_rule.py
index 2a36ee9ccc5..734d00eb9a2 100644
--- a/openerp/addons/base/ir/ir_rule.py
+++ b/openerp/addons/base/ir/ir_rule.py
@@ -99,7 +99,7 @@ class ir_rule(osv.osv):
(_check_model_obj, 'Rules are not supported for osv_memory objects !', ['model_id'])
]
- @tools.cache()
+ @tools.ormcache()
def _compute_domain(self, cr, uid, model_name, mode="read"):
if mode not in self._MODES:
raise ValueError('Invalid mode: %r' % (mode,))
@@ -139,25 +139,10 @@ class ir_rule(osv.osv):
return []
def clear_cache(self, cr, uid):
- cr.execute("""SELECT DISTINCT m.model
- FROM ir_rule r
- JOIN ir_model m
- ON r.model_id = m.id
- WHERE r.global
- OR EXISTS (SELECT 1
- FROM rule_group_rel g_rel
- JOIN res_groups_users_rel u_rel
- ON g_rel.group_id = u_rel.gid
- WHERE g_rel.rule_group_id = r.id
- AND u_rel.uid = %s)
- """, (uid,))
- models = map(itemgetter(0), cr.fetchall())
- clear = partial(self._compute_domain.clear_cache, cr.dbname, uid)
- [clear(model, mode) for model in models for mode in self._MODES]
-
+ self._compute_domain.clear_cache(self)
def domain_get(self, cr, uid, model_name, mode='read', context=None):
- dom = self._compute_domain(cr, uid, model_name, mode=mode)
+ dom = self._compute_domain(cr, uid, model_name, mode)
if dom:
# _where_calc is called as superuser. This means that rules can
# involve objects on which the real uid has no acces rights.
@@ -169,20 +154,17 @@ class ir_rule(osv.osv):
def unlink(self, cr, uid, ids, context=None):
res = super(ir_rule, self).unlink(cr, uid, ids, context=context)
- # Restart the cache on the _compute_domain method of ir.rule
- self._compute_domain.clear_cache(cr.dbname)
+ self.clear_cache(cr, uid)
return res
- def create(self, cr, user, vals, context=None):
- res = super(ir_rule, self).create(cr, user, vals, context=context)
- # Restart the cache on the _compute_domain method of ir.rule
- self._compute_domain.clear_cache(cr.dbname)
+ def create(self, cr, uid, vals, context=None):
+ res = super(ir_rule, self).create(cr, uid, vals, context=context)
+ self.clear_cache(cr, uid)
return res
def write(self, cr, uid, ids, vals, context=None):
res = super(ir_rule, self).write(cr, uid, ids, vals, context=context)
- # Restart the cache on the _compute_domain method
- self._compute_domain.clear_cache(cr.dbname)
+ self.clear_cache(cr,uid)
return res
ir_rule()
diff --git a/openerp/addons/base/ir/ir_translation.py b/openerp/addons/base/ir/ir_translation.py
index 47b5cf105e2..4092bf35b2f 100644
--- a/openerp/addons/base/ir/ir_translation.py
+++ b/openerp/addons/base/ir/ir_translation.py
@@ -87,7 +87,7 @@ class ir_translation(osv.osv):
cr.execute('CREATE INDEX ir_translation_ltn ON ir_translation (name, lang, type)')
cr.commit()
- @tools.cache(skiparg=3, multi='ids')
+ @tools.ormcache_multi(skiparg=3, multi=6)
def _get_ids(self, cr, uid, name, tt, lang, ids):
translations = dict.fromkeys(ids, False)
if ids:
@@ -107,9 +107,9 @@ class ir_translation(osv.osv):
tr = self._get_ids(cr, uid, name, tt, lang, ids)
for res_id in tr:
if tr[res_id]:
- self._get_source.clear_cache(cr.dbname, uid, name, tt, lang, tr[res_id])
- self._get_source.clear_cache(cr.dbname, uid, name, tt, lang)
- self._get_ids.clear_cache(cr.dbname, uid, name, tt, lang, ids)
+ self._get_source.clear_cache(self, uid, name, tt, lang, tr[res_id])
+ self._get_source.clear_cache(self, uid, name, tt, lang)
+ self._get_ids.clear_cache(self, uid, name, tt, lang, ids)
cr.execute('delete from ir_translation ' \
'where lang=%s ' \
@@ -128,7 +128,7 @@ class ir_translation(osv.osv):
})
return len(ids)
- @tools.cache(skiparg=3)
+ @tools.ormcache(skiparg=3)
def _get_source(self, cr, uid, name, types, lang, source=None):
"""
Returns the translation for the given combination of name, type, language
@@ -173,13 +173,11 @@ class ir_translation(osv.osv):
return tools.ustr(source)
return trad
- def create(self, cursor, user, vals, context=None):
+ def create(self, cr, uid, vals, context=None):
if not context:
context = {}
- ids = super(ir_translation, self).create(cursor, user, vals, context=context)
- for trans_obj in self.read(cursor, user, [ids], ['name','type','res_id','src','lang'], context=context):
- self._get_source.clear_cache(cursor.dbname, user, trans_obj['name'], trans_obj['type'], trans_obj['lang'], source=trans_obj['src'])
- self._get_ids.clear_cache(cursor.dbname, user, trans_obj['name'], trans_obj['type'], trans_obj['lang'], [trans_obj['res_id']])
+ ids = super(ir_translation, self).create(cr, uid, vals, context=context)
+ self._get_source.clear_cache(self, vals.get('name',0), vals.get('type',0), vals.get('lang',0), vals.get('src',0))
return ids
def write(self, cursor, user, ids, vals, context=None):
@@ -188,9 +186,9 @@ class ir_translation(osv.osv):
if isinstance(ids, (int, long)):
ids = [ids]
result = super(ir_translation, self).write(cursor, user, ids, vals, context=context)
+ self._get_source.clear_cache(self, user, trans_obj['name'], trans_obj['type'], trans_obj['lang'], source=trans_obj['src'])
for trans_obj in self.read(cursor, user, ids, ['name','type','res_id','src','lang'], context=context):
- self._get_source.clear_cache(cursor.dbname, user, trans_obj['name'], trans_obj['type'], trans_obj['lang'], source=trans_obj['src'])
- self._get_ids.clear_cache(cursor.dbname, user, trans_obj['name'], trans_obj['type'], trans_obj['lang'], [trans_obj['res_id']])
+ self._get_ids.clear_cache(self, user, trans_obj['name'], trans_obj['type'], trans_obj['lang'], [trans_obj['res_id']])
return result
def unlink(self, cursor, user, ids, context=None):
@@ -199,8 +197,8 @@ class ir_translation(osv.osv):
if isinstance(ids, (int, long)):
ids = [ids]
for trans_obj in self.read(cursor, user, ids, ['name','type','res_id','src','lang'], context=context):
- self._get_source.clear_cache(cursor.dbname, user, trans_obj['name'], trans_obj['type'], trans_obj['lang'], source=trans_obj['src'])
- self._get_ids.clear_cache(cursor.dbname, user, trans_obj['name'], trans_obj['type'], trans_obj['lang'], [trans_obj['res_id']])
+ self._get_source.clear_cache(self, user, trans_obj['name'], trans_obj['type'], trans_obj['lang'], source=trans_obj['src'])
+ self._get_ids.clear_cache(self, user, trans_obj['name'], trans_obj['type'], trans_obj['lang'], [trans_obj['res_id']])
result = super(ir_translation, self).unlink(cursor, user, ids, context=context)
return result
diff --git a/openerp/addons/base/ir/ir_ui_menu.py b/openerp/addons/base/ir/ir_ui_menu.py
index 9ed4d7806bc..83660cfe753 100644
--- a/openerp/addons/base/ir/ir_ui_menu.py
+++ b/openerp/addons/base/ir/ir_ui_menu.py
@@ -88,7 +88,7 @@ class ir_ui_menu(osv.osv):
field = model_field.get(menu.action._name)
if field and data[field]:
- if not modelaccess.check(cr, uid, data[field], raise_exception=False):
+ if not modelaccess.check(cr, uid, data[field], False):
continue
else:
# if there is no action, it's a 'folder' menu
diff --git a/openerp/addons/base/res/__init__.py b/openerp/addons/base/res/__init__.py
index de00fc54153..9ce69f0c317 100644
--- a/openerp/addons/base/res/__init__.py
+++ b/openerp/addons/base/res/__init__.py
@@ -21,9 +21,11 @@
import tools
-import country
+import res_country
import res_lang
-import partner
+import res_partner
+import res_partner_event
+import res_bank
import res_config
import res_currency
import res_company
@@ -31,6 +33,11 @@ import res_user
import res_request
import res_lang
import res_log
-import ir_property
import res_widget
+import ir_property
+
+import wizard
+import report
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/openerp/addons/base/res/partner/__init__.py b/openerp/addons/base/res/partner/__init__.py
deleted file mode 100644
index 3a9b989162f..00000000000
--- a/openerp/addons/base/res/partner/__init__.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2009 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 .
-#
-##############################################################################
-
-import tools
-
-from partner import *
-from bank import *
-from crm import *
-
-import wizard
-import report
-
-
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/openerp/addons/base/res/partner/crm_demo.xml b/openerp/addons/base/res/partner/crm_demo.xml
deleted file mode 100644
index 03c69ef51d7..00000000000
--- a/openerp/addons/base/res/partner/crm_demo.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
- website
-
-
- phone
-
-
- direct
-
-
- E-mail
-
-
-
-
diff --git a/openerp/addons/base/res/partner/crm_view.xml b/openerp/addons/base/res/partner/crm_view.xml
deleted file mode 100644
index 51944da65c8..00000000000
--- a/openerp/addons/base/res/partner/crm_view.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
-
- res.partner.canal.tree
- res.partner.canal
- tree
-
-
-
-
-
-
-
-
- res.partner.canal.form
- res.partner.canal
- form
-
-
-
-
-
- Channels
- res.partner.canal
- form
- tree,form
- Track from where is coming your leads and opportunities by creating specific channels that will be maintained at the creation of a document in the system. Some examples of channels can be: Website, Phone Call, Reseller, etc.
-
-
-
-
-
-
- res.partner.event.form
- res.partner.event
- form
-
-
-
-
-
-
- res.partner.event.tree
- res.partner.event
- tree
-
-
-
-
-
-
-
-
-
-
diff --git a/openerp/addons/base/res/partner/partner_report.xml b/openerp/addons/base/res/partner/partner_report.xml
deleted file mode 100644
index 61e3876527f..00000000000
--- a/openerp/addons/base/res/partner/partner_report.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
diff --git a/openerp/addons/base/res/partner/report/__init__.py b/openerp/addons/base/res/report/__init__.py
similarity index 100%
rename from openerp/addons/base/res/partner/report/__init__.py
rename to openerp/addons/base/res/report/__init__.py
diff --git a/openerp/addons/base/res/partner/report/business_card.xml b/openerp/addons/base/res/report/business_card.xml
similarity index 100%
rename from openerp/addons/base/res/partner/report/business_card.xml
rename to openerp/addons/base/res/report/business_card.xml
diff --git a/openerp/addons/base/res/partner/report/business_card.xsl b/openerp/addons/base/res/report/business_card.xsl
similarity index 100%
rename from openerp/addons/base/res/partner/report/business_card.xsl
rename to openerp/addons/base/res/report/business_card.xsl
diff --git a/openerp/addons/base/res/partner/report/partner_address.xml b/openerp/addons/base/res/report/partner_address.xml
similarity index 100%
rename from openerp/addons/base/res/partner/report/partner_address.xml
rename to openerp/addons/base/res/report/partner_address.xml
diff --git a/openerp/addons/base/res/partner/report/partner_address.xsl b/openerp/addons/base/res/report/partner_address.xsl
similarity index 100%
rename from openerp/addons/base/res/partner/report/partner_address.xsl
rename to openerp/addons/base/res/report/partner_address.xsl
diff --git a/openerp/addons/base/res/partner/bank.py b/openerp/addons/base/res/res_bank.py
similarity index 100%
rename from openerp/addons/base/res/partner/bank.py
rename to openerp/addons/base/res/res_bank.py
diff --git a/openerp/addons/base/res/partner/bank_view.xml b/openerp/addons/base/res/res_bank_view.xml
similarity index 100%
rename from openerp/addons/base/res/partner/bank_view.xml
rename to openerp/addons/base/res/res_bank_view.xml
diff --git a/openerp/addons/base/res/res_company.py b/openerp/addons/base/res/res_company.py
index b0ebeb8ac27..3ad0cfcfb55 100644
--- a/openerp/addons/base/res/res_company.py
+++ b/openerp/addons/base/res/res_company.py
@@ -88,18 +88,6 @@ class res_company(osv.osv):
result[company.id][field] = address[field] or False
return result
-
- def _get_bank_data(self, cr, uid, ids, field_names, arg, context=None):
- """ Read the 'address' functional fields. """
- result = {}
- for company in self.browse(cr, uid, ids, context=context):
- r = []
- for bank in company.bank_ids:
- if bank.footer:
- r.append(bank.name_get(context=context)[0][1])
- result[company.id] = ' | '.join(r)
- return result
-
def _set_address_data(self, cr, uid, company_id, name, value, arg, context=None):
""" Write the 'address' functional fields. """
company = self.browse(cr, uid, company_id, context=context)
@@ -114,6 +102,16 @@ class res_company(osv.osv):
address_obj.create(cr, uid, {name: value or False, 'partner_id': company.partner_id.id}, context=context)
return True
+ def _get_bank_data(self, cr, uid, ids, field_names, arg, context=None):
+ """ Read the 'address' functional fields. """
+ result = {}
+ for company in self.browse(cr, uid, ids, context=context):
+ r = []
+ for bank in company.bank_ids:
+ if bank.footer:
+ r.append(bank.name_get(context=context)[0][1])
+ result[company.id] = ' | '.join(r)
+ return result
_columns = {
'name': fields.char('Company Name', size=64, required=True),
@@ -143,15 +141,8 @@ class res_company(osv.osv):
'fax': fields.function(_get_address_data, fnct_inv=_set_address_data, size=64, type='char', string="Fax", multi='address'),
'website': fields.related('partner_id', 'website', string="Website", type="char", size=64),
'vat': fields.related('partner_id', 'vat', string="Tax ID", type="char", size=32),
+ 'company_registry': fields.char('Company Registry', size=64),
}
- def on_change_header(self, cr, uid, ids, phone, email, fax, website, vat, context={}):
- val = []
- if phone: val.append(_('Phone: ')+phone)
- if fax: val.append(_('Fax: ')+fax)
- if website: val.append(_('Website: ')+website)
- if vat: val.append(_('VAT: ')+vat)
- return {'value': {'rml_footer1':' | '.join(val)}}
-
def _search(self, cr, uid, args, offset=0, limit=None, order=None,
context=None, count=False, access_rights_uid=None):
@@ -189,12 +180,7 @@ class res_company(osv.osv):
return rule.company_dest_id.id
return user.company_id.id
- def _get_child_ids(self, cr, uid, uid2, context={}):
- company = self.pool.get('res.users').company_get(cr, uid, uid2)
- ids = self._get_company_children(cr, uid, company)
- return ids
-
- @tools.cache()
+ @tools.ormcache()
def _get_company_children(self, cr, uid=None, company=None):
if not company:
return []
@@ -221,7 +207,7 @@ class res_company(osv.osv):
# This function restart the cache on the _get_company_children method
#
def cache_restart(self, cr):
- self._get_company_children.clear_cache(cr.dbname)
+ self._get_company_children.clear_cache(self)
def create(self, cr, uid, vals, context=None):
if not vals.get('name', False) or vals.get('partner_id', False):
@@ -239,6 +225,16 @@ class res_company(osv.osv):
self.cache_restart(cr)
return super(res_company, self).write(cr, *args, **argv)
+ def generate_header(self, cr, uid, ids, context=None):
+ for c in self.browse(cr, uid, ids, context=context):
+ val = []
+ if c.phone: val.append(_('Phone: ')+c.phone)
+ if c.fax: val.append(_('Fax: ')+c.fax)
+ if c.website: val.append(_('Website: ')+c.website)
+ if c.vat: val.append(_('VAT: ')+c.vat)
+ if c.company_registry: val.append(_('Reg: ')+c.company_registry)
+ self.write(cr,uid, [c.id], {'rml_footer1':' | '.join(val)}, context)
+
def _get_euro(self, cr, uid, context={}):
try:
return self.pool.get('res.currency').search(cr, uid, [])[0]
diff --git a/openerp/addons/base/res/country.py b/openerp/addons/base/res/res_country.py
similarity index 100%
rename from openerp/addons/base/res/country.py
rename to openerp/addons/base/res/res_country.py
diff --git a/openerp/addons/base/res/country_view.xml b/openerp/addons/base/res/res_country_view.xml
similarity index 100%
rename from openerp/addons/base/res/country_view.xml
rename to openerp/addons/base/res/res_country_view.xml
diff --git a/openerp/addons/base/res/res_currency.py b/openerp/addons/base/res/res_currency.py
index d81248a735d..3b7e427a923 100644
--- a/openerp/addons/base/res/res_currency.py
+++ b/openerp/addons/base/res/res_currency.py
@@ -36,8 +36,12 @@ class res_currency(osv.osv):
else:
date = time.strftime('%Y-%m-%d')
date = date or time.strftime('%Y-%m-%d')
+ # Convert False values to None ...
+ currency_rate_type = context.get('currency_rate_type_id') or None
+ # ... and use 'is NULL' instead of '= some-id'.
+ operator = '=' if currency_rate_type else 'is'
for id in ids:
- cr.execute("SELECT currency_id, rate FROM res_currency_rate WHERE currency_id = %s AND name <= %s ORDER BY name desc LIMIT 1" ,(id, date))
+ cr.execute("SELECT currency_id, rate FROM res_currency_rate WHERE currency_id = %s AND name <= %s AND currency_rate_type_id " + operator +" %s ORDER BY name desc LIMIT 1" ,(id, date, currency_rate_type))
if cr.rowcount:
id, rate = cr.fetchall()[0]
res[id] = rate
@@ -68,13 +72,13 @@ class res_currency(osv.osv):
_order = "name"
def read(self, cr, user, ids, fields=None, context=None, load='_classic_read'):
- res=super(osv.osv, self).read(cr, user, ids, fields, context, load)
+ res = super(osv.osv, self).read(cr, user, ids, fields, context, load)
+ currency_rate_obj = self.pool.get('res.currency.rate')
for r in res:
if r.__contains__('rate_ids'):
rates=r['rate_ids']
if rates:
- currency_rate_obj= self.pool.get('res.currency.rate')
- currency_date = currency_rate_obj.read(cr,user,rates[0],['name'])['name']
+ currency_date = currency_rate_obj.read(cr, user, rates[0], ['name'])['name']
r['date'] = currency_date
return res
@@ -100,9 +104,16 @@ class res_currency(osv.osv):
def _get_conversion_rate(self, cr, uid, from_currency, to_currency, context=None):
if context is None:
context = {}
- if from_currency['rate'] == 0 or to_currency['rate'] == 0:
+ ctx = context.copy()
+ ctx.update({'currency_rate_type_id': ctx.get('currency_rate_type_from')})
+ from_currency = self.browse(cr, uid, from_currency.id, context=ctx)
+
+ ctx.update({'currency_rate_type_id': ctx.get('currency_rate_type_to')})
+ to_currency = self.browse(cr, uid, to_currency.id, context=ctx)
+
+ if from_currency.rate == 0 or to_currency.rate == 0:
date = context.get('date', time.strftime('%Y-%m-%d'))
- if from_currency['rate'] == 0:
+ if from_currency.rate == 0:
currency_symbol = from_currency.symbol
else:
currency_symbol = to_currency.symbol
@@ -111,7 +122,10 @@ class res_currency(osv.osv):
'at the date: %s') % (currency_symbol, date))
return to_currency.rate/from_currency.rate
- def compute(self, cr, uid, from_currency_id, to_currency_id, from_amount, round=True, context=None):
+ def compute(self, cr, uid, from_currency_id, to_currency_id, from_amount,
+ round=True, currency_rate_type_from=False, currency_rate_type_to=False, context=None):
+ if not context:
+ context = {}
if not from_currency_id:
from_currency_id = to_currency_id
if not to_currency_id:
@@ -119,12 +133,13 @@ class res_currency(osv.osv):
xc = self.browse(cr, uid, [from_currency_id,to_currency_id], context=context)
from_currency = (xc[0].id == from_currency_id and xc[0]) or xc[1]
to_currency = (xc[0].id == to_currency_id and xc[0]) or xc[1]
- if to_currency_id == from_currency_id:
+ if (to_currency_id == from_currency_id) and (currency_rate_type_from == currency_rate_type_to):
if round:
return self.round(cr, uid, to_currency, from_amount)
else:
return from_amount
else:
+ context.update({'currency_rate_type_from': currency_rate_type_from, 'currency_rate_type_to': currency_rate_type_to})
rate = self._get_conversion_rate(cr, uid, from_currency, to_currency, context=context)
if round:
return self.round(cr, uid, to_currency, from_amount * rate)
@@ -133,19 +148,31 @@ class res_currency(osv.osv):
res_currency()
+class res_currency_rate_type(osv.osv):
+ _name = "res.currency.rate.type"
+ _description = "Used to define the type of Currency Rates"
+ _columns = {
+ 'name': fields.char('Name', size=64, required=True, translate=True),
+ }
+
+res_currency_rate_type()
+
class res_currency_rate(osv.osv):
_name = "res.currency.rate"
_description = "Currency Rate"
+
_columns = {
'name': fields.date('Date', required=True, select=True),
'rate': fields.float('Rate', digits=(12,6), required=True,
help='The rate of the currency to the currency of rate 1'),
'currency_id': fields.many2one('res.currency', 'Currency', readonly=True),
+ 'currency_rate_type_id': fields.many2one('res.currency.rate.type', 'Currency Rate Type', help="Allow you to define your own currency rate types, like 'Average' or 'Year to Date'. Leave empty if you simply want to use the normal 'spot' rate type"),
}
_defaults = {
'name': lambda *a: time.strftime('%Y-%m-%d'),
}
_order = "name desc"
+
res_currency_rate()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/openerp/addons/base/res/res_currency_view.xml b/openerp/addons/base/res/res_currency_view.xml
index 37a8693e5b3..8d747c882b1 100644
--- a/openerp/addons/base/res/res_currency_view.xml
+++ b/openerp/addons/base/res/res_currency_view.xml
@@ -66,5 +66,38 @@
+
+
+ res.currency.rate.type.form
+ res.currency.rate.type
+ form
+
+
+
+
+
+
+ Currency Rate Type
+ res.currency.rate.type
+ form
+ tree,form
+
+
+
+ res.currency.rate.type.search
+ res.currency.rate.type
+ search
+
+
+
+
+
+
+
+
diff --git a/openerp/addons/base/res/res_lang.py b/openerp/addons/base/res/res_lang.py
index ded70fa6b1e..f6743a54062 100644
--- a/openerp/addons/base/res/res_lang.py
+++ b/openerp/addons/base/res/res_lang.py
@@ -163,7 +163,7 @@ class lang(osv.osv):
(_check_format, 'Invalid date/time format directive specified. Please refer to the list of allowed directives, displayed when you edit a language.', ['time_format', 'date_format'])
]
- @tools.cache(skiparg=3)
+ @tools.ormcache(skiparg=3)
def _lang_data_get(self, cr, uid, lang_id, monetary=False):
conv = localeconv()
lang_obj = self.browse(cr, uid, lang_id)
@@ -174,7 +174,7 @@ class lang(osv.osv):
def write(self, cr, uid, ids, vals, context=None):
for lang_id in ids :
- self._lang_data_get.clear_cache(cr.dbname,lang_id= lang_id)
+ self._lang_data_get.clear_cache(self)
return super(lang, self).write(cr, uid, ids, vals, context)
def unlink(self, cr, uid, ids, context=None):
diff --git a/openerp/addons/base/res/partner/partner.py b/openerp/addons/base/res/res_partner.py
similarity index 100%
rename from openerp/addons/base/res/partner/partner.py
rename to openerp/addons/base/res/res_partner.py
diff --git a/openerp/addons/base/res/partner/partner_data.xml b/openerp/addons/base/res/res_partner_data.xml
similarity index 100%
rename from openerp/addons/base/res/partner/partner_data.xml
rename to openerp/addons/base/res/res_partner_data.xml
diff --git a/openerp/addons/base/res/partner/partner_demo.xml b/openerp/addons/base/res/res_partner_demo.xml
similarity index 100%
rename from openerp/addons/base/res/partner/partner_demo.xml
rename to openerp/addons/base/res/res_partner_demo.xml
diff --git a/openerp/addons/base/res/partner/crm.py b/openerp/addons/base/res/res_partner_event.py
similarity index 82%
rename from openerp/addons/base/res/partner/crm.py
rename to openerp/addons/base/res/res_partner_event.py
index d7decade3ca..4425b7e6984 100644
--- a/openerp/addons/base/res/partner/crm.py
+++ b/openerp/addons/base/res/res_partner_event.py
@@ -23,22 +23,6 @@ import time
from osv import osv
from osv import fields
-#
-# Sale/Purchase Canal, Media
-#
-class res_partner_canal(osv.osv):
- _name = "res.partner.canal"
- _description = "Channels"
- _order = 'name'
- _columns = {
- 'name': fields.char('Channel Name', size=64, required=True),
- 'active': fields.boolean('Active'),
- }
- _defaults = {
- 'active': lambda *a: 1,
- }
-res_partner_canal()
-
class res_partner_event(osv.osv):
_name = "res.partner.event"
_columns = {
diff --git a/openerp/addons/base/res/res_partner_event_view.xml b/openerp/addons/base/res/res_partner_event_view.xml
new file mode 100644
index 00000000000..bc5904c9e9f
--- /dev/null
+++ b/openerp/addons/base/res/res_partner_event_view.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+ res.partner.event.form
+ res.partner.event
+ form
+
+
+
+
+
+
+ res.partner.event.tree
+ res.partner.event
+ tree
+
+
+
+
+
+
+
+
+
+
diff --git a/openerp/addons/base/res/res_partner_report.xml b/openerp/addons/base/res/res_partner_report.xml
new file mode 100644
index 00000000000..06ea859d007
--- /dev/null
+++ b/openerp/addons/base/res/res_partner_report.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/openerp/addons/base/res/partner/partner_shortcut_data.xml b/openerp/addons/base/res/res_partner_shortcut_data.xml
similarity index 100%
rename from openerp/addons/base/res/partner/partner_shortcut_data.xml
rename to openerp/addons/base/res/res_partner_shortcut_data.xml
diff --git a/openerp/addons/base/res/partner/partner_view.xml b/openerp/addons/base/res/res_partner_view.xml
similarity index 99%
rename from openerp/addons/base/res/partner/partner_view.xml
rename to openerp/addons/base/res/res_partner_view.xml
index 2b98fc6ccbb..8b26023701d 100644
--- a/openerp/addons/base/res/partner/partner_view.xml
+++ b/openerp/addons/base/res/res_partner_view.xml
@@ -518,7 +518,7 @@
Manage the partner categories in order to better classify them for tracking and analysis purposes. A partner may belong to several categories and categories have a hierarchy structure: a partner belonging to a category also belong to his parent category.
-
+
-
-
-
-
-
-
+
+
@@ -96,11 +92,9 @@
-
-
-
-
-
+
+
+
@@ -111,11 +105,9 @@
-
-
-
-
-
+
+
+
@@ -444,7 +436,6 @@
-
@@ -601,7 +592,6 @@
-
diff --git a/openerp/addons/base/security/ir.model.access.csv b/openerp/addons/base/security/ir.model.access.csv
index f3e19f49535..8949052f89b 100644
--- a/openerp/addons/base/security/ir.model.access.csv
+++ b/openerp/addons/base/security/ir.model.access.csv
@@ -64,8 +64,6 @@
"access_res_partner_bank_type_group_user","res_partner_bank_type group_user","model_res_partner_bank_type",,1,0,0,0
"access_res_partner_bank_type_field_group_partner_manager","res_partner_bank_type_field group_partner_manager","model_res_partner_bank_type_field","group_partner_manager",1,1,1,1
"access_res_partner_bank_type_field_group_user","res_partner_bank_type_field group_user","model_res_partner_bank_type_field",,1,0,0,0
-"access_res_partner_canal_group_user","res_partner_canal group_user","model_res_partner_canal","group_user",1,0,0,0
-"access_res_partner_canal_group_partner_manager","res_partner_canal group_partner_manager","model_res_partner_canal","group_partner_manager",1,1,1,1
"access_res_partner_category_group_user","res_partner_category group_user","model_res_partner_category","group_user",1,0,0,0
"access_res_partner_category_group_partner_manager","res_partner_category group_partner_manager","model_res_partner_category","group_partner_manager",1,1,1,1
"access_res_partner_event_group_user","res_partner_event group_user","model_res_partner_event","group_user",1,0,0,0
diff --git a/openerp/modules/registry.py b/openerp/modules/registry.py
index 11f484a71a0..072082db000 100644
--- a/openerp/modules/registry.py
+++ b/openerp/modules/registry.py
@@ -70,18 +70,22 @@ class Registry(object):
res = []
- # Instanciate classes registered through their constructor and
- # add them to the pool.
- for klass in openerp.osv.orm.module_class_list.get(module, []):
- res.append(klass.createInstance(self, cr))
-
- # Instanciate classes automatically discovered.
+ # Instantiate registered classes (via metamodel discovery or via explicit
+ # constructor call), and add them to the pool.
for cls in openerp.osv.orm.MetaModel.module_to_models.get(module, []):
- if cls not in openerp.osv.orm.module_class_list.get(module, []):
- res.append(cls.createInstance(self, cr))
+ res.append(cls.createInstance(self, cr))
return res
+ def clear_caches(self):
+ """ Clear the caches
+
+ This clears the caches associated to methods decorated with
+ ``tools.ormcache`` or ``tools.ormcache_multi`` for all the models.
+ """
+ for model in self.models.itervalues():
+ model.clear_caches()
+
class RegistryManager(object):
""" Model registries manager.
@@ -155,4 +159,19 @@ class RegistryManager(object):
del cls.registries[db_name]
+ @classmethod
+ def clear_caches(cls, db_name):
+ """ Clear the caches
+
+ This clears the caches associated to methods decorated with
+ ``tools.ormcache`` or ``tools.ormcache_multi`` for all the models
+ of the given database name.
+
+ This method is given to spare you a ``RegistryManager.get(db_name)``
+ that would loads the given database if it was not already loaded.
+ """
+ if db_name in cls.registries:
+ cls.registries[db_name].clear_caches()
+
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py
index 782cc8e796a..fb973d2e521 100644
--- a/openerp/osv/fields.py
+++ b/openerp/osv/fields.py
@@ -852,12 +852,13 @@ class function(_column):
This callable implements the write operation for the function field
and must have the following signature:
- .. function:: fnct_inv(model, cr, uid, ids, field_name, field_value, fnct_inv_arg, context)
+ .. function:: fnct_inv(model, cr, uid, id, field_name, field_value, fnct_inv_arg, context)
Callable that implements the ``write`` operation for the function field.
:param orm_template model: model to which the field belongs (should be ``self`` for
a model method)
+ :param int id: the identifier of the object to write on
:param str field_name: name of the field to set
:param fnct_inv_arg: arbitrary value passed when declaring the function field
:return: True
diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py
index d4a5d808990..b87672c012d 100644
--- a/openerp/osv/orm.py
+++ b/openerp/osv/orm.py
@@ -70,9 +70,6 @@ from openerp.tools import SKIPPED_ELEMENT_TYPES
regex_order = re.compile('^(([a-z0-9_]+|"[a-z0-9_]+")( *desc| *asc)?( *, *|))+$', re.I)
regex_object_name = re.compile(r'^[a-z0-9_.]+$')
-# Mapping between openerp module names and their osv classes.
-module_class_list = {}
-
# Super-user identifier (aka Administrator aka root)
ROOT_USER_ID = 1
@@ -806,23 +803,21 @@ class orm_template(object):
return obj
def __new__(cls):
- """ Register this model.
+ """Register this model.
This doesn't create an instance but simply register the model
as being part of the module where it is defined.
-
- TODO make it possible to not even have to call the constructor
- to be registered.
-
"""
-
# Set the module name (e.g. base, sale, accounting, ...) on the class.
module = cls.__module__.split('.')[0]
if not hasattr(cls, '_module'):
cls._module = module
- # Remember which models to instanciate for this module.
- module_class_list.setdefault(cls._module, []).append(cls)
+ # Record this class in the list of models to instantiate for this module,
+ # managed by the metaclass.
+ module_model_list = MetaModel.module_to_models.setdefault(cls._module, [])
+ if cls not in module_model_list:
+ module_model_list.append(cls)
# Since we don't return an instance here, the __init__
# method won't be called.
@@ -989,9 +984,10 @@ class orm_template(object):
cols = self._columns.copy()
for f in self._inherit_fields:
cols.update({f: self._inherit_fields[f][2]})
- def fsplit(x):
- if x=='.id': return [x]
- return x.replace(':id','/id').replace('.id','/.id').split('/')
+ def fsplit(fieldname):
+ fixed_db_id = re.sub(r'([^/])\.id', r'\1/.id', fieldname)
+ fixed_external_id = re.sub(r'([^/]):id', r'\1/id', fixed_db_id)
+ return fixed_external_id.split('/')
fields_to_export = map(fsplit, fields_to_export)
datas = []
for row in self.browse(cr, uid, ids, context):
@@ -1264,7 +1260,7 @@ class orm_template(object):
else:
translated_msg = tmp_msg
else:
- translated_msg = trans._get_source(cr, uid, self._name, 'constraint', lng, source=msg) or msg
+ translated_msg = trans._get_source(cr, uid, self._name, 'constraint', lng, msg) or msg
error_msgs.append(
_("Error occurred while validating the field(s) %s: %s") % (','.join(fields), translated_msg)
)
@@ -2182,7 +2178,7 @@ class orm_template(object):
def read_string(self, cr, uid, id, langs, fields=None, context=None):
res = {}
res2 = {}
- self.pool.get('ir.model.access').check(cr, uid, 'ir.translation', 'read', context=context)
+ self.pool.get('ir.model.access').check(cr, uid, 'ir.translation', 'read')
if not fields:
fields = self._columns.keys() + self._inherit_fields.keys()
#FIXME: collect all calls to _get_source into one SQL call.
@@ -2206,7 +2202,7 @@ class orm_template(object):
return res
def write_string(self, cr, uid, id, langs, vals, context=None):
- self.pool.get('ir.model.access').check(cr, uid, 'ir.translation', 'write', context=context)
+ self.pool.get('ir.model.access').check(cr, uid, 'ir.translation', 'write')
#FIXME: try to only call the translation in one SQL
for lang in langs:
for field in vals:
@@ -2251,6 +2247,18 @@ class orm_template(object):
values = defaults
return values
+ def clear_caches(self):
+ """ Clear the caches
+
+ This clears the caches associated to methods decorated with
+ ``tools.ormcache`` or ``tools.ormcache_multi``.
+ """
+ try:
+ getattr(self, '_ormcache')
+ self._ormcache = {}
+ except AttributeError:
+ pass
+
class orm_memory(orm_template):
_protected = ['read', 'write', 'create', 'default_get', 'perm_read', 'unlink', 'fields_get', 'fields_view_get', 'search', 'name_get', 'distinct_field_get', 'name_search', 'copy', 'import_data', 'search_count', 'exists']
@@ -2516,7 +2524,7 @@ class orm(orm_template):
"""
context = context or {}
- self.pool.get('ir.model.access').check(cr, uid, self._name, 'read', context=context)
+ self.pool.get('ir.model.access').check(cr, uid, self._name, 'read')
if not fields:
fields = self._columns.keys()
@@ -3398,14 +3406,14 @@ class orm(orm_template):
"""
ira = self.pool.get('ir.model.access')
- write_access = ira.check(cr, user, self._name, 'write', raise_exception=False, context=context) or \
- ira.check(cr, user, self._name, 'create', raise_exception=False, context=context)
+ write_access = ira.check(cr, user, self._name, 'write', False) or \
+ ira.check(cr, user, self._name, 'create', False)
return super(orm, self).fields_get(cr, user, fields, context, write_access)
def read(self, cr, user, ids, fields=None, context=None, load='_classic_read'):
if not context:
context = {}
- self.pool.get('ir.model.access').check(cr, user, self._name, 'read', context=context)
+ self.pool.get('ir.model.access').check(cr, user, self._name, 'read')
if not fields:
fields = list(set(self._columns.keys() + self._inherit_fields.keys()))
if isinstance(ids, (int, long)):
@@ -3691,7 +3699,7 @@ class orm(orm_template):
self._check_concurrency(cr, ids, context)
- self.pool.get('ir.model.access').check(cr, uid, self._name, 'unlink', context=context)
+ self.pool.get('ir.model.access').check(cr, uid, self._name, 'unlink')
properties = self.pool.get('ir.property')
domain = [('res_id', '=', False),
@@ -3828,7 +3836,7 @@ class orm(orm_template):
ids = [ids]
self._check_concurrency(cr, ids, context)
- self.pool.get('ir.model.access').check(cr, user, self._name, 'write', context=context)
+ self.pool.get('ir.model.access').check(cr, user, self._name, 'write')
result = self._store_get_values(cr, user, ids, vals.keys(), context) or []
@@ -4037,7 +4045,7 @@ class orm(orm_template):
"""
if not context:
context = {}
- self.pool.get('ir.model.access').check(cr, user, self._name, 'create', context=context)
+ self.pool.get('ir.model.access').check(cr, user, self._name, 'create')
vals = self._add_missing_default_values(cr, user, vals, context)
@@ -4493,7 +4501,7 @@ class orm(orm_template):
"""
if context is None:
context = {}
- self.pool.get('ir.model.access').check(cr, access_rights_uid or user, self._name, 'read', context=context)
+ self.pool.get('ir.model.access').check(cr, access_rights_uid or user, self._name, 'read')
query = self._where_calc(cr, user, args, context=context)
self._apply_ir_rules(cr, user, query, 'read', context=context)
diff --git a/openerp/service/web_services.py b/openerp/service/web_services.py
index 0238bbdd4cd..df848b94e67 100644
--- a/openerp/service/web_services.py
+++ b/openerp/service/web_services.py
@@ -152,6 +152,7 @@ class db(netsvc.ExportService):
def exp_drop(self, db_name):
sql_db.close_db(db_name)
+ openerp.modules.registry.RegistryManager.clear_caches(db_name)
openerp.netsvc.Agent.cancel(db_name)
logger = netsvc.Logger()
@@ -255,7 +256,8 @@ class db(netsvc.ExportService):
def exp_rename(self, old_name, new_name):
sql_db.close_db(old_name)
- openerp.netsvc.Agent.cancel(db_name)
+ openerp.modules.registry.RegistryManager.clear_caches(old_name)
+ openerp.netsvc.Agent.cancel(old_name)
logger = netsvc.Logger()
db = sql_db.db_connect('template1')
diff --git a/openerp/sql_db.py b/openerp/sql_db.py
index 18efb62eb18..f4a899c8db2 100644
--- a/openerp/sql_db.py
+++ b/openerp/sql_db.py
@@ -500,7 +500,6 @@ def db_connect(db_name):
def close_db(db_name):
""" You might want to call openerp.netsvc.Agent.cancel(db_name) along this function."""
_Pool.close_all(dsn(db_name))
- tools.cache.clean_caches_for_db(db_name)
ct = currentThread()
if hasattr(ct, 'dbname'):
delattr(ct, 'dbname')
diff --git a/openerp/tools/cache.py b/openerp/tools/cache.py
new file mode 100644
index 00000000000..33a821ce3b3
--- /dev/null
+++ b/openerp/tools/cache.py
@@ -0,0 +1,137 @@
+import lru
+
+class ormcache(object):
+ """ LRU cache decorator for orm methods,
+ """
+
+ def __init__(self, skiparg=2, size=8192, multi=None, timeout=None):
+ self.skiparg = skiparg
+ self.size = size
+ self.method = None
+ self.stat_miss = 0
+ self.stat_hit = 0
+ self.stat_err = 0
+
+ def __call__(self,m):
+ self.method = m
+ def lookup(self2, cr, *args):
+ r = self.lookup(self2, cr, *args)
+ return r
+ lookup.clear_cache = self.clear
+ return lookup
+
+ def stat(self):
+ return "lookup-stats hit=%s miss=%s err=%s ratio=%.1f" % (self.stat_hit,self.stat_miss,self.stat_err, (100*float(self.stat_hit))/(self.stat_miss+self.stat_hit) )
+
+ def lru(self, self2):
+ try:
+ ormcache = getattr(self2, '_ormcache')
+ except AttributeError:
+ ormcache = self2._ormcache = {}
+ try:
+ d = ormcache[self.method]
+ except KeyError:
+ d = ormcache[self.method] = lru.LRU(self.size)
+ return d
+
+ def lookup(self, self2, cr, *args):
+ d = self.lru(self2)
+ key = args[self.skiparg-2:]
+ try:
+ r = d[key]
+ self.stat_hit += 1
+ return r
+ except KeyError:
+ self.stat_miss += 1
+ value = d[args] = self.method(self2, cr, *args)
+ return value
+ except TypeError:
+ self.stat_err += 1
+ return self.method(self2, cr, *args)
+
+ def clear(self, self2, *args):
+ """ Remove *args entry from the cache or all keys if *args is undefined
+ """
+ d = self.lru(self2)
+ if args:
+ try:
+ key = args[self.skiparg-2:]
+ del d[key]
+ except KeyError:
+ pass
+ else:
+ d.clear()
+
+class ormcache_multi(ormcache):
+ def __init__(self, skiparg=2, size=8192, multi=3):
+ super(ormcache_multi,self).__init__(skiparg,size)
+ self.multi = multi - 2
+
+ def lookup(self, self2, cr, *args):
+ d = self.lru(self2)
+ args = list(args)
+ multi = self.multi
+ ids = args[multi]
+ r = {}
+ miss = []
+
+ for i in ids:
+ args[multi] = i
+ key = tuple(args[self.skiparg-2:])
+ try:
+ r[i] = d[key]
+ self.stat_hit += 1
+ except Exception:
+ self.stat_miss += 1
+ miss.append(i)
+
+ if miss:
+ args[multi] = miss
+ r.update(self.method(self2, cr, *args))
+
+ for i in miss:
+ args[multi] = i
+ key = tuple(args[self.skiparg-2:])
+ d[key] = r[i]
+
+ return r
+
+class dummy_cache(object):
+ """ Cache decorator replacement to actually do no caching.
+ """
+ def __init__(self, *l, **kw):
+ pass
+ def __call__(self, fn):
+ fn.clear_cache = self.clear
+ return fn
+ def clear(self, *l, **kw):
+ pass
+
+if __name__ == '__main__':
+
+ class A():
+ @ormcache()
+ def m(self,a,b):
+ print "A::m(", self,a,b
+ return 1
+
+ @ormcache_multi(multi=3)
+ def n(self,cr,uid,ids):
+ print "m", self,cr,uid,ids
+ return dict([(i,i) for i in ids])
+
+ a=A()
+ r=a.m(1,2)
+ r=a.m(1,2)
+ r=a.n("cr",1,[1,2,3,4])
+ r=a.n("cr",1,[1,2])
+ print r
+ for i in a._ormcache:
+ print a._ormcache[i].d
+ a.n.clear_cache(a,1,1)
+ r=a.n("cr",1,[1,2])
+ print r
+ r=a.n("cr",1,[1,2])
+
+# For backward compatibility
+cache = ormcache
diff --git a/openerp/tools/lru.py b/openerp/tools/lru.py
index 190fe5e4ff6..aa7b14a745c 100644
--- a/openerp/tools/lru.py
+++ b/openerp/tools/lru.py
@@ -12,7 +12,7 @@ class LRUNode(object):
self.me = me
self.next = None
-class LRU:
+class LRU(object):
"""
Implementation of a length-limited O(1) LRU queue.
Built for and used by PyPE:
@@ -113,3 +113,8 @@ class LRU:
del self[key]
return v
+ @synchronized()
+ def clear(self):
+ self.d = {}
+ self.first = None
+ self.last = None
diff --git a/openerp/tools/misc.py b/openerp/tools/misc.py
index 20f168f11ab..b1d23e74630 100644
--- a/openerp/tools/misc.py
+++ b/openerp/tools/misc.py
@@ -60,7 +60,7 @@ except ImportError:
import openerp.loglevels as loglevels
from config import config
-from lru import LRU
+from cache import *
# get_encodings, ustr and exception_to_unicode were originally from tools.misc.
# There are moved to loglevels until we refactor tools.
@@ -628,7 +628,6 @@ class UpdateableDict(local):
def __ne__(self, y):
return self.dict.__ne__(y)
-
class currency(float):
""" Deprecate
@@ -650,163 +649,6 @@ class currency(float):
# display_value = int(self*(10**(-self.accuracy))/self.rounding)*self.rounding/(10**(-self.accuracy))
# return str(display_value)
-
-def is_hashable(h):
- try:
- hash(h)
- return True
- except TypeError:
- return False
-
-class dummy_cache(object):
- """ Cache decorator replacement to actually do no caching.
-
- This can be useful to benchmark and/or track memory leak.
-
- """
-
- def __init__(self, timeout=None, skiparg=2, multi=None, size=8192):
- pass
-
- def clear(self, dbname, *args, **kwargs):
- pass
-
- @classmethod
- def clean_caches_for_db(cls, dbname):
- pass
-
- def __call__(self, fn):
- fn.clear_cache = self.clear
- return fn
-
-class real_cache(object):
- """
- Use it as a decorator of the function you plan to cache
- Timeout: 0 = no timeout, otherwise in seconds
- """
-
- __caches = []
-
- def __init__(self, timeout=None, skiparg=2, multi=None, size=8192):
- assert skiparg >= 2 # at least self and cr
- if timeout is None:
- self.timeout = config['cache_timeout']
- else:
- self.timeout = timeout
- self.skiparg = skiparg
- self.multi = multi
- self.lasttime = time.time()
- self.cache = LRU(size) # TODO take size from config
- self.fun = None
- cache.__caches.append(self)
-
-
- def _generate_keys(self, dbname, kwargs2):
- """
- Generate keys depending of the arguments and the self.mutli value
- """
-
- def to_tuple(d):
- pairs = d.items()
- pairs.sort(key=lambda (k,v): k)
- for i, (k, v) in enumerate(pairs):
- if isinstance(v, dict):
- pairs[i] = (k, to_tuple(v))
- if isinstance(v, (list, set)):
- pairs[i] = (k, tuple(v))
- elif not is_hashable(v):
- pairs[i] = (k, repr(v))
- return tuple(pairs)
-
- if not self.multi:
- key = (('dbname', dbname),) + to_tuple(kwargs2)
- yield key, None
- else:
- multis = kwargs2[self.multi][:]
- for id in multis:
- kwargs2[self.multi] = (id,)
- key = (('dbname', dbname),) + to_tuple(kwargs2)
- yield key, id
-
- def _unify_args(self, *args, **kwargs):
- # Update named arguments with positional argument values (without self and cr)
- kwargs2 = self.fun_default_values.copy()
- kwargs2.update(kwargs)
- kwargs2.update(dict(zip(self.fun_arg_names, args[self.skiparg-2:])))
- return kwargs2
-
- def clear(self, dbname, *args, **kwargs):
- """clear the cache for database dbname
- if *args and **kwargs are both empty, clear all the keys related to this database
- """
- if not args and not kwargs:
- keys_to_del = [key for key in self.cache.keys() if key[0][1] == dbname]
- else:
- kwargs2 = self._unify_args(*args, **kwargs)
- keys_to_del = [key for key, _ in self._generate_keys(dbname, kwargs2) if key in self.cache.keys()]
-
- for key in keys_to_del:
- self.cache.pop(key)
-
- @classmethod
- def clean_caches_for_db(cls, dbname):
- for c in cls.__caches:
- c.clear(dbname)
-
- def __call__(self, fn):
- if self.fun is not None:
- raise Exception("Can not use a cache instance on more than one function")
- self.fun = fn
-
- argspec = inspect.getargspec(fn)
- self.fun_arg_names = argspec[0][self.skiparg:]
- self.fun_default_values = {}
- if argspec[3]:
- self.fun_default_values = dict(zip(self.fun_arg_names[-len(argspec[3]):], argspec[3]))
-
- def cached_result(self2, cr, *args, **kwargs):
- if time.time()-int(self.timeout) > self.lasttime:
- self.lasttime = time.time()
- t = time.time()-int(self.timeout)
- old_keys = [key for key in self.cache.keys() if self.cache[key][1] < t]
- for key in old_keys:
- self.cache.pop(key)
-
- kwargs2 = self._unify_args(*args, **kwargs)
-
- result = {}
- notincache = {}
- for key, id in self._generate_keys(cr.dbname, kwargs2):
- if key in self.cache:
- result[id] = self.cache[key][0]
- else:
- notincache[id] = key
-
- if notincache:
- if self.multi:
- kwargs2[self.multi] = notincache.keys()
-
- result2 = fn(self2, cr, *args[:self.skiparg-2], **kwargs2)
- if not self.multi:
- key = notincache[None]
- self.cache[key] = (result2, time.time())
- result[None] = result2
- else:
- for id in result2:
- key = notincache[id]
- self.cache[key] = (result2[id], time.time())
- result.update(result2)
-
- if not self.multi:
- return result[None]
- return result
-
- cached_result.clear_cache = self.clear
- return cached_result
-
-# TODO make it an option
-cache = real_cache
-
def to_xml(s):
return s.replace('&','&').replace('<','<').replace('>','>')
diff --git a/openerp/tools/translate.py b/openerp/tools/translate.py
index 4b9adb144bd..277965c5449 100644
--- a/openerp/tools/translate.py
+++ b/openerp/tools/translate.py
@@ -458,7 +458,8 @@ def trans_export(lang, modules, buffer, format, cr):
tar.close()
else:
- raise Exception(_('Bad file format'))
+ raise Exception(_('Unrecognized extension: must be one of '
+ '.csv, .po, or .tgz (received .%s).' % format))
newlang = not bool(lang)
if newlang: