[MERGE] upstream
bzr revid: fme@openerp.com-20140423123808-q58dtl8a0bb2ymlf
This commit is contained in:
commit
8370d3f60e
|
@ -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-04-09 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:51+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:51+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:51+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:52+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:55+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:55+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:08+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:04+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:08+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:10+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:09+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:10+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:08+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:11+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:07+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:51+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:00+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:54+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:54+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:09+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:55+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:56+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:56+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:56+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:03+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:56+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:51+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:57+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:57+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:57+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:54+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:59+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:58+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:59+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:59+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:00+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:53+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:09+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:00+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:01+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:07+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:01+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:02+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:03+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:04+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 05:50+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:02+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:04+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:05+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:05+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:05+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:06+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:07+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:11+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:07+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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-04-09 06:10+0000\n"
|
||||
"X-Generator: Launchpad (build 16976)\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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -152,7 +152,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
|
||||
"""
|
||||
|
@ -164,9 +164,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]
|
||||
|
@ -175,7 +179,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]
|
||||
|
@ -393,7 +397,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_call_assets(self, element, template_attributes, generated_attributes, qwebcontext):
|
||||
""" This special 't-call' tag can be used in order to aggregate/minify javascript and css assets"""
|
||||
|
@ -440,8 +449,7 @@ 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'])
|
||||
|
@ -840,6 +848,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):
|
||||
|
@ -859,6 +869,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
|
||||
}
|
||||
|
||||
|
@ -866,6 +877,26 @@ 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'
|
||||
|
||||
|
|
|
@ -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; ')))"/>
|
||||
|
|
|
@ -698,6 +698,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:
|
||||
|
@ -719,10 +729,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)
|
||||
|
||||
|
@ -847,9 +860,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 = {}
|
||||
|
@ -868,7 +878,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
|
||||
|
@ -956,4 +966,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:
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -234,7 +234,7 @@ class res_partner(osv.osv, format_address):
|
|||
'title': fields.many2one('res.partner.title', 'Title'),
|
||||
'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,
|
||||
|
@ -360,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')]}
|
||||
|
@ -379,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
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -604,8 +604,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
|
||||
|
|
|
@ -199,7 +199,7 @@ class Registry(Mapping):
|
|||
def leave_test_mode(self):
|
||||
""" Leave the test mode. """
|
||||
assert self.test_cr is not None
|
||||
self.test_cr.close(force=True) # close the cursor for real
|
||||
self.test_cr.force_close()
|
||||
self.test_cr = None
|
||||
RegistryManager.leave_test_mode()
|
||||
|
||||
|
@ -207,13 +207,14 @@ class Registry(Mapping):
|
|||
""" Return a new cursor for the database. The cursor itself may be used
|
||||
as a context manager to commit/rollback and close automatically.
|
||||
"""
|
||||
if self.test_cr is not None:
|
||||
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().
|
||||
self.test_cr.acquire()
|
||||
return self.test_cr
|
||||
cr.acquire()
|
||||
return cr
|
||||
return self._db.cursor()
|
||||
|
||||
class DummyRLock(object):
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -344,6 +344,30 @@ class date(_column):
|
|||
exc_info=True)
|
||||
return (context_today or today).strftime(tools.DEFAULT_SERVER_DATE_FORMAT)
|
||||
|
||||
@staticmethod
|
||||
def date_to_datetime(model, cr, uid, userdate, context=None):
|
||||
""" Convert date values expressed in user's timezone to
|
||||
server-side UTC timestamp, assuming a default arbitrary
|
||||
time of 12:00 AM - because a time is needed.
|
||||
|
||||
:param str userdate: date string in in user time zone
|
||||
:return: UTC datetime string for server-side use
|
||||
"""
|
||||
user_date = DT.datetime.strptime(userdate, tools.DEFAULT_SERVER_DATE_FORMAT)
|
||||
if context and context.get('tz'):
|
||||
tz_name = context['tz']
|
||||
else:
|
||||
tz_name = model.pool.get('res.users').read(cr, SUPERUSER_ID, uid, ['tz'])['tz']
|
||||
if tz_name:
|
||||
utc = pytz.timezone('UTC')
|
||||
context_tz = pytz.timezone(tz_name)
|
||||
user_datetime = user_date + DT.timedelta(hours=12.0)
|
||||
local_timestamp = context_tz.localize(user_datetime, is_dst=False)
|
||||
user_datetime = local_timestamp.astimezone(utc)
|
||||
return user_datetime.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)
|
||||
return user_date.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)
|
||||
|
||||
|
||||
class datetime(_column):
|
||||
_type = 'datetime'
|
||||
|
||||
|
@ -1191,42 +1215,69 @@ class function(_column):
|
|||
return self._fnct_search(obj, cr, uid, obj, name, args, context=context)
|
||||
|
||||
def postprocess(self, cr, uid, obj, field, value=None, context=None):
|
||||
return self._postprocess_batch(cr, uid, obj, field, {0: value}, context=context)[0]
|
||||
|
||||
def _postprocess_batch(self, cr, uid, obj, field, values, context=None):
|
||||
if not values:
|
||||
return values
|
||||
|
||||
if context is None:
|
||||
context = {}
|
||||
result = value
|
||||
|
||||
field_type = obj._columns[field]._type
|
||||
if field_type == "many2one":
|
||||
# make the result a tuple if it is not already one
|
||||
if isinstance(value, (int,long)) and hasattr(obj._columns[field], 'relation'):
|
||||
obj_model = obj.pool[obj._columns[field].relation]
|
||||
dict_names = dict(obj_model.name_get(cr, SUPERUSER_ID, [value], context))
|
||||
result = (value, dict_names[value])
|
||||
new_values = dict(values)
|
||||
|
||||
if field_type == 'binary':
|
||||
if context.get('bin_size'):
|
||||
# client requests only the size of binary fields
|
||||
result = get_nice_size(value)
|
||||
elif not context.get('bin_raw'):
|
||||
result = sanitize_binary_value(value)
|
||||
|
||||
if field_type == "integer" and value > xmlrpclib.MAXINT:
|
||||
if field_type == "integer":
|
||||
# integer/long values greater than 2^31-1 are not supported
|
||||
# in pure XMLRPC, so we have to pass them as floats :-(
|
||||
# This is not needed for stored fields and non-functional integer
|
||||
# fields, as their values are constrained by the database backend
|
||||
# to the same 32bits signed int limit.
|
||||
result = __builtin__.float(value)
|
||||
return result
|
||||
for rid, value in values.iteritems():
|
||||
if value and value > xmlrpclib.MAXINT:
|
||||
new_values[rid] = __builtin__.float(value)
|
||||
|
||||
elif field_type == 'binary':
|
||||
if context.get('bin_size'):
|
||||
# client requests only the size of binary fields
|
||||
for rid, value in values.iteritems():
|
||||
if value:
|
||||
new_values[rid] = get_nice_size(value)
|
||||
elif not context.get('bin_raw'):
|
||||
for rid, value in values.iteritems():
|
||||
if value:
|
||||
new_values[rid] = sanitize_binary_value(value)
|
||||
|
||||
elif field_type == "many2one" and hasattr(obj._columns[field], 'relation'):
|
||||
# make the result a tuple if it is not already one
|
||||
if all(isinstance(value, (int, long)) for value in values.values() if value):
|
||||
obj_model = obj.pool[obj._columns[field].relation]
|
||||
ids = [i for i in values.values() if i]
|
||||
dict_names = dict(obj_model.name_get(cr, SUPERUSER_ID, ids, context))
|
||||
for rid, value in values.iteritems():
|
||||
if value:
|
||||
new_values[rid] = (value, dict_names[value])
|
||||
|
||||
return new_values
|
||||
|
||||
def get(self, cr, obj, ids, name, uid=False, context=None, values=None):
|
||||
result = self._fnct(obj, cr, uid, ids, name, self._arg, context)
|
||||
for id in ids:
|
||||
if self._multi and id in result:
|
||||
for field, value in result[id].iteritems():
|
||||
if value:
|
||||
result[id][field] = self.postprocess(cr, uid, obj, field, value, context)
|
||||
elif result.get(id):
|
||||
result[id] = self.postprocess(cr, uid, obj, name, result[id], context)
|
||||
if self._multi:
|
||||
swap = {}
|
||||
for rid, values in result.iteritems():
|
||||
for f, v in values.iteritems():
|
||||
if f not in name:
|
||||
continue
|
||||
swap.setdefault(f, {})[rid] = v
|
||||
|
||||
for field, values in swap.iteritems():
|
||||
new_values = self._postprocess_batch(cr, uid, obj, field, values, context)
|
||||
for rid, value in new_values.iteritems():
|
||||
result[rid][field] = value
|
||||
|
||||
else:
|
||||
result = self._postprocess_batch(cr, uid, obj, name, result, context)
|
||||
|
||||
return result
|
||||
|
||||
def set(self, cr, obj, id, name, value, user=None, context=None):
|
||||
|
|
|
@ -1915,6 +1915,31 @@ class BaseModel(object):
|
|||
}
|
||||
return result
|
||||
|
||||
def get_formview_id(self, cr, uid, id, context=None):
|
||||
""" Return an view id to open the document with. This method is meant to be
|
||||
overridden in addons that want to give specific view ids for example.
|
||||
|
||||
:param int id: id of the document to open
|
||||
"""
|
||||
return False
|
||||
|
||||
def get_formview_action(self, cr, uid, id, context=None):
|
||||
""" Return an action to open the document. This method is meant to be
|
||||
overridden in addons that want to give specific view ids for example.
|
||||
|
||||
:param int id: id of the document to open
|
||||
"""
|
||||
view_id = self.get_formview_id(cr, uid, id, context=context)
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'res_model': self._name,
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form',
|
||||
'views': [(view_id, 'form')],
|
||||
'target': 'current',
|
||||
'res_id': id,
|
||||
}
|
||||
|
||||
def _view_look_dom_arch(self, cr, uid, node, view_id, context=None):
|
||||
return self.pool['ir.ui.view'].postprocess_and_fields(
|
||||
cr, uid, self._name, node, view_id, context=context)
|
||||
|
@ -2332,7 +2357,7 @@ class BaseModel(object):
|
|||
del data['id']
|
||||
return data
|
||||
|
||||
def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context={}, orderby=False, lazy=True):
|
||||
def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None, orderby=False, lazy=True):
|
||||
"""
|
||||
Get the list of records in list view grouped by the given ``groupby`` fields
|
||||
|
||||
|
@ -2364,6 +2389,8 @@ class BaseModel(object):
|
|||
:raise AccessError: * if user has no read rights on the requested object
|
||||
* if user tries to bypass access rules for read on the requested object
|
||||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
self.check_access_rights(cr, uid, 'read')
|
||||
query = self._where_calc(cr, uid, domain, context=context)
|
||||
fields = fields or self._columns.keys()
|
||||
|
|
|
@ -30,7 +30,7 @@ RELEASE_LEVELS_DISPLAY = {ALPHA: ALPHA,
|
|||
# properly comparable using normal operarors, for example:
|
||||
# (6,1,0,'beta',0) < (6,1,0,'candidate',1) < (6,1,0,'candidate',2)
|
||||
# (6,1,0,'candidate',2) < (6,1,0,'final',0) < (6,1,2,'final',0)
|
||||
version_info = (8, 0, 0, ALPHA, 1)
|
||||
version_info = (7, 'saas~4', 0, FINAL, 0)
|
||||
version = '.'.join(map(str, version_info[:2])) + RELEASE_LEVELS_DISPLAY[version_info[3]] + str(version_info[4] or '')
|
||||
series = serie = major_version = '.'.join(map(str, version_info[:2]))
|
||||
|
||||
|
|
|
@ -280,7 +280,7 @@ class ThreadedServer(CommonServer):
|
|||
t.start()
|
||||
_logger.info('HTTP service (werkzeug) running on %s:%s', self.interface, self.port)
|
||||
|
||||
def start(self):
|
||||
def start(self, stop=False):
|
||||
_logger.debug("Setting signal handlers")
|
||||
if os.name == 'posix':
|
||||
signal.signal(signal.SIGINT, self.signal_handler)
|
||||
|
@ -291,8 +291,15 @@ class ThreadedServer(CommonServer):
|
|||
elif os.name == 'nt':
|
||||
import win32api
|
||||
win32api.SetConsoleCtrlHandler(lambda sig: self.signal_handler(sig, None), 1)
|
||||
self.cron_spawn()
|
||||
self.http_spawn()
|
||||
|
||||
test_mode = config['test_enable'] or config['test_file']
|
||||
if not stop or test_mode:
|
||||
# some tests need the http deamon to be available...
|
||||
self.http_spawn()
|
||||
|
||||
if not stop:
|
||||
# only relevant if we are not in "--stop-after-init" mode
|
||||
self.cron_spawn()
|
||||
|
||||
def stop(self):
|
||||
""" Shutdown the WSGI server. Wait for non deamon threads.
|
||||
|
@ -329,7 +336,7 @@ class ThreadedServer(CommonServer):
|
|||
The first SIGINT or SIGTERM signal will initiate a graceful shutdown while
|
||||
a second one if any will force an immediate exit.
|
||||
"""
|
||||
self.start()
|
||||
self.start(stop=stop)
|
||||
|
||||
rc = preload_registries(preload)
|
||||
|
||||
|
@ -552,8 +559,6 @@ class PreforkServer(CommonServer):
|
|||
raise
|
||||
|
||||
def start(self):
|
||||
# Empty the cursor pool, we dont want them to be shared among forked workers.
|
||||
openerp.sql_db.close_all()
|
||||
# wakeup pipe, python doesnt throw EINTR when a syscall is interrupted
|
||||
# by a signal simulating a pseudo SA_RESTART. We write to a pipe in the
|
||||
# signal handler to overcome this behaviour
|
||||
|
@ -602,6 +607,9 @@ class PreforkServer(CommonServer):
|
|||
self.stop()
|
||||
return rc
|
||||
|
||||
# Empty the cursor pool, we dont want them to be shared among forked workers.
|
||||
openerp.sql_db.close_all()
|
||||
|
||||
_logger.debug("Multiprocess starting")
|
||||
while 1:
|
||||
try:
|
||||
|
|
|
@ -399,12 +399,13 @@ class TestCursor(Cursor):
|
|||
def release(self):
|
||||
self._lock.release()
|
||||
|
||||
def close(self, force=False):
|
||||
if force:
|
||||
super(TestCursor, self).close()
|
||||
elif not self._closed:
|
||||
def force_close(self):
|
||||
super(TestCursor, self).close()
|
||||
|
||||
def close(self):
|
||||
if not self._closed:
|
||||
self.rollback() # for stuff that has not been committed
|
||||
self.release()
|
||||
self.release()
|
||||
|
||||
def autocommit(self, on):
|
||||
_logger.debug("TestCursor.autocommit(%r) does nothing", on)
|
||||
|
|
|
@ -233,6 +233,7 @@ class HttpCase(TransactionCase):
|
|||
_logger.info("phantom_run execution finished")
|
||||
|
||||
def _wait_remaining_requests(self):
|
||||
t0 = int(time.time())
|
||||
for thread in threading.enumerate():
|
||||
if thread.name.startswith('openerp.service.http.request.'):
|
||||
while thread.isAlive():
|
||||
|
@ -240,6 +241,11 @@ class HttpCase(TransactionCase):
|
|||
# and would prevent the forced shutdown.
|
||||
thread.join(0.05)
|
||||
time.sleep(0.05)
|
||||
t1 = int(time.time())
|
||||
if t0 != t1:
|
||||
_logger.info('remaining requests')
|
||||
openerp.tools.misc.dumpstacks()
|
||||
t0 = t1
|
||||
|
||||
def phantom_jsfile(self, jsfile, timeout=60, **kw):
|
||||
options = {
|
||||
|
|
|
@ -1171,7 +1171,7 @@ class ConstantMapping(Mapping):
|
|||
return self._value
|
||||
|
||||
|
||||
def dumpstacks(sig, frame):
|
||||
def dumpstacks(sig=None, frame=None):
|
||||
""" Signal handler: dump a stack trace for each existing thread."""
|
||||
code = []
|
||||
|
||||
|
|
Loading…
Reference in New Issue