[MERGE] from trunk

bzr revid: chm@openerp.com-20140324082422-38x5kcnh830200wl
bzr revid: chm@openerp.com-20140325084953-s3sl2f1un7z08wxy
This commit is contained in:
chm@openerp.com 2014-03-25 09:49:53 +01:00
commit 105c26e623
91 changed files with 704 additions and 344 deletions

View File

@ -57,6 +57,8 @@ The kernel of OpenERP, needed for all installation.
'ir/ir_values_view.xml',
'ir/osv_memory_autovacuum.xml',
'ir/ir_model_report.xml',
'ir/ir_logging_view.xml',
'ir/ir_qweb.xml',
'workflow/workflow_view.xml',
'module/module_view.xml',
'module/module_data.xml',

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:41+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:30+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:41+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:30+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:42+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:31+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:42+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:31+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:43+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:32+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:43+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:32+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:43+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:32+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:43+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:32+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:44+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:33+0000\n"
"X-Generator: Launchpad (build 16967)\n"
"X-Poedit-Language: Czech\n"
#. module: base

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:44+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:33+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:46+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:35+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -12,8 +12,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:46+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:35+0000\n"
"X-Generator: Launchpad (build 16967)\n"
"X-Poedit-Country: GREECE\n"
"X-Poedit-Language: Greek\n"
"X-Poedit-SourceCharset: utf-8\n"

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:55+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:44+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:53+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:41+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:55+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:43+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:56+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:45+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:56+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:44+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:57+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:45+0000\n"
"X-Generator: Launchpad (build 16967)\n"
"Language: \n"
#. module: base

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:56+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:44+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:57+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:46+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:57+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:46+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:58+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:46+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:55+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:43+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:44+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:33+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:42+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:31+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -9,8 +9,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:50+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:39+0000\n"
"X-Generator: Launchpad (build 16967)\n"
"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
"X-Poedit-Language: Persian\n"

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:58+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:47+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:45+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:34+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:45+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:34+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:56+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:44+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -29,7 +29,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.sh
msgid "Saint Helena"
msgstr ""
msgstr "Sainte Hélène"
#. module: base
#: view:ir.actions.report.xml:0
@ -39,7 +39,7 @@ msgstr ""
#. module: base
#: selection:ir.property,type:0
msgid "DateTime"
msgstr ""
msgstr "Date et heure"
#. module: base
#: code:addons/fields.py:652
@ -68,7 +68,7 @@ msgstr ""
#. module: base
#: selection:base.language.install,lang:0
msgid "Hungarian / Magyar"
msgstr ""
msgstr "Hongrois / Magyar"
#. module: base
#: selection:base.language.install,lang:0
@ -81,6 +81,8 @@ msgid ""
"Helps you manage your projects and tasks by tracking them, generating "
"plannings, etc..."
msgstr ""
"Vous aide à gérer vos projets et tâches, en assurant leur suivi, en générant "
"des planifications, etc."
#. module: base
#: model:ir.module.module,summary:base.module_point_of_sale
@ -221,7 +223,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.sz
msgid "Swaziland"
msgstr ""
msgstr "Swaziland"
#. module: base
#: code:addons/orm.py:4485
@ -352,7 +354,7 @@ msgstr ""
#. module: base
#: model:ir.module.category,name:base.module_category_customer_relationship_management
msgid "Customer Relationship Management"
msgstr ""
msgstr "Gestion de la relation client (CRM)"
#. module: base
#: model:ir.module.module,description:base.module_delivery
@ -389,14 +391,14 @@ msgstr ""
#. module: base
#: field:res.partner,credit_limit:0
msgid "Credit Limit"
msgstr ""
msgstr "Limite de crédit"
#. module: base
#: field:ir.model.constraint,date_update:0
#: field:ir.model.data,date_update:0
#: field:ir.model.relation,date_update:0
msgid "Update Date"
msgstr ""
msgstr "Mettre à jour la date"
#. module: base
#: model:ir.module.module,shortdesc:base.module_base_action_rule
@ -407,12 +409,12 @@ msgstr ""
#: view:ir.attachment:0
#: field:ir.attachment,create_uid:0
msgid "Owner"
msgstr ""
msgstr "Propriétaire"
#. module: base
#: view:ir.actions.act_window:0
msgid "Source Object"
msgstr ""
msgstr "Objet source"
#. module: base
#: model:res.partner.bank.type,format_layout:base.bank_normal
@ -434,7 +436,7 @@ msgstr ""
#: field:ir.model.access,group_id:0
#: view:res.groups:0
msgid "Group"
msgstr ""
msgstr "Groupe"
#. module: base
#: constraint:res.lang:0
@ -442,6 +444,9 @@ msgid ""
"Invalid date/time format directive specified. Please refer to the list of "
"allowed directives, displayed when you edit a language."
msgstr ""
"Vous avez spécifié une directive de format date/temps non valide. Veuillez "
"vous référer à la liste des directives autorisées, qui s'affiche lorsque "
"vous modifiez une langue."
#. module: base
#: code:addons/orm.py:4153
@ -555,6 +560,19 @@ msgid ""
"* Use emails to automatically confirm and send acknowledgements for any "
"event registration\n"
msgstr ""
"\n"
"Gestion et organisation d'événements\n"
"====================================\n"
"\n"
"Le module 'Événement' vous permet d'organiser efficacement des événements et "
"toutes les tâches liées : planification, suivi des inscriptions, des "
"présences, etc.\n"
"\n"
"Fonctionnalités clés\n"
"--------------------\n"
"* Gestion des événements et des inscriptions\n"
"* Utilisation d'e-mails pour automatiquement confirmer et envoyer des "
"accusés de réception pour chaque inscription à un événement\n"
#. module: base
#: selection:base.language.install,lang:0
@ -567,6 +585,8 @@ msgid ""
"If you check this, then the second time the user prints with same attachment "
"name, it returns the previous report."
msgstr ""
"Si vous cochez ceci, alors la seconde fois que l'utilisateur imprimera avec "
"le même nom de pièce jointe, cela retournera le rapport stocké"
#. module: base
#: model:ir.module.module,description:base.module_mrp_byproduct
@ -597,7 +617,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_hr_timesheet_invoice
msgid "Invoice on Timesheets"
msgstr ""
msgstr "Facture sur les feuilles de temps"
#. module: base
#: view:base.module.upgrade:0
@ -613,12 +633,12 @@ msgstr ""
#. module: base
#: field:res.country,name:0
msgid "Country Name"
msgstr ""
msgstr "Nom du pays"
#. module: base
#: model:res.country,name:base.co
msgid "Colombia"
msgstr ""
msgstr "Colombie"
#. module: base
#: model:res.partner.title,name:base.res_partner_title_mister
@ -640,7 +660,7 @@ msgstr ""
#. module: base
#: view:res.partner:0
msgid "Sales & Purchases"
msgstr ""
msgstr "Achats et ventes"
#. module: base
#: view:ir.translation:0
@ -721,6 +741,33 @@ msgid ""
"module named account_voucher.\n"
" "
msgstr ""
"\n"
"Comptabilité et gestion financière\n"
"==================================\n"
"\n"
"Le module de comptabilité et de finance couvre :\n"
"------------------------------------------------\n"
" * Comptabilité générale\n"
" * Comptabilité de coût / comptabilité analytique\n"
" * Comptabilité de tiers\n"
" * Gestion des taxes\n"
" * Budgets\n"
" * Factures clients et fournisseurs\n"
" * Relevés bancaires\n"
" * Réconciliations par partenaire\n"
"\n"
"Il créé également un tableau de bord pour les comptables qui inclut :\n"
"---------------------------------------------------------------------\n"
" * Une liste des factures clients à approuver\n"
" * L'analyse de la société\n"
" * Un graphe de la trésorerie\n"
"\n"
"Les processus tels que le maintien de la comptabilité générale se fait par "
"le biais des revues financières définies (les lignes d'écriture à regrouper "
"le sont à travers un journal)\n"
"pour un exercice donné et pour la préparation des reçus il ya un module "
"nommé account_voucher.\n"
" "
#. module: base
#: view:ir.model:0
@ -763,7 +810,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.jo
msgid "Jordan"
msgstr ""
msgstr "Jordanie"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_hr
@ -788,7 +835,7 @@ msgstr ""
#. module: base
#: sql_constraint:res.company:0
msgid "The company name must be unique !"
msgstr ""
msgstr "Le nom de la société doit être unique !"
#. module: base
#: model:ir.ui.menu,name:base.menu_base_action_rule_admin
@ -820,6 +867,10 @@ msgid ""
"invoice, then `object.invoice_address_id.mobile` is the field which gives "
"the correct mobile number"
msgstr ""
"Fournit les champs qui seront utilisés pour récupérer le numéro du "
"cellulaire. Exemple: vous sélectionnez une facture, alors, "
"`object.invoice_address_id.mobile` est le champ qui représente le numéro du "
"cellulaire correct."
#. module: base
#: view:ir.mail_server:0
@ -840,7 +891,7 @@ msgstr ""
#: field:base.language.export,name:0
#: field:ir.attachment,datas_fname:0
msgid "File Name"
msgstr ""
msgstr "Nom du fichier"
#. module: base
#: model:res.country,name:base.rs
@ -891,6 +942,33 @@ msgid ""
"also possible in order to automatically create a meeting when a holiday "
"request is accepted by setting up a type of meeting in Leave Type.\n"
msgstr ""
"\n"
"Gère les absences et les demandes de congés\n"
"===========================================\n"
"\n"
"Cette application contrôle la programmation des congés de votre société. Il "
"permet aux employés de faire des demandes de congés. Ensuite, les managers "
"peuvent examiner les demandes et les approuver ou les rejeter. De cette "
"façon, vous pouvez contrôler la planification de l'ensemble des congés de "
"votre entreprise ou de votre département.\n"
"\n"
"Vous pouvez configurer plusieurs sortes d'absences (maladie, congés payés, "
"congés sans soldes…) et allouer rapidement ces absences à un employé ou un "
"département en utilisant les demandes de congés. Un employé peut aussi faire "
"une demande de congés pour plus de jours en ajoutant une allocation. Cela va "
"augmenter le total des jours disponibles pour ce type de congés (si la "
"demande est acceptée).\n"
"\n"
"Vous pouvez suivre les absences de différentes façons grâce aux rapports "
"suivants : \n"
"\n"
"* Résumé des absences\n"
"* Absences par département\n"
"* Analyse des absences\n"
"\n"
"Une synchronisation avec les agendas internes (Réunions du module CRM) est "
"aussi possible dans le but de créer automatiquement une réunion quand une "
"demande de congés est accepté en ajoutant une type de réunion Absence.\n"
#. module: base
#: selection:base.language.install,lang:0
@ -900,7 +978,7 @@ msgstr ""
#. module: base
#: model:ir.ui.menu,name:base.menu_crm_config_opportunity
msgid "Opportunities"
msgstr ""
msgstr "Opportunités"
#. module: base
#: model:ir.model,name:base.model_base_language_export
@ -910,7 +988,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.pg
msgid "Papua New Guinea"
msgstr ""
msgstr "Papouasie-Nouvelle-Guinée"
#. module: base
#: help:ir.actions.report.xml,report_type:0
@ -941,7 +1019,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.zw
msgid "Zimbabwe"
msgstr ""
msgstr "Zimbabwe"
#. module: base
#: help:ir.model.constraint,type:0
@ -957,7 +1035,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.es
msgid "Spain"
msgstr ""
msgstr "Espagne"
#. module: base
#: help:ir.actions.act_window,domain:0
@ -978,17 +1056,17 @@ msgstr ""
#. module: base
#: field:res.partner,mobile:0
msgid "Mobile"
msgstr ""
msgstr "Cellulaire"
#. module: base
#: model:res.country,name:base.om
msgid "Oman"
msgstr ""
msgstr "Oman"
#. module: base
#: model:ir.module.module,shortdesc:base.module_mrp
msgid "MRP"
msgstr ""
msgstr "MRP - PBM"
#. module: base
#: model:ir.module.module,description:base.module_hr_attendance
@ -1026,12 +1104,12 @@ msgstr ""
#: model:ir.actions.act_window,name:base.act_menu_create
#: view:wizard.ir.model.menu.create:0
msgid "Create Menu"
msgstr ""
msgstr "Créer un menu"
#. module: base
#: model:res.country,name:base.in
msgid "India"
msgstr ""
msgstr "Inde"
#. module: base
#: model:ir.actions.act_window,name:base.res_request_link-act
@ -1047,7 +1125,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_fleet
msgid "Fleet Management"
msgstr ""
msgstr "Gestion de flotte"
#. module: base
#: help:ir.server.object.lines,value:0
@ -1107,6 +1185,36 @@ msgid ""
"* Planned Revenue by Stage and User (graph)\n"
"* Opportunities by Stage (graph)\n"
msgstr ""
"\n"
"Le module OpenERP de gestion de la relation client (CRM)\n"
"=============================================\n"
"\n"
"Cette application permet aux utilisateurs de gérer efficacement et "
"intelligemment leurs pistes, opportunités, réunions et appels "
"téléphoniques.\n"
"\n"
"Elle gère les tâches clés comme la communication, l'identification, les "
"assignations, les résolutions et les notifications.\n"
"\n"
"OpenERP assure que toutes les demandes sont suivis par les utilisateurs, les "
"clients et les fournisseurs. Il permet d'envoyer automatiquement des "
"rappels, d'escalader des requêtes, de lancer des actions spécifiques et de "
"nombreuses autres selon les règles de l'entreprise.\n"
"\n"
"Le grand avantage de ce système est que les utilisateurs n'ont rien à faire "
"de spécial. Le module CRM dispose d'une passerelle de courriel permettant de "
"synchroniser les courriels reçus et OpenERP. De cette façon, les "
"utilisateurs peuvent simplement envoyer des courriels au système de suivi "
"des demandes.\n"
"\n"
"OpenERP s'occupera de remercier les utilisateurs de leur message, de diriger "
"cette demande à l'équipe appropriée et de s'assurer que toute les "
"communications futures seront rangées à la bonne place.\n"
"\n"
"\n"
"Le tableau bord de cette application inclus:\n"
"* les revenus prévus par étape de vente et par utilisateur (graphique);\n"
"* les opportunités par étape de vente (graphique).\n"
#. module: base
#: selection:base.language.export,format:0
@ -1241,17 +1349,17 @@ msgstr ""
#: selection:ir.actions.server,state:0
#: selection:workflow.activity,kind:0
msgid "Dummy"
msgstr ""
msgstr "Factice"
#. module: base
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
msgstr "XML invalide pour l'architecture de la vue"
#. module: base
#: model:res.country,name:base.ky
msgid "Cayman Islands"
msgstr ""
msgstr "Îles Caïmans"
#. module: base
#: view:ir.rule:0
@ -1287,7 +1395,7 @@ msgstr ""
#. module: base
#: selection:ir.property,type:0
msgid "Char"
msgstr ""
msgstr "Caractère"
#. module: base
#: field:ir.module.category,visible:0
@ -1365,6 +1473,9 @@ msgid ""
"decimal number [00,53]. All days in a new year preceding the first Monday "
"are considered to be in week 0."
msgstr ""
"%W - Numéro de semaine dans l'année (lundi est le premier jour de la "
"semaine) en nombre décimal [00,53]. Tous les jours de la nouvelle année "
"précédant le premier lundi sont considérés faisant partie de la semaine 0."
#. module: base
#: code:addons/base/module/wizard/base_language_install.py:53
@ -1390,13 +1501,13 @@ msgstr ""
#. module: base
#: field:ir.actions.act_url,url:0
msgid "Action URL"
msgstr ""
msgstr "URL de l'action"
#. module: base
#: field:base.module.import,module_name:0
#: field:ir.module.module,shortdesc:0
msgid "Module Name"
msgstr ""
msgstr "Nom du module"
#. module: base
#: model:res.country,name:base.mh
@ -1423,7 +1534,7 @@ msgstr ""
#: view:ir.ui.view:0
#: selection:ir.ui.view,type:0
msgid "Search"
msgstr ""
msgstr "Recherche"
#. module: base
#: code:addons/osv.py:154
@ -1451,12 +1562,12 @@ msgstr ""
#: code:addons/base/res/res_users.py:131
#, python-format
msgid "Operation Canceled"
msgstr ""
msgstr "Opération annulée"
#. module: base
#: model:ir.module.module,shortdesc:base.module_document
msgid "Document Management System"
msgstr ""
msgstr "Système de gestion des documents"
#. module: base
#: model:ir.module.module,shortdesc:base.module_crm_claim
@ -1499,7 +1610,7 @@ msgstr ""
#: model:ir.module.category,name:base.module_category_purchase_management
#: model:ir.ui.menu,name:base.menu_purchase_root
msgid "Purchases"
msgstr ""
msgstr "Achats"
#. module: base
#: model:res.country,name:base.md
@ -1524,12 +1635,12 @@ msgstr ""
#. module: base
#: view:ir.module.module:0
msgid "Features"
msgstr ""
msgstr "Fonctionnalités"
#. module: base
#: view:ir.attachment:0
msgid "Data"
msgstr ""
msgstr "Données"
#. module: base
#: model:ir.module.module,description:base.module_portal_claim
@ -1597,7 +1708,7 @@ msgstr ""
#: model:ir.module.category,name:base.module_category_social_network
#: model:ir.module.module,shortdesc:base.module_mail
msgid "Social Network"
msgstr ""
msgstr "Réseau social"
#. module: base
#: view:res.lang:0
@ -12871,7 +12982,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.ao
msgid "Angola"
msgstr ""
msgstr "Angola"
#. module: base
#: model:res.country,name:base.tf

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:46+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:35+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:46+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:35+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:47+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:35+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:47+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:36+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:52+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:40+0000\n"
"X-Generator: Launchpad (build 16967)\n"
"Language: hr\n"
#. module: base

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:47+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:36+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -9,8 +9,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:42+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:31+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:48+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:36+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:47+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:36+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:48+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:36+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:48+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:37+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:45+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:34+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:48+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:37+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:49+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:37+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:49+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:38+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:49+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:37+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:49+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:38+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:50+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:38+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:50+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:38+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:44+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:33+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:56+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:44+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:51+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:39+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:51+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:39+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:55+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:43+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:51+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:39+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:51+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:40+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:52+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:40+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:52+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:41+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:41+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:30+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:52+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:40+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:58+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:47+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:53+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:41+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:53+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:41+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:53+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:42+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:54+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:42+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:54+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:42+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:54+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:42+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:54+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:43+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:57+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:46+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:54+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:43+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-03-12 04:57+0000\n"
"X-Generator: Launchpad (build 16963)\n"
"X-Launchpad-Export-Date: 2014-03-20 05:45+0000\n"
"X-Generator: Launchpad (build 16967)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -39,6 +39,7 @@ import ir_mail_server
import ir_fields
import ir_qweb
import ir_http
import ir_logging
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -141,12 +141,12 @@ class ir_actions_report_xml(osv.osv):
'model': fields.char('Model', required=True),
'report_type': fields.selection([('qweb-pdf', 'PDF'),
('qweb-html', 'HTML'),
('other', 'Other'),
('controller', 'Controller'),
('pdf', 'RML pdf (deprecated)'),
('sxw', 'RML sxw (deprecated)'),
('webkit', 'Webkit (deprecated)'),
], 'Report Type', required=True, help="PDF will use wkhtmltopdf to render html to pdf, HTML will directly show html, Other will force download the controller output keeping the MIME type."),
'report_name': fields.char('Controller Name', required=True, help="URL of the report will be /report/<controller name>/<ids>, the default controller also use this field to get the name of the qweb ir.ui.view to render. For RML reports, this is the LocalService name."),
], 'Report Type', required=True, help="HTML will open the report directly in your browser, PDF will use wkhtmltopdf to render the HTML into a PDF file and let you download it, Controller allows you to define the url of a custom controller outputting any kind of report."),
'report_name': fields.char('Template Name', required=True, help="For QWeb reports, name of the template used in the rendering. The method 'render_html' of the model 'report.template_name' will be called (if any) to give the html. For RML reports, this is the LocalService name."),
'groups_id': fields.many2many('res.groups', 'res_groups_report_rel', 'uid', 'gid', 'Groups'),
# options
@ -163,7 +163,7 @@ class ir_actions_report_xml(osv.osv):
'report_xsl': fields.char('XSL Path'),
'report_xml': fields.char('XML Path'),
'report_rml': fields.char('Main Report File Path', help="The path to the main report file (depending on Report Type) or NULL if the content is in another data field"),
'report_rml': fields.char('Main Report File Path/controller', help="The path to the main report file/controller (depending on Report Type) or NULL if the content is in another data field"),
'report_file': fields.related('report_rml', type="char", required=False, readonly=False, string='Report File', help="The path to the main report file (depending on Report Type) or NULL if the content is in another field", store=True),
'report_sxw': fields.function(_report_sxw, type='char', string='SXW Path'),

View File

@ -59,12 +59,13 @@
<field name="name"/>
<field name="model"/>
<field name="report_type"/>
<field name="report_name"/>
<field name="report_name" attrs="{'invisible':[('report_type','=', 'controller')]}"/>
<field name="report_rml" attrs="{'invisible':[('report_type','!=', 'controller')]}"/>
</group>
<group>
<field name="multi"/>
<field name="attachment_use"/>
<field name="attachment"/>
<field name="attachment_use" attrs="{'invisible':[('report_type','=', 'controller')]}"/>
<field name="attachment" attrs="{'invisible':[('report_type','=', 'controller')]}"/>
</group>
</group>
<notebook>

View File

@ -69,7 +69,7 @@ class ir_attachment(osv.osv):
@tools.ormcache()
def _filestore(self, cr, uid, context=None):
return os.path.join(tools.config['data_dir'], 'filestore', cr.dbname)
return tools.config.filestore(cr.dbname)
# 'data' field implementation
def _full_path(self, cr, uid, location, path):

View File

@ -0,0 +1,46 @@
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2014 OpenERP SA (<http://www.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
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import logging
from openerp.osv import osv, fields
from openerp.tools.translate import _
class ir_logging(osv.Model):
_name = 'ir.logging'
_order = 'id DESC'
EXCEPTIONS_TYPE = [
('client', 'Client'),
('server', 'Server')
]
_columns = {
'create_date': fields.datetime('Create Date', readonly=True),
'create_uid': fields.integer('Uid', readonly=True), # Integer not m2o is intentionnal
'name': fields.char('Name', required=True),
'type': fields.selection(EXCEPTIONS_TYPE, string='Type', required=True, select=True),
'dbname': fields.char('Database Name'),
'level': fields.char('Level'),
'message': fields.text('Message', required=True),
'path': fields.char('Path', required=True),
'func': fields.char('Function', required=True),
'line': fields.char('Line', required=True),
}

View File

@ -0,0 +1,66 @@
<?xml version="1.0"?>
<openerp>
<data>
<record model="ir.ui.view" id="ir_logging_form_view">
<field name="model">ir.logging</field>
<field name="arch" type="xml">
<form string="Log" version="7.0">
<group>
<field name="create_date" />
<field name="dbname" />
<field name="type" />
<field name="name" />
<field name="level" />
<field name="path" />
<field name="line" />
<field name="func" />
<field name="message" />
</group>
</form>
</field>
</record>
<record model="ir.ui.view" id="ir_logging_tree_view">
<field name="model">ir.logging</field>
<field name="arch" type="xml">
<tree string="Logs" version="7.0">
<field name="create_date" />
<field name="create_uid" />
<field name="dbname" />
<field name="type" />
<field name="name" />
<field name="level" />
<field name="path" />
<field name="line" />
<field name="func" />
</tree>
</field>
</record>
<record model="ir.ui.view" id="ir_logging_search_view">
<field name="model">ir.logging</field>
<field name="arch" type="xml">
<search string="Logs">
<field name="dbname" />
<field name="type" />
<field name="name" />
<field name="level" />
<field name="message" />
<group expand="0" string="Group By...">
<filter string="Database" domain="[]" context="{'group_by': 'dbname'}" />
<filter string="Level" domain="[]" context="{'group_by': 'level'}" />
<filter string="Type" domain="[]" context="{'group_by': 'type'}" />
<filter string="Month" domain="[]" context="{'group_by': 'create_date'}" />
<filter string="Day" domain="[]" context="{'group_by': 'create_date:day'}" />
</group>
</search>
</field>
</record>
<record model="ir.actions.act_window" id="ir_logging_all_act">
<field name="name">Logging</field>
<field name="res_model">ir.logging</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="ir_logging_search_view" />
</record>
<menuitem parent="base.menu_custom" id="ir_logging_all_menu" action="ir_logging_all_act" />
</data>
</openerp>

View File

@ -808,6 +808,38 @@ class RelativeDatetimeConverter(osv.AbstractModel):
return babel.dates.format_timedelta(
value - reference, add_direction=True, locale=locale)
class Contact(orm.AbstractModel):
_name = 'ir.qweb.field.contact'
_inherit = 'ir.qweb.field.many2one'
def record_to_html(self, cr, uid, field_name, record, column, options=None, context=None):
opf = options.get('fields') or ["name", "address", "phone", "mobile", "fax", "email"]
if not getattr(record, field_name):
return None
id = getattr(record, field_name).id
field_browse = self.pool[column._obj].browse(cr, openerp.SUPERUSER_ID, id, context={"show_address": True})
value = werkzeug.utils.escape( field_browse.name_get()[0][1] )
val = {
'name': value.split("\n")[0],
'address': werkzeug.utils.escape("\n".join(value.split("\n")[1:])),
'phone': field_browse.phone,
'mobile': field_browse.mobile,
'fax': field_browse.fax,
'city': field_browse.city,
'country_id': field_browse.country_id and field_browse.country_id.name_get()[0][1],
'email': field_browse.email,
'fields': opf,
'options': options
}
html = self.pool["ir.ui.view"].render(cr, uid, "base.contact", val, engine='ir.qweb', context=context).decode('utf8')
return HTMLSafe(html)
class HTMLSafe(object):
""" HTMLSafe string wrapper, Werkzeug's escape() has special handling for
objects with a ``__html__`` methods but AFAIK does not provide any such

View File

@ -0,0 +1,21 @@
<openerp>
<data>
<template id="contact">
<address t-ignore="true" class="mb0" itemscope="itemscope" itemtype="http://schema.org/Organization">
<div t-att-class="'name' not in fields and 'css_non_editable_mode_hidden'"><span itemprop="name" t-esc="name"/></div>
<div itemprop="address" itemscope="itemscope" itemtype="http://schema.org/PostalAddress">
<div t-if="address and 'address' in fields" class='css_editable_mode_hidden'>
<i t-if="not options.get('no_marker')" class='fa fa-map-marker'/> <span itemprop="streetAddress" t-raw="address.replace('\n', options.get('no_tag_br') and ', ' or ('&lt;br/&gt;%s' % ('' if options.get('no_marker') else '&amp;nbsp; &amp;nbsp; ')))"/>
</div>
<div t-if="city and 'city' in fields" class='css_editable_mode_hidden'>
<i t-if="not options.get('no_marker')" class='fa fa-map-marker'/> <span itemprop="addressLocality" t-raw="city"/>, <span itemprop="addressCountry" t-raw="country_id"/>
</div>
<div t-if="phone and 'phone' in fields" class='css_editable_mode_hidden'><i t-if="not options.get('no_marker')" class='fa fa-phone'/> <span itemprop="telephone" t-esc="phone"/></div>
<div t-if="mobile and 'mobile' in fields" class='css_editable_mode_hidden'><i t-if="not options.get('no_marker')" class='fa fa-mobile-phone'/> <span itemprop="telephone" t-esc="mobile"/></div>
<div t-if="fax and 'fax' in fields" class='css_editable_mode_hidden'><i t-if="not options.get('no_marker')" class='fa fa-file-text-o'/> <span itemprop="faxNumber" t-esc="fax"/></div>
<div t-if="email and 'email' in fields" class='css_editable_mode_hidden'><i t-if="not options.get('no_marker')" class='fa fa-envelope'/> <span itemprop="email" t-esc="email"/></div>
</div>
</address>
</template>
</data>
</openerp>

View File

@ -113,3 +113,4 @@
"access_ir_needaction_mixin","ir_needaction_mixin","model_ir_needaction_mixin",,1,1,1,1
"access_res_font_all","res_res_font all","model_res_font",,1,0,0,0
"access_res_font_group_user","res_res_font group_user","model_res_font","group_user",1,1,1,1
"access_ir_logging","ir_logging admin","model_ir_logging","group_erp_manager",1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
113 access_ir_needaction_mixin ir_needaction_mixin model_ir_needaction_mixin 1 1 1 1
114 access_res_font_all res_res_font all model_res_font 1 0 0 0
115 access_res_font_group_user res_res_font group_user model_res_font group_user 1 1 1 1
116 access_ir_logging ir_logging admin model_ir_logging group_erp_manager 1 1 1 1

View File

@ -23,6 +23,7 @@ import urlparse
import warnings
import babel.core
import psutil
import psycopg2
import simplejson
import werkzeug.contrib.sessions
@ -35,7 +36,7 @@ import werkzeug.wsgi
import openerp
from openerp.service import security, model as service_model
import openerp.tools
from openerp.tools.func import lazy_property
_logger = logging.getLogger(__name__)
@ -50,6 +51,70 @@ request = _request_stack()
A global proxy that always redirect to the current request object.
"""
def replace_request_password(args):
# password is always 3rd argument in a request, we replace it in RPC logs
# so it's easier to forward logs for diagnostics/debugging purposes...
if len(args) > 2:
args = list(args)
args[2] = '*'
return tuple(args)
def dispatch_rpc(service_name, method, params):
""" Handle a RPC call.
This is pure Python code, the actual marshalling (from/to XML-RPC) is done
in a upper layer.
"""
try:
rpc_request = logging.getLogger(__name__ + '.rpc.request')
rpc_response = logging.getLogger(__name__ + '.rpc.response')
rpc_request_flag = rpc_request.isEnabledFor(logging.DEBUG)
rpc_response_flag = rpc_response.isEnabledFor(logging.DEBUG)
if rpc_request_flag or rpc_response_flag:
start_time = time.time()
start_rss, start_vms = 0, 0
start_rss, start_vms = psutil.Process(os.getpid()).get_memory_info()
if rpc_request and rpc_response_flag:
openerp.netsvc.log(rpc_request, logging.DEBUG, '%s.%s' % (service_name, method), replace_request_password(params))
threading.current_thread().uid = None
threading.current_thread().dbname = None
if service_name == 'common':
dispatch = openerp.service.common.dispatch
elif service_name == 'db':
dispatch = openerp.service.db.dispatch
elif service_name == 'object':
dispatch = openerp.service.model.dispatch
elif service_name == 'report':
dispatch = openerp.service.report.dispatch
else:
dispatch = openerp.service.wsgi_server.rpc_handlers.get(service_name)
result = dispatch(method, params)
if rpc_request_flag or rpc_response_flag:
end_time = time.time()
end_rss, end_vms = 0, 0
end_rss, end_vms = psutil.Process(os.getpid()).get_memory_info()
logline = '%s.%s time:%.3fs mem: %sk -> %sk (diff: %sk)' % (service_name, method, end_time - start_time, start_vms / 1024, end_vms / 1024, (end_vms - start_vms)/1024)
if rpc_response_flag:
openerp.netsvc.log(rpc_response, logging.DEBUG, logline, result)
else:
openerp.netsvc.log(rpc_request, logging.DEBUG, logline, replace_request_password(params), depth=1)
return result
except (openerp.osv.orm.except_orm, openerp.exceptions.AccessError, \
openerp.exceptions.AccessDenied, openerp.exceptions.Warning, \
openerp.exceptions.RedirectWarning):
raise
except openerp.exceptions.DeferredException, e:
_logger.exception(openerp.tools.exception_to_unicode(e))
openerp.tools.debugger.post_mortem(openerp.tools.config, e.traceback)
raise
except Exception, e:
_logger.exception(openerp.tools.exception_to_unicode(e))
openerp.tools.debugger.post_mortem(openerp.tools.config, sys.exc_info())
raise
def local_redirect(path, query=None, keep_hash=False, forward_debug=True, code=303):
url = path
if not query:
@ -628,7 +693,7 @@ class SessionExpiredException(Exception):
class Service(object):
"""
.. deprecated:: 8.0
Use ``openerp.netsvc.dispatch_rpc()`` instead.
Use ``dispatch_rpc()`` instead.
"""
def __init__(self, session, service_name):
self.session = session
@ -636,7 +701,7 @@ class Service(object):
def __getattr__(self, method):
def proxy_method(*args):
result = openerp.netsvc.dispatch_rpc(self.service_name, method, args)
result = dispatch_rpc(self.service_name, method, args)
return result
return proxy_method
@ -709,7 +774,7 @@ class OpenERPSession(werkzeug.contrib.sessions.Session):
HTTP_HOST=wsgienv['HTTP_HOST'],
REMOTE_ADDR=wsgienv['REMOTE_ADDR'],
)
uid = openerp.netsvc.dispatch_rpc('common', 'authenticate', [db, login, password, env])
uid = dispatch_rpc('common', 'authenticate', [db, login, password, env])
else:
security.check(db, uid, password)
self.db = db
@ -813,14 +878,14 @@ class OpenERPSession(werkzeug.contrib.sessions.Session):
def send(self, service_name, method, *args):
"""
.. deprecated:: 8.0
Use ``openerp.netsvc.dispatch_rpc()`` instead.
Use ``dispatch_rpc()`` instead.
"""
return openerp.netsvc.dispatch_rpc(service_name, method, args)
return dispatch_rpc(service_name, method, args)
def proxy(self, service):
"""
.. deprecated:: 8.0
Use ``openerp.netsvc.dispatch_rpc()`` instead.
Use ``dispatch_rpc()`` instead.
"""
return Service(self, service)
@ -1013,22 +1078,25 @@ class Root(object):
path = openerp.tools.config.session_dir
_logger.debug('HTTP sessions stored in: %s', path)
self.session_store = werkzeug.contrib.sessions.FilesystemSessionStore(path, session_class=OpenERPSession)
self._loaded = False
# TODO should we move this to ir.http so that only configured modules are served ?
_logger.info("HTTP Configuring static files")
self.load_addons()
@lazy_property
def nodb_routing_map(self):
_logger.info("Generating nondb routing")
self.nodb_routing_map = routing_map([''] + openerp.conf.server_wide_modules, True)
return routing_map([''] + openerp.conf.server_wide_modules, True)
def __call__(self, environ, start_response):
""" Handle a WSGI request
"""
if not self._loaded:
self._loaded = True
self.load_addons()
return self.dispatch(environ, start_response)
def load_addons(self):
""" Load all addons from addons patch containg static files and
controllers and configure them. """
# TODO should we move this to ir.http so that only configured modules are served ?
statics = {}
for addons_path in openerp.modules.module.ad_paths:
@ -1042,12 +1110,16 @@ class Root(object):
_logger.debug("Loading %s", module)
if 'openerp.addons' in sys.modules:
m = __import__('openerp.addons.' + module)
else:
m = None
addons_module[module] = m
addons_manifest[module] = manifest
statics['/%s/static' % module] = path_static
app = werkzeug.wsgi.SharedDataMiddleware(self.dispatch, statics)
self.dispatch = DisableCacheMiddleware(app)
if statics:
_logger.info("HTTP Configuring static files")
app = werkzeug.wsgi.SharedDataMiddleware(self.dispatch, statics)
self.dispatch = DisableCacheMiddleware(app)
def setup_session(self, httprequest):
# recover or create session
@ -1173,7 +1245,7 @@ class Root(object):
return request.registry['ir.http'].routing_map()
def db_list(force=False, httprequest=None):
dbs = openerp.netsvc.dispatch_rpc("db", "list", [force])
dbs = dispatch_rpc("db", "list", [force])
return db_filter(dbs, httprequest=httprequest)
def db_filter(dbs, httprequest=None):
@ -1218,13 +1290,10 @@ class CommonController(Controller):
@route('/jsonrpc', type='json', auth="none")
def jsonrpc(self, service, method, args):
""" Method used by client APIs to contact OpenERP. """
return openerp.netsvc.dispatch_rpc(service, method, args)
return dispatch_rpc(service, method, args)
root = None
def wsgi_postload():
global root
root = Root()
openerp.service.wsgi_server.register_wsgi_handler(root)
# register main wsgi handler
root = Root()
openerp.service.wsgi_server.register_wsgi_handler(root)
# vim:et:ts=4:sw=4:

View File

@ -19,23 +19,29 @@
#
##############################################################################
import logging
import logging.handlers
import os
import pprint
import release
import sys
import threading
import time
import types
from pprint import pformat
import psutil
import tools
import psycopg2
import openerp
import sql_db
import tools
_logger = logging.getLogger(__name__)
def log(logger, level, prefix, msg, depth=None):
indent=''
indent_after=' '*len(prefix)
for line in (prefix + pprint.pformat(msg, depth=depth)).split('\n'):
logger.log(level, indent+line)
indent=indent_after
def LocalService(name):
"""
The openerp.netsvc.LocalService() function is deprecated. It still works
@ -62,6 +68,36 @@ def LocalService(name):
with registry.cursor() as cr:
return registry['ir.actions.report.xml']._lookup_report(cr, name[len('report.'):])
class PostgreSQLHandler(logging.Handler):
""" PostgreSQL Loggin Handler will store logs in the database, by default
the current database, can be set using --log-db=DBNAME
"""
def emit(self, record):
ct = threading.current_thread()
ct_db = getattr(ct, 'dbname', None)
ct_uid = getattr(ct, 'uid', None)
dbname = tools.config['log_db'] or ct_db
if dbname:
cr = None
try:
cr = sql_db.db_connect(dbname).cursor()
msg = unicode(record.msg)
traceback = getattr(record, 'exc_text', '')
if traceback:
msg = "%s\n%s" % (msg, traceback)
level = logging.getLevelName(record.levelno)
val = (ct_uid, ct_uid, 'server', dbname, record.name, level, msg, record.pathname, record.lineno, record.funcName)
cr.execute("""
INSERT INTO ir_logging(create_date, write_date, create_uid, write_uid, type, dbname, name, level, message, path, line, func)
VALUES (NOW() at time zone 'UTC', NOW() at time zone 'UTC', %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
""", val )
cr.commit()
except Exception, e:
pass
finally:
if cr:
cr.close()
BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, _NOTHING, DEFAULT = range(10)
#The background is set with 40 plus the number of the color, and the foreground with 30
#These are the sequences need to get colored ouput
@ -107,7 +143,7 @@ def init_logger():
if os.name == 'nt':
handler = logging.handlers.NTEventLogHandler("%s %s" % (release.description, release.version))
else:
handler = logging.handlers.SysLogHandler('/dev/log')
handler = logging.handlers.SysLogHandler()
format = '%s %s' % (release.description, release.version) \
+ ':%(dbname)s:%(levelname)s:%(name)s:%(message)s'
@ -115,11 +151,12 @@ def init_logger():
# LogFile Handler
logf = tools.config['logfile']
try:
# We check we have the right location for the log files
dirname = os.path.dirname(logf)
if dirname and not os.path.isdir(dirname):
os.makedirs(dirname)
if tools.config['logrotate'] is not False:
handler = logging.handlers.TimedRotatingFileHandler(logf,'D',1,30)
handler = logging.handlers.TimedRotatingFileHandler(filename=logf, when='D', interval=1, backupCount=30)
elif os.name == 'posix':
handler = logging.handlers.WatchedFileHandler(logf)
else:
@ -135,9 +172,10 @@ def init_logger():
# behind Apache with mod_wsgi, handler.stream will have type mod_wsgi.Log,
# which has no fileno() method. (mod_wsgi.Log is what is being bound to
# sys.stderr when the logging.StreamHandler is being constructed above.)
if isinstance(handler, logging.StreamHandler) \
and hasattr(handler.stream, 'fileno') \
and os.isatty(handler.stream.fileno()):
def is_a_tty(stream):
return hasattr(stream, 'fileno') and os.isatty(stream.fileno())
if isinstance(handler, logging.StreamHandler) and is_a_tty(handler.stream):
formatter = ColoredFormatter(format)
else:
formatter = DBFormatter(format)
@ -145,7 +183,12 @@ def init_logger():
logging.getLogger().addHandler(handler)
# Configure handlers
if tools.config['log_db']:
postgresqlHandler = PostgreSQLHandler()
postgresqlHandler.setLevel(logging.WARNING)
logging.getLogger().addHandler(postgresqlHandler)
# Configure loggers levels
pseudo_config = PSEUDOCONFIG_MAPPER.get(tools.config['log_level'], [])
logconfig = tools.config['log_handler']
@ -162,15 +205,15 @@ def init_logger():
DEFAULT_LOG_CONFIGURATION = [
'openerp.workflow.workitem:WARNING',
'openerp.netsvc.rpc.request:INFO',
'openerp.netsvc.rpc.response:INFO',
'openerp.http.rpc.request:INFO',
'openerp.http.rpc.response:INFO',
'openerp.addons.web.http:INFO',
'openerp.sql_db:INFO',
':INFO',
]
PSEUDOCONFIG_MAPPER = {
'debug_rpc_answer': ['openerp:DEBUG','openerp.netsvc.rpc.request:DEBUG', 'openerp.netsvc.rpc.response:DEBUG'],
'debug_rpc': ['openerp:DEBUG','openerp.netsvc.rpc.request:DEBUG'],
'debug_rpc_answer': ['openerp:DEBUG','openerp.http.rpc.request:DEBUG', 'openerp.http.rpc.response:DEBUG'],
'debug_rpc': ['openerp:DEBUG','openerp.http.rpc.request:DEBUG'],
'debug': ['openerp:DEBUG'],
'debug_sql': ['openerp.sql_db:DEBUG'],
'info': [],
@ -179,99 +222,4 @@ PSEUDOCONFIG_MAPPER = {
'critical': ['openerp:CRITICAL'],
}
# A alternative logging scheme for automated runs of the
# server intended to test it.
def init_alternative_logger():
class H(logging.Handler):
def emit(self, record):
if record.levelno > 20:
print record.levelno, record.pathname, record.msg
handler = H()
# Add the handler to the 'openerp' logger.
logger = logging.getLogger('openerp')
logger.addHandler(handler)
logger.setLevel(logging.ERROR)
def replace_request_password(args):
# password is always 3rd argument in a request, we replace it in RPC logs
# so it's easier to forward logs for diagnostics/debugging purposes...
if len(args) > 2:
args = list(args)
args[2] = '*'
return tuple(args)
def log(logger, level, prefix, msg, depth=None):
indent=''
indent_after=' '*len(prefix)
for line in (prefix+pformat(msg, depth=depth)).split('\n'):
logger.log(level, indent+line)
indent=indent_after
def dispatch_rpc(service_name, method, params):
""" Handle a RPC call.
This is pure Python code, the actual marshalling (from/to XML-RPC) is done
in a upper layer.
"""
try:
rpc_request = logging.getLogger(__name__ + '.rpc.request')
rpc_response = logging.getLogger(__name__ + '.rpc.response')
rpc_request_flag = rpc_request.isEnabledFor(logging.DEBUG)
rpc_response_flag = rpc_response.isEnabledFor(logging.DEBUG)
if rpc_request_flag or rpc_response_flag:
start_time = time.time()
start_rss, start_vms = 0, 0
start_rss, start_vms = psutil.Process(os.getpid()).get_memory_info()
if rpc_request and rpc_response_flag:
log(rpc_request,logging.DEBUG,'%s.%s'%(service_name,method), replace_request_password(params))
threading.current_thread().uid = None
threading.current_thread().dbname = None
if service_name == 'common':
dispatch = openerp.service.common.dispatch
elif service_name == 'db':
dispatch = openerp.service.db.dispatch
elif service_name == 'object':
dispatch = openerp.service.model.dispatch
elif service_name == 'report':
dispatch = openerp.service.report.dispatch
else:
dispatch = openerp.service.wsgi_server.rpc_handlers.get(service_name)
result = dispatch(method, params)
if rpc_request_flag or rpc_response_flag:
end_time = time.time()
end_rss, end_vms = 0, 0
end_rss, end_vms = psutil.Process(os.getpid()).get_memory_info()
logline = '%s.%s time:%.3fs mem: %sk -> %sk (diff: %sk)' % (service_name, method, end_time - start_time, start_vms / 1024, end_vms / 1024, (end_vms - start_vms)/1024)
if rpc_response_flag:
log(rpc_response,logging.DEBUG, logline, result)
else:
log(rpc_request,logging.DEBUG, logline, replace_request_password(params), depth=1)
return result
except openerp.osv.orm.except_orm:
raise
except openerp.exceptions.AccessError:
raise
except openerp.exceptions.AccessDenied:
raise
except openerp.exceptions.Warning:
raise
except openerp.exceptions.RedirectWarning:
raise
except openerp.exceptions.DeferredException, e:
_logger.exception(tools.exception_to_unicode(e))
post_mortem(e.traceback)
raise
except Exception, e:
_logger.exception(tools.exception_to_unicode(e))
post_mortem(sys.exc_info())
raise
def post_mortem(info):
if tools.config['debug_mode'] and isinstance(info[2], types.TracebackType):
import pdb
pdb.post_mortem(info[2])
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -126,6 +126,11 @@ def exp_duplicate_database(db_original_name, db_name):
with closing(db.cursor()) as cr:
cr.autocommit(True) # avoid transaction block
cr.execute("""CREATE DATABASE "%s" ENCODING 'unicode' TEMPLATE "%s" """ % (db_name, db_original_name))
from_fs = openerp.tools.config.filestore(db_original_name)
to_fs = openerp.tools.config.filestore(db_name)
if os.path.exists(from_fs) and not os.path.exists(to_fs):
shutil.copy(from_fs, to_fs)
return True
def exp_get_progress(id):
@ -178,6 +183,10 @@ def exp_drop(db_name):
raise Exception("Couldn't drop database %s: %s" % (db_name, e))
else:
_logger.info('DROP DB: %s', db_name)
fs = openerp.tools.config.filestore(db_name)
if os.path.exists(fs):
shutil.rmtree(fs)
return True
def _set_pg_password_in_environment(func):
@ -328,6 +337,11 @@ def exp_rename(old_name, new_name):
except Exception, e:
_logger.error('RENAME DB: %s -> %s failed:\n%s', old_name, new_name, e)
raise Exception("Couldn't rename database %s to %s: %s" % (old_name, new_name, e))
old_fs = openerp.tools.config.filestore(old_name)
new_fs = openerp.tools.config.filestore(new_name)
if os.path.exists(old_fs) and not os.path.exists(new_fs):
shutil.move(old_fs, new_fs)
return True
@openerp.tools.mute_logger('openerp.sql_db')

View File

@ -72,7 +72,7 @@ def xmlrpc_return(start_response, service, method, params, string_faultcode=Fals
# This also mimics SimpleXMLRPCDispatcher._marshaled_dispatch() for
# exception handling.
try:
result = openerp.netsvc.dispatch_rpc(service, method, params)
result = openerp.http.dispatch_rpc(service, method, params)
response = xmlrpclib.dumps((result,), methodresponse=1, allow_none=False, encoding=None)
except Exception, e:
if string_faultcode:

View File

@ -35,7 +35,7 @@ from yaml_import import *
from sql import *
from float_utils import *
from mail import *
from debugger import *
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,4 +1,4 @@
# -*- coding: utf-8 -*-
#openerp.loggers.handlers. -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
@ -76,9 +76,10 @@ class configmanager(object):
}
# Not exposed in the configuration file.
self.blacklist_for_save = set(
['publisher_warranty_url', 'load_language', 'root_path',
'init', 'save', 'config', 'update', 'stop_after_init'])
self.blacklist_for_save = set([
'publisher_warranty_url', 'load_language', 'root_path',
'init', 'save', 'config', 'update', 'stop_after_init'
])
# dictionary mapping option destination (keys in self.options) to MyOptions.
self.casts = {}
@ -87,7 +88,10 @@ class configmanager(object):
self.config_file = fname
self.has_ssl = check_ssl()
self._LOGLEVELS = dict([(getattr(loglevels, 'LOG_%s' % x), getattr(logging, x)) for x in ('CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG', 'NOTSET')])
self._LOGLEVELS = dict([
(getattr(loglevels, 'LOG_%s' % x), getattr(logging, x))
for x in ('CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG', 'NOTSET')
])
version = "%s %s" % (release.description, release.version)
self.parser = parser = optparse.OptionParser(version=version, option_class=MyOption)
@ -179,16 +183,20 @@ class configmanager(object):
group.add_option("--logrotate", dest="logrotate", action="store_true", my_default=False, help="enable logfile rotation")
group.add_option("--syslog", action="store_true", dest="syslog", my_default=False, help="Send the log to the syslog server")
group.add_option('--log-handler', action="append", default=DEFAULT_LOG_HANDLER, my_default=DEFAULT_LOG_HANDLER, metavar="PREFIX:LEVEL", help='setup a handler at LEVEL for a given PREFIX. An empty PREFIX indicates the root logger. This option can be repeated. Example: "openerp.orm:DEBUG" or "werkzeug:CRITICAL" (default: ":INFO")')
group.add_option('--log-request', action="append_const", dest="log_handler", const="openerp.netsvc.rpc.request:DEBUG", help='shortcut for --log-handler=openerp.netsvc.rpc.request:DEBUG')
group.add_option('--log-response', action="append_const", dest="log_handler", const="openerp.netsvc.rpc.response:DEBUG", help='shortcut for --log-handler=openerp.netsvc.rpc.response:DEBUG')
group.add_option('--log-web', action="append_const", dest="log_handler", const="openerp.addons.web.http:DEBUG", help='shortcut for --log-handler=openerp.addons.web.http:DEBUG')
group.add_option('--log-request', action="append_const", dest="log_handler", const="openerp.http.rpc.request:DEBUG", help='shortcut for --log-handler=openerp.http.rpc.request:DEBUG')
group.add_option('--log-response', action="append_const", dest="log_handler", const="openerp.http.rpc.response:DEBUG", help='shortcut for --log-handler=openerp.http.rpc.response:DEBUG')
group.add_option('--log-web', action="append_const", dest="log_handler", const="openerp.http:DEBUG", help='shortcut for --log-handler=openerp.http:DEBUG')
group.add_option('--log-sql', action="append_const", dest="log_handler", const="openerp.sql_db:DEBUG", help='shortcut for --log-handler=openerp.sql_db:DEBUG')
group.add_option('--log-db', dest='log_db', help="Logging database", my_default=False)
# For backward-compatibility, map the old log levels to something
# quite close.
levels = ['info', 'debug_rpc', 'warn', 'test', 'critical',
'debug_sql', 'error', 'debug', 'debug_rpc_answer', 'notset']
group.add_option('--log-level', dest='log_level', type='choice', choices=levels,
my_default='info', help='specify the level of the logging. Accepted values: ' + str(levels) + ' (deprecated option).')
levels = [
'info', 'debug_rpc', 'warn', 'test', 'critical',
'debug_sql', 'error', 'debug', 'debug_rpc_answer', 'notset'
]
group.add_option('--log-level', dest='log_level', type='choice',
choices=levels, my_default='info',
help='specify the level of the logging. Accepted values: %s (deprecated option).' % (levels,))
parser.add_option_group(group)
@ -384,7 +392,7 @@ class configmanager(object):
'xmlrpc', 'syslog', 'without_demo', 'timezone',
'xmlrpcs_interface', 'xmlrpcs_port', 'xmlrpcs',
'static_http_enable', 'static_http_document_root', 'static_http_url_prefix',
'secure_cert_file', 'secure_pkey_file', 'dbfilter', 'log_handler', 'log_level'
'secure_cert_file', 'secure_pkey_file', 'dbfilter', 'log_handler', 'log_level', 'log_db'
]
for arg in keys:
@ -654,6 +662,9 @@ class configmanager(object):
os.chmod(d, 0700)
return d
def filestore(self, dbname):
return os.path.join(self['data_dir'], 'filestore', dbname)
config = configmanager()

View File

@ -0,0 +1,8 @@
# -*- coding: utf-8 -*-
# Copyright: 2014 - OpenERP S.A. <http://openerp.com>
import types
def post_mortem(config, info):
if config['debug_mode'] and isinstance(info[2], types.TracebackType):
import pdb
pdb.post_mortem(info[2])

View File

@ -3,7 +3,7 @@
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
# Copyright (C) 2010 OpenERP s.a. (<http://openerp.com>).
# Copyright (C) 2010, 2014 OpenERP s.a. (<http://openerp.com>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@ -20,11 +20,39 @@
#
##############################################################################
__all__ = ['synchronized']
__all__ = ['synchronized', 'lazy_property']
from functools import wraps
from inspect import getsourcefile
class lazy_property(object):
""" Decorator for a lazy property of an object, i.e., an object attribute
that is determined by the result of a method call evaluated once. To
reevaluate the property, simply delete the attribute on the object, and
get it again.
"""
def __init__(self, fget):
self.fget = fget
self.name = fget.__name__
def __get__(self, obj, cls):
if obj is None:
return self
value = self.fget(obj)
setattr(obj, self.name, value)
return value
@staticmethod
def reset_all(obj):
""" Reset all lazy properties on the instance `obj`. """
cls = type(obj)
obj_dict = obj.__dict__
for name in obj_dict.keys():
if isinstance(getattr(cls, name, None), lazy_property):
obj_dict.pop(name)
def synchronized(lock_attr='_lock'):
def decorator(func):
@wraps(func)

View File

@ -3,7 +3,7 @@
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
# Copyright (C) 2010-2013 OpenERP s.a. (<http://openerp.com>).
# Copyright (C) 2010-2014 OpenERP s.a. (<http://openerp.com>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@ -83,7 +83,8 @@ def exec_pg_command(name, *args):
raise Exception('Couldn\'t find %s' % name)
args2 = (prog,) + args
return subprocess.call(args2)
with open(os.devnull) as dn:
return subprocess.call(args2, stdout=dn, stderr=subprocess.STDOUT)
def exec_pg_command_pipe(name, *args):
prog = find_pg_tool(name)

View File

@ -458,7 +458,7 @@ def trans_export(lang, modules, buffer, format, cr):
row.setdefault('tnrs', []).append((type, name, res_id))
row.setdefault('comments', set()).update(comments)
for src, row in grouped_rows.items():
for src, row in sorted(grouped_rows.items()):
if not lang:
# translation template, so no translation value
row['translation'] = ''