[MERGE] Sync with trunk-website-al
bzr revid: rim@openerp.com-20140124080626-bx8uhrf0qr9t0eep bzr revid: rim@openerp.com-20140128125211-jj5ypkwin11mbgqj bzr revid: rim@openerp.com-20140128143348-v6pk73mlonge4gj0 bzr revid: rim@openerp.com-20140129082650-14qvj0psoyeatah6 bzr revid: rim@openerp.com-20140130073420-s51n0co1xavpo8jx
This commit is contained in:
commit
b5bd71e97f
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 fenêtres"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_portal_project_issue
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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"))
|
||||
|
|
|
@ -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 |
|
@ -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:
|
||||
|
|
|
@ -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'])
|
||||
|
|
|
@ -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_'):]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
||||
|
|
|
@ -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('.')))
|
||||
|
||||
|
|
|
@ -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, {
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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 ""
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue