diff --git a/bin/addons/__init__.py b/bin/addons/__init__.py index e18213d466f..75f4fee3184 100644 --- a/bin/addons/__init__.py +++ b/bin/addons/__init__.py @@ -24,6 +24,7 @@ import os, sys, imp from os.path import join as opj import itertools from sets import Set +import zipimport import osv import tools @@ -268,25 +269,32 @@ def init_module_objects(cr, module_name, obj_list): t[1](cr, *t[2]) cr.commit() -# -# Register module named m, if not already registered -# def register_class(m): + """ + Register module named m, if not already registered + """ global loaded if m in loaded: return logger.notifyChannel('init', netsvc.LOG_INFO, 'module %s: registering objects' % m) loaded.append(m) mod_path = get_module_path(m) - if not os.path.isfile(mod_path+'.zip'): - imp.load_module(m, *imp.find_module(m, [ad, _ad])) - else: - import zipimport - try: - zimp = zipimport.zipimporter(mod_path+'.zip') + try: + zip_mod_path = mod_path + '.zip' + if not os.path.isfile(zip_mod_path): + imp.load_module(m, *imp.find_module(m, [ad, _ad])) + else: + zimp = zipimport.zipimporter(zip_mod_path) zimp.load_module(m) - except zipimport.ZipImportError: - logger.notifyChannel('init', netsvc.LOG_ERROR, 'Couldn\'t find module %s' % m) + except zipimport.ZipImportError: + logger.notifyChannel('init', netsvc.LOG_CRITICAL, 'Couldn\'t find zip module %s' % m) + raise + except ImportError: + logger.notifyChannel('init', netsvc.LOG_CRITICAL, 'Couldn\'t find module %s' % m) + raise + except Exception: + logger.notifyChannel('init', netsvc.LOG_CRITICAL, 'Couldn\'t find module %s' % (m)) + raise class MigrationManager(object): @@ -535,84 +543,86 @@ def load_module_graph(cr, graph, status=None, check_access_rules=True, **kwargs) def load_modules(db, force_demo=False, status=None, update_module=False): if not status: status={} + cr = db.cursor() force = [] if force_demo: force.append('demo') pool = pooler.get_pool(cr.dbname) - report = tools.assertion_report() - if update_module: - basegraph = create_graph(['base'], force) - load_module_graph(cr, basegraph, status, check_access_rules=False, report=report) + try: + report = tools.assertion_report() + if update_module: + basegraph = create_graph(['base'], force) + load_module_graph(cr, basegraph, status, check_access_rules=False, report=report) - modobj = pool.get('ir.module.module') - logger.notifyChannel('init', netsvc.LOG_INFO, 'updating modules list') - modobj.update_list(cr, 1) + modobj = pool.get('ir.module.module') + logger.notifyChannel('init', netsvc.LOG_INFO, 'updating modules list') + modobj.update_list(cr, 1) - mods = [k for k in tools.config['init'] if tools.config['init'][k]] - if mods: - ids = modobj.search(cr, 1, ['&', ('state', '=', 'uninstalled'), ('name', 'in', mods)]) - if ids: - modobj.button_install(cr, 1, ids) + mods = [k for k in tools.config['init'] if tools.config['init'][k]] + if mods: + ids = modobj.search(cr, 1, ['&', ('state', '=', 'uninstalled'), ('name', 'in', mods)]) + if ids: + modobj.button_install(cr, 1, ids) + + mods = [k for k in tools.config['update'] if tools.config['update'][k]] + if mods: + ids = modobj.search(cr, 1, ['&',('state', '=', 'installed'), ('name', 'in', mods)]) + if ids: + modobj.button_upgrade(cr, 1, ids) + + cr.execute("update ir_module_module set state=%s where name=%s", ('installed', 'base')) + cr.execute("select name from ir_module_module where state in ('installed', 'to install', 'to upgrade')") + else: + cr.execute("select name from ir_module_module where state in ('installed', 'to upgrade')") + module_list = [name for (name,) in cr.fetchall()] + graph = create_graph(module_list, force) - mods = [k for k in tools.config['update'] if tools.config['update'][k]] - if mods: - ids = modobj.search(cr, 1, ['&',('state', '=', 'installed'), ('name', 'in', mods)]) - if ids: - modobj.button_upgrade(cr, 1, ids) - - cr.execute("update ir_module_module set state=%s where name=%s", ('installed', 'base')) - cr.execute("select name from ir_module_module where state in ('installed', 'to install', 'to upgrade')") - else: - cr.execute("select name from ir_module_module where state in ('installed', 'to upgrade')") - module_list = [name for (name,) in cr.fetchall()] - graph = create_graph(module_list, force) - - # the 'base' module has already been updated - base = graph['base'] - base.state = 'installed' - for kind in ('init', 'demo', 'update'): - if hasattr(base, kind): - delattr(base, kind) + # the 'base' module has already been updated + base = graph['base'] + base.state = 'installed' + for kind in ('init', 'demo', 'update'): + if hasattr(base, kind): + delattr(base, kind) - load_module_graph(cr, graph, status, report=report) - if report.get_report(): - logger.notifyChannel('init', netsvc.LOG_INFO, report) + load_module_graph(cr, graph, status, report=report) + if report.get_report(): + logger.notifyChannel('init', netsvc.LOG_INFO, report) - for kind in ('init', 'demo', 'update'): - tools.config[kind]={} + for kind in ('init', 'demo', 'update'): + tools.config[kind]={} - cr.commit() - if update_module: - cr.execute("select id,name from ir_module_module where state in ('to remove')") - for mod_id, mod_name in cr.fetchall(): - pool = pooler.get_pool(cr.dbname) - cr.execute('select model,res_id from ir_model_data where not noupdate and module=%s order by id desc', (mod_name,)) - for rmod,rid in cr.fetchall(): - uid = 1 - pool.get(rmod).unlink(cr, uid, [rid]) - cr.commit() - # - # TODO: remove menu without actions of childs - # - while True: - cr.execute('''delete from - ir_ui_menu - where - (id not in (select parent_id from ir_ui_menu where parent_id is not null)) - and - (id not in (select res_id from ir_values where model='ir.ui.menu')) - and - (id not in (select res_id from ir_model_data where model='ir.ui.menu'))''') - if not cr.rowcount: - break - else: - logger.notifyChannel('init', netsvc.LOG_INFO, 'removed %d unused menus' % (cr.rowcount,)) - - cr.execute("update ir_module_module set state=%s where state in ('to remove')", ('uninstalled', )) cr.commit() - #pooler.restart_pool(cr.dbname) - cr.close() + if update_module: + cr.execute("select id,name from ir_module_module where state in ('to remove')") + for mod_id, mod_name in cr.fetchall(): + pool = pooler.get_pool(cr.dbname) + cr.execute('select model,res_id from ir_model_data where not noupdate and module=%s order by id desc', (mod_name,)) + for rmod,rid in cr.fetchall(): + uid = 1 + pool.get(rmod).unlink(cr, uid, [rid]) + cr.commit() + # + # TODO: remove menu without actions of childs + # + while True: + cr.execute('''delete from + ir_ui_menu + where + (id not in (select parent_id from ir_ui_menu where parent_id is not null)) + and + (id not in (select res_id from ir_values where model='ir.ui.menu')) + and + (id not in (select res_id from ir_model_data where model='ir.ui.menu'))''') + if not cr.rowcount: + break + else: + logger.notifyChannel('init', netsvc.LOG_INFO, 'removed %d unused menus' % (cr.rowcount,)) + + cr.execute("update ir_module_module set state=%s where state in ('to remove')", ('uninstalled', )) + cr.commit() + finally: + cr.close() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/bin/addons/base/base_data.xml b/bin/addons/base/base_data.xml index e41fccfe682..4777b7ea4f0 100644 --- a/bin/addons/base/base_data.xml +++ b/bin/addons/base/base_data.xml @@ -19,7 +19,7 @@ ir.ui.menu tree - + [('parent_id', '=', False)] diff --git a/bin/addons/base/i18n/fr_FR.po b/bin/addons/base/i18n/fr_FR.po index 16e0647c81c..94d3a7e86ba 100644 --- a/bin/addons/base/i18n/fr_FR.po +++ b/bin/addons/base/i18n/fr_FR.po @@ -6,21 +6,22 @@ msgid "" msgstr "" "Project-Id-Version: OpenERP Server 5.0.0-rc1\n" "Report-Msgid-Bugs-To: support@openerp.com\n" -"POT-Creation-Date: 2008-11-28 16:57:27+0000\n" -"PO-Revision-Date: 2008-11-28 16:57:27+0000\n" -"Last-Translator: <>\n" +"POT-Creation-Date: 2008-11-28 17:09+0000\n" +"PO-Revision-Date: 2008-12-17 16:29+0000\n" +"Last-Translator: Olivier Laurent \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2008-12-17 16:52+0000\n" +"X-Generator: Launchpad (build Unknown)\n" #. module: base #: model:ir.actions.act_window,name:base.ir_cron_act #: model:ir.ui.menu,name:base.menu_ir_cron_act #: view:ir.cron:0 msgid "Scheduled Actions" -msgstr "" +msgstr "Actions Planifiées" #. module: base #: field:ir.actions.report.xml,report_name:0 @@ -44,14 +45,18 @@ msgstr "Inconnu" #. module: base #: view:wizard.module.update_translations:0 -msgid "This wizard will detect new terms in the application so that you can update them manually." +msgid "" +"This wizard will detect new terms in the application so that you can update " +"them manually." msgstr "" +"Cet assistant détectera les nouveaux termes dans l'application, ainsi, " +"vous pourrez les mettre à jour manuellement." #. module: base #: field:workflow.activity,out_transitions:0 #: view:workflow.activity:0 msgid "Outgoing transitions" -msgstr "" +msgstr "Transitions sortante" #. module: base #: selection:ir.ui.menu,icon:0 @@ -66,7 +71,7 @@ msgstr "Changer mes préférences" #. module: base #: view:ir.actions.act_window:0 msgid "Open Window" -msgstr "" +msgstr "Ouvrir la fenêtre" #. module: base #: field:res.partner.function,name:0 @@ -76,7 +81,7 @@ msgstr "Nom de la Fonction" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-account" -msgstr "" +msgstr "terp-account" #. module: base #: field:res.partner.address,title:0 @@ -116,7 +121,7 @@ msgstr "Règles d'accès" #: field:ir.ui.view,arch:0 #: field:ir.ui.view.custom,arch:0 msgid "View Architecture" -msgstr "" +msgstr "Architecture de la Vue" #. module: base #: selection:ir.ui.menu,icon:0 @@ -126,11 +131,11 @@ msgstr "STOCK_MEDIA_FORWARD" #. module: base #: selection:ir.actions.todo,state:0 msgid "Skipped" -msgstr "" +msgstr "Ignoré" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "You can not create this kind of document! (%s)" msgstr "Vous ne pouvez pas créer ce type de document! (%s)" @@ -178,12 +183,13 @@ msgstr "Objet" #: view:wizard.module.lang.export:0 msgid "To browse official translations, you can visit this link: " msgstr "" +"Pour parcourir les traductions officielles, vous pouvez visiter ce lien: " #. module: base #: model:ir.actions.act_window,name:base.action_module_category_tree #: model:ir.ui.menu,name:base.menu_action_module_category_tree msgid "Categories of Modules" -msgstr "Catégorie de modules" +msgstr "Catégories de modules" #. module: base #: model:ir.model,name:base.model_ir_default @@ -193,12 +199,12 @@ msgstr "ir.default" #. module: base #: selection:ir.actions.todo,state:0 msgid "Not Started" -msgstr "" +msgstr "Non démarré" #. module: base #: view:ir.sequence:0 msgid "Minute: %(min)s" -msgstr "" +msgstr "Minute: %(min)s" #. module: base #: selection:ir.ui.menu,icon:0 @@ -269,12 +275,12 @@ msgstr "Normal" #: field:workflow.activity,in_transitions:0 #: view:workflow.activity:0 msgid "Incoming transitions" -msgstr "" +msgstr "Transitions entrante" #. module: base #: field:ir.ui.view_sc,user_id:0 msgid "User Ref." -msgstr "" +msgstr "Réf. Utilisateur" #. module: base #: wizard_view:module.lang.import,init:0 @@ -285,7 +291,7 @@ msgstr "Importer une nouvelle langue" #: wizard_field:server.action.create,step_1,report:0 #: wizard_view:server.action.create,step_1:0 msgid "Select Report" -msgstr "" +msgstr "Sélectionnez un Rapport" #. module: base #: field:ir.report.custom.fields,fc1_condition:0 @@ -310,8 +316,8 @@ msgid "Suffix" msgstr "Suffixe" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The unlink method is not implemented on this object !" msgstr "La méthode de suppression n'est pas implémenté sur cette objet !" @@ -323,7 +329,7 @@ msgstr "Libellés" #. module: base #: field:ir.actions.act_window,target:0 msgid "Target Window" -msgstr "" +msgstr "Fenêtre Cible" #. module: base #: view:ir.rule:0 @@ -333,7 +339,7 @@ msgstr "" #. module: base #: wizard_field:res.partner.spam_send,init,from:0 msgid "Sender's email" -msgstr "Mail de l'expéditeur" +msgstr "Courriel de l'expéditeur" #. module: base #: selection:ir.report.custom,type:0 @@ -381,7 +387,7 @@ msgstr "ir.ui.view.custom" #. module: base #: selection:ir.module.module,license:0 msgid "GPL-2 or later version" -msgstr "" +msgstr "GPL-2 ou version supérieure" #. module: base #: selection:workflow.activity,kind:0 @@ -412,7 +418,7 @@ msgstr "Contact du prospet" #. module: base #: constraint:ir.ui.view:0 msgid "Invalid XML for View Architecture!" -msgstr "XML non valide pour l'architecture de la vue" +msgstr "XML non valide pour l'architecture de la vue!" #. module: base #: field:ir.report.custom,sortby:0 @@ -451,12 +457,12 @@ msgstr "Structure de la société" #. module: base #: selection:ir.module.module,license:0 msgid "Other proprietary" -msgstr "" +msgstr "Autre License Propriétaire" #. module: base #: field:ir.actions.server,address:0 msgid "Email / Mobile" -msgstr "" +msgstr "Courriel / GSM" #. module: base #: field:res.partner,comment:0 @@ -476,7 +482,7 @@ msgstr "Tous les termes" #. module: base #: field:res.partner.address,email:0 msgid "Default Email" -msgstr "" +msgstr "Courriel par défaut" #. module: base #: view:res.partner:0 @@ -502,14 +508,17 @@ msgid "Form" msgstr "Formulaire" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "Can not define a column %s. Reserved keyword !" msgstr "Impossible de définir la colonne %s. Mot clé réservé !" #. module: base #: help:ir.ui.menu,groups_id:0 -msgid "If you put groups, the visibility of this menu will be based on these groups. If this field is empty, Open ERP will compute visibility based on the related object's read access." +msgid "" +"If you put groups, the visibility of this menu will be based on these " +"groups. If this field is empty, Open ERP will compute visibility based on " +"the related object's read access." msgstr "" #. module: base @@ -520,7 +529,7 @@ msgstr "Activité de Destination" #. module: base #: model:res.partner.category,name:base.res_partner_category_10 msgid "Open Source Service Company" -msgstr "" +msgstr "Société de Service Open Source" #. module: base #: view:ir.actions.server:0 @@ -533,8 +542,8 @@ msgid "STOCK_QUIT" msgstr "STOCK_QUIT" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The name_search method is not implemented on this object !" msgstr "La méthode 'name_search' n'est pas implémentée dans cet objet !" @@ -559,8 +568,8 @@ msgid "Web:" msgstr "Web:" #. module: base -#, python-format #: code:addons/base/module/wizard/wizard_export_lang.py:0 +#, python-format msgid "new" msgstr "nouveau" @@ -617,7 +626,7 @@ msgstr "Catégorie Parent." #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-purchase" -msgstr "" +msgstr "terp-purchase" #. module: base #: field:res.partner.address,name:0 @@ -625,15 +634,19 @@ msgid "Contact Name" msgstr "Nom du Contact" #. module: base -#, python-format #: code:addons/base/module/wizard/wizard_export_lang.py:0 -msgid "Save this document to a %s file and edit it with a specific software or a text editor. The file encoding is UTF-8." -msgstr "Sauvegardez ce document dans un fichier %s et éditez le avec un logiciel spécifique ou un éditeur de texte. L'encodage du fichier est UTF-8." +#, python-format +msgid "" +"Save this document to a %s file and edit it with a specific software or a " +"text editor. The file encoding is UTF-8." +msgstr "" +"Sauvegardez ce document dans un fichier %s et éditez le avec un logiciel " +"spécifique ou un éditeur de texte. L'encodage du fichier est UTF-8." #. module: base #: view:ir.module.module:0 msgid "Schedule Upgrade" -msgstr "" +msgstr "Planifier la Mise à Jour" #. module: base #: wizard_field:module.module.update,init,repositories:0 @@ -641,8 +654,8 @@ msgid "Repositories" msgstr "Dépôts" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "Password mismatch !" msgstr "Le mot de passe ne correspond pas !" @@ -653,10 +666,12 @@ msgid "Contact" msgstr "Contact" #. module: base -#, python-format #: code:addons/base/module/module.py:0 +#, python-format msgid "This url '%s' must provide an html file with links to zip modules" msgstr "" +"Cette URL '%s' doit fournir un fichier html avec les liens vers les modules " +"au format zip" #. module: base #: model:ir.ui.menu,name:base.next_id_15 @@ -677,15 +692,15 @@ msgid "ir.ui.menu" msgstr "ir.ui.menu" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "ConcurrencyException" -msgstr "" +msgstr "Exception de Concurrence" #. module: base #: field:ir.actions.act_window,view_id:0 msgid "View Ref." -msgstr "" +msgstr "Voir la Réf." #. module: base #: model:ir.model,name:base.model_workflow_transition @@ -717,7 +732,9 @@ msgstr "En-tête de rapport" #. module: base #: view:ir.rule:0 msgid "If you don't force the domain, it will use the simple domain setup" -msgstr "Si vous ne forcez pas le domaine, il utilisera la configuration du domaine simplifiée." +msgstr "" +"Si vous ne forcez pas le domaine, il utilisera la configuration du domaine " +"simplifiée." #. module: base #: model:res.partner.title,name:base.res_partner_title_pvt_ltd @@ -727,7 +744,7 @@ msgstr "" #. module: base #: model:res.partner.category,name:base.res_partner_category_16 msgid "Telecom sector" -msgstr "" +msgstr "Secteur Telecom" #. module: base #: field:ir.actions.act_window_close,type:0 @@ -740,12 +757,12 @@ msgstr "Type d'action" #. module: base #: help:ir.actions.act_window,limit:0 msgid "Default limit for the list view" -msgstr "" +msgstr "Limite par défaut de la vue 'liste'" #. module: base #: model:ir.model,name:base.model_ir_server_object_lines msgid "ir.server.object.lines" -msgstr "" +msgstr "ir.server.object.lines" #. module: base #: field:ir.actions.act_window,src_model:0 @@ -755,7 +772,7 @@ msgstr "Objet Source" #. module: base #: field:res.partner.bank.type,field_ids:0 msgid "Type fields" -msgstr "" +msgstr "Champs type" #. module: base #: model:ir.actions.act_window,name:base.act_ir_actions_todo_form @@ -767,7 +784,7 @@ msgstr "Étapes de la configuration de l'assistant" #. module: base #: model:ir.model,name:base.model_ir_ui_view_sc msgid "ir.ui.view_sc" -msgstr "" +msgstr "ir.ui.view_sc" #. module: base #: field:ir.model.access,group_id:0 @@ -778,7 +795,7 @@ msgstr "Groupe" #. module: base #: help:res.partner,customer:0 msgid "Check this box if the partner is a customer." -msgstr "" +msgstr "Cochez cette case si le partenaire est un client." #. module: base #: selection:ir.ui.menu,icon:0 @@ -788,7 +805,7 @@ msgstr "STOCK_FLOPPY" #. module: base #: field:res.users,signature:0 msgid "Signature" -msgstr "" +msgstr "Signature" #. module: base #: field:ir.actions.server,sms:0 @@ -817,11 +834,12 @@ msgstr "Langues" #: model:ir.actions.act_window,name:base.open_module_tree_uninstall #: model:ir.ui.menu,name:base.menu_module_tree_uninstall msgid "Uninstalled modules" -msgstr "Desinstaller les modules" +msgstr "Modules non installés" #. module: base #: help:res.partner.category,active:0 -msgid "The active field allows you to hide the category, without removing it." +msgid "" +"The active field allows you to hide the category, without removing it." msgstr "Le champ Actif permet de cacher la catégorie, sans l'effacer" #. module: base @@ -838,13 +856,19 @@ msgstr "res.partner.event" #: wizard_field:server.action.create,init,type:0 #: wizard_view:server.action.create,init:0 msgid "Select Action Type" -msgstr "" +msgstr "Sélectionnez le Type d'Action" #. module: base -#, python-format #: code:addons/base/module/wizard/wizard_export_lang.py:0 -msgid "Save this document to a .CSV file and open it with your favourite spreadsheet software. The file encoding is UTF-8. You have to translate the latest column before reimporting it." -msgstr "Sauvegarder ce document dans un fichier CSV et ouvrez le dans votre tableur favori. Le fichier est encodé en UTF-8. Vous devez traduire la dernière colonne avant de la réimporter." +#, python-format +msgid "" +"Save this document to a .CSV file and open it with your favourite " +"spreadsheet software. The file encoding is UTF-8. You have to translate the " +"latest column before reimporting it." +msgstr "" +"Sauvegarder ce document dans un fichier CSV et ouvrez le dans votre tableur " +"favori. Le fichier est encodé en UTF-8. Vous devez traduire la dernière " +"colonne avant de la réimporter." #. module: base #: model:ir.actions.act_window,name:base.action_currency_form @@ -856,12 +880,17 @@ msgstr "Devises" #. module: base #: selection:ir.actions.todo,type:0 msgid "Configure" -msgstr "" +msgstr "Configuration" #. module: base #: help:res.partner,lang:0 -msgid "If the selected language is loaded in the system, all documents related to this partner will be printed in this language. If not, it will be english." -msgstr "Si la langue chargée dans le système est l'anglais, tous les documents liés à ce partenaire seront imprimés dans cette langue. Sinon, ils seront imprimé en anglais." +msgid "" +"If the selected language is loaded in the system, all documents related to " +"this partner will be printed in this language. If not, it will be english." +msgstr "" +"Si la langue chargée dans le système est l'anglais, tous les documents liés " +"à ce partenaire seront imprimés dans cette langue. Sinon, ils seront imprimé " +"en anglais." #. module: base #: selection:ir.ui.menu,icon:0 @@ -871,7 +900,7 @@ msgstr "STOCK_UNDERLINE" #. module: base #: selection:ir.model,state:0 msgid "Custom Object" -msgstr "" +msgstr "Objet Personalisé" #. module: base #: selection:ir.model.fields,select_level:0 @@ -881,7 +910,7 @@ msgstr "" #. module: base #: selection:ir.model.fields,state:0 msgid "Base Field" -msgstr "" +msgstr "Champ de Base" #. module: base #: field:workflow.instance,uid:0 @@ -894,10 +923,15 @@ msgid "Test" msgstr "Test" #. module: base -#, python-format #: code:addons/base/res/res_user.py:0 -msgid "You can not remove the admin user as it is used internally for resources created by OpenERP (updates, module installation, ...)" -msgstr "Vous ne pouvez pas supprimer l'utilisateur 'admin' car il est utilisé en interne pour les ressources créées par OpenERP (mises à jour, installation de module, ...)" +#, python-format +msgid "" +"You can not remove the admin user as it is used internally for resources " +"created by OpenERP (updates, module installation, ...)" +msgstr "" +"Vous ne pouvez pas supprimer l'utilisateur 'admin' car il est utilisé en " +"interne pour les ressources créées par OpenERP (mises à jour, installation " +"de module, ...)" #. module: base #: wizard_view:module.module.update,update:0 @@ -918,7 +952,7 @@ msgstr "" #. module: base #: help:res.partner.address,active:0 msgid "Uncheck the active field to hide the contact." -msgstr "" +msgstr "Désélectionnez le champ 'actif' pour cacher ce contact." #. module: base #: model:ir.ui.menu,name:base.next_id_10 @@ -963,7 +997,7 @@ msgstr "Sommaire" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-graph" -msgstr "" +msgstr "terp-graph" #. module: base #: model:ir.model,name:base.model_workflow_instance @@ -974,13 +1008,13 @@ msgstr "workflow.instance" #: field:res.partner.bank,state:0 #: field:res.partner.bank.type.field,bank_type_id:0 msgid "Bank type" -msgstr "" +msgstr "Type de Banque" #. module: base -#, python-format #: code:osv/fields.py:0 +#, python-format msgid "undefined get method !" -msgstr "" +msgstr "Méthode 'get' non définie !" #. module: base #: view:res.company:0 @@ -988,8 +1022,8 @@ msgid "Header/Footer" msgstr "En-tête/Pied de page" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The read method is not implemented on this object !" msgstr "La méthode 'read' n'est pas implémentée dans cet objet !" @@ -1002,6 +1036,8 @@ msgstr "historique des Requêtes" #: view:res.users:0 msgid "Roles are used to defined available actions, provided by workflows." msgstr "" +"Les Rôles sont utilisés pour définir les actions disponibles, fournies par " +"les diagrammes de flux." #. module: base #: selection:ir.ui.menu,icon:0 @@ -1018,7 +1054,7 @@ msgstr "Évènements Partenaire" #. module: base #: field:ir.actions.todo,note:0 msgid "Text" -msgstr "" +msgstr "Texte" #. module: base #: selection:ir.ui.menu,icon:0 @@ -1028,12 +1064,12 @@ msgstr "STOCK_CUT" #. module: base #: rml:ir.module.reference:0 msgid "Introspection report on objects" -msgstr "" +msgstr "Rapport d'introspection sur les objets" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_NO" -msgstr "" +msgstr "STOCK_NO" #. module: base #: selection:res.config.view,view:0 @@ -1048,7 +1084,7 @@ msgstr "Nom de la société" #. module: base #: wizard_field:base.module.import,init,module_file:0 msgid "Module .ZIP file" -msgstr "" +msgstr "Fichier .ZIP du Module" #. module: base #: wizard_button:res.partner.sms_send,init,send:0 @@ -1059,24 +1095,26 @@ msgstr "Envoyer un SMS" #. module: base #: field:ir.actions.report.custom,report_id:0 msgid "Report Ref." -msgstr "" +msgstr "Réf. du Rapport" #. module: base #: model:ir.actions.act_window,name:base.action_partner_addess_tree #: view:res.partner:0 msgid "Partner contacts" -msgstr "Contactes partenaires" +msgstr "Contacts partenaires" #. module: base #: field:workflow.transition,trigger_model:0 msgid "Trigger Object" -msgstr "" +msgstr "Objet Déclencheur" #. module: base #: help:res.country,code:0 -msgid "The ISO country code in two chars.\n" +msgid "" +"The ISO country code in two chars.\n" "You can use this field for quick search." -msgstr "Le code ISO du pays en deux caractères.\n" +msgstr "" +"Le code ISO du pays en deux caractères.\n" "Vous pouvez utiliser ce champ pour effectuer une recherche rapide." #. module: base @@ -1112,7 +1150,7 @@ msgstr "Mise à jour du Système" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_REVERT_TO_SAVED" -msgstr "" +msgstr "STOCK_REVERT_TO_SAVED" #. module: base #: field:res.partner.event,event_ical_id:0 @@ -1127,7 +1165,7 @@ msgstr "Nom de la langue" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_ZOOM_IN" -msgstr "" +msgstr "STOCK_ZOOM_IN" #. module: base #: field:ir.ui.menu,parent_id:0 @@ -1136,8 +1174,8 @@ msgid "Parent Menu" msgstr "Menu Parent" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "Custom fields must have a name that starts with 'x_' !" msgstr "Les champs personalisés doivent avoir un nom qui commence par 'x_' !" @@ -1161,7 +1199,7 @@ msgstr "Type de vue" #. module: base #: model:ir.model,name:base.model_ir_report_custom msgid "ir.report.custom" -msgstr "" +msgstr "ir.report.custom" #. module: base #: field:ir.exports.line,export_id:0 @@ -1186,12 +1224,12 @@ msgstr "" #. module: base #: view:ir.report.custom.fields:0 msgid "Report Fields" -msgstr "" +msgstr "Champs Rapport" #. module: base #: model:ir.model,name:base.model_ir_values msgid "ir.values" -msgstr "" +msgstr "ir.values" #. module: base #: selection:ir.report.custom,type:0 @@ -1206,17 +1244,17 @@ msgstr "" #. module: base #: view:ir.sequence:0 msgid "Seconde: %(sec)s" -msgstr "" +msgstr "Seconde: %(sec)s" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_JUSTIFY_CENTER" -msgstr "" +msgstr "STOCK_JUSTIFY_CENTER" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_ZOOM_FIT" -msgstr "" +msgstr "STOCK_ZOOM_FIT" #. module: base #: view:ir.sequence.type:0 @@ -1226,17 +1264,17 @@ msgstr "Type de Séquence" #. module: base #: field:ir.report.custom.fields,field_child2:0 msgid "field child2" -msgstr "" +msgstr "champ enfant2" #. module: base #: field:ir.report.custom.fields,field_child3:0 msgid "field child3" -msgstr "" +msgstr "champ enfant3" #. module: base #: field:ir.report.custom.fields,field_child0:0 msgid "field child0" -msgstr "" +msgstr "champ enfant0" #. module: base #: model:ir.actions.wizard,name:base.wizard_update @@ -1257,7 +1295,7 @@ msgstr "Licence" #. module: base #: model:ir.model,name:base.model_ir_actions_actions msgid "ir.actions.actions" -msgstr "" +msgstr "ir.actions.actions" #. module: base #: field:ir.module.repository,url:0 @@ -1281,7 +1319,7 @@ msgstr "Requête" #. module: base #: field:ir.actions.act_window,view_mode:0 msgid "Mode of view" -msgstr "" +msgstr "Mode de Vue" #. module: base #: selection:ir.report.custom,print_orientation:0 @@ -1294,21 +1332,25 @@ msgid "Model" msgstr "Modèle" #. module: base -#, python-format #: code:addons/base/module/module.py:0 -msgid "You try to install a module that depends on the module: %s.\nBut this module is not available in your system." +#, python-format +msgid "" +"You try to install a module that depends on the module: %s.\n" +"But this module is not available in your system." msgstr "" +"Vous essayez d'installer un module qui dépend du module: %s\n" +"Mais ce module n'est pas disponible sur votre système." #. module: base #: wizard_field:res.partner.spam_send,init,text:0 #: field:ir.actions.server,message:0 msgid "Message" -msgstr "" +msgstr "Message" #. module: base #: wizard_view:module.lang.install,start:0 msgid "Language file loaded." -msgstr "" +msgstr "Fichier de Langue chargé" #. module: base #: model:ir.actions.act_window,name:base.action_ui_view @@ -1340,7 +1382,7 @@ msgstr "Activité" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_INDEX" -msgstr "" +msgstr "STOCK_INDEX" #. module: base #: field:ir.report.custom,print_orientation:0 @@ -1350,7 +1392,7 @@ msgstr "Orientation de l'impression" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_GOTO_BOTTOM" -msgstr "" +msgstr "STOCK_GOTO_BOTTOM" #. module: base #: field:ir.actions.report.xml,header:0 @@ -1382,15 +1424,15 @@ msgid "Sequences" msgstr "Séquences" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "Unknown position in inherited view %s !" -msgstr "" +msgstr "Position inconnue dans la vue héritée %s !" #. module: base #: view:res.users:0 msgid "Add User" -msgstr "" +msgstr "Ajouter un utilisateur" #. module: base #: field:res.request,trigger_date:0 @@ -1400,7 +1442,7 @@ msgstr "Date de déclenchement" #. module: base #: model:ir.model,name:base.model_ir_actions_configuration_wizard msgid "ir.actions.configuration.wizard" -msgstr "" +msgstr "ir.actions.configuration.wizard" #. module: base #: view:res.partner.bank:0 @@ -1408,15 +1450,15 @@ msgid "Bank account" msgstr "Compte banquaire" #. module: base -#, python-format #: code:addons/base/ir/ir_report_custom.py:0 +#, python-format msgid "Warning: using a relation field which uses an unknown object" msgstr "Avertissement: un champ relation utilise un objet inconnu" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_GO_FORWARD" -msgstr "" +msgstr "STOCK_GO_FORWARD" #. module: base #: field:res.bank,zip:0 @@ -1433,7 +1475,7 @@ msgstr "Auteur" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_UNDELETE" -msgstr "" +msgstr "STOCK_UNDELETE" #. module: base #: selection:wizard.module.lang.export,state:0 @@ -1463,9 +1505,11 @@ msgid "Supplier" msgstr "Fournisseur" #. module: base -#, python-format #: code:report/custom.py:0 -msgid "The sum of the data (2nd field) is null.\nWe can't draw a pie chart !" +#, python-format +msgid "" +"The sum of the data (2nd field) is null.\n" +"We can't draw a pie chart !" msgstr "" #. module: base @@ -1475,7 +1519,9 @@ msgstr "Traduire" #. module: base #: view:ir.actions.server:0 -msgid "Access all the fields related to the current object using expression in double brackets, i.e. [[ object.partner_id.name ]]" +msgid "" +"Access all the fields related to the current object using expression in " +"double brackets, i.e. [[ object.partner_id.name ]]" msgstr "" #. module: base @@ -1491,7 +1537,7 @@ msgstr "Direction" #. module: base #: model:ir.model,name:base.model_wizard_module_update_translations msgid "wizard.module.update_translations" -msgstr "" +msgstr "wizard.module.update_translations" #. module: base #: field:ir.actions.act_window,view_ids:0 @@ -1506,23 +1552,24 @@ msgstr "Vues" #. module: base #: wizard_button:res.partner.spam_send,init,send:0 msgid "Send Email" -msgstr "Envoyer un courrier électronique" +msgstr "Envoyer un courriel" #. module: base #: model:res.partner.category,name:base.res_partner_category_4 msgid "Basic Partner" -msgstr "" +msgstr "Partenaire de Base" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_SELECT_FONT" -msgstr "" +msgstr "STOCK_SELECT_FONT" #. module: base -#, python-format #: code:addons/base/module/module.py:0 +#, python-format msgid "You try to remove a module that is installed or will be installed" -msgstr "Vous essayez d'enlever un module qui est installé ou qui va être installé" +msgstr "" +"Vous essayez d'enlever un module qui est installé ou qui va être installé" #. module: base #: rml:ir.module.reference:0 @@ -1532,7 +1579,7 @@ msgstr "," #. module: base #: field:res.users,menu_id:0 msgid "Menu Action" -msgstr "" +msgstr "Action du Menu" #. module: base #: model:res.partner.title,name:base.res_partner_title_madam @@ -1542,7 +1589,7 @@ msgstr "Madame" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_PASTE" -msgstr "" +msgstr "STOCK_PASTE" #. module: base #: model:ir.actions.act_window,name:base.action_model_model @@ -1554,20 +1601,24 @@ msgstr "Objets" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_GOTO_FIRST" -msgstr "" +msgstr "STOCK_GOTO_FIRST" #. module: base -#, python-format #: code:addons/base/module/module.py:0 -msgid "Can not create the module file:\n %s" +#, python-format +msgid "" +"Can not create the module file:\n" +" %s" msgstr "" +"Impossible de créer le fichier du module:\n" +" %s" #. module: base #: model:ir.actions.act_window,name:base.action_workflow_form #: model:ir.ui.menu,name:base.menu_workflow #: model:ir.ui.menu,name:base.menu_workflow_root msgid "Workflows" -msgstr "" +msgstr "Diagramme de Flux" #. module: base #: field:ir.model.fields,model_id:0 @@ -1606,7 +1657,7 @@ msgstr "URL" #. module: base #: rml:ir.module.reference:0 msgid "Description :" -msgstr "" +msgstr "Description :" #. module: base #: field:ir.report.custom,print_format:0 @@ -1618,7 +1669,7 @@ msgstr "Format d'impression" #: model:ir.model,name:base.model_res_payterm #: view:res.payterm:0 msgid "Payment term" -msgstr "" +msgstr "Terme du Paiement" #. module: base #: field:res.request,ref_doc2:0 @@ -1628,12 +1679,12 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-calendar" -msgstr "" +msgstr "terp-calendar" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-stock" -msgstr "" +msgstr "terp-stock" #. module: base #: selection:ir.cron,interval_type:0 @@ -1643,24 +1694,26 @@ msgstr "Jours de Travail" #. module: base #: model:ir.model,name:base.model_res_roles msgid "res.roles" -msgstr "" +msgstr "res.roles" #. module: base #: help:ir.cron,priority:0 -msgid "0=Very Urgent\n" +msgid "" +"0=Very Urgent\n" "10=Not urgent" -msgstr "0=Très Urgent\n" +msgstr "" +"0=Très Urgent\n" "10=Pas Urgent" #. module: base #: model:ir.model,name:base.model_ir_model_data msgid "ir.model.data" -msgstr "" +msgstr "ir.model.data" #. module: base #: view:ir.ui.view:0 msgid "User Interface - Views" -msgstr "" +msgstr "Interface Utilisateur - Vues" #. module: base #: view:res.groups:0 @@ -1670,13 +1723,15 @@ msgstr "Droits d'accès" #. module: base #: help:ir.actions.report.xml,report_rml:0 -msgid "The .rml path of the file or NULL if the content is in report_rml_content" +msgid "" +"The .rml path of the file or NULL if the content is in report_rml_content" msgstr "" +"Le chemin vers le .rml ou NULL si le contenu est dans le report_rml_content" #. module: base #: view:res.users:0 msgid "Skip" -msgstr "" +msgstr "Ignorer" #. module: base #: model:ir.actions.act_window,name:base.act_menu_create @@ -1687,7 +1742,7 @@ msgstr "Créer le menu" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_MEDIA_RECORD" -msgstr "" +msgstr "STOCK_MEDIA_RECORD" #. module: base #: selection:ir.rule,operator:0 @@ -1700,8 +1755,8 @@ msgid "Partner Address" msgstr "Adresse du Partenaire" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "You can not remove the model '%s' !" msgstr "Vous ne pouvez pas enlever le modèle '%s' !" @@ -1713,7 +1768,7 @@ msgstr "Nom de la catégorie" #. module: base #: field:ir.report.custom.fields,field_child1:0 msgid "field child1" -msgstr "" +msgstr "champ enfant1" #. module: base #: wizard_field:res.partner.spam_send,init,subject:0 @@ -1722,8 +1777,8 @@ msgid "Subject" msgstr "Objet" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The write method is not implemented on this object !" msgstr "La méthode 'write' n'est pas implémentée dans cet objet !" @@ -1741,12 +1796,12 @@ msgstr "De" #. module: base #: selection:res.partner.event,partner_type:0 msgid "Retailer" -msgstr "" +msgstr "Détaillant" #. module: base #: wizard_button:server.action.create,init,step_1:0 msgid "Next" -msgstr "" +msgstr "Suivant" #. module: base #: model:ir.ui.menu,name:base.next_id_11 @@ -1766,7 +1821,7 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-report" -msgstr "" +msgstr "terp-report" #. module: base #: field:res.partner.event,som:0 @@ -1793,7 +1848,7 @@ msgstr "Créé Manuellement" #. module: base #: view:ir.module.module:0 msgid "Defined Reports" -msgstr "" +msgstr "Rapports Définis" #. module: base #: field:workflow.transition,act_from:0 @@ -1803,17 +1858,17 @@ msgstr "Activité Source" #. module: base #: view:ir.attachment:0 msgid "Attachment" -msgstr "" +msgstr "Pièce jointe" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_FILE" -msgstr "" +msgstr "STOCK_FILE" #. module: base #: model:res.partner.category,name:base.res_partner_category_9 msgid "Components Supplier" -msgstr "" +msgstr "Fournisseurs de Composants" #. module: base #: view:ir.rule.group:0 @@ -1845,17 +1900,17 @@ msgstr "Contenu du RML" #. module: base #: model:ir.model,name:base.model_ir_model_grid msgid "Objects Security Grid" -msgstr "" +msgstr "Grille de Sécurité des Objets" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_CONNECT" -msgstr "" +msgstr "STOCK_CONNECT" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_SAVE_AS" -msgstr "" +msgstr "STOCK_SAVE_AS" #. module: base #: selection:ir.model.fields,select_level:0 @@ -1865,7 +1920,7 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_DND" -msgstr "" +msgstr "STOCK_DND" #. module: base #: field:ir.sequence,padding:0 @@ -1875,17 +1930,17 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_OK" -msgstr "" +msgstr "STOCK_OK" #. module: base -#, python-format #: code:report/report_sxw.py:0 +#, python-format msgid "print" -msgstr "" +msgstr "imprimer" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "Password empty !" msgstr "Mot de passe vide !" @@ -1903,18 +1958,18 @@ msgstr "Factice" #. module: base #: selection:ir.report.custom.fields,operation:0 msgid "None" -msgstr "" +msgstr "Aucun" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "You can not write in this document! (%s)" msgstr "Vous ne pouvez pas écrire dans ce document ! (%s)" #. module: base #: model:ir.model,name:base.model_workflow msgid "workflow" -msgstr "" +msgstr "diagramme de flux" #. module: base #: wizard_field:res.partner.sms_send,init,app_id:0 @@ -1934,8 +1989,13 @@ msgstr "Opérande" #. module: base #: help:res.partner,supplier:0 -msgid "Check this box if the partner is a supplier. If it's not checked, purchase people will not see it when encoding a purchase order." +msgid "" +"Check this box if the partner is a supplier. If it's not checked, purchase " +"people will not see it when encoding a purchase order." msgstr "" +"Cochez cette case si le partenaire est un fournisseur. Si elle n'est pas " +"cochée, le personnel à l'achat ne le verra pas lorsqu'il encodera un ordre " +"d'achat." #. module: base #: wizard_view:module.module.update,init:0 @@ -1950,7 +2010,7 @@ msgstr "Dépot de Modules" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_UNINDENT" -msgstr "" +msgstr "STOCK_UNINDENT" #. module: base #: selection:ir.actions.todo,start_on:0 @@ -1995,8 +2055,8 @@ msgid "Low" msgstr "Faible" #. module: base -#, python-format #: code:addons/base/module/module.py:0 +#, python-format msgid "Recursion error in modules dependencies !" msgstr "Erreur de Récursion dans les dépendances des modules !" @@ -2021,13 +2081,13 @@ msgstr "Contrôle des accès" #. module: base #: model:ir.model,name:base.model_wizard_module_lang_export msgid "wizard.module.lang.export" -msgstr "" +msgstr "wizard.module.lang.export" #. module: base #: selection:ir.module.module.dependency,state:0 #: selection:ir.module.module,state:0 msgid "Installed" -msgstr "" +msgstr "Installé" #. module: base #: model:ir.actions.act_window,name:base.action_partner_function_form @@ -2053,7 +2113,7 @@ msgstr "Nom du canal" #. module: base #: view:ir.actions.configuration.wizard:0 msgid "Continue" -msgstr "" +msgstr "Continuer" #. module: base #: selection:res.config.view,view:0 @@ -2074,7 +2134,7 @@ msgstr "Alignement" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_UNDO" -msgstr "" +msgstr "STOCK_UNDO" #. module: base #: field:ir.attachment,create_date:0 @@ -2089,7 +2149,7 @@ msgstr ">=" #. module: base #: model:ir.model,name:base.model_ir_actions_todo msgid "ir.actions.todo" -msgstr "" +msgstr "ir.actions.todo" #. module: base #: model:ir.ui.menu,name:base.menu_administration @@ -2108,8 +2168,12 @@ msgstr "Obtenir le Fichier" #. module: base #: wizard_view:module.module.update,init:0 -msgid "This function will check for new modules in the 'addons' path and on module repositories:" -msgstr "Cette fonction vérifiera si des nouveaux modules sont disponibles dans le chemin 'addons' et sur les dépôts de modules :" +msgid "" +"This function will check for new modules in the 'addons' path and on module " +"repositories:" +msgstr "" +"Cette fonction vérifiera si des nouveaux modules sont disponibles dans le " +"chemin 'addons' et sur les dépôts de modules :" #. module: base #: model:ir.model,name:base.model_res_country @@ -2120,7 +2184,7 @@ msgstr "Cette fonction vérifiera si des nouveaux modules sont disponibles dans #: field:res.partner,country:0 #: view:res.country:0 msgid "Country" -msgstr "" +msgstr "Pays" #. module: base #: field:res.currency,rate_ids:0 @@ -2131,12 +2195,12 @@ msgstr "Taux" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_GO_BACK" -msgstr "" +msgstr "STOCK_GO_BACK" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 #: code:osv/orm.py:0 +#, python-format msgid "AccessError" msgstr "Erreur d'Accès" @@ -2153,7 +2217,7 @@ msgstr "Graphique en Barres" #. module: base #: model:ir.model,name:base.model_ir_model_config msgid "ir.model.config" -msgstr "" +msgstr "ir.model.config" #. module: base #: field:ir.module.module,website:0 @@ -2184,8 +2248,8 @@ msgid "unknown" msgstr "inconnu" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The create method is not implemented on this object !" msgstr "La méthode 'create' n'est pas implémentée dans cet objet !" @@ -2197,7 +2261,7 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_JUSTIFY_FILL" -msgstr "" +msgstr "STOCK_JUSTIFY_FILL" #. module: base #: selection:res.request,state:0 @@ -2220,7 +2284,7 @@ msgstr "" #. module: base #: view:ir.attachment:0 msgid "Data" -msgstr "" +msgstr "Données" #. module: base #: selection:ir.translation,type:0 @@ -2230,7 +2294,7 @@ msgstr "RML" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_DIALOG_ERROR" -msgstr "" +msgstr "STOCK_DIALOG_ERROR" #. module: base #: model:ir.actions.act_window,name:base.action_partner_category @@ -2275,12 +2339,12 @@ msgstr "Sociétés" #: model:ir.actions.act_window,name:base.action_partner_supplier_form #: model:ir.ui.menu,name:base.menu_partner_supplier_form msgid "Suppliers Partners" -msgstr "" +msgstr "Partenaires Fournisseurs" #. module: base #: model:ir.model,name:base.model_ir_sequence_type msgid "ir.sequence.type" -msgstr "" +msgstr "ir.sequence.type" #. module: base #: field:ir.actions.wizard,type:0 @@ -2300,7 +2364,7 @@ msgstr "Société Mère" #. module: base #: view:ir.attachment:0 msgid "Attached To" -msgstr "" +msgstr "Attaché à" #. module: base #: view:res.request:0 @@ -2315,12 +2379,12 @@ msgstr "# de Modules" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_MEDIA_PLAY" -msgstr "" +msgstr "STOCK_MEDIA_PLAY" #. module: base #: field:ir.model.data,date_init:0 msgid "Init Date" -msgstr "" +msgstr "Date d'Initialisation" #. module: base #: field:res.company,rml_header2:0 @@ -2330,17 +2394,17 @@ msgstr "En-tête Interne du RML" #. module: base #: selection:ir.model,state:0 msgid "Base Object" -msgstr "" +msgstr "Objet de Base" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-crm" -msgstr "" +msgstr "terp-crm" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_STRIKETHROUGH" -msgstr "" +msgstr "STOCK_STRIKETHROUGH" #. module: base #: selection:ir.report.custom.fields,fc0_op:0 @@ -2364,12 +2428,12 @@ msgstr "Code" #. module: base #: view:ir.module.module:0 msgid "Features" -msgstr "" +msgstr "Fonctionnalités" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-partner" -msgstr "" +msgstr "terp-partner" #. module: base #: field:ir.attachment,create_uid:0 @@ -2377,8 +2441,8 @@ msgid "Creator" msgstr "Créateur" #. module: base -#, python-format #: code:osv/fields.py:0 +#, python-format msgid "Not implemented get_memory method !" msgstr "Méthode non implémentée: 'get_memory' !" @@ -2390,19 +2454,19 @@ msgid "Python Code" msgstr "Code Python" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "Bad query." msgstr "Requête incorrecte." #. module: base #: field:ir.model.fields,field_description:0 msgid "Field Label" -msgstr "" +msgstr "Libellé du Champ" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "You try to bypass an access rule (Document type: %s)." msgstr "Vous essayez d'outrepasser une règle d'accès (Type de Document: %s)" @@ -2434,7 +2498,7 @@ msgstr "Condition" #: model:ir.actions.act_window,name:base.action_partner_customer_form #: model:ir.ui.menu,name:base.menu_partner_customer_form msgid "Customers Partners" -msgstr "" +msgstr "Partenaires Clients" #. module: base #: wizard_button:res.partner.spam_send,init,end:0 @@ -2454,12 +2518,12 @@ msgstr "Annuler" #. module: base #: model:ir.model,name:base.model_res_users msgid "res.users" -msgstr "" +msgstr "res.users" #. module: base #: model:ir.ui.menu,name:base.menu_management msgid "Modules Management" -msgstr "" +msgstr "Gestion des Modules" #. module: base #: selection:ir.ui.menu,icon:0 @@ -2473,7 +2537,7 @@ msgstr "terp-administration" #: field:workflow.instance,res_id:0 #: field:workflow.triggers,res_id:0 msgid "Resource ID" -msgstr "" +msgstr "ID de la Ressource" #. module: base #: field:ir.model,info:0 @@ -2483,7 +2547,7 @@ msgstr "Information" #. module: base #: model:ir.model,name:base.model_ir_exports msgid "ir.exports" -msgstr "" +msgstr "ir.exports" #. module: base #: field:workflow.activity,flow_start:0 @@ -2493,7 +2557,7 @@ msgstr "Flux de départ" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_MISSING_IMAGE" -msgstr "" +msgstr "STOCK_MISSING_IMAGE" #. module: base #: field:ir.report.custom.fields,bgcolor:0 @@ -2503,28 +2567,28 @@ msgstr "Couleur d'arrière-plan" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_REMOVE" -msgstr "" +msgstr "STOCK_REMOVE" #. module: base #: field:ir.actions.report.xml,report_rml:0 msgid "RML path" -msgstr "" +msgstr "Chemin vers le RML" #. module: base #: field:ir.actions.configuration.wizard,item_id:0 msgid "Next Configuration Wizard" -msgstr "" +msgstr "Prochain Assistant de Configuration" #. module: base #: field:workflow.workitem,inst_id:0 msgid "Instance" -msgstr "" +msgstr "Instance" #. module: base #: field:ir.values,meta:0 #: field:ir.values,meta_unpickle:0 msgid "Meta Datas" -msgstr "" +msgstr "Méta-Données" #. module: base #: model:ir.ui.menu,name:base.menu_custom @@ -2537,8 +2601,8 @@ msgid "raw" msgstr "brut" #. module: base -#, python-format #: code:addons/base/res/partner/partner.py:0 +#, python-format msgid "Partners: " msgstr "Partenaires : " @@ -2559,8 +2623,8 @@ msgid "Role Name" msgstr "Nom du rôle" #. module: base -#, python-format #: code:addons/base/res/res_user.py:0 +#, python-format msgid "Can not remove root user!" msgstr "Impossible d'effacer l'utilisateur 'root' !" @@ -2608,8 +2672,11 @@ msgstr "Rapport XML" #. module: base #: help:res.partner,user_id:0 -msgid "The internal user that is in charge of communicating with this partner if any." -msgstr "L'utilisateur interne en charge de communiqué avec le partenaire éventuel." +msgid "" +"The internal user that is in charge of communicating with this partner if " +"any." +msgstr "" +"L'utilisateur interne en charge de communiqué avec le partenaire éventuel." #. module: base #: selection:ir.translation,type:0 @@ -2622,8 +2689,8 @@ msgid "Cancel Upgrade" msgstr "Annuler la Mise à Jour" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The search method is not implemented on this object !" msgstr "La méthode 'search' n'est pas implémentée dans cet objet !" @@ -2653,8 +2720,8 @@ msgid "res.lang" msgstr "" #. module: base -#, python-format #: code:addons/base/ir/ir_report_custom.py:0 +#, python-format msgid "Pie charts need exactly two fields" msgstr "Les graphiques en camembert ont besoin d'exactement deux champs" @@ -2668,12 +2735,12 @@ msgstr "Banque" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_HARDDISK" -msgstr "" +msgstr "STOCK_HARDDISK" #. module: base #: selection:ir.actions.server,otype:0 msgid "Create in Same Model" -msgstr "" +msgstr "Créer dans le même Modèle" #. module: base #: field:ir.actions.todo,name:0 @@ -2706,17 +2773,17 @@ msgstr "Nom" #: model:ir.actions.wizard,name:base.wizard_lang_install #: model:ir.ui.menu,name:base.menu_wizard_lang_install msgid "Load an Official Translation" -msgstr "" +msgstr "Charger une Traduction Officielle" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_APPLY" -msgstr "" +msgstr "STOCK_APPLY" #. module: base #: field:ir.module.module,reports_by_module:0 msgid "Reports" -msgstr "" +msgstr "Rapports" #. module: base #: field:workflow,on_create:0 @@ -2726,21 +2793,21 @@ msgstr "Lors de la création" #. module: base #: wizard_view:base.module.import,init:0 msgid "Please give your module .ZIP file to import." -msgstr "" +msgstr "Veuillez donner votre fichier .ZIP à importer" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_CLOSE" -msgstr "" +msgstr "STOCK_CLOSE" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_MEDIA_PAUSE" -msgstr "" +msgstr "STOCK_MEDIA_PAUSE" #. module: base -#, python-format #: code:addons/base/module/wizard/wizard_module_import.py:0 +#, python-format msgid "Error !" msgstr "Erreur !" @@ -2757,11 +2824,14 @@ msgstr "GPL-2" #. module: base #: help:ir.module.repository,filter:0 -msgid "Regexp to search module on the repository webpage:\n" +msgid "" +"Regexp to search module on the repository webpage:\n" "- The first parenthesis must match the name of the module.\n" "- The second parenthesis must match all the version number.\n" "- The last parenthesis must match the extension of the module." -msgstr "Expression Rationelle utilisée pour rechercher le module sur la page Web du dépôt:\n" +msgstr "" +"Expression Rationelle utilisée pour rechercher le module sur la page Web du " +"dépôt:\n" "- la première parenthèse doit 'matcher' le nom du module;\n" "- la seconde parenthèse doit 'matcher' le numéro de version;\n" "- la dernière parenthèse doit 'matcher' l'extension du module;" @@ -2769,12 +2839,12 @@ msgstr "Expression Rationelle utilisée pour rechercher le module sur la page We #. module: base #: help:wizard.module.lang.export,lang:0 msgid "To export a new language, do not select a language." -msgstr "" +msgstr "Pour exporter une langue, ne sélectionnez aucune langue." #. module: base #: model:ir.ui.menu,name:base.menu_translation_app msgid "Application Terms" -msgstr "" +msgstr "Termes de l'Application" #. module: base #: selection:ir.report.custom.fields,operation:0 @@ -2790,7 +2860,7 @@ msgstr "Fuseau horaire" #: model:ir.actions.act_window,name:base.action_model_grid_security #: model:ir.ui.menu,name:base.menu_ir_access_grid msgid "Access Controls Grid" -msgstr "" +msgstr "Grille de Contrôles d'Accès" #. module: base #: model:ir.model,name:base.model_ir_module_module @@ -2809,17 +2879,17 @@ msgstr "Élevé" #: model:ir.actions.act_window,name:base.action_workflow_instance_form #: model:ir.ui.menu,name:base.menu_workflow_instance msgid "Instances" -msgstr "" +msgstr "Instances" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_COPY" -msgstr "" +msgstr "STOCK_COPY" #. module: base #: selection:ir.actions.todo,start_on:0 msgid "Auto" -msgstr "" +msgstr "Auto" #. module: base #: model:res.partner.category,name:base.res_partner_category_3 @@ -2829,7 +2899,7 @@ msgstr "" #. module: base #: model:ir.model,name:base.model_res_request_link msgid "res.request.link" -msgstr "" +msgstr "res.request.link" #. module: base #: wizard_button:module.module.update,init,update:0 @@ -2839,23 +2909,23 @@ msgstr "Vérifier de nouveaux modules" #. module: base #: model:ir.model,name:base.model_ir_actions_act_window_view msgid "ir.actions.act_window.view" -msgstr "" +msgstr "ir.actions.act_window.view" #. module: base -#, python-format #: code:tools/translate.py:0 +#, python-format msgid "Bad file format" msgstr "Format de fichier incorrect" #. module: base #: help:res.bank,bic:0 msgid "Bank Identifier Code" -msgstr "" +msgstr "Code d'Indentification Bancaire" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_CDROM" -msgstr "" +msgstr "STOCK_CDROM" #. module: base #: field:workflow.activity,action:0 @@ -2865,7 +2935,7 @@ msgstr "Action Python" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_DIRECTORY" -msgstr "" +msgstr "STOCK_DIRECTORY" #. module: base #: field:res.partner.event,planned_revenue:0 @@ -2879,8 +2949,12 @@ msgstr "" #. module: base #: wizard_view:module.lang.import,init:0 -msgid "You have to import a .CSV file wich is encoded in UTF-8. Please check that the first line of your file is one of the following:" +msgid "" +"You have to import a .CSV file wich is encoded in UTF-8. Please check that " +"the first line of your file is one of the following:" msgstr "" +"Vous devez importer une fichier .CSV encodé en UTF-8. Veuillez vérifier que " +"la première ligne de votre fichier est l'une des suivantes:" #. module: base #: field:ir.report.custom.fields,groupby:0 @@ -2894,20 +2968,20 @@ msgid "Readonly" msgstr "Lecture seule" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "You can not remove the field '%s' !" msgstr "Vous ne pouvez pas effacer le champ '%s' !" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_ITALIC" -msgstr "" +msgstr "STOCK_ITALIC" #. module: base #: help:ir.actions.report.xml,header:0 msgid "Add or not the coporate RML header" -msgstr "" +msgstr "Ajouter ou non l'entête RML de société" #. module: base #: field:res.currency,accuracy:0 @@ -2918,7 +2992,7 @@ msgstr "Précision mathématique" #: model:ir.model,name:base.model_ir_actions_wizard #: selection:ir.ui.menu,action:0 msgid "ir.actions.wizard" -msgstr "" +msgstr "ir.actions.wizard" #. module: base #: field:res.partner.event,document:0 @@ -2933,7 +3007,7 @@ msgstr "Type d'Évènement" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_REFRESH" -msgstr "" +msgstr "STOCK_REFRESH" #. module: base #: model:ir.actions.act_window,name:base.ir_sequence_type @@ -2944,13 +3018,19 @@ msgstr "Types de Séquence" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_STOP" -msgstr "" +msgstr "STOCK_STOP" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 -msgid "\"%s\" contains too many dots. XML ids should not contain dots ! These are used to refer to other modules data, as in module.reference_id" -msgstr "\"%s\" contiens trop de caractère 'point'. Les identifiants XML ne doivent pas contenir de points ! Ceux ci sont utilisés pour effectuer des références vers d'autres données de module, comme par exemple dans \"module.reference_id\"" +#, python-format +msgid "" +"\"%s\" contains too many dots. XML ids should not contain dots ! These are " +"used to refer to other modules data, as in module.reference_id" +msgstr "" +"\"%s\" contiens trop de caractère 'point'. Les identifiants XML ne doivent " +"pas contenir de points ! Ceux ci sont utilisés pour effectuer des références " +"vers d'autres données de module, comme par exemple dans " +"\"module.reference_id\"" #. module: base #: field:res.partner.bank,acc_number:0 @@ -2960,7 +3040,7 @@ msgstr "Numéro de compte" #. module: base #: model:ir.model,name:base.model_wizard_ir_model_menu_create_line msgid "wizard.ir.model.menu.create.line" -msgstr "" +msgstr "wizard.ir.model.menu.create.line" #. module: base #: field:ir.attachment,res_id:0 @@ -2989,8 +3069,8 @@ msgid "Day: %(day)s" msgstr "Jour: %(day)s" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "You can not read this document! (%s)" msgstr "Vous ne pouvez pas lire ce document ! (%s)" @@ -3084,12 +3164,12 @@ msgstr "Largeur fixe" #. module: base #: view:ir.actions.server:0 msgid "Other Actions Configuration" -msgstr "" +msgstr "Configuration des Autres Actions" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_EXECUTE" -msgstr "" +msgstr "STOCK_EXECUTE" #. module: base #: selection:ir.cron,interval_type:0 @@ -3114,10 +3194,15 @@ msgid "Help" msgstr "Aide" #. module: base -#, python-format #: code:addons/base/module/module.py:0 -msgid "Some installed modules depends on the module you plan to desinstall :\n %s" +#, python-format +msgid "" +"Some installed modules depends on the module you plan to desinstall :\n" +" %s" msgstr "" +"Certains modules installés dépendent du module que vous voulez désinstaller " +":\n" +" %s" #. module: base #: model:ir.actions.act_window,name:base.res_request_link-act @@ -3128,12 +3213,12 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_YES" -msgstr "" +msgstr "STOCK_YES" #. module: base #: selection:ir.actions.server,otype:0 msgid "Create in Other Model" -msgstr "" +msgstr "Créer dans un Autre Modèle" #. module: base #: model:ir.actions.act_window,name:base.res_partner_canal-act @@ -3172,7 +3257,7 @@ msgstr "Plannifier pour Installation" #. module: base #: view:ir.sequence:0 msgid "Year without century: %(y)s" -msgstr "" +msgstr "Année sans le siècle : %(y)s" #. module: base #: selection:ir.model.fields,select_level:0 @@ -3195,7 +3280,7 @@ msgstr "Répertoire :" #. module: base #: field:ir.attachment,res_model:0 msgid "Attached Model" -msgstr "" +msgstr "Modèle Attaché" #. module: base #: field:ir.actions.server,trigger_name:0 @@ -3205,11 +3290,11 @@ msgstr "Nom du déclencheur" #. module: base #: wizard_button:server.action.create,step_1,create:0 msgid "Create" -msgstr "" +msgstr "Créer" #. module: base -#, python-format #: code:addons/base/res/res_user.py:0 +#, python-format msgid "The name of the group can not start with \"-\"" msgstr "Le nom du groupe ne peut pas commencer par \"-\"" @@ -3228,7 +3313,7 @@ msgstr "Raccourci" #. module: base #: model:ir.model,name:base.model_ir_model_access msgid "ir.model.access" -msgstr "" +msgstr "ir.model.access" #. module: base #: field:ir.cron,priority:0 @@ -3247,12 +3332,13 @@ msgstr "Source" #: model:ir.actions.act_window,name:base.action_partner_title_contact #: model:ir.ui.menu,name:base.menu_partner_title_contact msgid "Contacts Titles" -msgstr "" +msgstr "Titres des Contacts" #. module: base #: help:res.partner.address,partner_id:0 msgid "Keep empty for a private address, not related to partner." msgstr "" +"Laisser vide pour une adresse privée, sans relation avec le partenaire." #. module: base #: selection:ir.translation,type:0 @@ -3282,7 +3368,7 @@ msgstr "En-tête/Pied-de-page Interne" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_JUSTIFY_LEFT" -msgstr "" +msgstr "STOCK_JUSTIFY_LEFT" #. module: base #: view:res.partner.bank:0 @@ -3300,10 +3386,14 @@ msgid "Resource Name" msgstr "Nom de la Ressource" #. module: base -#, python-format #: code:addons/base/module/wizard/wizard_export_lang.py:0 -msgid "Save this document to a .tgz file. This archive containt UTF-8 %s files and may be uploaded to launchpad." +#, python-format +msgid "" +"Save this document to a .tgz file. This archive containt UTF-8 %s files and " +"may be uploaded to launchpad." msgstr "" +"Sauvegarder ce document dans un fichier .tgz. Cette archive contient des " +"fichiers UTF-8 %s et peut être chargée vers Launchpad." #. module: base #: field:res.partner.address,type:0 @@ -3353,8 +3443,8 @@ msgid "References" msgstr "Références" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "This record was modified in the meanwhile" msgstr "Cet enregistrement a été modifié entre temps" @@ -3366,13 +3456,13 @@ msgstr "Notez que cette opération peut prendre quelques minutes" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_COLOR_PICKER" -msgstr "" +msgstr "STOCK_COLOR_PICKER" #. module: base #: field:res.request,act_to:0 #: field:res.request.history,act_to:0 msgid "To" -msgstr "" +msgstr "Vers" #. module: base #: field:workflow.activity,kind:0 @@ -3380,21 +3470,21 @@ msgid "Kind" msgstr "Genre" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "This method does not exist anymore" msgstr "Cette méthode n'existe plus" #. module: base -#, python-format #: code:addons/base/ir/ir_report_custom.py:0 +#, python-format msgid "Tree can only be used in tabular reports" msgstr "Les Arbres peuvent uniquement utilisés dans les rapports tabulaires" #. module: base #: selection:ir.actions.todo,start_on:0 msgid "Manual" -msgstr "" +msgstr "Manuel" #. module: base #: view:res.partner.bank:0 @@ -3412,17 +3502,19 @@ msgstr "Arbre" #. module: base #: model:res.partner.category,name:base.res_partner_category_12 msgid "Segmentation" -msgstr "" +msgstr "Segmentation" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_CLEAR" -msgstr "" +msgstr "STOCK_CLEAR" #. module: base #: help:res.users,password:0 -msgid "Keep empty if you don't want the user to be able to connect on the system." +msgid "" +"Keep empty if you don't want the user to be able to connect on the system." msgstr "" +"Laisser vide si vous ne voulez pas que l'utilisateur se connecte au système." #. module: base #: field:ir.model.access,perm_read:0 @@ -3447,17 +3539,17 @@ msgstr "Champ Personalisé" #. module: base #: field:ir.model.fields,relation_field:0 msgid "Relation Field" -msgstr "" +msgstr "Champ Relation" #. module: base -#, python-format #: code:addons/base/ir/ir_report_custom.py:0 +#, python-format msgid "Bar charts need at least two fields" msgstr "Les graphiques en barres ont besoin d'au moins deux champs" #. module: base -#, python-format #: code:osv/fields.py:0 +#, python-format msgid "Not implemented search_memory method !" msgstr "Utilisation d'une méthode non implémentée: 'search_memory' !" @@ -3481,17 +3573,17 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_GO_UP" -msgstr "" +msgstr "STOCK_GO_UP" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_SORT_DESCENDING" -msgstr "" +msgstr "STOCK_SORT_DESCENDING" #. module: base #: model:ir.model,name:base.model_res_request msgid "res.request" -msgstr "" +msgstr "res.request" #. module: base #: field:res.groups,rule_groups:0 @@ -3504,7 +3596,7 @@ msgstr "Règles" #: model:ir.actions.act_window,name:base.action_partner_title #: model:ir.ui.menu,name:base.menu_partner_title msgid "Titles" -msgstr "" +msgstr "Titres" #. module: base #: wizard_view:module.upgrade,start:0 @@ -3526,7 +3618,7 @@ msgstr "pdf" #. module: base #: field:ir.actions.todo,start_date:0 msgid "Start Date" -msgstr "" +msgstr "Date de début" #. module: base #: model:ir.actions.act_window,name:base.action_partner_address_form @@ -3543,33 +3635,39 @@ msgstr "Chemin XML" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_FIND" -msgstr "" +msgstr "STOCK_FIND" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_PROPERTIES" -msgstr "" +msgstr "STOCK_PROPERTIES" #. module: base #: model:res.partner.category,name:base.res_partner_category_11 msgid "Textile Suppliers" -msgstr "" +msgstr "Fournisseurs de Textile" #. module: base #: view:wizard.module.lang.export:0 -msgid "The official translations pack of all OpenERP/OpenObjects module are managed through launchpad. We use their online interface to synchronize all translations efforts." +msgid "" +"The official translations pack of all OpenERP/OpenObjects module are managed " +"through launchpad. We use their online interface to synchronize all " +"translations efforts." msgstr "" +"Les traductions officielles de tous les modules OpenERP/OpenObjects sont " +"gérées via Launchpad. Nous utilisons leur interface en ligne pour " +"synchronizer tous les efforts de traduction." #. module: base #: model:ir.actions.act_window,name:base.grant_menu_access #: model:ir.ui.menu,name:base.menu_grant_menu_access msgid "Grant access to menu" -msgstr "" +msgstr "Permettre l'accès au menu" #. module: base #: field:ir.attachment,datas:0 msgid "File Content" -msgstr "" +msgstr "Contenu du Fichier" #. module: base #: view:ir.module.module:0 @@ -3583,10 +3681,10 @@ msgid "New Window" msgstr "Nouvelle fenêtre" #. module: base -#, python-format #: code:addons/base/ir/ir_report_custom.py:0 +#, python-format msgid "Second field should be figures" -msgstr "" +msgstr "Le second champ doit être les figures" #. module: base #: selection:res.partner.event,partner_type:0 @@ -3599,10 +3697,13 @@ msgid "Parent Action" msgstr "Action Parente" #. module: base -#, python-format #: code:addons/base/res/partner/partner.py:0 -msgid "Couldn't generate the next id because some partners have an alphabetic id !" -msgstr "Impossible de générer le prochain identifiant car certains partenaires ont un identifiant alphabétique !" +#, python-format +msgid "" +"Couldn't generate the next id because some partners have an alphabetic id !" +msgstr "" +"Impossible de générer le prochain identifiant car certains partenaires ont " +"un identifiant alphabétique !" #. module: base #: selection:ir.report.custom,state:0 @@ -3622,7 +3723,7 @@ msgstr "" #. module: base #: view:ir.actions.configuration.wizard:0 msgid "Skip Step" -msgstr "" +msgstr "Passer l'Étape" #. module: base #: model:ir.actions.act_window,name:base.act_res_partner_event @@ -3646,7 +3747,7 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_MEDIA_STOP" -msgstr "" +msgstr "STOCK_MEDIA_STOP" #. module: base #: model:ir.actions.act_window,name:base.res_partner_event_type-act @@ -3655,27 +3756,28 @@ msgid "Active Partner Events" msgstr "Évènements Actifs des Partenaires" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "Wrong ID for the browse record, got %r, expected an integer." msgstr "" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "Error occured while validating the field(s) %s: %s" msgstr "" +"Une erreur est survenue lors de la validation du (des) champ(s) %s: %s" #. module: base #: view:res.users:0 msgid "Define New Users" -msgstr "" +msgstr "Définir de Nouveaux Utilisateurs" #. module: base #: model:ir.actions.act_window,name:base.action_rule #: model:ir.ui.menu,name:base.menu_action_rule msgid "Record Rules" -msgstr "" +msgstr "Règles d'Enregistrement" #. module: base #: field:res.config.view,view:0 @@ -3696,12 +3798,16 @@ msgstr "Numéro de téléphone" #. module: base #: view:ir.sequence:0 msgid "Day of the year: %(doy)s" -msgstr "" +msgstr "Jour de l'année: %(doy)s" #. module: base #: help:ir.actions.wizard,multi:0 -msgid "If set to true, the wizard will not be displayed on the right toolbar of a form views." +msgid "" +"If set to true, the wizard will not be displayed on the right toolbar of a " +"form views." msgstr "" +"Si sélectionné, l'assistant ne sera pas affiché dans la barre d'outils de " +"droite dans les vues formulaire." #. module: base #: field:workflow.transition,role_id:0 @@ -3727,7 +3833,7 @@ msgstr "Groupes" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_SPELL_CHECK" -msgstr "" +msgstr "STOCK_SPELL_CHECK" #. module: base #: field:ir.actions.todo,active:0 @@ -3750,17 +3856,17 @@ msgstr "Actif" #. module: base #: view:ir.module.module:0 msgid "Created Menus" -msgstr "" +msgstr "Menus Créés" #. module: base #: field:ir.ui.view.custom,ref_id:0 msgid "Orignal View" -msgstr "" +msgstr "Vue d'Origine" #. module: base #: selection:res.partner.event,type:0 msgid "Sale Opportunity" -msgstr "" +msgstr "Opportunité de Vente" #. module: base #: selection:ir.report.custom.fields,fc0_op:0 @@ -3778,7 +3884,7 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_DIALOG_AUTHENTICATION" -msgstr "" +msgstr "STOCK_DIALOG_AUTHENTICATION" #. module: base #: view:ir.actions.act_window:0 @@ -3788,7 +3894,7 @@ msgstr "Ouvrir une fenêtre" #. module: base #: selection:ir.cron,interval_type:0 msgid "Months" -msgstr "" +msgstr "Mois" #. module: base #: field:workflow.activity,signal_send:0 @@ -3798,7 +3904,7 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_ZOOM_OUT" -msgstr "" +msgstr "STOCK_ZOOM_OUT" #. module: base #: selection:ir.module.module.dependency,state:0 @@ -3830,17 +3936,17 @@ msgstr "Action" #. module: base #: field:ir.rule,domain_force:0 msgid "Force Domain" -msgstr "" +msgstr "Forcer le domaine" #. module: base #: view:ir.actions.server:0 msgid "Email Configuration" -msgstr "" +msgstr "Configuration de l'envoi de courriels" #. module: base #: model:ir.model,name:base.model_ir_cron msgid "ir.cron" -msgstr "" +msgstr "ir.cron" #. module: base #: selection:workflow.activity,join_mode:0 @@ -3851,7 +3957,7 @@ msgstr "Et" #. module: base #: field:ir.model.fields,relation:0 msgid "Object Relation" -msgstr "" +msgstr "Relation de l'Objet" #. module: base #: model:ir.actions.act_window,name:base.action_attachment @@ -3869,12 +3975,12 @@ msgstr "Champ" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_SELECT_COLOR" -msgstr "" +msgstr "STOCK_SELECT_COLOR" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_PRINT" -msgstr "" +msgstr "STOCK_PRINT" #. module: base #: field:ir.actions.wizard,multi:0 @@ -3890,33 +3996,33 @@ msgstr "Réf. Partenaire" #. module: base #: model:ir.model,name:base.model_ir_report_custom_fields msgid "ir.report.custom.fields" -msgstr "" +msgstr "ir.report.custom.fields" #. module: base #: view:ir.module.module:0 msgid "Cancel Uninstall" -msgstr "" +msgstr "Annuler la désinstallation" #. module: base #: model:ir.model,name:base.model_ir_actions_act_window #: selection:ir.ui.menu,action:0 msgid "ir.actions.act_window" -msgstr "" +msgstr "ir.actions.act_window" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-mrp" -msgstr "" +msgstr "terp-mrp" #. module: base #: selection:ir.actions.todo,state:0 msgid "Done" -msgstr "" +msgstr "Terminé" #. module: base #: field:ir.actions.server,trigger_obj_id:0 msgid "Trigger On" -msgstr "" +msgstr "Déclencher sur" #. module: base #: selection:res.partner.address,type:0 @@ -3927,8 +4033,12 @@ msgstr "Facture" #: help:ir.actions.report.custom,multi:0 #: help:ir.actions.report.xml,multi:0 #: help:ir.actions.act_window.view,multi:0 -msgid "If set to true, the action will not be displayed on the right toolbar of a form views." +msgid "" +"If set to true, the action will not be displayed on the right toolbar of a " +"form views." msgstr "" +"Si sélectionné, l'action ne sera pas affichée dans la barre d'outils de " +"droite dans les vues formulaire." #. module: base #: model:ir.ui.menu,name:base.next_id_4 @@ -3939,22 +4049,22 @@ msgstr "Bas niveau" #: wizard_view:module.upgrade,start:0 #: wizard_view:module.upgrade,end:0 msgid "You may have to reinstall some language pack." -msgstr "" +msgstr "Vous devrez réinstaller quelques packs de langue." #. module: base #: model:ir.model,name:base.model_res_currency_rate msgid "Currency Rate" -msgstr "" +msgstr "Taux de Conversion de la Devise" #. module: base #: field:ir.model.access,perm_write:0 msgid "Write Access" -msgstr "" +msgstr "Accès en écriture" #. module: base #: view:wizard.module.lang.export:0 msgid "Export done" -msgstr "" +msgstr "Export effectué" #. module: base #: field:ir.model.fields,size:0 @@ -3976,8 +4086,11 @@ msgstr "" #. module: base #: constraint:ir.model:0 -msgid "The Object name must start with x_ and not contain any special character !" -msgstr "Le nom de l'objet doit commencer avec x_ et ne pas contenir de charactères spéciaux !" +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" +"Le nom de l'objet doit commencer avec x_ et ne pas contenir de charactères " +"spéciaux !" #. module: base #: rml:ir.module.reference:0 @@ -3987,7 +4100,7 @@ msgstr "Module :" #. module: base #: field:ir.actions.configuration.wizard,name:0 msgid "Next Wizard" -msgstr "" +msgstr "Assistant Suivant" #. module: base #: selection:ir.rule,operator:0 @@ -4010,7 +4123,7 @@ msgstr "<=" #. module: base #: view:wizard.module.lang.export:0 msgid "Export Data" -msgstr "" +msgstr "Exporter les données" #. module: base #: field:workflow.triggers,instance_id:0 @@ -4019,8 +4132,13 @@ msgstr "" #. module: base #: wizard_view:module.lang.install,start:0 -msgid "The selected language has been successfully installed. You must change the preferences of the user and open a new menu to view changes." +msgid "" +"The selected language has been successfully installed. You must change the " +"preferences of the user and open a new menu to view changes." msgstr "" +"La langue sélectionnée a été installée avec succès. Vous devez changer les " +"préférences de l'utlisateur et ouvrir un nouveau menu pour voir les " +"changements." #. module: base #: field:ir.module.module,menus_by_module:0 @@ -4050,22 +4168,22 @@ msgstr "" #. module: base #: model:res.partner.title,name:base.res_partner_title_sir msgid "Sir" -msgstr "" +msgstr "Monsieur" #. module: base #: view:wizard.module.lang.export:0 msgid "https://translations.launchpad.net/openobject" -msgstr "" +msgstr "https://translations.launchpad.net/openobject" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_EDIT" -msgstr "" +msgstr "STOCK_EDIT" #. module: base #: selection:ir.module.module,license:0 msgid "GPL-3 or later version" -msgstr "" +msgstr "GPL-3 ou version supérieure" #. module: base #: field:ir.actions.actions,usage:0 @@ -4079,11 +4197,11 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_HOME" -msgstr "" +msgstr "STOCK_HOME" #. module: base -#, python-format #: code:addons/base/ir/ir_report_custom.py:0 +#, python-format msgid "Enter at least one field !" msgstr "Entrez au moins un champ !" @@ -4091,28 +4209,28 @@ msgstr "Entrez au moins un champ !" #: field:ir.actions.server,child_ids:0 #: selection:ir.actions.server,state:0 msgid "Others Actions" -msgstr "" +msgstr "Autres Actions" #. module: base #: model:ir.actions.wizard,name:base.wizard_server_action_create #: view:ir.actions.server:0 msgid "Create Action" -msgstr "" +msgstr "Créer une Action" #. module: base #: model:ir.model,name:base.model_workflow_workitem msgid "workflow.workitem" -msgstr "" +msgstr "workflow.workitem" #. module: base #: field:ir.ui.view_sc,name:0 msgid "Shortcut Name" -msgstr "" +msgstr "Nom du Raccourci" #. module: base #: selection:ir.module.module,state:0 msgid "Not Installable" -msgstr "" +msgstr "Non Installable" #. module: base #: field:res.partner.event,probability:0 @@ -4122,7 +4240,7 @@ msgstr "Probabilité (0.50)" #. module: base #: field:res.partner.address,mobile:0 msgid "Mobile" -msgstr "" +msgstr "GSM" #. module: base #: selection:ir.actions.report.xml,report_type:0 @@ -4132,7 +4250,7 @@ msgstr "html" #. module: base #: field:ir.report.custom,repeat_header:0 msgid "Repeat Header" -msgstr "" +msgstr "Répéter l'Entête" #. module: base #: field:res.users,address_id:0 @@ -4142,13 +4260,13 @@ msgstr "Adresse" #. module: base #: wizard_view:module.upgrade,next:0 msgid "Your system will be upgraded." -msgstr "" +msgstr "Votre système va être mis à jour." #. module: base #: model:ir.actions.act_window,name:base.action_config_user_form #: view:res.users:0 msgid "Configure User" -msgstr "" +msgstr "Configurer l'Utilisateur" #. module: base #: rml:ir.module.reference:0 @@ -4158,12 +4276,12 @@ msgstr "Nom:" #. module: base #: help:res.country,name:0 msgid "The full name of the country." -msgstr "" +msgstr "Le nom complet du pays." #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_JUMP_TO" -msgstr "" +msgstr "STOCK_JUMP_TO" #. module: base #: field:ir.ui.menu,child_id:0 @@ -4173,7 +4291,7 @@ msgstr "" #. module: base #: field:ir.actions.todo,end_date:0 msgid "End Date" -msgstr "" +msgstr "Date de fin" #. module: base #: field:ir.exports,resource:0 @@ -4189,17 +4307,17 @@ msgstr "Mettre à jour la Date" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-tools" -msgstr "" +msgstr "terp-tools" #. module: base #: view:ir.actions.server:0 msgid "Python code" -msgstr "" +msgstr "Code Python" #. module: base #: view:ir.actions.report.xml:0 msgid "Report xml" -msgstr "" +msgstr "Rapport XML" #. module: base #: model:ir.actions.act_window,name:base.action_module_open_categ @@ -4215,7 +4333,7 @@ msgstr "Modules" #: field:workflow.activity,subflow_id:0 #: field:workflow.workitem,subflow_id:0 msgid "Subflow" -msgstr "" +msgstr "Sous-flux" #. module: base #: help:res.partner,vat:0 @@ -4232,12 +4350,12 @@ msgstr "Valeurs" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_DIALOG_INFO" -msgstr "" +msgstr "STOCK_DIALOG_INFO" #. module: base #: field:workflow.transition,signal:0 msgid "Signal (button Name)" -msgstr "" +msgstr "Signal (Nom du bouton)" #. module: base #: field:res.company,logo:0 @@ -4255,34 +4373,34 @@ msgstr "Banques" #. module: base #: field:ir.cron,numbercall:0 msgid "Number of calls" -msgstr "" +msgstr "Nombre d'appels" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-sale" -msgstr "" +msgstr "terp-sale" #. module: base #: view:ir.actions.server:0 msgid "Field Mappings" -msgstr "" +msgstr "Associations du Champ" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The copy method is not implemented on this object !" msgstr "La méthode 'copy' n'est pas implémentée dans cet objet !" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_ADD" -msgstr "" +msgstr "STOCK_ADD" #. module: base #: view:ir.model.fields:0 #: view:ir.model:0 msgid "Security on Groups" -msgstr "" +msgstr "Sécurité sur les Groupes" #. module: base #: selection:ir.report.custom.fields,alignment:0 @@ -4290,32 +4408,32 @@ msgid "center" msgstr "centre" #. module: base -#, python-format #: code:addons/base/module/wizard/wizard_module_import.py:0 +#, python-format msgid "Can not create the module file: %s !" -msgstr "" +msgstr "Impossible de créer le fichier du module: %s !" #. module: base #: field:ir.server.object.lines,server_id:0 msgid "Object Mapping" -msgstr "" +msgstr "Association de l'Objet" #. module: base #: field:ir.module.module,published_version:0 msgid "Published Version" -msgstr "" +msgstr "Version Publiée" #. module: base #: help:res.currency,rate:0 #: help:res.currency.rate,rate:0 msgid "The rate of the currency to the currency of rate 1" -msgstr "" +msgstr "Le taux de conversion de la devise vers la devise de taux 1" #. module: base #: model:ir.actions.act_window,name:base.action_country_state #: model:ir.ui.menu,name:base.menu_country_state_partner msgid "States" -msgstr "" +msgstr "États" #. module: base #: field:res.currency.rate,rate:0 @@ -4330,12 +4448,12 @@ msgstr "De droite à gauche" #. module: base #: view:ir.actions.server:0 msgid "Create / Write" -msgstr "" +msgstr "Créer / Écrire" #. module: base #: model:ir.model,name:base.model_ir_exports_line msgid "ir.exports.line" -msgstr "" +msgstr "ir.exports.line" #. module: base #: field:res.partner,credit_limit:0 @@ -4355,13 +4473,13 @@ msgstr "Objet :" #. module: base #: model:ir.model,name:base.model_res_country_state msgid "Country state" -msgstr "" +msgstr "état" #. module: base #: model:ir.actions.act_window,name:base.ir_property_form_all #: model:ir.ui.menu,name:base.menu_ir_property_form_all msgid "All Properties" -msgstr "" +msgstr "Toutes les propriétés" #. module: base #: selection:ir.report.custom.fields,alignment:0 @@ -4387,17 +4505,17 @@ msgstr "Rafraîchissement automatique" #. module: base #: model:ir.model,name:base.model_ir_actions_act_window_close msgid "ir.actions.act_window_close" -msgstr "" +msgstr "ir.actions.act_window_close" #. module: base #: selection:ir.actions.todo,type:0 msgid "Service" -msgstr "" +msgstr "Service" #. module: base #: help:ir.actions.act_window,auto_refresh:0 msgid "Add an auto-refresh on the view" -msgstr "" +msgstr "Ajouter un rafraichissement automatique sur la vue" #. module: base #: field:ir.attachment,datas_fname:0 @@ -4408,17 +4526,17 @@ msgstr "Fichier" #. module: base #: field:ir.model,access_ids:0 msgid "Access" -msgstr "" +msgstr "Accès" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_GO_DOWN" -msgstr "" +msgstr "STOCK_GO_DOWN" #. module: base #: field:ir.report.custom,title:0 msgid "Report title" -msgstr "" +msgstr "Titre du Rapport" #. module: base #: selection:ir.cron,interval_type:0 @@ -4434,7 +4552,7 @@ msgstr "Nom du groupe" #: wizard_field:module.upgrade,next,module_download:0 #: wizard_view:module.upgrade,next:0 msgid "Modules to download" -msgstr "" +msgstr "Modules à télécharger" #. module: base #: field:res.bank,fax:0 @@ -4446,6 +4564,8 @@ msgstr "Fax" #: view:res.users:0 msgid "Groups are used to defined access rights on each screen and menu." msgstr "" +"Les Groupes sont utilisés pour définir les droits d'accès sur chaque écran " +"et menu." #. module: base #: model:ir.actions.act_window,name:base.action_workflow_workitem_form @@ -4456,11 +4576,11 @@ msgstr "" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_PRINT_PREVIEW" -msgstr "" +msgstr "STOCK_PRINT_PREVIEW" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The perm_read method is not implemented on this object !" msgstr "La méthode 'perm_read' n'est pas implémentée dans cet objet !" @@ -4481,17 +4601,17 @@ msgstr "Date de création" #. module: base #: view:ir.actions.server:0 msgid "Email / SMS" -msgstr "" +msgstr "Courriel / SMS" #. module: base #: field:res.bank,bic:0 msgid "BIC/Swift code" -msgstr "" +msgstr "Code BIC/Swift" #. module: base #: model:ir.model,name:base.model_ir_sequence msgid "ir.sequence" -msgstr "" +msgstr "ir.sequence" #. module: base #: selection:ir.module.module.dependency,state:0 @@ -4520,23 +4640,23 @@ msgstr "Ok" #. module: base #: field:ir.cron,doall:0 msgid "Repeat missed" -msgstr "" +msgstr "Recommencer les manqués" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "Couldn't find tag '%s' in parent view !" -msgstr "" +msgstr "Balise '%s' non trouvée dans la vue parente !" #. module: base #: field:ir.ui.view,inherit_id:0 msgid "Inherited View" -msgstr "" +msgstr "Vue Héritée" #. module: base #: model:ir.model,name:base.model_ir_translation msgid "ir.translation" -msgstr "" +msgstr "ir.translation" #. module: base #: field:ir.actions.act_window,limit:0 @@ -4560,12 +4680,12 @@ msgstr "Ou" #. module: base #: model:res.partner.category,name:base.res_partner_category_7 msgid "Openstuff.net" -msgstr "" +msgstr "Openstuff.net" #. module: base #: model:ir.model,name:base.model_ir_rule_group msgid "ir.rule.group" -msgstr "" +msgstr "ir.rule.group" #. module: base #: field:res.roles,child_id:0 @@ -4589,40 +4709,40 @@ msgstr "=" #. module: base #: view:ir.sequence:0 msgid "Week of the year: %(woy)s" -msgstr "" +msgstr "Semaine de l'année : %(woy)s" #. module: base #: model:ir.actions.act_window,name:base.open_module_tree_install #: model:ir.ui.menu,name:base.menu_module_tree_install msgid "Installed modules" -msgstr "" +msgstr "Modules installés" #. module: base -#, python-format #: code:addons/base/res/partner/partner.py:0 +#, python-format msgid "Warning" -msgstr "" +msgstr "Avertissement" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_ABOUT" -msgstr "" +msgstr "STOCK_ABOUT" #. module: base #: field:ir.rule,operator:0 msgid "Operator" -msgstr "" +msgstr "Opérateur" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "ValidateError" -msgstr "" +msgstr "Erreur de Validation" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_OPEN" -msgstr "" +msgstr "STOCK_OPEN" #. module: base #: selection:ir.actions.server,state:0 @@ -4632,78 +4752,78 @@ msgstr "" #. module: base #: selection:ir.report.custom.fields,alignment:0 msgid "right" -msgstr "" +msgstr "à droite" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_MEDIA_PREVIOUS" -msgstr "" +msgstr "STOCK_MEDIA_PREVIOUS" #. module: base #: wizard_button:base.module.import,init,import:0 #: model:ir.actions.wizard,name:base.wizard_base_module_import #: model:ir.ui.menu,name:base.menu_wizard_module_import msgid "Import module" -msgstr "" +msgstr "Importer le module" #. module: base #: rml:ir.module.reference:0 msgid "Version:" -msgstr "" +msgstr "Version:" #. module: base #: view:ir.actions.server:0 msgid "Trigger Configuration" -msgstr "" +msgstr "Configuration du déclencheur" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_DISCONNECT" -msgstr "" +msgstr "STOCK_DISCONNECT" #. module: base #: field:res.company,rml_footer1:0 msgid "Report Footer 1" -msgstr "" +msgstr "Pied de page 1 de rapport" #. module: base -#, python-format #: code:addons/base/ir/ir_model.py:0 +#, python-format msgid "You can not delete this document! (%s)" -msgstr "" +msgstr "Vous ne pouvez pas supprimer ce document ! (%s)" #. module: base #: model:ir.actions.act_window,name:base.action_report_custom #: view:ir.report.custom:0 msgid "Custom Report" -msgstr "" +msgstr "Rapport Personalisé" #. module: base #: view:ir.sequence:0 msgid "Day of the week (0:Monday): %(weekday)s" -msgstr "" +msgstr "Jour de la semaine (0:Lundi): %(weekday)s" #. module: base #: selection:ir.actions.server,state:0 msgid "Email" -msgstr "" +msgstr "Courriel" #. module: base #: model:ir.actions.act_window,name:base.action_wizard_update_translations #: model:ir.ui.menu,name:base.menu_wizard_update_translations msgid "Resynchronise Terms" -msgstr "" +msgstr "Resynchroniser les termes" #. module: base #: field:ir.model.access,perm_create:0 msgid "Create Access" -msgstr "" +msgstr "Accès en Création" #. module: base #: model:ir.actions.act_window,name:base.action_partner_other_form #: model:ir.ui.menu,name:base.menu_partner_other_form msgid "Others Partners" -msgstr "" +msgstr "Autres partenaires" #. module: base #: field:ir.model.data,noupdate:0 @@ -4713,34 +4833,34 @@ msgstr "" #. module: base #: rml:ir.module.reference:0 msgid "Printed:" -msgstr "" +msgstr "Imprimé:" #. module: base -#, python-format #: code:addons/base/module/module.py:0 +#, python-format msgid "Can not upgrade module '%s'. It is not installed." -msgstr "" +msgstr "Impossible de mettre à jour le module '%s'. Il n'est pas installé." #. module: base -#, python-format #: code:osv/fields.py:0 +#, python-format msgid "Not implemented set_memory method !" -msgstr "" +msgstr "Méthode 'set_memory' pas implémentée !" #. module: base #: selection:ir.actions.act_window,target:0 msgid "Current Window" -msgstr "" +msgstr "Fenêtre Courante" #. module: base #: view:res.partner.category:0 msgid "Partner category" -msgstr "" +msgstr "Catégorie de Partenaire" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_NETWORK" -msgstr "" +msgstr "STOCK_NETWORK" #. module: base #: model:ir.actions.act_window,name:base.action_model_fields @@ -4752,12 +4872,12 @@ msgstr "" #: view:ir.model.fields:0 #: view:ir.model:0 msgid "Fields" -msgstr "" +msgstr "Champs" #. module: base #: model:ir.ui.menu,name:base.next_id_2 msgid "Interface" -msgstr "" +msgstr "Interface" #. module: base #: model:ir.ui.menu,name:base.menu_base_config @@ -4770,18 +4890,18 @@ msgstr "Configuration" #: field:ir.model.fields,ttype:0 #: view:ir.model:0 msgid "Field Type" -msgstr "" +msgstr "Type de Champ" #. module: base #: field:ir.model.fields,complete_name:0 #: field:ir.ui.menu,complete_name:0 msgid "Complete Name" -msgstr "" +msgstr "Nom Complet" #. module: base #: field:res.country.state,code:0 msgid "State Code" -msgstr "" +msgstr "Code de l'État" #. module: base #: field:ir.model.fields,on_delete:0 @@ -4791,12 +4911,12 @@ msgstr "" #. module: base #: view:ir.sequence:0 msgid "Year with century: %(year)s" -msgstr "" +msgstr "Année avec siècle : %(year)s" #. module: base #: view:ir.report.custom:0 msgid "Subscribe Report" -msgstr "" +msgstr "Rapport des Souscriptions" #. module: base #: field:ir.values,object:0 @@ -4806,21 +4926,21 @@ msgstr "" #. module: base #: field:res.lang,translatable:0 msgid "Translatable" -msgstr "" +msgstr "Traduisible" #. module: base #: selection:ir.report.custom,frequency:0 msgid "Daily" -msgstr "" +msgstr "Journalière" #. module: base #: selection:ir.model.fields,on_delete:0 msgid "Cascade" -msgstr "" +msgstr "Cascade" #. module: base -#, python-format #: code:addons/base/ir/ir_report_custom.py:0 +#, python-format msgid "Field %d should be a figure" msgstr "" @@ -4829,13 +4949,13 @@ msgstr "" #: selection:ir.ui.view,type:0 #: selection:wizard.ir.model.menu.create.line,view_type:0 msgid "Gantt" -msgstr "" +msgstr "Gantt" #. module: base -#, python-format #: code:osv/fields.py:0 +#, python-format msgid "Not Implemented" -msgstr "" +msgstr "Non implémenté" #. module: base #: model:res.partner.category,name:base.res_partner_category_5 @@ -4850,80 +4970,91 @@ msgstr "" #. module: base #: view:ir.property:0 msgid "Property" -msgstr "" +msgstr "Propriété" #. module: base #: model:ir.model,name:base.model_res_partner_bank_type #: view:res.partner.bank.type:0 msgid "Bank Account Type" -msgstr "" +msgstr "Type de Compte Bancaire" #. module: base #: view:ir.actions.configuration.wizard:0 msgid "Next Configuration Step" -msgstr "" +msgstr "Prochaine Étape de la Configuration" #. module: base #: selection:ir.ui.menu,icon:0 msgid "terp-project" -msgstr "" +msgstr "terp-project" #. module: base #: field:res.groups,comment:0 msgid "Comment" -msgstr "" +msgstr "Commentaires" #. module: base #: field:ir.model.fields,domain:0 #: field:ir.rule,domain:0 #: field:res.partner.title,domain:0 msgid "Domain" -msgstr "" +msgstr "Domaine" #. module: base #: view:res.config.view:0 -msgid "Choose the simplified interface if you are testing OpenERP for the first time. Less used options or fields are automatically hidden. You will be able to change this, later, through the Administration menu." +msgid "" +"Choose the simplified interface if you are testing OpenERP for the first " +"time. Less used options or fields are automatically hidden. You will be able " +"to change this, later, through the Administration menu." msgstr "" +"Choisissez l'interface simplifiée si vous testez OpenERP pour la première " +"fois.. Les options et champs les moins utilisés seront automatiquement " +"cachés. Vous pourrez changer ce paramètre plus tard, dans le menu " +"Administration." #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_PREFERENCES" -msgstr "" +msgstr "STOCK_PREFERENCES" #. module: base #: field:ir.module.module,shortdesc:0 msgid "Short description" -msgstr "" +msgstr "Brève description" #. module: base #: help:ir.actions.report.xml,attachment:0 -msgid "This is the prefix of the file name the print will be saved as attachement. Keep empty to not save the printed reports" +msgid "" +"This is the prefix of the file name the print will be saved as attachement. " +"Keep empty to not save the printed reports" msgstr "" +"C'est le préfixe du nom du fichier d'impression qui sera sauvegardé comme " +"pièce jointe. Laissez vide pour ne pas sauvagarder les rapports d'impression." #. module: base #: field:res.country.state,name:0 msgid "State Name" -msgstr "" +msgstr "Nom de l'État" #. module: base #: view:res.company:0 msgid "Your Logo - Use a size of about 450x150 pixels." -msgstr "" +msgstr "Votre Logo - Utilisez une taille approximative de 450x150 pixels." #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_DELETE" -msgstr "" +msgstr "STOCK_DELETE" #. module: base #: field:workflow.activity,join_mode:0 msgid "Join Mode" -msgstr "" +msgstr "Mode de Jointure" #. module: base #: selection:ir.report.custom,print_format:0 msgid "a5" -msgstr "" +msgstr "a5" #. module: base #: selection:ir.actions.act_window.view,view_mode:0 @@ -4935,29 +5066,41 @@ msgstr "Calendrier" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_GOTO_LAST" -msgstr "" +msgstr "STOCK_GOTO_LAST" #. module: base #: model:ir.model,name:base.model_ir_actions_report_xml #: selection:ir.ui.menu,action:0 msgid "ir.actions.report.xml" -msgstr "" +msgstr "ir.actions.report.xml" #. module: base -#, python-format #: code:addons/base/maintenance/maintenance.py:0 +#, python-format msgid "Maintenance Error !" -msgstr "" +msgstr "Erreur de Maintenance !" #. module: base #: view:wizard.module.lang.export:0 -msgid "To improve some terms of the official translations of OpenERP, you should modify the terms directly on the launchpad interface. If you made lots of translations for your own module, you can also publish all your translation at once." +msgid "" +"To improve some terms of the official translations of OpenERP, you should " +"modify the terms directly on the launchpad interface. If you made lots of " +"translations for your own module, you can also publish all your translation " +"at once." msgstr "" +"Pour améliorer certains termes des traductions officielles d'OpenERP, vous " +"devez modifier les termes directement via l'interface de Launchpad. Si vous " +"avez traduit beaucoup de termes pour votre propre module, vous pouvez " +"également publier toutes vos traductions en une fois." #. module: base #: view:res.users:0 -msgid "Please note that you will have to logout and relog if you change your password." +msgid "" +"Please note that you will have to logout and relog if you change your " +"password." msgstr "" +"Veuillez noter que vous devrez vous déconnecter et vous reconnecter si vous " +"changer de mot de passe." #. module: base #: field:res.partner,address:0 @@ -4970,64 +5113,64 @@ msgstr "Contacts" #: selection:ir.ui.view,type:0 #: selection:wizard.ir.model.menu.create.line,view_type:0 msgid "Graph" -msgstr "" +msgstr "Graphe" #. module: base #: field:ir.module.module,latest_version:0 msgid "Latest version" -msgstr "" +msgstr "Dernière version" #. module: base #: model:ir.model,name:base.model_ir_actions_server msgid "ir.actions.server" -msgstr "" +msgstr "ir.actions.server" #. module: base #: model:res.partner.category,name:base.res_partner_category_17 msgid "HR sector" -msgstr "" +msgstr "Secteur HR" #. module: base #: wizard_button:module.lang.install,init,start:0 msgid "Start installation" -msgstr "" +msgstr "Commencer l'installation" #. module: base #: view:ir.model:0 msgid "Fields Description" -msgstr "" +msgstr "Description des Champs" #. module: base #: model:ir.model,name:base.model_ir_module_module_dependency msgid "Module dependency" -msgstr "" +msgstr "Dépendance des Modules" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The name_get method is not implemented on this object !" -msgstr "" +msgstr "La méthode 'name_get' n'est pas implémentée sur cet objet !" #. module: base #: model:ir.actions.wizard,name:base.wizard_upgrade #: model:ir.ui.menu,name:base.menu_wizard_upgrade msgid "Apply Scheduled Upgrades" -msgstr "" +msgstr "Appliquer les Mises à Jour Planifiées" #. module: base #: selection:ir.ui.menu,icon:0 msgid "STOCK_DND_MULTIPLE" -msgstr "" +msgstr "STOCK_DND_MULTIPLE" #. module: base #: model:res.partner.category,name:base.res_partner_category_2 msgid "OpenERP Partners" -msgstr "" +msgstr "Partnenaires OpenERP" #. module: base #: view:res.config.view:0 msgid "Choose Your Mode" -msgstr "" +msgstr "Choisissez Votre Mode" #. module: base #: view:ir.actions.report.custom:0 @@ -5038,12 +5181,12 @@ msgstr "" #: field:workflow.activity,action_id:0 #: view:ir.actions.server:0 msgid "Server Action" -msgstr "" +msgstr "Action du Serveur" #. module: base #: selection:ir.module.module,license:0 msgid "GPL-3" -msgstr "" +msgstr "GPL-3" #. module: base #: field:ir.actions.act_window_close,name:0 @@ -5052,32 +5195,32 @@ msgstr "" #: field:ir.actions.url,name:0 #: field:ir.actions.act_window,name:0 msgid "Action Name" -msgstr "" +msgstr "Nom de l'Action" #. module: base #: field:ir.actions.configuration.wizard,progress:0 msgid "Configuration Progress" -msgstr "" +msgstr "Progression de la Configuration" #. module: base #: field:res.company,rml_footer2:0 msgid "Report Footer 2" -msgstr "" +msgstr "Pied de page 2 de rapport" #. module: base #: field:res.bank,email:0 msgid "E-Mail" -msgstr "" +msgstr "Courriel" #. module: base #: wizard_view:module.lang.import,init:0 msgid "module,type,name,res_id,src,value" -msgstr "" +msgstr "module,type,name,res_id,src,value" #. module: base #: model:ir.model,name:base.model_res_groups msgid "res.groups" -msgstr "" +msgstr "res.groups" #. module: base #: field:workflow.activity,split_mode:0 @@ -5098,7 +5241,7 @@ msgstr "" #: field:ir.module.module,dependencies_id:0 #: view:ir.module.module:0 msgid "Dependencies" -msgstr "" +msgstr "Dépendances" #. module: base #: field:ir.cron,user_id:0 @@ -5107,18 +5250,18 @@ msgstr "" #: field:res.partner.event,user_id:0 #: view:res.users:0 msgid "User" -msgstr "" +msgstr "Utilisateur" #. module: base #: field:res.partner,parent_id:0 msgid "Main Company" -msgstr "" +msgstr "Société Principale" #. module: base #: model:ir.actions.act_window,name:base.ir_property_form #: model:ir.ui.menu,name:base.menu_ir_property_form msgid "Default properties" -msgstr "" +msgstr "Propriétés par défaut" #. module: base #: field:res.request.history,date_sent:0 @@ -5132,10 +5275,10 @@ msgid "Import a Translation File" msgstr "" #. module: base -#, python-format #: code:addons/base/ir/ir_actions.py:0 +#, python-format msgid "Please specify the Partner Email address !" -msgstr "" +msgstr "Veuillez spécifier le Courriel du Partenaire !" #. module: base #: model:ir.actions.act_window,name:base.action_partner_title_partner @@ -5152,7 +5295,9 @@ msgstr "" #. module: base #: view:ir.actions.server:0 -msgid "If you use a formula type, use a python expression using the variable 'object'." +msgid "" +"If you use a formula type, use a python expression using the variable " +"'object'." msgstr "" #. module: base @@ -5163,7 +5308,7 @@ msgstr "" #. module: base #: view:workflow.transition:0 msgid "Transition" -msgstr "" +msgstr "Transition" #. module: base #: field:res.partner,vat:0 @@ -5171,20 +5316,20 @@ msgid "VAT" msgstr "TVA" #. module: base -#, python-format #: code:addons/base/maintenance/maintenance.py:0 +#, python-format msgid "Valid Maintenance Contract !" -msgstr "" +msgstr "Contrat de Maintenance Valide !" #. module: base #: field:res.partner.address,birthdate:0 msgid "Birthdate" -msgstr "" +msgstr "Date de Naissance" #. module: base #: field:ir.module.repository,filter:0 msgid "Filter" -msgstr "" +msgstr "Filtre" #. module: base #: field:res.groups,menu_access:0 @@ -5194,18 +5339,18 @@ msgstr "" #. module: base #: model:ir.model,name:base.model_res_partner_som msgid "res.partner.som" -msgstr "" +msgstr "res.partner.som" #. module: base -#, python-format #: code:report/custom.py:0 #: code:addons/base/ir/ir_actions.py:0 #: code:addons/base/ir/ir_model.py:0 #: code:addons/base/res/res_user.py:0 #: code:addons/base/res/res_currency.py:0 #: code:addons/base/module/module.py:0 +#, python-format msgid "Error" -msgstr "" +msgstr "Erreur" #. module: base #: model:ir.actions.act_window,name:base.action_partner_category_form @@ -5213,18 +5358,18 @@ msgstr "" #: model:ir.ui.menu,name:base.menu_partner_category_form #: view:res.partner.category:0 msgid "Partner Categories" -msgstr "" +msgstr "Catégories du Partenaire" #. module: base #: model:ir.model,name:base.model_workflow_activity msgid "workflow.activity" -msgstr "" +msgstr "workflow.activity" #. module: base #: field:ir.sequence,code:0 #: field:ir.sequence.type,code:0 msgid "Sequence Code" -msgstr "" +msgstr "Code de la Séquence" #. module: base #: selection:res.request,state:0 @@ -5337,7 +5482,7 @@ msgstr "" #. module: base #: constraint:res.partner:0 msgid "The VAT doesn't seem to be correct." -msgstr "Le numéro de TVA ne semble pas correct." +msgstr "" #. module: base #: view:ir.sequence:0 @@ -5434,8 +5579,8 @@ msgid "Description" msgstr "" #. module: base -#, python-format #: code:addons/base/ir/ir_report_custom.py:0 +#, python-format msgid "Invalid operation" msgstr "" @@ -5471,8 +5616,8 @@ msgid "ir.attachment" msgstr "" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "The value \"%s\" for the field \"%s\" is not in the selection" msgstr "" @@ -5649,12 +5794,15 @@ msgstr "" #. module: base #: help:res.partner.address,type:0 -msgid "Used to select automatically the right address according to the context in sales and purchases documents." +msgid "" +"Used to select automatically the right address according to the context in " +"sales and purchases documents." msgstr "" #. module: base #: help:ir.cron,numbercall:0 -msgid "Number of time the function is called,\n" +msgid "" +"Number of time the function is called,\n" "a negative number indicates that the function will always be called" msgstr "" @@ -5689,8 +5837,8 @@ msgid "Cancel Install" msgstr "" #. module: base -#, python-format #: code:osv/orm.py:0 +#, python-format msgid "Please check that all your lines have %d columns." msgstr "" @@ -5703,4 +5851,3 @@ msgstr "" #: field:ir.model.data,name:0 msgid "XML Identifier" msgstr "" - diff --git a/bin/addons/base/ir/ir.xml b/bin/addons/base/ir/ir.xml index f0fc74bda22..78bd6dd3307 100644 --- a/bin/addons/base/ir/ir.xml +++ b/bin/addons/base/ir/ir.xml @@ -325,12 +325,25 @@ - + + ir.actions.wizard.tree + ir.actions.wizard + tree + + + + + + + + + + ir.actions.wizard ir.actions.wizard form -
+ @@ -341,7 +354,7 @@ - Wizard + Wizards ir.actions.act_window ir.actions.wizard form @@ -688,9 +701,9 @@ - - @@ -767,12 +780,9 @@ - - - - + @@ -1142,7 +1152,14 @@ + + + + + + + @@ -1157,6 +1174,7 @@ + diff --git a/bin/addons/base/ir/ir_actions.py b/bin/addons/base/ir/ir_actions.py index a4608de167c..eccbc17f397 100644 --- a/bin/addons/base/ir/ir_actions.py +++ b/bin/addons/base/ir/ir_actions.py @@ -365,12 +365,7 @@ server_object_lines() # Actions that are run on the server side # class actions_server(osv.osv): - - def fields_view_get(self, cr, user, view_id=None, view_type='form', context=None, toolbar=False): - res = super(actions_server, self).fields_view_get(cr, user, view_id, view_type, context, toolbar) - #print 'RES : ',res - return res - + def _select_signals(self, cr, uid, context={}): cr.execute("select distinct t.signal as key, t.signal || ' - [ ' || w.osv || ' ] ' as val from wkf w, wkf_activity a, wkf_transition t "\ " where w.id = a.wkf_id " \ @@ -386,52 +381,62 @@ class actions_server(osv.osv): _name = 'ir.actions.server' _table = 'ir_act_server' _sequence = 'ir_actions_id_seq' + _order = 'sequence' _columns = { 'name': fields.char('Action Name', required=True, size=64), + 'condition' : fields.char('Condition', size=256), + 'sub_condition' : fields.char('Condition', size=256), 'state': fields.selection([ ('client_action','Client Action'), ('dummy','Dummy'), + ('loop','Iteration'), + ('code','Python Code'), ('trigger','Trigger'), ('email','Email'), ('sms','SMS'), ('object_create','Create Object'), ('object_write','Write Object'), ('other','Multi Actions'), - ], 'Action State', required=True, size=32), - 'code': fields.text('Python Code'), + ], 'Action Type', required=True, size=32), + 'code':fields.text('Python Code'), 'sequence': fields.integer('Sequence'), 'model_id': fields.many2one('ir.model', 'Object', required=True), 'action_id': fields.many2one('ir.actions.actions', 'Client Action'), 'trigger_name': fields.selection(_select_signals, string='Trigger Name', size=128), 'wkf_model_id': fields.many2one('ir.model', 'Workflow on'), 'trigger_obj_id': fields.many2one('ir.model.fields','Trigger On'), - 'email': fields.many2one('ir.model.fields', 'Contact'), + 'email': fields.char('Email Address', size=512), + 'subject': fields.char('Subject', size=1024, translate=True), 'message': fields.text('Message', translate=True), - 'mobile': fields.many2one('ir.model.fields', 'Contact'), + 'mobile': fields.char('Mobile No', size=512), 'sms': fields.char('SMS', size=160, translate=True), 'child_ids': fields.many2many('ir.actions.server', 'rel_server_actions', 'server_id', 'action_id', 'Others Actions'), 'usage': fields.char('Action Usage', size=32), 'type': fields.char('Action Type', size=32, required=True), 'srcmodel_id': fields.many2one('ir.model', 'Model', help="In which object you want to create / write the object if its empty refer to the Object field"), 'fields_lines': fields.one2many('ir.server.object.lines', 'server_id', 'Fields Mapping'), - 'record_id':fields.many2one('ir.model.fields', 'Record Id', help="privide the field name from where the record id refers, if its empty it will refer to the active id of the object") + 'record_id':fields.many2one('ir.model.fields', 'Create Id', help="Provide the field name from where the record id stores after the create operations, if its empty, you can not track the new record"), + 'write_id':fields.char('Write Id', size=256, help="Provide the field name from where the record id refer for the write operation, if its empty it will refer to the active id of the object"), + 'loop_action':fields.many2one('ir.actions.server', 'Loop Action'), + 'expression':fields.char('Loop Expression', size=512), } _defaults = { 'state': lambda *a: 'dummy', + 'condition': lambda *a: 'True', + 'sub_condition': lambda *a: 'True', 'type': lambda *a: 'ir.actions.server', 'sequence': lambda *a: 5, - 'code': lambda *a: """# You can use the following variables + 'code': lambda *a: """# You can use the following variables # - object # - object2 # - time # - cr # - uid # - ids -# If you plan to return an action, assign: saction = {...} +# If you plan to return an action, assign: action = {...} """, } - def get_email(self, cr, uid, action, context): logger = netsvc.Logger() obj_pool = self.pool.get(action.model_id.model) @@ -453,7 +458,6 @@ class actions_server(osv.osv): return obj - def get_mobile(self, cr, uid, action, context): logger = netsvc.Logger() obj_pool = self.pool.get(action.model_id.model) @@ -498,15 +502,31 @@ class actions_server(osv.osv): # OUT: # False : Finnished correctly # ACTION_ID : Action to launch + def run(self, cr, uid, ids, context={}): logger = netsvc.Logger() + for action in self.browse(cr, uid, ids, context): + obj_pool = self.pool.get(action.model_id.model) + obj = obj_pool.browse(cr, uid, context['active_id'], context=context) + cxt = { + 'context':context, + 'object': obj, + 'time':time, + 'cr': cr, + 'pool' : self.pool, + 'uid' : uid + } + expr = eval(str(action.condition), cxt) + if not expr: + continue if action.state=='client_action': if not action.action_id: - raise osv.except_osv(_('Error'), _("Please specify an action to launch !")) - return self.pool.get(action.action_id.type).read(cr, uid, action.action_id.id, context=context) - + raise osv.except_osv(_('Error'), _("Please specify an action to launch !")) + result = self.pool.get(action.action_id.type).read(cr, uid, action.action_id.id, context=context) + return result + if action.state=='python': localdict = { 'self': self.pool.get(action.model_id.model), @@ -522,14 +542,20 @@ class actions_server(osv.osv): if action.state == 'email': user = config['email_from'] - subject = action.name - address = self.get_email(cr, uid, action, context) + address = str(action.email) + try: + address = eval(str(action.email), cxt) + except: + pass + if not address: raise osv.except_osv(_('Error'), _("Please specify the Partner Email address !")) if not user: raise osv.except_osv(_('Error'), _("Please specify server option --smtp-from !")) + subject = self.merge_message(cr, uid, str(action.subject), action, context) body = self.merge_message(cr, uid, str(action.message), action, context) + if tools.email_send(user, [address], subject, body, debug=False, subtype='html') == True: logger.notifyChannel('email', netsvc.LOG_INFO, 'Email successfully send to : %s' % (address)) else: @@ -556,13 +582,32 @@ class actions_server(osv.osv): logger.notifyChannel('sms', netsvc.LOG_ERROR, 'Failed to send SMS to : %s' % (action.address)) if action.state == 'other': - res = None + res = [] for act in action.child_ids: + context['active_id'] = context['active_ids'][0] result = self.run(cr, uid, [act.id], context) if result: - res = result + res.append(result) + return res + if action.state == 'loop': + obj_pool = self.pool.get(action.model_id.model) + obj = obj_pool.browse(cr, uid, context['active_id'], context=context) + cxt = { + 'context':context, + 'object': obj, + 'time':time, + 'cr': cr, + 'pool' : self.pool, + 'uid' : uid + } + expr = eval(str(action.expression), cxt) + context['object'] = obj + for i in expr: + context['active_id'] = i.id + result = self.run(cr, uid, [action.loop_action.id], context) + if action.state == 'object_write': res = {} for exp in action.fields_lines: @@ -570,23 +615,35 @@ class actions_server(osv.osv): if exp.type == 'equation': obj_pool = self.pool.get(action.model_id.model) obj = obj_pool.browse(cr, uid, context['active_id'], context=context) - expr = eval(euq, {'context':context, 'object': obj, 'time':time}) + cxt = {'context':context, 'object': obj, 'time':time} + expr = eval(euq, cxt) else: expr = exp.value res[exp.col1.name] = expr - if not action.record_id: + if not action.write_id: if not action.srcmodel_id: obj_pool = self.pool.get(action.model_id.model) obj_pool.write(cr, uid, [context.get('active_id')], res) else: + write_id = context.get('active_id') obj_pool = self.pool.get(action.srcmodel_id.model) - obj_pool.write(cr, uid, [context.get('active_id')], res) - else: + obj_pool.write(cr, uid, [write_id], res) + + elif action.write_id: obj_pool = self.pool.get(action.srcmodel_id.model) - id = self.pool.get(action.model_id.model).read(cr, uid, [context.get('active_id')], [action.record_id.name]) - obj_pool.write(cr, uid, [int(id[0][action.record_id.name])], res) - + rec = self.pool.get(action.model_id.model).browse(cr, uid, context.get('active_id')) + id = eval(action.write_id, {'object': rec}) + try: + id = int(id) + except: + raise osv.except_osv(_('Error'), _("Problem in configuration `Record Id` in Server Action!")) + + if type(id) != type(1): + raise osv.except_osv(_('Error'), _("Problem in configuration `Record Id` in Server Action!")) + write_id = id + obj_pool.write(cr, uid, [write_id], res) + if action.state == 'object_create': res = {} for exp in action.fields_lines: @@ -603,9 +660,12 @@ class actions_server(osv.osv): res_id = False obj_pool = self.pool.get(action.srcmodel_id.model) res_id = obj_pool.create(cr, uid, res) - self.pool.get(action.model_id.model).write(cr, uid, [context.get('active_id')], {action.record_id.name:res_id}) + cr.commit() + if action.record_id: + self.pool.get(action.model_id.model).write(cr, uid, [context.get('active_id')], {action.record_id.name:res_id}) return False + actions_server() class act_window_close(osv.osv): diff --git a/bin/addons/base/ir/ir_model.py b/bin/addons/base/ir/ir_model.py index 40ce882e280..8120e4e3bd4 100644 --- a/bin/addons/base/ir/ir_model.py +++ b/bin/addons/base/ir/ir_model.py @@ -1,7 +1,7 @@ # -*- encoding: utf-8 -*- ############################################################################## # -# OpenERP, Open Source Management Solution +# OpenERP, Open Source Management Solution # Copyright (C) 2004-2008 Tiny SPRL (). All Rights Reserved # $Id$ # @@ -55,7 +55,7 @@ class ir_model(osv.osv): if model.state=='manual': if not model.model.startswith('x_'): return False - if not re.match('^[a-z_A-Z0-9]+$',model.model): + if not re.match('^[a-z_A-Z0-9.]+$',model.model): return False return True @@ -193,9 +193,7 @@ class ir_model_fields(osv.osv): _columns = { 'name': fields.char('Name', required=True, size=64, select=1), 'model': fields.char('Object Name', size=64, required=True), - 'relation_id':fields.many2one('ir.model', 'Object Relation'), 'relation': fields.char('Object Relation', size=64), - 'relation_field_id':fields.many2one('ir.model.fields', 'Relation Field'), 'relation_field': fields.char('Relation Field', size=64), 'model_id': fields.many2one('ir.model', 'Object id', required=True, select=True, ondelete='cascade'), 'field_description': fields.char('Field Label', required=True, size=256), @@ -233,38 +231,20 @@ class ir_model_fields(osv.osv): # MAY BE ADD A ALTER TABLE DROP ? # return super(ir_model_fields, self).unlink(cr, user, ids, context) - - def write(self, cr, uid, ids, vals, context=None): - res = False - if 'relation_id' in vals: - model_data = self.pool.get('ir.model').browse(cr, uid, vals['relation_id']) - vals['relation'] = model_data.model - if 'relation_field_id' in vals: - field_data = self.pool.get('ir.model.fields').browse(cr, uid, vals['relation_field_id']) - vals['relation'] = field_data.name - - res = super(ir_model_fields, self).write(cr, uid, ids, vals, context) - return res - + def create(self, cr, user, vals, context=None): - if 'relation_id' in vals: - model_data = self.pool.get('ir.model').browse(cr,user,vals['relation_id']) - vals['relation']=model_data.model - if 'relation_field_id' in vals: - field_data = self.pool.get('ir.model.fields').browse(cr, uid, vals['relation_field_id']) - vals['relation_field'] = field_data.name if 'model_id' in vals: - model_data=self.pool.get('ir.model').browse(cr,user,vals['model_id']) - vals['model']=model_data.model + model_data = self.pool.get('ir.model').browse(cr, user, vals['model_id']) + vals['model'] = model_data.model if context and context.get('manual',False): - vals['state']='manual' + vals['state'] = 'manual' res = super(ir_model_fields,self).create(cr, user, vals, context) - if vals.get('state','base')=='manual': + if vals.get('state','base') == 'manual': if not vals['name'].startswith('x_'): raise except_orm(_('Error'), _("Custom fields must have a name that starts with 'x_' !")) if self.pool.get(vals['model']): self.pool.get(vals['model']).__init__(self.pool, cr) - self.pool.get(vals['model'])._auto_init(cr,{}) + self.pool.get(vals['model'])._auto_init(cr, {}) return res ir_model_fields() @@ -298,7 +278,7 @@ class ir_model_access(osv.osv): model_name = model.name else: model_name = model - + if isinstance(group_ids, (int, long)): group_ids = [group_ids] for group_id in group_ids: @@ -324,7 +304,7 @@ class ir_model_access(osv.osv): def check(self, cr, uid, model, mode='read', raise_exception=True): if uid==1: - # User root have all accesses + # User root have all accesses # TODO: exclude xml-rpc requests return True @@ -335,7 +315,7 @@ class ir_model_access(osv.osv): model_name = model.name else: model_name = model - + # We check if a specific rule exists cr.execute('SELECT MAX(CASE WHEN perm_' + mode + ' THEN 1 ELSE 0 END) ' ' FROM ir_model_access a ' @@ -394,7 +374,7 @@ class ir_model_access(osv.osv): res = super(ir_model_access, self).write(cr, uid, *args, **argv) self.check() # clear the cache of check function return res - + def create(self, cr, uid, *args, **argv): res = super(ir_model_access, self).create(cr, uid, *args, **argv) self.check() diff --git a/bin/addons/base/ir/ir_ui_view.py b/bin/addons/base/ir/ir_ui_view.py index afe4990aefc..70c336a7003 100644 --- a/bin/addons/base/ir/ir_ui_view.py +++ b/bin/addons/base/ir/ir_ui_view.py @@ -28,7 +28,7 @@ import os def _check_xml(self, cr, uid, ids, context={}): for view in self.browse(cr, uid, ids, context): - eview = etree.fromstring(view.arch) + eview = etree.fromstring(view.arch.encode('utf8')) frng = tools.file_open(os.path.join('base','rng','view.rng')) relaxng = etree.RelaxNG(file=frng) if not relaxng.validate(eview): diff --git a/bin/addons/base/ir/ir_values.py b/bin/addons/base/ir/ir_values.py index bd9a5ba2c69..9bffc4f0719 100644 --- a/bin/addons/base/ir/ir_values.py +++ b/bin/addons/base/ir/ir_values.py @@ -206,7 +206,8 @@ class ir_values(osv.osv): del fields[pos] else: pos+=1 - datas = self.pool.get(model).read(cr, uid, [id], fields, context)[0] + datas = self.pool.get(model).read(cr, uid, [id], fields, context) + datas= datas and datas[0] or None if not datas: #ir_del(cr, uid, x[0]) return False diff --git a/bin/addons/base/module/module.py b/bin/addons/base/module/module.py index 376e80450f9..e680eff0451 100644 --- a/bin/addons/base/module/module.py +++ b/bin/addons/base/module/module.py @@ -461,7 +461,7 @@ class module(osv.osv): for lang in filter_lang: f = os.path.join(tools.config['addons_path'], mod.name, 'i18n', lang + '.po') if os.path.exists(f): - logger.notifyChannel("init", netsvc.LOG_INFO, 'addon %s: loading translation file for language %s' % (mod.name, lang)) + logger.notifyChannel("init", netsvc.LOG_INFO, 'module %s: loading translation file for language %s' % (mod.name, lang)) tools.trans_load(cr.dbname, f, lang, verbose=False) module() diff --git a/bin/addons/base/module/wizard/wizard_export_lang.py b/bin/addons/base/module/wizard/wizard_export_lang.py index c6ce9f75e19..7e1454bf25e 100644 --- a/bin/addons/base/module/wizard/wizard_export_lang.py +++ b/bin/addons/base/module/wizard/wizard_export_lang.py @@ -26,7 +26,6 @@ import base64 import StringIO import csv import pooler - from osv import fields,osv @@ -51,7 +50,6 @@ class wizard_export_lang(osv.osv_memory): mods = map(lambda m: m.name, this.modules) or ['all'] mods.sort() buf=StringIO.StringIO() - tools.trans_export(this.lang, mods, buf, this.format, dbname=cr.dbname) if this.format == 'csv': this.advice = _("Save this document to a .CSV file and open it with your favourite spreadsheet software. The file encoding is UTF-8. You have to translate the latest column before reimporting it.") @@ -64,7 +62,6 @@ class wizard_export_lang(osv.osv_memory): this.advice = _('Save this document to a .tgz file. This archive containt UTF-8 %s files and may be uploaded to launchpad.') % (ext,) this.name = "%s.%s" % (this.lang or _('new'), this.format) - out=base64.encodestring(buf.getvalue()) buf.close() return self.write(cr, uid, ids, {'state':'get', 'data':out, 'advice':this.advice, 'name':this.name}, context=context) diff --git a/bin/addons/base/module/wizard/wizard_module_lang_install.py b/bin/addons/base/module/wizard/wizard_module_lang_install.py index a3c4d6bdb99..d904fdb2a42 100644 --- a/bin/addons/base/module/wizard/wizard_module_lang_install.py +++ b/bin/addons/base/module/wizard/wizard_module_lang_install.py @@ -54,11 +54,8 @@ class wizard_lang_install(wizard.interface): modobj.update_translations(cr, uid, mids, lang) return {} - def _get_language(sel, cr, uid, context): - return tools.scan_languages() - fields_form = { - 'lang': {'string':'Language', 'type':'selection', 'selection':_get_language, + 'lang': {'string':'Language', 'type':'selection', 'selection':tools.scan_languages(), }, } diff --git a/bin/addons/base/res/partner/partner.py b/bin/addons/base/res/partner/partner.py index d17c696677f..56c01015287 100644 --- a/bin/addons/base/res/partner/partner.py +++ b/bin/addons/base/res/partner/partner.py @@ -255,7 +255,7 @@ class res_partner(osv.osv): ref = res and res[0]['ref'] or '0' try: nextref = int(ref)+1 - except e: + except: raise osv.except_osv(_('Warning'), _("Couldn't generate the next id because some partners have an alphabetic id !")) # update the current partner diff --git a/bin/addons/base/res/res_company.py b/bin/addons/base/res/res_company.py index faddf9c1407..20a5a01d439 100644 --- a/bin/addons/base/res/res_company.py +++ b/bin/addons/base/res/res_company.py @@ -143,12 +143,12 @@ class res_company(osv.osv): [[ company.partner_id.name ]] - [[ company.partner_id.address and company.partner_id.address[0].street ]] - [[ company.partner_id.address and company.partner_id.address[0].zip ]] [[ company.partner_id.address and company.partner_id.address[0].city ]] - [[ company.partner_id.address and company.partner_id.address[0].country_id and company.partner_id.address[0].country_id.name ]] + [[ company.partner_id.address and company.partner_id.address[0].street or '' ]] + [[ company.partner_id.address and company.partner_id.address[0].zip or '' ]] [[ company.partner_id.address and company.partner_id.address[0].city or '' ]] - [[ company.partner_id.address and company.partner_id.address[0].country_id and company.partner_id.address[0].country_id.name or '']] Phone: - [[ company.partner_id.address and company.partner_id.address[0].phone ]] + [[ company.partner_id.address and company.partner_id.address[0].phone or '' ]] Mail: - [[ company.partner_id.address and company.partner_id.address[0].email ]] + [[ company.partner_id.address and company.partner_id.address[0].email or '' ]] 1.3cm 25.5cm 7cm 25.5cm diff --git a/bin/addons/base/rng/view.rng b/bin/addons/base/rng/view.rng index 01a05bd47dc..e40f178d69f 100644 --- a/bin/addons/base/rng/view.rng +++ b/bin/addons/base/rng/view.rng @@ -19,6 +19,7 @@ + @@ -101,6 +102,15 @@ + + + + + + + + + @@ -134,6 +144,9 @@ + + + diff --git a/bin/netsvc.py b/bin/netsvc.py index 6fbe420b9c7..a25f53cf204 100644 --- a/bin/netsvc.py +++ b/bin/netsvc.py @@ -144,12 +144,16 @@ def service_exist(name): def get_rpc_paths(): return map(lambda s: '/xmlrpc/%s' % s, _service) + +LOG_DEBUG_RPC = 'debug_rpc' LOG_DEBUG = 'debug' LOG_INFO = 'info' LOG_WARNING = 'warn' LOG_ERROR = 'error' LOG_CRITICAL = 'critical' +# add new log level below DEBUG +logging.DEBUG_RPC = logging.DEBUG - 1 def init_logger(): from tools import config @@ -188,6 +192,7 @@ def init_logger(): background = lambda f: 40 + colors.index(f) mapping = { + 'DEBUG_RPC': ('blue', 'white'), 'DEBUG': ('blue', 'default'), 'INFO': ('green', 'default'), 'WARNING': ('yellow', 'default'), @@ -203,6 +208,11 @@ def init_logger(): class Logger(object): def notifyChannel(self, name, level, msg): log = logging.getLogger(name) + + if level == LOG_DEBUG_RPC and not hasattr(log, level): + fct = lambda msg, *args, **kwargs: log.log(logging.DEBUG_RPC, msg, *args, **kwargs) + setattr(log, LOG_DEBUG_RPC, fct) + level_method = getattr(log, level) result = str(msg).strip().split('\n') @@ -297,7 +307,7 @@ class SimpleThreadedXMLRPCServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) SimpleXMLRPCServer.SimpleXMLRPCServer.server_bind(self) except: - Logger().notifyChannel('init', LOG_ERROR, 'Address already in use') + Logger().notifyChannel('init', LOG_CRITICAL, 'Address already in use') sys.exit(1) class HttpDaemon(threading.Thread): @@ -368,6 +378,10 @@ class TinySocketClientThread(threading.Thread): threading.Thread.__init__(self) self.sock = sock self.threads = threads + self._logger = Logger() + + def log(self, msg): + self._logger.notifyChannel('NETRPC', LOG_DEBUG_RPC, msg) def run(self): import traceback @@ -388,6 +402,7 @@ class TinySocketClientThread(threading.Thread): self.threads.remove(self) return False try: + self.log(msg) s = LocalService(msg[0]) m = getattr(s, msg[1]) s._service._response = None @@ -395,6 +410,7 @@ class TinySocketClientThread(threading.Thread): res = s._service._response if res != None: r = res + self.log(r) ts.mysend(r) except Exception, e: tb_s = reduce(lambda x, y: x+y, traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback)) @@ -403,7 +419,8 @@ class TinySocketClientThread(threading.Thread): import pdb tb = sys.exc_info()[2] pdb.post_mortem(tb) - e = Exception(e.message) + e = Exception(str(e)) + self.log(str(e)) ts.mysend(e, exception=True, traceback=tb_s) except: pass diff --git a/bin/osv/fields.py b/bin/osv/fields.py index 544bd9b3fee..f692fc4c53a 100644 --- a/bin/osv/fields.py +++ b/bin/osv/fields.py @@ -284,10 +284,10 @@ class many2one(_column): _column.__init__(self, string=string, **args) self._obj = obj - # - # TODO: speed improvement - # - # name is the name of the relation field + def set_memory(self, cr, obj, id, field, values, user=None, context=None): + obj.datas.setdefault(id, {}) + obj.datas[id][field] = values + def get_memory(self, cr, obj, ids, name, user=None, context=None, values=None): result = {} for id in ids: @@ -426,6 +426,7 @@ class one2many(_column): context = {} if not values: return + _table = obj.pool.get(self._obj)._table obj = obj.pool.get(self._obj) for act in values: @@ -602,6 +603,9 @@ class function(_column): if store: self._classic_read = True self._classic_write = True + if type=='binary': + self._symbol_get=lambda x:x and str(x) + if type == 'float': self._symbol_c = float._symbol_c self._symbol_f = float._symbol_f @@ -688,15 +692,21 @@ class related(function): self._field_get2(cr, uid, obj, context) if not ids: return {} relation = obj._name - res = {} + res = {}.fromkeys(ids, False) objlst = obj.browse(cr, uid, ids) for data in objlst: + if not data: + continue t_data = data relation = obj._name for i in range(len(self.arg)): field_detail = self._relations[i] relation = field_detail['object'] - if not t_data[self.arg[i]]: + try: + if not t_data[self.arg[i]]: + t_data = False + break + except: t_data = False break if field_detail['type'] in ('one2many', 'many2many'): diff --git a/bin/osv/orm.py b/bin/osv/orm.py index 7920326b695..5e2d70252fd 100644 --- a/bin/osv/orm.py +++ b/bin/osv/orm.py @@ -133,7 +133,6 @@ class browse_record(object): self._data[id] = {'id': id} self._cache = cache - pass def __getitem__(self, name): if name == 'id': @@ -930,6 +929,12 @@ class orm_template(object): def fields_view_get(self, cr, user, view_id=None, view_type='form', context=None, toolbar=False): if not context: context = {} + + def encode(s): + if isinstance(s, unicode): + return s.encode('utf8') + return s + def _inherit_apply(src, inherit): def _find(node, node2): if node2.nodeType == node2.ELEMENT_NODE and node2.localName == 'xpath': @@ -952,9 +957,11 @@ class orm_template(object): if res: return res return None + - doc_src = dom.minidom.parseString(src) - doc_dest = dom.minidom.parseString(inherit) + netsvc.Logger().notifyChannel('orm', netsvc.LOG_DEBUG, type(src)) + doc_src = dom.minidom.parseString(encode(src)) + doc_dest = dom.minidom.parseString(encode(inherit)) toparse = doc_dest.childNodes while len(toparse): node2 = toparse.pop(0) @@ -1069,7 +1076,7 @@ class orm_template(object): result['field_parent'] = False result['view_id'] = 0 - doc = dom.minidom.parseString(result['arch'].encode('utf-8')) + doc = dom.minidom.parseString(encode(result['arch'])) xarch, xfields = self.__view_look_dom_arch(cr, user, doc, context=context) result['arch'] = xarch result['fields'] = xfields @@ -2070,7 +2077,8 @@ class orm(orm_template): 'where id in ('+str_d+')', sub_ids) for order, object, ids, fields in result_store: - self.pool.get(object)._store_set_values(cr, uid, ids, fields, context) + if object<>self._name: + self.pool.get(object)._store_set_values(cr, uid, ids, fields, context) return True # diff --git a/bin/pooler.py b/bin/pooler.py index 132e99b5089..250ee4f22e5 100644 --- a/bin/pooler.py +++ b/bin/pooler.py @@ -37,9 +37,11 @@ def get_db_and_pool(db_name, force_demo=False, status=None, update_module=False) pool_dic[db_name] = pool addons.load_modules(db, force_demo, status, update_module) cr = db.cursor() - pool.init_set(cr, False) - cr.commit() - cr.close() + try: + pool.init_set(cr, False) + cr.commit() + finally: + cr.close() if not update_module: import report diff --git a/bin/report/printscreen/ps_list.py b/bin/report/printscreen/ps_list.py index 936cead4b88..98a1c23c4c8 100644 --- a/bin/report/printscreen/ps_list.py +++ b/bin/report/printscreen/ps_list.py @@ -132,7 +132,7 @@ class report_printscreen_list(report_int): for f in fields_order: field = new_doc.createElement("field") - field_txt = new_doc.createTextNode(str(fields[f]['string'] or '')) + field_txt = new_doc.createTextNode(fields[f]['string'] or '') field.appendChild(field_txt) header.appendChild(field) @@ -166,7 +166,7 @@ class report_printscreen_list(report_int): col.setAttribute('para','yes') col.setAttribute('tree','no') if line[f] != None: - txt = new_doc.createTextNode(str(line[f] or '')) + txt = new_doc.createTextNode(line[f] or '') if temp[count] == 1: tsum[count] = float(tsum[count]) + float(line[f]); @@ -204,7 +204,7 @@ class report_printscreen_list(report_int): styledoc = libxml2.parseFile(os.path.join(tools.config['root_path'],'addons/base/report/custom_new.xsl')) style = libxslt.parseStylesheetDoc(styledoc) - doc = libxml2.parseDoc(new_doc.toxml()) + doc = libxml2.parseDoc(new_doc.toxml(encoding='utf-8')) rml_obj = style.applyStylesheet(doc, None) rml = style.saveResultToString(rml_obj) self.obj = render.rml(rml, title=self.title) diff --git a/bin/report/report_sxw.py b/bin/report/report_sxw.py index d1c049c2f15..b26b32e6417 100644 --- a/bin/report/report_sxw.py +++ b/bin/report/report_sxw.py @@ -20,30 +20,28 @@ # ############################################################################## -import base64 -import xml.dom.minidom -import os, time -import ir, netsvc -import osv from interface import report_rml -import re -import tools -import pooler -import netsvc -import warnings -import locale -import copy import StringIO -import zipfile -import os +import base64 +import copy +import ir +import locale import mx.DateTime +import netsvc +import os +import osv +import pooler +import re +import time +import tools +import warnings +import xml.dom.minidom +import zipfile DT_FORMAT = '%Y-%m-%d' DHM_FORMAT = '%Y-%m-%d %H:%M:%S' HM_FORMAT = '%H:%M:%S' -import base64 - if not hasattr(locale, 'nl_langinfo'): locale.nl_langinfo = lambda *a: '%x' @@ -469,15 +467,10 @@ class rml_parse(object): if isinstance(newtext, list): todo.append((key, newtext)) else: - if not isinstance(newtext, basestring): - newtext = str(newtext) - elif isinstance(newtext,unicode): - pass - elif isinstance(newtext,str): - newtext = newtext.decode('utf8') # if there are two [[]] blocks the same, it will replace both # but it's ok because it should evaluate to the same thing # anyway + newtext = tools.ustr(newtext) text = text.replace('[['+key+']]', newtext) self._node.data = text if len(todo): diff --git a/bin/sql_db.py b/bin/sql_db.py index ad3068a08e2..ba5e3457df5 100644 --- a/bin/sql_db.py +++ b/bin/sql_db.py @@ -140,6 +140,12 @@ class Cursor(object): self.sql_into_log[res_into.group(1)][1] += mdt.now() - now return res + def drop_view_if_exists(self, viewname): + self._obj.execute("select count(1) from pg_class where relkind=%s and relname=%s", ('v', viewname,)) + if self._obj.fetchone()[0]: + self._obj.execute("DROP view %s" % (viewname,)) + self._obj.commit() + def print_log(self): def process(type): sqllogs = {'from':self.sql_from_log, 'into':self.sql_into_log} @@ -220,13 +226,15 @@ class PoolManager(object): logger.notifyChannel('dbpool', netsvc.LOG_INFO, 'Connecting to %s' % (db_name,)) PoolManager._pools[db_name] = ConnectionPool(ThreadedConnectionPool(1, PoolManager.maxconn, PoolManager.dsn(db_name)), db_name) except Exception, e: - logger.notifyChannel('dbpool', netsvc.LOG_CRITICAL, 'Unable to connect to %s: %s' % (db_name, e.message)) + logger.notifyChannel('dbpool', netsvc.LOG_ERROR, 'Unable to connect to %s: %s' % + (db_name, str(e))) raise return PoolManager._pools[db_name] get = staticmethod(get) def close(db_name): if db_name in PoolManager._pools: + logger = netsvc.Logger() logger.notifyChannel('dbpool', netsvc.LOG_INFO, 'Closing all connections to %s' % (db_name,)) PoolManager._pools[db_name].closeall() del PoolManager._pools[db_name] diff --git a/bin/tools/config.py b/bin/tools/config.py index 224ac5e4e72..e93bf7aec37 100644 --- a/bin/tools/config.py +++ b/bin/tools/config.py @@ -20,8 +20,12 @@ # ############################################################################## -import ConfigParser,optparse,os,sys -import netsvc,logging +import ConfigParser +import optparse +import os +import sys +import netsvc +import logging import release class configmanager(object): @@ -66,7 +70,7 @@ class configmanager(object): 'assert_exit_level': logging.WARNING, # level above which a failed assert will be raise } - loglevels = dict([(getattr(netsvc, 'LOG_%s' % x), getattr(logging, x)) for x in ('CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG')]) + loglevels = dict([(getattr(netsvc, 'LOG_%s' % x), getattr(logging, x)) for x in ('CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG', 'DEBUG_RPC')]) version = "%s %s" % (release.description, release.version) parser = optparse.OptionParser(version=version) diff --git a/bin/tools/convert.py b/bin/tools/convert.py index 49f9c77eeed..0efac6ed082 100644 --- a/bin/tools/convert.py +++ b/bin/tools/convert.py @@ -493,7 +493,7 @@ form: module.record_id""" % (xml_id,) try: npid = self.pool.get('ir.model.data')._update_dummy(cr, self.uid, 'ir.ui.menu', self.module, xml_id, idx==len(m_l)-1) except: - self.logger.notifyChannel('init', netsvc.LOG_ERROR, "addon: %s xml_id: %s" % (self.module, xml_id)) + self.logger.notifyChannel('init', netsvc.LOG_ERROR, "module: %s xml_id: %s" % (self.module, xml_id)) else: # the menuitem does't exist but we are in branch (not a leaf) self.logger.notifyChannel("init", netsvc.LOG_WARNING, 'Warning no ID for submenu %s of menu %s !' % (menu_elem, str(m_l))) diff --git a/bin/tools/misc.py b/bin/tools/misc.py index fbdaf44c55b..ebf0606601d 100644 --- a/bin/tools/misc.py +++ b/bin/tools/misc.py @@ -715,11 +715,41 @@ def logged(f): vector.append(' result: %s' % pformat(res)) vector.append(' time delta: %s' % (time.time() - timeb4)) - #netsvc.Logger().notifyChannel('logged', netsvc.LOG_DEBUG, '\n'.join(vector)) + netsvc.Logger().notifyChannel('logged', netsvc.LOG_DEBUG, '\n'.join(vector)) return res return wrapper +def debug(what): + """ + This method allow you to debug your code without print + Example: + >>> def func_foo(bar) + ... baz = bar + ... debug(baz) + ... qnx = (baz, bar) + ... debug(qnx) + ... + >>> func_foo(42) + + This will output on the logger: + + [Wed Dec 25 00:00:00 2008] DEBUG:func_foo:baz = 42 + [Wed Dec 25 00:00:00 2008] DEBUG:func_foo:qnx = (42, 42) + + To view the DEBUG lines in the logger you must start the server with the option + --log-level=debug + + """ + import netsvc + from inspect import stack + import re + from pprint import pformat + st = stack()[1] + param = re.split("debug *\((.+)\)", st[4][0].strip())[1].strip() + while param.count(')') > param.count('('): param = param[:param.rfind(')')] + netsvc.Logger().notifyChannel(st[3], netsvc.LOG_DEBUG, "%s = %s" % (param, pformat(what))) + icons = map(lambda x: (x,x), ['STOCK_ABOUT', 'STOCK_ADD', 'STOCK_APPLY', 'STOCK_BOLD', 'STOCK_CANCEL', 'STOCK_CDROM', 'STOCK_CLEAR', 'STOCK_CLOSE', 'STOCK_COLOR_PICKER', diff --git a/bin/tools/translate.py b/bin/tools/translate.py index 29743d11cd5..a58872d3b47 100644 --- a/bin/tools/translate.py +++ b/bin/tools/translate.py @@ -354,10 +354,17 @@ def trans_generate(lang, modules, dbname=None): tuple = (module, type, name, id, source) if source and tuple not in _to_translate: _to_translate.append(tuple) - + + def encode(s): + if isinstance(s, unicode): + return s.encode('utf8') + return s for (xml_name,model,res_id,module) in cr.fetchall(): - xml_name = module+'.'+xml_name + module = encode(module) + model = encode(model) + xml_name = "%s.%s" % (module, encode(xml_name)) + if not pool.get(model): logger.notifyChannel("db", netsvc.LOG_ERROR, "unable to find object %r" % (model,)) continue @@ -365,9 +372,9 @@ def trans_generate(lang, modules, dbname=None): if model=='ir.ui.view': d = xml.dom.minidom.parseString(obj.arch) for t in trans_parse_view(d.documentElement): - push_translation(module, 'view', obj.model, 0, t) + push_translation(module, 'view', encode(obj.model), 0, t) elif model=='ir.actions.wizard': - service_name = 'wizard.'+obj.wiz_name + service_name = 'wizard.'+encode(obj.wiz_name) try: obj2 = netsvc._service[service_name] except KeyError, exc: @@ -378,18 +385,23 @@ def trans_generate(lang, modules, dbname=None): result = state_def['result'] if result['type'] != 'form': continue - name = obj.wiz_name + ',' + state_name + name = "%s,%s" % (encode(obj.wiz_name), state_name) + + def_params = { + 'string': ('wizard_field', lambda s: [encode(s)]), + 'selection': ('selection', lambda s: [encode(e[1]) for e in s]), + 'help': ('help', lambda s: [encode(s)]), + } # export fields for field_name, field_def in result['fields'].iteritems(): res_name = name + ',' + field_name - if 'string' in field_def: - source = field_def['string'] - push_translation(module, 'wizard_field', res_name, 0, source.encode('utf8')) - - if 'selection' in field_def: - for key, val in field_def['selection']: - push_translation(module, 'selection', res_name, 0, val.encode('utf8')) + + for fn in def_params: + if fn in field_def: + transtype, modifier = def_params[fn] + for val in modifier(field_def[fn]): + push_translation(module, transtype, res_name, 0, val) # export arch arch = result['arch'] @@ -407,7 +419,7 @@ def trans_generate(lang, modules, dbname=None): elif model=='ir.model.fields': try: - field_name = obj.name + field_name = encode(obj.name) except AttributeError, exc: logger.notifyChannel("db", netsvc.LOG_ERROR, "name error in %s: %s" % (xml_name,str(exc))) continue @@ -416,11 +428,11 @@ def trans_generate(lang, modules, dbname=None): continue field_def = objmodel._columns[field_name] - name = obj.model + "," + field_name - push_translation(module, 'field', name, 0, field_def.string.encode('utf8')) + name = "%s,%s" % (encode(obj.model), field_name) + push_translation(module, 'field', name, 0, encode(field_def.string)) if field_def.help: - push_translation(module, 'help', name, 0, field_def.help.encode('utf8')) + push_translation(module, 'help', name, 0, encode(field_def.help)) if field_def.translate: ids = objmodel.search(cr, uid, []) @@ -434,14 +446,14 @@ def trans_generate(lang, modules, dbname=None): ('res_id', '=', res_id), ]) if not model_data_ids: - push_translation(module, 'model', name, 0, obj_value[field_name]) + push_translation(module, 'model', name, 0, encode(obj_value[field_name])) if hasattr(field_def, 'selection') and isinstance(field_def.selection, (list, tuple)): for key, val in field_def.selection: - push_translation(module, 'selection', name, 0, val.encode('utf8')) + push_translation(module, 'selection', name, 0, encode(val)) elif model=='ir.actions.report.xml': - name = obj.report_name + name = encode(obj.report_name) fname = "" if obj.report_rml: fname = obj.report_rml @@ -462,7 +474,7 @@ def trans_generate(lang, modules, dbname=None): for constraint in pool.get(model)._constraints: msg = constraint[1] - push_translation(module, 'constraint', model, 0, msg.encode('utf8')) + push_translation(module, 'constraint', model, 0, encode(msg)) for field_name,field_def in pool.get(model)._columns.items(): if field_def.translate: @@ -471,7 +483,7 @@ def trans_generate(lang, modules, dbname=None): trad = getattr(obj, field_name) or '' except: trad = '' - push_translation(module, 'model', name, xml_name, trad) + push_translation(module, 'model', name, xml_name, encode(trad)) # parse source code for _() calls def get_module_from_path(path): @@ -497,15 +509,15 @@ def trans_generate(lang, modules, dbname=None): '[^a-zA-Z0-9_]_\([\s]*["\'](.+?)["\'][\s]*\)', code_string, re.M) for i in iter: - push_translation(module, 'code', frelativepath, 0, i.group(1).encode('utf8')) + push_translation(module, 'code', frelativepath, 0, encode(i.group(1))) out = [["module","type","name","res_id","src","value"]] # header # translate strings marked as to be translated for module, type, name, id, source in _to_translate: trans = trans_obj._get_source(cr, uid, name, type, lang, source) - out.append([module, type, name, id, source, trans or '']) - + out.append([module, type, name, id, source, encode(trans) or '']) + cr.close() return out @@ -519,7 +531,7 @@ def trans_load(db_name, filename, lang, strict=False, verbose=True): return r except IOError: if verbose: - logger.notifyChannel("init", netsvc.LOG_ERROR, "couldn't read translation file %s" % (filename,)) # FIXME translate message + logger.notifyChannel("init", netsvc.LOG_ERROR, "couldn't read translation file %s" % (filename,)) return None def trans_load_data(db_name, fileobj, fileformat, lang, strict=False, lang_name=None, verbose=True): diff --git a/bin/wizard/__init__.py b/bin/wizard/__init__.py index fcacf67a476..8996ce0cb80 100644 --- a/bin/wizard/__init__.py +++ b/bin/wizard/__init__.py @@ -113,15 +113,22 @@ class interface(netsvc.Service): if lang: # translate fields for field in fields: - trans = translate(cr, self.wiz_name+','+state+','+field, 'wizard_field', lang) + res_name = "%s,%s,%s" % (self.wiz_name, state, field) + + trans = translate(cr, res_name, 'wizard_field', lang) if trans: fields[field]['string'] = trans if 'selection' in fields[field]: - trans = lambda x: translate(cr, self.wiz_name+','+state+','+field, 'selection', lang, x) or x + trans = lambda x: translate(cr, res_name, 'selection', lang, x) or x for idx, (key, val) in enumerate(fields[field]['selection']): fields[field]['selection'][idx] = (key, trans(val)) + if 'help' in fields[field]: + t = translate(cr, res_name, 'help', lang, fields[field]['help']) + if t: + fields[field]['help'] = t + # translate arch if not isinstance(arch, UpdateableStr): doc = dom.minidom.parseString(arch) diff --git a/setup.py b/setup.py index 125f9e7b2a5..d7de94a7850 100755 --- a/setup.py +++ b/setup.py @@ -32,8 +32,6 @@ import sys import os import glob -from stat import ST_MODE - from distutils.core import setup, Command from distutils.command.install import install