[MERGE] Sync with trunk

bzr revid: tde@openerp.com-20131028163325-2hpks3hp23zop40n
This commit is contained in:
Thibault Delavallée 2013-10-28 17:33:25 +01:00
commit 97f164ba99
85 changed files with 2482 additions and 705 deletions

View File

@ -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: 2013-10-11 04:37+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:33+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:38+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:34+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:38+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:34+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:38+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:34+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:39+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:35+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

File diff suppressed because it is too large Load Diff

View File

@ -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: 2013-10-11 04:39+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:35+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:39+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:35+0000\n"
"X-Generator: Launchpad (build 16810)\n"
"X-Poedit-Language: Czech\n"
#. module: base

View File

@ -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: 2013-10-11 04:39+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:35+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:40+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:36+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:41+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:37+0000\n"
"X-Generator: Launchpad (build 16810)\n"
"X-Poedit-Country: GREECE\n"
"X-Poedit-Language: Greek\n"
"X-Poedit-SourceCharset: utf-8\n"

View File

@ -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: 2013-10-11 04:47+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:43+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:45+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:41+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:47+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:42+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:48+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:43+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:47+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:43+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:48+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:44+0000\n"
"X-Generator: Launchpad (build 16810)\n"
"Language: \n"
#. module: base

View File

@ -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: 2013-10-11 04:47+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:43+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:48+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:44+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-10-11 04:48+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:44+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:47+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:42+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:40+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:36+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:38+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:34+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:43+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:39+0000\n"
"X-Generator: Launchpad (build 16810)\n"
"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
"X-Poedit-Language: Persian\n"

View File

@ -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: 2013-10-11 04:49+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:44+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:40+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:36+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:40+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:36+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:47+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:43+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:41+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:36+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:41+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:37+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:41+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:37+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:41+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:37+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:44+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:40+0000\n"
"X-Generator: Launchpad (build 16810)\n"
"Language: hr\n"
#. module: base
@ -3994,7 +3994,7 @@ msgstr "12. %w ==> 5 ( Petak je 6ti dan)"
#. module: base
#: constraint:res.partner.category:0
msgid "Error ! You can not create recursive categories."
msgstr "Graška ! Ne može se stvoriti kategorije s rekurzijom."
msgstr "Greška! Ne možete kreirati rekurzivne kategorije."
#. module: base
#: view:res.lang:0
@ -8815,6 +8815,10 @@ msgid ""
"\n"
"(Document type: %s)"
msgstr ""
"Za ovu vrstu dokumenta imate pravo pristupa samo onima koje ste vi "
"kreirali.\n"
"\n"
"(Vrstu dokumenta: %s)"
#. module: base
#: view:base.language.export:0
@ -9872,7 +9876,7 @@ msgstr "Kreirano"
#: help:ir.actions.server,model_id:0
msgid ""
"Select the object on which the action will work (read, write, create)."
msgstr "Odaberite objekt na koje će akcija raditi (read, write, create)."
msgstr "Odaberite objekt na koje će akcija raditi (čitaj, piši, kreiraj)."
#. module: base
#: field:base.language.import,name:0

View File

@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
"PO-Revision-Date: 2013-03-14 10:08+0000\n"
"Last-Translator: krnkris <Unknown>\n"
"PO-Revision-Date: 2013-10-15 13:13+0000\n"
"Last-Translator: tdombos <Unknown>\n"
"Language-Team: Hungarian <openerp-hungarian-team@lists.launchpad.net>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-10-11 04:41+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:37+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -6230,7 +6230,7 @@ msgstr "Kenya"
#: model:ir.actions.act_window,name:base.action_translation
#: model:ir.ui.menu,name:base.menu_action_translation
msgid "Translated Terms"
msgstr "Lefordított feltételek"
msgstr "Lefordított kifejezések"
#. module: base
#: selection:base.language.install,lang:0
@ -12491,7 +12491,7 @@ msgstr "This method does not exist anymore"
#: model:ir.actions.act_window,name:base.action_wizard_update_translations
#: model:ir.ui.menu,name:base.menu_wizard_update_translations
msgid "Synchronize Terms"
msgstr "Feltételek szinkronizáása"
msgstr "Kifejezések szinkronizáása"
#. module: base
#: field:res.lang,thousands_sep:0
@ -13640,7 +13640,7 @@ msgstr "Érvénytelen adatbázis azonosító '%s' ehhez a mezőhöz '%%(field)s'
#. module: base
#: view:res.lang:0
msgid "Update Languague Terms"
msgstr "Nyelvi feltételek frissítése"
msgstr "Nyelvi kifejezések frissítése"
#. module: base
#: field:workflow.activity,join_mode:0

View File

@ -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: 2013-10-11 04:38+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:34+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:42+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:38+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:42+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:37+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:42+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:38+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:42+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:38+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -4448,7 +4448,7 @@ msgstr "メールサーバを特に指定しないメールは最も高い優先
#. module: base
#: model:ir.module.module,summary:base.module_sale
msgid "Quotations, Sales Orders, Invoicing"
msgstr ""
msgstr "見積、受注、請求"
#. module: base
#: field:res.partner,parent_id:0
@ -5037,7 +5037,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_event_sale
msgid "Events Sales"
msgstr ""
msgstr "イベント販売"
#. module: base
#: model:res.country,name:base.ls
@ -7967,7 +7967,7 @@ msgstr ""
#: view:res.partner:0
#: field:res.partner,user_id:0
msgid "Salesperson"
msgstr ""
msgstr "営業担当者"
#. module: base
#: view:res.lang:0
@ -9727,7 +9727,7 @@ msgstr "カスタム"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_margin
msgid "Margins in Sales Orders"
msgstr "受注オーダーのマージン"
msgstr "受注マージン"
#. module: base
#: model:ir.module.module,shortdesc:base.module_purchase
@ -10478,7 +10478,7 @@ msgstr "この会社に関連した銀行口座"
#: model:ir.ui.menu,name:base.menu_sales
#: model:ir.ui.menu,name:base.next_id_64
msgid "Sales"
msgstr "受注"
msgstr "販売"
#. module: base
#: field:ir.actions.server,child_ids:0
@ -10814,7 +10814,7 @@ msgstr "ユーザ自身がダッシュボードビューWebクライアント
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_stock
msgid "Sales and Warehouse Management"
msgstr ""
msgstr "販売・倉庫管理"
#. module: base
#: model:ir.module.module,description:base.module_hr_recruitment
@ -15538,7 +15538,7 @@ msgstr "コンテキスト"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_mrp
msgid "Sales and MRP Management"
msgstr "受注とMRP管理"
msgstr "販売・MRP管理"
#. module: base
#: model:ir.actions.act_window,help:base.action_partner_form

View File

@ -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: 2013-10-11 04:40+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:36+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:42+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:38+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:42+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:38+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:43+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:39+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:43+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:38+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:43+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:39+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:43+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:39+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -12022,6 +12022,31 @@ msgid ""
" Reporting / Accounting / **Follow-ups Analysis\n"
"\n"
msgstr ""
"\n"
"Төлөгдөөгүй нэхэмжлэлүүдэд олон шаттай дуудлаг хийх, захиадал явуулах ажлыг "
"автоматжуулах модуль.\n"
"=========================================================================\n"
"\n"
"Дараах менюгээр олон шатлалтай дуудлагуудыг тодорхойлж болно:\n"
"---------------------------------------------------------------\n"
" Тохиргоо / Мөшгөлтийн Түвшин\n"
" \n"
"Нэгэнт тодорхойлсон бол дараах менюгээр орж дуудлагуудын автоматаар тогтмол "
"хэвлэж болно:\n"
"-----------------------------------------------------------------------------"
"-------------------------\n"
" Төлбөрийн Мөшгөлт / Имэйл болон захидал илгээх\n"
"\n"
"Энэ нь PDF үүсгэх / имэйл илгээх / гар үйлдлүүдийг олон шатлалтай дуудлага "
"дээр үндэслэн үүсгэдэг. \n"
"Ялгаатай компаниудад ялгаатай бодлогыг тодорхойлж болно. \n"
"\n"
"Хэрэв тухайлсан харилцагч/дансны бичилт дээр мөшгөлтийг шалгахыг хүсвэл "
"дараах менюгээр хийх боломжтой:\n"
"-----------------------------------------------------------------------------"
"-------------------------------------\n"
" Тайлан / Санхүү / **Мөшгөлтийн шинжилгээ\n"
"\n"
#. module: base
#: code:addons/base/ir/ir_model.py:735
@ -12196,6 +12221,20 @@ msgid ""
"You can define the different phases of interviews and easily rate the "
"applicant from the kanban view.\n"
msgstr ""
"\n"
"Ажлын байр, ажилтан авах процессийг удирдана\n"
"================================================\n"
"\n"
"Энэ модуль нь ажлыг хөтлөх, амралтыг хөтлөх, өргөдөл болон ярилцлагыг хөтлөх "
"зэрэг ажлыг хялбараар хийх боломжийг олгодог...\n"
"\n"
"Энэ нь имэйл үүдтэй уялддаг бөгөөд <jobs@yourcompany.com> гэсэн хаяг руу "
"ирсэн имэйлээс өргөдлүүдийг татан авдаг. Мөн баримтын модультай уялдсан "
"байдаг бөгөөд файлаар ирсэн CV-үүдийг хадгалж дараа хайлт хийх боломжийг "
"бүрдүүлдэг. Үүнтэй төстэйгээр Санал асуулга модультай уялдаж ярилцлагыг "
"хөтлөдөг. \n"
"Ярилцлагын ялгаатай шатуудыг тодорхойлж эдгээртээ үнэлгээ өгөх зэрэг ажлыг "
"канбан харагдацаас хялбараар хийж болдог.\n"
#. module: base
#: field:ir.model.fields,model:0
@ -12242,7 +12281,7 @@ msgstr ""
#. module: base
#: help:res.partner,ean13:0
msgid "BarCode"
msgstr ""
msgstr "Зураасан код"
#. module: base
#: help:ir.model.fields,model_id:0
@ -12423,7 +12462,7 @@ msgstr "Оффисын Хангамжууд"
#. module: base
#: field:ir.attachment,res_model:0
msgid "Resource Model"
msgstr "Нөөцийн модел"
msgstr "Нөөц модел"
#. module: base
#: code:addons/custom.py:555
@ -12721,6 +12760,9 @@ msgid ""
"Allow users to sign up through OAuth2 Provider.\n"
"===============================================\n"
msgstr ""
"\n"
"OAuth2-р хэрэглэгчид бүртгүүлэх, нэвтрэх боломжийг олгодог.\n"
"===============================================\n"
#. module: base
#: field:change.password.user,user_id:0
@ -12744,7 +12786,7 @@ msgstr "Пуэрто Рико"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_tests_demo
msgid "Demonstration of web/javascript tests"
msgstr ""
msgstr "Веб/javascript тестийн жишээ, үзүүлэн"
#. module: base
#: field:workflow.transition,signal:0
@ -13076,6 +13118,13 @@ msgid ""
"\n"
"The decimal precision is configured per company.\n"
msgstr ""
"\n"
"Үнийн нарийвчлалыг тохируулахыг олон зорилгоор ашиглаж болно: санхүү, "
"борлуулалт, худалдан авалт\n"
"============================================================================="
"====================\n"
"\n"
"Аравны нарийвчлал нь компанийн хүрээнд хийгдэнэ.\n"
#. module: base
#: selection:res.company,paper_format:0
@ -13175,6 +13224,9 @@ msgid ""
"(if you delete a native ACL, it will be re-created when you reload the "
"module."
msgstr ""
"Идэвхтэй талбарыг сонгоогүй тохиолдолд ACL-г устгалгүйгээр идэвхгүй болгоно. "
"(Анхны эх ACL-г устгасан байлаа ч модулийг ахин ачаалахад дахин шинээр "
"үүсдэг)"
#. module: base
#: model:ir.model,name:base.model_ir_fields_converter
@ -13230,6 +13282,17 @@ msgid ""
"into mail.message with attachments.\n"
" "
msgstr ""
"\n"
"Энэ модуль нь Outlook Залгаасыг өгдөг.\n"
"=========================================\n"
"\n"
"Outlook залгаас нь MS Outlook дотороосоо имэйлдээ OpenERP обьекуудтыг \n"
"сонгох хавсаргах боломжийг олгодог. Харилцагч, даалгавар, төсөл, "
"шинжилгээний данс \n"
"гэх мэт дуртай обьектоо сонгож имэйлдээ оруулж mail.message обьектот "
"хавсралтын хамт\n"
"архивладаг.\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_bo
@ -17186,6 +17249,15 @@ msgid ""
" </p>\n"
" "
msgstr ""
"<p class=\"oe_view_nocontent_create\">\n"
" Хаягийн дэвтэртэй холбогч нэмэхээр бол дарна.\n"
" </p><p>\n"
" OpenERP нь захиалагчтай холбоотой бүх үйл ажиллагааг хялбар "
"хөтлөдөг, үүнд: \n"
" захиалагчтай харилцсан харилцаа, бизнес боломжийн түүх, "
"баримтууд гэх мэт.\n"
" </p>\n"
" "
#. module: base
#: model:res.partner.category,name:base.res_partner_category_2
@ -17228,6 +17300,17 @@ msgid ""
"on a supplier purchase order into several accounts and analytic plans.\n"
" "
msgstr ""
"\n"
"Шинжилгээний тархалт болон худалдан авалтын захиалгын менежментийг хийх "
"суурь модуль.\n"
"====================================================================\n"
"\n"
"Шинжилгээний хэд хэдэн төлөвлөгөөг үүсгэх боломжийг хэрэглэгчид олгодог. Энэ "
"нь нийлүүлэгчийн\n"
"худалдан авалтын захиалгын нэг мөр дээр олон данс болон шинжилгээний "
"төлөвлөгөөг сонгож, хуваах \n"
"боломжийг олгодог.\n"
" "
#. module: base
#: model:res.country,name:base.lk
@ -17247,7 +17330,7 @@ msgstr "Орос хэл / русский язык"
#. module: base
#: model:ir.module.module,shortdesc:base.module_auth_signup
msgid "Signup"
msgstr ""
msgstr "Бүртгүүлэх"
#, python-format
#~ msgid "new"

View File

@ -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: 2013-10-11 04:43+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:39+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:39+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:35+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:47+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:43+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:44+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:39+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:44+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:40+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:46+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:42+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:44+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:40+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:44+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:40+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:45+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:40+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:45+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:41+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:38+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:34+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:44+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:40+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:49+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:44+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:45+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:41+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:45+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:41+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:45+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:41+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:46+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:41+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:46+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:42+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:46+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:42+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:46+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:42+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:48+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:44+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:46+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:42+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -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: 2013-10-11 04:48+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-10-24 04:43+0000\n"
"X-Generator: Launchpad (build 16810)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -262,10 +262,14 @@ class ir_attachment(osv.osv):
return len(result) if count else list(result)
def read(self, cr, uid, ids, fields_to_read=None, context=None, load='_classic_read'):
if isinstance(ids, (int, long)):
ids = [ids]
self.check(cr, uid, ids, 'read', context=context)
return super(ir_attachment, self).read(cr, uid, ids, fields_to_read, context, load)
def write(self, cr, uid, ids, vals, context=None):
if isinstance(ids, (int, long)):
ids = [ids]
self.check(cr, uid, ids, 'write', context=context, values=vals)
if 'file_size' in vals:
del vals['file_size']
@ -276,6 +280,8 @@ class ir_attachment(osv.osv):
return super(ir_attachment, self).copy(cr, uid, id, default, context)
def unlink(self, cr, uid, ids, context=None):
if isinstance(ids, (int, long)):
ids = [ids]
self.check(cr, uid, ids, 'unlink', context=context)
location = self.pool.get('ir.config_parameter').get_param(cr, uid, 'ir_attachment.location')
if location:

View File

@ -192,7 +192,7 @@ class ir_fields_converter(orm.Model):
def _str_id(self, cr, uid, model, column, value, context=None):
return value, []
_str_to_char = _str_to_text = _str_to_binary = _str_id
_str_to_reference = _str_to_char = _str_to_text = _str_to_binary = _str_id
def _str_to_date(self, cr, uid, model, column, value, context=None):
try:

View File

@ -198,6 +198,7 @@ class ir_model(osv.osv):
select=vals.get('select_level', '0'),
update_custom_fields=True)
self.pool[vals['model']]._auto_init(cr, ctx)
self.pool[vals['model']]._auto_end(cr, ctx) # actually create FKs!
openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname)
return res
@ -356,6 +357,7 @@ class ir_model_fields(osv.osv):
select=vals.get('select_level', '0'),
update_custom_fields=True)
self.pool[vals['model']]._auto_init(cr, ctx)
self.pool[vals['model']]._auto_end(cr, ctx) # actually create FKs!
openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname)
return res
@ -470,6 +472,7 @@ class ir_model_fields(osv.osv):
for col_name, col_prop, val in patch_struct[1]:
setattr(obj._columns[col_name], col_prop, val)
obj._auto_init(cr, ctx)
obj._auto_end(cr, ctx) # actually create FKs!
openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname)
return res

View File

@ -161,18 +161,18 @@ class ir_translation(osv.osv):
'''
if context is None:
context = {}
res = {}
res = dict.fromkeys(ids, False)
for record in self.browse(cr, uid, ids, context=context):
if record.type != 'model':
res[record.id] = record.src
else:
model_name, field = record.name.split(',')
model = self.pool.get(model_name)
#We need to take the context without the language information, because we want to read the
#value store in db and not on the one associate with current language.
context_wo_lang = context.copy()
context_wo_lang.pop('lang', None)
res[record.id] = model.read(cr, uid, record.res_id, [field], context=context_wo_lang)[field]
if model and model.exists(cr, uid, record.res_id, context=context):
# Pass context without lang, need to read real stored field, not translation
context_no_lang = dict(context, lang=None)
result = model.read(cr, uid, record.res_id, [field], context=context_no_lang)
res[record.id] = result[field] if result else False
return res
def _set_src(self, cr, uid, id, name, value, args, context=None):

View File

@ -34,6 +34,7 @@
<field name="lang"/>
</group>
<group>
<field name="module" group="base.group_no_one"/>
<field name="type"/>
<field name="res_id"/>
</group>

View File

@ -47,33 +47,8 @@ class base_module_import(osv.osv_memory):
}
def importzip(self, cr, uid, ids, context):
(data,) = self.browse(cr, uid, ids , context=context)
module_data = data.module_file
zip_data = base64.decodestring(module_data)
fp = StringIO()
fp.write(zip_data)
try:
file_data = zipfile.ZipFile(fp, 'r')
except zipfile.BadZipfile:
raise osv.except_osv(_('Error!'), _('File is not a zip file!'))
init_file_name = sorted(file_data.namelist())[0]
module_name = os.path.split(init_file_name)[0]
file_path = os.path.join(ADDONS_PATH, '%s.zip' % module_name)
try:
zip_file = open(file_path, 'wb')
except IOError:
raise osv.except_osv(_('Error!'),
_('Can not create the module file: %s!') % \
(file_path,) )
zip_file.write(zip_data)
zip_file.close()
self.pool.get('ir.module.module').update_list(cr, uid,
{'module_name': module_name,})
self.write(cr, uid, ids, {'state':'done', 'module_name': module_name},
context)
return False
#TODO: drop this model and the corresponding view/action in trunk
raise NotImplementedError('This feature is not available')
def action_module_open(self, cr, uid, ids, context):
(data,) = self.browse(cr, uid, ids , context=context)

View File

@ -171,13 +171,6 @@ class res_users(osv.osv):
def on_change_login(self, cr, uid, ids, login, context=None):
return {'value': {'email': login}}
def on_change_company_id(self, cr, uid, ids, company_id):
return {'warning' : {
'title': _("Company Switch Warning"),
'message': _("Please keep in mind that documents currently displayed may not be relevant after switching to another company. If you have unsaved changes, please make sure to save and close all forms before switching to a different company. (You can click on Cancel in the User Preferences now)"),
}
}
def onchange_state(self, cr, uid, ids, state_id, context=None):
partner_ids = [user.partner_id.id for user in self.browse(cr, uid, ids, context=context)]
return self.pool.get('res.partner').onchange_state(cr, uid, partner_ids, state_id, context=context)

View File

@ -283,7 +283,7 @@
<field name="lang" readonly="0"/>
<field name="tz" readonly="0"/>
<field name="company_id" widget="selection" readonly="0"
groups="base.group_multi_company" on_change="on_change_company_id(company_id)"/>
groups="base.group_multi_company"/>
</group>
<group string="Email Preferences">
<field name="email" widget="email" readonly="0"/>

File diff suppressed because it is too large Load Diff

View File

@ -166,11 +166,15 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
# upgrading the module information
modobj.write(cr, SUPERUSER_ID, [module_id], modobj.get_values_from_terp(package.data))
_load_data(cr, module_name, idref, mode, kind='data')
if hasattr(package, 'demo') or (package.dbdemo and package.state != 'installed'):
has_demo = hasattr(package, 'demo') or (package.dbdemo and package.state != 'installed')
if has_demo:
status['progress'] = (index + 0.75) / len(graph)
_load_data(cr, module_name, idref, mode, kind='demo')
cr.execute('update ir_module_module set demo=%s where id=%s', (True, module_id))
migrations.migrate_module(package, 'post')
if has_demo:
# launch tests only in demo mode, as most tests will depend
# on demo data. Other tests can be added into the regular
# 'data' section, but should probably not alter the data,
@ -186,8 +190,6 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
processed_modules.append(package.name)
migrations.migrate_module(package, 'post')
ver = adapt_version(package.data['version'])
# Set new modules and dependencies
modobj.write(cr, SUPERUSER_ID, [module_id], {'state': 'installed', 'latest_version': ver})

View File

@ -305,18 +305,16 @@ class RegistryManager(object):
r, c = cr.fetchone()
# Check if the model registry must be reloaded (e.g. after the
# database has been updated by another process).
if registry.base_registry_signaling_sequence != r:
if registry.base_registry_signaling_sequence > 1 and registry.base_registry_signaling_sequence != r:
changed = True
_logger.info("Reloading the model registry after database signaling.")
registry = cls.new(db_name)
registry.base_registry_signaling_sequence = r
# Check if the model caches must be invalidated (e.g. after a write
# occured on another process). Don't clear right after a registry
# has been reload.
elif registry.base_cache_signaling_sequence != c:
elif registry.base_cache_signaling_sequence > 1 and registry.base_cache_signaling_sequence != c:
changed = True
_logger.info("Invalidating all model caches after database signaling.")
registry.base_cache_signaling_sequence = c
registry.clear_caches()
registry.reset_any_cache_cleared()
# One possible reason caches have been invalidated is the
@ -326,6 +324,8 @@ class RegistryManager(object):
for column in model._columns.values():
if hasattr(column, 'digits_change'):
column.digits_change(cr)
registry.base_registry_signaling_sequence = r
registry.base_cache_signaling_sequence = c
finally:
cr.close()
return changed

View File

@ -117,8 +117,7 @@ class _column(object):
self.groups = False # CSV list of ext IDs of groups that can access this field
self.deprecated = False # Optional deprecation warning
for a in args:
if args[a]:
setattr(self, a, args[a])
setattr(self, a, args[a])
def restart(self):
pass
@ -208,27 +207,29 @@ class reference(_column):
return model.name_get(cr, uid, [int(res_id)], context=context)[0][1]
return tools.ustr(value)
# takes a string (encoded in utf8) and returns a string (encoded in utf8)
def _symbol_set_char(self, symb):
#TODO:
# * we need to remove the "symb==False" from the next line BUT
# for now too many things rely on this broken behavior
# * the symb==None test should be common to all data types
if symb is None or symb == False:
return None
# we need to convert the string to a unicode object to be able
# to evaluate its length (and possibly truncate it) reliably
u_symb = tools.ustr(symb)
return u_symb[:self.size].encode('utf8')
class char(_column):
_type = 'char'
def __init__(self, string="unknown", size=None, **args):
_column.__init__(self, string=string, size=size or None, **args)
self._symbol_set = (self._symbol_c, self._symbol_set_char)
# takes a string (encoded in utf8) and returns a string (encoded in utf8)
def _symbol_set_char(self, symb):
#TODO:
# * we need to remove the "symb==False" from the next line BUT
# for now too many things rely on this broken behavior
# * the symb==None test should be common to all data types
if symb is None or symb == False:
return None
# we need to convert the string to a unicode object to be able
# to evaluate its length (and possibly truncate it) reliably
u_symb = tools.ustr(symb)
return u_symb[:self.size].encode('utf8')
# self._symbol_set_char defined to keep the backward compatibility
self._symbol_f = self._symbol_set_char = lambda x: _symbol_set_char(self, x)
self._symbol_set = (self._symbol_c, self._symbol_f)
class text(_column):
@ -1150,6 +1151,11 @@ class function(_column):
self._symbol_f = integer._symbol_f
self._symbol_set = integer._symbol_set
if type == 'char':
self._symbol_c = char._symbol_c
self._symbol_f = lambda x: _symbol_set_char(self, x)
self._symbol_set = (self._symbol_c, self._symbol_f)
def digits_change(self, cr):
if self._type == 'float':
if self.digits_compute:

View File

@ -1010,8 +1010,10 @@ class BaseModel(object):
raise except_orm('Error',
('Invalid function definition %s in object %s !\nYou must use the definition: store={object:(fnct, fields, priority, time length)}.' % (store_field, self._name)))
self.pool._store_function.setdefault(object, [])
self.pool._store_function[object].append((self._name, store_field, fnct, tuple(fields2) if fields2 else None, order, length))
self.pool._store_function[object].sort(lambda x, y: cmp(x[4], y[4]))
t = (self._name, store_field, fnct, tuple(fields2) if fields2 else None, order, length)
if not t in self.pool._store_function[object]:
self.pool._store_function[object].append((self._name, store_field, fnct, tuple(fields2) if fields2 else None, order, length))
self.pool._store_function[object].sort(lambda x, y: cmp(x[4], y[4]))
for (key, _, msg) in self._sql_constraints:
self.pool._sql_error[self._table+'_'+key] = msg
@ -2461,8 +2463,12 @@ class BaseModel(object):
"""
Record the creation of a constraint for this model, to make it possible
to delete it later when the module is uninstalled. Type can be either
'f' or 'u' depending on the constraing being a foreign key or not.
'f' or 'u' depending on the constraint being a foreign key or not.
"""
if not self._module:
# no need to save constraints for custom models as they're not part
# of any module
return
assert type in ('f', 'u')
cr.execute("""
SELECT 1 FROM ir_model_constraint, ir_module_module
@ -4122,9 +4128,9 @@ class BaseModel(object):
return browse_null()
def _store_get_values(self, cr, uid, ids, fields, context):
"""Returns an ordered list of fields.functions to call due to
"""Returns an ordered list of fields.function to call due to
an update operation on ``fields`` of records with ``ids``,
obtained by calling the 'store' functions of these fields,
obtained by calling the 'store' triggers of these fields,
as setup by their 'store' attribute.
:return: [(priority, model_name, [record_ids,], [function_fields,])]
@ -4133,42 +4139,46 @@ class BaseModel(object):
stored_functions = self.pool._store_function.get(self._name, [])
# use indexed names for the details of the stored_functions:
model_name_, func_field_to_compute_, id_mapping_fnct_, trigger_fields_, priority_ = range(5)
model_name_, func_field_to_compute_, target_ids_func_, trigger_fields_, priority_ = range(5)
# only keep functions that should be triggered for the ``fields``
# only keep store triggers that should be triggered for the ``fields``
# being written to.
to_compute = [f for f in stored_functions \
triggers_to_compute = [f for f in stored_functions \
if ((not f[trigger_fields_]) or set(fields).intersection(f[trigger_fields_]))]
mapping = {}
for function in to_compute:
# use admin user for accessing objects having rules defined on store fields
target_ids = [id for id in function[id_mapping_fnct_](self, cr, SUPERUSER_ID, ids, context) if id]
to_compute_map = {}
target_id_results = {}
for store_trigger in triggers_to_compute:
target_func_id_ = id(store_trigger[target_ids_func_])
if not target_func_id_ in target_id_results:
# use admin user for accessing objects having rules defined on store fields
target_id_results[target_func_id_] = [i for i in store_trigger[target_ids_func_](self, cr, SUPERUSER_ID, ids, context) if i]
target_ids = target_id_results[target_func_id_]
# the compound key must consider the priority and model name
key = (function[priority_], function[model_name_])
key = (store_trigger[priority_], store_trigger[model_name_])
for target_id in target_ids:
mapping.setdefault(key, {}).setdefault(target_id,set()).add(tuple(function))
to_compute_map.setdefault(key, {}).setdefault(target_id,set()).add(tuple(store_trigger))
# Here mapping looks like:
# { (10, 'model_a') : { target_id1: [ (function_1_tuple, function_2_tuple) ], ... }
# (20, 'model_a') : { target_id2: [ (function_3_tuple, function_4_tuple) ], ... }
# (99, 'model_a') : { target_id1: [ (function_5_tuple, function_6_tuple) ], ... }
# Here to_compute_map looks like:
# { (10, 'model_a') : { target_id1: [ (trigger_1_tuple, trigger_2_tuple) ], ... }
# (20, 'model_a') : { target_id2: [ (trigger_3_tuple, trigger_4_tuple) ], ... }
# (99, 'model_a') : { target_id1: [ (trigger_5_tuple, trigger_6_tuple) ], ... }
# }
# Now we need to generate the batch function calls list
# call_map =
# { (10, 'model_a') : [(10, 'model_a', [record_ids,], [function_fields,])] }
call_map = {}
for ((priority,model), id_map) in mapping.iteritems():
functions_ids_maps = {}
for ((priority,model), id_map) in to_compute_map.iteritems():
trigger_ids_maps = {}
# function_ids_maps =
# { (function_1_tuple, function_2_tuple) : [target_id1, target_id2, ..] }
for id, functions in id_map.iteritems():
functions_ids_maps.setdefault(tuple(functions), []).append(id)
for functions, ids in functions_ids_maps.iteritems():
call_map.setdefault((priority,model),[]).append((priority, model, ids,
[f[func_field_to_compute_] for f in functions]))
for target_id, triggers in id_map.iteritems():
trigger_ids_maps.setdefault(tuple(triggers), []).append(target_id)
for triggers, target_ids in trigger_ids_maps.iteritems():
call_map.setdefault((priority,model),[]).append((priority, model, target_ids,
[t[func_field_to_compute_] for t in triggers]))
ordered_keys = call_map.keys()
ordered_keys.sort()
result = []

View File

@ -149,6 +149,59 @@ class TestCleaner(unittest2.TestCase):
for text in out_lst:
self.assertNotIn(text, new_html, 'html_email_cleaner did not remove unwanted content')
def test_05_shorten(self):
# TEST: shorten length
test_str = '''<div>
<span>
</span>
<p>Hello, <span>Raoul</span>
<bold>You</bold> are
pretty</p>
<span>Really</span>
</div>
'''
# shorten at 'H' of Hello -> should shorten after Hello,
html = html_email_clean(test_str, shorten=True, max_length=1, remove=True)
self.assertIn('Hello,', html, 'html_email_cleaner: shorten error or too short')
self.assertNotIn('Raoul', html, 'html_email_cleaner: shorten error or too long')
self.assertIn('read more', html, 'html_email_cleaner: shorten error about read more inclusion')
# shorten at 'are' -> should shorten after are
html = html_email_clean(test_str, shorten=True, max_length=17, remove=True)
self.assertIn('Hello,', html, 'html_email_cleaner: shorten error or too short')
self.assertIn('Raoul', html, 'html_email_cleaner: shorten error or too short')
self.assertIn('are', html, 'html_email_cleaner: shorten error or too short')
self.assertNotIn('pretty', html, 'html_email_cleaner: shorten error or too long')
self.assertNotIn('Really', html, 'html_email_cleaner: shorten error or too long')
self.assertIn('read more', html, 'html_email_cleaner: shorten error about read more inclusion')
# TEST: shorten in quote
test_str = '''<div> Blahble
bluih blouh
<blockquote>This is a quote
<span>And this is quite a long quote, after all.</span>
</blockquote>
</div>'''
# shorten in the quote
html = html_email_clean(test_str, shorten=True, max_length=25, remove=True)
self.assertIn('Blahble', html, 'html_email_cleaner: shorten error or too short')
self.assertIn('bluih', html, 'html_email_cleaner: shorten error or too short')
self.assertIn('blouh', html, 'html_email_cleaner: shorten error or too short')
self.assertNotIn('quote', html, 'html_email_cleaner: shorten error or too long')
self.assertIn('read more', html, 'html_email_cleaner: shorten error about read more inclusion')
# shorten in second word
html = html_email_clean(test_str, shorten=True, max_length=9, remove=True)
self.assertIn('Blahble', html, 'html_email_cleaner: shorten error or too short')
self.assertIn('bluih', html, 'html_email_cleaner: shorten error or too short')
self.assertNotIn('blouh', html, 'html_email_cleaner: shorten error or too short')
self.assertNotIn('quote', html, 'html_email_cleaner: shorten error or too long')
self.assertIn('read more', html, 'html_email_cleaner: shorten error about read more inclusion')
# shorten waaay too large
html = html_email_clean(test_str, shorten=True, max_length=900, remove=True)
self.assertIn('Blahble', html, 'html_email_cleaner: shorten error or too short')
self.assertIn('bluih', html, 'html_email_cleaner: shorten error or too short')
self.assertIn('blouh', html, 'html_email_cleaner: shorten error or too short')
self.assertNotIn('quote', html, 'html_email_cleaner: shorten error or too long')
def test_10_email_text(self):
""" html_email_clean test for text-based emails """
new_html = html_email_clean(test_mail_examples.TEXT_1, remove=True)
@ -257,6 +310,19 @@ class TestCleaner(unittest2.TestCase):
'tasks using the gantt chart and control deadlines']:
self.assertIn(ext, new_html, 'html_email_cleaner wrongly take into account specific expand options')
def test_70_read_more(self):
new_html = html_email_clean(test_mail_examples.BUG1, remove=True, shorten=True, max_length=100)
for ext in test_mail_examples.BUG_1_IN:
self.assertIn(ext, new_html, 'html_email_cleaner wrongly removed valid content')
for ext in test_mail_examples.BUG_1_OUT:
self.assertNotIn(ext, new_html, 'html_email_cleaner did not removed invalid content')
new_html = html_email_clean(test_mail_examples.BUG2, remove=True, shorten=True, max_length=250)
for ext in test_mail_examples.BUG_2_IN:
self.assertIn(ext, new_html, 'html_email_cleaner wrongly removed valid content')
for ext in test_mail_examples.BUG_2_OUT:
self.assertNotIn(ext, new_html, 'html_email_cleaner did not removed invalid content')
def test_90_misc(self):
# False boolean for text must return empty string
new_html = html_email_clean(False)

View File

@ -785,3 +785,322 @@ MSOFFICE_3 = """<div>
MSOFFICE_3_IN = ['I saw your boss yesterday']
MSOFFICE_3_OUT = ['I noticed you recently downloaded OpenERP.', 'You indicated that you wish', 'Belgium: +32.81.81.37.00']
# ------------------------------------------------------------
# Test cases coming from bugs
# ------------------------------------------------------------
# bug: read more not apparent, strange message in read more span
BUG1 = """<pre>Hi Migration Team,
Paragraph 1, blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah.
Paragraph 2, blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah.
Paragraph 3, blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah.
Thanks.
Regards,
--
Olivier Laurent
Migration Manager
OpenERP SA
Chaussée de Namur, 40
B-1367 Gérompont
Tel: +32.81.81.37.00
Web: http://www.openerp.com</pre>"""
BUG_1_IN = [
'Hi Migration Team',
'Paragraph 1'
]
BUG_1_OUT = [
'Olivier Laurent',
'Chaussée de Namur',
'81.81.37.00',
'openerp.com',
]
BUG2 = """
<div>
<br>
<div class="moz-forward-container"><br>
<br>
-------- Original Message --------
<table class="moz-email-headers-table" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">Subject:
</th>
<td>Fwd: TR: OpenERP S.A. Payment Reminder</td>
</tr>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">Date: </th>
<td>Wed, 16 Oct 2013 14:11:13 +0200</td>
</tr>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">From: </th>
<td>Christine Herrmann <a class="moz-txt-link-rfc2396E" href="mailto:che@openerp.com">&lt;che@openerp.com&gt;</a></td>
</tr>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">To: </th>
<td><a class="moz-txt-link-abbreviated" href="mailto:online@openerp.com">online@openerp.com</a></td>
</tr>
</tbody>
</table>
<br>
<br>
<br>
<div class="moz-forward-container"><br>
<br>
-------- Message original --------
<table class="moz-email-headers-table" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">Sujet:
</th>
<td>TR: OpenERP S.A. Payment Reminder</td>
</tr>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">Date&nbsp;:
</th>
<td>Wed, 16 Oct 2013 10:34:45 -0000</td>
</tr>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">De&nbsp;: </th>
<td>Ida Siwatala <a class="moz-txt-link-rfc2396E" href="mailto:infos@inzoservices.com">&lt;infos@inzoservices.com&gt;</a></td>
</tr>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">Répondre
à&nbsp;: </th>
<td><a class="moz-txt-link-abbreviated" href="mailto:catchall@openerp.my.openerp.com">catchall@openerp.my.openerp.com</a></td>
</tr>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">Pour&nbsp;:
</th>
<td>Christine Herrmann (che) <a class="moz-txt-link-rfc2396E" href="mailto:che@openerp.com">&lt;che@openerp.com&gt;</a></td>
</tr>
</tbody>
</table>
<br>
<br>
<div>
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Bonjour,</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D"></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Pourriez-vous
me faire un retour sur ce point.</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D"></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Cordialement</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D"></span></p>
<p>&nbsp;</p>
<div>
<div style="border:none;border-top:solid #B5C4DF
1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">De&nbsp;:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">
Ida Siwatala [<a class="moz-txt-link-freetext" href="mailto:infos@inzoservices.com">mailto:infos@inzoservices.com</a>]
<br>
<b>Envoyé&nbsp;:</b> vendredi 4 octobre 2013 20:03<br>
<b>À&nbsp;:</b> 'Followers of
INZO-services-8-all-e-Maxime-Lisbonne-77176-Savigny-le-temple-France'<br>
<b>Objet&nbsp;:</b> RE: OpenERP S.A. Payment Reminder</span></p>
</div>
</div>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Bonsoir,</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D"></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Je
me permets de revenir vers vous par écrit , car jai
fait 2 appels vers votre service en exposant mon
problème, mais je nai pas eu de retour.</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Cela
fait un mois que jai fait la souscription de votre
produit, mais je me rends compte quil est pas adapté à
ma situation ( fonctionnalité manquante et surtout je
nai pas beaucoup de temps à passer à résoudre des
bugs). </span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Cest
pourquoi , jai demandé quun accord soit trouvé avec
vous pour annuler le contrat (tout en vous payant le
mois dutilisation de septembre).</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D"></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Pourriez-vous
me faire un retour sur ce point.</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D"></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Cordialement,</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D"></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Ida
Siwatala</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D"></span></p>
<p>&nbsp;</p>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">De&nbsp;:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">
<a href="mailto:che@openerp.com">che@openerp.com</a>
[<a href="mailto:che@openerp.com">mailto:che@openerp.com</a>]
<br>
<b>Envoyé&nbsp;:</b> vendredi 4 octobre 2013 17:41<br>
<b>À&nbsp;:</b> <a href="mailto:infos@inzoservices.com">infos@inzoservices.com</a><br>
<b>Objet&nbsp;:</b> OpenERP S.A. Payment Reminder</span></p>
<p>&nbsp;</p>
<div>
<p style="background:white"><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#222222">Dear
INZO services,</span></p>
<p style="background:white"><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#222222">Exception
made if there was a mistake of ours, it seems that the
following amount stays unpaid. Please, take
appropriate measures in order to carry out this
payment in the next 8 days. </span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#222222"></span></p>
<p>&nbsp;</p>
<table class="MsoNormalTable" style="width:100.0%;border:outset 1.5pt" width="100%" border="1" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal">Date de facturation</p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal">Description</p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal">Reference</p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal">Due Date</p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal">Amount ()</p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal">Lit.</p>
</td>
</tr>
<tr>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal"><b>2013-09-24</b></p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal"><b>2013/1121</b></p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal"><b>Enterprise - Inzo Services
- Juillet 2013</b></p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal"><b>2013-09-24</b></p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal"><b>420.0</b></p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt"><br>
</td>
</tr>
<tr>
<td style="padding:.75pt .75pt .75pt .75pt"><br>
</td>
<td style="border:none;padding:.75pt .75pt .75pt
.75pt"><br>
</td>
<td style="border:none;padding:.75pt .75pt .75pt
.75pt"><br>
</td>
<td style="border:none;padding:.75pt .75pt .75pt
.75pt"><br>
</td>
<td style="border:none;padding:.75pt .75pt .75pt
.75pt"><br>
</td>
<td style="border:none;padding:.75pt .75pt .75pt
.75pt"><br>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal" style="text-align:center;background:white" align="center"><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#222222">Amount
due : 420.00 </span></p>
<p style="background:white"><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#222222">Would
your payment have been carried out after this mail was
sent, please ignore this message. Do not hesitate to
contact our accounting department. </span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#222222"><br>
Best Regards, <br>
Aurore Lesage <br>
OpenERP<br>
Chaussée de Namur, 40 <br>
B-1367 Grand Rosières <br>
Tel: +32.81.81.37.00 - Fax: +32.81.73.35.01 <br>
E-mail : <a href="mailto:ale@openerp.com">ale@openerp.com</a> <br>
Web: <a href="http://www.openerp.com">http://www.openerp.com</a></span></p>
</div>
</div>
</div>
--<br>
INZO services <small>Sent by <a style="color:inherit" href="http://www.openerp.com">OpenERP
S.A.</a> using <a style="color:inherit" href="https://www.openerp.com/">OpenERP</a>.</small>
<small>Access your messages and documents <a style="color:inherit" href="https://accounts.openerp.com?db=openerp#action=mail.action_mail_redirect&amp;login=che&amp;message_id=5750830">in
OpenERP</a></small> <br>
<pre class="moz-signature" cols="72">--
Christine Herrmann
OpenERP
Chaussée de Namur, 40
B-1367 Grand Rosières
Tel: +32.81.81.37.00 - Fax: +32.81.73.35.01
Web: <a class="moz-txt-link-freetext" href="http://www.openerp.com">http://www.openerp.com</a> </pre>
<br>
</div>
<br>
<br>
</div>
<br>
</div>"""
BUG_2_IN = [
'read more',
'...',
]
BUG_2_OUT = [
'Fwd: TR: OpenERP S.A'
'fait un mois'
]

View File

@ -203,17 +203,39 @@ def html_email_clean(html, remove=False, shorten=False, max_length=300, expand_o
iteration += 1
new_node = _insert_new_node(node, -1, new_node_tag, text[idx:] + (cur_node.tail or ''), None, {})
def _truncate_node(node, position, find_first_blank=True):
# truncate text
innertext = node.text[0:position]
outertext = node.text[position:]
if find_first_blank:
stop_idx = outertext.find(' ')
if stop_idx == -1:
stop_idx = len(outertext)
def _truncate_node(node, position, simplify_whitespaces=True):
""" Truncate a node text at a given position. This algorithm will shorten
at the end of the word whose ending character exceeds position.
:param bool simplify_whitespaces: whether to try to count all successive
whitespaces as one character. This
option should not be True when trying
to keep 'pre' consistency.
"""
if node.text is None:
node.text = ''
truncate_idx = -1
if simplify_whitespaces:
cur_char_nbr = 0
word = None
node_words = node.text.strip(' \t\r\n').split()
for word in node_words:
cur_char_nbr += len(word)
if cur_char_nbr >= position:
break
if word:
truncate_idx = node.text.find(word) + len(word)
else:
stop_idx = 0
node.text = innertext + outertext[0:stop_idx]
truncate_idx = position
if truncate_idx == -1 or truncate_idx > len(node.text):
truncate_idx = len(node.text)
# compose new text bits
innertext = node.text[0:truncate_idx]
outertext = node.text[truncate_idx:]
node.text = innertext
# create <span> ... <a href="#">read more</a></span> node
read_more_node = _create_node(
expand_options.get('oe_expand_container_tag', 'span'),
@ -240,7 +262,7 @@ def html_email_clean(html, remove=False, shorten=False, max_length=300, expand_o
)
read_more_node.append(read_more_link_node)
# create outertext node
overtext_node = _create_node('span', outertext[stop_idx:])
overtext_node = _create_node('span', outertext)
# tag node
overtext_node.set('in_overlength', '1')
# add newly created nodes in dom
@ -272,17 +294,16 @@ def html_email_clean(html, remove=False, shorten=False, max_length=300, expand_o
html = '<div>%s</div>' % html
root = lxml.html.fromstring(html)
# remove all tails and replace them by a span element, because managing text and tails can be a pain in the ass
for node in root.getiterator():
quote_tags = re.compile(r'(\n(>)+[^\n\r]*)')
signature = re.compile(r'([-]{2,}[\s]?[\r\n]{1,2}[\s\S]+)')
for node in root.iter():
# remove all tails and replace them by a span element, because managing text and tails can be a pain in the ass
if node.tail:
tail_node = _create_node('span', node.tail)
node.tail = None
node.addnext(tail_node)
# form node and tag text-based quotes and signature
quote_tags = re.compile(r'(\n(>)+[^\n\r]*)')
signature = re.compile(r'([-]{2,}[\s]?[\r\n]{1,2}[^.]+)')
for node in root.getiterator():
# form node and tag text-based quotes and signature
_tag_matching_regex_in_text(quote_tags, node, 'span', {'text_quote': '1'})
_tag_matching_regex_in_text(signature, node, 'span', {'text_signature': '1'})
@ -296,11 +317,9 @@ def html_email_clean(html, remove=False, shorten=False, max_length=300, expand_o
overlength_section_id = None
overlength_section_count = 0
cur_char_nbr = 0
# for node in root.getiterator():
for node in root.iter():
# update: add a text argument
if node.text is None:
node.text = ''
# do not take into account multiple spaces that are displayed as max 1 space in html
node_text = ' '.join((node.text and node.text.strip(' \t\r\n') or '').split())
# root: try to tag the client used to write the html
if 'WordSection1' in node.get('class', '') or 'MsoNormal' in node.get('class', ''):
@ -347,22 +366,22 @@ def html_email_clean(html, remove=False, shorten=False, max_length=300, expand_o
# 3/ add the truncated text in a new node, next to 'read more' node
node_text = (node.text or '').strip().strip('\n').strip()
if shorten and not overlength and cur_char_nbr + len(node_text) > max_length:
overlength = True
if protect_sections:
node_to_truncate = node
while node_to_truncate.getparent() is not None and \
(node_to_truncate.getparent().get('section_inner') or node_to_truncate.getparent().get('section_closure')):
node_to_truncate = node
while node_to_truncate.getparent() is not None:
if node_to_truncate.get('in_quote'):
node_to_truncate = node_to_truncate.getparent()
overlength_section_id = node_to_truncate.get('section_closure')
position = len(node_to_truncate.text)
find_first_blank = False
else:
node_to_truncate = node
position = max_length - cur_char_nbr
find_first_blank = True
elif protect_sections and (node_to_truncate.getparent().get('section_inner') or node_to_truncate.getparent().get('section_closure')):
node_to_truncate = node_to_truncate.getparent()
overlength_section_id = node_to_truncate.get('section_closure')
else:
break
overlength = True
node_to_truncate.set('truncate', '1')
node_to_truncate.set('truncate_position', str(position))
node_to_truncate.set('truncate_blank', str(find_first_blank))
if node_to_truncate == node:
node_to_truncate.set('truncate_position', str(max_length - cur_char_nbr))
else:
node_to_truncate.set('truncate_position', str(len(node.text or '')))
cur_char_nbr += len(node_text)
# Tree modification
@ -370,7 +389,7 @@ def html_email_clean(html, remove=False, shorten=False, max_length=300, expand_o
for node in root.iter():
if node.get('truncate'):
_truncate_node(node, int(node.get('truncate_position', '0')), bool(node.get('truncate_blank', 'True')))
_truncate_node(node, int(node.get('truncate_position', '0')), node.tag != 'pre')
# Post processing
# ------------------------------------------------------------
@ -385,17 +404,20 @@ def html_email_clean(html, remove=False, shorten=False, max_length=300, expand_o
to_remove.append(node)
if node.get('tail_remove'):
node.tail = ''
# clean node
for attribute_name in ['in_quote', 'tail_remove', 'in_overlength', 'msoffice', 'hotmail', 'truncate', 'truncate_position']:
node.attrib.pop(attribute_name, None)
for node in to_remove:
if remove:
node.getparent().remove(node)
else:
if not expand_options.get('oe_expand_a_class', 'oe_mail_expand') in node.get('class', ''): # trick: read more link should be displayed even if it's in overlength
node_class = node.get('class', '') + ' ' + 'oe_mail_cleaned'
node_class = node.get('class', '') + ' oe_mail_cleaned'
node.set('class', node_class)
# html: \n that were tail of elements have been encapsulated into <span> -> back to \n
html = etree.tostring(root, pretty_print=False)
linebreaks = re.compile(r'<span>([\s]*[\r\n]+[\s]*)<\/span>', re.IGNORECASE | re.DOTALL)
linebreaks = re.compile(r'<span[^>]*>([\s]*[\r\n]+[\s]*)<\/span>', re.IGNORECASE | re.DOTALL)
html = _replace_matching_regex(linebreaks, html, '\n')
return html