[MERGE]with main branch
bzr revid: jpr@tinyerp.com-20140415053250-r784vpfu9x8gnfll bzr revid: jpr@tinyerp.com-20140424045737-h6pshjslqw8xqyvm
This commit is contained in:
commit
39312207d7
|
@ -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: 2014-03-28 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:37+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:26+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:38+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:38+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:38+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:40+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
"X-Poedit-Language: Czech\n"
|
||||
|
||||
#. module: base
|
||||
|
|
|
@ -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: 2014-03-28 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:40+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:30+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:42+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:30+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:42+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
"X-Poedit-Country: GREECE\n"
|
||||
"X-Poedit-Language: Greek\n"
|
||||
"X-Poedit-SourceCharset: utf-8\n"
|
||||
|
|
|
@ -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: 2014-03-28 05:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:36+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:38+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:40+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
"Language: \n"
|
||||
|
||||
#. module: base
|
||||
|
|
|
@ -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: 2014-03-28 05:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:54+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:40+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:54+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:54+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:38+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:51+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:29+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:40+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:34+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
|
||||
"X-Poedit-Language: Persian\n"
|
||||
|
||||
|
|
|
@ -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: 2014-03-28 05:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:55+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:29+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:29+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:30+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:42+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:30+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:42+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:31+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:31+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:35+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
"Language: hr\n"
|
||||
|
||||
#. module: base
|
||||
|
|
|
@ -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: 2014-03-28 05:31+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:38+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:31+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:31+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:43+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:32+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:32+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:29+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:32+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:33+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:33+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:33+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:33+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:45+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:34+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:34+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:46+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:28+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:40+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:34+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:34+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:38+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:51+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:35+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:47+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:35+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:36+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:36+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:27+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:38+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:35+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:48+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:41+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:55+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:36+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:49+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:37+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:37+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:37+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:37+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:37+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:37+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:51+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:40+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:54+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:38+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:51+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -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: 2014-03-28 05:40+0000\n"
|
||||
"X-Generator: Launchpad (build 16967)\n"
|
||||
"X-Launchpad-Export-Date: 2014-04-17 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 16985)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_account_check_writing
|
||||
|
|
|
@ -104,7 +104,9 @@ class ir_actions_report_xml(osv.osv):
|
|||
cr.execute("SELECT * FROM ir_act_report_xml WHERE report_name=%s", (name,))
|
||||
r = cr.dictfetchone()
|
||||
if r:
|
||||
if r['report_rml'] or r['report_rml_content_data']:
|
||||
if r['report_type'] in ['qweb-pdf', 'qweb-html']:
|
||||
return r['report_name']
|
||||
elif r['report_rml'] or r['report_rml_content_data']:
|
||||
if r['parser']:
|
||||
kwargs = { 'parser': operator.attrgetter(r['parser'])(openerp.addons) }
|
||||
else:
|
||||
|
@ -127,7 +129,11 @@ class ir_actions_report_xml(osv.osv):
|
|||
Look up a report definition and render the report for the provided IDs.
|
||||
"""
|
||||
new_report = self._lookup_report(cr, name)
|
||||
return new_report.create(cr, uid, res_ids, data, context)
|
||||
# in order to use current yml test files with qweb reports
|
||||
if isinstance(new_report, (str, unicode)):
|
||||
return self.pool['report'].get_pdf(cr, uid, res_ids, new_report, data=data, context=context), 'pdf'
|
||||
else:
|
||||
return new_report.create(cr, uid, res_ids, data, context)
|
||||
|
||||
_name = 'ir.actions.report.xml'
|
||||
_inherit = 'ir.actions.actions'
|
||||
|
@ -944,7 +950,8 @@ class ir_actions_server(osv.osv):
|
|||
'uid': uid,
|
||||
'user': user,
|
||||
'context': context,
|
||||
'workflow': workflow
|
||||
'workflow': workflow,
|
||||
'Warning': openerp.exceptions.Warning,
|
||||
}
|
||||
|
||||
def run(self, cr, uid, ids, context=None):
|
||||
|
|
|
@ -26,6 +26,8 @@ import os
|
|||
import re
|
||||
|
||||
from openerp import tools
|
||||
from openerp.tools.translate import _
|
||||
from openerp.exceptions import AccessError
|
||||
from openerp.osv import fields,osv
|
||||
from openerp import SUPERUSER_ID
|
||||
|
||||
|
@ -71,33 +73,49 @@ class ir_attachment(osv.osv):
|
|||
def _filestore(self, cr, uid, context=None):
|
||||
return tools.config.filestore(cr.dbname)
|
||||
|
||||
def force_storage(self, cr, uid, context=None):
|
||||
"""Force all attachments to be stored in the currently configured storage"""
|
||||
if not self.pool['res.users'].has_group(cr, uid, 'base.group_erp_manager'):
|
||||
raise AccessError(_('Only administrators can execute this action.'))
|
||||
|
||||
location = self._storage(cr, uid, context)
|
||||
domain = {
|
||||
'db': [('store_fname', '!=', False)],
|
||||
'file': [('db_datas', '!=', False)],
|
||||
}[location]
|
||||
|
||||
ids = self.search(cr, uid, domain, context=context)
|
||||
for attach in self.browse(cr, uid, ids, context=context):
|
||||
attach.write({'datas': attach.datas})
|
||||
return True
|
||||
|
||||
# 'data' field implementation
|
||||
def _full_path(self, cr, uid, location, path):
|
||||
def _full_path(self, cr, uid, path):
|
||||
# sanitize ath
|
||||
path = re.sub('[.]', '', path)
|
||||
path = path.strip('/\\')
|
||||
return os.path.join(self._filestore(cr, uid), path)
|
||||
|
||||
def _get_path(self, cr, uid, location, bin_data):
|
||||
def _get_path(self, cr, uid, bin_data):
|
||||
sha = hashlib.sha1(bin_data).hexdigest()
|
||||
|
||||
# retro compatibility
|
||||
fname = sha[:3] + '/' + sha
|
||||
full_path = self._full_path(cr, uid, location, fname)
|
||||
full_path = self._full_path(cr, uid, fname)
|
||||
if os.path.isfile(full_path):
|
||||
return fname, full_path # keep existing path
|
||||
|
||||
# scatter files across 256 dirs
|
||||
# we use '/' in the db (even on windows)
|
||||
fname = sha[:2] + '/' + sha
|
||||
full_path = self._full_path(cr, uid, location, fname)
|
||||
full_path = self._full_path(cr, uid, fname)
|
||||
dirname = os.path.dirname(full_path)
|
||||
if not os.path.isdir(dirname):
|
||||
os.makedirs(dirname)
|
||||
return fname, full_path
|
||||
|
||||
def _file_read(self, cr, uid, location, fname, bin_size=False):
|
||||
full_path = self._full_path(cr, uid, location, fname)
|
||||
def _file_read(self, cr, uid, fname, bin_size=False):
|
||||
full_path = self._full_path(cr, uid, fname)
|
||||
r = ''
|
||||
try:
|
||||
if bin_size:
|
||||
|
@ -108,9 +126,9 @@ class ir_attachment(osv.osv):
|
|||
_logger.error("_read_file reading %s",full_path)
|
||||
return r
|
||||
|
||||
def _file_write(self, cr, uid, location, value):
|
||||
def _file_write(self, cr, uid, value):
|
||||
bin_value = value.decode('base64')
|
||||
fname, full_path = self._get_path(cr, uid, location, bin_value)
|
||||
fname, full_path = self._get_path(cr, uid, bin_value)
|
||||
if not os.path.exists(full_path):
|
||||
try:
|
||||
with open(full_path, 'wb') as fp:
|
||||
|
@ -119,10 +137,10 @@ class ir_attachment(osv.osv):
|
|||
_logger.error("_file_write writing %s", full_path)
|
||||
return fname
|
||||
|
||||
def _file_delete(self, cr, uid, location, fname):
|
||||
def _file_delete(self, cr, uid, fname):
|
||||
count = self.search(cr, 1, [('store_fname','=',fname)], count=True)
|
||||
if count <= 1:
|
||||
full_path = self._full_path(cr, uid, location, fname)
|
||||
full_path = self._full_path(cr, uid, fname)
|
||||
if count <= 1 and os.path.exists(full_path):
|
||||
try:
|
||||
os.unlink(full_path)
|
||||
except OSError:
|
||||
|
@ -135,11 +153,10 @@ class ir_attachment(osv.osv):
|
|||
if context is None:
|
||||
context = {}
|
||||
result = {}
|
||||
location = self._storage(cr, uid, context)
|
||||
bin_size = context.get('bin_size')
|
||||
for attach in self.browse(cr, uid, ids, context=context):
|
||||
if location != 'db' and attach.store_fname:
|
||||
result[attach.id] = self._file_read(cr, uid, location, attach.store_fname, bin_size)
|
||||
if attach.store_fname:
|
||||
result[attach.id] = self._file_read(cr, uid, attach.store_fname, bin_size)
|
||||
else:
|
||||
result[attach.id] = attach.db_datas
|
||||
return result
|
||||
|
@ -152,15 +169,15 @@ class ir_attachment(osv.osv):
|
|||
context = {}
|
||||
location = self._storage(cr, uid, context)
|
||||
file_size = len(value.decode('base64'))
|
||||
attach = self.browse(cr, uid, id, context=context)
|
||||
if attach.store_fname:
|
||||
self._file_delete(cr, uid, attach.store_fname)
|
||||
if location != 'db':
|
||||
attach = self.browse(cr, uid, id, context=context)
|
||||
if attach.store_fname:
|
||||
self._file_delete(cr, uid, location, attach.store_fname)
|
||||
fname = self._file_write(cr, uid, location, value)
|
||||
fname = self._file_write(cr, uid, value)
|
||||
# SUPERUSER_ID as probably don't have write access, trigger during create
|
||||
super(ir_attachment, self).write(cr, SUPERUSER_ID, [id], {'store_fname': fname, 'file_size': file_size}, context=context)
|
||||
super(ir_attachment, self).write(cr, SUPERUSER_ID, [id], {'store_fname': fname, 'file_size': file_size, 'db_datas': False}, context=context)
|
||||
else:
|
||||
super(ir_attachment, self).write(cr, SUPERUSER_ID, [id], {'db_datas': value, 'file_size': file_size}, context=context)
|
||||
super(ir_attachment, self).write(cr, SUPERUSER_ID, [id], {'db_datas': value, 'file_size': file_size, 'store_fname': False}, context=context)
|
||||
return True
|
||||
|
||||
_name = 'ir.attachment'
|
||||
|
@ -298,11 +315,9 @@ class ir_attachment(osv.osv):
|
|||
if isinstance(ids, (int, long)):
|
||||
ids = [ids]
|
||||
self.check(cr, uid, ids, 'unlink', context=context)
|
||||
location = self._storage(cr, uid, context)
|
||||
if location != 'db':
|
||||
for attach in self.browse(cr, uid, ids, context=context):
|
||||
if attach.store_fname:
|
||||
self._file_delete(cr, uid, location, attach.store_fname)
|
||||
for attach in self.browse(cr, uid, ids, context=context):
|
||||
if attach.store_fname:
|
||||
self._file_delete(cr, uid, attach.store_fname)
|
||||
return super(ir_attachment, self).unlink(cr, uid, ids, context)
|
||||
|
||||
def create(self, cr, uid, values, context=None):
|
||||
|
|
|
@ -85,8 +85,8 @@ class ir_http(osv.AbstractModel):
|
|||
return auth_method
|
||||
|
||||
def _handle_exception(self, exception):
|
||||
# If handle exception return something different than None, it will be used as a response
|
||||
raise
|
||||
# If handle_exception returns something different than None, it will be used as a response
|
||||
return request._handle_exception(exception)
|
||||
|
||||
def _dispatch(self):
|
||||
# locate the controller method
|
||||
|
|
|
@ -144,7 +144,7 @@ class QWeb(orm.AbstractModel):
|
|||
"""Add a parsed template in the context. Used to preprocess templates."""
|
||||
qwebcontext.templates[name] = node
|
||||
|
||||
def load_document(self, document, qwebcontext):
|
||||
def load_document(self, document, res_id, qwebcontext):
|
||||
"""
|
||||
Loads an XML document and installs any contained template in the engine
|
||||
"""
|
||||
|
@ -156,9 +156,13 @@ class QWeb(orm.AbstractModel):
|
|||
dom = xml.dom.minidom.parse(document)
|
||||
|
||||
for node in dom.documentElement.childNodes:
|
||||
if node.nodeType == self.node.ELEMENT_NODE and node.getAttribute('t-name'):
|
||||
name = str(node.getAttribute("t-name"))
|
||||
self.add_template(qwebcontext, name, node)
|
||||
if node.nodeType == self.node.ELEMENT_NODE:
|
||||
if node.getAttribute('t-name'):
|
||||
name = str(node.getAttribute("t-name"))
|
||||
self.add_template(qwebcontext, name, node)
|
||||
if res_id and node.tagName == "t":
|
||||
self.add_template(qwebcontext, res_id, node)
|
||||
res_id = None
|
||||
|
||||
def get_template(self, name, qwebcontext):
|
||||
origin_template = qwebcontext.get('__caller__') or qwebcontext['__stack__'][0]
|
||||
|
@ -167,7 +171,7 @@ class QWeb(orm.AbstractModel):
|
|||
xml_doc = qwebcontext.loader(name)
|
||||
except ValueError:
|
||||
raise_qweb_exception(QWebTemplateNotFound, message="Loader could not find template %r" % name, template=origin_template)
|
||||
self.load_document(xml_doc, qwebcontext=qwebcontext)
|
||||
self.load_document(xml_doc, isinstance(name, (int, long)) and name or None, qwebcontext=qwebcontext)
|
||||
|
||||
if name in qwebcontext.templates:
|
||||
return qwebcontext.templates[name]
|
||||
|
@ -241,7 +245,7 @@ class QWeb(orm.AbstractModel):
|
|||
if attribute_name == "groups":
|
||||
cr = qwebcontext.get('request') and qwebcontext['request'].cr or None
|
||||
uid = qwebcontext.get('request') and qwebcontext['request'].uid or None
|
||||
can_see = self.user_has_groups(cr, uid, groups=attribute_value)
|
||||
can_see = self.user_has_groups(cr, uid, groups=attribute_value) if cr and uid else False
|
||||
if not can_see:
|
||||
return ''
|
||||
continue
|
||||
|
@ -332,7 +336,9 @@ class QWeb(orm.AbstractModel):
|
|||
return self.render_element(element, template_attributes, generated_attributes, qwebcontext, inner)
|
||||
|
||||
def render_tag_esc(self, element, template_attributes, generated_attributes, qwebcontext):
|
||||
inner = werkzeug.utils.escape(self.eval_str(template_attributes["esc"], qwebcontext))
|
||||
options = json.loads(template_attributes.get('esc-options') or '{}')
|
||||
widget = self.get_widget_for(options.get('widget', ''))
|
||||
inner = widget.format(template_attributes['esc'], options, qwebcontext)
|
||||
return self.render_element(element, template_attributes, generated_attributes, qwebcontext, inner)
|
||||
|
||||
def render_tag_foreach(self, element, template_attributes, generated_attributes, qwebcontext):
|
||||
|
@ -383,7 +389,12 @@ class QWeb(orm.AbstractModel):
|
|||
cr = d.get('request') and d['request'].cr or None
|
||||
uid = d.get('request') and d['request'].uid or None
|
||||
|
||||
return self.render(cr, uid, self.eval_format(template_attributes["call"], d), d)
|
||||
template = self.eval_format(template_attributes["call"], d)
|
||||
try:
|
||||
template = int(template)
|
||||
except ValueError:
|
||||
pass
|
||||
return self.render(cr, uid, template, d)
|
||||
|
||||
def render_tag_set(self, element, template_attributes, generated_attributes, qwebcontext):
|
||||
if "value" in template_attributes:
|
||||
|
@ -416,8 +427,10 @@ class QWeb(orm.AbstractModel):
|
|||
element, template_attributes, generated_attributes, qwebcontext, context=qwebcontext.context)
|
||||
|
||||
def get_converter_for(self, field_type):
|
||||
return self.pool.get('ir.qweb.field.' + field_type,
|
||||
self.pool['ir.qweb.field'])
|
||||
return self.pool.get('ir.qweb.field.' + field_type, self.pool['ir.qweb.field'])
|
||||
|
||||
def get_widget_for(self, widget):
|
||||
return self.pool.get('ir.qweb.widget.' + widget, self.pool['ir.qweb.widget'])
|
||||
|
||||
#--------------------------------------------------------------------
|
||||
# QWeb Fields converters
|
||||
|
@ -603,7 +616,7 @@ class DateTimeConverter(osv.AbstractModel):
|
|||
if isinstance(value, basestring):
|
||||
value = datetime.datetime.strptime(
|
||||
value, openerp.tools.DEFAULT_SERVER_DATETIME_FORMAT)
|
||||
value = column.context_timestamp(
|
||||
value = fields.datetime.context_timestamp(
|
||||
cr, uid, timestamp=value, context=context)
|
||||
|
||||
if options and 'format' in options:
|
||||
|
@ -814,6 +827,8 @@ class Contact(orm.AbstractModel):
|
|||
_inherit = 'ir.qweb.field.many2one'
|
||||
|
||||
def record_to_html(self, cr, uid, field_name, record, column, options=None, context=None):
|
||||
if options is None:
|
||||
options = {}
|
||||
opf = options.get('fields') or ["name", "address", "phone", "mobile", "fax", "email"]
|
||||
|
||||
if not getattr(record, field_name):
|
||||
|
@ -833,6 +848,7 @@ class Contact(orm.AbstractModel):
|
|||
'country_id': field_browse.country_id and field_browse.country_id.name_get()[0][1],
|
||||
'email': field_browse.email,
|
||||
'fields': opf,
|
||||
'object': field_browse,
|
||||
'options': options
|
||||
}
|
||||
|
||||
|
@ -840,6 +856,58 @@ class Contact(orm.AbstractModel):
|
|||
|
||||
return HTMLSafe(html)
|
||||
|
||||
class QwebView(orm.AbstractModel):
|
||||
_name = 'ir.qweb.field.qweb'
|
||||
_inherit = 'ir.qweb.field.many2one'
|
||||
|
||||
def record_to_html(self, cr, uid, field_name, record, column, options=None, context=None):
|
||||
if not getattr(record, field_name):
|
||||
return None
|
||||
|
||||
view = getattr(record, field_name)
|
||||
|
||||
if view._model._name != "ir.ui.view":
|
||||
_logger.warning("%s.%s must be a 'ir.ui.view' model." % (record, field_name))
|
||||
return None
|
||||
|
||||
ctx = (context or {}).copy()
|
||||
ctx['object'] = record
|
||||
html = view.render(ctx, engine='ir.qweb', context=ctx).decode('utf8')
|
||||
|
||||
return HTMLSafe(html)
|
||||
|
||||
class QwebWidget(osv.AbstractModel):
|
||||
_name = 'ir.qweb.widget'
|
||||
|
||||
def _format(self, inner, options, qwebcontext):
|
||||
return self.pool['ir.qweb'].eval_str(inner, qwebcontext)
|
||||
|
||||
def format(self, inner, options, qwebcontext):
|
||||
return werkzeug.utils.escape(self._format(inner, options, qwebcontext))
|
||||
|
||||
class QwebWidgetMonetary(osv.AbstractModel):
|
||||
_name = 'ir.qweb.widget.monetary'
|
||||
_inherit = 'ir.qweb.widget'
|
||||
|
||||
def _format(self, inner, options, qwebcontext):
|
||||
inner = self.pool['ir.qweb'].eval(inner, qwebcontext)
|
||||
display = self.pool['ir.qweb'].eval_object(options['display_currency'], qwebcontext)
|
||||
precision = int(round(math.log10(display.rounding)))
|
||||
fmt = "%.{0}f".format(-precision if precision < 0 else 0)
|
||||
lang_code = qwebcontext.context.get('lang') or 'en_US'
|
||||
formatted_amount = self.pool['res.lang'].format(
|
||||
qwebcontext.cr, qwebcontext.uid, [lang_code], fmt, inner, grouping=True, monetary=True
|
||||
)
|
||||
pre = post = u''
|
||||
if display.position == 'before':
|
||||
pre = u'{symbol} '
|
||||
else:
|
||||
post = u' {symbol}'
|
||||
|
||||
return u'{pre}{0}{post}'.format(
|
||||
formatted_amount, pre=pre, post=post
|
||||
).format(symbol=display.symbol,)
|
||||
|
||||
class HTMLSafe(object):
|
||||
""" HTMLSafe string wrapper, Werkzeug's escape() has special handling for
|
||||
objects with a ``__html__`` methods but AFAIK does not provide any such
|
||||
|
|
|
@ -2,7 +2,12 @@
|
|||
<data>
|
||||
<template id="contact">
|
||||
<address t-ignore="true" class="mb0" itemscope="itemscope" itemtype="http://schema.org/Organization">
|
||||
<div t-att-class="'name' not in fields and 'css_non_editable_mode_hidden'"><span itemprop="name" t-esc="name"/></div>
|
||||
<div t-att-class="'name' not in fields and 'css_non_editable_mode_hidden'">
|
||||
<span itemprop="name" t-esc="name"/>
|
||||
<t t-if="options.get('country_image') and 'country_id' in fields and object.country_id and object.country_id.image">
|
||||
<span t-field="object.country_id.image" t-field-options='{"widget": "image", "class": "country_flag"}'/>
|
||||
</t>
|
||||
</div>
|
||||
<div itemprop="address" itemscope="itemscope" itemtype="http://schema.org/PostalAddress">
|
||||
<div t-if="address and 'address' in fields" class='css_editable_mode_hidden'>
|
||||
<i t-if="not options.get('no_marker')" class='fa fa-map-marker'/> <span itemprop="streetAddress" t-raw="address.replace('\n', options.get('no_tag_br') and ', ' or ('<br/>%s' % ('' if options.get('no_marker') else '&nbsp; &nbsp; ')))"/>
|
||||
|
|
|
@ -78,12 +78,18 @@ class view_custom(osv.osv):
|
|||
class view(osv.osv):
|
||||
_name = 'ir.ui.view'
|
||||
|
||||
def _get_model_data(self, cr, uid, ids, *args, **kwargs):
|
||||
ir_model_data = self.pool.get('ir.model.data')
|
||||
data_ids = ir_model_data.search(cr, uid, [('model', '=', self._name), ('res_id', 'in', ids)])
|
||||
result = dict(zip(ids, data_ids))
|
||||
def _get_model_data(self, cr, uid, ids, fname, args, context=None):
|
||||
result = dict.fromkeys(ids, False)
|
||||
IMD = self.pool['ir.model.data']
|
||||
data_ids = IMD.search_read(cr, uid, [('res_id', 'in', ids), ('model', '=', 'ir.ui.view')], ['res_id'], context=context)
|
||||
result.update(map(itemgetter('res_id', 'id'), data_ids))
|
||||
return result
|
||||
|
||||
def _views_from_model_data(self, cr, uid, ids, context=None):
|
||||
IMD = self.pool['ir.model.data']
|
||||
data_ids = IMD.search_read(cr, uid, [('id', 'in', ids), ('model', '=', 'ir.ui.view')], ['res_id'], context=context)
|
||||
return map(itemgetter('res_id'), data_ids)
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('View Name', required=True),
|
||||
'model': fields.char('Object', select=True),
|
||||
|
@ -102,7 +108,11 @@ class view(osv.osv):
|
|||
'inherit_id': fields.many2one('ir.ui.view', 'Inherited View', ondelete='cascade', select=True),
|
||||
'inherit_children_ids': fields.one2many('ir.ui.view','inherit_id', 'Inherit Views'),
|
||||
'field_parent': fields.char('Child Field'),
|
||||
'model_data_id': fields.function(_get_model_data, type='many2one', relation='ir.model.data', string="Model Data", store=True),
|
||||
'model_data_id': fields.function(_get_model_data, type='many2one', relation='ir.model.data', string="Model Data",
|
||||
store={
|
||||
_name: (lambda s, c, u, i, ctx=None: i, None, 10),
|
||||
'ir.model.data': (_views_from_model_data, ['model', 'res_id'], 10),
|
||||
}),
|
||||
'xml_id': fields.function(osv.osv.get_xml_id, type='char', size=128, string="External ID",
|
||||
help="ID of the view defined in xml file"),
|
||||
'groups_id': fields.many2many('res.groups', 'ir_ui_view_group_rel', 'view_id', 'group_id',
|
||||
|
@ -693,6 +703,16 @@ class view(osv.osv):
|
|||
for action, operation in (('create', 'create'), ('delete', 'unlink'), ('edit', 'write')):
|
||||
if not node.get(action) and not Model.check_access_rights(cr, user, operation, raise_exception=False):
|
||||
node.set(action, 'false')
|
||||
if node.tag in ('kanban'):
|
||||
group_by_field = node.get('default_group_by')
|
||||
if group_by_field and Model._all_columns.get(group_by_field):
|
||||
group_by_column = Model._all_columns[group_by_field].column
|
||||
if group_by_column._type == 'many2one':
|
||||
group_by_model = Model.pool.get(group_by_column._obj)
|
||||
for action, operation in (('group_create', 'create'), ('group_delete', 'unlink'), ('group_edit', 'write')):
|
||||
if not node.get(action) and not group_by_model.check_access_rights(cr, user, operation, raise_exception=False):
|
||||
node.set(action, 'false')
|
||||
|
||||
arch = etree.tostring(node, encoding="utf-8").replace('\t', '')
|
||||
for k in fields.keys():
|
||||
if k not in fields_def:
|
||||
|
@ -714,10 +734,13 @@ class view(osv.osv):
|
|||
#------------------------------------------------------
|
||||
@tools.ormcache_context(accepted_keys=('lang','inherit_branding', 'editable', 'translatable'))
|
||||
def read_template(self, cr, uid, xml_id, context=None):
|
||||
if '.' not in xml_id:
|
||||
raise ValueError('Invalid template id: %r' % (xml_id,))
|
||||
if isinstance(xml_id, (int, long)):
|
||||
view_id = xml_id
|
||||
else:
|
||||
if '.' not in xml_id:
|
||||
raise ValueError('Invalid template id: %r' % (xml_id,))
|
||||
view_id = self.pool['ir.model.data'].xmlid_to_res_id(cr, uid, xml_id, raise_if_not_found=True)
|
||||
|
||||
view_id = self.pool['ir.model.data'].xmlid_to_res_id(cr, uid, xml_id, raise_if_not_found=True)
|
||||
arch = self.read_combined(cr, uid, view_id, fields=['arch'], context=context)['arch']
|
||||
arch_tree = etree.fromstring(arch)
|
||||
|
||||
|
@ -842,9 +865,6 @@ class view(osv.osv):
|
|||
def render(self, cr, uid, id_or_xml_id, values=None, engine='ir.qweb', context=None):
|
||||
if isinstance(id_or_xml_id, list):
|
||||
id_or_xml_id = id_or_xml_id[0]
|
||||
tname = id_or_xml_id
|
||||
if isinstance(tname, (int, long)):
|
||||
tname = self.get_view_xmlid(cr, uid, tname)
|
||||
|
||||
if not context:
|
||||
context = {}
|
||||
|
@ -862,7 +882,7 @@ class view(osv.osv):
|
|||
def loader(name):
|
||||
return self.read_template(cr, uid, name, context=context)
|
||||
|
||||
return self.pool[engine].render(cr, uid, tname, qcontext, loader=loader, context=context)
|
||||
return self.pool[engine].render(cr, uid, id_or_xml_id, qcontext, loader=loader, context=context)
|
||||
|
||||
#------------------------------------------------------
|
||||
# Misc
|
||||
|
@ -950,4 +970,18 @@ class view(osv.osv):
|
|||
ids = map(itemgetter(0), cr.fetchall())
|
||||
return self._check_xml(cr, uid, ids)
|
||||
|
||||
def _validate_module_views(self, cr, uid, module):
|
||||
"""Validate architecture of all the views of a given module"""
|
||||
assert not self.pool._init or module in self.pool._init_modules
|
||||
cr.execute("""SELECT max(v.id)
|
||||
FROM ir_ui_view v
|
||||
LEFT JOIN ir_model_data md ON (md.model = 'ir.ui.view' AND md.res_id = v.id)
|
||||
WHERE md.module = %s
|
||||
GROUP BY coalesce(v.inherit_id, v.id)
|
||||
""", (module,))
|
||||
|
||||
for vid, in cr.fetchall():
|
||||
if not self._check_xml(cr, uid, [vid]):
|
||||
self.raise_view_error(cr, uid, "Can't validate view", vid)
|
||||
|
||||
# vim:et:
|
||||
|
|
|
@ -31,6 +31,7 @@ import shutil
|
|||
import tempfile
|
||||
import urllib
|
||||
import urllib2
|
||||
import urlparse
|
||||
import zipfile
|
||||
import zipimport
|
||||
import lxml.html
|
||||
|
@ -41,6 +42,7 @@ except ImportError:
|
|||
from StringIO import StringIO # NOQA
|
||||
|
||||
import openerp
|
||||
import openerp.exceptions
|
||||
from openerp import modules, tools
|
||||
from openerp.modules.db import create_categories
|
||||
from openerp.modules import get_module_resource
|
||||
|
@ -630,40 +632,14 @@ class module(osv.osv):
|
|||
return res
|
||||
|
||||
def download(self, cr, uid, ids, download=True, context=None):
|
||||
res = []
|
||||
default_version = modules.adapt_version('1.0')
|
||||
for mod in self.browse(cr, uid, ids, context=context):
|
||||
if not mod.url:
|
||||
continue
|
||||
match = re.search('-([a-zA-Z0-9\._-]+)(\.zip)', mod.url, re.I)
|
||||
version = default_version
|
||||
if match:
|
||||
version = match.group(1)
|
||||
if parse_version(mod.installed_version) >= parse_version(version):
|
||||
continue
|
||||
res.append(mod.url)
|
||||
if not download:
|
||||
continue
|
||||
zip_content = urllib.urlopen(mod.url).read()
|
||||
fname = modules.get_module_path(str(mod.name) + '.zip', downloaded=True)
|
||||
try:
|
||||
with open(fname, 'wb') as fp:
|
||||
fp.write(zip_content)
|
||||
except Exception:
|
||||
_logger.exception('Error when trying to create module '
|
||||
'file %s', fname)
|
||||
raise orm.except_orm(_('Error'), _('Can not create the module file:\n %s') % (fname,))
|
||||
terp = self.get_module_info(mod.name)
|
||||
self.write(cr, uid, mod.id, self.get_values_from_terp(terp))
|
||||
cr.execute('DELETE FROM ir_module_module_dependency WHERE module_id = %s', (mod.id,))
|
||||
self._update_dependencies(cr, uid, mod, terp.get('depends', []))
|
||||
self._update_category(cr, uid, mod, terp.get('category', 'Uncategorized'))
|
||||
# Import module
|
||||
zimp = zipimport.zipimporter(fname)
|
||||
zimp.load_module(mod.name)
|
||||
return res
|
||||
return []
|
||||
|
||||
def install_from_urls(self, cr, uid, urls, context=None):
|
||||
if not self.pool['res.users'].has_group(cr, uid, 'base.group_system'):
|
||||
raise openerp.exceptions.AccessDenied()
|
||||
|
||||
apps_server = urlparse.urlparse(self.get_apps_server(cr, uid, context=context))
|
||||
|
||||
OPENERP = 'openerp'
|
||||
tmp = tempfile.mkdtemp()
|
||||
_logger.debug('Install from url: %r', urls)
|
||||
|
@ -672,6 +648,11 @@ class module(osv.osv):
|
|||
for module_name, url in urls.items():
|
||||
if not url:
|
||||
continue # nothing to download, local version is already the last one
|
||||
|
||||
up = urlparse.urlparse(url)
|
||||
if up.scheme != apps_server.scheme or up.netloc != apps_server.netloc:
|
||||
raise openerp.exceptions.AccessDenied()
|
||||
|
||||
try:
|
||||
_logger.info('Downloading module `%s` from OpenERP Apps', module_name)
|
||||
content = urllib2.urlopen(url).read()
|
||||
|
@ -736,8 +717,8 @@ class module(osv.osv):
|
|||
finally:
|
||||
shutil.rmtree(tmp)
|
||||
|
||||
def install_by_names(self, cr, uid, names, context=None):
|
||||
raise NotImplementedError('# TODO')
|
||||
def get_apps_server(self, cr, uid, context=None):
|
||||
return tools.config.get('apps_server', 'https://apps.openerp.com/apps')
|
||||
|
||||
def _update_dependencies(self, cr, uid, mod_browse, depends=None):
|
||||
if depends is None:
|
||||
|
|
|
@ -85,12 +85,6 @@
|
|||
<field name="sequence">11</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.module.category" id="module_category_survey">
|
||||
<field name="name">Survey</field>
|
||||
<field name="description">Lets you create, send, share and answer to surveys.</field>
|
||||
<field name="sequence">11</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.module.category" id="module_category_marketing">
|
||||
<field name="name">Marketing</field>
|
||||
<field name="description">Helps you manage your marketing campaigns step by step.</field>
|
||||
|
|
|
@ -74,6 +74,7 @@
|
|||
<field name="code"/>
|
||||
</group>
|
||||
<field name="field_ids"/>
|
||||
<label for="format_layout"/>
|
||||
<field name="format_layout"/>
|
||||
</form>
|
||||
</field>
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
<field name="code"/>
|
||||
</group>
|
||||
</group>
|
||||
<label for="address_format"/>
|
||||
<field name="address_format" groups="base.group_no_one" placeholder="Address format..."/>
|
||||
</form>
|
||||
</field>
|
||||
|
|
|
@ -58,7 +58,8 @@ class res_currency(osv.osv):
|
|||
elif not raise_on_no_rate:
|
||||
res[id] = 0
|
||||
else:
|
||||
raise osv.except_osv(_('Error!'),_("No currency rate associated for currency %d for the given period" % (id)))
|
||||
currency = self.browse(cr, uid, id, context=context)
|
||||
raise osv.except_osv(_('Error!'),_("No currency rate associated for currency '%s' for the given period" % (currency.name)))
|
||||
return res
|
||||
|
||||
_name = "res.currency"
|
||||
|
|
|
@ -37,6 +37,23 @@ and Ubuntu distros, we have to override the search path, too.
|
|||
"""
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
# Alternatives for the [broken] builtin PDF fonts. Default order chosen to match
|
||||
# the pre-v8 mapping from openerp.report.render.rml2pdf.customfonts.CustomTTFonts.
|
||||
# Format: [ (BuiltinFontFamily, mode, [AlternativeFontName, ...]), ...]
|
||||
BUILTIN_ALTERNATIVES = [
|
||||
('Helvetica', "normal", ["DejaVuSans", "LiberationSans"]),
|
||||
('Helvetica', "bold", ["DejaVuSans-Bold", "LiberationSans-Bold"]),
|
||||
('Helvetica', 'italic', ["DejaVuSans-Oblique", "LiberationSans-Italic"]),
|
||||
('Helvetica', 'bolditalic', ["DejaVuSans-BoldOblique", "LiberationSans-BoldItalic"]),
|
||||
('Times', 'normal', ["LiberationSerif", "DejaVuSerif"]),
|
||||
('Times', 'bold', ["LiberationSerif-Bold", "DejaVuSerif-Bold"]),
|
||||
('Times', 'italic', ["LiberationSerif-Italic", "DejaVuSerif-Italic"]),
|
||||
('Times', 'bolditalic', ["LiberationSerif-BoldItalic", "DejaVuSerif-BoldItalic"]),
|
||||
('Courier', 'normal', ["FreeMono", "DejaVuSansMono"]),
|
||||
('Courier', 'bold', ["FreeMonoBold", "DejaVuSansMono-Bold"]),
|
||||
('Courier', 'italic', ["FreeMonoOblique", "DejaVuSansMono-Oblique"]),
|
||||
('Courier', 'bolditalic', ["FreeMonoBoldOblique", "DejaVuSansMono-BoldOblique"]),
|
||||
]
|
||||
|
||||
class res_font(osv.Model):
|
||||
_name = "res.font"
|
||||
|
@ -113,9 +130,32 @@ class res_font(osv.Model):
|
|||
def _sync(self, cr, uid, context=None):
|
||||
"""Set the customfonts.CustomTTFonts list to the content of the database"""
|
||||
customfonts.CustomTTFonts = []
|
||||
local_family_modes = set()
|
||||
local_font_paths = {}
|
||||
found_fonts_ids = self.search(cr, uid, [('path', '!=', '/dev/null')], context=context)
|
||||
for font in self.browse(cr, uid, found_fonts_ids, context=None):
|
||||
local_family_modes.add((font.family, font.mode))
|
||||
local_font_paths[font.name] = font.path
|
||||
customfonts.CustomTTFonts.append((font.family, font.name, font.path, font.mode))
|
||||
|
||||
# Attempt to remap the builtin fonts (Helvetica, Times, Courier) to better alternatives
|
||||
# if available, because they only support a very small subset of unicode
|
||||
# (missing 'č' for example)
|
||||
for builtin_font_family, mode, alts in BUILTIN_ALTERNATIVES:
|
||||
if (builtin_font_family, mode) not in local_family_modes:
|
||||
# No local font exists with that name, try alternatives
|
||||
for altern_font in alts:
|
||||
if local_font_paths.get(altern_font):
|
||||
altern_def = (builtin_font_family, altern_font,
|
||||
local_font_paths[altern_font], mode)
|
||||
customfonts.CustomTTFonts.append(altern_def)
|
||||
_logger.debug("Builtin remapping %r", altern_def)
|
||||
break
|
||||
else:
|
||||
_logger.warning("No local alternative found for builtin font `%s` (%s mode)."
|
||||
"Consider installing the DejaVu fonts if you have problems "
|
||||
"with unicode characters in RML reports",
|
||||
builtin_font_family, mode)
|
||||
return True
|
||||
|
||||
def clear_caches(self):
|
||||
|
|
|
@ -28,6 +28,7 @@ import openerp
|
|||
from openerp import SUPERUSER_ID
|
||||
from openerp import tools
|
||||
from openerp.osv import osv, fields
|
||||
from openerp.osv.expression import get_unaccent_wrapper
|
||||
from openerp.tools.translate import _
|
||||
|
||||
class format_address(object):
|
||||
|
@ -228,12 +229,12 @@ class res_partner(osv.osv, format_address):
|
|||
_order = "display_name"
|
||||
_columns = {
|
||||
'name': fields.char('Name', size=128, required=True, select=True),
|
||||
'display_name': fields.function(_display_name, type='char', string='Name', store=_display_name_store_triggers),
|
||||
'display_name': fields.function(_display_name, type='char', string='Name', store=_display_name_store_triggers, select=True),
|
||||
'date': fields.date('Date', select=1),
|
||||
'title': fields.many2one('res.partner.title', 'Title'),
|
||||
'parent_id': fields.many2one('res.partner', 'Related Company'),
|
||||
'parent_id': fields.many2one('res.partner', 'Related Company', select=True),
|
||||
'child_ids': fields.one2many('res.partner', 'parent_id', 'Contacts', domain=[('active','=',True)]), # force "active_test" domain to bypass _search() override
|
||||
'ref': fields.char('Reference', size=64, select=1),
|
||||
'ref': fields.char('Contact Reference', size=64, select=1),
|
||||
'lang': fields.selection(_lang_get, 'Language',
|
||||
help="If the selected language is loaded in the system, all documents related to this contact will be printed in this language. If not, it will be English."),
|
||||
'tz': fields.selection(_tz_get, 'Timezone', size=64,
|
||||
|
@ -359,6 +360,7 @@ class res_partner(osv.osv, format_address):
|
|||
value = {}
|
||||
value['title'] = False
|
||||
if is_company:
|
||||
value['use_parent_address'] = False
|
||||
domain = {'title': [('domain', '=', 'partner')]}
|
||||
else:
|
||||
domain = {'title': [('domain', '=', 'contact')]}
|
||||
|
@ -378,9 +380,10 @@ class res_partner(osv.osv, format_address):
|
|||
'was never correctly set. If an existing contact starts working for a new '
|
||||
'company then a new contact should be created under that new '
|
||||
'company. You can use the "Discard" button to abandon this change.')}
|
||||
parent = self.browse(cr, uid, parent_id, context=context)
|
||||
address_fields = self._address_fields(cr, uid, context=context)
|
||||
result['value'] = dict((key, value_or_id(parent[key])) for key in address_fields)
|
||||
if use_parent_address:
|
||||
parent = self.browse(cr, uid, parent_id, context=context)
|
||||
address_fields = self._address_fields(cr, uid, context=context)
|
||||
result['value'] = dict((key, value_or_id(parent[key])) for key in address_fields)
|
||||
else:
|
||||
result['value'] = {'use_parent_address': False}
|
||||
return result
|
||||
|
@ -629,10 +632,17 @@ class res_partner(osv.osv, format_address):
|
|||
if operator in ('=ilike', '=like'):
|
||||
operator = operator[1:]
|
||||
|
||||
query = ('SELECT id FROM res_partner ' +
|
||||
where_str + '(email ' + operator + ''' %s
|
||||
OR display_name ''' + operator + ''' %s)
|
||||
ORDER BY display_name''')
|
||||
unaccent = get_unaccent_wrapper(cr)
|
||||
|
||||
query = """SELECT id
|
||||
FROM res_partner
|
||||
{where} ({email} {operator} {percent}
|
||||
OR {display_name} {operator} {percent})
|
||||
ORDER BY {display_name}
|
||||
""".format(where=where_str, operator=operator,
|
||||
email=unaccent('email'),
|
||||
display_name=unaccent('display_name'),
|
||||
percent=unaccent('%s'))
|
||||
|
||||
where_clause_params += [search_name, search_name]
|
||||
if limit:
|
||||
|
|
|
@ -438,7 +438,7 @@
|
|||
<field model="res.country" name="country_id" search="[('name','=','China')]"/>
|
||||
<field name="country_id" ref="base.cn"/>
|
||||
<field name="street">89 Dong Lu Road</field>
|
||||
<field name="email">míng@yourcompany.example.com</field>
|
||||
<field name="email">ming@yourcompany.example.com</field>
|
||||
<field name="phone">+86 215 069 5177</field>
|
||||
<field name="website">http://www.míng.com</field>
|
||||
</record>
|
||||
|
|
|
@ -158,8 +158,8 @@
|
|||
<div>
|
||||
<field name="use_parent_address" class="oe_edit_only oe_inline"
|
||||
on_change="onchange_address(use_parent_address, parent_id)"
|
||||
attrs="{'invisible': [('parent_id','=', False),('use_parent_address','=',False)]}"/>
|
||||
<label for="use_parent_address" class="oe_edit_only" attrs="{'invisible': [('parent_id','=', False),('use_parent_address','=',False)]}"/>
|
||||
attrs="{'invisible': ['|', ('is_company', '=', True),('parent_id', '=', False)]}"/>
|
||||
<label for="use_parent_address" class="oe_edit_only" attrs="{'invisible': ['|', ('is_company', '=', True), ('parent_id', '=', False)]}"/>
|
||||
<button name="open_parent" type="object" string="(edit company address)" class="oe_link oe_edit_only"
|
||||
attrs="{'invisible': ['|',('parent_id','=', False),('use_parent_address','=',False)]}"/>
|
||||
<field name="street" placeholder="Street..." attrs="{'readonly': [('use_parent_address','=',True)]}"/>
|
||||
|
@ -188,7 +188,7 @@
|
|||
|
||||
<notebook colspan="4">
|
||||
<page string="Contacts" attrs="{'invisible': [('is_company','=',False), ('child_ids', '=', [])]}" autofocus="autofocus">
|
||||
<field name="child_ids" mode="kanban" context="{'default_parent_id': active_id, 'default_street': street, 'default_street2': street2, 'default_city': city, 'default_state_id': state_id, 'default_zip': zip, 'default_country_id': country_id, 'default_supplier': supplier, 'default_customer': customer}">
|
||||
<field name="child_ids" mode="kanban" context="{'default_parent_id': active_id, 'default_street': street, 'default_street2': street2, 'default_city': city, 'default_state_id': state_id, 'default_zip': zip, 'default_country_id': country_id, 'default_supplier': supplier, 'default_customer': customer, 'default_use_parent_address': True}">
|
||||
<kanban>
|
||||
<field name="color"/>
|
||||
<field name="name"/>
|
||||
|
|
|
@ -388,7 +388,7 @@ class res_users(osv.osv):
|
|||
if not password:
|
||||
return False
|
||||
user_id = False
|
||||
cr = self.pool.db.cursor()
|
||||
cr = self.pool.cursor()
|
||||
try:
|
||||
# autocommit: our single update request will be performed atomically.
|
||||
# (In this way, there is no opportunity to have two transactions
|
||||
|
@ -439,7 +439,7 @@ class res_users(osv.osv):
|
|||
# Successfully logged in as admin!
|
||||
# Attempt to guess the web base url...
|
||||
if user_agent_env and user_agent_env.get('base_location'):
|
||||
cr = self.pool.db.cursor()
|
||||
cr = self.pool.cursor()
|
||||
try:
|
||||
base = user_agent_env['base_location']
|
||||
ICP = self.pool['ir.config_parameter']
|
||||
|
@ -460,7 +460,7 @@ class res_users(osv.osv):
|
|||
raise openerp.exceptions.AccessDenied()
|
||||
if self._uid_cache.get(db, {}).get(uid) == passwd:
|
||||
return
|
||||
cr = self.pool.db.cursor()
|
||||
cr = self.pool.cursor()
|
||||
try:
|
||||
self.check_credentials(cr, uid, passwd)
|
||||
if self._uid_cache.has_key(db):
|
||||
|
|
|
@ -63,8 +63,8 @@ openerp.base = function(instance) {
|
|||
if (instance.base.apps_client) {
|
||||
return check_client_available(instance.base.apps_client);
|
||||
} else {
|
||||
var ICP = new instance.web.Model('ir.config_parameter');
|
||||
return ICP.call('get_param', ['apps.server', 'https://apps.openerp.com/apps']).then(function(u) {
|
||||
var Mod = new instance.web.Model('ir.module.module');
|
||||
return Mod.call('get_apps_server').then(function(u) {
|
||||
var link = $(_.str.sprintf('<a href="%s"></a>', u))[0];
|
||||
var host = _.str.sprintf('%s//%s', link.protocol, link.host);
|
||||
var dbname = link.pathname;
|
||||
|
|
|
@ -21,7 +21,7 @@ class test_cr_execute(unittest2.TestCase):
|
|||
"""
|
||||
Try to use iterable but non-list or int params in query parameters.
|
||||
"""
|
||||
with registry().cursor(auto_commit=False) as cr:
|
||||
with registry().cursor() as cr:
|
||||
with self.assertRaises(ValueError):
|
||||
cr.execute("SELECT id FROM res_users WHERE login=%s", 'admin')
|
||||
with self.assertRaises(ValueError):
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import unittest2
|
||||
|
||||
import openerp
|
||||
from openerp.osv.expression import get_unaccent_wrapper
|
||||
from openerp.osv.orm import BaseModel
|
||||
import openerp.tests.common as common
|
||||
|
||||
|
@ -124,6 +125,7 @@ class test_expression(common.TransactionCase):
|
|||
|
||||
def test_20_auto_join(self):
|
||||
registry, cr, uid = self.registry, self.cr, self.uid
|
||||
unaccent = get_unaccent_wrapper(cr)
|
||||
|
||||
# Get models
|
||||
partner_obj = registry('res.partner')
|
||||
|
@ -180,8 +182,11 @@ class test_expression(common.TransactionCase):
|
|||
sql_query = self.query_list[0].get_sql()
|
||||
self.assertIn('res_partner_bank', sql_query[0],
|
||||
"_auto_join off: ('bank_ids.name', 'like', '..') first query incorrect main table")
|
||||
self.assertIn('"res_partner_bank"."name" like %s', sql_query[1],
|
||||
|
||||
expected = "%s::text like %s" % (unaccent('"res_partner_bank"."name"'), unaccent('%s'))
|
||||
self.assertIn(expected, sql_query[1],
|
||||
"_auto_join off: ('bank_ids.name', 'like', '..') first query incorrect where condition")
|
||||
|
||||
self.assertEqual(set(['%' + name_test + '%']), set(sql_query[2]),
|
||||
"_auto_join off: ('bank_ids.name', 'like', '..') first query incorrect parameter")
|
||||
sql_query = self.query_list[2].get_sql()
|
||||
|
@ -217,8 +222,11 @@ class test_expression(common.TransactionCase):
|
|||
"_auto_join on: ('bank_ids.name', 'like', '..') query incorrect main table")
|
||||
self.assertIn('"res_partner_bank" as "res_partner__bank_ids"', sql_query[0],
|
||||
"_auto_join on: ('bank_ids.name', 'like', '..') query incorrect join")
|
||||
self.assertIn('"res_partner__bank_ids"."name" like %s', sql_query[1],
|
||||
|
||||
expected = "%s::text like %s" % (unaccent('"res_partner__bank_ids"."name"'), unaccent('%s'))
|
||||
self.assertIn(expected, sql_query[1],
|
||||
"_auto_join on: ('bank_ids.name', 'like', '..') query incorrect where condition")
|
||||
|
||||
self.assertIn('"res_partner"."id"="res_partner__bank_ids"."partner_id"', sql_query[1],
|
||||
"_auto_join on: ('bank_ids.name', 'like', '..') query incorrect join condition")
|
||||
self.assertEqual(set(['%' + name_test + '%']), set(sql_query[2]),
|
||||
|
@ -296,8 +304,11 @@ class test_expression(common.TransactionCase):
|
|||
sql_query = self.query_list[0].get_sql()
|
||||
self.assertIn('"res_country"', sql_query[0],
|
||||
"_auto_join on for state_id: ('state_id.country_id.code', 'like', '..') query 1 incorrect main table")
|
||||
self.assertIn('"res_country"."code" like %s', sql_query[1],
|
||||
|
||||
expected = "%s::text like %s" % (unaccent('"res_country"."code"'), unaccent('%s'))
|
||||
self.assertIn(expected, sql_query[1],
|
||||
"_auto_join on for state_id: ('state_id.country_id.code', 'like', '..') query 1 incorrect where condition")
|
||||
|
||||
self.assertEqual(['%' + name_test + '%'], sql_query[2],
|
||||
"_auto_join on for state_id: ('state_id.country_id.code', 'like', '..') query 1 incorrect parameter")
|
||||
sql_query = self.query_list[1].get_sql()
|
||||
|
@ -327,8 +338,11 @@ class test_expression(common.TransactionCase):
|
|||
"_auto_join on for country_id: ('state_id.country_id.code', 'like', '..') query 1 incorrect main table")
|
||||
self.assertIn('"res_country" as "res_country_state__country_id"', sql_query[0],
|
||||
"_auto_join on for country_id: ('state_id.country_id.code', 'like', '..') query 1 incorrect join")
|
||||
self.assertIn('"res_country_state__country_id"."code" like %s', sql_query[1],
|
||||
|
||||
expected = "%s::text like %s" % (unaccent('"res_country_state__country_id"."code"'), unaccent('%s'))
|
||||
self.assertIn(expected, sql_query[1],
|
||||
"_auto_join on for country_id: ('state_id.country_id.code', 'like', '..') query 1 incorrect where condition")
|
||||
|
||||
self.assertIn('"res_country_state"."country_id"="res_country_state__country_id"."id"', sql_query[1],
|
||||
"_auto_join on for country_id: ('state_id.country_id.code', 'like', '..') query 1 incorrect join condition")
|
||||
self.assertEqual(['%' + name_test + '%'], sql_query[2],
|
||||
|
@ -358,8 +372,11 @@ class test_expression(common.TransactionCase):
|
|||
"_auto_join on: ('state_id.country_id.code', 'like', '..') query incorrect join")
|
||||
self.assertIn('"res_country" as "res_partner__state_id__country_id"', sql_query[0],
|
||||
"_auto_join on: ('state_id.country_id.code', 'like', '..') query incorrect join")
|
||||
self.assertIn('"res_partner__state_id__country_id"."code" like %s', sql_query[1],
|
||||
|
||||
expected = "%s::text like %s" % (unaccent('"res_partner__state_id__country_id"."code"'), unaccent('%s'))
|
||||
self.assertIn(expected, sql_query[1],
|
||||
"_auto_join on: ('state_id.country_id.code', 'like', '..') query incorrect where condition")
|
||||
|
||||
self.assertIn('"res_partner"."state_id"="res_partner__state_id"."id"', sql_query[1],
|
||||
"_auto_join on: ('state_id.country_id.code', 'like', '..') query incorrect join condition")
|
||||
self.assertIn('"res_partner__state_id"."country_id"="res_partner__state_id__country_id"."id"', sql_query[1],
|
||||
|
@ -385,7 +402,9 @@ class test_expression(common.TransactionCase):
|
|||
"_auto_join on one2many with domains incorrect result")
|
||||
# Test produced queries that domains effectively present
|
||||
sql_query = self.query_list[0].get_sql()
|
||||
self.assertIn('"res_partner__child_ids__bank_ids"."acc_number" like %s', sql_query[1],
|
||||
|
||||
expected = "%s::text like %s" % (unaccent('"res_partner__child_ids__bank_ids"."acc_number"'), unaccent('%s'))
|
||||
self.assertIn(expected, sql_query[1],
|
||||
"_auto_join on one2many with domains incorrect result")
|
||||
# TDE TODO: check first domain has a correct table name
|
||||
self.assertIn('"res_partner__child_ids"."name" = %s', sql_query[1],
|
||||
|
@ -447,6 +466,19 @@ class test_expression(common.TransactionCase):
|
|||
domain = [('x', 'in', ['y', 'z']), ('a.v', '=', 'e'), '|', '|', ('a', '=', 'b'), '!', ('c', '>', 'd'), ('e', '!=', 'f'), ('g', '=', 'h')]
|
||||
norm_domain = ['&', '&', '&'] + domain
|
||||
assert norm_domain == expression.normalize_domain(domain), "Non-normalized domains should be properly normalized"
|
||||
|
||||
def test_translate_search(self):
|
||||
Country = self.registry('res.country')
|
||||
be = self.ref('base.be')
|
||||
domains = [
|
||||
[('name', '=', 'Belgium')],
|
||||
[('name', 'ilike', 'Belgi')],
|
||||
[('name', 'in', ['Belgium', 'Care Bears'])],
|
||||
]
|
||||
|
||||
for domain in domains:
|
||||
ids = Country.search(self.cr, self.uid, domain)
|
||||
self.assertListEqual([be], ids)
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest2.main()
|
||||
|
|
|
@ -21,7 +21,7 @@ def registry(model):
|
|||
return openerp.modules.registry.RegistryManager.get(DB)[model]
|
||||
|
||||
def cursor():
|
||||
return openerp.modules.registry.RegistryManager.get(DB).db.cursor()
|
||||
return openerp.modules.registry.RegistryManager.get(DB).cursor()
|
||||
|
||||
|
||||
def drop_sequence(code):
|
||||
|
|
|
@ -134,13 +134,17 @@ class TestORM(common.TransactionCase):
|
|||
rg = self.partner.read_group(self.cr, self.uid, domain, ['date'], 'date' + ':' + interval)
|
||||
result = {}
|
||||
for r in rg:
|
||||
result[r['date']] = set(self.partner.search(self.cr, self.uid, r['__domain']))
|
||||
result[r['date:' + interval]] = set(self.partner.search(self.cr, self.uid, r['__domain']))
|
||||
return result
|
||||
|
||||
self.assertEqual(len(read_group('day')), len(partners_by_day))
|
||||
self.assertEqual(len(read_group('month')), len(partners_by_month))
|
||||
self.assertEqual(len(read_group('year')), len(partners_by_year))
|
||||
|
||||
rg = self.partner.read_group(self.cr, self.uid, [('id', 'in', all_partners)],
|
||||
['date'], ['date:month', 'date:day'], lazy=False)
|
||||
self.assertEqual(len(rg), len(all_partners))
|
||||
|
||||
|
||||
class TestInherits(common.TransactionCase):
|
||||
""" test the behavior of the orm for models that use _inherits;
|
||||
|
|
|
@ -13,7 +13,7 @@ def registry(model):
|
|||
return openerp.modules.registry.RegistryManager.get(DB)[model]
|
||||
|
||||
def cursor():
|
||||
return openerp.modules.registry.RegistryManager.get(DB).db.cursor()
|
||||
return openerp.modules.registry.RegistryManager.get(DB).cursor()
|
||||
|
||||
def get_module(module_name):
|
||||
registry = openerp.modules.registry.RegistryManager.get(DB)
|
||||
|
|
|
@ -28,7 +28,7 @@ class ViewCase(common.TransactionCase):
|
|||
self.assertTreesEqual(c1, c2, msg)
|
||||
|
||||
|
||||
class TestNodeLocator(common.BaseCase):
|
||||
class TestNodeLocator(common.TransactionCase):
|
||||
"""
|
||||
The node locator returns None when it can not find a node, and the first
|
||||
match when it finds something (no jquery-style node sets)
|
||||
|
|
|
@ -38,7 +38,8 @@ def main():
|
|||
# The only shared option is '--addons-path=' needed to discover additional
|
||||
# commands from modules
|
||||
if len(args) > 1 and args[0].startswith('--addons-path=') and not args[1].startswith("-"):
|
||||
tools.config.parse_config([args[0]])
|
||||
# parse only the addons-path, do not setup the logger...
|
||||
tools.config._parse_config([args[0]])
|
||||
args = args[1:]
|
||||
|
||||
# Default legacy command
|
||||
|
|
|
@ -29,6 +29,7 @@ GNU Public Licence.
|
|||
(c) 2003-TODAY, Fabien Pinckaers - OpenERP SA
|
||||
"""
|
||||
|
||||
import atexit
|
||||
import logging
|
||||
import os
|
||||
import signal
|
||||
|
@ -78,16 +79,23 @@ def report_configuration():
|
|||
('database user', config['db_user'])]:
|
||||
_logger.info("%s: %s", name, value)
|
||||
|
||||
def rm_pid_file():
|
||||
config = openerp.tools.config
|
||||
if not openerp.evented and os.path.exists(config['pidfile']):
|
||||
os.unlink(config['pidfile'])
|
||||
|
||||
def setup_pid_file():
|
||||
""" Create a file with the process id written in it.
|
||||
|
||||
This function assumes the configuration has been initialized.
|
||||
"""
|
||||
config = openerp.tools.config
|
||||
if config['pidfile']:
|
||||
if not openerp.evented and config['pidfile']:
|
||||
with open(config['pidfile'], 'w') as fd:
|
||||
pidtext = "%d" % (os.getpid())
|
||||
fd.write(pidtext)
|
||||
atexit.register(rm_pid_file)
|
||||
|
||||
|
||||
def export_translation():
|
||||
config = openerp.tools.config
|
||||
|
@ -103,7 +111,7 @@ def export_translation():
|
|||
fileformat = os.path.splitext(config["translate_out"])[-1][1:].lower()
|
||||
buf = file(config["translate_out"], "w")
|
||||
registry = openerp.modules.registry.RegistryManager.new(dbname)
|
||||
cr = registry.db.cursor()
|
||||
cr = registry.cursor()
|
||||
openerp.tools.trans_export(config["language"],
|
||||
config["translate_modules"] or ["all"], buf, fileformat, cr)
|
||||
cr.close()
|
||||
|
@ -117,7 +125,7 @@ def import_translation():
|
|||
dbname = config['db_name']
|
||||
|
||||
registry = openerp.modules.registry.RegistryManager.new(dbname)
|
||||
cr = registry.db.cursor()
|
||||
cr = registry.cursor()
|
||||
openerp.tools.trans_load( cr, config["translate_in"], config["language"],
|
||||
context=context)
|
||||
cr.commit()
|
||||
|
@ -155,8 +163,6 @@ def main(args):
|
|||
|
||||
setup_pid_file()
|
||||
rc = openerp.service.server.start(preload=preload, stop=stop)
|
||||
if config['pidfile']:
|
||||
os.unlink(config['pidfile'])
|
||||
sys.exit(rc)
|
||||
|
||||
class Server(Command):
|
||||
|
|
103
openerp/http.py
103
openerp/http.py
|
@ -235,10 +235,7 @@ class WebRequest(object):
|
|||
"""
|
||||
# some magic to lazy create the cr
|
||||
if not self._cr:
|
||||
# Test cursors
|
||||
self._cr = openerp.tests.common.acquire_test_cursor(self.session_id)
|
||||
if not self._cr:
|
||||
self._cr = self.registry.db.cursor()
|
||||
self._cr = self.registry.cursor()
|
||||
return self._cr
|
||||
|
||||
def __enter__(self):
|
||||
|
@ -249,14 +246,9 @@ class WebRequest(object):
|
|||
_request_stack.pop()
|
||||
|
||||
if self._cr:
|
||||
# Dont close test cursors
|
||||
if not openerp.tests.common.release_test_cursor(self._cr):
|
||||
if exc_type is None and not self._failed:
|
||||
self._cr.commit()
|
||||
else:
|
||||
# just to be explicit - happens at close() anyway
|
||||
self._cr.rollback()
|
||||
self._cr.close()
|
||||
if exc_type is None and not self._failed:
|
||||
self._cr.commit()
|
||||
self._cr.close()
|
||||
# just to be sure no one tries to re-use the request
|
||||
self.disable_db = True
|
||||
self.uid = None
|
||||
|
@ -270,6 +262,13 @@ class WebRequest(object):
|
|||
self.endpoint = endpoint
|
||||
self.auth_method = auth
|
||||
|
||||
|
||||
def _handle_exception(self, exception):
|
||||
"""Called within an except block to allow converting exceptions
|
||||
to abitrary responses. Anything returned (except None) will
|
||||
be used as response."""
|
||||
raise
|
||||
|
||||
def _call_function(self, *args, **kwargs):
|
||||
request = self
|
||||
if self.endpoint.routing['type'] != self._request_type:
|
||||
|
@ -287,7 +286,7 @@ class WebRequest(object):
|
|||
def checked_call(___dbname, *a, **kw):
|
||||
# The decorator can call us more than once if there is an database error. In this
|
||||
# case, the request cursor is unusable. Rollback transaction to create a new one.
|
||||
if self._cr and not openerp.tools.config['test_enable']:
|
||||
if self._cr:
|
||||
self._cr.rollback()
|
||||
return self.endpoint(*a, **kw)
|
||||
|
||||
|
@ -421,39 +420,15 @@ class JsonRequest(WebRequest):
|
|||
self.params = dict(self.jsonrequest.get("params", {}))
|
||||
self.context = self.params.pop('context', dict(self.session.context))
|
||||
|
||||
def dispatch(self):
|
||||
""" Calls the method asked for by the JSON-RPC2 or JSONP request
|
||||
"""
|
||||
if self.jsonp_handler:
|
||||
return self.jsonp_handler()
|
||||
response = {"jsonrpc": "2.0" }
|
||||
error = None
|
||||
|
||||
try:
|
||||
response['id'] = self.jsonrequest.get('id')
|
||||
response["result"] = self._call_function(**self.params)
|
||||
except AuthenticationError, e:
|
||||
_logger.exception("JSON-RPC AuthenticationError in %s.", self.httprequest.path)
|
||||
se = serialize_exception(e)
|
||||
error = {
|
||||
'code': 100,
|
||||
'message': "OpenERP Session Invalid",
|
||||
'data': se
|
||||
}
|
||||
self._failed = e # prevent tx commit
|
||||
except Exception, e:
|
||||
# Mute test cursor error for runbot
|
||||
if not (openerp.tools.config['test_enable'] and isinstance(e, psycopg2.OperationalError)):
|
||||
_logger.exception("JSON-RPC Exception in %s.", self.httprequest.path)
|
||||
se = serialize_exception(e)
|
||||
error = {
|
||||
'code': 200,
|
||||
'message': "OpenERP Server Error",
|
||||
'data': se
|
||||
}
|
||||
self._failed = e # prevent tx commit
|
||||
if error:
|
||||
response["error"] = error
|
||||
def _json_response(self, result=None, error=None):
|
||||
response = {
|
||||
'jsonrpc': '2.0',
|
||||
'id': self.jsonrequest.get('id')
|
||||
}
|
||||
if error is not None:
|
||||
response['error'] = error
|
||||
if result is not None:
|
||||
response['result'] = result
|
||||
|
||||
if self.jsonp:
|
||||
# If we use jsonp, that's mean we are called from another host
|
||||
|
@ -466,8 +441,36 @@ class JsonRequest(WebRequest):
|
|||
mime = 'application/json'
|
||||
body = simplejson.dumps(response)
|
||||
|
||||
r = Response(body, headers=[('Content-Type', mime), ('Content-Length', len(body))])
|
||||
return r
|
||||
return Response(
|
||||
body, headers=[('Content-Type', mime),
|
||||
('Content-Length', len(body))])
|
||||
|
||||
def _handle_exception(self, exception):
|
||||
"""Called within an except block to allow converting exceptions
|
||||
to abitrary responses. Anything returned (except None) will
|
||||
be used as response."""
|
||||
_logger.exception("Exception during JSON request handling.")
|
||||
self._failed = exception # prevent tx commit
|
||||
error = {
|
||||
'code': 200,
|
||||
'message': "OpenERP Server Error",
|
||||
'data': serialize_exception(exception)
|
||||
}
|
||||
if isinstance(exception, AuthenticationError):
|
||||
error['code'] = 100
|
||||
error['message'] = "OpenERP Session Invalid"
|
||||
return self._json_response(error=error)
|
||||
|
||||
def dispatch(self):
|
||||
""" Calls the method asked for by the JSON-RPC2 or JSONP request
|
||||
"""
|
||||
if self.jsonp_handler:
|
||||
return self.jsonp_handler()
|
||||
try:
|
||||
result = self._call_function(**self.params)
|
||||
return self._json_response(result)
|
||||
except Exception, e:
|
||||
return self._handle_exception(e)
|
||||
|
||||
def serialize_exception(e):
|
||||
tmp = {
|
||||
|
@ -597,8 +600,8 @@ class ControllerType(type):
|
|||
|
||||
# flag old-style methods with req as first argument
|
||||
for k, v in attrs.items():
|
||||
if inspect.isfunction(v):
|
||||
spec = inspect.getargspec(v)
|
||||
if inspect.isfunction(v) and hasattr(v, 'original_func'):
|
||||
spec = inspect.getargspec(v.original_func)
|
||||
first_arg = spec.args[1] if len(spec.args) >= 2 else None
|
||||
if first_arg in ["req", "request"]:
|
||||
v._first_arg_is_req = True
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
|
||||
# Copyright (C) 2010-2013 OpenERP s.a. (<http://openerp.com>).
|
||||
# Copyright (C) 2010-2014 OpenERP s.a. (<http://openerp.com>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
|
@ -153,7 +153,6 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
|
|||
loaded_modules.append(package.name)
|
||||
if hasattr(package, 'init') or hasattr(package, 'update') or package.state in ('to install', 'to upgrade'):
|
||||
init_module_models(cr, package.name, models)
|
||||
registry._init_modules.add(package.name)
|
||||
status['progress'] = float(index) / len(graph)
|
||||
|
||||
# Can't put this line out of the loop: ir.module.module will be
|
||||
|
@ -182,6 +181,10 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
|
|||
|
||||
migrations.migrate_module(package, 'post')
|
||||
|
||||
registry._init_modules.add(package.name)
|
||||
# validate all the views at a whole
|
||||
registry['ir.ui.view']._validate_module_views(cr, SUPERUSER_ID, module_name)
|
||||
|
||||
if has_demo:
|
||||
# launch tests only in demo mode, allowing tests to use demo data.
|
||||
if tools.config.options['test_enable']:
|
||||
|
@ -207,6 +210,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
|
|||
if hasattr(package, kind):
|
||||
delattr(package, kind)
|
||||
|
||||
registry._init_modules.add(package.name)
|
||||
cr.commit()
|
||||
|
||||
# The query won't be valid for models created later (i.e. custom model
|
||||
|
|
|
@ -58,7 +58,10 @@ class Registry(Mapping):
|
|||
self._init_modules = set()
|
||||
|
||||
self.db_name = db_name
|
||||
self.db = openerp.sql_db.db_connect(db_name)
|
||||
self._db = openerp.sql_db.db_connect(db_name)
|
||||
|
||||
# special cursor for test mode; None means "normal" mode
|
||||
self.test_cr = None
|
||||
|
||||
# Indicates that the registry is
|
||||
self.ready = False
|
||||
|
@ -75,7 +78,7 @@ class Registry(Mapping):
|
|||
# Useful only in a multi-process context.
|
||||
self._any_cache_cleared = False
|
||||
|
||||
cr = self.db.cursor()
|
||||
cr = self.cursor()
|
||||
has_unaccent = openerp.modules.db.has_unaccent(cr)
|
||||
if openerp.tools.config['unaccent'] and not has_unaccent:
|
||||
_logger.warning("The option --unaccent was given but no unaccent() function was found in database.")
|
||||
|
@ -102,6 +105,10 @@ class Registry(Mapping):
|
|||
""" Return the model with the given name or raise KeyError if it doesn't exist."""
|
||||
return self.models[model_name]
|
||||
|
||||
def __call__(self, model_name):
|
||||
""" Same as ``self[model_name]``. """
|
||||
return self.models[model_name]
|
||||
|
||||
def do_parent_store(self, cr):
|
||||
for o in self._init_parent:
|
||||
self.get(o)._parent_store_compute(cr)
|
||||
|
@ -183,27 +190,39 @@ class Registry(Mapping):
|
|||
r, c)
|
||||
return r, c
|
||||
|
||||
@contextmanager
|
||||
def cursor(self, auto_commit=True):
|
||||
cr = self.db.cursor()
|
||||
try:
|
||||
yield cr
|
||||
if auto_commit:
|
||||
cr.commit()
|
||||
finally:
|
||||
cr.close()
|
||||
def enter_test_mode(self):
|
||||
""" Enter the 'test' mode, where one cursor serves several requests. """
|
||||
assert self.test_cr is None
|
||||
self.test_cr = self._db.test_cursor()
|
||||
RegistryManager.enter_test_mode()
|
||||
|
||||
class TestRLock(object):
|
||||
def __init__(self):
|
||||
self._lock = threading.RLock()
|
||||
def leave_test_mode(self):
|
||||
""" Leave the test mode. """
|
||||
assert self.test_cr is not None
|
||||
self.test_cr.force_close()
|
||||
self.test_cr = None
|
||||
RegistryManager.leave_test_mode()
|
||||
|
||||
def cursor(self):
|
||||
""" Return a new cursor for the database. The cursor itself may be used
|
||||
as a context manager to commit/rollback and close automatically.
|
||||
"""
|
||||
cr = self.test_cr
|
||||
if cr is not None:
|
||||
# While in test mode, we use one special cursor across requests. The
|
||||
# test cursor uses a reentrant lock to serialize accesses. The lock
|
||||
# is granted here by cursor(), and automatically released by the
|
||||
# cursor itself in its method close().
|
||||
cr.acquire()
|
||||
return cr
|
||||
return self._db.cursor()
|
||||
|
||||
class DummyRLock(object):
|
||||
""" Dummy reentrant lock, to be used while running rpc and js tests """
|
||||
def acquire(self):
|
||||
if openerp.tools.config['test_enable']:
|
||||
return
|
||||
return self._lock.acquire()
|
||||
pass
|
||||
def release(self):
|
||||
if openerp.tools.config['test_enable']:
|
||||
return
|
||||
return self._lock.release()
|
||||
pass
|
||||
def __enter__(self):
|
||||
self.acquire()
|
||||
def __exit__(self, type, value, traceback):
|
||||
|
@ -219,12 +238,30 @@ class RegistryManager(object):
|
|||
# Mapping between db name and model registry.
|
||||
# Accessed through the methods below.
|
||||
registries = {}
|
||||
registries_lock = TestRLock()
|
||||
_lock = threading.RLock()
|
||||
_saved_lock = None
|
||||
|
||||
@classmethod
|
||||
def lock(cls):
|
||||
""" Return the current registry lock. """
|
||||
return cls._lock
|
||||
|
||||
@classmethod
|
||||
def enter_test_mode(cls):
|
||||
""" Enter the 'test' mode, where the registry is no longer locked. """
|
||||
assert cls._saved_lock is None
|
||||
cls._lock, cls._saved_lock = DummyRLock(), cls._lock
|
||||
|
||||
@classmethod
|
||||
def leave_test_mode(cls):
|
||||
""" Leave the 'test' mode. """
|
||||
assert cls._saved_lock is not None
|
||||
cls._lock, cls._saved_lock = cls._saved_lock, None
|
||||
|
||||
@classmethod
|
||||
def get(cls, db_name, force_demo=False, status=None, update_module=False):
|
||||
""" Return a registry for a given database name."""
|
||||
with cls.registries_lock:
|
||||
with cls.lock():
|
||||
try:
|
||||
return cls.registries[db_name]
|
||||
except KeyError:
|
||||
|
@ -244,7 +281,7 @@ class RegistryManager(object):
|
|||
|
||||
"""
|
||||
import openerp.modules
|
||||
with cls.registries_lock:
|
||||
with cls.lock():
|
||||
registry = Registry(db_name)
|
||||
|
||||
# Initializing a registry will call general code which will in turn
|
||||
|
@ -259,7 +296,7 @@ class RegistryManager(object):
|
|||
registry.base_registry_signaling_sequence = seq_registry
|
||||
registry.base_cache_signaling_sequence = seq_cache
|
||||
# This should be a method on Registry
|
||||
openerp.modules.load_modules(registry.db, force_demo, status, update_module)
|
||||
openerp.modules.load_modules(registry._db, force_demo, status, update_module)
|
||||
except Exception:
|
||||
del cls.registries[db_name]
|
||||
raise
|
||||
|
@ -269,7 +306,7 @@ class RegistryManager(object):
|
|||
# Yeah, crazy.
|
||||
registry = cls.registries[db_name]
|
||||
|
||||
cr = registry.db.cursor()
|
||||
cr = registry.cursor()
|
||||
try:
|
||||
registry.do_parent_store(cr)
|
||||
cr.commit()
|
||||
|
@ -286,7 +323,7 @@ class RegistryManager(object):
|
|||
@classmethod
|
||||
def delete(cls, db_name):
|
||||
"""Delete the registry linked to a given database. """
|
||||
with cls.registries_lock:
|
||||
with cls.lock():
|
||||
if db_name in cls.registries:
|
||||
cls.registries[db_name].clear_caches()
|
||||
del cls.registries[db_name]
|
||||
|
@ -294,7 +331,7 @@ class RegistryManager(object):
|
|||
@classmethod
|
||||
def delete_all(cls):
|
||||
"""Delete all the registries. """
|
||||
with cls.registries_lock:
|
||||
with cls.lock():
|
||||
for db_name in cls.registries.keys():
|
||||
cls.delete(db_name)
|
||||
|
||||
|
@ -309,7 +346,7 @@ class RegistryManager(object):
|
|||
This method is given to spare you a ``RegistryManager.get(db_name)``
|
||||
that would loads the given database if it was not already loaded.
|
||||
"""
|
||||
with cls.registries_lock:
|
||||
with cls.lock():
|
||||
if db_name in cls.registries:
|
||||
cls.registries[db_name].clear_caches()
|
||||
|
||||
|
@ -325,7 +362,7 @@ class RegistryManager(object):
|
|||
changed = False
|
||||
if openerp.multi_process and db_name in cls.registries:
|
||||
registry = cls.get(db_name)
|
||||
cr = registry.db.cursor()
|
||||
cr = registry.cursor()
|
||||
try:
|
||||
cr.execute("""
|
||||
SELECT base_registry_signaling.last_value,
|
||||
|
@ -371,7 +408,7 @@ class RegistryManager(object):
|
|||
registry = cls.get(db_name)
|
||||
if registry.any_cache_cleared():
|
||||
_logger.info("At least one model cache has been cleared, signaling through the database.")
|
||||
cr = registry.db.cursor()
|
||||
cr = registry.cursor()
|
||||
r = 1
|
||||
try:
|
||||
cr.execute("select nextval('base_cache_signaling')")
|
||||
|
@ -386,7 +423,7 @@ class RegistryManager(object):
|
|||
if openerp.multi_process and db_name in cls.registries:
|
||||
_logger.info("Registry changed, signaling through the database")
|
||||
registry = cls.get(db_name)
|
||||
cr = registry.db.cursor()
|
||||
cr = registry.cursor()
|
||||
r = 1
|
||||
try:
|
||||
cr.execute("select nextval('base_registry_signaling')")
|
||||
|
|
|
@ -86,7 +86,7 @@ class PostgreSQLHandler(logging.Handler):
|
|||
if traceback:
|
||||
msg = "%s\n%s" % (msg, traceback)
|
||||
level = logging.getLevelName(record.levelno)
|
||||
val = (ct_uid, ct_uid, 'server', dbname, record.name, level, msg, record.pathname, record.lineno, record.funcName)
|
||||
val = (ct_uid, ct_uid, 'server', ct_db, record.name, level, msg, record.pathname, record.lineno, record.funcName)
|
||||
cr.execute("""
|
||||
INSERT INTO ir_logging(create_date, write_date, create_uid, write_uid, type, dbname, name, level, message, path, line, func)
|
||||
VALUES (NOW() at time zone 'UTC', NOW() at time zone 'UTC', %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue