Richard Mathot (OpenERP) 2014-01-30 08:34:20 +01:00
commit b5bd71e97f
94 changed files with 1770 additions and 1631 deletions

View File

@ -129,6 +129,20 @@ Administrator</field>
<field name="path">/dev/null</field>
<field name="mode">all</field>
</record>
<record id="public_user" model="res.users">
<field name="name">Public user</field>
<field name="login">public</field>
<field name="password"></field>
<!-- Avoid auto-including this demo user in any default group -->
<field name="groups_id" eval="[(5,)]"/>
<field name="image" type="base64" file="base/static/img/public_user-image.png"/>
<field name="active" eval="False"/>
<!-- TODO make res.partner active false too -->
</record>
<record id="base.group_public" model="res.groups">
<field name="users" eval="[(4, ref('base.public_user'))]"/>
</record>
</data>
</openerp>

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: 2014-01-01 05:15+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:51+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:15+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:51+0000\n"
"X-Generator: Launchpad (build 16914)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -60,12 +60,12 @@ msgstr "Kyk na argitektuur"
#. module: base
#: model:ir.module.module,summary:base.module_sale_stock
msgid "Quotation, Sale Orders, Delivery & Invoicing Control"
msgstr ""
msgstr "Kwotasie, Bestellins, Aflewerings en Faktuur beheer."
#. module: base
#: selection:ir.sequence,implementation:0
msgid "No gap"
msgstr ""
msgstr "Geep Spasie"
#. module: base
#: selection:base.language.install,lang:0
@ -89,23 +89,24 @@ msgstr ""
#. module: base
#: model:ir.module.module,summary:base.module_point_of_sale
msgid "Touchscreen Interface for Shops"
msgstr ""
msgstr "Tasskerm koppelvlak vir Winkels"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
msgid "Indian Payroll"
msgstr ""
msgstr "Indiese Betaalstaat"
#. module: base
#: help:ir.cron,model:0
msgid ""
"Model name on which the method to be called is located, e.g. 'res.partner'."
msgstr ""
"Model naam waarin die metode wat geroep word verskyn, bv. \"res.partner\"."
#. module: base
#: view:ir.module.module:0
msgid "Created Views"
msgstr ""
msgstr "Geskepte Afbeelding"
#. module: base
#: model:ir.module.module,description:base.module_product_manufacturer
@ -122,11 +123,24 @@ msgid ""
" * Product Attributes\n"
" "
msgstr ""
"\n"
"'n Module wat die vervaardegiers en eienskappe van die produk op die vorm "
"byvoeg.\n"
"===================================================================\n"
"\n"
"Jy behoort nu die volgende vir produkte te kan definieer:\n"
"-----------------------------------------------------------------------------"
"--\n"
" * Vervaardiger\n"
" * Vervaardiger Produk Naame\n"
" * Vervaardiger Produk Kode\n"
" * Produk Eienskappe\n"
" "
#. module: base
#: field:ir.actions.client,params:0
msgid "Supplementary arguments"
msgstr ""
msgstr "Aanvullende argumente"
#. module: base
#: model:ir.module.module,description:base.module_google_base_account
@ -135,11 +149,14 @@ msgid ""
"The module adds google user in res user.\n"
"========================================\n"
msgstr ""
"\n"
"Hierdie module voeg google user bu res.user.\n"
"=====================================\n"
#. module: base
#: help:res.partner,employee:0
msgid "Check this box if this contact is an Employee."
msgstr ""
msgstr "Selekteer hierdie block as die kontak 'n Verknemer is."
#. module: base
#: help:ir.model.fields,domain:0

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: 2014-01-01 05:15+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:51+0000\n"
"X-Generator: Launchpad (build 16914)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -366,7 +366,7 @@ msgstr "አክቲቭ"
#. module: base
#: field:ir.actions.wizard,wiz_name:0
msgid "Wizard Name"
msgstr "የዊዘርዱ ስም"
msgstr ""
#. module: base
#: model:ir.module.module,description:base.module_knowledge
@ -481,7 +481,7 @@ msgstr ""
msgid ""
"One of the records you are trying to modify has already been deleted "
"(Document type: %s)."
msgstr "ለማሻሻል የሞከሩት ሰነድ ከዚህ በፊት የተሰረዘ ሆኖ ተገኝትዋል (የሰነዱ አይነት፡ %s)።"
msgstr ""
#. module: base
#: help:ir.actions.act_window,views:0

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: 2014-01-01 05:15+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:52+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:16+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:52+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-16 05:17+0000\n"
"X-Generator: Launchpad (build 16901)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:52+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:16+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:52+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:16+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:53+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-06 04:39+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:53+0000\n"
"X-Generator: Launchpad (build 16914)\n"
"X-Poedit-Language: Czech\n"
#. module: base
@ -38,7 +38,7 @@ msgstr "Svatá Helena"
#. module: base
#: view:ir.actions.report.xml:0
msgid "Other Configuration"
msgstr "Další nastavení"
msgstr "Ostatní nastavení"
#. module: base
#: selection:ir.property,type:0
@ -69,7 +69,7 @@ msgstr "Nabídky, zakázky, řízení dopravy a fakturace"
#. module: base
#: selection:ir.sequence,implementation:0
msgid "No gap"
msgstr "Bez mezer"
msgstr "Bez mezery"
#. module: base
#: selection:base.language.install,lang:0
@ -9335,7 +9335,7 @@ msgstr "Stránka dokumentu"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_ar
msgid "Argentina Localization Chart Account"
msgstr ""
msgstr "Argentinská účtová osnova"
#. module: base
#: field:ir.module.module,description_html:0
@ -10393,6 +10393,10 @@ msgid ""
"=========================\n"
"\n"
msgstr ""
"\n"
"Zobrazení Openerp Web Diagramu.\n"
"=========================\n"
"\n"
#. module: base
#: model:ir.module.module,description:base.module_l10n_ch

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: 2014-01-01 05:17+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:53+0000\n"
"X-Generator: Launchpad (build 16914)\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

@ -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-01-01 05:18+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:54+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:24+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:01+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:22+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:59+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:24+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:00+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:25+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:01+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:24+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:01+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:25+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:02+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:24+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:01+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:26+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:02+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:26+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:02+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:26+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:02+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:24+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:00+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:17+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:53+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:16+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:52+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:20+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:57+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:26+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:03+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:17+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:53+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:17+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:54+0000\n"
"X-Generator: Launchpad (build 16914)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -11393,7 +11393,7 @@ msgstr "Islande"
#: model:ir.actions.act_window,name:base.ir_action_window
#: model:ir.ui.menu,name:base.menu_ir_action_window
msgid "Window Actions"
msgstr "Actions de fênetres"
msgstr "Actions de fetres"
#. module: base
#: model:ir.module.module,description:base.module_portal_project_issue

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: 2014-01-01 05:25+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:01+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:18+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:54+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:18+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:54+0000\n"
"X-Generator: Launchpad (build 16914)\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

@ -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-01-01 05:18+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:55+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:22+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:58+0000\n"
"X-Generator: Launchpad (build 16914)\n"
"Language: hr\n"
#. module: base

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: 2014-01-01 05:18+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:55+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:16+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:52+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:19+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:55+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:19+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:55+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:19+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:55+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:19+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:56+0000\n"
"X-Generator: Launchpad (build 16914)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -480,7 +480,7 @@ msgstr ""
#. module: base
#: field:ir.model.relation,name:0
msgid "Relation Name"
msgstr ""
msgstr "リレーション名"
#. module: base
#: view:ir.rule:0
@ -976,7 +976,7 @@ msgstr "ジンバブエ"
#: help:ir.model.constraint,type:0
msgid ""
"Type of the constraint: `f` for a foreign key, `u` for other constraints."
msgstr ""
msgstr "制約のタイプ:`f`は外部キー、`u`は他の制約"
#. module: base
#: view:ir.actions.report.xml:0
@ -1105,7 +1105,7 @@ msgstr "アンドラ公国"
#. module: base
#: field:ir.rule,perm_read:0
msgid "Apply for Read"
msgstr ""
msgstr "読み込みに適用"
#. module: base
#: model:res.country,name:base.mn
@ -1322,7 +1322,7 @@ msgstr "貢献者"
#. module: base
#: field:ir.rule,perm_unlink:0
msgid "Apply for Delete"
msgstr ""
msgstr "削除に適用"
#. module: base
#: selection:ir.property,type:0
@ -1420,7 +1420,7 @@ msgstr "テスト"
#. module: base
#: field:ir.actions.report.xml,attachment:0
msgid "Save as Attachment Prefix"
msgstr ""
msgstr "添付ファイルのプリフィックスとして保存"
#. module: base
#: field:ir.ui.view_sc,res_id:0
@ -1718,7 +1718,7 @@ msgstr "見積り要求や仕入先請求書といった発注関係のプロセ
#. module: base
#: help:res.partner,website:0
msgid "Website of Partner or Company"
msgstr ""
msgstr "取引先または会社のWebサイト"
#. module: base
#: help:base.language.install,overwrite:0
@ -1792,6 +1792,9 @@ msgid ""
"Launch Manually Once: after having been launched manually, it sets "
"automatically to Done."
msgstr ""
"手動:手動で起動します。\n"
"自動:システムを再設定するたびに実行します。\n"
"手動でいったん起動:手動で起動した後は自動に設定されます。"
#. module: base
#: field:res.partner,image_small:0
@ -1936,7 +1939,7 @@ msgstr "読み込みアクセス"
#. module: base
#: help:ir.attachment,res_id:0
msgid "The record id this is attached to"
msgstr ""
msgstr "これに添付するレコードID"
#. module: base
#: model:ir.module.module,description:base.module_share
@ -1969,7 +1972,7 @@ msgstr "企業の処理"
msgid ""
"Check this box if this contact is a supplier. If it's not checked, purchase "
"people will not see it when encoding a purchase order."
msgstr ""
msgstr "連絡先が仕入先の場合はこのボックスをチェックします。チェックしない場合、発注書を作成する際に表示されません。"
#. module: base
#: model:ir.module.module,shortdesc:base.module_hr_evaluation
@ -2255,7 +2258,7 @@ msgstr "バハマ"
#. module: base
#: field:ir.rule,perm_create:0
msgid "Apply for Create"
msgstr ""
msgstr "作成に適用"
#. module: base
#: model:ir.module.category,name:base.module_category_tools
@ -2277,7 +2280,7 @@ msgstr "アイルランド"
msgid ""
"Appears by default on the top right corner of your printed documents (report "
"header)."
msgstr ""
msgstr "印刷された文書(レポートヘッダ)の右上隅にデフォルトで表示されます。"
#. module: base
#: field:base.module.update,update:0
@ -2509,7 +2512,7 @@ msgstr ""
msgid ""
"View type: Tree type to use for the tree view, set to 'tree' for a "
"hierarchical tree view, or 'form' for a regular list view"
msgstr ""
msgstr "ビュータイプ:ツリー表示に使用する型式、階層ツリー表示のための「ツリー」または通常のリスト表示のための「フォーム」に設定"
#. module: base
#: sql_constraint:ir.ui.view_sc:0
@ -3280,7 +3283,7 @@ msgstr "スウェーデン"
#. module: base
#: field:ir.actions.report.xml,report_file:0
msgid "Report File"
msgstr ""
msgstr "レポートファイル"
#. module: base
#: selection:ir.actions.act_window.view,view_mode:0
@ -3595,7 +3598,7 @@ msgstr ""
#. module: base
#: field:base.language.export,modules:0
msgid "Modules To Export"
msgstr ""
msgstr "エクスポートするモジュール"
#. module: base
#: model:res.country,name:base.mt
@ -3855,7 +3858,7 @@ msgstr "トーゴ"
#: field:ir.actions.act_window,res_model:0
#: field:ir.actions.client,res_model:0
msgid "Destination Model"
msgstr ""
msgstr "宛先モデル"
#. module: base
#: selection:ir.sequence,implementation:0
@ -4202,7 +4205,7 @@ msgstr ""
#. module: base
#: model:ir.actions.server,name:base.action_run_ir_action_todo
msgid "Run Remaining Action Todo"
msgstr ""
msgstr "Todoアクションの残りを実行"
#. module: base
#: field:res.partner,ean13:0
@ -4988,7 +4991,7 @@ msgstr ""
#. module: base
#: help:ir.attachment,res_model:0
msgid "The database object this attachment will be attached to"
msgstr ""
msgstr "この添付ファイルに添付されるデータベースオブジェクト"
#. module: base
#: code:addons/base/ir/ir_fields.py:327
@ -5122,7 +5125,7 @@ msgstr "保存"
#. module: base
#: field:ir.actions.report.xml,report_xml:0
msgid "XML Path"
msgstr ""
msgstr "XMLパス"
#. module: base
#: model:res.country,name:base.bj
@ -5519,7 +5522,7 @@ msgstr "ブーベ島"
#. module: base
#: field:ir.model.constraint,type:0
msgid "Constraint Type"
msgstr ""
msgstr "制約タイプ"
#. module: base
#: field:res.company,child_ids:0
@ -5658,7 +5661,7 @@ msgstr ""
#. module: base
#: model:res.groups,name:base.group_sale_salesman_all_leads
msgid "See all Leads"
msgstr ""
msgstr "全ての見込み客を参照"
#. module: base
#: model:res.country,name:base.ci
@ -5684,7 +5687,7 @@ msgstr "リソース名"
#. module: base
#: model:ir.ui.menu,name:base.menu_ir_filters
msgid "User-defined Filters"
msgstr ""
msgstr "ユーザ定義のフィルタ"
#. module: base
#: field:ir.actions.act_window_close,name:0
@ -6074,6 +6077,8 @@ msgid ""
"deleting it (if you delete a native record rule, it may be re-created when "
"you reload the module."
msgstr ""
"アクティブなフィールドのチェックを外すと、レコードのルールを削除せずに無効化します(レコードのルールを削除すると、モジュールを再ロードするときに再作成され"
"ます)。"
#. module: base
#: selection:base.language.install,lang:0
@ -6237,7 +6242,7 @@ msgstr ""
#: help:res.country.state,name:0
msgid ""
"Administrative divisions of a country. E.g. Fed. State, Departement, Canton"
msgstr ""
msgstr "国の行政区画。たとえば連邦、省、州。"
#. module: base
#: view:res.partner.bank:0
@ -6257,12 +6262,12 @@ msgstr "このルールにより影響を受けたオブジェクト"
#. module: base
#: selection:ir.actions.act_window,target:0
msgid "Inline View"
msgstr ""
msgstr "インラインビュー"
#. module: base
#: field:ir.filters,is_default:0
msgid "Default filter"
msgstr ""
msgstr "デフォルトのフィルタ"
#. module: base
#: report:ir.module.reference:0
@ -6630,7 +6635,7 @@ msgstr "世紀なしの現在年: %(y)s"
#: view:ir.config_parameter:0
#: model:ir.ui.menu,name:base.ir_config_menu
msgid "System Parameters"
msgstr ""
msgstr "システムパラメータ"
#. module: base
#: help:ir.actions.client,tag:0
@ -6805,7 +6810,7 @@ msgstr "ランドスケープレポート用RML内部ヘッダ"
#. module: base
#: model:res.groups,name:base.group_partner_manager
msgid "Contact Creation"
msgstr ""
msgstr "連絡先作成"
#. module: base
#: view:ir.module.module:0
@ -7083,7 +7088,7 @@ msgstr "モジュールファイルのインポートが成功しました。"
#: view:ir.model.constraint:0
#: model:ir.ui.menu,name:base.ir_model_constraint_menu
msgid "Model Constraints"
msgstr ""
msgstr "モデル制約"
#. module: base
#: model:ir.actions.act_window,name:base.action_workflow_transition_form
@ -7198,7 +7203,7 @@ msgstr "のコピー"
#. module: base
#: field:ir.model.data,display_name:0
msgid "Record Name"
msgstr ""
msgstr "レコード名"
#. module: base
#: model:ir.model,name:base.model_ir_actions_client
@ -7214,7 +7219,7 @@ msgstr "イギリス領インド洋地域"
#. module: base
#: model:ir.actions.server,name:base.action_server_module_immediate_install
msgid "Module Immediate Install"
msgstr ""
msgstr "モジュール即時インストール"
#. module: base
#: view:ir.actions.server:0
@ -7565,6 +7570,8 @@ msgid ""
"use the same timezone that is otherwise used to pick and render date and "
"time values: your computer's timezone."
msgstr ""
"取引先のタイムゾーン。印刷するレポート内に適切な日付と時刻を出力するために使用します。このフィールドに値を設定することは重要です。日付と時刻を選択して表示"
"するのでなければ、あなたのコンピュータと同じタイムゾーンを使用すべきです。"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_analytic_default
@ -7633,7 +7640,7 @@ msgstr ""
#. module: base
#: view:ir.rule:0
msgid "Rule Definition (Domain Filter)"
msgstr ""
msgstr "ルール定義(ドメインフィルタ)"
#. module: base
#: selection:ir.actions.act_url,target:0
@ -8340,7 +8347,7 @@ msgstr ""
#. module: base
#: help:ir.model.relation,name:0
msgid "PostgreSQL table name implementing a many2many relation."
msgstr ""
msgstr "多対多の関係を実装するPostgreSQLのテーブル名。"
#. module: base
#: model:ir.module.module,description:base.module_base
@ -8441,7 +8448,7 @@ msgstr "常時検索可能"
#. module: base
#: help:res.country.state,code:0
msgid "The state code in max. three chars."
msgstr ""
msgstr "最大3文字の州コード。"
#. module: base
#: model:res.country,name:base.hk
@ -8604,7 +8611,7 @@ msgstr "ドミニカ"
#. module: base
#: field:ir.translation,name:0
msgid "Translated field"
msgstr ""
msgstr "翻訳フィールド"
#. module: base
#: model:ir.module.module,shortdesc:base.module_stock_location
@ -8682,7 +8689,7 @@ msgstr "アクション結合"
msgid ""
"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."
msgstr ""
msgstr "選択された言語がシステムにロードされている場合、この連絡先に関連するすべての文書はこの言語で印刷されます。そうでない場合は英語です。"
#. module: base
#: model:ir.module.module,description:base.module_hr_evaluation
@ -8839,7 +8846,7 @@ msgstr ""
msgid ""
"This field specifies whether the model is transient or not (i.e. if records "
"are automatically deleted from the database or not)"
msgstr ""
msgstr "このフィールドはモデルが一時的かどうか(レコードがデータベースから自動的に削除されるかどうか)を指定します。"
#. module: base
#: code:addons/base/ir/ir_mail_server.py:445
@ -9231,7 +9238,7 @@ msgstr ""
#. module: base
#: model:ir.module.category,name:base.module_category_warehouse_management
msgid "Warehouse"
msgstr ""
msgstr "倉庫"
#. module: base
#: field:ir.exports,resource:0
@ -9568,7 +9575,7 @@ msgstr "%H - 時24時間表示[00,23]."
#. module: base
#: field:ir.model.fields,on_delete:0
msgid "On Delete"
msgstr ""
msgstr "削除時"
#. module: base
#: code:addons/base/ir/ir_model.py:347
@ -9825,7 +9832,7 @@ msgstr "通貨コードは会社ごとに固有でなければいけません。
#: code:addons/base/module/wizard/base_export_language.py:39
#, python-format
msgid "New Language (Empty translation template)"
msgstr ""
msgstr "新しい言語 (空の翻訳テンプレート)"
#. module: base
#: help:ir.actions.server,email:0
@ -10296,7 +10303,7 @@ msgstr "ファイルの内容"
#: view:ir.model.relation:0
#: model:ir.ui.menu,name:base.ir_model_relation_menu
msgid "ManyToMany Relations"
msgstr ""
msgstr "多対多の関係"
#. module: base
#: model:res.country,name:base.pa
@ -10400,7 +10407,7 @@ msgstr "OpenERPは自動的に次の番号に要求されているサイズに
#. module: base
#: help:ir.model.constraint,name:0
msgid "PostgreSQL constraint or foreign key name."
msgstr ""
msgstr "PostgreSQLの制約や外部キーの名前。"
#. module: base
#: view:res.company:0
@ -10425,7 +10432,7 @@ msgstr "ギニアビサウ"
#. module: base
#: field:ir.actions.report.xml,header:0
msgid "Add RML Header"
msgstr ""
msgstr "RMLヘッダを追加"
#. module: base
#: help:res.company,rml_footer:0
@ -10547,7 +10554,7 @@ msgstr "イタリア"
#. module: base
#: model:res.groups,name:base.group_sale_salesman
msgid "See Own Leads"
msgstr ""
msgstr "自分の見込み客を参照"
#. module: base
#: view:ir.actions.todo:0
@ -11057,7 +11064,7 @@ msgstr "オフィス用品"
#. module: base
#: field:ir.attachment,res_model:0
msgid "Resource Model"
msgstr ""
msgstr "リソースモデル"
#. module: base
#: code:addons/custom.py:555
@ -11184,7 +11191,7 @@ msgstr ""
#: model:ir.actions.act_window,name:base.action_inventory_form
#: model:ir.ui.menu,name:base.menu_action_inventory_form
msgid "Default Company per Object"
msgstr ""
msgstr "オブジェクトごとのデフォルト会社"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_hello
@ -11229,7 +11236,7 @@ msgstr "州名"
#. module: base
#: help:ir.attachment,type:0
msgid "Binary File or URL"
msgstr ""
msgstr "バイナリファイルまたはURL"
#. module: base
#: code:addons/base/ir/ir_fields.py:313
@ -11374,7 +11381,7 @@ msgstr ""
#. module: base
#: field:workflow.transition,signal:0
msgid "Signal (Button Name)"
msgstr ""
msgstr "シグナル(ボタン名)"
#. module: base
#: view:ir.actions.act_window:0
@ -11404,7 +11411,7 @@ msgstr "グレナダ"
#. module: base
#: help:res.partner,customer:0
msgid "Check this box if this contact is a customer."
msgstr ""
msgstr "連絡先が顧客の場合はこのボックスをチェックします。"
#. module: base
#: view:ir.actions.server:0
@ -11439,7 +11446,7 @@ msgstr ""
#. module: base
#: field:res.users,partner_id:0
msgid "Related Partner"
msgstr ""
msgstr "関連取引先"
#. module: base
#: code:addons/osv.py:172
@ -11719,6 +11726,7 @@ 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
@ -12185,7 +12193,7 @@ msgstr "見積書、販売注文書、請求書の処理に役立ちます。"
#. module: base
#: field:res.users,login_date:0
msgid "Latest connection"
msgstr ""
msgstr "最後の接続"
#. module: base
#: field:res.groups,implied_ids:0
@ -12349,7 +12357,7 @@ msgstr "デフォルト値、またはアクションへの参照"
#. module: base
#: field:ir.actions.report.xml,auto:0
msgid "Custom Python Parser"
msgstr ""
msgstr "特注のPythonパーサ"
#. module: base
#: sql_constraint:res.groups:0
@ -12933,7 +12941,7 @@ msgstr "ニューカレドニア(フランス領)"
#. module: base
#: field:ir.model,osv_memory:0
msgid "Transient Model"
msgstr ""
msgstr "過度的なモデル"
#. module: base
#: model:res.country,name:base.cy
@ -13073,7 +13081,7 @@ msgstr "送信メールサーバ"
#. module: base
#: model:ir.ui.menu,name:base.menu_custom
msgid "Technical"
msgstr ""
msgstr "技術"
#. module: base
#: model:res.country,name:base.cn
@ -13290,7 +13298,7 @@ msgstr "起動するアクション"
#: field:ir.model,modules:0
#: field:ir.model.fields,modules:0
msgid "In Modules"
msgstr ""
msgstr "モジュールリスト"
#. module: base
#: model:ir.module.module,shortdesc:base.module_contacts
@ -13783,7 +13791,7 @@ msgstr ""
msgid ""
"Check this to define the report footer manually. Otherwise it will be "
"filled in automatically."
msgstr ""
msgstr "レポートフッタをマニュアルで定義する場合はチェックしてください。それ以外は自動で入力されます。"
#. module: base
#: view:res.partner:0
@ -13829,7 +13837,7 @@ msgstr "ソース"
#: field:ir.model.constraint,date_init:0
#: field:ir.model.relation,date_init:0
msgid "Initialization Date"
msgstr ""
msgstr "初期化の日付"
#. module: base
#: model:res.country,name:base.vu
@ -13998,7 +14006,7 @@ msgstr "複数ドキュメントのアクション"
#: model:ir.actions.act_window,name:base.action_partner_title_partner
#: model:ir.ui.menu,name:base.menu_partner_title_partner
msgid "Titles"
msgstr ""
msgstr "敬称"
#. module: base
#: model:ir.module.module,description:base.module_anonymization
@ -14298,7 +14306,7 @@ msgstr "ヘルプデスク"
#. module: base
#: field:ir.rule,perm_write:0
msgid "Apply for Write"
msgstr ""
msgstr "読み込みに適用"
#. module: base
#: field:ir.ui.menu,parent_left:0
@ -14456,7 +14464,7 @@ msgstr "ペルシア語 / فارس"
#. module: base
#: view:base.language.export:0
msgid "Export Settings"
msgstr ""
msgstr "エクスポート設定"
#. module: base
#: field:ir.actions.act_window,src_model:0
@ -15333,7 +15341,7 @@ msgstr ""
#. module: base
#: field:ir.model.data,complete_name:0
msgid "Complete ID"
msgstr ""
msgstr "完了ID"
#. module: base
#: model:ir.module.module,description:base.module_stock
@ -15488,7 +15496,7 @@ msgstr "購買依頼"
#. module: base
#: selection:ir.actions.act_window,target:0
msgid "Inline Edit"
msgstr ""
msgstr "インライン編集"
#. module: base
#: selection:ir.cron,interval_type:0

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: 2014-01-01 05:17+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:54+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:19+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:56+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:19+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:56+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:20+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:56+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:20+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:56+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:20+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:56+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:20+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:57+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:20+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:57+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:17+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:53+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:25+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:01+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:21+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:57+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:21+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:57+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:24+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:00+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:21+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:57+0000\n"
"X-Generator: Launchpad (build 16914)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -26,7 +26,7 @@ msgid ""
msgstr ""
"\n"
"Modul pentru Bifeaza Scriere si Bifeaza Imprimare.\n"
"================================================\n"
"==================================================\n"
" "
#. module: base
@ -129,7 +129,7 @@ msgid ""
msgstr ""
"\n"
"Un modul care adauga producatori si atribute la formularul produsului.\n"
"====================================================================\n"
"======================================================================\n"
"\n"
"Acum puteti defini urmatoarele pentru un produs:\n"
"-----------------------------------------------\n"
@ -153,7 +153,7 @@ msgid ""
msgstr ""
"\n"
"Acest modul adauga utilizatorul google la utilizatorul res.\n"
"========================================\n"
"===========================================================\n"
#. module: base
#: help:res.partner,employee:0
@ -212,7 +212,7 @@ msgid ""
msgstr ""
"\n"
"Generează Facturi din Cheltuieli, Înregistrări ale Fișelor de Pontaj.\n"
"========================================================\n"
"=====================================================================\n"
"\n"
"Modul pentru generarea facturilor pe baza costurilor (resurse umane, "
"cheltuieli, ...).\n"
@ -249,7 +249,7 @@ msgstr "Eroare constrângere"
#. module: base
#: model:ir.model,name:base.model_ir_ui_view_custom
msgid "ir.ui.view.custom"
msgstr "ir.ui.vizualizare.personalizata"
msgstr "ir.ui.view.custom"
#. module: base
#: code:addons/base/ir/ir_model.py:374
@ -405,7 +405,7 @@ msgid ""
msgstr ""
"\n"
"Programul de instalare Ascuns bazat pe cunostinte.\n"
"=====================================\n"
"==================================================\n"
"\n"
"Face Configuratia Aplicatiei Cunostinte disponibila, de unde puteti instala\n"
"documente si Ascuns bazat pe Wiki.\n"
@ -617,7 +617,7 @@ msgid ""
msgstr ""
"\n"
"Modul pentru definirea obiectului contabilitatii analitice.\n"
"===============================================\n"
"=========================================================\n"
"\n"
"In OpenERP, conturile analitice sunt legate de conturile generale, dar sunt "
"tratate\n"
@ -650,7 +650,7 @@ msgid ""
msgstr ""
"\n"
"Organizarea si gestionarea Evenimentelor.\n"
"======================================\n"
"=========================================\n"
"\n"
"Modulul eveniment va permite sa organizati eficient evenimente si toate "
"sarcinile asociate lor: planificare, urmarirea inregistrarii,\n"
@ -950,7 +950,7 @@ msgstr "Data urmatoarei executii planificate pentru aceasta sarcina."
#. module: base
#: model:ir.model,name:base.model_ir_ui_view
msgid "ir.ui.view"
msgstr "ir.ui.vizualizare"
msgstr "ir.ui.view"
#. module: base
#: model:res.country,name:base.er
@ -975,7 +975,7 @@ msgstr "România - Contabilitate"
#. module: base
#: model:ir.model,name:base.model_res_config_settings
msgid "res.config.settings"
msgstr "res.configurare.setari"
msgstr "res.config.settings"
#. module: base
#: help:res.partner,image_small:0
@ -996,8 +996,8 @@ msgid ""
"the correct mobile number"
msgstr ""
"Furnizeaza campurile care sunt folosite pentru a cauta numarul de telefon "
"mobil, de exemplu dumneavoastra selectati factura, atunci "
"`obiect.factura_adresa_id.mobil` este campul care va da numarul corect de "
"mobil, de exemplu dumneavoastra selectati factura, atunci "
"`object.invoice_address_id.mobile` este campul care va da numarul corect de "
"telefon mobil"
#. module: base
@ -1932,7 +1932,7 @@ msgstr "Sfantul Martin (partea franceza)"
#. module: base
#: model:ir.model,name:base.model_ir_exports
msgid "ir.exports"
msgstr "ir.exporturi"
msgstr "ir.exports"
#. module: base
#: model:ir.module.module,description:base.module_l10n_lu
@ -2056,7 +2056,7 @@ msgstr "Bancă"
#. module: base
#: model:ir.model,name:base.model_ir_exports_line
msgid "ir.exports.line"
msgstr "ir.linie.exporturi"
msgstr "ir.exports.line"
#. module: base
#: model:ir.module.category,description:base.module_category_purchase_management
@ -2125,8 +2125,8 @@ msgid ""
"Access all the fields related to the current object using expressions, i.e. "
"object.partner_id.name "
msgstr ""
"Acceseaza toate fisierele asociate obiectului actual folosind expresii, de "
"exemplu obiect.partener_id.nume "
"Accesează toate câmpurile asociate obiectului actual folosind expresii, de "
"exemplu object.partner_id.name "
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_project_issue
@ -2169,7 +2169,7 @@ msgstr "Gestiunea depozitului"
#. module: base
#: model:ir.model,name:base.model_res_request_link
msgid "res.request.link"
msgstr "res.link.cerere"
msgstr "res.request.link"
#. module: base
#: field:ir.actions.wizard,name:0
@ -2260,7 +2260,7 @@ msgstr ""
#. module: base
#: view:ir.sequence:0
msgid "Day: %(day)s"
msgstr "Ziua: %(zi)s"
msgstr "Ziua: %(day)s"
#. module: base
#: model:ir.module.category,description:base.module_category_point_of_sale
@ -2299,7 +2299,7 @@ msgstr "Traducere în desfășurare"
#. module: base
#: model:ir.model,name:base.model_ir_rule
msgid "ir.rule"
msgstr "ir.regula"
msgstr "ir.rule"
#. module: base
#: selection:ir.cron,interval_type:0
@ -2456,7 +2456,7 @@ msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_model_access
msgid "ir.model.access"
msgstr "ir.model.acces"
msgstr "ir.model.access"
#. module: base
#: model:ir.module.module,description:base.module_l10n_multilang
@ -2987,7 +2987,7 @@ msgstr "Va fi șters"
#. module: base
#: model:ir.model,name:base.model_ir_sequence
msgid "ir.sequence"
msgstr "ir.secventa"
msgstr "ir.sequence"
#. module: base
#: help:ir.actions.server,expression:0
@ -2996,9 +2996,9 @@ msgid ""
"order in Object, and you can have loop on the sales order line. Expression = "
"`object.order_line`."
msgstr ""
"Introduceti campul/expresia care va genera lista. De exemplu, selectati "
"comanda de vanzare in Obiect, si puteti parcurge in bucla pozitiile din "
"comanda de vanzare. Expresie = `obiect.linie_comanda`."
"Introduceți câmpul / expresia care sa genereze lista. De exemplu, selectând "
"comanda de vânzare în Obiecte puteți parcurge în buclă pozițiile din "
"comandă. Expresie = `object.order_line`."
#. module: base
#: field:ir.mail_server,smtp_debug:0
@ -3591,7 +3591,7 @@ msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_actions_act_window_close
msgid "ir.actions.act_window_close"
msgstr "ir.actiuni.inchide_fereastra_act"
msgstr "ir.actions.act_window_close"
#. module: base
#: field:ir.server.object.lines,col1:0
@ -4878,7 +4878,7 @@ msgstr "Jersey"
#. module: base
#: model:ir.model,name:base.model_ir_translation
msgid "ir.translation"
msgstr "ir.traducere"
msgstr "ir.translation"
#. module: base
#: view:res.lang:0
@ -4954,7 +4954,7 @@ msgstr "Reg"
#. module: base
#: model:ir.model,name:base.model_ir_property
msgid "ir.property"
msgstr "ir.proprietate"
msgstr "ir.property"
#. module: base
#: selection:ir.actions.act_window,view_type:0
@ -6083,9 +6083,9 @@ msgid ""
"the same values as those available in the condition field, e.g. `Dear [[ "
"object.partner_id.name ]]`"
msgstr ""
"Continuturile e-mail-urilor, pot sa contina expresii incluse in paranteze "
"duble bazate pe aceleasi valori ca si cele disponibile in campul conditie, "
"de exemplu: `Stimate [[ obiect.id_nume.partener ]]`"
"Conținuturile e-mail-urilor, pot sa includă expresii incluse în paranteze "
"duble bazate pe aceleași valori ca și cele disponibile în câmpul condiție, "
"de exemplu: `Stimate [[ object.partner_id.name ]]`"
#. module: base
#: model:ir.actions.act_window,name:base.action_workflow_form
@ -6329,7 +6329,7 @@ msgstr "Nume de utilizator optional pentru autentificarea SMTP"
#. module: base
#: model:ir.model,name:base.model_ir_actions_actions
msgid "ir.actions.actions"
msgstr "ir.actiuni.actiuni"
msgstr "ir.actions.actions"
#. module: base
#: selection:ir.model.fields,select_level:0
@ -6364,19 +6364,19 @@ msgid ""
" \n"
"%(country_code)s: the code of the country"
msgstr ""
"Aici puteti mentiona formatul obisnuit care va fi folosit pentru adresele "
"care apartin acestei tari.\n"
"Aici puteți menționa formatul obișnuit care va fi folosit pentru adresele "
"acestei țări.\n"
"\n"
"Puteti folosi tiparul in sir stil python cu toate campurile adreselor (de "
"exemplu, folositi '%(strada)s' pentru a afisa campul 'strada') plus\n"
"Puteți folosi tiparul in sir stil python cu toate câmpurile adreselor (de "
"exemplu, folosiți '%(street)s' pentru a afișa câmpul 'strada') plus\n"
" \n"
"%(nume_stat)s: numele statului\n"
"%(state_name)s: numele statului (județului)\n"
" \n"
"%(cod_stat)s: codul statului\n"
"%(state_code)s: codul statului (județului)\n"
" \n"
"%(nume_tara)s: numele tarii\n"
"%(country_name)s: numele țării\n"
" \n"
"%(cod_tara)s: codul tarii"
"%(country_code)s: codul țării"
#. module: base
#: model:res.country,name:base.mu
@ -7194,7 +7194,7 @@ msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_actions_act_window_view
msgid "ir.actions.act_window.view"
msgstr "ir.actiuni.act_fereastra.vizualizare"
msgstr "ir.actions.act_window.view"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web
@ -7278,7 +7278,7 @@ msgstr "Insulele Svalbard si Jan Mayen"
#: model:ir.model,name:base.model_ir_actions_wizard
#: selection:ir.ui.menu,action:0
msgid "ir.actions.wizard"
msgstr "ir.asistent.actiuni"
msgstr "ir.actions.wizard"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_kanban
@ -7567,7 +7567,7 @@ msgstr "Start Flux"
#. module: base
#: model:ir.model,name:base.model_res_partner_title
msgid "res.partner.title"
msgstr "res.partener.titlu"
msgstr "res.partner.title"
#. module: base
#: view:res.partner.bank:0
@ -8208,7 +8208,7 @@ msgstr "Curaçao"
#. module: base
#: view:ir.sequence:0
msgid "Current Year without Century: %(y)s"
msgstr "Anul curent fara Secol: %(y)s"
msgstr "Anul curent fără secol: %(y)s"
#. module: base
#: model:ir.actions.act_window,name:base.ir_config_list_action
@ -8490,7 +8490,7 @@ msgstr ""
#. module: base
#: view:ir.sequence:0
msgid "Week of the Year: %(woy)s"
msgstr "Saptamana din An: %(sda)s"
msgstr "Săptămâna din an: %(woy)s"
#. module: base
#: field:res.users,id:0
@ -8601,7 +8601,7 @@ msgstr "Filtre vizibile doar pentru un utilizator"
#. module: base
#: model:ir.model,name:base.model_ir_attachment
msgid "ir.attachment"
msgstr "ir.atasament"
msgstr "ir.attachment"
#. module: base
#: code:addons/orm.py:4348
@ -9154,7 +9154,7 @@ msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_config_parameter
msgid "ir.config_parameter"
msgstr "ir.configurare_parametru"
msgstr "ir.config_parameter"
#. module: base
#: model:ir.module.module,description:base.module_project_long_term
@ -9243,7 +9243,7 @@ msgstr "Compania pentru care acest utilizator lucreaza in prezent."
#. module: base
#: model:ir.model,name:base.model_wizard_ir_model_menu_create
msgid "wizard.ir.model.menu.create"
msgstr "wizard.ir.creeaza.model.meniu"
msgstr "wizard.ir.model.menu.create"
#. module: base
#: view:workflow.transition:0
@ -9981,9 +9981,9 @@ msgid ""
"the same values as those available in the condition field, e.g. `Hello [[ "
"object.partner_id.name ]]`"
msgstr ""
"Subiectul e-mail-ului poate sa contina expresii intre paranteze duble, "
"bazate pe aceleasi valori ca si cele disponibile in campul conditie, de ex. "
"`Buna ziua [[obiect.partener_id.nume]]`"
"Subiectul e-mail-ului poate să conțină expresii intre paranteze duble, "
"bazate pe aceleași valori ca și cele disponibile în câmpul condiție, de ex. "
"`Buna ziua [[ object.partner_id.name ]]`"
#. module: base
#: help:res.partner,image:0
@ -10209,7 +10209,7 @@ msgstr "Austria - Contabilitate"
#. module: base
#: model:ir.model,name:base.model_ir_ui_menu
msgid "ir.ui.menu"
msgstr "ir.ui.meniu"
msgstr "ir.ui.menu"
#. module: base
#: model:ir.module.module,shortdesc:base.module_project
@ -10234,7 +10234,7 @@ msgstr "Contabilitate Analitica"
#. module: base
#: model:ir.model,name:base.model_ir_model_constraint
msgid "ir.model.constraint"
msgstr "ir.restrictie.model"
msgstr "ir.model.constraint"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_graph
@ -10260,7 +10260,7 @@ msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_server_object_lines
msgid "ir.server.object.lines"
msgstr "ir.linii.obiect.server"
msgstr "ir.server.object.lines"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_be
@ -10889,7 +10889,7 @@ msgstr "Instalati Actualizare Modul"
#. module: base
#: model:ir.model,name:base.model_ir_actions_configuration_wizard
msgid "ir.actions.configuration.wizard"
msgstr "ir.wizard.configurare.actiuni"
msgstr "ir.actions.configuration.wizard"
#. module: base
#: view:res.lang:0
@ -12119,9 +12119,9 @@ msgid ""
"same values as for the condition field.\n"
"Example: object.invoice_address_id.email, or 'me@example.com'"
msgstr ""
"Expresie care intoarce adresa de e-mail la trimite catre. Poate fi bazata pe "
"aceleasi valori ca si pentru campul conditie.\n"
"Exemplu: obiect.id_adresa_factura.e-mail, sau 'me@exemplu.com'"
"Expresie care întoarce adresa de e-mail în câmpul trimite către. Poate fi "
"bazată pe aceleași valori ca și pentru câmpul condiție.\n"
"Exemplu: object.invoice_address_id.email, sau 'me@exemplu.com'"
#. module: base
#: model:ir.module.module,description:base.module_project_issue_sheet
@ -12389,7 +12389,7 @@ msgstr "Cod"
#. module: base
#: model:ir.model,name:base.model_res_config_installer
msgid "res.config.installer"
msgstr "res.config.program_de_instalare"
msgstr "res.config.installer"
#. module: base
#: model:res.country,name:base.mc
@ -12452,7 +12452,7 @@ msgstr ""
#. module: base
#: view:ir.sequence:0
msgid "Current Year with Century: %(year)s"
msgstr "Anul curent cu Secol: %(an)s"
msgstr "Anul curent cu secol: %(year)s"
#. module: base
#: field:ir.exports,export_fields:0
@ -12593,7 +12593,7 @@ msgstr "Chineza (TW) / 正體字"
#. module: base
#: model:ir.model,name:base.model_res_request
msgid "res.request"
msgstr "res.cerere"
msgstr "res.request"
#. module: base
#: field:res.partner,image_medium:0
@ -13120,7 +13120,7 @@ msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_mail_server
msgid "ir.mail_server"
msgstr "ir.server_e-mail"
msgstr "ir.mail_server"
#. module: base
#: selection:base.language.install,lang:0
@ -13689,7 +13689,7 @@ msgstr "Fus orar"
#: model:ir.model,name:base.model_ir_actions_report_xml
#: selection:ir.ui.menu,action:0
msgid "ir.actions.report.xml"
msgstr "ir.actiuni.raport.xml"
msgstr "ir.actions.report.xml"
#. module: base
#: model:ir.actions.act_window,name:base.ir_sequence_form
@ -14248,7 +14248,7 @@ msgstr "Data trimiterii"
#. module: base
#: view:ir.sequence:0
msgid "Month: %(month)s"
msgstr "Luna: %(luna)s"
msgstr "Luna: %(month)s"
#. module: base
#: field:ir.actions.act_window.view,sequence:0
@ -14285,7 +14285,7 @@ msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_fields_converter
msgid "ir.fields.converter"
msgstr "ir.convertor.campuri"
msgstr "ir.fields.converter"
#. module: base
#: code:addons/base/res/res_partner.py:439
@ -14313,7 +14313,7 @@ msgstr "Anulati Instalarea"
#. module: base
#: model:ir.model,name:base.model_ir_model_relation
msgid "ir.model.relation"
msgstr "ir.model.relatie"
msgstr "ir.model.relation"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_check_writing
@ -14534,7 +14534,7 @@ msgstr "Planuri Analitice Multiple"
#. module: base
#: model:ir.model,name:base.model_ir_default
msgid "ir.default"
msgstr "ir.implicit"
msgstr "ir.default"
#. module: base
#: view:ir.sequence:0
@ -14633,9 +14633,9 @@ msgstr ""
"*URL:** legatura dumneavoastra moodle, de exemplu: "
"http://openerp.moodle.com\n"
"\n"
"**AUTENTIFICARE:** ${obiect.nume_de_utilizator_moodle}\n"
"**AUTENTIFICARE:**${object.moodle_username}\n"
" \n"
"**PAROLA:** ${obiect.parola_utilizator_moodle}\n"
"**PAROLA:** ${object.moodle_user_password}\n"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_uk
@ -15423,7 +15423,7 @@ msgid ""
msgstr ""
"\n"
"Retele Sociale orientate spre afaceri\n"
"===================================\n"
"=====================================\n"
"Modulul Retele Sociale furnizeaza un strat de abstractizare unificat de "
"retele sociale, permitand aplicatiilor sa afiseze un istoric\n"
"complet al conversatiilor in documente cu un sistem complet integrat de "
@ -15537,7 +15537,7 @@ msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_values
msgid "ir.values"
msgstr "ir.valori"
msgstr "ir.values"
#. module: base
#: model:ir.model,name:base.model_base_module_update
@ -16201,7 +16201,7 @@ msgstr "Agenda"
#. module: base
#: model:ir.model,name:base.model_ir_sequence_type
msgid "ir.sequence.type"
msgstr "ir.tip.secventa"
msgstr "ir.sequence.type"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_be_hr_payroll_account
@ -16825,7 +16825,7 @@ msgstr "Nu pot exista doi utilizatori cu acelasi nume de autentificare !"
#. module: base
#: model:ir.model,name:base.model_res_request_history
msgid "res.request.history"
msgstr "res.istoric.solicitari"
msgstr "res.request.history"
#. module: base
#: model:ir.model,name:base.model_multi_company_default
@ -17409,7 +17409,7 @@ msgstr "Uzbekistan"
#: model:ir.model,name:base.model_ir_actions_act_window
#: selection:ir.ui.menu,action:0
msgid "ir.actions.act_window"
msgstr "ir.actiuni.act_fereastra"
msgstr "ir.actions.act_window"
#. module: base
#: model:res.country,name:base.vi
@ -17597,7 +17597,7 @@ msgstr "Germania - Contabilitate"
#. module: base
#: view:ir.sequence:0
msgid "Day of the Year: %(doy)s"
msgstr "Ziua din An: %(doy)s"
msgstr "Ziua din an: %(doy)s"
#. module: base
#: field:ir.ui.menu,web_icon:0
@ -17642,7 +17642,7 @@ msgstr "Model sursa"
#. module: base
#: view:ir.sequence:0
msgid "Day of the Week (0:Monday): %(weekday)s"
msgstr "Ziua din Saptamana (0:Luni): %(weekday)s"
msgstr "Ziua din saptămâna (0:Luni): %(weekday)s"
#. module: base
#: code:addons/base/module/wizard/base_module_upgrade.py:84
@ -17936,7 +17936,7 @@ msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_model_data
msgid "ir.model.data"
msgstr "ir.date.model"
msgstr "ir.model.data"
#. module: base
#: selection:base.language.install,lang:0
@ -18442,7 +18442,7 @@ msgstr "Grafic"
#: model:ir.model,name:base.model_ir_actions_server
#: selection:ir.ui.menu,action:0
msgid "ir.actions.server"
msgstr "ir.actiuni.server"
msgstr "ir.actions.server"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_ca

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: 2014-01-01 05:21+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:58+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:22+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:58+0000\n"
"X-Generator: Launchpad (build 16914)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -25,6 +25,10 @@ msgid ""
"================================================\n"
" "
msgstr ""
"\n"
"Modul pre vypisovanie a tlač šekov.\n"
"================================================\n"
" "
#. module: base
#: model:res.country,name:base.sh

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: 2014-01-01 05:22+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:58+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:15+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:51+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:21+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:58+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:26+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:03+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:22+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:59+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:23+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:59+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:23+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:59+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:23+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:59+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:23+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 05:59+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:23+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:00+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:23+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:00+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:25+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:02+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:23+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:00+0000\n"
"X-Generator: Launchpad (build 16914)\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: 2014-01-01 05:25+0000\n"
"X-Generator: Launchpad (build 16877)\n"
"X-Launchpad-Export-Date: 2014-01-25 06:02+0000\n"
"X-Generator: Launchpad (build 16914)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -15,9 +15,7 @@ from openerp.osv import osv, orm
_logger = logging.getLogger(__name__)
# FIXME: replace by proxy on request.uid?
_uid = object()
UID_PLACEHOLDER = object()
class ModelConverter(werkzeug.routing.BaseConverter):
@ -29,7 +27,7 @@ class ModelConverter(werkzeug.routing.BaseConverter):
def to_python(self, value):
m = re.match(self.regex, value)
return request.registry[self.model].browse(
request.cr, _uid, int(m.group(1)), context=request.context)
request.cr, UID_PLACEHOLDER, int(m.group(1)), context=request.context)
def to_url(self, value):
return value.id
@ -43,10 +41,7 @@ class ModelsConverter(werkzeug.routing.BaseConverter):
self.regex = '([0-9,]+)'
def to_python(self, value):
# TODO:
# - raise routing.ValidationError() if no browse record can be createdm
# - support slug
return request.registry[self.model].browse(request.cr, _uid, [int(i) for i in value.split(',')], context=request.context)
return request.registry[self.model].browse(request.cr, UID_PLACEHOLDER, [int(i) for i in value.split(',')], context=request.context)
def to_url(self, value):
return ",".join(i.id for i in value)
@ -66,15 +61,16 @@ class ir_http(osv.AbstractModel):
if not request.uid:
raise http.SessionExpiredException("Session expired")
def _auth_method_admin(self):
if not request.db:
raise http.SessionExpiredException("No valid database for request %s" % request.httprequest)
request.uid = openerp.SUPERUSER_ID
def _auth_method_none(self):
request.disable_db = True
request.uid = None
def _auth_method_public(self):
if not request.session.uid:
dummy, request.uid = self.pool['ir.model.data'].get_object_reference(request.cr, openerp.SUPERUSER_ID, 'base', 'public_user')
else:
request.uid = request.session.uid
def _authenticate(self, auth_method='user'):
if request.session.uid:
try:
@ -88,6 +84,7 @@ class ir_http(osv.AbstractModel):
return auth_method
def _handle_exception(self, exception):
# If handle exception return something different than None, it will be used as a response
raise
def _dispatch(self):
@ -106,10 +103,10 @@ class ir_http(osv.AbstractModel):
convert_exception_to(
werkzeug.exceptions.Forbidden))
# post process arg to set uid on browse records
for arg in arguments.itervalues():
if isinstance(arg, orm.browse_record) and arg._uid is _uid:
arg._uid = request.uid
processing = self._postprocess_args(arguments)
if processing:
return processing
# set and execute handler
try:
@ -122,6 +119,16 @@ class ir_http(osv.AbstractModel):
return result
def _postprocess_args(self, arguments):
""" post process arg to set uid on browse records """
for arg in arguments.itervalues():
if isinstance(arg, orm.browse_record) and arg._uid is UID_PLACEHOLDER:
arg._uid = request.uid
try:
arg[arg._rec_name]
except KeyError:
return self._handle_exception(werkzeug.exceptions.NotFound())
def routing_map(self):
if not hasattr(self, '_routing_map'):
_logger.info("Generating routing map")

View File

@ -3,7 +3,7 @@
##############################################################################
#
# OpenERP, Open Source Business Applications
# Copyright (C) 2004-2012 OpenERP S.A. (<http://openerp.com>).
# Copyright (C) 2004-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
@ -29,7 +29,7 @@ import openerp.modules.registry
from openerp import SUPERUSER_ID
from openerp import tools
from openerp.osv import fields,osv
from openerp.osv.orm import Model
from openerp.osv.orm import Model, browse_null
from openerp.tools.safe_eval import safe_eval as eval
from openerp.tools import config
from openerp.tools.translate import _
@ -853,24 +853,58 @@ class ir_model_data(osv.osv):
if not cr.fetchone():
cr.execute('CREATE INDEX ir_model_data_module_name_index ON ir_model_data (module, name)')
@tools.ormcache()
# NEW V8 API
@tools.ormcache(skiparg=3)
def xmlid_lookup(self, cr, uid, xmlid):
"""Low level xmlid lookup
Return (id, res_model, res_id) or raise ValueError if not found
"""
module, name = xmlid.split('.', 1)
ids = self.search(cr, uid, [('module','=',module), ('name','=', name)])
if not ids:
raise ValueError('External ID not found in the system: %s' % (xmlid))
# the sql constraints ensure us we have only one result
res = self.read(cr, uid, ids[0], ['model', 'res_id'])
if not res['res_id']:
raise ValueError('External ID not found in the system: %s' % (xmlid))
return ids[0], res['model'], res['res_id']
def xmlid_to_res_model_res_id(self, cr, uid, xmlid, raise_if_not_found=False):
""" Return (res_model, res_id)"""
try:
return self.xmlid_lookup(cr, uid, xmlid)[1:3]
except ValueError:
if raise_if_not_found:
raise
return (False, False)
def xmlid_to_res_id(self, cr, uid, xmlid, raise_if_not_found=False):
""" Returns res_id """
return self.xmlid_to_res_model_res_id(cr, uid, xmlid, raise_if_not_found)[1]
def xmlid_to_object(self, cr, uid, xmlid, raise_if_not_found=False, context=None):
""" Return a browse_record
if not found and raise_if_not_found is True return the browse_null
"""
t = self.xmlid_to_res_model_res_id(cr, uid, xmlid, raise_if_not_found)
res_model, res_id = t
if res_model and res_id:
record = self.pool[res_model].browse(cr, uid, res_id, context=context)
if record.exists():
return record
if raise_if_not_found:
raise ValueError('No record found for unique ID %s. It may have been deleted.' % (xml_id))
return browse_null()
# OLD API
def _get_id(self, cr, uid, module, xml_id):
"""Returns the id of the ir.model.data record corresponding to a given module and xml_id (cached) or raise a ValueError if not found"""
ids = self.search(cr, uid, [('module','=',module), ('name','=', xml_id)])
if not ids:
raise ValueError('No such external ID currently defined in the system: %s.%s' % (module, xml_id))
# the sql constraints ensure us we have only one result
return ids[0]
return self.xmlid_lookup(cr, uid, "%s.%s" % (module, xml_id))[0]
@tools.ormcache()
def get_object_reference(self, cr, uid, module, xml_id):
"""Returns (model, res_id) corresponding to a given module and xml_id (cached) or raise ValueError if not found"""
data_id = self._get_id(cr, uid, module, xml_id)
#assuming data_id is not False, as it was checked upstream
res = self.read(cr, uid, data_id, ['model', 'res_id'])
if not res['res_id']:
raise ValueError('No such external ID currently defined in the system: %s.%s' % (module, xml_id))
return res['model'], res['res_id']
return self.xmlid_lookup(cr, uid, "%s.%s" % (module, xml_id))[1:3]
def check_object_reference(self, cr, uid, module, xml_id, raise_on_access_error=False):
"""Returns (model, res_id) corresponding to a given module and xml_id (cached), if and only if the user has the necessary access rights
@ -884,18 +918,12 @@ class ir_model_data(osv.osv):
raise ValueError('Not enough access rights on the external ID: %s.%s' % (module, xml_id))
return model, False
def get_object(self, cr, uid, module, xml_id, context=None, check_existence_and_raise=True):
""" Returns a browsable record for the given module name and xml_id or
raise ValueError if not found
:param boolean check_existence_and_raise: v7 compatibility mode, check
existence and raise if not found
def get_object(self, cr, uid, module, xml_id, context=None):
""" Returns a browsable record for the given module name and xml_id.
If not found, raise a ValueError or return a browse_null, depending
on the value of `raise_exception`.
"""
res_model, res_id = self.get_object_reference(cr, uid, module, xml_id)
result = self.pool[res_model].browse(cr, uid, res_id, context=context)
if check_existence_and_raise and not result.exists():
raise ValueError('No record found for unique ID %s.%s. It may have been deleted.' % (module, xml_id))
return result
return self.xmlid_to_object(cr, uid, "%s.%s" % (module, xml_id), raise_if_not_found=True, context=context)
def _update_dummy(self,cr, uid, model, module, xml_id=False, store=True):
if not xml_id:
@ -912,8 +940,7 @@ class ir_model_data(osv.osv):
:returns: itself
"""
self._get_id.clear_cache(self)
self.get_object_reference.clear_cache(self)
self.xmlid_lookup.clear_cache(self)
return self
def unlink(self, cr, uid, ids, context=None):
@ -944,8 +971,7 @@ class ir_model_data(osv.osv):
if mode == 'update' and noupdate_imd:
return res_id2
if not real_id2:
self._get_id.clear_cache(self)
self.get_object_reference.clear_cache(self)
self.clear_caches()
cr.execute('delete from ir_model_data where id=%s', (imd_id2,))
res_id = False
else:

View File

@ -6,6 +6,7 @@ import json
import logging
import math
import re
import sys
import xml # FIXME use lxml and etree
import babel
@ -25,11 +26,15 @@ _logger = logging.getLogger(__name__)
#--------------------------------------------------------------------
class QWebException(Exception):
def __init__(self, message, template=None, node=None, attribute=None):
self.message = message
def __init__(self, message, template=None, node=None, expression=None, inner=None):
Exception.__init__(self, message)
self.template = template
self.node = node
self.attribute = attribute
self.expression = expression
self.inner = inner
class QWebTemplateNotFound(QWebException):
pass
class QWebContext(dict):
def __init__(self, cr, uid, data, loader=None, templates=None, context=None):
@ -116,165 +121,172 @@ class QWeb(orm.AbstractModel):
:param str prefix:
:return: dict
"""
n_prefix = len(prefix)
return dict(
(name[len(prefix):].replace('_', '-'), getattr(type(self), name))
(name[n_prefix:].replace('_', '-'), getattr(type(self), name))
for name in dir(self)
if name.startswith(prefix))
if name.startswith(prefix)
)
def register_tag(self, tag, func):
self._render_tag[tag] = func
def load_document(self, x, qcontext):
def add_template(self, qwebcontext, name, node):
"""Add a parsed template in the context. Used to preprocess templates."""
qwebcontext.templates[name] = node
def load_document(self, document, qwebcontext):
"""
Loads an XML document and installs any contained template in the engine
"""
if hasattr(x, 'documentElement'):
dom = x
elif x.startswith("<?xml"):
dom = xml.dom.minidom.parseString(x)
if hasattr(document, 'documentElement'):
dom = document
elif document.startswith("<?xml"):
dom = xml.dom.minidom.parseString(document)
else:
dom = xml.dom.minidom.parse(x)
dom = xml.dom.minidom.parse(document)
for n in dom.documentElement.childNodes:
if n.nodeType == self.node.ELEMENT_NODE and n.getAttribute('t-name'):
name = str(n.getAttribute("t-name"))
qcontext.templates[name] = n
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)
def get_template(self, name, qcontext):
if qcontext.loader and name not in qcontext.templates:
xml_doc = qcontext.loader(name)
self.load_document(xml_doc, qcontext=qcontext)
def get_template(self, name, qwebcontext):
origin_template = qwebcontext.get('__caller__') or qwebcontext['__stack__'][0]
if qwebcontext.loader and name not in qwebcontext.templates:
try:
xml_doc = qwebcontext.loader(name)
except ValueError, e:
raise QWebTemplateNotFound("Loader could not find template %r" % name, template=origin_template, inner=e)
self.load_document(xml_doc, qwebcontext=qwebcontext)
if name in qcontext.templates:
return qcontext.templates[name]
if name in qwebcontext.templates:
return qwebcontext.templates[name]
import pdb
pdb.set_trace()
raise QWebTemplateNotFound("Template %r not found" % name, template=origin_template)
e = KeyError('qweb: template "%s" not found' % name)
setattr(e, 'qweb_template', name)
raise e
def eval(self, expr, v):
def eval(self, expr, qwebcontext):
try:
return v.safe_eval(expr)
return qwebcontext.safe_eval(expr)
except Exception, e:
# add qweb metdata on exception
setattr(e, 'qweb_eval', expr)
setattr(e, 'qweb_template', v.get('__template__'))
raise
template = qwebcontext.get('__template__')
raise QWebException("Could not evaluate expression %r" % expr, expression=expr, template=template, inner=e)
def eval_object(self, expr, v):
return self.eval(expr, v)
def eval_object(self, expr, qwebcontext):
return self.eval(expr, qwebcontext)
def eval_str(self, expr, v):
def eval_str(self, expr, qwebcontext):
if expr == "0":
return v.get(0, '')
val = self.eval(expr, v)
return qwebcontext.get(0, '')
val = self.eval(expr, qwebcontext)
if isinstance(val, unicode):
return val.encode("utf8")
if val is False or val is None:
return ''
return str(val)
def eval_format(self, expr, v):
def eval_format(self, expr, qwebcontext):
expr, replacements = self._format_regex.subn(
lambda m: self.eval_str(m.group(1) or m.group(2), v),
expr)
lambda m: self.eval_str(m.group(1) or m.group(2), qwebcontext),
expr
)
if replacements:
return expr
try:
return str(expr % v)
except:
raise Exception("QWeb: format error '%s' " % expr)
return str(expr % qwebcontext)
except Exception, e:
template = qwebcontext.get('__template__')
raise QWebException("Format error for expression %r" % expr, expression=expr, template=template, inner=e)
def eval_bool(self, expr, v):
val = self.eval(expr, v)
if val:
return 1
else:
return 0
def eval_bool(self, expr, qwebcontext):
return int(bool(self.eval(expr, qwebcontext)))
def render(self, cr, uid, id_or_xml_id, v=None, loader=None, context=None):
if v is None:
v = {}
if not isinstance(v, QWebContext):
v = QWebContext(cr, uid, v, loader=loader, context=context)
v['__template__'] = id_or_xml_id
stack = v.get('__stack__', [])
def render(self, cr, uid, id_or_xml_id, qwebcontext=None, loader=None, context=None):
if qwebcontext is None:
qwebcontext = {}
if not isinstance(qwebcontext, QWebContext):
qwebcontext = QWebContext(cr, uid, qwebcontext, loader=loader, context=context)
qwebcontext['__template__'] = id_or_xml_id
stack = qwebcontext.get('__stack__', [])
if stack:
v['__caller__'] = stack[-1]
qwebcontext['__caller__'] = stack[-1]
stack.append(id_or_xml_id)
v['__stack__'] = stack
v['xmlid'] = str(stack[0]) # Temporary fix
return self.render_node(self.get_template(id_or_xml_id, v), v)
qwebcontext['__stack__'] = stack
qwebcontext['xmlid'] = str(stack[0]) # Temporary fix
return self.render_node(self.get_template(id_or_xml_id, qwebcontext), qwebcontext)
def render_node(self, e, v):
r = ""
if e.nodeType == self.node.TEXT_NODE or e.nodeType == self.node.CDATA_SECTION_NODE:
r = e.data.encode("utf8")
elif e.nodeType == self.node.ELEMENT_NODE:
g_att = ""
def render_node(self, element, qwebcontext):
result = ""
if element.nodeType == self.node.TEXT_NODE or element.nodeType == self.node.CDATA_SECTION_NODE:
result = element.data.encode("utf8")
elif element.nodeType == self.node.ELEMENT_NODE:
generated_attributes = ""
t_render = None
t_att = {}
for (an, av) in e.attributes.items():
an = str(an)
if an == "groups":
can_see = self.user_has_groups(v['request'].cr, v['uid'], groups=av)
template_attributes = {}
for (attribute_name, attribute_value) in element.attributes.items():
attribute_name = str(attribute_name)
if attribute_name == "groups":
cr = qwebcontext.get('request') and qwebcontext['request'].cr or None
uid = qwebcontext.get('request') and qwebcontext['request'].uid or None
can_see = self.user_has_groups(cr, uid, groups=attribute_value)
if not can_see:
return ''
continue
if isinstance(av, unicode):
av = av.encode("utf8")
if isinstance(attribute_value, unicode):
attribute_value = attribute_value.encode("utf8")
else:
av = av.nodeValue.encode("utf8")
if an.startswith("t-"):
for i in self._render_att:
if an[2:].startswith(i):
g_att += self._render_att[i](self, e, an, av, v)
attribute_value = attribute_value.nodeValue.encode("utf8")
if attribute_name.startswith("t-"):
for attribute in self._render_att:
if attribute_name[2:].startswith(attribute):
att, val = self._render_att[attribute](self, element, attribute_name, attribute_value, qwebcontext)
generated_attributes += val and ' %s="%s"' % (att, werkzeug.utils.escape(val)) or " "
break
else:
if an[2:] in self._render_tag:
t_render = an[2:]
t_att[an[2:]] = av
if attribute_name[2:] in self._render_tag:
t_render = attribute_name[2:]
template_attributes[attribute_name[2:]] = attribute_value
else:
g_att += ' %s="%s"' % (an, werkzeug.utils.escape(av))
generated_attributes += ' %s="%s"' % (attribute_name, werkzeug.utils.escape(attribute_value))
if 'debug' in t_att:
debugger = t_att.get('debug', 'pdb')
__import__(debugger).set_trace() # pdb, ipdb, pudb, ...
if 'debug' in template_attributes:
debugger = template_attributes.get('debug', 'pdb')
__import__(debugger).set_trace() # pdb, ipdb, pudb, ...
if t_render:
r = self._render_tag[t_render](self, e, t_att, g_att, v)
result = self._render_tag[t_render](self, element, template_attributes, generated_attributes, qwebcontext)
else:
r = self.render_element(e, t_att, g_att, v)
if isinstance(r, unicode):
return r.encode('utf-8')
return r
result = self.render_element(element, template_attributes, generated_attributes, qwebcontext)
if isinstance(result, unicode):
return result.encode('utf-8')
return result
def render_element(self, e, t_att, g_att, v, inner=None):
# e: element
# t_att: t-* attributes
# g_att: generated attributes
# v: values
def render_element(self, element, template_attributes, generated_attributes, qwebcontext, inner=None):
# element: element
# template_attributes: t-* attributes
# generated_attributes: generated attributes
# qwebcontext: values
# inner: optional innerXml
if inner:
g_inner = inner
else:
g_inner = []
for n in e.childNodes:
for current_node in element.childNodes:
try:
g_inner.append(self.render_node(n, v))
except Exception, ex:
# add qweb metdata on exception
if not getattr(ex, 'qweb_template', None):
setattr(e, 'qweb_template', v.get('__template__'))
if not getattr(ex, 'qweb_node', None):
setattr(ex, 'qweb_node', e)
g_inner.append(self.render_node(current_node, qwebcontext))
except QWebException:
raise
name = str(e.nodeName)
except Exception, e:
template = qwebcontext.get('__template__')
raise QWebException("Could not render element %r -- %s" % (element.nodeName, e.message), node=element, template=template, inner=e), None, sys.exc_info()[2]
name = str(element.nodeName)
inner = "".join(g_inner)
trim = t_att.get("trim", 0)
trim = template_attributes.get("trim", 0)
if trim == 0:
pass
elif trim == 'left':
@ -287,132 +299,112 @@ class QWeb(orm.AbstractModel):
return inner
elif len(inner) or name not in self._void_elements:
return "<%s%s>%s</%s>" % tuple(
v if isinstance(v, str) else v.encode('utf-8')
for v in (name, g_att, inner, name))
qwebcontext if isinstance(qwebcontext, str) else qwebcontext.encode('utf-8')
for qwebcontext in (name, generated_attributes, inner, name)
)
else:
return "<%s%s/>" % (name, g_att)
return "<%s%s/>" % (name, generated_attributes)
# Attributes
def render_att_att(self, e, an, av, v):
if an.startswith("t-attf-"):
att, val = an[7:], self.eval_format(av, v)
elif an.startswith("t-att-"):
att, val = an[6:], self.eval(av, v)
def render_att_att(self, element, attribute_name, attribute_value, qwebcontext):
if attribute_name.startswith("t-attf-"):
att, val = attribute_name[7:], self.eval_format(attribute_value, qwebcontext)
elif attribute_name.startswith("t-att-"):
att, val = attribute_name[6:], self.eval(attribute_value, qwebcontext)
if isinstance(val, unicode):
val = val.encode("utf8")
else:
att, val = self.eval_object(av, v)
return val and ' %s="%s"' % (att, werkzeug.utils.escape(val)) or " "
def render_att_href(self, e, an, av, v):
return self.url_for(e, an, av, v)
def render_att_src(self, e, an, av, v):
return self.url_for(e, an, av, v)
def render_att_action(self, e, an, av, v):
return self.url_for(e, an, av, v)
def url_for(self, e, an, av, v):
if 'url_for' not in v:
raise KeyError("qweb: no 'url_for' found in context")
# Temporary implementation of t-keep-query until qweb py v2
keep_query = e.attributes.get('t-keep-query')
if keep_query:
params = self.eval_format(keep_query.value, v)
keep_query = [q.strip() for q in params.split(',')]
path = str(v['url_for'](self.eval_format(av, v), keep_query=keep_query))
return ' %s="%s"' % (an[2:], werkzeug.utils.escape(path))
att, val = self.eval_object(attribute_value, qwebcontext)
return att, val
# Tags
def render_tag_raw(self, e, t_att, g_att, v):
inner = self.eval_str(t_att["raw"], v)
return self.render_element(e, t_att, g_att, v, inner)
def render_tag_raw(self, element, template_attributes, generated_attributes, qwebcontext):
inner = self.eval_str(template_attributes["raw"], qwebcontext)
return self.render_element(element, template_attributes, generated_attributes, qwebcontext, inner)
def render_tag_esc(self, e, t_att, g_att, v):
inner = werkzeug.utils.escape(self.eval_str(t_att["esc"], v))
return self.render_element(e, t_att, g_att, v, inner)
def render_tag_esc(self, element, template_attributes, generated_attributes, qwebcontext):
inner = werkzeug.utils.escape(self.eval_str(template_attributes["esc"], qwebcontext))
return self.render_element(element, template_attributes, generated_attributes, qwebcontext, inner)
def render_tag_foreach(self, e, t_att, g_att, v):
expr = t_att["foreach"]
enum = self.eval_object(expr, v)
def render_tag_foreach(self, element, template_attributes, generated_attributes, qwebcontext):
expr = template_attributes["foreach"]
enum = self.eval_object(expr, qwebcontext)
if enum is not None:
var = t_att.get('as', expr).replace('.', '_')
d = v.copy()
var = template_attributes.get('as', expr).replace('.', '_')
copy_qwebcontext = qwebcontext.copy()
size = -1
if isinstance(enum, (list, tuple)):
size = len(enum)
elif hasattr(enum, 'count'):
size = enum.count()
d["%s_size" % var] = size
d["%s_all" % var] = enum
copy_qwebcontext["%s_size" % var] = size
copy_qwebcontext["%s_all" % var] = enum
index = 0
ru = []
for i in enum:
d["%s_value" % var] = i
d["%s_index" % var] = index
d["%s_first" % var] = index == 0
d["%s_even" % var] = index % 2
d["%s_odd" % var] = (index + 1) % 2
d["%s_last" % var] = index + 1 == size
copy_qwebcontext["%s_value" % var] = i
copy_qwebcontext["%s_index" % var] = index
copy_qwebcontext["%s_first" % var] = index == 0
copy_qwebcontext["%s_even" % var] = index % 2
copy_qwebcontext["%s_odd" % var] = (index + 1) % 2
copy_qwebcontext["%s_last" % var] = index + 1 == size
if index % 2:
d["%s_parity" % var] = 'odd'
copy_qwebcontext["%s_parity" % var] = 'odd'
else:
d["%s_parity" % var] = 'even'
if 'as' in t_att:
d[var] = i
copy_qwebcontext["%s_parity" % var] = 'even'
if 'as' in template_attributes:
copy_qwebcontext[var] = i
elif isinstance(i, dict):
d.update(i)
ru.append(self.render_element(e, t_att, g_att, d))
copy_qwebcontext.update(i)
ru.append(self.render_element(element, template_attributes, generated_attributes, copy_qwebcontext))
index += 1
return "".join(ru)
else:
template = v.get('__template__')
e = NameError("QWeb: foreach enumerator %r is not defined while rendering template %r" % (expr, template))
e.qweb_template = template
raise e
template = qwebcontext.get('__template__')
raise QWebException("foreach enumerator %r is not defined while rendering template %r" % (expr, template), template=template)
def render_tag_if(self, e, t_att, g_att, v):
if self.eval_bool(t_att["if"], v):
return self.render_element(e, t_att, g_att, v)
else:
return ""
def render_tag_call(self, e, t_att, g_att, v):
d = v.copy()
d[0] = self.render_element(e, t_att, g_att, d)
return self.render(None, None, self.eval_format(t_att["call"], d), d)
def render_tag_set(self, e, t_att, g_att, v):
if "value" in t_att:
v[t_att["set"]] = self.eval_object(t_att["value"], v)
elif "valuef" in t_att:
v[t_att["set"]] = self.eval_format(t_att["valuef"], v)
else:
v[t_att["set"]] = self.render_element(e, t_att, g_att, v)
def render_tag_if(self, element, template_attributes, generated_attributes, qwebcontext):
if self.eval_bool(template_attributes["if"], qwebcontext):
return self.render_element(element, template_attributes, generated_attributes, qwebcontext)
return ""
def render_tag_field(self, e, t_att, g_att, v):
def render_tag_call(self, element, template_attributes, generated_attributes, qwebcontext):
d = qwebcontext.copy()
d[0] = self.render_element(element, template_attributes, generated_attributes, d)
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)
def render_tag_set(self, element, template_attributes, generated_attributes, qwebcontext):
if "value" in template_attributes:
qwebcontext[template_attributes["set"]] = self.eval_object(template_attributes["value"], qwebcontext)
elif "valuef" in template_attributes:
qwebcontext[template_attributes["set"]] = self.eval_format(template_attributes["valuef"], qwebcontext)
else:
qwebcontext[template_attributes["set"]] = self.render_element(element, template_attributes, generated_attributes, qwebcontext)
return ""
def render_tag_field(self, element, template_attributes, generated_attributes, qwebcontext):
""" eg: <span t-record="browse_record(res.partner, 1)" t-field="phone">+1 555 555 8069</span>"""
node_name = e.nodeName
node_name = element.nodeName
assert node_name not in ("table", "tbody", "thead", "tfoot", "tr", "td",
"li", "ul", "ol", "dl", "dt", "dd"),\
"RTE widgets do not work correctly on %r elements" % node_name
assert node_name != 't',\
"t-field can not be used on a t element, provide an actual HTML node"
record, field_name = t_att["field"].rsplit('.', 1)
record = self.eval_object(record, v)
record, field_name = template_attributes["field"].rsplit('.', 1)
record = self.eval_object(record, qwebcontext)
column = record._model._all_columns[field_name].column
options = json.loads(t_att.get('field-options') or '{}')
options = json.loads(template_attributes.get('field-options') or '{}')
field_type = get_field_type(column, options)
converter = self.get_converter_for(field_type)
return converter.to_html(v.cr, v.uid, field_name, record, options,
e, t_att, g_att, v, context=v.context)
return converter.to_html(qwebcontext.cr, qwebcontext.uid, field_name, record, options,
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,
@ -500,6 +492,7 @@ class FieldConverter(osv.AbstractModel):
except Exception:
_logger.warning("Could not get field %s for model %s",
field_name, record._model._name, exc_info=True)
content = None
g_att += ''.join(
' %s="%s"' % (name, werkzeug.utils.escape(value))

View File

@ -343,6 +343,7 @@ class ir_translation(osv.osv):
ids = super(ir_translation, self).create(cr, uid, vals, context=context)
self._get_source.clear_cache(self)
self._get_ids.clear_cache(self)
self.pool['ir.ui.view'].clear_cache()
return ids
def write(self, cursor, user, ids, vals, context=None):
@ -357,6 +358,7 @@ class ir_translation(osv.osv):
result = super(ir_translation, self).write(cursor, user, ids, vals, context=context)
self._get_source.clear_cache(self)
self._get_ids.clear_cache(self)
self.pool['ir.ui.view'].clear_cache()
return result
def unlink(self, cursor, user, ids, context=None):

View File

@ -68,7 +68,7 @@ class view(osv.osv):
_columns = {
'name': fields.char('View Name', required=True),
'model': fields.char('Object', size=64, select=True),
'model': fields.char('Object', select=True),
'priority': fields.integer('Sequence', required=True),
'type': fields.selection([
('tree','Tree'),
@ -83,7 +83,7 @@ class view(osv.osv):
'arch': fields.text('View Architecture', required=True),
'inherit_id': fields.many2one('ir.ui.view', 'Inherited View', ondelete='cascade', select=True),
'inherit_children_ids': fields.one2many('ir.ui.view','inherit_id', 'Inherit Views'),
'field_parent': fields.char('Child Field',size=64),
'field_parent': fields.char('Child Field'),
'model_data_id': fields.function(_get_model_data, type='many2one', relation='ir.model.data', string="Model Data", store=True),
'xml_id': fields.function(osv.osv.get_xml_id, type='char', size=128, string="External ID",
help="ID of the view defined in xml file"),
@ -179,8 +179,8 @@ class view(osv.osv):
self.read_template.clear_cache(self)
ret = super(view, self).write(cr, uid, ids, vals, context)
if not context.get('install_mode', False):
# touched views become noupdatable
# if arch is modified views become noupdatable
if 'arch' in vals and not context.get('install_mode', False):
# TODO: should be doable in a read and a write
for view_ in self.browse(cr, uid, ids, context=context):
if view_.model_data_id:
@ -538,26 +538,6 @@ class view(osv.osv):
'fields': xfields
}
attrs = {'views': views}
if node.get('widget') and node.get('widget') == 'selection':
# Prepare the cached selection list for the client. This needs to be
# done even when the field is invisible to the current user, because
# other events could need to change its value to any of the selectable ones
# (such as on_change events, refreshes, etc.)
# If domain and context are strings, we keep them for client-side, otherwise
# we evaluate them server-side to consider them when generating the list of
# possible values
# TODO: find a way to remove this hack, by allow dynamic domains
dom = []
if column._domain and not isinstance(column._domain, basestring):
dom = list(column._domain)
dom += eval(node.get('domain', '[]'), {'uid': user, 'time': time})
search_context = dict(context)
if column._context and not isinstance(column._context, basestring):
search_context.update(column._context)
attrs['selection'] = relation._name_search(cr, user, '', dom, context=search_context, limit=None, name_get_uid=1)
if (node.get('required') and not int(node.get('required'))) or not column.required:
attrs['selection'].append((False, ''))
fields[node.get('name')] = attrs
field = model_fields.get(node.get('name'))
@ -802,14 +782,27 @@ class view(osv.osv):
self.translate_qweb(cr, uid, id_, node, lang, context)
return arch
def render(self, cr, uid, xml_id, values=None, engine='ir.qweb', context=None):
@openerp.tools.ormcache()
def get_view_xmlid(self, cr, uid, id):
imd = self.pool['ir.model.data']
domain = [('model', '=', 'ir.ui.view'), ('res_id', '=', id)]
xmlid = imd.search_read(cr, uid, domain, ['module', 'name'])[0]
return '%s.%s' % (xmlid['module'], xmlid['name'])
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 = {}
def loader(name):
return self.read_template(cr, uid, name, context=context)
return self.pool[engine].render(cr, uid, xml_id, values, loader=loader, context=context)
return self.pool[engine].render(cr, uid, tname, values, loader=loader, context=context)
#------------------------------------------------------
# Misc

View File

@ -50,7 +50,7 @@
<field name="model">ir.ui.view</field>
<field name="arch" type="xml">
<search string="Views">
<field name="name" filter_domain="['|', ('name','ilike',self), ('model','ilike',self)]" string="View"/>
<field name="name" filter_domain="['|', '|', ('name','ilike',self), ('model','ilike',self), ('model_data_id','ilike',self)]" string="View"/>
<filter string="Form" domain="[('type', '=','form')]"/>
<filter string="Tree" domain="[('type', '=', 'tree')]"/>
<filter string="Kanban" domain="[('type', '=', 'kanban')]"/>
@ -60,8 +60,9 @@
<field name="inherit_id"/>
<field name="type"/>
<group expand="0" string="Group By...">
<filter string="Object" icon="terp-stock_align_left_24" domain="[]" context="{'group_by':'model'}"/>
<filter string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'type'}"/>
<filter string="Object" domain="[]" context="{'group_by':'model'}"/>
<filter string="Type" domain="[]" context="{'group_by':'type'}"/>
<filter string="Inherit" domain="[]" context="{'group_by':'inherit_id'}"/>
</group>
</search>
</field>

View File

@ -415,6 +415,7 @@ class res_config_settings(osv.osv_memory, res_config_module_installation_mixin):
* For a boolean field like 'group_XXX', ``execute`` adds/removes 'implied_group'
to/from the implied groups of 'group', depending on the field's value.
By default 'group' is the group Employee. Groups are given by their xml id.
The attribute 'group' may contain several xml ids, separated by commas.
* For a boolean field like 'module_XXX', ``execute`` triggers the immediate
installation of the module named 'XXX' if the field has value ``True``.
@ -437,7 +438,7 @@ class res_config_settings(osv.osv_memory, res_config_module_installation_mixin):
""" return a dictionary with the fields classified by category::
{ 'default': [('default_foo', 'model', 'foo'), ...],
'group': [('group_bar', browse_group, browse_implied_group), ...],
'group': [('group_bar', [browse_group], browse_implied_group), ...],
'module': [('module_baz', browse_module), ...],
'other': ['other_field', ...],
}
@ -453,8 +454,8 @@ class res_config_settings(osv.osv_memory, res_config_module_installation_mixin):
if name.startswith('default_') and hasattr(field, 'default_model'):
defaults.append((name, field.default_model, name[8:]))
elif name.startswith('group_') and isinstance(field, fields.boolean) and hasattr(field, 'implied_group'):
field_group = getattr(field, 'group', 'base.group_user')
groups.append((name, ref(field_group), ref(field.implied_group)))
field_groups = getattr(field, 'group', 'base.group_user').split(',')
groups.append((name, map(ref, field_groups), ref(field.implied_group)))
elif name.startswith('module_') and isinstance(field, fields.boolean):
mod_ids = ir_module.search(cr, uid, [('name', '=', name[7:])])
record = ir_module.browse(cr, uid, mod_ids[0], context) if mod_ids else None
@ -477,8 +478,8 @@ class res_config_settings(osv.osv_memory, res_config_module_installation_mixin):
res[name] = value
# groups: which groups are implied by the group Employee
for name, group, implied_group in classified['group']:
res[name] = implied_group in group.implied_ids
for name, groups, implied_group in classified['group']:
res[name] = all(implied_group in group.implied_ids for group in groups)
# modules: which modules are installed/to install
for name, module in classified['module']:
@ -497,6 +498,7 @@ class res_config_settings(osv.osv_memory, res_config_module_installation_mixin):
ir_values = self.pool['ir.values']
ir_module = self.pool['ir.module.module']
res_groups = self.pool['res.groups']
classified = self._get_classified_fields(cr, uid, context)
@ -507,12 +509,16 @@ class res_config_settings(osv.osv_memory, res_config_module_installation_mixin):
ir_values.set_default(cr, SUPERUSER_ID, model, field, config[name])
# group fields: modify group / implied groups
for name, group, implied_group in classified['group']:
for name, groups, implied_group in classified['group']:
gids = map(int, groups)
if config[name]:
group.write({'implied_ids': [(4, implied_group.id)]})
res_groups.write(cr, uid, gids, {'implied_ids': [(4, implied_group.id)]}, context=context)
else:
group.write({'implied_ids': [(3, implied_group.id)]})
implied_group.write({'users': [(3, u.id) for u in group.users]})
res_groups.write(cr, uid, gids, {'implied_ids': [(3, implied_group.id)]}, context=context)
uids = set()
for group in groups:
uids.update(map(int, group.users))
implied_group.write({'users': [(3, u) for u in uids]})
# other fields: execute all methods that start with 'set_'
for method in dir(self):

View File

@ -685,10 +685,7 @@ class groups_view(osv.osv):
# and introduces the reified group fields
# we have to try-catch this, because at first init the view does not exist
# but we are already creating some basic groups
try:
view = self.pool['ir.model.data'].get_object(cr, SUPERUSER_ID, 'base', 'user_groups_view', context=context, check_existence_and_raise=False)
except ValueError:
view = False
view = self.pool['ir.model.data'].xmlid_to_object(cr, SUPERUSER_ID, 'base.user_groups_view', context=context)
if view and view.exists() and view._table_name == 'ir.ui.view':
xml1, xml2 = [], []
xml1.append(E.separator(string=_('Application'), colspan="4"))

View File

@ -590,6 +590,7 @@
<rng:optional><rng:attribute name="filters"/></rng:optional>
<rng:optional><rng:attribute name="statusbar_visible"/></rng:optional>
<rng:optional><rng:attribute name="statusbar_colors"/></rng:optional>
<rng:optional><rng:attribute name="interval" /></rng:optional>
<!-- Widget *static* options defined as an arbitrary JSON dict, with
widget-dependent parameters. To be ignored if widget/client does
not support them. -->

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -35,6 +35,7 @@ import werkzeug.wsgi
import openerp
from openerp.service import security, model as service_model
import openerp.tools
_logger = logging.getLogger(__name__)
@ -49,6 +50,51 @@ request = _request_stack()
A global proxy that always redirect to the current request object.
"""
def local_redirect(path, query=None, keep_hash=False, forward_debug=True, code=303):
url = path
if not query:
query = {}
if forward_debug and request and request.debug:
query['debug'] = None
if query:
url += '?' + werkzeug.url_encode(query)
if keep_hash:
return redirect_with_hash(url, code)
else:
return werkzeug.utils.redirect(url, code)
def redirect_with_hash(url, code=303):
# Most IE and Safari versions decided not to preserve location.hash upon
# redirect. And even if IE10 pretends to support it, it still fails
# inexplicably in case of multiple redirects (and we do have some).
# See extensive test page at http://greenbytes.de/tech/tc/httpredirects/
if request.httprequest.user_agent.browser in ('firefox',):
return werkzeug.utils.redirect(url, code)
return "<html><head><script>window.location = '%s' + location.hash;</script></head></html>" % url
def ensure_db(with_registry=False, redirect='/web/database/selector'):
db = request.params.get('db')
# if db not provided, use the session one
if not db:
db = request.session.db
# if no database provided and no database in session, use monodb
if not db:
db = db_monodb(request.httprequest)
# if no db can be found til here, send to the database selector
# the database selector will redirect to database manager if needed
if not db:
werkzeug.exceptions.abort(werkzeug.utils.redirect(redirect, 303))
# always switch the session to the computed db
if db != request.session.db:
request.session.logout()
request.session.db = db
if with_registry:
request.disable_db = False
class WebRequest(object):
""" Parent class for all OpenERP Web request types, mostly deals with
initialization and setup of the request object (the dispatching itself has
@ -306,7 +352,7 @@ class JsonRequest(WebRequest):
# Read POST content or POST Form Data named "request"
self.jsonrequest = simplejson.loads(request)
self.params = dict(self.jsonrequest.get("params", {}))
self.context = self.params.pop('context', self.session.context)
self.context = self.params.pop('context', dict(self.session.context))
def dispatch(self):
""" Calls the method asked for by the JSON-RPC2 or JSONP request
@ -483,6 +529,13 @@ class ControllerType(type):
class Controller(object):
__metaclass__ = ControllerType
class EndPoint(object):
def __init__(self, method, routing):
self.method = method
self.routing = routing
def __call__(self, *args, **kw):
return self.method(*args, **kw)
def routing_map(modules, nodb_only, converters=None):
routing_map = werkzeug.routing.Map(strict_slashes=False, converters=converters)
for module in modules:
@ -500,21 +553,24 @@ def routing_map(modules, nodb_only, converters=None):
members = inspect.getmembers(o)
for mk, mv in members:
if inspect.ismethod(mv) and hasattr(mv, 'routing'):
routing = dict(type='http', auth='user', methods=None)
routing = dict(type='http', auth='user', methods=None, routes=None)
methods_done = list()
for claz in reversed(mv.im_class.mro()):
fn = getattr(claz, mv.func_name, None)
if fn and hasattr(fn, 'routing'):
if fn and hasattr(fn, 'routing') and fn not in methods_done:
methods_done.append(fn)
routing.update(fn.routing)
mv.routing.update(routing)
assert 'routes' in mv.routing
if not nodb_only or nodb_only == (mv.routing['auth'] == "none"):
for url in mv.routing['routes']:
if mv.routing.get("combine", False):
if not nodb_only or nodb_only == (routing['auth'] == "none"):
assert routing['routes'], "Method %r has not route defined" % mv
endpoint = EndPoint(mv, routing)
for url in routing['routes']:
if routing.get("combine", False):
# deprecated
url = o._cp_path.rstrip('/') + '/' + url.lstrip('/')
if url.endswith("/") and len(url) > 1:
url = url[: -1]
routing_map.add(werkzeug.routing.Rule(url, endpoint=mv, methods=mv.routing['methods']))
routing_map.add(werkzeug.routing.Rule(url, endpoint=endpoint, methods=routing['methods']))
return routing_map
#----------------------------------------------------------
@ -633,9 +689,10 @@ class OpenERPSession(werkzeug.contrib.sessions.Session):
raise SessionExpiredException("Session expired")
security.check(self.db, self.uid, self.password)
def logout(self):
def logout(self, keep_db=False):
for k in self.keys():
del self[k]
if not (keep_db and k == 'db'):
del self[k]
self._default_values()
def _default_values(self):
@ -996,10 +1053,12 @@ class Root(object):
if db:
openerp.modules.registry.RegistryManager.check_registry_signaling(db)
try:
ir_http = request.registry['ir.http']
with openerp.tools.mute_logger('openerp.sql_db'):
ir_http = request.registry['ir.http']
except psycopg2.OperationalError:
# psycopg2 error. At this point, that's mean the database does not exists
# anymore. We unlog the user and failback in nodb mode
# psycopg2 error. At this point, that means the
# database probably does not exists anymore. Log the
# user out and fall back to nodb
request.session.logout()
result = _dispatch_nodb()
else:

View File

@ -601,7 +601,7 @@ class one2many(_column):
domain = self._domain(obj) if callable(self._domain) else self._domain
model = obj.pool[self._obj]
ids2 = model.search(cr, user, domain + [(self._fields_id, 'in', ids)], limit=self._limit, context=context)
if len(ids)<>1:
if len(ids) != 1:
for r in model._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_write'):
if r[self._fields_id] in res:
res[r[self._fields_id]].append(r['id'])

View File

@ -1832,7 +1832,8 @@ class BaseModel(object):
_logger.warning('%r requires a fully-qualified external id (got: %r for model %s). '
'Please use the complete `module.view_id` form instead.', view_ref_key, view_ref,
self._name)
else:
if not view_id:
# otherwise try to find the lowest priority matching ir.ui.view
view_id = View.default_view(cr, uid, self._name, view_type, context=context)
@ -2185,21 +2186,14 @@ class BaseModel(object):
:param uid: current user id
:param domain: list specifying search criteria [['field_name', 'operator', 'value'], ...]
:param list fields: list of fields present in the list view specified on the object
:param list groupby: fields by which the records will be grouped
:param list groupby: list of groupby descriptions by which the records will be grouped.
A groupby description is either a field (then it will be grouped by that field)
or a string 'field:groupby_function'. Right now, the only functions supported
are 'day', 'week', 'month', 'quarter' or 'year', and they only make sense for
date/datetime fields.
:param int offset: optional number of records to skip
:param int limit: optional max number of records to return
:param dict context: context arguments, like lang, time zone. A special
context key exist for datetime fields : ``datetime_format``.
context[``datetime_format``] = {
'field_name': {
groupby_format: format for to_char (default: yyyy-mm)
display_format: format for displaying the value
in the result (default: MMM yyyy)
interval: day, month or year; used for begin
and end date of group_by intervals
computation (default: month)
}
}
:param dict context: context arguments, like lang, time zone.
:param list orderby: optional ``order by`` specification, for
overriding the natural sort ordering of the
groups, see also :py:meth:`~osv.osv.osv.search`
@ -2228,6 +2222,12 @@ class BaseModel(object):
if groupby:
if isinstance(groupby, list):
groupby = groupby[0]
splitted_groupby = groupby.split(':')
if len(splitted_groupby) == 2:
groupby = splitted_groupby[0]
groupby_function = splitted_groupby[1]
else:
groupby_function = False
qualified_groupby_field = self._inherits_join_calc(groupby, query)
if groupby:
@ -2244,21 +2244,23 @@ class BaseModel(object):
if fget.get(groupby):
groupby_type = fget[groupby]['type']
if groupby_type in ('date', 'datetime'):
if context.get('datetime_format') and isinstance(context['datetime_format'], dict) \
and context['datetime_format'].get(groupby) and isinstance(context['datetime_format'][groupby], dict):
groupby_format = context['datetime_format'][groupby].get('groupby_format', 'yyyy-mm')
display_format = context['datetime_format'][groupby].get('display_format', 'MMMM yyyy')
interval = context['datetime_format'][groupby].get('interval', 'month')
if groupby_function:
interval = groupby_function
else:
groupby_format = 'yyyy-mm'
display_format = 'MMMM yyyy'
interval = 'month'
group_by_params = {
'groupby_format': groupby_format,
'display_format': display_format,
'interval': interval,
}
qualified_groupby_field = "to_char(%s,%%s)" % qualified_groupby_field
if interval == 'day':
display_format = 'dd MMMM YYYY'
elif interval == 'week':
display_format = "'W'w"
elif interval == 'month':
display_format = 'MMMM'
elif interval == 'quarter':
display_format = 'QQQ'
elif interval == 'year':
display_format = 'YYYY'
qualified_groupby_field = "date_trunc('%s',%s)" % (interval, qualified_groupby_field)
flist = "%s as %s " % (qualified_groupby_field, groupby)
elif groupby_type == 'boolean':
qualified_groupby_field = "coalesce(%s,false)" % qualified_groupby_field
@ -2285,8 +2287,6 @@ class BaseModel(object):
gb = groupby and (' GROUP BY ' + qualified_groupby_field) or ''
from_clause, where_clause, where_clause_params = query.get_sql()
if group_by_params and group_by_params.get('groupby_format'):
where_clause_params = [group_by_params['groupby_format']] + where_clause_params + [group_by_params['groupby_format']]
where_clause = where_clause and ' WHERE ' + where_clause
limit_str = limit and ' limit %d' % limit or ''
offset_str = offset and ' offset %d' % offset or ''
@ -2323,21 +2323,24 @@ class BaseModel(object):
d['__context'] = {'group_by': groupby_list[1:]}
if groupby and groupby in fget:
if d[groupby] and fget[groupby]['type'] in ('date', 'datetime'):
_default = datetime.datetime(1970, 1, 1) # force starts of month
groupby_datetime = dateutil.parser.parse(alldata[d['id']][groupby], default=_default)
groupby_datetime = alldata[d['id']][groupby]
if isinstance(groupby_datetime, basestring):
_default = datetime.datetime(1970, 1, 1) # force starts of month
groupby_datetime = dateutil.parser.parse(groupby_datetime, default=_default)
d[groupby] = babel.dates.format_date(
groupby_datetime, format=group_by_params.get('display_format', 'MMMM yyyy'), locale=context.get('lang', 'en_US'))
if group_by_params.get('interval') == 'month':
days = calendar.monthrange(groupby_datetime.year, groupby_datetime.month)[1]
domain_dt_begin = groupby_datetime.replace(day=1)
domain_dt_end = groupby_datetime.replace(day=days)
elif group_by_params.get('interval') == 'day':
domain_dt_begin = groupby_datetime.replace(hour=0, minute=0)
domain_dt_end = groupby_datetime.replace(hour=23, minute=59, second=59)
groupby_datetime, format=display_format, locale=context.get('lang', 'en_US'))
domain_dt_begin = groupby_datetime
if interval == 'quarter':
domain_dt_end = groupby_datetime + dateutil.relativedelta.relativedelta(months=3)
elif interval == 'month':
domain_dt_end = groupby_datetime + dateutil.relativedelta.relativedelta(months=1)
elif interval == 'week':
domain_dt_end = groupby_datetime + datetime.timedelta(days=7)
elif interval == 'day':
domain_dt_end = groupby_datetime + datetime.timedelta(days=1)
else:
domain_dt_begin = groupby_datetime.replace(month=1, day=1)
domain_dt_end = groupby_datetime.replace(month=12, day=31)
d['__domain'] = [(groupby, '>=', domain_dt_begin.strftime('%Y-%m-%d')), (groupby, '<=', domain_dt_end.strftime('%Y-%m-%d'))] + domain
domain_dt_end = groupby_datetime + dateutil.relativedelta.relativedelta(years=1)
d['__domain'] = [(groupby, '>=', domain_dt_begin.strftime('%Y-%m-%d')), (groupby, '<', domain_dt_end.strftime('%Y-%m-%d'))] + domain
del alldata[d['id']][groupby]
d.update(alldata[d['id']])
del d['id']
@ -3862,7 +3865,7 @@ class BaseModel(object):
for (parent_pright, parent_id) in parents:
if parent_id == id:
break
position = parent_pright + 1
position = parent_pright and parent_pright + 1 or 1
# It's the first node of the parent
if not position:
@ -4989,6 +4992,11 @@ class BaseModel(object):
record_ids = self.search(cr, uid, domain or [], offset=offset, limit=limit, order=order, context=context)
if not record_ids:
return []
if fields and fields == ['id']:
# shortcut read if we only want the ids
return [{'id': id} for id in record_ids]
result = self.read(cr, uid, record_ids, fields, context=context)
if len(result) <= 1:
return result
@ -5001,32 +5009,6 @@ class BaseModel(object):
""" stuff to do right after the registry is built """
pass
#def __getattr__(self, name):
# """
# Proxies attribute accesses to the `inherits` parent so we can call methods defined on the inherited parent
# (though inherits doesn't use Python inheritance).
# Handles translating between local ids and remote ids.
# Known issue: doesn't work correctly when using python's own super(), don't involve inherit-based inheritance
# when you have inherits.
# """
# for model, field in self._inherits.iteritems():
# proxy = self.pool.get(model)
# if hasattr(proxy, name):
# attribute = getattr(proxy, name)
# if not hasattr(attribute, '__call__'):
# return attribute
# break
# else:
# return super(orm, self).__getattr__(name)
# def _proxy(cr, uid, ids, *args, **kwargs):
# objects = self.browse(cr, uid, ids, kwargs.get('context', None))
# lst = [obj[field].id for obj in objects if obj[field]]
# return getattr(proxy, name)(cr, uid, lst, *args, **kwargs)
# return _proxy
def __getattr__(self, name):
if name.startswith('signal_'):
signal_name = name[len('signal_'):]

View File

@ -182,7 +182,6 @@ class CommonServer(object):
# runtime
self.pid = os.getpid()
def close_socket(self, sock):
""" Closes a socket instance cleanly
:param sock: the network socket to close
@ -530,6 +529,8 @@ 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

View File

@ -27,9 +27,6 @@ the database, *not* a database abstraction toolkit. Database abstraction is what
the ORM does, in fact.
"""
__all__ = ['db_connect', 'close_db']
from functools import wraps
import logging
import psycopg2.extensions
@ -457,10 +454,10 @@ class ConnectionPool(object):
raise PoolError('This connection does not below to the pool')
@locked
def close_all(self, dsn):
def close_all(self, dsn=None):
_logger.info('%r: Close all connections to %r', self, dsn)
for i, (cnx, used) in tools.reverse_enumerate(self._connections):
if dsn_are_equals(cnx.dsn, dsn):
if dsn is None or dsn_are_equals(cnx.dsn, dsn):
cnx.close()
self._connections.pop(i)
@ -522,6 +519,11 @@ def close_db(db_name):
if _Pool:
_Pool.close_all(dsn(db_name))
def close_all():
global _Pool
if _Pool:
_Pool.close_all()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -17,7 +17,7 @@ class TestACL(common.TransactionCase):
self.res_currency = self.registry('res.currency')
self.res_partner = self.registry('res.partner')
self.res_users = self.registry('res.users')
self.demo_uid = 3
_, self.demo_uid = self.registry('ir.model.data').get_object_reference(self.cr, self.uid, 'base', 'user_demo')
self.tech_group = self.registry('ir.model.data').get_object(self.cr, self.uid,
*(GROUP_TECHNICAL_FEATURES.split('.')))

View File

@ -4,22 +4,6 @@ import functools
from openerp import exceptions
from . import common
class Fixtures(object):
def __init__(self, *args):
self.fixtures = args
def __call__(self, fn):
@functools.wraps(fn)
def wrapper(case):
for model, vars in self.fixtures:
case.registry(model).create(
case.cr, common.ADMIN_USER_ID, vars, {})
fn(case)
return wrapper
def fixtures(*args):
return Fixtures(*args)
def noid(d):
""" Removes `id` key from a dict so we don't have to keep these things
around when trying to match
@ -27,17 +11,26 @@ def noid(d):
if 'id' in d: del d['id']
return d
class TestGetFilters(common.TransactionCase):
USER_ID = 3
USER = (3, u'Demo User')
class FiltersCase(common.TransactionCase):
def build(self, model, *args):
Model = self.registry(model)
for vars in args:
Model.create(self.cr, common.ADMIN_USER_ID, vars, {})
class TestGetFilters(FiltersCase):
def setUp(self):
super(TestGetFilters, self).setUp()
self.USER = self.registry('res.users').name_search(self.cr, self.uid, 'demo')[0]
self.USER_ID = self.USER[0]
@fixtures(
('ir.filters', dict(name='a', user_id=USER_ID, model_id='ir.filters')),
('ir.filters', dict(name='b', user_id=USER_ID, model_id='ir.filters')),
('ir.filters', dict(name='c', user_id=USER_ID, model_id='ir.filters')),
('ir.filters', dict(name='d', user_id=USER_ID, model_id='ir.filters')),
)
def test_own_filters(self):
self.build(
'ir.filters',
dict(name='a', user_id=self.USER_ID, model_id='ir.filters'),
dict(name='b', user_id=self.USER_ID, model_id='ir.filters'),
dict(name='c', user_id=self.USER_ID, model_id='ir.filters'),
dict(name='d', user_id=self.USER_ID, model_id='ir.filters'))
filters = self.registry('ir.filters').get_filters(
self.cr, self.USER_ID, 'ir.filters')
@ -48,13 +41,15 @@ class TestGetFilters(common.TransactionCase):
dict(name='d', is_default=False, user_id=self.USER, domain='[]', context='{}'),
])
@fixtures(
('ir.filters', dict(name='a', user_id=False, model_id='ir.filters')),
('ir.filters', dict(name='b', user_id=False, model_id='ir.filters')),
('ir.filters', dict(name='c', user_id=False, model_id='ir.filters')),
('ir.filters', dict(name='d', user_id=False, model_id='ir.filters')),
)
def test_global_filters(self):
self.build(
'ir.filters',
dict(name='a', user_id=False, model_id='ir.filters'),
dict(name='b', user_id=False, model_id='ir.filters'),
dict(name='c', user_id=False, model_id='ir.filters'),
dict(name='d', user_id=False, model_id='ir.filters'),
)
filters = self.registry('ir.filters').get_filters(
self.cr, self.USER_ID, 'ir.filters')
@ -65,13 +60,14 @@ class TestGetFilters(common.TransactionCase):
dict(name='d', is_default=False, user_id=False, domain='[]', context='{}'),
])
@fixtures(
('ir.filters', dict(name='a', user_id=False, model_id='ir.filters')),
('ir.filters', dict(name='b', user_id=common.ADMIN_USER_ID, model_id='ir.filters')),
('ir.filters', dict(name='c', user_id=USER_ID, model_id='ir.filters')),
('ir.filters', dict(name='d', user_id=common.ADMIN_USER_ID, model_id='ir.filters')),
)
def test_no_third_party_filters(self):
self.build(
'ir.filters',
dict(name='a', user_id=False, model_id='ir.filters'),
dict(name='b', user_id=common.ADMIN_USER_ID, model_id='ir.filters'),
dict(name='c', user_id=self.USER_ID, model_id='ir.filters'),
dict(name='d', user_id=common.ADMIN_USER_ID, model_id='ir.filters') )
filters = self.registry('ir.filters').get_filters(
self.cr, self.USER_ID, 'ir.filters')
@ -80,9 +76,11 @@ class TestGetFilters(common.TransactionCase):
dict(name='c', is_default=False, user_id=self.USER, domain='[]', context='{}'),
])
class TestOwnDefaults(common.TransactionCase):
USER_ID = 3
USER = (3, u'Demo User')
class TestOwnDefaults(FiltersCase):
def setUp(self):
super(TestOwnDefaults, self).setUp()
self.USER = self.registry('res.users').name_search(self.cr, self.uid, 'demo')[0]
self.USER_ID = self.USER[0]
def test_new_no_filter(self):
"""
@ -103,15 +101,17 @@ class TestOwnDefaults(common.TransactionCase):
domain='[]', context='{}')
])
@fixtures(
('ir.filters', dict(name='a', user_id=USER_ID, model_id='ir.filters')),
('ir.filters', dict(name='b', user_id=USER_ID, model_id='ir.filters')),
)
def test_new_filter_not_default(self):
"""
When creating a @is_default filter with existing non-default filters,
the new filter gets the flag
"""
self.build(
'ir.filters',
dict(name='a', user_id=self.USER_ID, model_id='ir.filters'),
dict(name='b', user_id=self.USER_ID, model_id='ir.filters'),
)
Filters = self.registry('ir.filters')
Filters.create_or_replace(self.cr, self.USER_ID, {
'name': 'c',
@ -127,15 +127,17 @@ class TestOwnDefaults(common.TransactionCase):
dict(name='c', user_id=self.USER, is_default=True, domain='[]', context='{}'),
])
@fixtures(
('ir.filters', dict(name='a', user_id=USER_ID, model_id='ir.filters')),
('ir.filters', dict(name='b', is_default=True, user_id=USER_ID, model_id='ir.filters')),
)
def test_new_filter_existing_default(self):
"""
When creating a @is_default filter where an existing filter is already
@is_default, the flag should be *moved* from the old to the new filter
"""
self.build(
'ir.filters',
dict(name='a', user_id=self.USER_ID, model_id='ir.filters'),
dict(name='b', is_default=True, user_id=self.USER_ID, model_id='ir.filters'),
)
Filters = self.registry('ir.filters')
Filters.create_or_replace(self.cr, self.USER_ID, {
'name': 'c',
@ -151,15 +153,17 @@ class TestOwnDefaults(common.TransactionCase):
dict(name='c', user_id=self.USER, is_default=True, domain='[]', context='{}'),
])
@fixtures(
('ir.filters', dict(name='a', user_id=USER_ID, model_id='ir.filters')),
('ir.filters', dict(name='b', is_default=True, user_id=USER_ID, model_id='ir.filters')),
)
def test_update_filter_set_default(self):
"""
When updating an existing filter to @is_default, if an other filter
already has the flag the flag should be moved
"""
self.build(
'ir.filters',
dict(name='a', user_id=self.USER_ID, model_id='ir.filters'),
dict(name='b', is_default=True, user_id=self.USER_ID, model_id='ir.filters'),
)
Filters = self.registry('ir.filters')
Filters.create_or_replace(self.cr, self.USER_ID, {
'name': 'a',
@ -174,18 +178,23 @@ class TestOwnDefaults(common.TransactionCase):
dict(name='b', user_id=self.USER, is_default=False, domain='[]', context='{}'),
])
class TestGlobalDefaults(common.TransactionCase):
USER_ID = 3
class TestGlobalDefaults(FiltersCase):
def setUp(self):
super(TestGlobalDefaults, self).setUp()
self.USER = self.registry('res.users').name_search(self.cr, self.uid, 'demo')[0]
self.USER_ID = self.USER[0]
@fixtures(
('ir.filters', dict(name='a', user_id=False, model_id='ir.filters')),
('ir.filters', dict(name='b', user_id=False, model_id='ir.filters')),
)
def test_new_filter_not_default(self):
"""
When creating a @is_default filter with existing non-default filters,
the new filter gets the flag
"""
self.build(
'ir.filters',
dict(name='a', user_id=False, model_id='ir.filters'),
dict(name='b', user_id=False, model_id='ir.filters'),
)
Filters = self.registry('ir.filters')
Filters.create_or_replace(self.cr, self.USER_ID, {
'name': 'c',
@ -201,15 +210,17 @@ class TestGlobalDefaults(common.TransactionCase):
dict(name='c', user_id=False, is_default=True, domain='[]', context='{}'),
])
@fixtures(
('ir.filters', dict(name='a', user_id=False, model_id='ir.filters')),
('ir.filters', dict(name='b', is_default=True, user_id=False, model_id='ir.filters')),
)
def test_new_filter_existing_default(self):
"""
When creating a @is_default filter where an existing filter is already
@is_default, an error should be generated
"""
self.build(
'ir.filters',
dict(name='a', user_id=False, model_id='ir.filters'),
dict(name='b', is_default=True, user_id=False, model_id='ir.filters'),
)
Filters = self.registry('ir.filters')
with self.assertRaises(exceptions.Warning):
Filters.create_or_replace(self.cr, self.USER_ID, {
@ -219,15 +230,17 @@ class TestGlobalDefaults(common.TransactionCase):
'is_default': True,
})
@fixtures(
('ir.filters', dict(name='a', user_id=False, model_id='ir.filters')),
('ir.filters', dict(name='b', is_default=True, user_id=False, model_id='ir.filters')),
)
def test_update_filter_set_default(self):
"""
When updating an existing filter to @is_default, if an other filter
already has the flag an error should be generated
"""
self.build(
'ir.filters',
dict(name='a', user_id=False, model_id='ir.filters'),
dict(name='b', is_default=True, user_id=False, model_id='ir.filters'),
)
Filters = self.registry('ir.filters')
with self.assertRaises(exceptions.Warning):
@ -238,14 +251,16 @@ class TestGlobalDefaults(common.TransactionCase):
'is_default': True,
})
@fixtures(
('ir.filters', dict(name='a', user_id=False, model_id='ir.filters')),
('ir.filters', dict(name='b', is_default=True, user_id=False, model_id='ir.filters')),
)
def test_update_default_filter(self):
"""
Replacing the current default global filter should not generate any error
"""
self.build(
'ir.filters',
dict(name='a', user_id=False, model_id='ir.filters'),
dict(name='b', is_default=True, user_id=False, model_id='ir.filters'),
)
Filters = self.registry('ir.filters')
context_value = "{'some_key': True}"
Filters.create_or_replace(self.cr, self.USER_ID, {

View File

@ -131,26 +131,15 @@ class TestORM(common.TransactionCase):
else:
domain = main_domain
display_format, groupby_format = {
'year': ('YYYY', 'yyyy'),
'month': ('YYYY-MM', 'yyyy-mm'),
'day': ('yyyy-MM-dd', 'yyyy-mm-dd'),
}[interval]
datetime_format = {
'date': dict(interval=interval, display_format=display_format, groupby_format=groupby_format)
}
context = dict(datetime_format=datetime_format)
rg = self.partner.read_group(self.cr, self.uid, domain, ['date'], 'date', context=context)
rg = self.partner.read_group(self.cr, self.uid, domain, ['date'], 'date' + ':' + interval)
result = {}
for r in rg:
result[r['date']] = set(self.partner.search(self.cr, self.uid, r['__domain']))
return result
self.assertDictEqual(read_group('day'), partners_by_day)
self.assertDictEqual(read_group('month'), partners_by_month)
self.assertDictEqual(read_group('year'), partners_by_year)
self.assertEqual(len(read_group('day')), len(partners_by_day))
self.assertEqual(len(read_group('month')), len(partners_by_month))
self.assertEqual(len(read_group('year')), len(partners_by_year))
class TestInherits(common.TransactionCase):

View File

@ -95,6 +95,13 @@ def html_sanitize(src, silent=True, strict=False):
# some corner cases make the parser crash (such as <SCRIPT/XSS SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT> in test_mail)
cleaner = clean.Cleaner(**kwargs)
cleaned = cleaner.clean_html(src)
# MAKO compatibility: $, { and } inside quotes are escaped, preventing correct mako execution
cleaned = cleaned.replace('%24', '$')
cleaned = cleaned.replace('%7B', '{')
cleaned = cleaned.replace('%7D', '}')
cleaned = cleaned.replace('%20', ' ')
cleaned = cleaned.replace('%5B', '[')
cleaned = cleaned.replace('%5D', ']')
except etree.ParserError, e:
if 'empty' in str(e):
return ""

View File

@ -1075,6 +1075,8 @@ class mute_logger(object):
def __enter__(self):
for logger in self.loggers:
assert isinstance(logger, basestring),\
"A logger name must be a string, got %s" % type(logger)
logging.getLogger(logger).addFilter(self)
def __exit__(self, exc_type=None, exc_val=None, exc_tb=None):

View File

@ -240,6 +240,9 @@ def safe_eval(expr, globals_dict=None, locals_dict=None, mode="eval", nocopy=Fal
'len': len,
'set': set,
'repr': repr,
'int': int,
'float': float,
'range': range,
}
)
if locals_builtins:

View File

@ -452,7 +452,7 @@ class YamlInterpreter(object):
"does not exist in the source view %r (of object "
"%r). This field will be ignored (and thus not "
"populated) when clients saves the new record" % (
key, match.group(1), view_info['name'], model._name
key, match.group(1), view_info.get('name', '?'), model._name
))
if key not in fields:
# do not shadow values explicitly set in yaml.