# -*- encoding: utf-8 -*-
##############################################################################
#
-# OpenERP, Open Source Management Solution
+# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
# $Id$
#
import report
import product
import sequence
-
+import company
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
# -*- encoding: utf-8 -*-
##############################################################################
#
-# OpenERP, Open Source Management Solution
+# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
# $Id$
#
'process/statement_process.xml',
'process/customer_invoice_process.xml',
'process/supplier_invoice_process.xml',
- 'sequence_view.xml'
+ 'sequence_view.xml',
+ 'company_view.xml',
],
'demo_xml': [
'account_demo.xml',
#create the account_account for this bank journal
tmp = self.pool.get('res.partner.bank').name_get(cr, uid, [line.acc_no.id])[0][1]
dig = obj_multi.code_digits
- new_code = str(current_num)
if ref_acc_bank.code:
- new_code = str(ref_acc_bank.code.ljust(dig,'0') + str(current_num))
+ try:
+ new_code = str(int(ref_acc_bank.code.ljust(dig,'0')) + current_num)
+ except Exception,e:
+ new_code = str(ref_acc_bank.code.ljust(dig-len(str(current_num)),'0')) + str(current_num)
vals = {
'name': line.acc_no.bank and line.acc_no.bank.name+' '+tmp or tmp,
'currency_id': line.currency_id and line.currency_id.id or False,
<field name="arch" type="xml">
<tree string="Invoice Line">
<field name="name"/>
- <field name="account_id"/>
+ <field name="account_id" groups="base.group_user"/>
<field name="quantity"/>
<field name="uos_id"/>
<field name="price_unit"/>
<field name="discount"/>
<field colspan="4" name="name" select="1"/>
<field colspan="4" name="origin" select="1"/>
- <field domain="[('company_id', '=', parent.company_id), ('journal_id', '=', parent.journal_id), ('type', '<>', 'view')]" name="account_id" on_change="onchange_account_id(parent.fiscal_position,account_id)"/>
- <field domain="[('type','<>','view'), ('company_id', '=', parent.company_id)]" name="account_analytic_id"/>
+ <field domain="[('company_id', '=', parent.company_id), ('journal_id', '=', parent.journal_id), ('type', '<>', 'view')]" name="account_id" on_change="onchange_account_id(parent.fiscal_position,account_id)" groups="base.group_user"/>
+ <field domain="[('type','<>','view'), ('company_id', '=', parent.company_id)]" name="account_analytic_id" groups="base.group_user"/>
<newline/>
<field name="price_subtotal"/>
<field colspan="4" name="invoice_line_tax_id" context="{'type':parent.type}" domain="[('parent_id','=',False),('company_id', '=', parent.company_id)]"/>
<field name="sequence"/>
<field name="manual"/>
<field name="name"/>
- <field name="account_id"/>
+ <field name="account_id" groups="base.group_user"/>
<field name="base"/>
<field name="amount"/>
</tree>
<form string="Manual Invoice Taxes">
<field name="name" select="1"/>
<field name="sequence"/>
- <field name="account_id" select="1"/>
+ <field name="account_id" select="1" groups="base.group_user"/>
<field name="manual" select="1"/>
<field name="amount" select="1"/>
<field name="base" readonly="0"/>
<field name="name"/>
<field name="type"/>
<field name="number"/>
- <field name="partner_id"/>
+ <field name="partner_id" groups="base.group_user"/>
<field name="amount_untaxed" sum="Untaxed amount"/>
<field name="amount_total" sum="Total amount"/>
<field name="currency_id"/>
<field name="arch" type="xml">
<form string="Invoice">
<group colspan="4" col="6">
- <field name="journal_id" select="2"/>
+ <field name="journal_id" select="2" groups="base.group_user"/>
<field name="type" readonly="1" select="2"/>
<field name="number" select="1"/>
- <field name="partner_id" on_change="onchange_partner_id(type,partner_id,date_invoice,payment_term)" select="1"/>
+ <field name="partner_id" on_change="onchange_partner_id(type,partner_id,date_invoice,payment_term)" select="1" groups="base.group_user"/>
<field domain="[('partner_id','=',partner_id)]" name="address_invoice_id"/>
<field name="currency_id" on_change="onchange_currency_id(currency_id)" select="2"/>
<field name="date_invoice" select="1"/>
- <field name="period_id"/>
- <label align="0.0" colspan="2" string="(keep empty to use the current period)"/>
+ <field name="period_id" groups="base.group_user"/>
+ <group colspan="2" col="1" groups="base.group_user">
+ <label align="0.0" string="(keep empty to use the current period)"/>
+ </group>
</group>
<notebook colspan="4">
<page string="Invoice">
- <field domain="[('type','<>','view'), ('company_id', '=', company_id),('journal_id','=',journal_id)]" name="account_id"/>
+ <field domain="[('type','<>','view'), ('company_id', '=', company_id),('journal_id','=',journal_id)]" name="account_id" groups="base.group_user"/>
<field name="name" select="2"/>
<field name="payment_term"/>
<field colspan="4" name="invoice_line" nolabel="1" widget="one2many_list"/>
</field>
</group>
<group col="4" colspan="2">
- <button colspan="2" name="button_reset_taxes" states="draft" string="Compute Taxes" type="object"/>
+ <button colspan="2" name="button_reset_taxes" states="draft" string="Compute Taxes" type="object" groups="base.group_user"/>
<field name="amount_untaxed"/>
<label string="" colspan="2"/>
<field name="amount_tax"/>
<field name="amount_total"/>
<field name="state" select="2"/>
<field name="residual"/>
- <group col="3" colspan="4">
+ <group col="3" colspan="4" groups="base.group_user">
<button name="invoice_proforma2" states="draft" string="PRO-FORMA" icon="gtk-print"/>
<button name="invoice_open" states="draft,proforma2" string="Create" icon="gtk-execute"/>
<button name="invoice_cancel" states="draft,proforma2,sale,open" string="Cancel" icon="gtk-cancel"/>
</page>
<page string="Other Info">
<field name="company_id"/>
- <field name="fiscal_position" groups="base.group_extended"/>
+ <field name="fiscal_position" groups="base.group_extended,base.group_user"/>
<newline/>
<field name="date_due" select="1"/>
<newline/>
<field domain="[('partner_id.ref_companies', 'in', [company_id])]" name="partner_bank" select="2"/>
<field name="origin" select="2"/>
<field colspan="4" domain="[('partner_id','=',partner_id)]" name="address_contact_id"/>
- <field name="move_id"/>
+ <field name="move_id" groups="base.group_user"/>
<separator colspan="4" string="Additionnal Information"/>
<field colspan="4" name="comment" nolabel="1"/>
</page>
<field name="date"/>
<field name="ref"/>
<field name="name"/>
- <field name="journal_id"/>
+ <field name="journal_id" groups="base.group_user"/>
<field name="debit"/>
<field name="credit"/>
</tree>
<openerp>
<data>
- <wizard id="wizard_invoice_refund" model="account.invoice" name="account.invoice.refund" string="Credit Note"/>
+ <wizard id="wizard_invoice_refund" model="account.invoice" name="account.invoice.refund" string="Credit Note" groups="base.group_user"/>
- <wizard id="wizard_invoice_pay" model="account.invoice" name="account.invoice.pay" string="Pay invoice"/>
+ <wizard id="wizard_invoice_pay" model="account.invoice" name="account.invoice.pay" string="Pay invoice" groups="base.group_user"/>
<!-- close year, period, journal -->
<wizard id="wizard_fiscalyear_close" menu="False" model="account.fiscalyear" name="account.fiscalyear.close" string="Generate Fiscal Year Opening Entries"/>
<wizard id="wizard_balance_report" keyword="client_print_multi" model="account.account" name="account.account.balance.report" string="Account Balance"/>
<wizard id="wizard_general_ledger_report" keyword="client_print_multi" model="account.account" name="account.general.ledger.report" string="General Ledger"/>
- <wizard id="wizard_invoice_state_confirm" keyword="client_action_multi" model="account.invoice" multi="True" name="account.invoice.state.confirm" string="Confirm draft invoices"/>
- <wizard id="wizard_invoice_state_cancel" keyword="client_action_multi" model="account.invoice" multi="True" name="account.invoice.state.cancel" string="Cancel selected invoices"/>
+ <wizard id="wizard_invoice_state_confirm" keyword="client_action_multi" model="account.invoice" multi="True" name="account.invoice.state.confirm" string="Confirm draft invoices" groups="base.group_user"/>
+ <wizard id="wizard_invoice_state_cancel" keyword="client_action_multi" model="account.invoice" multi="True" name="account.invoice.state.cancel" string="Cancel selected invoices" groups="base.group_user"/>
<!-- account.move validate -->
<wizard string="Create Entries From Models" model="account.move.line" name="account_use_models" menu="True" id="wizard_line_account_use_model"/>
<!-- account.invoice -->
- <wizard string="Open State" model="account.invoice" name="account.wizard_paid_open" menu="False" id="wizard_paid_open"/>
+ <wizard string="Open State" model="account.invoice" name="account.wizard_paid_open" menu="False" id="wizard_paid_open" groups="base.group_user"/>
<!-- generic report wizard -->
<wizard id="wizard_account_balance_report" menu="False" model="account.account" name="account.account.balance.report" string="Account Balance"/>
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import fields, osv
+
+class res_company(osv.osv):
+ _inherit = "res.company"
+ _columns = {
+ 'overdue_msg' : fields.text('Overdue Payments Message'),
+ }
+
+ _defaults = {
+ 'overdue_msg': lambda *a: 'Would your payment have been carried \
+out after this mail was sent, please consider the present one as \
+void. Do not hesitate to contact our accounting department'
+ }
+res_company()
+
+class company_setup(osv.osv_memory):
+ """
+ Insert Information for a company.
+ Wizard asks for:
+ * A Company with its partner
+ * Insert a suitable message for Overdue Payment Report.
+ """
+ _name='wizard.company.setup'
+
+ _columns = {
+ 'company_id':fields.many2one('res.company','Company',required=True),
+ 'partner_id':fields.many2one('res.partner','Partner'),
+ 'overdue_msg': fields.text('Overdue Payment Message'),
+ }
+ def get_message(self,cr,uid,context={}):
+ company =self.pool.get('res.users').browse(cr,uid,[uid],context)[0].company_id
+ msg = company.overdue_msg
+ phone = company.partner_id.address and (company.partner_id.address[0].phone and ' at ' + str(company.partner_id.address[0].phone) + '.' or '.') or '.'
+ msg += str(phone)
+ return msg
+
+ _defaults = {
+ 'company_id': lambda self, cr, uid, c: self.pool.get('res.users').browse(cr,uid,[uid],c)[0].company_id.id,
+ 'partner_id': lambda self, cr, uid, c: self.pool.get('res.users').browse(cr,uid,[uid],c)[0].company_id.partner_id.id,
+ 'overdue_msg': get_message,
+ }
+
+ def onchange_company_id(self, cr, uid, ids, company, context=None):
+ res = {}
+ if not company:
+ return {}
+ comp_obj = self.pool.get('res.company').browse(cr,uid,company)
+ res['partner_id'] = comp_obj.partner_id.id
+ phone = comp_obj.partner_id.address and (comp_obj.partner_id.address[0].phone and ' at ' + str(comp_obj.partner_id.address[0].phone) + '.' or '.') or '.'
+ res['overdue_msg'] = comp_obj.overdue_msg + str(phone)
+
+ return {'value': res }
+
+ def action_create(self, cr, uid, ids, context=None):
+ content_wiz = self.pool.get('wizard.company.setup').read(cr,uid,ids,['company_id','overdue_msg'])
+ if content_wiz:
+ wiz_data = content_wiz[0]
+ self.pool.get('res.company').write(cr, uid, [wiz_data['company_id']], {'overdue_msg':wiz_data['overdue_msg']})
+
+ return {
+ 'view_type': 'form',
+ "view_mode": 'form',
+ 'res_model': 'ir.actions.configuration.wizard',
+ 'type': 'ir.actions.act_window',
+ 'target':'new',
+ }
+
+ def action_cancel(self,cr,uid,ids,conect=None):
+ return {
+ 'view_type': 'form',
+ "view_mode": 'form',
+ 'res_model': 'ir.actions.configuration.wizard',
+ 'type': 'ir.actions.act_window',
+ 'target':'new',
+ }
+
+company_setup()
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data>
+ <record model="ir.ui.view" id="view_company_inherit_form">
+ <field name="name">res.company.form.inherit</field>
+ <field name="inherit_id" ref="base.view_company_form"/>
+ <field name="model">res.company</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <notebook>
+ <page string="Overdue Payments" position="inside">
+ <separator string="Overdue Payments Message" colspan="4"/>
+ <field name="overdue_msg" nolabel="1" colspan ="4"/>
+ </page>
+ </notebook>
+ </field>
+ </record>
+
+ <!-- Wizard for Configuration of Overdue Payments -->
+
+ <record model="ir.ui.view" id="wizard_company_setup_form">
+ <field name="name">wizard.company.setup.form</field>
+ <field name="model">wizard.company.setup</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <form string="Overdue Payment Report Message">
+ <field name="company_id" select="1" on_change="onchange_company_id(company_id)"/>
+ <field name="partner_id" select="1" readonly="1"/>
+ <separator string="Message" colspan="4"/>
+ <field name="overdue_msg" nolabel="1" colspan="4"/>
+ <group col="2" colspan="4">
+ <button icon="gtk-cancel" special="cancel" type="object" name="action_cancel" string="Cancel"/>
+ <button icon="gtk-ok" name="action_create" string="Create" type="object"/>
+ </group>
+ </form>
+ </field>
+ </record>
+
+ <record id="action_wizard_company_setup_form" model="ir.actions.act_window">
+ <field name="name">Overdue Payment Report Message</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="res_model">wizard.company.setup</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">form</field>
+ <field name="target">new</field>
+ </record>
+
+ <!-- register configuration wizard -->
+
+ <record id="config_wizard_account_base_setup_form" model="ir.actions.todo">
+ <field name="name">Overdue Payment Report Message</field>
+ <field name="note">Specify The Message for the Overdue Payment Report.</field>
+ <field name="action_id" ref="action_wizard_company_setup_form"/>
+ </record>
+ </data>
+</openerp>
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-05 12:12+0000\n"
#. module: account
#: model:ir.actions.act_window,name:account.act_account_acount_move_line_open_unreconciled
msgid "Unreconciled entries"
-msgstr "Ecritures non-lettrées"
+msgstr "Écritures non réconciliées"
#. module: account
#: field:account.invoice.tax,base_code_id:0
#: model:ir.actions.wizard,name:account.wizard_unreconcile_select
#: model:ir.ui.menu,name:account.menu_unreconcile_select
msgid "Unreconcile entries"
-msgstr "Ecritures non-lettrées"
+msgstr "Écritures non réconciliées"
#. module: account
#: constraint:account.period:0
"You should set the journal to allow cancelling entries if you want to do "
"that."
msgstr ""
-"Vous ne pouvez pas modifier une entrée postée dans ce journal !\n"
+"Vous ne pouvez pas modifier une écriture postée dans ce journal !\n"
"Vous devez modifier le journal pour permettre l'annulation des écritures si "
"vous voulez permettre cela."
#. module: account
#: model:ir.ui.menu,name:account.menu_finance_recurrent_entries
msgid "Recurrent Entries"
-msgstr "Ecritures réccurentes"
+msgstr "Écritures réccurentes"
#. module: account
#: field:account.analytic.line,amount:0
#: code:addons/account/account_move_line.py:0
#, python-format
msgid "You can not add/modify entries in a closed journal."
-msgstr "Vous ne pouvez pas ajouter/modifier un journal cloturé."
+msgstr "Vous ne pouvez pas ajouter/modifier les écritures dans un journal cloturé."
#. module: account
#: code:addons/account/account_move_line.py:0
#: model:ir.actions.act_window,name:account.action_bank_statement_tree
#: model:ir.ui.menu,name:account.menu_bank_statement_tree
msgid "Entries by Statements"
-msgstr "Ecritures par état"
+msgstr "Écritures par état"
#. module: account
#: model:process.transition,name:account.process_transition_analyticinvoice0
#. module: account
#: model:ir.actions.wizard,name:account.action_move_journal_line_form_select
msgid "Standard entry"
-msgstr "Entrée standard"
+msgstr "Écriture standard"
#. module: account
#: model:ir.model,name:account.model_wizard_multi_charts_accounts
#. module: account
#: wizard_button:account.subscription.generate,init,generate:0
msgid "Compute Entry Dates"
-msgstr "Calculer les dates d'entrée"
+msgstr "Calculer les dates d'Écriture"
#. module: account
#: code:addons/account/invoice.py:0
#: model:ir.actions.wizard,name:account.wizard_reconcile_unreconcile
#: model:ir.actions.wizard,name:account.wizard_unreconcile
msgid "Unreconcile Entries"
-msgstr "Écritures non lettrées"
+msgstr "Écritures non réconciliées"
#. module: account
#: model:process.node,note:account.process_node_supplierdraftinvoices0
#. module: account
#: model:ir.actions.act_window,name:account.act_account_acount_move_line_reconcile_open
msgid "Reconciled entries"
-msgstr "Ecritures lettrées"
+msgstr "Écritures réconciliées"
#. module: account
#: field:account.invoice,address_contact_id:0
#. module: account
#: model:process.transition,name:account.process_transition_statemententries0
msgid "Statement Entries"
-msgstr "Entrées du relevé"
+msgstr "Écritures du relevé"
#. module: account
#: code:addons/account/wizard/wizard_fiscalyear_close.py:0
#: code:addons/account/account_move_line.py:0
#, python-format
msgid "Some entries are already reconciled !"
-msgstr "Des écritures semblent déjà lettrées !"
+msgstr "Des écritures semblent déjà réconciliées !"
#. module: account
#: wizard_view:account.analytic.account.quantity_cost_ledger.report,init:0
#: model:process.transition,name:account.process_transition_entriesreconcile0
#: model:process.transition,name:account.process_transition_supplierentriesreconcile0
msgid "Entries Reconcile"
-msgstr "Ecritures lettrées"
+msgstr "Écritures réconciliées"
#. module: account
#: help:account.bank.statement.reconcile,total_second_amount:0
msgid ""
"Check this option if you want the user to reconcile entries in this account."
msgstr ""
-"Cochez cette case si vous voulez que l'utilisateur réconcilie les entrées "
+"Cochez cette case si vous voulez que l'utilisateur réconcilie les Écritures "
"dans ce compte."
#. module: account
"accounts."
msgstr ""
"Ce type est utilisé pour différencier les types qui ont un effet spécial "
-"dans Open ERP: les \"vues\" ne peuvent pas posséder d'entrées, "
+"dans Open ERP: les \"vues\" ne peuvent pas posséder d'écriture, "
"\"consolidation\" veut dire les comptes qui peuvent avoir des comptes fils "
"pour les consolidations des multi-sociétés, payable/recevable sont pour les "
"comptes partenaire (pour le calcul des débits/crédits), \"fermé\" pour les "
#. module: account
#: model:process.transition,note:account.process_transition_statemententries0
msgid "From statement, create entries"
-msgstr "Depuis le relevé, créer des entrées"
+msgstr "Depuis le relevé, créer des Écritures"
#. module: account
#: field:account.analytic.account,complete_name:0
"between the date of the creation action or the the date of the creation of "
"the entries plus the partner payment terms."
msgstr ""
-"La date d'échéance de l'entrée générée pour ce modèle. Vous pouvez choisir "
-"entre la date de création de l'action ou la date de création des entrées "
+"La date d'échéance de l'écriture générée pour ce modèle. Vous pouvez choisir "
+"entre la date de création de l'action ou la date de création des écritures "
"plus les conditions de règlement du partenaire."
#. module: account
#. module: account
#: help:account.move.line,move_id:0
msgid "The move of this entry line."
-msgstr "Le mouvement de cette ligne d'entrée."
+msgstr "Le mouvement de cette ligne d'écriture."
#. module: account
#: field:account.invoice.line,uos_id:0
"All draft account entries in this journal and period will be validated. It "
"means you won't be able to modify their accouting fields."
msgstr ""
-"Toutes les entrées de comptes brouillon dans ce journal et cette période "
+"Toutes les écritures de comptes brouillon dans ce journal et cette période "
"seront validées. Cela veut dire que vous ne pourrez plus modifier leurs "
"champs de compte."
"The amount expressed in an optional other currency if it is a multi-currency "
"entry."
msgstr ""
-"Le montant exprimé dans une autre devise optionnelle si c'est une entrée "
+"Le montant exprimé dans une autre devise optionnelle si c'est une écriture "
"multi devise."
#. module: account
#: code:addons/account/invoice.py:0
#, python-format
msgid "Global taxes defined, but are not in invoice lines !"
-msgstr ""
+msgstr "Taxes globales définies, mais elles ne sont pas dans les lignes de facture !"
#. module: account
#: selection:account.config.wizard,period:0
#: code:addons/account/wizard/wizard_fiscalyear_close.py:0
#, python-format
msgid "The old fiscal year does not have any entry to reconcile!"
-msgstr "L'ancienne année fiscale n'a pas d'entrées à réconcilier !"
+msgstr "L'ancienne année fiscale n'a pas d'écriture à réconcilier !"
#. module: account
#: code:addons/account/wizard/wizard_fiscalyear_close.py:0
"You can check this box to mark the entry line as a litigation with the "
"associated partner"
msgstr ""
-"Vous pouvez cocher cette boîte pour marquer la ligne d'entrée comme un "
+"Vous pouvez cocher cette boîte pour marquer la ligne d'écriture comme un "
"litige avec le partenaire associé"
#. module: account
"date for the payment of this entry line."
msgstr ""
"Ce champ est utilisé pour les écritures à payer et à recevoir. Vous pouvez "
-"mettre la date limite pour le règlement de cette ligne d'entrée."
+"mettre la date limite pour le règlement de cette ligne d'écriture."
#. module: account
#: rml:account.tax.code.entries:0
#. module: account
#: help:account.model,name:0
msgid "This is a model for recurring accounting entries"
-msgstr "Ceci est un modèle pour des entrées comptable récurrentes"
+msgstr "Ceci est un modèle pour des écritures comptable récurrentes"
#. module: account
#: wizard_view:account.wizard_paid_open,init:0
#. module: account
#: help:account.model.line,quantity:0
msgid "The optional quantity on entries"
-msgstr "La quantité optionelle des entrées"
+msgstr "La quantité optionelle des écritures"
#. module: account
#: rml:account.third_party_ledger:0
#: model:ir.actions.act_window,name:account.action_account_analytic_journal_tree2
#: model:ir.ui.menu,name:account.account_analytic_journal_entries
msgid "Analytic Entries by Journal"
-msgstr "Entrées analytiques par journal"
+msgstr "Écritures analytiques par journal"
#. module: account
#: model:process.transition,note:account.process_transition_suppliervalidentries0
#: model:process.transition,note:account.process_transition_validentries0
msgid "Valid entries from invoice"
-msgstr "Entrées valides de la Facture"
+msgstr "Écritures valides de la Facture"
#. module: account
#: field:account.account,company_id:0
#. module: account
#: rml:account.analytic.account.analytic.check:0
msgid "General Credit"
-msgstr ""
+msgstr "Crédit Général"
#. module: account
#: code:addons/account/invoice.py:0
"new counterpart but will share the same counterpart. This is used in fiscal "
"year closing."
msgstr ""
-"Cochez cette case pour spécifier que chaque entrée de ce journal ne créera "
+"Cochez cette case pour spécifier que chaque écriture de ce journal ne créera "
"pas une nouvelle contrepartie mais partagera la même contrepartie. Cela est "
"utilisé dans la clôture des années fiscales."
#. module: account
#: wizard_field:account.fiscalyear.close,init,report_name:0
msgid "Name of new entries"
-msgstr "Nom des nouvelles entrées"
+msgstr "Nom des nouvelles écritures"
#. module: account
#: wizard_button:account_use_models,init_form,create:0
#. module: account
#: help:account.move.line,currency_id:0
msgid "The optional other currency if it is a multi-currency entry."
-msgstr "L'autre devise optionelle si c'est une entrée multi devise."
+msgstr "L'autre devise optionelle si c'est une écriture multi devise."
#. module: account
#: view:account.invoice:0
#. module: account
#: model:ir.actions.act_window,name:account.act_account_partner_account_move
msgid "All account entries"
-msgstr "Toutes les entrées de compte"
+msgstr "Toutes les écritures de compte"
#. module: account
#: help:account.invoice.tax,tax_code_id:0
#. module: account
#: field:account.move.reconcile,line_partial_ids:0
msgid "Partial Entry lines"
-msgstr "Lignes d'Entrée Partielle"
+msgstr "Lignes d'Écriture Partielle"
#. module: account
#: help:account.move.line,statement_id:0
#. module: account
#: wizard_button:account.analytic.line,init,open:0
msgid "Open Entries"
-msgstr "Entrées Ouvertes"
+msgstr "Écritures Ouvertes"
#. module: account
#: code:addons/account/account_move_line.py:0
#. module: account
#: field:account.journal,entry_posted:0
msgid "Skip 'Draft' State for Created Entries"
-msgstr "Omettre l'état 'Brouillon' pour les Entrées Créées"
+msgstr "Omettre l'état 'Brouillon' pour les Écritures Créées"
#. module: account
#: model:ir.model,name:account.model_account_tax_template
#. module: account
#: wizard_view:account.move.validate,init:0
msgid "Validate Account Entries"
-msgstr "Valider les Entrées du Compte"
+msgstr "Valider les Écritures du Compte"
#. module: account
#: selection:account.print.journal.report,init,sort_selection:0
#. module: account
#: model:ir.actions.act_window,name:account.action_account_analytic_journal_open_form
msgid "Entries of Open Analytic Journals"
-msgstr "Entrées des Journaux Analytiques Ouverts"
+msgstr "Écritures des Journaux Analytiques Ouverts"
#. module: account
#: view:account.invoice.tax:0
#. module: account
#: wizard_field:account.print.journal.report,init,sort_selection:0
msgid "Entries Sorted By"
-msgstr "Entrées triées par"
+msgstr "Écritures triées par"
#. module: account
#: rml:account.journal.period.print:0
#: model:process.transition,note:account.process_transition_entriesreconcile0
#: model:process.transition,note:account.process_transition_supplierentriesreconcile0
msgid "Reconcile Entries."
-msgstr "Réconcilier les Entrées."
+msgstr "Réconcilier les Écritures."
#. module: account
#: field:account.subscription.line,move_id:0
msgid "Entry"
-msgstr "Entrée"
+msgstr "Écriture"
#. module: account
#: model:process.node,note:account.process_node_paidinvoice0
#. module: account
#: field:account.chart.template,property_account_expense:0
msgid "Expense Account on Product Template"
-msgstr ""
+msgstr "Compte de Dépense sur les Modèles de Produits"
#. module: account
#: rml:account.analytic.account.analytic.check:0
msgid "General Debit"
-msgstr ""
+msgstr "Débit Général"
#. module: account
#: field:account.analytic.account,code:0
msgid ""
"Check this if the user is allowed to reconcile entries in this account."
msgstr ""
-"Cochez cette case si l'utilisateur peut réconcilier les entrées dans ce "
+"Cochez cette case si l'utilisateur peut réconcilier les Écritures dans ce "
"compte."
#. module: account
help="If you use payment terms, the due date will be computed automatically at the generation "\
"of accounting entries. If you keep the payment term and the due date empty, it means direct payment. "\
"The payment term may compute several due dates, for example 50% now, 50% in one month."),
- 'period_id': fields.many2one('account.period', 'Force Period', domain=[('state','<>','done')], help="Keep empty to use the period of the validation(invoice) date."),
+ 'period_id': fields.many2one('account.period', 'Force Period', domain=[('state','<>','done')], help="Keep empty to use the period of the validation(invoice) date.", readonly=True, states={'draft':[('readonly',False)]}),
'account_id': fields.many2one('account.account', 'Account', required=True, readonly=True, states={'draft':[('readonly',False)]}, help="The partner account used for this invoice."),
'invoice_line': fields.one2many('account.invoice.line', 'invoice_id', 'Invoice Lines', readonly=True, states={'draft':[('readonly',False)]}),
'account_id': src_account_id,
'partner_id': invoice.partner_id.id,
'ref':invoice.number,
+ 'date': date,
}
l2 = {
'debit': direction * pay_amount<0 and - direction * pay_amount,
'account_id': pay_account_id,
'partner_id': invoice.partner_id.id,
'ref':invoice.number,
+ 'date': date,
}
if not name:
if 'check_total' in context:
t = context['check_total']
for l in context.get('invoice_line', {}):
- if len(l) >= 3 and l[2]:
+ if isinstance(l, (list, tuple)) and len(l) >= 3 and l[2]:
tax_obj = self.pool.get('account.tax')
p = l[2].get('price_unit', 0) * (1-l[2].get('discount', 0)/100.0)
t = t - (p * l[2].get('quantity'))
'name': fields.char('Fiscal Position', size=64, translate=True, required=True),
'company_id': fields.many2one('res.company', 'Company'),
'account_ids': fields.one2many('account.fiscal.position.account', 'position_id', 'Account Mapping'),
- 'tax_ids': fields.one2many('account.fiscal.position.tax', 'position_id', 'Tax Mapping')
+ 'tax_ids': fields.one2many('account.fiscal.position.tax', 'position_id', 'Tax Mapping'),
+ 'note': fields.text('Notes', translate=True),
}
def map_tax(self, cr, uid, fposition_id, taxes, context={}):
<field name="name" select="1"/>
<field name="company_id"/>
<newline/>
- <field name="tax_ids" colspan="4">
+ <field name="note" colspan="4"/>
+ <field name="tax_ids" colspan="4" widget="one2many_list">
<tree string="Tax Mapping" editable="bottom">
<field name="tax_src_id" domain="[('parent_id','=',False)]"/>
<field name="tax_dest_id" domain="[('parent_id','=',False)]"/>
<field name="tax_dest_id" domain="[('parent_id','=',False)]"/>
</form>
</field>
- <field name="account_ids" colspan="4">
+ <field name="account_ids" colspan="4" widget="one2many_list">
<tree string="Account Mapping" editable="bottom">
<field name="account_src_id"/>
<field name="account_dest_id"/>
<openerp>
<data noupdate="1">
<record id="analytic_absences" model="account.analytic.account">
- <field name="name">Absences</field>
+ <field name="name">Leaves</field>
<field name="code">1</field>
</record>
<record id="analytic_internal" model="account.analytic.account">
<para style="terp_default_2">
<font color="white"> </font>
</para>
+ <blockTable colWidths="128.0,402.0" style="Standard_Outline">
+ <tr>
+ <td>
+ <para style="terp_default_Bold_9">Fiscal Position Remark :</para>
+ </td>
+ <td>
+ <para style="terp_default_9">[[ format(o.fiscal_position and o.fiscal_position.note or removeParentNode('blockTable')) ]]</para>
+ </td>
+ </tr>
+ </blockTable>
+ <para style="terp_default_2">
+ <font color="white"> </font>
+ </para>
+
</story>
</document>
<para style="terp_default_9">
<font color="white"> </font>
</para>
- <para style="terp_default_9">Would your payment have been carried out after this mail was sent, please consider the present one as void. Do not hesitate to contact our accounting departement at +32 81 81 37 00.</para>
+ <para style="terp_default_9">[[ company.overdue_msg ]]</para>
<para style="terp_default_9">
<font color="white"> </font>
</para>
<para style="terp_default_9">
<font color="white"> </font>
</para>
- <blockTable colWidths="57.0,137.0,52.0,72.0,60.0,57.0,56.0,18.0" style="Table1">
+ <blockTable colWidths="56.0,137.0,52.0,72.0,60.0,57.0,56.0,18.0" style="Table1">
<tr>
<td>
<para style="terp_tblheader_Details">Date</para>
</blockTable>
<section>
<para style="terp_default_8">[[repeatIn(getLines(o), 'line') ]]</para>
- <blockTable colWidths="57.0,138.0,52.0,73.0,60.0,57.0,56.0,17.0" style="Table3">
+ <blockTable colWidths="56.0,138.0,52.0,73.0,60.0,57.0,56.0,17.0" style="Table3">
<tr>
<td>
<para style="terp_default_9">[[ formatLang(line['date'],date=True) ]]</para>
})
- def comma_me(self,amount):
-
- if type(amount) is float :
- amount = str('%.2f'%amount)
- else :
- amount = str(amount)
- if (amount == '0'):
- return ' '
- orig = amount
- new = re.sub("^(-?\d+)(\d{3})", "\g<1>'\g<2>", amount)
- if orig == new:
- return new
- else:
- return self.comma_me(new)
def _get_lines(self, based_on,period_list,company_id=False, parent=False, level=0):
res = self._get_codes(based_on,company_id,parent,level,period_list)
i = 0
top_result = []
-
while i < len(res):
res_dict = { 'code' : res[i][1].code,
def _get_general(self, tax_code_id,period_list ,company_id, based_on):
res=[]
period_sql_list = ','.join(map(str, period_list[0][2]))
-
if based_on == 'payments':
self.cr.execute('SELECT SUM(line.tax_amount) AS tax_amount, \
SUM(line.debit) AS debit, \
AND line.account_id = account.id \
AND account.company_id = %s \
AND move.id = line.move_id \
+ AND line.period_id IN ('+ period_sql_list +') \
AND ((invoice.state = %s) \
OR (invoice.id IS NULL)) \
GROUP BY account.id,account.name,account.code', ('draft',tax_code_id,
AND line.tax_code_id = %s \
AND line.account_id = account.id \
AND account.company_id = %s \
+ AND line.period_id IN ('+ period_sql_list +') \
AND account.active \
GROUP BY account.id,account.name,account.code', ('draft',tax_code_id,
company_id))
'target_move': {
'string': 'Target Moves',
'type': 'selection',
- 'selection': [('all','All Entries'),('posted_only','All Posted Entries')],
+ 'selection': [('all','All Entries'),('posted','All Posted Entries')],
'required': True,
'default': lambda *a:"all",
},
result = mod_obj._get_id(cr, uid, 'account', 'action_account_tree')
id = mod_obj.read(cr, uid, [result], ['res_id'])[0]['res_id']
result = act_obj.read(cr, uid, [id], context=context)[0]
- result['context'] = str({'fiscalyear': data['form']['fiscalyear'],'target_move':data['form']['target_move']})
+ result['context'] = str({'fiscalyear': data['form']['fiscalyear'],'state':data['form']['target_move']})
if data['form']['fiscalyear']:
result['name']+=':'+pooler.get_pool(cr.dbname).get('account.fiscalyear').read(cr,uid,[data['form']['fiscalyear']])[0]['code']
return result
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-12 10:58+0000\n"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-12 11:00+0000\n"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-12 12:32+0000\n"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-12 11:29+0000\n"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-12 11:10+0000\n"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2009-05-19 14:36+0000\n"
-"PO-Revision-Date: 2009-06-12 13:12+0000\n"
+"POT-Creation-Date: 2009-04-09 17:23+0000\n"
+"PO-Revision-Date: 2009-07-06 13:02+0000\n"
"Last-Translator: Olivier (OpenERP) <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2009-06-12 13:24+0000\n"
+"X-Launchpad-Export-Date: 2009-07-06 13:16+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account_chart
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-12 13:15+0000\n"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-12 13:09+0000\n"
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
-# * account_report
+# * account_reporting
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2009-05-19 14:22:20+0000\n"
-"PO-Revision-Date: 2009-05-20 10:22:20+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2009-04-09 17:23+0000\n"
+"PO-Revision-Date: 2009-07-06 13:35+0000\n"
+"Last-Translator: Olivier (OpenERP) <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: \n"
-
-#. module: account_report
-#: field:account.report.history,name:0
-#: selection:account.report.report,type:0
-#: model:ir.model,name:account_report.model_account_report_history
-msgid "Indicator"
-msgstr "Indicateur"
-
-#. module: account_report
-#: wizard_field:print.indicators.pdf,init,file:0
-msgid "Select a PDF File"
-msgstr "Sélectionnez un fichier PDF"
-
-#. module: account_report
-#: constraint:ir.actions.act_window:0
-msgid "Invalid model name in the action definition."
-msgstr ""
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "Operators:"
-msgstr "Opérateurs"
-
-#. module: account_report
-#: field:account.report.report,parent_id:0
-msgid "Parent"
-msgstr "Parent"
-
-#. module: account_report
-#: field:account.report.report,disp_graph:0
-msgid "Display As Graph"
-msgstr ""
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "Account Debit:"
-msgstr ""
-
-#. module: account_report
-#: selection:account.report.report,type:0
-msgid "Others"
-msgstr "Autres"
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "balance(['ACCOUNT_CODE',],fiscalyear)"
-msgstr ""
-
-#. module: account_report
-#: rml:print.indicators:0
-msgid "Tabular Summary"
-msgstr "Résumé tabulaire"
-
-#. module: account_report
-#: code:addons/account_report/wizard/wizard_print_indicators.py:0
-#, python-format
-msgid "Please select maximum 8 records to fit the page-width."
-msgstr ""
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "Notes"
-msgstr "Notes"
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "= Goodness Indicator Limit:"
-msgstr ""
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "Very bad"
-msgstr "Très mauvais"
-
-#. module: account_report
-#: field:account.report.history,val:0
-#: field:account.report.report,amount:0
-msgid "Value"
-msgstr "Valeur"
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "= Badness Indicator Limit:"
-msgstr ""
-
-#. module: account_report
-#: view:account.report.report:0
-#: selection:account.report.report,status:0
-msgid "Bad"
-msgstr "Mauvais"
-
-#. module: account_report
-#: wizard_view:print.indicators.pdf,init:0
-msgid "Select the PDF file on which Indicators will be printed."
-msgstr "Sélectionnez le fichier PDF sur lequel les indicateurs seront imprimés."
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "> Goodness Indicator Limit:"
-msgstr ""
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2009-07-06 14:04+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
-#. module: account_report
-#: field:account.report.report,badness_limit:0
-msgid "Badness Indicator Limit"
-msgstr ""
-
-#. module: account_report
-#: selection:account.report.report,status:0
-msgid "Very Bad"
-msgstr "Très mauvais"
+#. module: account_reporting
+#: field:color.rml,code:0
+msgid "code"
+msgstr "code"
-#. module: account_report
-#: model:ir.actions.act_window,name:account_report.account_report_history_record_structure
-msgid "Indicator history"
-msgstr "Historique de l'Indicateur"
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "credit(['ACCOUNT_CODE',],fiscalyear)"
-msgstr ""
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "Report Amount:"
+#. module: account_reporting
+#: 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 !"
-#. module: account_report
-#: model:ir.actions.report.xml,name:account_report.fiscal_statements
-msgid "Fiscal Statements"
-msgstr "Extraits fiscaux"
+#. module: account_reporting
+#: selection:account.report.bs,font_style:0
+msgid "Helvetica-Bold"
+msgstr "Helvetica-Bold"
-#. module: account_report
-#: wizard_button:print.indicators,init,next:0
-msgid "Next"
-msgstr "Suivant"
+#. module: account_reporting
+#: selection:account.report.bs,font_style:0
+msgid "Helvetica"
+msgstr "Helvetica"
-#. module: account_report
-#: model:ir.module.module,shortdesc:account_report.module_meta_information
-msgid "Reporting for accounting"
-msgstr ""
+#. module: account_reporting
+#: field:account.report.bs,note:0
+msgid "Note"
+msgstr "Note"
-#. module: account_report
-#: wizard_button:print.indicators,next,print:0
-#: wizard_button:print.indicators.pdf,init,print:0
-msgid "Print"
-msgstr "Imprimer"
-
-#. module: account_report
-#: field:account.report.report,type:0
-msgid "Type"
-msgstr "Type"
-
-#. module: account_report
-#: model:ir.actions.report.xml,name:account_report.report_indicator_pdf
-msgid "Print Indicators in PDF"
-msgstr "Imprimer les Indicateurs dans le fichier PDF"
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "Account Tax Code:"
+#. module: account_reporting
+#: field:account.report.bs,report_type:0
+msgid "Report Type"
+msgstr "Type de Rapport"
+
+#. module: account_reporting
+#: model:ir.ui.menu,name:account_reporting.action_account_report_bs_form
+#: model:ir.ui.menu,name:account_reporting.menu_finan_config_BSheet
+msgid "Balance Sheet Report"
+msgstr "Rapport de bilan"
+
+#. module: account_reporting
+#: selection:account.report.bs,font_style:0
+msgid "Courier"
+msgstr "Courier"
+
+#. module: account_reporting
+#: selection:account.report.bs,font_style:0
+msgid "Courier-BoldOblique"
+msgstr "Courier-BoldOblique"
+
+#. module: account_reporting
+#: wizard_button:account.account.balancesheet.report,init,report:0
+msgid "Print BalanceSheet"
+msgstr "Impression du bilan"
+
+#. module: account_reporting
+#: help:account.account.balancesheet.report,init,periods:0
+msgid "All periods if empty"
+msgstr "Toutes les périodes si vide"
+
+#. module: account_reporting
+#: field:account.report.bs,color_font:0
+msgid "Font Color"
+msgstr "Couleur de la police"
+
+#. module: account_reporting
+#: selection:account.report.bs,report_type:0
+msgid "Report Objects With Accounts and child of Accounts"
+msgstr "Rapport des objets avec les comptes et les comptes fils"
+
+#. module: account_reporting
+#: model:ir.module.module,description:account_reporting.module_meta_information
+msgid ""
+"Financial and accounting reporting\n"
+" Balance Sheet Report"
msgstr ""
+"Rapports financiers et comptables \n"
+" Rapport de bilan"
-#. module: account_report
-#: view:account.report.report:0
-#: selection:account.report.report,status:0
-msgid "Good"
-msgstr "Bon"
-
-#. module: account_report
-#: code:addons/account_report/account.py:0
-#, python-format
-msgid "Error !"
-msgstr "Erreur !"
-
-#. module: account_report
-#: view:account.report.history:0
-msgid "Account Report History"
-msgstr ""
+#. module: account_reporting
+#: selection:account.report.bs,font_style:0
+msgid "Courier-Oblique"
+msgstr "Courier-Oblique"
-#. module: account_report
+#. module: account_reporting
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "XML non valide pour l'architecture de la vue"
-#. module: account_report
-#: help:account.report.report,badness_limit:0
-msgid "This Value sets the limit of badness."
-msgstr ""
-
-#. module: account_report
-#: wizard_field:print.indicators,init,select_base:0
-msgid "Choose Criteria"
-msgstr "Choisissez les critères"
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "debit(['ACCOUNT_CODE',],fiscalyear)"
-msgstr ""
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "Account Credit:"
-msgstr ""
-
-#. module: account_report
-#: wizard_view:print.indicators,init:0
-msgid "Select the criteria based on which Indicators will be printed."
-msgstr "Sélectionnez les critères sur lesquels seront basés les indicateurs à imprimer."
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "< Badness Indicator Limit:"
-msgstr ""
-
-#. module: account_report
-#: view:account.report.report:0
-#: selection:account.report.report,status:0
-msgid "Very Good"
-msgstr "Très bien"
-
-#. module: account_report
-#: field:account.report.report,note:0
-msgid "Note"
-msgstr "Note"
-
-#. module: account_report
-#: rml:accounting.report:0
-#: rml:print.indicators:0
-msgid "Currency:"
-msgstr "Devise"
-
-#. module: account_report
-#: field:account.report.report,status:0
-msgid "Status"
-msgstr "Status"
-
-#. module: account_report
-#: help:account.report.report,disp_tree:0
-msgid "When the indicators are printed, if one indicator is set with this field to True, then it will display one more graphs with all its children in tree"
-msgstr ""
-
-#. module: account_report
-#: selection:account.report.report,status:0
-msgid "Normal"
-msgstr "Normal"
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "Example: (balance(['6','45'],-1) - credit(['7'])) / report('RPT1')"
-msgstr ""
-
-#. module: account_report
-#: field:account.report.report,active:0
-msgid "Active"
-msgstr "Actif"
-
-#. module: account_report
-#: field:account.report.report,disp_tree:0
-msgid "Display Tree"
-msgstr ""
-
-#. module: account_report
-#: selection:print.indicators,init,select_base:0
-msgid "Based On Fiscal Years"
-msgstr "Basé sur les Années Fiscales"
+#. module: account_reporting
+#: field:account.report.bs,name:0
+#: field:color.rml,name:0
+msgid "Name"
+msgstr "Nom"
-#. module: account_report
-#: model:ir.model,name:account_report.model_account_report_report
+#. module: account_reporting
+#: view:account.report.bs:0
msgid "Account reporting"
msgstr "Rapport de compte"
-#. module: account_report
-#: view:account.report.report:0
-msgid "Account Balance:"
-msgstr ""
+#. module: account_reporting
+#: model:ir.ui.menu,name:account_reporting.bs_report_action_form
+msgid "Balance Sheet Report Form"
+msgstr "Formulaire du rapport de bilan"
+
+#. module: account_reporting
+#: view:account.report.bs:0
+msgid "Notes"
+msgstr "Notes"
-#. module: account_report
-#: rml:print.indicators:0
-msgid "Expression :"
-msgstr "Expression :"
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "report('REPORT_CODE')"
-msgstr "Rapport comptable"
-
-#. module: account_report
-#: field:account.report.report,expression:0
-msgid "Expression"
-msgstr "Expression"
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "Accounting reporting"
-msgstr "Rapport comptable"
-
-#. module: account_report
-#: model:ir.actions.act_window,name:account_report.action_account_report_form
-#: model:ir.ui.menu,name:account_report.menu_action_account_report_form
-msgid "New Reporting Item Formula"
-msgstr "Nouvelle formule"
-
-#. module: account_report
-#: field:account.report.report,code:0
-#: rml:accounting.report:0
+#. module: account_reporting
+#: selection:account.report.bs,font_style:0
+msgid "Times-BoldItalic"
+msgstr "Times-BoldItalic"
+
+#. module: account_reporting
+#: model:ir.model,name:account_reporting.model_account_report_bs
+msgid "Account reporting for Balance Sheet"
+msgstr "Rapports des comptes pour le bilan"
+
+#. module: account_reporting
+#: selection:account.report.bs,font_style:0
+msgid "Courier-Bold"
+msgstr "Courier-Bold"
+
+#. module: account_reporting
+#: selection:account.report.bs,font_style:0
+msgid "Times-Italic"
+msgstr "Times-Italic"
+
+#. module: account_reporting
+#: selection:account.report.bs,report_type:0
+msgid "Report Objects Only"
+msgstr "Rapport sur les objets seulement"
+
+#. module: account_reporting
+#: model:ir.model,name:account_reporting.model_color_rml
+msgid "Rml Colors"
+msgstr "Couleurs RML"
+
+#. module: account_reporting
+#: model:ir.module.module,shortdesc:account_reporting.module_meta_information
+msgid "Reporting of Balancesheet for accounting"
+msgstr "Rapport sur bilan pour la comptabilité"
+
+#. module: account_reporting
+#: field:account.report.bs,code:0
msgid "Code"
msgstr "Code"
-#. module: account_report
-#: field:account.report.history,tmp:0
-msgid "temp"
-msgstr ""
+#. module: account_reporting
+#: field:account.report.bs,parent_id:0
+msgid "Parent"
+msgstr "Parent"
-#. module: account_report
-#: field:account.report.history,period_id:0
-msgid "Period"
-msgstr "Période"
+#. module: account_reporting
+#: field:account.report.bs,sequence:0
+msgid "Sequence"
+msgstr "Séquence"
+
+#. module: account_reporting
+#: selection:account.report.bs,font_style:0
+msgid "Times-Bold"
+msgstr "Times-Bold"
-#. module: account_report
-#: view:account.report.report:0
+#. module: account_reporting
+#: view:account.report.bs:0
msgid "General"
msgstr "Général"
-#. module: account_report
-#: view:account.report.report:0
-msgid "Legend of operators"
-msgstr "Légende des opérateurs"
+#. module: account_reporting
+#: wizard_field:account.account.balancesheet.report,init,fiscalyear:0
+msgid "Fiscal year"
+msgstr "Année fiscale"
+
+#. module: account_reporting
+#: view:account.report.bs:0
+#: field:account.report.bs,account_id:0
+msgid "Accounts"
+msgstr "Comptes"
+
+#. module: account_reporting
+#: wizard_field:account.account.balancesheet.report,init,periods:0
+msgid "Periods"
+msgstr "Périodes"
+
+#. module: account_reporting
+#: field:account.report.bs,color_back:0
+msgid "Back Color"
+msgstr "Couleur de fond"
+
+#. module: account_reporting
+#: field:account.report.bs,child_id:0
+msgid "Children"
+msgstr "Fils"
-#. module: account_report
-#: wizard_button:print.indicators,init,end:0
-#: wizard_button:print.indicators,next,end:0
-#: wizard_button:print.indicators.pdf,init,end:0
+#. module: account_reporting
+#: wizard_button:account.account.balancesheet.report,init,end:0
msgid "Cancel"
msgstr "Annuler"
-#. module: account_report
-#: field:account.report.report,child_ids:0
-msgid "Children"
-msgstr ""
-
-#. module: account_report
-#: 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 !"
-
-#. module: account_report
-#: help:account.report.report,goodness_limit:0
-msgid "This Value sets the limit of goodness."
-msgstr ""
-
-#. module: account_report
-#: model:ir.actions.wizard,name:account_report.wizard_print_indicators
-#: model:ir.ui.menu,name:account_report.menu_wizard_print_indicators
-#: wizard_view:print.indicators,init:0
-#: wizard_view:print.indicators,next:0
-msgid "Print Indicators"
-msgstr "Imprimer les Indicateurs"
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "+ - * / ( )"
-msgstr "+ - * / ( )"
-
-#. module: account_report
-#: rml:accounting.report:0
-#: rml:print.indicators:0
-msgid "Printing date:"
-msgstr "Date d'impression"
-
-#. module: account_report
-#: model:ir.actions.wizard,name:account_report.wizard_indicators_with_pdf
-msgid "Indicators in PDF"
-msgstr "Indicateurs en PDF"
-
-#. module: account_report
-#: rml:accounting.report:0
-#: rml:print.indicators:0
-msgid "at"
-msgstr "à"
-
-#. module: account_report
-#: rml:accounting.report:0
-msgid "Accounting Report"
-msgstr "Rapport comptable"
-
-#. module: account_report
-#: field:account.report.report,goodness_limit:0
-msgid "Goodness Indicator Limit"
-msgstr ""
-
-#. module: account_report
-#: model:ir.actions.act_window,name:account_report.action_account_report_tree_view_other
-#: model:ir.ui.menu,name:account_report.menu_action_account_report_tree_view_other
-msgid "Other reports"
-msgstr ""
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "Note: The second arguement 'fiscalyear' and 'period' are optional arguements.If the value is -1,previous fiscalyear or period is considered."
-msgstr ""
-
-#. module: account_report
-#: rml:print.indicators:0
-msgid ")"
-msgstr ")"
-
-#. module: account_report
-#: model:ir.actions.act_window,name:account_report.action_account_report_tree_view_fiscal
-#: model:ir.ui.menu,name:account_report.menu_action_account_report_tree_view_fiscal
-msgid "Fiscal Statements reporting"
-msgstr "Rapport des extraits fiscaux"
-
-#. module: account_report
-#: selection:print.indicators,init,select_base:0
-msgid "Based on Fiscal Periods"
-msgstr "Basé sur les Périodes Fiscales"
-
-#. module: account_report
-#: model:ir.actions.report.xml,name:account_report.report_print_indicators
-#: rml:print.indicators:0
-msgid "Indicators"
-msgstr "Indicateurs"
-
-#. module: account_report
-#: wizard_view:print.indicators.pdf,init:0
-msgid "Print Indicators with PDF"
-msgstr "Imprimer les Indicateurs dans le fichier PDF"
-
-#. module: account_report
-#: model:ir.actions.act_window,name:account_report.action_account_report_tree_view_indicator
-#: model:ir.ui.menu,name:account_report.menu_action_account_report_tree_view_indicator
-msgid "Indicators reporting"
-msgstr "Rapport d'indicateurs"
-
-#. module: account_report
-#: field:account.report.report,name:0
-#: rml:accounting.report:0
-#: rml:print.indicators:0
-msgid "Name"
-msgstr "Nom"
-
-#. module: account_report
-#: wizard_field:print.indicators,next,base_selection:0
-msgid "Select Criteria"
-msgstr "Sélectionnez les critères"
-
-#. module: account_report
-#: code:addons/account_report/account.py:0
-#, python-format
-msgid "You cannot delete an indicator history record. You may have to delete the concerned Indicator!"
-msgstr "Vous ne pouvez pas supprimer un enregistrement de l'historique d'un indicateur. Vous devez supprimer l'Indicateur concerné."
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "tax_code(['ACCOUNT_TAX_CODE',],period)"
-msgstr ""
-
-#. module: account_report
-#: field:account.report.history,fiscalyear_id:0
-msgid "Fiscal Year"
-msgstr "Année Fiscale"
-
-#. module: account_report
-#: model:ir.actions.act_window,name:account_report.action_account_report_tree
-#: model:ir.actions.act_window,name:account_report.action_account_report_tree_view
-#: model:ir.ui.menu,name:account_report.menu_action_account_report_tree_define
-#: model:ir.ui.menu,name:account_report.menu_action_account_report_tree_view
-msgid "Custom reporting"
-msgstr "Personnaliser un rapport"
-
-#. module: account_report
-#: code:addons/account_report/wizard/wizard_print_indicators.py:0
-#, python-format
-msgid "User Error!"
-msgstr ""
-
-#. module: account_report
-#: rml:print.indicators:0
-msgid "Page"
-msgstr "Page"
-
-#. module: account_report
-#: selection:account.report.report,type:0
-msgid "View"
-msgstr "Vue"
-
-#. module: account_report
-#: rml:print.indicators:0
-msgid "Indicators -"
-msgstr "Indicateurs -"
-
-#. module: account_report
-#: help:account.report.report,disp_graph:0
-msgid "If the field is set to True, information will be printed as a Graph, otherwise as an array."
-msgstr ""
-
-#. module: account_report
-#: view:account.report.report:0
-msgid "Return value for status"
-msgstr "Valeur de retour pour status"
-
-#. module: account_report
-#: field:account.report.report,sequence:0
-msgid "Sequence"
-msgstr "Séquence"
-
-#. module: account_report
-#: rml:accounting.report:0
-msgid "Amount"
-msgstr "Montant"
-
-#. module: account_report
-#: rml:print.indicators:0
-msgid "1cm 27.7cm 20cm 27.7cm"
-msgstr "1cm 27.7cm 20cm 27.7cm"
-
-#. module: account_report
-#: model:ir.module.module,description:account_report.module_meta_information
-msgid "Financial and accounting reporting\n"
-" Fiscal statements\n"
-" Indicators\n"
-" "
-msgstr ""
-
-#. module: account_report
-#: selection:account.report.report,type:0
-msgid "Fiscal Statement"
-msgstr ""
-
+#. module: account_reporting
+#: selection:account.report.bs,font_style:0
+msgid "Times-Roman"
+msgstr "Times-Roman"
+
+#. module: account_reporting
+#: selection:account.report.bs,font_style:0
+msgid "Helvetica-Oblique"
+msgstr "Helvetica-Oblique"
+
+#. module: account_reporting
+#: field:account.report.bs,font_style:0
+msgid "Font"
+msgstr "Police"
+
+#. module: account_reporting
+#: wizard_view:account.account.balancesheet.report,init:0
+msgid "Customize Report"
+msgstr "Personnaliser le Rapport"
+
+#. module: account_reporting
+#: selection:account.report.bs,report_type:0
+msgid "Report Objects With Accounts"
+msgstr "Rapport des objets avec les comptes"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-12 13:37+0000\n"
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_form"/>
<field name="arch" type="xml">
- <field colspan="4" name="invoice_line" nolabel="1" widget="one2many_list" position="before">
+ <field name="payment_term" position="after">
<field name="price_type"/>
</field>
</field>
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-12 13:38+0000\n"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2009-05-19 14:36+0000\n"
-"PO-Revision-Date: 2009-06-12 13:22+0000\n"
+"POT-Creation-Date: 2009-04-09 17:23+0000\n"
+"PO-Revision-Date: 2009-07-06 13:05+0000\n"
"Last-Translator: Olivier (OpenERP) <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2009-06-12 13:40+0000\n"
+"X-Launchpad-Export-Date: 2009-07-06 13:28+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: base_iban
msgstr "IBAN"
#. module: base_iban
-#: model:ir.module.module,shortdesc:base_iban.module_meta_information
-#: field:res.partner.bank,iban:0
-msgid "IBAN"
-msgstr "IBAN"
-
-#. module: base_iban
#: model:res.partner.bank.type,name:base_iban.bank_iban
msgid "IBAN Account"
msgstr "No IBAN du compte"
#: model:res.partner.bank.type.field,name:base_iban.bank_acc_number_field
msgid "acc_number"
msgstr "acc_number"
+
+#. module: base_iban
+#: model:ir.module.module,shortdesc:base_iban.module_meta_information
+#: field:res.partner.bank,iban:0
+msgid "IBAN"
+msgstr "IBAN"
--- /dev/null
+This module provide a generic framework to define your own quality test.
+
+
+All you have to do is to:
+* create a folder with your test in 'base_module_quality' (e.g: mkdir base_module_quality\mytest)
+* create a .py file in it with same name as the folder you just created (e.g: touch base_module_quality\mytest\mytest.py)
+* edit your file and define a class 'quality_check' that
+ * inherits the class 'abstract_quality_test' (defined in base_module_quality.py)
+ * implements the __init__() method accordingly to what you want to test.
+
+
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import base_module_quality
+import wizard
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+
+{
+ 'name': 'Base module quality',
+ 'version': '1.0',
+ 'category': 'Tiny Specific Modules/Base module quality',
+ 'description': """
+This module's aim is to check the quality of other modules.
+
+It defines a wizard on the list of modules in OpenERP, which allow you to
+evaluate them on different criteria such as: the respect of OpenERP coding
+standards, the speed efficiency...
+
+This module also provides generic framework to define your own quality test.
+For further info, coders may take a look into base_module_quality\README.txt
+
+WARNING: This module can not work as a ZIP file, you must unzip it before
+using it, otherwise it may crash.
+ """,
+ 'author': 'Tiny',
+ 'website': 'http://www.openerp.com',
+ 'depends': ['base'],
+ 'init_xml': [],
+ 'update_xml': ['base_module_quality_wizard.xml', 'base_module_quality_view.xml', 'security/ir.model.access.csv'],
+ 'demo_xml': [],
+ 'installable': True,
+ 'active': False,
+ 'certificate': '0175119475677',
+}
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+import os
+
+import pooler
+import osv
+import tools
+from tools import config
+from tools.translate import _
+from osv import osv, fields
+
+class abstract_quality_check(object):
+ '''
+ This Class provides...
+ '''
+
+ def __init__(self):
+ '''
+ this method should initialize the var
+ '''
+ #This float have to store the rating of the module.
+ #Used to compute the final score (average of all scores).
+ #0 <= self.score <= 1
+ self.score = 0.0
+
+ #This char have to store the name of the test.
+ self.name = ""
+
+ #This char have to store the aim of the test and eventually a note.
+ self.note = ""
+
+ #This char have to store the result.
+ #Used to display the result of the test.
+ self.result = ""
+
+ #This char have to store the result with more details.
+ #Used to provide more details if necessary.
+ self.result_details = ""
+
+ # This boolean variable defines that if you do not want to calculate score and just only need detail
+ # or summary report for some test then you will make it False.
+ self.bool_count_score = True
+
+ #This bool defines if the test can be run only if the module
+ #is installed.
+ #True => the module have to be installed.
+ #False => the module can be uninstalled.
+ self.bool_installed_only = True
+
+ #This variable is used to give result of test more weight,
+ #because some tests are more critical than others.
+ self.ponderation = 1.0
+
+ #Specify test got an error on module
+ self.error = False
+
+ #The tests have to subscribe itselfs in this list, that contains
+ #all the test that have to be performed.
+ self.tests = []
+ self.list_folders = os.listdir(config['addons_path'] +
+ '/base_module_quality/')
+ for item in self.list_folders:
+ self.item = item
+ path = config['addons_path']+'/base_module_quality/'+item
+ if os.path.exists(path + '/' + item + '.py') and item not in ['report', 'wizard', 'security']:
+ item2 = 'base_module_quality.' + item +'.' + item
+ x_module = __import__(item2)
+ x_file = getattr(x_module, item)
+ x_obj = getattr(x_file, item)
+ self.tests.append(x_obj)
+# raise 'Not Implemented'
+
+ def run_test(self, cr, uid, module_path=""):
+ '''
+ this method should do the test and fill the score, result and result_details var
+ '''
+ raise osv.except_osv(_('Programming Error'), _('Test Is Not Implemented'))
+
+ def get_objects(self, cr, uid, module):
+ # This function returns all object of the given module..
+ pool = pooler.get_pool(cr.dbname)
+ ids2 = pool.get('ir.model.data').search(cr, uid,
+ [('module', '=', module), ('model', '=', 'ir.model')])
+ model_list = []
+ model_data = pool.get('ir.model.data').browse(cr, uid, ids2)
+ for model in model_data:
+ model_list.append(model.res_id)
+ obj_list = []
+ for mod in pool.get('ir.model').browse(cr, uid, model_list):
+ obj_list.append(str(mod.model))
+ return obj_list
+
+ def get_model_ids(self, cr, uid, models=[]):
+ # This function returns all ids of the given objects..
+ if not models:
+ return []
+ pool = pooler.get_pool(cr.dbname)
+ return pool.get('ir.model').search(cr, uid, [('model', 'in', models)])
+
+ def get_ids(self, cr, uid, object_list):
+ #This method return dictionary with ids of records of object for module
+ pool = pooler.get_pool(cr.dbname)
+ result_ids = {}
+ for obj in object_list:
+ ids = pool.get(obj).search(cr, uid, [])
+ ids = filter(lambda id: id != None, ids)
+ result_ids[obj] = ids
+ return result_ids
+
+ def format_table(self, header=[], data_list={}): #This function can work forwidget="text_wiki"
+ detail = ""
+ detail += (header[0]) % tuple(header[1])
+ frow = '\n|-'
+ for i in header[1]:
+ frow += '\n| %s'
+ for key, value in data_list.items():
+ detail += (frow) % tuple(value)
+ detail = detail + '\n|}'
+ return detail
+
+ def format_html_table(self, header=[], data_list=[]): #This function can work for widget="html_tag"
+ # function create html table....
+ detail = ""
+ detail += (header[0]) % tuple(header[1])
+ frow = '<tr>'
+ for i in header[1]:
+ frow += '<td>%s</td>'
+ frow += '</tr>'
+ for key, value in data_list.items():
+ detail += (frow) % tuple(value)
+ return detail
+
+ def add_quatation(self, x_no, y_no):
+ return x_no/y_no
+
+class module_quality_check(osv.osv):
+ _name = 'module.quality.check'
+ _columns = {
+ 'name': fields.char('Rated Module', size=64, ),
+ 'final_score': fields.char('Final Score (%)', size=10,),
+ 'check_detail_ids': fields.one2many('module.quality.detail', 'quality_check_id', 'Tests',)
+ }
+
+ def check_quality(self, cr, uid, module_name, module_state=None):
+ '''
+ This function will calculate score of openerp module
+ It will return data in below format:
+ Format: {'final_score':'80.50', 'name': 'sale',
+ 'check_detail_ids':
+ [(0,0,{'name':'workflow_test', 'score':'100', 'ponderation':'0', 'summary': text_wiki format data, 'detail': html format data, 'state':'done', 'note':'XXXX'}),
+ ((0,0,{'name':'terp_test', 'score':'60', 'ponderation':'1', 'summary': text_wiki format data, 'detail': html format data, 'state':'done', 'note':'terp desctioption'}),
+ ..........]}
+ So here the detail result is in html format and summary will be in text_wiki format.
+ '''
+ #list_folders = os.listdir(config['addons_path']+'/base_module_quality/')
+ pool = pooler.get_pool(cr.dbname)
+ obj_module = pool.get('ir.module.module')
+ if not module_state:
+ module_id = obj_module.search(cr, uid, [('name', '=', module_name)])
+ if module_id:
+ module_state = obj_module.browse(cr, uid, module_id[0]).state
+
+ abstract_obj = abstract_quality_check()
+ score_sum = 0.0
+ ponderation_sum = 0.0
+ create_ids = []
+ for test in abstract_obj.tests:
+ ad = tools.config['addons_path']
+ if module_name == 'base':
+ ad = tools.config['root_path']+'/addons'
+ module_path = os.path.join(ad, module_name)
+ val = test.quality_test()
+ if not val.bool_installed_only or module_state == "installed":
+ val.run_test(cr, uid, str(module_path))
+ if not val.error:
+ data = {
+ 'name': val.name,
+ 'score': val.score * 100,
+ 'ponderation': val.ponderation,
+ 'summary': val.result,
+ 'detail': val.result_details,
+ 'state': 'done',
+ 'note': val.note,
+ }
+ if val.bool_count_score:
+ score_sum += val.score * val.ponderation
+ ponderation_sum += val.ponderation
+ else:
+ data = {
+ 'name': val.name,
+ 'score': 0,
+ 'summary': val.result,
+ 'state': 'skipped',
+ 'note': val.note,
+ }
+ else:
+ data = {
+ 'name': val.name,
+ 'note': val.note,
+ 'score': 0,
+ 'state': 'skipped',
+ 'summary': _("The module has to be installed before running this test.")
+ }
+ create_ids.append((0, 0, data))
+
+ final_score = '%.2f' % (score_sum / ponderation_sum * 100)
+ data = {
+ 'name': module_name,
+ 'final_score': final_score,
+ 'check_detail_ids' : create_ids,
+ }
+ return data
+
+module_quality_check()
+
+class module_quality_detail(osv.osv):
+ _name = 'module.quality.detail'
+ _columns = {
+ 'quality_check_id': fields.many2one('module.quality.check', 'Quality'),
+ 'name': fields.char('Name',size=128,),
+ 'score': fields.float('Score (%)'),
+ 'ponderation': fields.float('Ponderation', help='Some tests are more critical than others, so they have a bigger weight in the computation of final rating'),
+ 'note': fields.text('Note',),
+ 'summary': fields.text('Summary'),
+ 'detail': fields.text('Details'),
+ 'state': fields.selection([('done','Done'),('skipped','Skipped'),], 'State', size=6, help='The test will be completed only if the module is installed or if the test may be processed on uninstalled module.'),
+ }
+
+module_quality_detail()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data>
+ <record id="view_wizard_quality_check_tree" model="ir.ui.view">
+ <field name="name">Results of Quality Checks</field>
+ <field name="model">module.quality.check</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <tree string="Result">
+ <field name="name"/>
+ <field name="final_score"/>
+ </tree>
+ </field>
+ </record>
+
+ <record id="view_wizard_quality_check_form" model="ir.ui.view">
+ <field name="name">Results of Quality Checks</field>
+ <field name="model">module.quality.check</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <form string="Result">
+ <field name="name" readonly="1" search="1"/>
+ <field name="final_score" readonly="1" search="1"/>
+ <separator colspan="4" string="Tests"/>
+ <field name="check_detail_ids" nolabel="1" colspan="4" height="350" width="800" readonly="1">
+ </field>
+ </form>
+ </field>
+ </record>
+ <record id="view_wizard_quality_detail_form" model="ir.ui.view">
+ <field name="name">Results of Quality Checks with detail</field>
+ <field name="model">module.quality.detail</field>
+ <field name="type">form</field>
+ <field name="arch" type="xml">
+ <form string="Result">
+ <notebook>
+ <page string="Summary">
+ <field name="name" readonly="1"/>
+ <field name="score" readonly="1"/>
+ <field name="note" readonly="1" colspan="4"/>
+ <field name="summary" widget="text_wiki" nolabel="1" colspan="4" height="350" width="800" readonly="1"/>
+
+ <field name="ponderation" readonly="1"/>
+ <field name="state" readonly="1"/>
+ </page>
+ <page string="Detail">
+ <button name="%(quality_detail_save)d" string="Save Report" type="action"/>
+ <field name="detail" widget="text_html" nolabel="1" colspan="4" readonly="1"/>
+ </page>
+ </notebook>
+ </form>
+ </field>
+ </record>
+
+ <record id="view_wizard_quality_detail_tree" model="ir.ui.view">
+ <field name="name">Results of Quality Checks with detail</field>
+ <field name="model">module.quality.detail</field>
+ <field name="type">tree</field>
+ <field name="arch" type="xml">
+ <tree string="Result" limit="80" min_rows="9" >
+ <field name="name" required="1"/>
+ <field name="state"/>
+ <field name="score" required="1"/>
+ <field name="ponderation"/>
+ </tree>
+ </field>
+ </record>
+
+ </data>
+</openerp>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data>
+ <wizard id="quality_detail_save" model="ir.module.module" name="quality_detail_save" string="Report Save" menu="False"/>
+
+ <wizard string="Quality Check"
+ model="ir.module.module"
+ name="create_quality_check_wiz"
+ id="create_quality_check_id"
+ menu="True"/>
+ </data>
+</openerp>
\ No newline at end of file
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:00:15+0000\n"
+"PO-Revision-Date: 2009-01-03 02:00:15+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:18:25+0000\n"
+"PO-Revision-Date: 2009-01-03 02:18:25+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:quality.check.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:quality.check.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr ""
+
+#. module: base_module_quality
+#: field:quality.check.detail,detail:0
+#: view:quality.check.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:wizard.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "quality.check.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:wizard.quality.check:0
+#: view:quality.check.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "wizard.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:wizard.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:quality.check.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:00:56+0000\n"
+"PO-Revision-Date: 2009-01-03 02:00:56+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr "Невалиден XML за преглед на архитектурата"
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr "Името на обекта трябва да започва с \"x_\" и да не съдържа никакви специални символи!"
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:17:41+0000\n"
+"PO-Revision-Date: 2009-01-03 02:17:41+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr "Neodgovarajući XML za arhitekturu prikaza!"
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:01:35+0000\n"
+"PO-Revision-Date: 2009-01-03 02:01:35+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr "XML invàlid per a la definició de la vista!"
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr "El nom de l'objecte ha de començar amb x_ i no contenir cap caràcter especial!"
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:04:15+0000\n"
+"PO-Revision-Date: 2009-01-03 02:04:15+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:06:58+0000\n"
+"PO-Revision-Date: 2009-01-03 02:06:58+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:13:59+0000\n"
+"PO-Revision-Date: 2009-01-03 02:13:59+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:14:45+0000\n"
+"PO-Revision-Date: 2009-01-03 02:14:45+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr "¡XML inválido para la definición de la vista!"
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr "¡El nombre del objeto debe empezar con x_ y no contener ningún carácter especial!"
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:05:36+0000\n"
+"PO-Revision-Date: 2009-01-03 02:05:36+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr "Vigane vaate arhitektuuri XML!"
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr "Objekti nimi peab algama x_'ga ja ei tohi sisaldada ühtegi erisümbolit !"
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.1\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:06:17+0000\n"
+"PO-Revision-Date: 2009-01-03 02:06:17+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr "XML non valide pour l'architecture de la vue"
+
+#. module: base_module_quality
+#: 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 !"
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:03:35+0000\n"
+"PO-Revision-Date: 2009-01-03 02:03:35+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:07:39+0000\n"
+"PO-Revision-Date: 2009-01-03 02:07:39+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:08:21+0000\n"
+"PO-Revision-Date: 2009-01-03 02:08:21+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr "XML non valido per Visualizzazione Architettura!"
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr "Il nome oggetto deve iniziare con x_ e non può contenere caratteri speciali !"
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:09:02+0000\n"
+"PO-Revision-Date: 2009-01-03 02:09:02+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:04:56+0000\n"
+"PO-Revision-Date: 2009-01-03 02:04:56+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr "Ongeldige XML voor weergave opbouw"
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr "De objectnaam moet beginnen met x_ en mag geen speciale karakters bevatten !"
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:09:43+0000\n"
+"PO-Revision-Date: 2009-01-03 02:09:43+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr "XML niewłaściwy dla tej architektury wyświetlania!"
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr "Nazwa obiektu musi zaczynać się od x_ oraz nie może zawierać znaków specjalnych !"
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:10:25+0000\n"
+"PO-Revision-Date: 2009-01-03 02:10:25+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr "Invalido XML para Arquitetura da View"
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr "O nome do objeto precisa iniciar com x_ e não conter nenhum caracter especial!"
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:11:07+0000\n"
+"PO-Revision-Date: 2009-01-03 02:11:07+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr "XML inválido para a arquitectura de vista"
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr "O nome do objecto deve começar com x_ e não pode conter um caracter especial!"
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:11:49+0000\n"
+"PO-Revision-Date: 2009-01-03 02:11:49+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:12:32+0000\n"
+"PO-Revision-Date: 2009-01-03 02:12:32+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr "Неправильный XML для просмотра архитектуры!"
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr "Название объекта должно начинаться с x_ и не должно содержать специальных символов !"
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:13:15+0000\n"
+"PO-Revision-Date: 2009-01-03 02:13:15+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr "Neveljaven XML za arhitekturo pogleda."
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr "Naziv objekta se mora začeti z 'x_' in ne sme vsebovati posebnih znakov."
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:15:28+0000\n"
+"PO-Revision-Date: 2009-01-03 02:15:28+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:16:12+0000\n"
+"PO-Revision-Date: 2009-01-03 02:16:12+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr "Görüntüleme mimarisi için Geçersiz XML"
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:16:57+0000\n"
+"PO-Revision-Date: 2009-01-03 02:16:57+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr "Неправильний XML для Архітектури Вигляду!"
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr "Назва об'єкту має починатися з x_ і не містити ніяких спеціальних символів!"
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:02:15+0000\n"
+"PO-Revision-Date: 2009-01-03 02:02:15+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# Translation of OpenERP Server.
+# This file containt the translation of the following modules:
+# * base_module_quality
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-01-03 02:02:55+0000\n"
+"PO-Revision-Date: 2009-01-03 02:02:55+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_module_quality
+#: field:module.quality.detail,general_info:0
+msgid "General Info"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.detail:0
+msgid "Summary"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr ""
+
+#. module: base_module_quality
+#: constraint:ir.model:0
+msgid "The Object name must start with x_ and not contain any special character !"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,detail:0
+#: view:module.quality.detail:0
+msgid "Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.check,verbose_detail:0
+msgid "Verbose Detail"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_quality_check_detail
+msgid "module.quality.detail"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+#: view:module.quality.detail:0
+msgid "Result"
+msgstr ""
+
+#. module: base_module_quality
+#: model:ir.model,name:base_module_quality.model_wizard_quality_check
+msgid "module.quality.check"
+msgstr ""
+
+#. module: base_module_quality
+#: view:module.quality.check:0
+msgid "Verbose detail"
+msgstr ""
+
+#. module: base_module_quality
+#: field:module.quality.detail,quality_check:0
+msgid "Quality"
+msgstr ""
+
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from tools.translate import _
+
+from base_module_quality import base_module_quality
+import pooler
+
+class quality_test(base_module_quality.abstract_quality_check):
+
+ def __init__(self):
+ super(quality_test, self).__init__()
+ self.name = _("Method Test")
+ self.note = _("""
+This test checks if the module classes are raising exception when calling basic methods or not.
+""")
+ self.bool_installed_only = True
+ return None
+
+ def run_test(self, cr, uid, module_path):
+ pool = pooler.get_pool(cr.dbname)
+ module_name = module_path.split('/')[-1]
+ obj_list = self.get_objects(cr, uid, module_name)
+ result_dict = {}
+ if not obj_list:
+ self.error = True
+ self.result = _("Module has no objects")
+ return None
+ ok_count = 0
+ ex_count = 0
+ for obj in obj_list:
+ temp = [obj]
+ try:
+ pool.get(obj).search(cr, uid, [])
+ temp.append(_('Ok'))
+ ok_count += 1
+ except:
+ temp.append(_('Exception'))
+ ex_count += 1
+ try:
+ pool.get(obj).fields_view_get(cr, uid,)
+ temp.append(_('Ok'))
+ ok_count += 1
+ except:
+ temp.append(_('Exception'))
+ ex_count += 1
+ try:
+ pool.get(obj).read(cr, uid, [])
+ temp.append(_('Ok'))
+ ok_count += 1
+ except:
+ temp.append(_('Exception'))
+ ex_count += 1
+ result_dict[obj] = temp
+ self.score = (ok_count + ex_count) and float(ok_count)/float(ok_count + ex_count) or 0.0
+ self.result = self.get_result(result_dict)
+ return None
+
+ def get_result(self, dict_method):
+ header = ('{| border="1" cellspacing="0" cellpadding="5" align="left" \n! %-40s \n! %-16s \n! %-20s \n! %-16s ', [_('Object Name'), 'search()', 'fields_view_get()', 'read()'])
+ detail = ""
+ if not self.error:
+ detail += self.format_table(header, dict_method)
+ return detail
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import os
+import re
+
+from tools.translate import _
+from base_module_quality import base_module_quality
+import pooler
+
+class quality_test(base_module_quality.abstract_quality_check):
+
+ def __init__(self):
+ super(quality_test, self).__init__()
+ self.name = _("Object Test")
+ self.note = _("""
+Test checks for fields, views, security rules, dependancy level
+""")
+ self.bool_installed_only = True
+ return None
+
+ def run_test(self, cr, uid, module_path):
+
+ pool = pooler.get_pool(cr.dbname)
+ module_name = module_path.split('/')[-1]
+ obj_list = self.get_objects(cr, uid, module_name)
+ ids_model = self.get_model_ids(cr, uid, obj_list)
+ result_security = {}
+
+ if obj_list: # if module has no new created classes skipp fields, views, security tests
+ field_obj = pool.get('ir.model.fields')
+ view_obj = pool.get('ir.ui.view')
+ access_obj = pool.get('ir.model.access')
+
+ field_ids = field_obj.search(cr, uid, [('model', 'in', obj_list)])
+ view_ids = view_obj.search(cr, uid, [('model', 'in', obj_list), ('type', 'in', ['tree', 'form'])])
+ access_ids = access_obj.search(cr, uid, [('model_id', 'in', ids_model)])
+
+ field_data = field_obj.browse(cr, uid, field_ids)
+ view_data = view_obj.browse(cr, uid, view_ids)
+ access_data = access_obj.browse(cr, uid, access_ids)
+
+ result_dict = {}
+ result_view = {}
+ good_field = 0
+ total_field = 0
+
+ # field test .....
+ for field in field_data:
+ result_dict[field.model] = []
+ for field in field_data:
+ ttype = field.ttype
+ name = field.name
+ total_field += 1
+ check_str = re.compile('[a-z]+[\w_]*$') #re.compile('[a-z]+[_]?[a-z]+$')
+ if ttype == 'many2one':
+ if name.split('_')[-1] == 'id':
+ good_field += 1
+ else:
+ data = 'many2one field should end with _id'
+ result_dict[field.model].append([field.model, name, data])
+ elif ttype in ['many2many', 'one2many']:
+ if name.split('_')[-1] == 'ids':
+ good_field += 1
+ else:
+ data = '%s field should end with _ids'% (ttype)
+ result_dict[field.model].append([field.model, name, data])
+ elif check_str.match(name):
+ good_field += 1
+ else:
+ data = 'Field name should be in lower case or it should follow python standard'
+ result_dict[field.model].append([field.model, name, data])
+
+ #views tests
+ for res in result_dict.keys():
+ if not result_dict[res]:
+ del result_dict[res]
+ view_dict = {}
+ total_views = len(obj_list) * 2
+ model_views = 0
+ for view in view_data:
+ view_dict[view.model] = []
+ model_views += 1
+ for view in view_data:
+ ttype = view.type
+ view_dict[view.model].append(ttype)
+ for view in view_dict:
+ if len(view_dict[view]) < 2:
+ model_views -= 1
+ result_view[view] = [view, 'You should have atleast form/tree view of an object']
+ if model_views > total_views:
+ model_views = total_views
+
+ #security rules test...
+ list_files = os.listdir(module_path)
+ security_folder = False
+ for file_sec in list_files:
+ if file_sec == 'security':
+ path = os.path.join(module_path, file_sec)
+ if os.path.isdir(path):
+ security_folder = True
+ if not security_folder:
+ result_security[module_name] = [module_name, 'Security folder is not available (All security rules and groups should define in security folder)']
+ access_list = []
+ good_sec = len(obj_list)
+ bad_sec = 0
+ for access in access_data:
+ access_list.append(access.model_id.model)
+ if not access.group_id:
+ result_security[access.model_id.model] = [access.model_id.model, 'Specified object has no related group define on access rules']
+ bad_sec += 1 # to be check
+ not_avail_access = filter(lambda x: not x in access_list, obj_list)
+ for obj in not_avail_access:
+ bad_sec += 1
+ result_security[obj] = [obj, 'Object should have at least one security rule defined on it']
+
+ # Dependacy test of module
+ module_obj = pool.get('ir.module.module')
+ module_ids = module_obj.search(cr, uid, [('name', '=', module_name)])
+ module_data = module_obj.browse(cr, uid, module_ids)
+ depend_list = []
+ depend_check = []
+ remove_list = []
+ for depend in module_data[0].dependencies_id:
+ depend_list.append(depend.name)
+ module_ids = module_obj.search(cr, uid, [('name', 'in', depend_list)])
+ module_data = module_obj.browse(cr, uid, module_ids)
+ for data in module_data:
+ for check in data.dependencies_id:
+ depend_check.append(check.name)
+ for dep in depend_list:
+ if dep in depend_check and not dep in remove_list:
+ remove_list.append(str(dep))
+ if remove_list:
+ result_security[module_name] = [remove_list, 'Unnecessary dependacy should be removed please Provide only highest requirement level']
+ bad_depend = len(remove_list)
+
+ if not obj_list:
+ score_depend = (100 - (bad_depend * 5)) / 100.0 # note : score is calculated based on if you have for e.g. two module extra in dependancy it will score -10 out of 100
+ self.score = score_depend
+ self.result = self.get_result({ module_name: ['No object found', 'No object found', 'No object found', int(score_depend * 100)]})
+ self.result_details += self.get_result_general(result_security, name="General")
+ return None
+
+ score_view = total_views and float(model_views) / float(total_views)
+ score_field = total_field and float(good_field) / float(total_field)
+ score_depend = (100 - (bad_depend * 5)) / 100.0 # note : score is calculated based on if you have for e.g. two module extra in dependancy it will score -10 out of 100
+ score_security = good_sec and float(good_sec - bad_sec) / float(good_sec)
+ self.score = (score_view + score_field + score_security + score_depend) / 4
+ self.result = self.get_result({ module_name: [int(score_field * 100), int(score_view * 100), int(score_security * 100), int(score_depend * 100)]})
+ self.result_details += self.get_result_details(result_dict)
+ self.result_details += self.get_result_general(result_view, name="View")
+ self.result_details += self.get_result_general(result_security, name="General")
+ return None
+
+ def get_result(self, dict_obj):
+ header = ('{| border="1" cellspacing="0" cellpadding="5" align="left" \n! %-40s \n! %-40s \n! %-40s \n! %-10s \n', [_('Result of fields in %'), _('Result of views in %'), _('Result of Security in %'), _('Result of dependancy in %')])
+ if not self.error:
+ return self.format_table(header, data_list=dict_obj)
+ return ""
+
+ def get_result_details(self, dict_obj):
+ res = ""
+ if dict_obj != {}:
+ str_html = '''<html><strong> Fields Result</strong><head></head><body>'''
+ res += str_html
+ header = ('<tr><th width="200">%s</th><th width="200">%s</th><th width="300">%s</th></tr>', [_('Object Name'), _('Field name'), _('Suggestion')])
+ if not self.error:
+ for key in dict_obj.keys():
+ data_list = []
+ final_dict = {}
+ data_list = dict_obj[key]
+ count = 0
+ for i in data_list:
+ count = count + 1
+ final_dict[key + str(count)] = i
+ res += '<table>' + self.format_html_table(header, data_list=final_dict) + '</table><br>'
+ return res + '</body></html>'
+ return ""
+
+ def get_result_general(self, dict_obj, name=''):
+ str_html = '''<html><strong> %s Result</strong><head></head><body><table>'''% (name)
+ header = ('<tr><th>%s</th><th>%s</th></tr>', [_('Object Name'), _('Suggestion')])
+ if not self.error:
+ res = str_html + self.format_html_table(header, data_list=dict_obj) + '</table></body></html>'
+ return res
+ return ""
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import os
+
+from tools.translate import _
+from base_module_quality import base_module_quality
+
+class quality_test(base_module_quality.abstract_quality_check):
+
+ def __init__(self):
+ super(quality_test, self).__init__()
+ self.name = _("PEP-8 Test")
+ self.note = _("""
+PEP-8 Test , copyright of py files check, method can not call from loops
+""")
+ self.bool_installed_only = False
+ self.bad_standard = 0
+ self.good_standard = 0
+ self.result_py = {}
+ return None
+
+ def run_test(self, cr, uid, module_path):
+ list_files = os.listdir(module_path)
+ for i in list_files:
+ path = os.path.join(module_path, i)
+ if os.path.isdir(path):
+ for j in os.listdir(path):
+ list_files.append(os.path.join(i, j))
+ py_list = []
+ for file_py in list_files:
+ if file_py.split('.')[-1] == 'py' and not file_py.endswith('__init__.py') and not file_py.endswith('__terp__.py'):
+ file_path = os.path.join(module_path, file_py)
+ py_list.append(file_path)
+
+ open_files = map(lambda x: open(x, 'r'), py_list)
+ if not py_list:
+ self.error = True
+ self.result = _("No python file found")
+ return None
+
+ #below functions check:
+
+ #1. Imports should usually be on separate lines
+ #2. Imports are always put at the top of the file, just after any module comments and docstrings, and before module globals and constants
+ self.check_import(open_files)
+
+ #1. there should be a one space after , : ;
+ self.check_space(open_files)
+
+ #1. Have all the .py files a copyright?
+ self.check_licence(open_files)
+
+ #1. Does the module avoid unecessary queries like when we put a browse into a loop?
+ self.check_loop(open_files)
+
+ #1.More than one space around an assignment (or other) operator to align it with another.
+# self.check_space_operator(open_files)
+
+ #1. For sequences, (strings, lists, tuples), use the fact that empty sequences are false
+ #for e.g : if seq: => good & if len(seq): => not good
+ self.check_len(open_files)
+
+ # below function checks
+ # 1. Don't compare boolean values to True or False using == and !=
+ self.check_boolean(open_files)
+
+ self.score = self.good_standard and float(self.good_standard) / float(self.good_standard + self.bad_standard)
+ self.result = self.get_result({ module_path: [int(self.score * 100)]})
+ self.result_details += self.get_result_general(self.result_py)
+ return None
+
+ def check_import(self, open_files):
+ for py in open_files:
+ py.seek(0)
+ class_or_def = False
+ line_counter = 0
+ file_name = py.name.split('/')[-1]
+ while True:
+ line_counter += 1
+ line = py.readline()
+ if not line: break
+ if ((line.find('class') > -1) or (line.find('def') > -1)):
+ class_or_def = True
+ import_found = line.find('import')
+ comment_found = line.find('#')
+ if comment_found == -1 and import_found != -1:
+ self.good_standard += 1
+ if (class_or_def):
+ self.bad_standard += 1
+ self.result_py[file_name + str(line_counter)] = [file_name, line_counter, 'Imports are always put at the top of the file, just after any module comments and docstrings, and before module globals and constants']
+ if (line.find('from') < 0 and line.find(',') != -1):
+ self.bad_standard += 1
+ self.result_py[file_name + str(line_counter)] = [file_name, line_counter, 'Imports should usually be on separate lines']
+
+ def check_licence(self, open_files):
+ for py in open_files:
+ py.seek(0)
+ bad_position = False
+ copyright_found = False
+ gnu_found = False
+ license_found = False
+ gnu_website_found = False
+ line_counter = 0
+ file_name = py.name.split('/')[-1]
+ while True:
+ declaration = False
+ flag = False
+ line_counter += 1
+ line = py.readline()
+ if not line: break
+ if ((line.find('class') > -1) or (line.find('def') > -1) or (line.find('import') > -1)):
+ bad_position = True
+ comment_found = line.find('#')
+ copyright_found = line.find('Copyright')
+ gnu_found = line.find('GNU')
+ license_found = line.find('License')
+ gnu_website_found = line.find('www.gnu.org/licenses')
+ if ((copyright_found > -1) or (gnu_found > -1) or (license_found > -1) or (gnu_website_found > -1)):
+ self.good_standard += 1
+ declaration = True
+ flag = True
+ break
+ if (comment_found > -1) and bad_position and declaration:
+ self.bad_standard += 1
+ self.result_py[file_name + str(line_counter)] = [file_name, line_counter, 'Declaration of copyright must be at the top of file']
+ break
+ if bad_position and (not flag):
+ self.bad_standard += 1
+ self.result_py[file_name] = [file_name, '--', 'File is not copyright']
+
+ def check_loop(self, open_files):
+ for py in open_files:
+ py.seek(0)
+ methods = ['browse', 'search', 'read', 'copy', 'unlink']
+ place_for = 1000
+ file_name = py.name.split('/')[-1]
+ line_counter = 0
+ counter = 0
+ while True:
+ line_counter += 1
+ line = py.readline()
+ if not line: break
+ place_method = 0
+ for i in line :
+ if (i == ' '):
+ place_method += 1
+ elif (i != ' '):
+ break
+ elif (place_method > 100):
+ break
+ if (line.find('for') > -1):
+ place_for = place_method
+ if (place_for < place_method):
+ counter += 1
+ for method in methods:
+ got = line.find(method)
+ if(got > -1):
+ self.bad_standard += 1
+ self.result_py[file_name + str(line_counter)] = [file_name, line_counter, 'puting method inside loop is not good']
+ self.good_standard += counter
+
+ def check_space(self, open_files):
+ for py in open_files:
+ py.seek(0)
+ counter_line = 0
+ file_name = py.name.split('/')[-1]
+ counter = 0
+ while True:
+ counter_line += 1
+ line = py.readline()
+ if not line: break
+ pos_comma = line.find(',')
+ pos_semicolon = line.find(';')
+ pos_colon = line.find(':')
+ space_find = -1
+ if (pos_comma != -1 or pos_semicolon != -1 or pos_colon != -1):
+ counter += 1
+ for i in line:
+ space_find += 1
+ if (i == ' '):
+ if ((space_find + 1) == pos_comma) or ((space_find + 1) == pos_semicolon) or ((space_find + 1) == pos_colon):
+ self.bad_standard += 1
+ self.result_py[file_name + str(counter_line)] = [file_name, counter_line, 'You should not have space before (: ; ,)']
+ self.good_standard += counter # to be check
+
+
+ def check_space_operator(self, open_files):
+ for py in open_files:
+ py.seek(0)
+ space_counter = 0
+ eq_found = False
+ operator_found = False
+ line_counter = 0
+ file_name = py.name.split('/')[-1]
+ while True:
+ line_counter += 1
+ line = py.readline()
+ if not line: break
+ for counter in line:
+ if (counter == ' '):
+ space_counter += 1
+ else:
+ if (space_counter > 1):
+ if counter in ['=', '<', '>', '!', '+', '-', '*', '/', '^', '%'] or operator_found:
+ self.bad_standard += 1
+ self.result_py[file_name + str(line_counter)] = [file_name, line_counter, 'More than one space around an assignment (or other) operator to align it with another']
+ operator_found = False
+ space_counter = 0
+ if counter in ['=', '<', '>', '!', '+', '-', '*', '/', '^', '%']:
+ self.good_standard += 1
+ operator_found = True
+
+ def check_len(self, open_files):
+ for py in open_files:
+ py.seek(0)
+ line_counter = 0
+ file_name = py.name.split('/')[-1]
+ while True:
+ line_counter += 1
+ line = py.readline()
+ if not line: break
+ if (line.find('if') > -1) and (line.find('len(') > -1) and (line.find(')') > -1):
+ self.good_standard += 1
+ if (line.find(':') > -1) and not line.find('<') > -1 and not line.find('>') > -1 and not line.find('=') > -1 and not line.find('!') > -1 :
+ self.bad_standard += 1
+ self.result_py[file_name + str(line_counter)] = [file_name, line_counter, ' For sequences, (strings, lists, tuples), use the fact that empty sequences are false']
+
+
+ def check_boolean(self, open_files):
+ for py in open_files:
+ py.seek(0)
+ line_counter = 0
+ file_name = py.name.split('/')[-1]
+ while True:
+ line_counter += 1
+ line = py.readline()
+ if not line: break
+ if (line.find('if') > -1):
+ self.good_standard += 1
+ if ((line.find('==') > -1) or (line.find('!=') > -1)) and ((line.find('True') > -1) or (line.find('False') > -1)):
+ self.bad_standard += 1
+ self.result_py[file_name + str(line_counter)] = [file_name, line_counter, "Don't compare boolean values to True or False using == or !="]
+
+ def get_result(self, dict_obj):
+ header = ('{| border="1" cellspacing="0" cellpadding="5" align="left" \n! %-40s \n', [_('Result of pep8_test in %')])
+ if not self.error:
+ return self.format_table(header, data_list=dict_obj)
+ return ""
+
+ def get_result_general(self, dict_obj):
+ str_html = '''<html><strong>Result</strong><head></head><body><table>'''
+ header = ('<tr><th>%s</th><th>%s</th><th>%s</th></tr>', [_('Object Name'), _('Line number'), _('Suggestion')])
+ if not self.error:
+ res = str_html + self.format_html_table(header, data_list=dict_obj) + '</table></body></html>'
+ return res
+ return ""
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+import os
+
+from tools import config
+from tools.translate import _
+from base_module_quality import base_module_quality
+
+class quality_test(base_module_quality.abstract_quality_check):
+
+ def __init__(self):
+ super(quality_test, self).__init__()
+ self.name = _("Pyflakes Test")
+ self.note = _("""This test uses Pyflakes to analyze Python programs and detect various errors. It works by parsing the source file, not importing it. See http://www.divmod.org/trac/wiki/DivmodPyflakes for further info.\n (This test score does not effect final score) """)
+ self.bool_installed_only = False
+ self.bool_count_score = False #This test display on report (summary/detail) does not count score
+ return None
+
+ def run_test(self, cr, uid, module_path):
+ list_files = os.listdir(module_path)
+ for i in list_files:
+ path = os.path.join(module_path, i)
+ if os.path.isdir(path):
+ for j in os.listdir(path):
+ list_files.append(os.path.join(i, j))
+
+ dict_py = {}
+ flag = False
+ self.result_details += '''<html>
+ <head>
+ <link rel="stylesheet" type="text/css" href="/tg_widgets/openerp/css/wiki.css" media="all">
+ </head>
+ <body><table><tr><b>Report</b>'''
+ for file_py in list_files:
+ if file_py.split('.')[-1] == 'py' and not file_py.endswith('__init__.py') and not file_py.endswith('__terp__.py'):
+ if not flag:
+ flag = True
+ file_path = os.path.join(module_path, file_py)
+ try:
+ try:
+ import pyflakes
+ res = os.popen('pyflakes' + ' ' + file_path).read()
+ except:
+ self.error = True
+ import netsvc
+ netsvc.Logger().notifyChannel('Pyflakes', netsvc.LOG_WARNING, "Is pyflakes correctly installed? (http://pypi.python.org/pypi/pyflakes/0.3.0)")
+ self.result += _("Error! Is pyflakes correctly installed? (http://pypi.python.org/pypi/pyflakes/0.3.0)")+"\n"
+ return None
+ if not res:
+ continue
+ self.result_details += '''<table border="2" bordercolor="black" width="100%" align="center"><tr><td width="30%"> ''' + file_py + '</td><td width="70%"><table border=2 bordercolor=black >'
+ list_res = res.split('\n')
+ temp_dict = {}
+ keys = ['imported but unused statements', 'unable to detect undefined names', \
+ 'undefined name', 'redefinition of unused from line', \
+ 'import shadowed by loop variable', 'local variables referenced before assignment', \
+ 'duplicate argument in function definition', 'redefinition of function from line', \
+ 'future import after other statements']
+ map(lambda key:temp_dict.setdefault(key, 0), keys)
+ detail_str = ''
+ for line in list_res:
+ self.result_details += '''<tr><td width="100%"> ''' + line + '</td></tr>'
+ detail_str += line + '\n'
+ if line.find("imported but unused") != -1:
+ temp_dict['imported but unused statements'] += 1
+ elif line.find("*' used; unable to detect undefined names") != -1:
+ temp_dict['unable to detect undefined names'] += 1
+ elif line.find("undefined name") != -1:
+ temp_dict['undefined name'] += 1
+ elif line.find("redefinition of unused") != -1:
+ temp_dict['redefinition of unused from line'] += 1
+ elif line.find("shadowed by loop variable") != -1:
+ temp_dict['import shadowed by loop variable'] += 1
+ elif line.find("referenced before assignment") != -1:
+ temp_dict['local variables referenced before assignment'] += 1
+ elif line.find("in function definition") != -1:
+ temp_dict['duplicate argument in function definition'] += 1
+ elif line.find("redefinition of function") != -1:
+ temp_dict['redefinition of function from line'] += 1
+ elif line.find("after other statements") != -1:
+ temp_dict['future import after other statements'] += 1
+ final_str = '\n'
+ for t in temp_dict:
+ if str(temp_dict[t]) != '0':
+ final_str += '\n' + str(t) + ' : ' + str(temp_dict[t]) + '\n'
+ except:
+ self.error = True
+ self.result += _("Error in running pyflakes") + "\n"
+ return None
+ try:
+ dict_py[file_py] = [file_py, final_str]
+ except:
+ dict_py[file_py] = [file_py, _("Unable to parse the result. Check the details.")]
+ self.result_details += '</table></td>'
+ if not flag:
+ self.error = True
+ self.result = _("No python file found")
+ return None
+ self.result_details += '</tr></table></body></html>'
+ self.score = 0
+ self.result = self.get_result(dict_py)
+ return None
+
+ def get_result(self, dict_py):
+ header = ('{| border="1" cellspacing="0" cellpadding="5" align="left" \n! %-40s \n! %-10s \n', [_('File Name'), _('Result')])
+ if not self.error:
+ return self.format_table(header, data_list=dict_py)
+ return ""
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+#import pylint_test
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+import os
+
+from tools import config
+from tools.translate import _
+from base_module_quality import base_module_quality
+
+class quality_test(base_module_quality.abstract_quality_check):
+
+ def __init__(self):
+ super(quality_test, self).__init__()
+ self.name = _("Pylint Test")
+ self.note = _("""This test uses Pylint and checks if the module satisfies the coding standard of Python. See http://www.logilab.org/project/name/pylint for further info.\n """)
+ self.bool_installed_only = False
+ return None
+
+ def run_test(self, cr, uid, module_path):
+ config_file_path = config['addons_path']+'/base_module_quality/pylint_test/pylint_test_config.txt'
+ list_files = os.listdir(module_path)
+ for i in list_files:
+ path = os.path.join(module_path, i)
+ if os.path.isdir(path):
+ for j in os.listdir(path):
+ list_files.append(os.path.join(i, j))
+
+ count = 0
+ score = 0.0
+ dict_py = {}
+ flag = False
+ self.result_details += '''<html>
+ <head>
+ <link rel="stylesheet" type="text/css" href="/tg_widgets/openerp/css/wiki.css" media="all">
+ </head>
+ <body>'''
+ for file_py in list_files:
+ if file_py.split('.')[-1] == 'py' and not file_py.endswith('__init__.py') and not file_py.endswith('__terp__.py'):
+ if not flag:
+ flag = True
+ file_path = os.path.join(module_path, file_py)
+ try:
+ import pylint
+ res = os.popen('pylint --rcfile=' + config_file_path + ' ' + file_path).read()
+ except:
+ self.error = True
+ import netsvc
+ netsvc.Logger().notifyChannel('Pylint:', netsvc.LOG_WARNING, "Is pylint correctly installed? (http://pypi.python.org/pypi/pylint)")
+ self.result += _("Error. Is pylint correctly installed? (http://pypi.python.org/pypi/pylint)")+"\n"
+ return None
+ count += 1
+# leftchar = -1
+# while res[leftchar:leftchar+1] != ' ' and leftchar-1 <= 0:
+# leftchar -= 1
+# rightchar = -10
+# while res[rightchar:rightchar+1] != '/' and rightchar+1 <= 0:
+# rightchar += 1
+ try:
+# score += float(res[leftchar+1:rightchar])
+ scr = res.split("Your code has been rated at")[1].split("</div>")[0].split("/")[0]
+ score += float(scr)
+ #self.result += file + ": " + res[leftchar+1:rightchar] + "/10\n"
+ dict_py[file_py] = [file_py, scr]
+ except:
+ score += 0
+ #self.result += file + ": "+_("Unable to parse the result. Check the details.")+"\n"
+ dict_py[file_py] = [file_py, _("Unable to parse the result. Check the details.")]
+ self.result_details += res.replace('''<div''', '''<div class="wikiwidget readonlyfield"''')
+
+ if not flag:
+ self.error = True
+ self.result = _("No python file found")
+ return None
+ self.result_details += '</body></html>'
+ average_score = count and score / count or score
+ self.score = (max(average_score, 0)) / 10
+ self.result = self.get_result(dict_py)
+ return None
+
+ def get_result(self, dict_py):
+ header = ('{| border="1" cellspacing="0" cellpadding="5" align="left" \n! %-40s \n! %-10s \n', [_('File Name'), _('Result (/10)')])
+ if not self.error:
+ return self.format_table(header, data_list=dict_py)
+ return ""
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
--- /dev/null
+# lint Python modules using external checkers.
+#
+# This is the main checker controlling the other ones and the reports
+# generation. It is itself both a raw checker and an astng checker in order
+# to:
+# * handle message activation / deactivation at the module level
+# * handle some basic but necessary stats'data (number of classes, methods...)
+#
+[MASTER]
+
+# Specify a configuration file.
+#rcfile=
+
+# Profiled execution.
+profile=no
+
+# Add <file or directory> to the black list. It should be a base name, not a
+# path. You may set this option multiple times.
+ignore=CVS
+
+# Pickle collected data for later comparisons.
+persistent=no
+
+# Set the cache size for astng objects.
+cache-size=500
+
+# List of plugins (as comma separated values of python modules names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+
+[COMMANDS]
+
+# Display a help message for the given message id and exit. The value may be a
+# comma separated list of message ids.
+#help-msg=
+
+
+[MESSAGES CONTROL]
+
+# Enable only checker(s) with the given id(s). This option conflict with the
+# disable-checker option
+#enable-checker=
+
+# Enable all checker(s) except those with the given id(s). This option conflict
+# with the disable-checker option
+#disable-checker=
+
+# Enable all messages in the listed categories.
+#enable-msg-cat=
+
+# Disable all messages in the listed categories.
+#disable-msg-cat=
+
+# Enable the message(s) with the given id(s).
+#enable-msg=
+
+# Disable the message(s) with the given id(s).
+disable-msg=C0103,F0401,E0611,R0903,W0232,W0102,E1002,R0913,R0904
+
+[REPORTS]
+
+# set the output format. Available formats are text, parseable, colorized and
+# html
+output-format=html
+
+# Include message's id in output
+include-ids=yes
+
+# Put messages in a separate file for each module / package specified on the
+# command line instead of printing them on stdout. Reports (if any) will be
+# written in a file name "pylint_global.[txt|html]".
+files-output=no
+
+# Tells wether to display a full report or only the messages
+reports=yes
+
+# Python expression which should return a note less than 10 (10 is the highest
+# note).You have access to the variables errors warning, statement which
+# respectivly contain the number of errors / warnings messages and the total
+# number of statements analyzed. This is used by the global evaluation report
+# (R0004).
+evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
+
+# Add a comment according to your evaluation note. This is used by the global
+# evaluation report (R0004).
+comment=no
+
+# Enable the report(s) with the given id(s).
+#enable-report=
+
+# Disable the report(s) with the given id(s).
+#disable-report=
+
+
+# checks for
+# * unused variables / imports
+# * undefined variables
+# * redefinition of variable from builtins or from an outer scope
+# * use of variable before assigment
+#
+[VARIABLES]
+
+# Tells wether we should check for unused import in __init__ files.
+init-import=no
+
+# A regular expression matching names used for dummy variables (i.e. not used).
+dummy-variables-rgx=_|dummy
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid to define new builtins when possible.
+additional-builtins=
+
+
+# try to find bugs in the code using type inference
+#
+[TYPECHECK]
+
+# Tells wether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+# When zope mode is activated, consider the acquired-members option to ignore
+# access to some undefined attributes.
+zope=no
+
+# List of members which are usually get through zope's acquisition mecanism and
+# so shouldn't trigger E0201 when accessed (need zope=yes to be considered).
+acquired-members=REQUEST,acl_users,aq_parent
+
+
+# checks for :
+# * doc strings
+# * modules / classes / functions / methods / arguments / variables name
+# * number of arguments, local variables, branchs, returns and statements in
+# functions, methods
+# * required module attributes
+# * dangerous default values as arguments
+# * redefinition of function / method / class
+# * uses of the global statement
+#
+[BASIC]
+
+# Required attributes for module, separated by a comma
+required-attributes=
+
+# Regular expression which should only match functions or classes name which do
+# not require a docstring
+no-docstring-rgx=__.*__
+
+# Regular expression which should only match correct module names
+module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+
+# Regular expression which should only match correct module level names
+const-rgx=(([A-Z_][A-Z1-9_]*)|(__.*__))$
+
+# Regular expression which should only match correct class names
+class-rgx=[A-Z_][a-zA-Z0-9]+$
+
+# Regular expression which should only match correct function names
+function-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct method names
+method-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct instance attribute names
+attr-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct argument names
+argument-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct variable names
+variable-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct list comprehension /
+# generator expression variable names
+inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
+
+# Good variable names which should always be accepted, separated by a comma
+good-names=i,j,k,ex,Run,_
+
+# Bad variable names which should always be refused, separated by a comma
+bad-names=foo,bar,baz,toto,tutu,tata
+
+# List of builtins function names that should not be used, separated by a comma
+bad-functions=map,filter,apply,input
+
+
+# checks for
+# * external modules dependencies
+# * relative / wildcard imports
+# * cyclic imports
+# * uses of deprecated modules
+#
+[IMPORTS]
+
+# Deprecated modules which should not be used, separated by a comma
+deprecated-modules=regsub,string,TERMIOS,Bastion,rexec
+
+# Create a graph of every (i.e. internal and external) dependencies in the
+# given file (report R0402 must not be disabled)
+import-graph=
+
+# Create a graph of external dependencies in the given file (report R0402 must
+# not be disabled)
+ext-import-graph=
+
+# Create a graph of internal dependencies in the given file (report R0402 must
+# not be disabled)
+int-import-graph=
+
+
+# checks for :
+# * methods without self as first argument
+# * overridden methods signature
+# * access only to existant members via self
+# * attributes not defined in the __init__ method
+# * supported interfaces implementation
+# * unreachable code
+#
+[CLASSES]
+
+# List of interface methods to ignore, separated by a comma. This is used for
+# instance to not check methods defines in Zope's Interface base class.
+ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,__new__,setUp
+
+
+# checks for sign of poor/misdesign:
+# * number of methods, attributes, local variables...
+# * size, complexity of functions, methods
+#
+[DESIGN]
+
+# Maximum number of arguments for function / method
+max-args=5
+
+# Maximum number of locals for function / method body
+max-locals=15
+
+# Maximum number of return / yield for function / method body
+max-returns=6
+
+# Maximum number of branch for function / method body
+max-branchs=12
+
+# Maximum number of statements in function / method body
+max-statements=50
+
+# Maximum number of parents for a class (see R0901).
+max-parents=7
+
+# Maximum number of attributes for a class (see R0902).
+max-attributes=7
+
+# Minimum number of public methods for a class (see R0903).
+min-public-methods=2
+
+# Maximum number of public methods for a class (see R0904).
+max-public-methods=20
+
+
+# checks for :
+# * unauthorized constructions
+# * strict indentation
+# * line length
+# * use of <> instead of !=
+#
+[FORMAT]
+
+# Maximum number of characters on a single line.
+max-line-length=80
+
+# Maximum number of lines in a module
+max-module-lines=1000
+
+# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
+# tab).
+indent-string=' '
+#indent-string="\t"
+
+
+# checks for similarities and duplicated code. This computation may be
+# memory / CPU intensive, so you should disable it if you experiments some
+# problems.
+#
+[SIMILARITIES]
+
+# Minimum lines number of a similarity.
+min-similarity-lines=4
+
+# Ignore comments when computing similarities.
+ignore-comments=yes
+
+# Ignore docstrings when computing similarities.
+ignore-docstrings=yes
+
+
+# checks for:
+# * warning notes in the code like FIXME, XXX
+# * PEP 263: source code with non ascii character but no encoding declaration
+#
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+notes=FIXME,XXX,TODO
--- /dev/null
+"id","name","model_id:id","perm_read","perm_write","perm_create","perm_unlink"
+"access_module_quality_check","module.quality.check","model_module_quality_check",1,1,1,1
+"access_module_quality_detail","module.quality.detail","model_module_quality_detail",1,1,1,1
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import fields, osv
+from tools.translate import _
+import pooler
+
+from base_module_quality import base_module_quality
+
+class quality_test(base_module_quality.abstract_quality_check):
+
+ def __init__(self):
+ super(quality_test, self).__init__()
+ self.bool_installed_only = True
+ self.name = _("Speed Test")
+ self.note = _("""
+This test checks the speed of the module. Note that at least 5 demo data is needed in order to run it.
+
+""")
+ return None
+
+ def run_test(self, cr, uid, module_path):
+ pool = pooler.get_pool(cr.dbname)
+ module_name = module_path.split('/')[-1]
+ obj_list = self.get_objects(cr, uid, module_name)
+
+ # remove osv_memory class becaz it does not have demo data
+ if obj_list:
+ cr.execute("select w.res_model from ir_actions_todo as t left join ir_act_window as w on t.action_id=w.id where w.res_model in ('%s')"% ("','".join(obj_list)))
+ res = cr.fetchall()
+ for remove_obj in res:
+ if remove_obj and (remove_obj[0] in obj_list):
+ obj_list.remove(remove_obj[0])
+
+ result_dict2 = {}
+ if not obj_list:
+ self.error = True
+ self.result += _("Given module has no objects.Speed test can work only when new objects are created in the module along with demo data")
+ return None
+ obj_counter = 0
+ score = 0.0
+ obj_ids = self.get_ids(cr, uid, obj_list)
+ result_dict = {}
+ result_dict2 = {}
+ self.result_details += _("<html>O(1) means that the number of SQL requests to read the object does not depand on the number of objects we are reading. This feature is hardly wished.\n</html>")
+ for obj, ids in obj_ids.items():
+ obj_counter += 1
+ ids = ids[:100]
+ size = len(ids)
+ list2 = []
+ if size:
+ speed_list = []
+ #we perform the operation twice, and count the number of queries in the second run. This allows to avoid the cache effect. (like translated terms that asks for more queries)
+ pool.get(obj).read(cr, uid, [ids[0]])
+ cnt = cr.count
+ pool.get(obj).read(cr, uid, [ids[0]])
+ code_base_complexity = cr.count - cnt
+
+ pool.get(obj).read(cr, uid, ids[:size/2])
+ cnt = cr.count
+ pool.get(obj).read(cr, uid, ids[:size/2])
+ code_half_complexity = cr.count - cnt
+
+ pool.get(obj).read(cr, uid, ids)
+ cnt = cr.count
+ pool.get(obj).read(cr, uid, ids)
+ code_size_complexity = cr.count - cnt
+
+ if size < 5:
+ speed_list = [obj, size, code_base_complexity, code_half_complexity, code_size_complexity, _("Warning! Not enough demo data")]
+ list2 = [obj, _("No enough data")]
+ else:
+ if code_size_complexity <= (code_base_complexity + size):
+ complexity = _("O(1)")
+ score += 1
+ list2 = [obj, _("Efficient")]
+ else:
+ complexity = _("O(n) or worst")
+ list2 = [obj, _("Not Efficient")]
+
+ speed_list = [obj, size, code_base_complexity, code_half_complexity, code_size_complexity, complexity]
+ else:
+ speed_list = [obj, size, "", "", "", _("Warning! Object has no demo data")]
+ list2 = [obj, _("No data")]
+ result_dict[obj] = speed_list
+ result_dict2[obj] = list2
+ self.score = obj_counter and score / obj_counter or 0.0
+ self.result_details += self.get_result_details(result_dict)
+ self.result += self.get_result(result_dict2)
+ return None
+
+ def get_result(self, dict_speed):
+ header = ('{| border="1" cellspacing="0" cellpadding="5" align="left" \n! %-40s \n! %-10s', [_('Object Name'), _('Result')])
+ if not self.error:
+ return self.format_table(header, data_list=dict_speed)
+ return ""
+
+ def get_result_details(self, dict_speed):
+ str_html = '''<html><head></head><body><table border="1">'''
+ header = ('<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>', [_('Object Name'), _('N (Number of Records)'), _('1'), _('N/2'), _('N'), _('Reading Complexity')])
+ if not self.error:
+ res = str_html + self.format_html_table(header, data_list=dict_speed) + '</table></body></html>'
+ return res
+ return ""
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+import os
+
+from tools.translate import _
+from base_module_quality import base_module_quality
+
+class quality_test(base_module_quality.abstract_quality_check):
+
+ def __init__(self):
+ super(quality_test, self).__init__()
+ self.name = _("Structure Test")
+ self.note = _("""
+This test checks if the module satisfy tiny structure
+""")
+ self.bool_installed_only = False
+ self.result_dict = {}
+ self.module_score = 0.0
+ self.count = 0
+ self.recur = True
+ return None
+
+ def run_test_struct(self, cr, uid, module_path):
+ len_module = len(module_path.split('/'))
+ module_name = module_path.split('/')
+ module_name = module_name[len_module-1]
+ list_files = os.listdir(module_path)
+ self.result_dict = {}
+ f_list = []
+ module_dict = {}
+ module_dict['module'] = []
+# count = 0
+ final_score = 0.0
+
+ if not module_name.islower():
+ self.result_dict[module_name] = [module_name, 'Module name should have in lowercase']
+ for file_struct in list_files:
+ if file_struct.split('.')[-1] != 'pyc':
+ path = os.path.join(module_path, file_struct)
+ if file_struct == 'wizard' and os.path.isdir(path):
+ module_dict[file_struct] = []
+ elif file_struct == 'report' and os.path.isdir(path):
+ module_dict[file_struct] = []
+ elif file_struct == 'security' and os.path.isdir(path):
+ module_dict[file_struct] = []
+ elif file_struct == 'process' and os.path.isdir(path):
+ module_dict[file_struct] = []
+ elif file_struct != 'i18n' and os.path.isdir(path):
+# self.counter += 1
+ self.run_test(cr, uid, path)
+ module_dict['module'].append(file_struct)
+ f_list.append(file_struct)
+ for i in f_list:
+ path = os.path.join(module_path, i)
+ if os.path.isdir(path) and not i == 'i18n':
+ for j in os.listdir(path):
+ if i in ['report', 'wizard', 'security', 'module', 'process'] and j.split('.')[-1] != 'pyc':
+ module_dict[i].append(j)
+ f_list.append(os.path.join(i, j))
+
+ # module files calculation (module.py,module_view.xml,etc..)
+ com_list = ['_unit_test.xml', '.py', '_view.xml', '_workflow.xml' , '_wizard.xml', '_report.xml', '_data.xml', '_demo.xml', '_security.xml', '_sequence.xml', '_graph.xml']
+ com_list = map(lambda x: module_name + x, com_list)
+ main_file = ['__init__.py', '__terp__.py']
+ com_list.extend(main_file)
+ module_dict['module'] = filter(lambda x: len(x.split(".")) > 1, module_dict['module'])
+ score = self.get_score(module_dict['module'], com_list)
+ self.count = self.count + 1
+ final_score += score
+
+ # report folder checking...
+ if module_dict.has_key('report'):
+ report_pys = filter(lambda x: (len(x.split('.'))>1 and x.split('.')[1] == 'py') and x != '__init__.py', module_dict['report'])
+ report_pys = map(lambda x:x.split('.')[0], report_pys)
+ reports = ['.sxw', '.rml', '.xsl', '.py', '.xml']
+ org_list_rep = []
+ for pys in report_pys:
+ for report in reports:
+ org_list_rep.append(pys + report)
+ org_list_rep.append('__init__.py')
+ score_report = self.get_score(module_dict['report'], org_list_rep, 'report/')
+ self.count = self.count + 1
+ final_score += score_report
+
+ # wizard folder checking...
+ if module_dict.has_key('wizard'):
+ wizard_pys = filter(lambda x: (len(x.split('.'))>1 and x.split('.')[1] == 'py') and x != '__init__.py', module_dict['wizard'])
+ wizard_pys = map(lambda x:x.split('.')[0], wizard_pys)
+ wizards = ['_view.xml', '_workflow.xml', '.py']
+ org_list_wiz = []
+ for pys in wizard_pys:
+ for report in wizards:
+ org_list_wiz.append(pys + report)
+ org_list_wiz.append('__init__.py')
+ score_wizard = self.get_score(module_dict['wizard'], org_list_wiz, 'wizard/')
+ self.count = self.count + 1
+ final_score += score_wizard
+
+ # security folder checking...
+ if module_dict.has_key('security'):
+ security = [module_name + '_security.xml']
+ security.extend(['ir.model.access.csv'])
+ score_security = self.get_score(module_dict['security'], security, 'security/')
+ self.count = self.count + 1
+ final_score += score_security
+
+ # process folder checking...
+ if module_dict.has_key('process'):
+ process = [module_name + '_process.xml']
+ score_process = self.get_score(module_dict['process'], process, 'process/')
+ self.count = self.count + 1
+ final_score += score_process
+
+ # final score
+ self.module_score += final_score
+ self.score = self.module_score / (self.count)
+ self.result = self.get_result({ module_name: [module_name, int(self.score*100)]})
+# self.result_details += self.get_result_details(self.result_dict)
+ return None
+
+ def run_test(self, cr, uid, module_path):
+ self.run_test_struct(cr, uid, module_path)
+ if self.score != 1:
+ self.result_details = self.get_result_details(self.result_dict)
+ return None
+
+
+ def get_result(self, dict_struct):
+ header = ('{| border="1" cellspacing="0" cellpadding="5" align="left" \n! %-40s \n! %-10s \n', [_('Module Name'), _('Result in %')])
+ if not self.error:
+ return self.format_table(header, data_list=dict_struct)
+ return ""
+
+ def get_score(self, module_list, original_files, mod_folder=''):
+ score = 0
+ module_length = len(module_list)
+ for i in module_list:
+ if i in original_files:
+ score += 1
+ else:
+ if mod_folder != 'wizard/':
+ self.result_dict[i] = [mod_folder + i, 'File name does not follow naming standards.']
+ score -= 1
+ module_length -= 1
+ score = module_length and float(score) / float(module_length)
+ return score
+
+ def get_result_details(self, dict_struct):
+ str_html = '''<html><head></head><body><table>'''
+ header = ('<tr><th>%s</th><th>%s</th></tr>', [_('File Name'), _('Feedback about structure of module')])
+ if not self.error:
+ res = str_html + self.format_html_table(header, data_list=dict_struct) + '</table></body></html>'
+ return res
+ return ""
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import os
+import re
+
+import tools
+from tools.translate import _
+from base_module_quality import base_module_quality
+import pooler
+
+class quality_test(base_module_quality.abstract_quality_check):
+
+ def __init__(self):
+ super(quality_test, self).__init__()
+ self.name = _("Terp Test")
+ self.note = _("This test checks if the module satisfies the current coding standard used by OpenERP.")
+ self.bool_installed_only = False
+ self.no_terp = False
+ self.ponderation = 2
+ return None
+
+ def run_test_terp(self, cr, uid, module_path):
+ list_files = os.listdir(module_path)
+ current_module = module_path.split('/')[-1]
+
+ for i in list_files:
+ path = os.path.join(module_path, i)
+ if os.path.isdir(path):
+ for j in os.listdir(path):
+ list_files.append(os.path.join(i, j))
+ score = 1.0
+ feel_good_factor = 0
+ feel_bad_factor = 0
+ if '__terp__.py' not in list_files:
+ self.no_terp = True
+ self.result += _("The module does not contain the __terp__.py file")
+ return None
+ result_dict = {}
+ result_dict1 = {}
+ terp_file = os.path.join(module_path,'__terp__.py')
+ res = eval(tools.file_open(terp_file).read())
+ terp_keys = ['category', 'name', 'description', 'author', 'website', 'update_xml', 'init_xml', 'depends', 'version', 'active', 'installable', 'demo_xml', 'certificate']
+ for key in terp_keys:
+ if key in res:
+ feel_good_factor += 1 # each tag should appear
+ if isinstance(res[key], (str, unicode, list)):
+ if not res[key]:
+ if key in ['description', 'author', 'website', 'category', 'version']:
+ data = "Module's terp file has no information about " + key + " tag"
+ result_dict1[key] = [key, data]
+ elif key in ['name', 'depends']:
+ data = "Module's terp file has no information about " + key + " tag"
+ result_dict1[key] = [key, data]
+ elif key == 'update_xml':
+ data = " Module update_xml tag is empty it shows that you do not have any views,wizard,workflow"
+ result_dict1[key] = [key, data]
+ elif key == 'demo_xml':
+ data = 'Module demo_xml tag is empty it shows that you do not have any demo data '
+ result_dict1[key] = [key, data]
+ feel_bad_factor += 1
+ else:
+ flag = False
+ if key == 'description' and len(str(res[key])) >= 150: # no. of chars should be >=150
+ feel_good_factor += 1
+ flag = True
+ if res['description'].count('\n') >= 4:# description contains minimum 5 lines
+ feel_good_factor += 1
+ flag = True
+ if not flag and key == 'description':
+ result_dict[key] = [key, 'Description of the module in terp is not enough, you must describe your module enough because good description is the beginning of a good documentation. And a good documentation limits the support requests.']
+ if key == 'website':
+ ptrn = re.compile('[https?://]?[\w\.:]+[\w /:]+$') # reg ex matching on temporary basis.Website is correctly formatted
+ result = ptrn.search(str(res[key]))
+ if result:
+ feel_good_factor += 1
+ else:
+ result_dict[key] = [key, 'Website tag of terp file should be in valid format or it should be lead to valid page']
+ feel_bad_factor += 1
+
+ if isinstance(res[key], bool):
+ if key == 'active':
+ if current_module != 'base':
+ if res[key]:
+ feel_bad_factor += 1
+ result_dict[key] = [key, 'Active tag of terp file should not be set to True!']
+ else:
+ if not res[key]:
+ result_dict[key] = [key, 'Active tag of terp file of base module should be set to True!']
+ feel_bad_factor += 1
+ if key == 'installable' and not res[key]: # installable tag is provided and False
+ result_dict[key] = [key, 'Installable tag of terp file of module should be set to True so that it can install on client!']
+ feel_bad_factor += 1
+ else:
+ feel_bad_factor += 1
+ result_dict1[key] = [key, "Tag is missing!"]
+
+ if result_dict1 or result_dict1:
+ score = round((feel_good_factor) / float(feel_good_factor + feel_bad_factor), 2)
+ self.result_details += self.get_result_details(result_dict)
+ self.result_details += self.get_result_details(result_dict1)
+ return [_('__terp__.py file'), score]
+
+ def run_test(self, cr, uid, module_path):
+ terp_score = self.run_test_terp(cr, uid, module_path)
+ self.score = terp_score and terp_score[1] or 0.0
+ if terp_score:
+ self.result = self.get_result({'__terp__.py': terp_score})
+ return None
+
+ def get_result(self, dict_terp):
+ header = ('{| border="1" cellspacing="0" cellpadding="5" align="left" \n! %-40s \n! %-10s \n', [_('Object Name'), _('Result (/1)')])
+ if not self.error:
+ return self.format_table(header, data_list=dict_terp)
+ return ""
+
+ def get_result_details(self, dict_terp):
+ if dict_terp:
+ str_html = '''<html><head></head><body><table border="1">'''
+ header = ('<tr><th>%s</th><th>%s</th></tr>', [_('Tag Name'), _('Feed back About terp file of Module')])
+ if not self.error:
+ res = str_html + self.format_html_table(header, data_list=dict_terp) + '</table><newline/></body></html>'
+ return res
+ return ""
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import module_quality_check
+import quality_save_report
+
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+import os
+
+import wizard
+import pooler
+from osv import osv, fields
+
+#TODO: add cheks: do the class quality_check inherits the class abstract_quality_check?
+
+class quality_check(wizard.interface):
+
+ def _create_quality_check(self, cr, uid, data, context={}):
+ pool = pooler.get_pool(cr.dbname)
+ obj_quality = pool.get('module.quality.check')
+ objs = []
+ for id in data['ids']:
+ module_data = pool.get('ir.module.module').browse(cr, uid, id)
+ data = obj_quality.check_quality(cr, uid, module_data.name, module_data.state)
+ obj = obj_quality.create(cr, uid, data, context)
+ objs.append(obj)
+ return objs
+
+ def _open_quality_check(self, cr, uid, data, context):
+ obj_ids = self._create_quality_check(cr, uid, data, context)
+ return {
+ 'domain': "[('id','in', ["+','.join(map(str,obj_ids))+"])]",
+ 'name': _('Quality Check'),
+ 'view_type': 'form',
+ 'view_mode': 'tree,form',
+ 'res_model': 'module.quality.check',
+ 'type': 'ir.actions.act_window'
+ }
+
+ states = {
+ 'init' : {
+ 'actions' : [],
+ 'result': {'type':'action', 'action':_open_quality_check, 'state':'end'}
+ }
+ }
+
+quality_check("create_quality_check_wiz")
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+import base64
+import cStringIO
+
+import wizard
+from osv import osv
+import pooler
+
+form_rep = '''<?xml version="1.0"?>
+<form string="Standard entries">
+ <field name="name"/>
+ <newline/>
+ <field name="module_file"/>
+</form>'''
+
+
+fields_rep = {
+ 'name': {'string': 'File name', 'type': 'char', 'required': True, 'help': 'Save report as .html format'},
+ 'module_file': {'string': 'Save report', 'type': 'binary', 'required': True},
+}
+
+def get_detail(self, cr, uid, datas, context={}):
+ data = pooler.get_pool(cr.dbname).get('module.quality.detail').browse(cr, uid, datas['id'])
+ if not data.detail:
+ raise wizard.except_wizard(_('Warning'), _('No report to save!'))
+ buf = cStringIO.StringIO(data.detail)
+ out = base64.encodestring(buf.getvalue())
+ buf.close()
+ return {'module_file': out, 'name': data.name + '.html'}
+
+class save_report(wizard.interface):
+ states = {
+ 'init': {
+ 'actions': [get_detail],
+ 'result': {'type': 'form', 'arch': form_rep, 'fields':fields_rep, 'state': [('end','Cancel')]}
+ },
+ }
+save_report('quality_detail_save')
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
--- /dev/null
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
+# $Id$
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+import xml.dom.minidom
+
+import tools
+from tools.translate import _
+from base_module_quality import base_module_quality
+import pooler
+
+class quality_test(base_module_quality.abstract_quality_check):
+
+ def __init__(self):
+ super(quality_test, self).__init__()
+ self.name = _("Workflow Test")
+ self.note = _("This test checks where object has workflow or not on it if there is a state field and several buttons on it and also checks validity of workflow xml file")
+ self.bool_installed_only = True
+ return None
+
+ def run_test(self, cr, uid, module_path):
+ pool = pooler.get_pool(cr.dbname)
+ module_name = module_path.split('/')[-1]
+ obj_list = self.get_objects(cr, uid, module_name)
+ view_obj = pool.get('ir.ui.view')
+ view_ids = view_obj.search(cr, uid, [('model', 'in', obj_list), ('type', 'in', ['form'])])
+ view_data = view_obj.browse(cr, uid, view_ids)
+ field_obj = pool.get('ir.model.fields')
+ field_ids = field_obj.search(cr, uid, [('model', 'in', obj_list)])
+ field_data = field_obj.browse(cr, uid, field_ids)
+ wkf_obj = pool.get('workflow')
+ wkf_activity_obj = pool.get('workflow.activity')
+
+ state_check = []
+ wkf_avail = []
+ result_dict = {}
+ activity_chk = {}
+ bad_view = 0
+ good_view = 0
+ act_ok = 0
+ not_ok = 0
+ wkfs = []
+
+ if obj_list:
+ wkf_ids = wkf_obj.search(cr, uid, [('osv', 'in', obj_list)])
+ wkfs = wkf_obj.read(cr, uid, wkf_ids, ['osv'])
+ for i in wkfs:
+ activity_chk[i['osv']] = {'start': 'not_ok', 'stop': 'not_ok'}
+ wkf_avail.append(i['osv'])
+ model_ids = self.get_ids(cr, uid, [i['osv']])
+ if len(model_ids[i['osv']]) < 2: # to be modified..
+ bad_view += 1
+ result_dict[i['osv']] = [i['osv'], 'You should have enough demo data which allows testing of integrity of module and ensures the proper functioning of workflows']
+ else:
+ good_view += 1
+ wkf_ids = map(lambda x:x['id'], wkfs)
+ if not wkf_ids:
+ result_dict[module_name] = [module_name, 'No workflow defined on module']
+ #Activity of workflow checking...
+ activity_ids = wkf_activity_obj.search(cr, uid, [('wkf_id', 'in', wkf_ids)])
+ activities = wkf_activity_obj.browse(cr, uid, activity_ids)
+ for activity in activities:
+ if activity.flow_start:
+ activity_chk[activity.wkf_id.osv]['start'] = 'ok'
+ if activity.flow_stop:
+ activity_chk[activity.wkf_id.osv]['stop'] = 'ok'
+ activity_chk[activity.wkf_id.osv]['model'] = activity.wkf_id.osv
+ if activity.in_transitions and activity.out_transitions:
+ act_ok += 1
+ if not activity.in_transitions and not activity.out_transitions:
+ not_ok += 1
+ result_dict[activity.id] = [activity.name, 'Use less activity (improves readability and protects server resources)']
+ for act in activity_chk:
+ if activity_chk[act]['start'] == 'ok':
+ act_ok += 1
+ else:
+ not_ok += 1
+ result_dict[activity_chk[act]['model']] = [activity_chk[act]['model'], 'Workflow activities should have atleast one starting node']
+ if activity_chk[act]['stop'] == 'ok':
+ act_ok += 1
+ else:
+ not_ok += 1
+ result_dict[activity_chk[act]['model']] = [activity_chk[act]['model'], 'Workflow activities should have atleast one ending node']
+
+ score_general = act_ok and float(act_ok) / float(act_ok + not_ok)
+ # workflow defined on object or not checking..
+ for field in field_data:
+ if field.name == 'state':
+ state_check.append(field.model)
+ for view in view_data:
+ if view.model in state_check:
+ dom = xml.dom.minidom.parseString(view.arch)
+ node = dom.childNodes
+ count = self.count_button(node[0], count=0)
+ if count > 3 and not view.model in wkf_avail:
+ bad_view += 1
+ result_dict[view.model] = [view.model, 'The presence of a field state in object often indicative of a need for workflow behind. And connect them to ensure consistency in this field.']
+ elif count > 0 and view.model in wkf_avail:
+ good_view += 1
+ score_avail = good_view and float(good_view) / float(bad_view + good_view)
+ self.score = (score_general + score_avail) / 2
+
+ if not wkf_ids and not bad_view:
+ self.error = True
+ self.result = _("No Workflow define")
+ return None
+ self.result = self.get_result({module_name: [module_name, int(self.score * 100)]})
+ self.result_details += self.get_result_details(result_dict)
+ return None
+
+ def get_result(self, dict_wf):
+ header = ('{| border="1" cellspacing="0" cellpadding="5" align="left" \n! %-40s \n! %-10s \n', [_('Module Name'), _('Result of views in %')])
+ if not self.error:
+ return self.format_table(header, data_list=dict_wf)
+ return ""
+
+ def get_result_details(self, dict_wf):
+ str_html = '''<html><head></head><body><table border="1">'''
+ header = ('<tr><th>%s</th><th>%s</th></tr>', [_('Object Name'), _('Feed back About Workflow of Module')])
+ if not self.error:
+ res = str_html + self.format_html_table(header, data_list=dict_wf) + '</table><newline/></body></html>'
+ return res
+ return ""
+
+ def count_button(self, node, count):
+ for node in node.childNodes:
+ if node.localName == 'button':
+ count += 1
+ if node.childNodes:
+ count = self.count_button(node, count)
+ return count
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-12 13:40+0000\n"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-12 13:23+0000\n"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-12 14:32+0000\n"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2009-05-19 14:36+0000\n"
-"PO-Revision-Date: 2009-06-12 13:41+0000\n"
+"POT-Creation-Date: 2009-04-09 17:23+0000\n"
+"PO-Revision-Date: 2009-07-06 13:05+0000\n"
"Last-Translator: Olivier (OpenERP) <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2009-06-12 14:08+0000\n"
+"X-Launchpad-Export-Date: 2009-07-06 13:24+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: board_association
msgstr "Associations"
#. module: board_association
-#: model:ir.module.module,shortdesc:board_association.module_meta_information
-msgid "Dashboard for Associations"
-msgstr "Tableau de Bord pour les Associations"
-
-#. module: board_association
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "XML non valide pour l'architecture de la vue"
msgstr "Factures impayées"
#. module: board_association
-#: constraint:ir.actions.act_window:0
-msgid "Invalid model name in the action definition."
-msgstr "Nom du modèle non valide pour la définition de l'action."
-
-#. module: board_association
#: view:board.board:0
msgid "Next Events"
msgstr "Prochains événements"
#: view:board.board:0
msgid "Registrations by Events"
msgstr "Inscriptions par événement"
+
+#. module: board_association
+#: model:ir.module.module,shortdesc:board_association.module_meta_information
+msgid "Dashboard for Associations"
+msgstr "Tableau de Bord pour les Associations"
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2009-05-19 14:22:20+0000\n"
-"PO-Revision-Date: 2009-05-20 10:22:20+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2009-04-09 17:23+0000\n"
+"PO-Revision-Date: 2009-07-06 13:12+0000\n"
+"Last-Translator: Olivier (OpenERP) <Unknown>\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: 2009-07-06 13:44+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
#. module: board_manufacturing
#: view:board.board:0
#. module: board_manufacturing
#: view:board.board:0
-msgid "Deliveries (Out packing)"
-msgstr ""
-
-#. module: board_manufacturing
-#: view:board.board:0
msgid "Manufacturing board"
msgstr "Tableau de bord production"
msgstr "Gestion de la production"
#. module: board_manufacturing
-#: constraint:ir.actions.act_window:0
-msgid "Invalid model name in the action definition."
-msgstr ""
+#: view:board.board:0
+msgid "Deliveries (Out packing)"
+msgstr "Livraisons"
#. module: board_manufacturing
#: model:ir.actions.act_window,name:board_manufacturing.open_board_manufacturing
msgstr "Tableau de bord de production"
#. module: board_manufacturing
-#: model:ir.module.module,shortdesc:board_manufacturing.module_meta_information
-msgid "Board for manufacturing"
-msgstr ""
-
-#. module: board_manufacturing
#: view:board.board:0
msgid "Stock value variation"
msgstr "Variation de la valeur du stock"
msgid "Workcenter futur load"
msgstr "Charge future du poste de charge"
+#. module: board_manufacturing
+#: model:ir.module.module,shortdesc:board_manufacturing.module_meta_information
+msgid "Board for manufacturing"
+msgstr "Tableau de Bord de la Production"
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2009-05-19 14:22:20+0000\n"
-"PO-Revision-Date: 2009-05-20 10:22:20+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2009-04-09 17:23+0000\n"
+"PO-Revision-Date: 2009-07-06 13:08+0000\n"
+"Last-Translator: Olivier (OpenERP) <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: \n"
-
-#. module: board_sale
-#: model:ir.module.module,shortdesc:board_sale.module_meta_information
-msgid "Dashboard for sales"
-msgstr ""
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2009-07-06 13:36+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
#. module: board_sale
#: model:ir.actions.act_window,name:board_sale.open_board_sales_manager
#. module: board_sale
#: view:board.board:0
msgid "Cases of the month"
-msgstr ""
+msgstr "Cas du Mois"
#. module: board_sale
#: constraint:ir.ui.view:0
msgstr "Mes Devis Ouverts"
#. module: board_sale
-#: constraint:ir.actions.act_window:0
-msgid "Invalid model name in the action definition."
-msgstr ""
-
-#. module: board_sale
#: model:ir.ui.menu,name:board_sale.next_id_88
msgid "Sales"
msgstr "Ventes"
msgid "Top ten sales of the month"
msgstr "10 meilleures Ventes du Mois"
+#. module: board_sale
+#: model:ir.module.module,shortdesc:board_sale.module_meta_information
+msgid "Dashboard for sales"
+msgstr "Tableau de Bord des Ventes"
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2009-05-19 14:22:20+0000\n"
-"PO-Revision-Date: 2009-05-20 10:22:20+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2009-04-09 17:23+0000\n"
+"PO-Revision-Date: 2009-07-06 13:00+0000\n"
+"Last-Translator: Olivier (OpenERP) <Unknown>\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: 2009-07-06 13:04+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
#. module: crm_vertical
#: code:addons/crm_vertical/crm_vertical.py:0
#, python-format
msgid "Error !"
-msgstr ""
+msgstr "Erreur !"
#. module: crm_vertical
#: model:ir.module.module,description:crm_vertical.module_meta_information
msgid "Simplification of the interface for CRM."
-msgstr ""
-
+msgstr "Simplification de l'interface de la CRM"
#. module: delivery
#: model:product.template,name:delivery.delivery_product_product_template
msgid "Delivery by Poste"
-msgstr ""
+msgstr "Livraison par Poste"
#. module: delivery
#: constraint:ir.ui.view:0
#. module: delivery
#: constraint:res.partner:0
msgid "Error ! You can not create recursive associated members."
-msgstr ""
+msgstr "Erreur ! Vous ne pouvez pas créer de membres associés de manière récursive."
#. module: delivery
#: field:delivery.grid,state_ids:0
#. module: delivery
#: help:res.partner,property_delivery_carrier:0
msgid "This delivery method will be used when invoicing from packing."
-msgstr ""
+msgstr "Cette méthode de livraison sera utilisée lors de facturations à partir du Colisage."
#. module: delivery
#: model:ir.model,name:delivery.model_delivery_grid
#: code:addons/delivery/wizard/delivery_sale_order.py:0
#, python-format
msgid "The order state have to be draft to add delivery lines."
-msgstr ""
+msgstr "La Commande doit être à l'état Brouillon pour ajouter des lignes de livraison."
#. module: delivery
#: field:delivery.grid,line_ids:0
#: code:addons/delivery/wizard/delivery_sale_order.py:0
#, python-format
msgid "No grid matching for this carrier !"
-msgstr ""
+msgstr "Aucune grille trouvée pour ce transporteur !"
#. module: delivery
#: model:ir.model,name:delivery.model_delivery_grid_line
#. module: delivery
#: view:res.partner:0
msgid "Deliveries Properties"
-msgstr ""
+msgstr "Propriétés des Livraisons"
#. module: delivery
#: field:delivery.carrier,active:0
#. module: delivery
#: field:delivery.carrier,product_id:0
msgid "Delivery Product"
-msgstr ""
+msgstr "Produit de Livraison"
#. module: delivery
#: view:delivery.grid.line:0
#: code:addons/delivery/wizard/delivery_sale_order.py:0
#, python-format
msgid "No grid avaible !"
-msgstr ""
+msgstr "Aucune grille disponible !"
#. module: delivery
#: field:delivery.grid,name:0
#. module: delivery
#: wizard_button:delivery.sale.order,init,delivery:0
msgid "Add Delivery Costs"
-msgstr ""
+msgstr "Ajouter des Coûts de Livraison"
#. module: delivery
#: wizard_field:delivery.sale.order,init,carrier_id:0
#. module: delivery
#: field:sale.order,id:0
msgid "ID"
-msgstr ""
+msgstr "ID"
#. module: delivery
#: field:delivery.grid.line,operator:0
#. module: delivery
#: model:ir.module.module,shortdesc:delivery.module_meta_information
msgid "Carriers and deliveries"
-msgstr ""
+msgstr "Transporteurs et Livraisons"
#. module: delivery
#: code:addons/delivery/wizard/delivery_sale_order.py:0
#, python-format
msgid "Order not in draft state !"
-msgstr ""
+msgstr "Commande pas dans l'état Brouillon !"
#. module: delivery
#: field:delivery.carrier,grids_id:0
#: model:ir.module.module,description:delivery.module_meta_information
msgid "Allows you to add delivery methods in sales orders and packing. You can define your own carrier and delivery grids for prices. When creating invoices from picking, Open ERP is able to add and compute the shipping line."
msgstr ""
+"Permet d'ajouter des méthodes de livraison ax commandes de ventes et colisages. "
+"Vous pouvez définir vos propres transporteurs et grilles de livraisons. "
+"À la création de factures à partir des colisages, Open ERP est capable d'ajouter et de calculer les lignes de livraison."
#. module: delivery
#: field:delivery.grid,zip_to:0
#: code:addons/delivery/delivery.py:0
#, python-format
msgid "No line matched this order in the choosed delivery grids !"
-msgstr ""
+msgstr "Aucune ligne ne correspond à cette commande dans les grilles de livraison choisies !"
#. module: delivery
#: model:ir.actions.act_window,name:delivery.action_picking_tree4
#: model:ir.ui.menu,name:delivery.menu_action_picking_tree3
msgid "Packing to be invoiced"
-msgstr ""
+msgstr "Colisage à facturer"
#. module: delivery
#: code:addons/delivery/delivery.py:0
#, python-format
msgid "No price available !"
-msgstr ""
+msgstr "Aucun prix disponible !"
#. module: delivery
#: help:sale.order,carrier_id:0
msgid "Complete this field if you plan to invoice the shipping based on packing."
-msgstr ""
+msgstr "Complétez ce champ si vous avez l'intention de livrer en vous basant sur le colisage."
#. module: delivery
#: model:ir.actions.wizard,name:delivery.wizard_deliver_line_add
msgid "Delivery Costs"
-msgstr ""
+msgstr "Coûts de Livraison"
#. module: delivery
#: field:delivery.grid.line,list_price:0
#: code:addons/delivery/stock.py:0
#, python-format
msgid "The carrier %s (id: %d) has no delivery grid!"
-msgstr ""
+msgstr "Le Transporteur %s (id: %d) n'a pas de grille de livraison !"
#. module: delivery
#: wizard_button:delivery.sale.order,init,end:0
#: code:addons/delivery/stock.py:0
#, python-format
msgid "Warning"
-msgstr ""
+msgstr "Avertissement"
#. module: delivery
#: field:sale.order,carrier_id:0
test_nodename=test_nodename.replace('/', '_')
path = self.path+'/'+test_nodename
if not nodename:
- n = node_class(self.cr, self.uid,path, self.object2, False, content=content, type='content', root=False)
+ n = node_class(self.cr, self.uid,path, self.object2, False, context=self.context, content=content, type='content', root=False)
res2.append( n)
else:
if nodename == test_nodename:
- n = node_class(self.cr, self.uid, path, self.object2, False, content=content, type='content', root=False)
+ n = node_class(self.cr, self.uid, path, self.object2, False, context=self.context, content=content, type='content', root=False)
res2.append(n)
- ids = fobj.search(self.cr, self.uid, where+[ ('parent_id','=',self.object and self.object.id or False) ], context=self.context)
+ ids = fobj.search(self.cr, self.uid, where+[ ('parent_id','=',self.object and self.object.id or False) ])
if self.object and self.root and (self.object.type=='ressource'):
- ids += fobj.search(self.cr, self.uid, where+[ ('parent_id','=',False) ], context=self.context)
+ ids += fobj.search(self.cr, self.uid, where+[ ('parent_id','=',False) ])
res = fobj.browse(self.cr, self.uid, ids, context=self.context)
- return map(lambda x: node_class(self.cr, self.uid, self.path+'/'+x.name, x, False, type='file', root=False), res) + res2
-
+ return map(lambda x: node_class(self.cr, self.uid, self.path+'/'+x.name, x, False, context=self.context, type='file', root=False), res) + res2
+
+ def get_translation(self,value,lang):
+ result = value
+ pool = pooler.get_pool(self.cr.dbname)
+ translation_ids = pool.get('ir.translation').search(self.cr, self.uid, [('value','=',value),('lang','=',lang),('type','=','model')])
+ if len(translation_ids):
+ tran_id = translation_ids[0]
+ translation = pool.get('ir.translation').read(self.cr, self.uid, tran_id, ['res_id','name'])
+ res_model,field_name = tuple(translation['name'].split(','))
+ res_id = translation['res_id']
+ res = pool.get(res_model).read(self.cr, self.uid, res_id, [field_name])
+ if res:
+ result = res[field_name]
+ return result
+
def directory_list_for_child(self,nodename,parent=False):
pool = pooler.get_pool(self.cr.dbname)
where = []
- if nodename:
+ if nodename:
+ nodename = self.get_translation(nodename, self.context['lang'])
where.append(('name','like',nodename))
if (self.object and self.object.type=='directory') or not self.object2:
where.append(('parent_id','=',self.object and self.object.id or False))
else:
where.append(('ressource_parent_type_id','=',False))
- ids = pool.get('document.directory').search(self.cr, self.uid, where+[('ressource_id','=',0)], self.context)
+ ids = pool.get('document.directory').search(self.cr, self.uid, where+[('ressource_id','=',0)])
if self.object2:
- ids += pool.get('document.directory').search(self.cr, self.uid, where+[('ressource_id','=',self.object2.id)], self.context)
- res = pool.get('document.directory').browse(self.cr, self.uid, ids,self.context)
+ ids += pool.get('document.directory').search(self.cr, self.uid, where+[('ressource_id','=',self.object2.id)])
+ res = pool.get('document.directory').browse(self.cr, self.uid, ids, self.context)
return res
def _child_get(self, nodename=False):
if self.type not in ('collection','database'):
return []
res = self.directory_list_for_child(nodename)
- result= map(lambda x: node_class(self.cr, self.uid, self.path+'/'+x.name, x, x.type=='directory' and self.object2 or False, root=self.root), res)
+ result= map(lambda x: node_class(self.cr, self.uid, self.path+'/'+x.name, x, x.type=='directory' and self.object2 or False, context=self.context, root=self.root), res)
if self.type=='database':
pool = pooler.get_pool(self.cr.dbname)
fobj = pool.get('ir.attachment')
file_ids=fobj.search(self.cr,self.uid,vargs)
res = fobj.browse(self.cr, self.uid, file_ids, context=self.context)
- result +=map(lambda x: node_class(self.cr, self.uid, self.path+'/'+x.name, x, False, type='file', root=self.root), res)
+ result +=map(lambda x: node_class(self.cr, self.uid, self.path+'/'+x.name, x, False, context=self.context, type='file', root=self.root), res)
if self.type=='collection' and self.object.type=="ressource":
where = self.object.domain and eval(self.object.domain, {'active_id':self.root}) or []
pool = pooler.get_pool(self.cr.dbname)
nodename=nodename.replace('__','/')
for invalid in INVALID_CHARS:
if nodename.find(INVALID_CHARS[invalid]) :
- nodename=nodename.replace(INVALID_CHARS[invalid],invalid)
+ nodename=nodename.replace(INVALID_CHARS[invalid],invalid)
+ nodename = self.get_translation(nodename, self.context['lang'])
where.append((_dirname_field,'like',nodename))
-
+
if self.object.ressource_tree:
if obj._parent_name in obj.fields_get(self.cr,self.uid):
- where.append((obj._parent_name,'=',self.object2 and self.object2.id or False))
+ where.append((obj._parent_name,'=',self.object2 and self.object2.id or False))
+ ids = obj.search(self.cr, self.uid, where)
+ res = obj.browse(self.cr, self.uid, ids,self.context)
+ result+= map(lambda x: node_class(self.cr, self.uid, self.path+'/'+x.name.replace('/','__'), self.object, x, context=self.context, root=x.id), res)
+ return result
else :
if self.object2:
return result
return result
- ids = obj.search(self.cr, self.uid, where, self.context)
- res = obj.browse(self.cr, self.uid, ids,self.context)
- if _dirname_field == 'dirname':
- for r in res:
- if not r.dirname:
- r.dirname = name_for+'%d'%r.id
- for invalid in INVALID_CHARS:
- if r.dirname.find(invalid) :
- r.dirname=r.dirname.replace(invalid,INVALID_CHARS[invalid])
- result2 = map(lambda x: node_class(self.cr, self.uid, self.path+'/'+x.dirname.replace('/','__'), self.object, x, root=x.id), res)
-
- else:
- for r in res:
- if not r.name:
- r.name = name_for+'%d'%r.id
- for invalid in INVALID_CHARS:
- if r.name.find(invalid) :
- r.name=r.name.replace(invalid,INVALID_CHARS[invalid])
- result2 = map(lambda x: node_class(self.cr, self.uid, self.path+'/'+x.name.replace('/','__'), self.object, x, root=x.id), res)
-
+ ids = obj.search(self.cr, self.uid, where)
+ res = obj.browse(self.cr, self.uid, ids,self.context)
+ for r in res:
+ if len(obj.fields_get(self.cr, self.uid, [_dirname_field])):
+ r.name = eval('r.'+_dirname_field)
+ else:
+ r.name = name_for+'%d'%r.id
+ for invalid in INVALID_CHARS:
+ if r.name.find(invalid) :
+ r.name=r.name.replace(invalid,INVALID_CHARS[invalid])
+ result2 = map(lambda x: node_class(self.cr, self.uid, self.path+'/'+x.name.replace('/','__'), self.object, x, context=self.context, root=x.id), res)
if result2:
if self.object.ressource_tree:
result += result2
else:
- result = result2
+ result = result2
return result
def children(self):
_name = 'document.directory'
_description = 'Document directory'
_columns = {
- 'name': fields.char('Name', size=64, required=True, select=1),
+ 'name': fields.char('Name', size=64, required=True, select=1, translate=True),
'write_date': fields.datetime('Date Modified', readonly=True),
'write_uid': fields.many2one('res.users', 'Last Modification User', readonly=True),
'create_date': fields.datetime('Date Created', readonly=True),
def __init__(self, *args, **kwargs):
res = super(document_directory, self).__init__(*args, **kwargs)
self._cache = {}
- return res
def onchange_content_id(self, cr, uid, ids, ressource_type_id):
return {}
def _get_childs(self, cr, uid, node, nodename=False, context={}):
where = []
if nodename:
+ nodename = self.get_translation(nodename, self.context['lang'])
where.append(('name','like',nodename))
if object:
where.append(('parent_id','=',object.id))
object: the object.directory or object.directory.content
object2: the other object linked (if object.directory.content)
"""
- def get_object(self, cr, uid, uri, context={}):
+ def get_object(self, cr, uid, uri, context={}):
+ lang = context.get('lang',False)
+ if not lang:
+ user = self.pool.get('res.users').browse(cr, uid, uid)
+ lang = user.context_lang
+ context['lang'] = lang
if not uri:
- return node_class(cr, uid, '', False, type='database')
+ return node_class(cr, uid, '', False, context=context, type='database')
turi = tuple(uri)
- if False and (turi in self._cache):
- (path, oo, oo2, content,type,root) = self._cache[turi]
+ if False and (turi in self._cache):
+ (path, oo, oo2, context, content,type,root) = self._cache[turi]
if oo:
object = self.pool.get(oo[0]).browse(cr, uid, oo[1], context)
else:
object2 = self.pool.get(oo2[0]).browse(cr, uid, oo2[1], context)
else:
object2 = False
- node = node_class(cr, uid, path, object,object2, context, content, type, root)
+ node = node_class(cr, uid, '/', False, context=context, type='database')
return node
- node = node_class(cr, uid, '/', False, type='database')
+ node = node_class(cr, uid, '/', False, context=context, type='database')
for path in uri[:]:
if path:
node = node.child(path)
return False
oo = node.object and (node.object._name, node.object.id) or False
oo2 = node.object2 and (node.object2._name, node.object2.id) or False
- self._cache[turi] = (node.path, oo, oo2, node.content,node.type,node.root)
+ self._cache[turi] = (node.path, oo, oo2, node.context, node.content,node.type,node.root)
return node
def get_childs(self, cr, uid, uri, context={}):
ressource_parent_type_id=vals.get('ressource_parent_type_id',False)
ressource_id=vals.get('ressource_id',0)
if op=='write':
- for directory in self.browse(cr,uid,ids):
+ for directory in self.browse(cr,uid,ids):
if not name:
name=directory.name
if not parent_id:
res_model=vals.get('res_model',False)
res_id=vals.get('res_id',0)
if op=='write':
- for file in self.browse(cr,uid,ids):
+ for file in self.browse(cr,uid,ids):
if not name:
name=file.name
if not parent_id:
res=self.search(cr,uid,[('id','<>',file.id),('name','=',name),('parent_id','=',parent_id),('res_model','=',res_model),('res_id','=',res_id)])
if len(res):
return False
-
if op=='create':
res=self.search(cr,uid,[('name','=',name),('parent_id','=',parent_id),('res_id','=',res_id),('res_model','=',res_model)])
if len(res):
result = obj_model.read(cr, uid, [vals['res_id']], context=context)
if len(result):
obj=result[0]
- vals['title'] = (obj['name'] or '')[:60]
+ vals['title'] = (obj.get('name',''))[:60]
if obj_model._name=='res.partner':
vals['partner_id']=obj['id']
elif obj.get('address_id',False):
"view_mode": 'form',
'res_model': 'ir.actions.configuration.wizard',
'type': 'ir.actions.act_window',
- 'target':'new',
+ 'target': 'new',
}
document_configuration_wizard()
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-04-10 12:38+0000\n"
"PO-Revision-Date: 2009-04-20 06:41+0000\n"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-11 13:40+0000\n"
LEFT JOIN (hr_attendance a \
LEFT JOIN hr_employee e \
ON (a.employee_id = e.id)) \
- ON (s.date_to >= a.name \
- AND s.date_from <= a.name \
+ ON (s.date_to >= a.name::date \
+ AND s.date_from <= a.name::date \
AND s.user_id = e.user_id) ' + \
qu1, qu2)
res = cursor.fetchall()
LEFT JOIN hr_employee e
ON (s.user_id = e.user_id))
ON (a.employee_id = e.id
- AND s.date_to >= a.name
- AND s.date_from <= a.name)
+ AND s.date_to >= a.name::date
+ AND s.date_from <= a.name::date)
WHERE action in ('sign_in', 'sign_out')
group by a.name::date, s.id
)) AS foo
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-11 09:26+0000\n"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-05 13:59+0000\n"
#: model:ir.actions.wizard,name:mrp.wiz_mrp_proc2
#: model:ir.ui.menu,name:mrp.menu_wiz_mrp_proc2
msgid "Compute Stock Minimum Rules Only"
-msgstr ""
+msgstr "Calculer Uniquement les Règles de Stock Minimum"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_procurement_action5
#. module: mrp
#: model:process.node,name:mrp.process_node_stock0
msgid "Stockable Stock"
-msgstr ""
+msgstr "Stock Stoquable"
#. module: mrp
#: code:addons/mrp/wizard/wizard_change_production_qty.py:0
#. module: mrp
#: view:res.company:0
msgid "MRP & Logistic Scheduler"
-msgstr ""
+msgstr "Plannificateur MRP & Logistique"
#. module: mrp
#: help:mrp.workcenter,capacity_per_cycle:0
#. module: mrp
#: field:mrp.workcenter,costs_cycle_account_id:0
msgid "Cycle Account"
-msgstr ""
+msgstr "Compte Cyclique"
#. module: mrp
#: view:mrp.workcenter:0
cr.execute('select id from mrp_procurement where state=%s and procure_method=%s order by date_planned limit 500 offset %s', ('confirmed','make_to_order',offset))
ids = map(lambda x:x[0], cr.fetchall())
for proc in procurement_obj.browse(cr, uid, ids):
- if maxdate.strftime('%Y-%m-%d')>=proc.date_planned:
+ if (maxdate.strftime('%Y-%m-%d')>=proc.date_planned) or (proc.procure_method=='make_to_order'):
wf_service.trg_validate(uid, 'mrp.procurement', proc.id, 'button_check', cr)
else:
offset+=1
report_ids = []
ids = self.pool.get('mrp.procurement').search(cr, uid, [('state','=','confirmed'),('procure_method','=','make_to_stock')], offset=offset)
for proc in procurement_obj.browse(cr, uid, ids):
- if (maxdate).strftime('%Y-%m-%d') >= proc.date_planned:
+ if ((maxdate).strftime('%Y-%m-%d') >= proc.date_planned) or (proc.procure_method=='make_to_order'):
wf_service.trg_validate(uid, 'mrp.procurement', proc.id, 'button_check', cr)
report_ids.append(proc.id)
else:
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-11 08:50+0000\n"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-12 06:17+0000\n"
_defaults = {
'user_id': lambda self, cr, uid, context: uid,
+ 'salesman_id': lambda self, cr, uid, context: uid,
'state': lambda *a: 'draft',
'name': lambda obj, cr, uid, context: obj.pool.get('ir.sequence')\
.get(cr, uid, 'pos.order'),
self.write(cr, uid, [order.id], {'last_out_picking': picking_id})
else:
picking_id = order.last_out_picking.id
- picking_obj.write(cr, uid, [picking_id], {'auto_picking': True})
+ picking_obj.write(cr, uid, [picking_id], {
+ 'auto_picking': True,
+ 'invoice_state': '2binvoiced',
+ })
picking = picking_obj.browse(cr, uid, [picking_id], context)[0]
new = False
'payments': False,
})
clone_list.append(clone_id)
+ self.write(cr, uid, clone_id, {
+ 'partner_id': order.partner_id.id,
+ })
for clone in self.browse(cr, uid, clone_list):
for order_line in clone.lines:
line_obj.write(cr, uid, [order_line.id], {
- 'qty': -order_line.qty
+ 'qty': -order_line.qty,
})
return clone_list
count(pp.id) as no_trans,
sum(amount) as amount,
pp.journal_id,
- date_trunc('day',pp.create_date)::text as date_create,
+ to_char(pp.create_date, 'YYYY-MM-DD') as date_create,
ps.user_id,
ps.invoice_id
from
pos_payment pp, pos_order ps
WHERE ps.id = pp.order_id
group by
- pp.journal_id, date_trunc('day',pp.create_date), ps.user_id, ps.invoice_id
+ pp.journal_id, date_create, ps.user_id, ps.invoice_id
)
""")
report_transaction_pos()
<field name="res_model">report.transaction.pos</field>
<field name="view_type">form</field>
<field name="view_mode">tree</field>
- <field name="domain">[('date_create','=',time.strftime('%Y-%m-%d'))]</field>
+ <field name="domain">[('date_create','like',time.strftime('%Y-%m-%d'))]</field>
</record>
<menuitem name="Reporting" parent="menu_point_root" id="menu_point_rep"/>
<menuitem name="Sales of the day" parent="menu_point_rep" action="action_trans_pos_tree_today" id="menu_trans_pos_tree_today"/>
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_pos_config_journal","pos.config.journal","model_pos_config_journal","point_of_sale.group_pos_user",1,0,0,0
+"access_pos_config_journal_manager","pos.config.journal","model_pos_config_journal","point_of_sale.group_pos_manager",1, 1, 1, 1
"access_pos_order","pos.order","model_pos_order","point_of_sale.group_pos_user",1,1,1,1
"access_pos_order_line","pos.order.line","model_pos_order_line","point_of_sale.group_pos_user",1,1,1,1
"access_pos_payment","pos.payment","model_pos_payment","point_of_sale.group_pos_user",1,1,1,1
<?xml version="1.0" encoding="utf-8"?>
<openerp>
-<data noupdate="1">
+ <data noupdate="1">
<record id="group_pos_manager" model="res.groups">
<field name="name">Point of Sale / Manager</field>
<record id="group_pos_user" model="res.groups">
<field name="name">Point of Sale / User</field>
</record>
+ </data>
-</data>
+ <data>
+
+ <record id="menu_point_config" model="ir.ui.menu">
+ <field eval="[(6,0,[ref('group_pos_manager')])]" name="groups_id"/>
+ </record>
+
+ </data>
</openerp>
<group colspan="4" string="Details">
<field name="name" select="1"/>
<field name="flow_start"/>
- <field name="process_id" invisible="1" readonly="1" required="0"/> <!-- used by transition_out -->
+ <field name="process_id" readonly="1" required="0"/> <!-- used by transition_out -->
<newline/>
<field name="model_id" select="1"/>
<field name="menu_id" select="2"/>
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-05 14:20+0000\n"
"The coefficient for the formula:\n"
"1 (base unit) = coeff (this unit). Rate = 1 / Factor."
msgstr ""
+"Coefficient pour la formule:\n"
+"1 (unité de base) = coeff (cette unité). Taux = 1 / Facteur."
#. module: product
#: help:product.template,weight_net:0
msgid "The net weight in Kg."
-msgstr ""
+msgstr "La masse nette en Kg."
#. module: product
#: model:product.template,name:product.product_product_tow1_product_template
msgstr "Tour ATX Moyenne"
#. module: product
+#: model:ir.actions.act_window,name:product.product_pricelist_action
+#: model:ir.ui.menu,name:product.menu_product_pricelist_action
+#: field:product.pricelist,version_id:0
+
+#. module: product
#: field:product.supplierinfo,delay:0
msgid "Delivery Delay"
msgstr "Délai de livraison"
#. module: product
#: help:product.template,volume:0
msgid "The volume in m3."
-msgstr ""
+msgstr "Le volume en m3"
#. module: product
#: model:product.ul,name:product.product_ul_big_box
msgid "Box 30x40x60"
-msgstr ""
+msgstr "Caisse 30x40x60"
#. module: product
#: model:product.uom,name:product.product_uom_kgm
msgid "KGM"
-msgstr ""
+msgstr "KGM"
#. module: product
#: field:product.pricelist.item,price_discount:0
uom.id, product.list_price, context['uom'])
else:
res[product.id] = product.list_price
+ res[product.id] = (res[product.id] or 0.0) * product.price_margin + product.price_extra
return res
def _get_partner_code_name(self, cr, uid, ids, product_id, partner_id, context={}):
for p in self.browse(cr, uid, ids, context):
data = self._get_partner_code_name(cr, uid, [], p.id, context.get('partner_id', None), context)
if not data['code']:
- data['name'] = p.code
+ data['code'] = p.code
if not data['name']:
data['name'] = p.name
res[p.id] = (data['code'] and ('['+data['code']+'] ') or '') + \
args=[]
if not context:
context={}
- ids = self.search(cr, user, [('default_code','=',name)]+ args, limit=limit, context=context)
- if not len(ids):
- ids = self.search(cr, user, [('ean13','=',name)]+ args, limit=limit, context=context)
- if not len(ids):
- ids = self.search(cr, user, [('default_code',operator,name)]+ args, limit=limit, context=context)
- ids += self.search(cr, user, [('name',operator,name)]+ args, limit=limit, context=context)
+ if name:
+ ids = self.search(cr, user, [('default_code','=',name)]+ args, limit=limit, context=context)
+ if not len(ids):
+ ids = self.search(cr, user, [('ean13','=',name)]+ args, limit=limit, context=context)
+ if not len(ids):
+ ids = self.search(cr, user, [('default_code',operator,name)]+ args, limit=limit, context=context)
+ ids += self.search(cr, user, [('name',operator,name)]+ args, limit=limit, context=context)
+ else:
+ ids = self.search(cr, user, args, limit=limit, context=context)
result = self.name_get(cr, user, ids, context)
return result
<separator string="Base Prices" colspan="4"/>
<field name="standard_price"/>
<field name="list_price"/>
+ <field name="price_margin" select="1"/>
+ <field name="price_extra" select="1"/>
<field groups="base.group_extended" name="cost_method"/>
<newline/>
<field colspan="4" name="seller_ids" nolabel="1"/>
<separator string="Base Prices" colspan="4"/>
<field name="standard_price"/>
<field name="list_price"/>
+ <field name="price_margin" select="1"/>
+ <field name="price_extra" select="1"/>
<field groups="base.group_extended" name="cost_method"/>
<newline/>
<field colspan="4" name="seller_ids" nolabel="1"/>
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2009-05-19 14:22:20+0000\n"
-"PO-Revision-Date: 2009-05-20 10:22:20+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2009-04-09 17:23+0000\n"
+"PO-Revision-Date: 2009-07-06 13:01+0000\n"
+"Last-Translator: Olivier (OpenERP) <Unknown>\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: 2009-07-06 13:08+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
#. module: profile_crm
#: model:ir.module.module,description:profile_crm.module_meta_information
msgid "Profile for CRM"
-msgstr ""
-
+msgstr "Profile pour la CRM"
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2009-05-19 14:22:20+0000\n"
-"PO-Revision-Date: 2009-05-20 10:22:20+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2009-04-09 17:23+0000\n"
+"PO-Revision-Date: 2009-07-06 13:04+0000\n"
+"Last-Translator: Olivier (OpenERP) <Unknown>\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: 2009-07-06 13:20+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
#. module: project
#: model:ir.actions.act_window,name:project.act_res_users_2_project_task_opened
#. module: project
#: code:addons/project/wizard/close_task.py:0
#, python-format
-msgid "Couldn't send mail because the contact for this task (%s) has no email address!"
-msgstr "Impossible d'envoyer un mail parce que le contact pour cette tâche (%s) n'a pas d'adresse mail!"
+msgid ""
+"Couldn't send mail because the contact for this task (%s) has no email "
+"address!"
+msgstr ""
+"Impossible d'envoyer un mail parce que le contact pour cette tâche (%s) n'a "
+"pas d'adresse mail!"
#. module: project
#: view:config.compute.remaining:0
msgstr "Opération non permises !"
#. module: project
-#: code:addons/project/wizard/task_delegate.py:0
-#, python-format
-msgid "CHECK: "
-msgstr ""
-
-#. module: project
-#: constraint:ir.actions.act_window:0
-msgid "Invalid model name in the action definition."
-msgstr ""
+#: view:project.task:0
+msgid "Delegations"
+msgstr "Délégations"
#. module: project
#: wizard_field:project.task.delegate,init,planned_hours_me:0
#. module: project
#: help:config.compute.remaining,remaining_hours:0
#: help:project.task,remaining_hours:0
-msgid "Total remaining time, can be re-estimated periodically by the assignee of the task."
-msgstr "Total des heures restantes, peut être re-estimée périodiquement par l'assignation des tâches."
+msgid ""
+"Total remaining time, can be re-estimated periodically by the assignee of "
+"the task."
+msgstr ""
+"Total des heures restantes, peut être re-estimée périodiquement par "
+"l'assignation des tâches."
#. module: project
#: field:project.project,child_id:0
#. module: project
#: help:project.project,warn_header:0
-msgid "Header added at the beginning of the email for the warning message sent to the customer when a task is closed."
-msgstr "L'entête est ajouté au début de l'email pour que le message d'avertissement soit envoyer au client lorsque la tâche est fermé."
+msgid ""
+"Header added at the beginning of the email for the warning message sent to "
+"the customer when a task is closed."
+msgstr ""
+"L'entête est ajouté au début de l'email pour que le message d'avertissement "
+"soit envoyer au client lorsque la tâche est fermé."
#. module: project
#: field:project.task,priority:0
msgstr "Utilisateur à qui vous voulez déléguer votre tâche."
#. module: project
-#: model:ir.actions.wizard,name:project.wizard_attachment_task
-msgid "All Attachments"
+#: help:project.project,members:0
+msgid ""
+"Project's member. Not used in any computation, just for information purpose."
msgstr ""
+"Membre du projet. Non utilisé dans aucun calcul, juste proposer à titre "
+"d'information"
#. module: project
#: model:process.transition.action,name:project.process_transition_action_openpendingtask0
msgstr "Valider"
#. module: project
-#: model:ir.module.module,description:project.module_meta_information
-msgid "Project management module that track multi-level projects, tasks,\n"
-"works done on tasks, eso. It is able to render planning, order tasks, eso.\n"
-" "
-msgstr ""
-
-#. module: project
#: model:ir.actions.act_window,name:project.action_view_task5_prog_prog
#: model:ir.ui.menu,name:project.menu_tasks_yours_prog_prog
msgid "My Tasks in Progress"
#. module: project
#: help:project.task.delegate,init,planned_hours_me:0
-msgid "Estimated time for you to validate the work done by the user to whom you delegate this task."
-msgstr "Temps estimé par vous pour valider le travail terminé de l'utilisateur auquel vous avez délégué la tâche."
+msgid ""
+"Estimated time for you to validate the work done by the user to whom you "
+"delegate this task."
+msgstr ""
+"Temps estimé par vous pour valider le travail terminé de l'utilisateur "
+"auquel vous avez délégué la tâche."
#. module: project
#: view:project.project:0
#. module: project
#: view:project.project:0
-msgid "Automatic variables for headers and footer. Use exactly the same notation."
-msgstr "Variables automatiques pour les entêtes et pieds. Avec exactement la même notation."
+msgid ""
+"Automatic variables for headers and footer. Use exactly the same notation."
+msgstr ""
+"Variables automatiques pour les entêtes et pieds. Avec exactement la même "
+"notation."
#. module: project
#: selection:project.project,state:0
#. module: project
#: code:addons/project/project.py:0
#, python-format
-msgid "A new project has been created !\nWe suggest you to close this one and work on this new project."
+msgid ""
+"A new project has been created !\n"
+"We suggest you to close this one and work on this new project."
msgstr ""
+"Un nouveau projet a été crée !\n"
+"Nous vous suggerons de fermer celui-ci et de travailler sur le nouveau."
#. module: project
#: help:project.task,effective_hours:0
#. module: project
#: help:project.project,warn_customer:0
-msgid "If you check this, the user will have a popup when closing a task that propose a message to send by email to the customer."
-msgstr "Si vous cochez la case, l'utilisateur verra un menu surgissant quand une tâche sera fermé proposant un message pour envoyer un mail au client."
-
-#. module: project
-#: help:project.task.delegate,init,new_task_description:0
-msgid "Reinclude the description of the task in the task of the user."
+msgid ""
+"If you check this, the user will have a popup when closing a task that "
+"propose a message to send by email to the customer."
msgstr ""
+"Si vous cochez la case, l'utilisateur verra un menu surgissant quand une "
+"tâche sera fermé proposant un message pour envoyer un mail au client."
#. module: project
#: field:project.project,category_id:0
msgstr "Réinitialiser en projet"
#. module: project
-#: view:project.task:0
-msgid "Delegations"
-msgstr "Délégations"
+#: selection:project.project,state:0
+msgid "Template"
+msgstr "Modèle"
#. module: project
-#: help:project.project,members:0
-msgid "Project's member. Not used in any computation, just for information purpose."
-msgstr "Membre du projet. Non utilisé dans aucun calcul, juste proposer à titre d'information"
+#: wizard_button:project.task.close,mail_ask,mail_send:0
+msgid "Send Message"
+msgstr "Envoyer un message"
#. module: project
#: view:project.project:0
#. module: project
#: help:project.project,progress_rate:0
msgid "Percent of tasks closed according to the total of tasks todo."
-msgstr "Pourcentage des tâches fermés en accord avec le total des tâches à faire."
-
-#. module: project
-#: wizard_field:project.task.delegate,init,new_task_description:0
-msgid "New Task Description"
msgstr ""
+"Pourcentage des tâches fermés en accord avec le total des tâches à faire."
#. module: project
#: help:project.project,notes:0
msgstr "Temps estimés pour fermer cette tâche par l'utilisateur délégué"
#. module: project
-#: selection:project.project,state:0
-msgid "Template"
-msgstr "Modèle"
-
-#. module: project
#: model:ir.ui.menu,name:project.menu_definitions
#: view:res.company:0
msgid "Configuration"
#. module: project
#: help:project.project,timesheet_id:0
msgid "Timetable working hours to adjust the gantt diagram report"
-msgstr "Emploi du temps des heures travaillés pour ajuster le rapport du diagramme de Gantt"
-
-#. module: project
-#: code:addons/project/project.py:0
-#, python-format
-msgid "Task '%s' set in progress"
msgstr ""
+"Emploi du temps des heures travaillés pour ajuster le rapport du diagramme "
+"de Gantt"
#. module: project
#: view:project.project:0
msgstr "Statut: %(state)s"
#. module: project
-#: code:addons/project/project.py:0
-#, python-format
-msgid "Task '%s' cancelled"
-msgstr ""
-
-#. module: project
#: view:project.task:0
msgid "Planned"
msgstr "Planifié"
#. module: project
#: help:project.task.delegate,init,state:0
-msgid "New state of your own task. Pending will be reopened automatically when the delegated task is closed."
-msgstr "Nouvel état de votre propre tâche. En attente sera ré-ouverte automatiquement lorsque la tâche délégué sera fermé."
+msgid ""
+"New state of your own task. Pending will be reopened automatically when the "
+"delegated task is closed."
+msgstr ""
+"Nouvel état de votre propre tâche. En attente sera ré-ouverte "
+"automatiquement lorsque la tâche délégué sera fermé."
#. module: project
#: field:res.company,project_time_mode:0
#: field:project.project,complete_name:0
#: field:project.project,name:0
msgid "Project Name"
-msgstr "Nom du groupe"
-
-#. module: project
-#: wizard_button:project.task.close,mail_ask,mail_send:0
-msgid "Send Message"
-msgstr "Envoyer un message"
+msgstr "Nom du projet"
#. module: project
#: field:project.project,total_hours:0
#. module: project
#: help:project.task,delay_hours:0
-msgid "Computed as: Total Time - Estimated Time. It gives the difference of the time estimated by the project manager and the real time to close the task."
-msgstr "Calculer comme: Temps total - Temps estimé. Cela donne la différence de temps estimé par le responsable projet et le temps réel pour fermer cette tâche."
+msgid ""
+"Computed as: Total Time - Estimated Time. It gives the difference of the "
+"time estimated by the project manager and the real time to close the task."
+msgstr ""
+"Calculer comme: Temps total - Temps estimé. Cela donne la différence de "
+"temps estimé par le responsable projet et le temps réel pour fermer cette "
+"tâche."
#. module: project
#: model:process.node,name:project.process_node_opentask0
#. module: project
#: help:res.company,project_time_mode:0
-msgid "This will set the unit of measure used in projects and tasks.\n"
-"If you use the timesheet linked to projects (project_timesheet module), don't forget to setup the right unit of measure in your employees."
-msgstr "Ceci fixe l'unité de mesure utilisée dans les projets et tâches.\n"
-"Si vous utilisez les feuilles de temps couplés aux projets (project_timesheet module), n'oubliez pas de fixer la bonne unité de mesure de vos employés."
+msgid ""
+"This will set the unit of measure used in projects and tasks.\n"
+"If you use the timesheet linked to projects (project_timesheet module), "
+"don't forget to setup the right unit of measure in your employees."
+msgstr ""
+"Ceci fixe l'unité de mesure utilisée dans les projets et tâches.\n"
+"Si vous utilisez les feuilles de temps couplés aux projets "
+"(project_timesheet module), n'oubliez pas de fixer la bonne unité de mesure "
+"de vos employés."
#. module: project
#: code:addons/project/wizard/close_task.py:0
#: code:addons/project/wizard/close_task.py:0
#, python-format
msgid "Couldn't send mail because your email address is not configured!"
-msgstr "Impossible d'envoyer un mail parce que votre adresse mail n'est pas configuré!"
+msgstr ""
+"Impossible d'envoyer un mail parce que votre adresse mail n'est pas "
+"configuré!"
#. module: project
#: wizard_view:project.task.delegate,init:0
msgstr "Délégué cette tâche à un utilisateur"
#. module: project
-#: field:project.task,delegated_user_id:0
-msgid "Delegated To"
-msgstr ""
-
-#. module: project
#: field:project.task,date_close:0
msgid "Date Closed"
msgstr "Date fin"
#. module: project
#: help:project.task,planned_hours:0
-msgid "Estimated time to do the task, usually set by the project manager when the task is in draft state."
-msgstr "Temps estimé pour réaliser la tâche, habituellement fixé par le responsable du projet quand la tâche est à l'état brouillon"
+msgid ""
+"Estimated time to do the task, usually set by the project manager when the "
+"task is in draft state."
+msgstr ""
+"Temps estimé pour réaliser la tâche, habituellement fixé par le responsable "
+"du projet quand la tâche est à l'état brouillon"
#. module: project
#: help:project.project,effective_hours:0
msgstr "Somme des heures passés de toutes les tâches reliés à ce projet"
#. module: project
-#: help:project.task,project_id:0
-msgid "If you have [?] in the project name, it means there are no analytic account linked to this project."
-msgstr ""
-
-#. module: project
#: help:project.project,planned_hours:0
msgid "Sum of planned hours of all tasks related to this project."
msgstr "Sommes des tâches planifiés de toutes les tâches relier à ce projet."
msgstr "Date de début: %(date_start)s"
#. module: project
-#: help:project.project,category_id:0
-msgid "Link this project to an analytic account if you need financial management on projects. It enables you to connect projects with budgets, planning, cost and revenue analysis, timesheets on projects, etc."
-msgstr ""
-
-#. module: project
#: view:project.project:0
#: selection:project.project,state:0
#: view:project.task:0
#. module: project
#: code:addons/project/project.py:0
#, python-format
-msgid "You can not delete a project with tasks. I suggest you to deactivate it."
-msgstr "Vous ne pouvez pas supprimer un projet avec des tâches. Je suggère de le désactivé."
+msgid ""
+"You can not delete a project with tasks. I suggest you to deactivate it."
+msgstr ""
+"Vous ne pouvez pas supprimer un projet avec des tâches. Je suggère de le "
+"désactivé."
#. module: project
#: view:project.project:0
#. module: project
#: 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: project
#: view:project.task:0
msgstr "En cours"
#. module: project
-#: help:project.project,parent_id:0
-msgid "If you have [?] in the name, it means there are no analytic account linked to project."
-msgstr ""
-
-#. module: project
#: model:ir.actions.wizard,name:project.wizard_delegate_task
msgid "Delegate Task"
msgstr "Délégué Tâche"
#. module: project
#: help:project.project,warn_manager:0
-msgid "If you check this field, the project manager will receive a request each time a task is completed by his team."
-msgstr "Si vous cochez ce champs, le responsable du projet recevra une requête chaque fois qu'une tâche est completé par son équipe."
+msgid ""
+"If you check this field, the project manager will receive a request each "
+"time a task is completed by his team."
+msgstr ""
+"Si vous cochez ce champs, le responsable du projet recevra une requête "
+"chaque fois qu'une tâche est completé par son équipe."
#. module: project
#: model:project.task.type,name:project.project_tt_feature
msgstr "Nouvelle fonctionnalité"
#. module: project
-#: code:addons/project/project.py:0
-#, python-format
-msgid "Task '%s' closed"
-msgstr ""
-
-#. module: project
#: model:process.node,note:project.process_node_opentask0
msgid "Encode your working hours."
msgstr "Encoder vos heures de travail"
#. module: project
#: help:project.project,warn_footer:0
-msgid "Footer added at the beginning of the email for the warning message sent to the customer when a task is closed."
-msgstr "Le pied de page est ajouté à la fin de l'email pour le message d'avertissement envoyé au client lorsque la tâche est fermée"
+msgid ""
+"Footer added at the beginning of the email for the warning message sent to "
+"the customer when a task is closed."
+msgstr ""
+"Le pied de page est ajouté à la fin de l'email pour le message "
+"d'avertissement envoyé au client lorsque la tâche est fermée"
#. module: project
#: view:project.project:0
msgid "Running projects"
msgstr "Projets en cours"
+#. module: project
+#: code:addons/project/wizard/task_delegate.py:0
+#, python-format
+msgid "CHECK: "
+msgstr "CONTROLE: "
+
+#. module: project
+#: model:ir.module.module,description:project.module_meta_information
+msgid ""
+"Project management module that track multi-level projects, tasks,\n"
+"works done on tasks, eso. It is able to render planning, order tasks, eso.\n"
+" "
+msgstr ""
+"Module de gestion de projets pour gérer des projets et tâches à multiples "
+"niveaux\n"
+" "
+
+#. module: project
+#: help:project.task.delegate,init,new_task_description:0
+msgid "Reinclude the description of the task in the task of the user."
+msgstr "Réinclure la description de la tâche dans la tâche de l'utilisateur"
+
+#. module: project
+#: wizard_field:project.task.delegate,init,new_task_description:0
+msgid "New Task Description"
+msgstr "Description de la nouvelle tâche"
+
+#. module: project
+#: code:addons/project/project.py:0
+#, python-format
+msgid "Task '%s' set in progress"
+msgstr "Tâche '%s' mise en cours"
+
+#. module: project
+#: code:addons/project/project.py:0
+#, python-format
+msgid "Task '%s' cancelled"
+msgstr "Tâche '%s' annullée"
+
+#. module: project
+#: field:project.task,delegated_user_id:0
+msgid "Delegated To"
+msgstr "Déléguer à"
+
+#. module: project
+#: help:project.task,project_id:0
+msgid ""
+"If you have [?] in the project name, it means there are no analytic account "
+"linked to this project."
+msgstr ""
+"So vous avez [?] dans le nom du projet, cela signifie qu'il n'y a pas de "
+"compte analytique lié au projet."
+
+#. module: project
+#: help:project.project,category_id:0
+msgid ""
+"Link this project to an analytic account if you need financial management on "
+"projects. It enables you to connect projects with budgets, planning, cost "
+"and revenue analysis, timesheets on projects, etc."
+msgstr ""
+"Associe ce projet à un compte analytique si vous avez besoin de la gestion "
+"financière des projets. Il vous permet de relier des projets aux budgets, la "
+"planification, l'analyse des coûts et des revenus, des feuilles de temps sur "
+"des projets, etc."
+
+#. module: project
+#: help:project.project,parent_id:0
+msgid ""
+"If you have [?] in the name, it means there are no analytic account linked "
+"to project."
+msgstr ""
+"So vous avez [?] dans le nom, cela signifie qu'il n'y a pas de compte "
+"analytique lié au projet."
+
+#. module: project
+#: code:addons/project/project.py:0
+#, python-format
+msgid "Task '%s' closed"
+msgstr "Tâche '%s' clôturée"
<field name="name">New Project</field>
<field name="res_model">project.project</field>
<field name="view_type">form</field>
- <field name="view_mode">form,tree,calendar</field>
- <field name="view_id" eval="False"/>
+ <field name="view_mode">form,tree</field>
+ <field name="view_id" eval="edit_project"/>
</record>
<menuitem action="open_view_project" id="menu_open_view_project" parent="menu_all_project" sequence="50"/>
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2009-05-19 14:22:20+0000\n"
-"PO-Revision-Date: 2009-05-20 10:22:20+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2009-04-09 17:23+0000\n"
+"PO-Revision-Date: 2009-07-06 12:58+0000\n"
+"Last-Translator: Olivier (OpenERP) <Unknown>\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: 2009-07-06 13:00+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
#. module: project_retro_planning
#: model:ir.module.module,shortdesc:project_retro_planning.module_meta_information
msgid "Project Retro planning"
-msgstr ""
-
+msgstr "Rétro planification de projets"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-11 06:45+0000\n"
return res
_columns = {
- 'name': fields.char('Description', size=64, required=True),
+ 'name': fields.char('Description', size=256, required=True),
'product_qty': fields.float('Quantity', required=True, digits=(16,2)),
'date_planned': fields.datetime('Scheduled date', required=True),
'taxes_id': fields.many2many('account.tax', 'purchase_order_taxe', 'ord_id', 'tax_id', 'Taxes'),
import pooler
from osv.orm import browse_record, browse_null
+
merge_form = """<?xml version="1.0"?>
<form string="Merge orders">
<separator string="Are you sure you want to merge these orders ?"/>
<newline/>
- <label string="Please note that orders will only be merged if they are to the same partner and going to the same location, and lines will only be merged if they are exactly the same except for the quantity and unit."/>
+ <label>Please note that:
+ - orders will only be merged if:
+ * their status is draft
+ * they belong to the same partner
+ * are going to the same location
+ - lines will only be merged if:
+ * they are exactly the same except for the quantity and unit</label>
</form>
-"""
+"""
merge_fields = {
}
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2009-05-19 14:22:20+0000\n"
-"PO-Revision-Date: 2009-05-20 10:22:20+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2009-04-09 17:23+0000\n"
+"PO-Revision-Date: 2009-07-06 13:08+0000\n"
+"Last-Translator: Olivier (OpenERP) <Unknown>\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: 2009-07-06 13:40+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
#. module: report_analytic
#: model:ir.model,name:report_analytic.model_report_analytic_account_close
#. module: report_analytic
#: 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: report_analytic
#: field:report.analytic.account.close,quantity_max:0
#. module: report_analytic
#: field:report.analytic.account.close,name:0
msgid "Analytic account"
-msgstr ""
+msgstr "Compte analytique"
#. module: report_analytic
#: field:report.analytic.account.close,state:0
msgstr "Echéance"
#. module: report_analytic
-#: constraint:ir.actions.act_window:0
-msgid "Invalid model name in the action definition."
-msgstr ""
-
-#. module: report_analytic
-#: model:ir.module.module,shortdesc:report_analytic.module_meta_information
-msgid "Analytic Account Reporting"
-msgstr ""
-
-#. module: report_analytic
#: field:report.analytic.account.close,partner_id:0
msgid "Partner"
msgstr "Partenaire"
msgid "Quantity"
msgstr "Quantité"
+#. module: report_analytic
+#: model:ir.module.module,shortdesc:report_analytic.module_meta_information
+msgid "Analytic Account Reporting"
+msgstr "Rapports des Comptes Analytiques"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Canceled Invoice"
-msgstr ""
+msgstr "Facture Annulée"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Disc. (%)"
-msgstr ""
+msgstr "Disc. (%)"
#. module: report_intrastat
#: model:ir.actions.act_window,name:report_intrastat.action_report_intrastat_tree
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Supplier Invoice"
-msgstr ""
+msgstr "Facture Fournisseur"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Unit Price"
-msgstr ""
+msgstr "Prix Unitaire"
#. module: report_intrastat
#: constraint:ir.actions.act_window:0
#. module: report_intrastat
#: field:report.intrastat,name:0
msgid "Period"
-msgstr ""
+msgstr "Période"
#. module: report_intrastat
#: model:ir.ui.menu,name:report_intrastat.next_id_90
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "VAT :"
-msgstr ""
+msgstr "TVA :"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Document"
-msgstr ""
+msgstr "Document"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "PRO-FORMA"
-msgstr ""
+msgstr "PRO-FORMA"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Taxes:"
-msgstr ""
+msgstr "Taxes :"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
#. module: report_intrastat
#: model:ir.actions.report.xml,name:report_intrastat.invoice_intrastat_id
msgid "Invoice Intrastat"
-msgstr ""
+msgstr "Facture Intrastat"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Invoice Date"
-msgstr ""
+msgstr "Date de Facturation"
#. module: report_intrastat
#: model:ir.module.module,shortdesc:report_intrastat.module_meta_information
msgid "Intrastat Reporting - Reporting"
-msgstr ""
+msgstr "Rapport Intrastat - Rapport"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Tel. :"
-msgstr ""
+msgstr "Tél. :"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Base"
-msgstr ""
+msgstr "Base"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Quantity"
-msgstr ""
+msgstr "Quantité"
#. module: report_intrastat
#: model:ir.ui.menu,name:report_intrastat.next_id_89
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Partner Ref."
-msgstr ""
+msgstr "Réf. Partenaire"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Total (inclu. taxes):"
-msgstr ""
+msgstr "Total (taxes comprises) :"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Refund"
-msgstr ""
+msgstr "Remboursement"
#. module: report_intrastat
#: constraint:ir.ui.view:0
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Invoice"
-msgstr ""
+msgstr "Facture"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Taxes"
-msgstr ""
+msgstr "Taxes"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Amount"
-msgstr ""
+msgstr "Montant"
#. module: report_intrastat
#: view:report.intrastat:0
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Draft Invoice"
-msgstr ""
+msgstr "Facture Brouillon"
#. module: report_intrastat
#: field:report.intrastat,supply_units:0
msgid "Supply Units"
-msgstr ""
+msgstr "Unités Fournies"
#. module: report_intrastat
#: model:ir.model,name:report_intrastat.model_report_intrastat_code
#. module: report_intrastat
#: field:report.intrastat,ref:0
msgid "Origin"
-msgstr ""
+msgstr "Origine"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Tax"
-msgstr ""
+msgstr "Taxe"
#. module: report_intrastat
#: field:report.intrastat,code:0
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Fax :"
-msgstr ""
+msgstr "Fax :"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Supplier Refund"
-msgstr ""
+msgstr "Remboursement Fournisseur"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Total (excl. taxes):"
-msgstr ""
+msgstr "Total (taxes non comprises):"
#. module: report_intrastat
#: rml:account.invoice.intrastat:0
msgid "Price"
-msgstr ""
+msgstr "Prix"
#. module: report_intrastat
#: model:ir.actions.act_window,name:report_intrastat.action_report_intrastat_code_tree
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2009-05-19 14:22:20+0000\n"
-"PO-Revision-Date: 2009-05-20 10:22:20+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2009-04-09 17:23+0000\n"
+"PO-Revision-Date: 2009-07-06 13:07+0000\n"
+"Last-Translator: Olivier (OpenERP) <Unknown>\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: 2009-07-06 13:32+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
#. module: report_project
#: model:ir.actions.act_window,name:report_project.action_project_task_tree_month
#: model:ir.ui.menu,name:report_project.menu_project_task_tree_month
msgid "Tasks finished by project (this month)"
-msgstr ""
-
-#. module: report_project
-#: 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 !"
+msgstr "Tâches terminées par projet (ce mois)"
#. module: report_project
-#: model:ir.actions.act_window,name:report_project.action_project_task_user_tree
-#: model:ir.ui.menu,name:report_project.menu_project_task_user_tree
-msgid "Tasks Closed by Project and User"
-msgstr "Tâches Fermées par Projet et Utilisateur"
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr "XML non valide pour l'architecture de la vue"
#. module: report_project
-#: constraint:ir.actions.act_window:0
-msgid "Invalid model name in the action definition."
-msgstr ""
+#: view:report.project.task.user:0
+msgid "Tasks by Project and User"
+msgstr "Tâches par Projet et Utilisateur"
#. module: report_project
-#: model:ir.actions.act_window,name:report_project.action_project_task_user_tree_month
-#: model:ir.ui.menu,name:report_project.menu_project_task_user_tree_month
-msgid "Tasks finished by project and user (this month)"
+#: 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 !"
#. module: report_project
-#: field:report.project.task,hours_effective:0
-#: field:report.project.task.user,hours_effective:0
-msgid "Effective Hours"
-msgstr "Heures Effectives"
-
-#. module: report_project
-#: model:ir.model,name:report_project.model_report_project_task_user
-msgid "Tasks by user and project"
-msgstr "Tâches par utilisateur et par projet"
+#: view:report.project.task.user:0
+msgid "Tasks by projects and users"
+msgstr "Tâches par projets et utilisateurs"
#. module: report_project
#: field:report.project.task,task_closed:0
#: field:report.project.task.user,task_closed:0
msgid "Task Closed"
-msgstr "Tâches Fermées"
-
-#. module: report_project
-#: view:report.project.task:0
-msgid "Tasks by Project"
-msgstr "Tâches par Projet"
-
-#. module: report_project
-#: model:ir.module.module,shortdesc:report_project.module_meta_information
-msgid "Sales Management - Reporting"
-msgstr ""
-
-#. module: report_project
-#: field:report.project.task.user,user_id:0
-msgid "User"
-msgstr "Utilisateur"
-
-#. module: report_project
-#: view:report.project.task.user:0
-msgid "Tasks by Project and User"
-msgstr "Tâches par Projet et Utilisateur"
+msgstr "Tâches clôturées"
#. module: report_project
-#: model:ir.ui.menu,name:report_project.next_id_63
-msgid "This Month"
-msgstr "Ce mois"
+#: model:ir.actions.act_window,name:report_project.action_project_task_user_tree
+#: model:ir.ui.menu,name:report_project.menu_project_task_user_tree
+msgid "Tasks Closed by Project and User"
+msgstr "Tâches clôturées par projet et utilisateur"
#. module: report_project
-#: constraint:ir.ui.view:0
-msgid "Invalid XML for View Architecture!"
-msgstr "XML non valide pour l'architecture de la vue"
+#: field:report.project.task,hours_delay:0
+#: field:report.project.task.user,hours_delay:0
+msgid "Avg. Plan.-Eff."
+msgstr "Moy. Planif-Effect"
#. module: report_project
-#: view:report.project.task.user:0
-msgid "Tasks by projects and users"
-msgstr "Tâches par projets et utilisateurs"
+#: field:report.project.task,name:0
+#: field:report.project.task.user,name:0
+msgid "Month"
+msgstr "Mois"
#. module: report_project
#: field:report.project.task,project_id:0
msgstr "Delai moy de fermeture"
#. module: report_project
+#: model:ir.model,name:report_project.model_report_project_task_user
+msgid "Tasks by user and project"
+msgstr "Tâches par utilisateur et par projet"
+
+#. module: report_project
#: model:ir.model,name:report_project.model_report_project_task
#: view:report.project.task:0
msgid "Tasks by project"
msgstr "Tâches par projet"
#. module: report_project
-#: field:report.project.task,hours_delay:0
-#: field:report.project.task.user,hours_delay:0
-msgid "Avg. Plan.-Eff."
-msgstr "Moy. Planif-Effect"
+#: model:ir.actions.act_window,name:report_project.action_project_task_tree
+#: model:ir.ui.menu,name:report_project.menu_project_task_tree
+msgid "Tasks Closed by Project"
+msgstr "Tâches clôturées par projet"
#. module: report_project
-#: field:report.project.task,name:0
-#: field:report.project.task.user,name:0
-msgid "Month"
-msgstr "Mois"
+#: model:ir.actions.act_window,name:report_project.action_project_task_user_tree_month
+#: model:ir.ui.menu,name:report_project.menu_project_task_user_tree_month
+msgid "Tasks finished by project and user (this month)"
+msgstr "Tâches terminées par projet et par utilisateur (ce mois)"
#. module: report_project
-#: model:ir.actions.act_window,name:report_project.action_project_task_tree
-#: model:ir.ui.menu,name:report_project.menu_project_task_tree
-msgid "Tasks Closed by Project"
-msgstr "Tâches Fermées par Projet"
+#: view:report.project.task:0
+msgid "Tasks by Project"
+msgstr "Tâches par projet"
+
+#. module: report_project
+#: model:ir.ui.menu,name:report_project.next_id_63
+msgid "This Month"
+msgstr "Ce mois"
+
+#. module: report_project
+#: field:report.project.task,hours_effective:0
+#: field:report.project.task.user,hours_effective:0
+msgid "Effective Hours"
+msgstr "Heures Effectives"
#. module: report_project
#: field:report.project.task,hours_planned:0
#: field:report.project.task.user,hours_planned:0
msgid "Planned Hours"
-msgstr "Heures planifiés"
+msgstr "Heures planifiées"
+
+#. module: report_project
+#: field:report.project.task.user,user_id:0
+msgid "User"
+msgstr "Utilisateur"
+#. module: report_project
+#: model:ir.module.module,shortdesc:report_project.module_meta_information
+msgid "Sales Management - Reporting"
+msgstr "Gestion des ventes - Rapports"
#: field:report.closed.task,project_id:0
msgid "Project"
msgstr ""
-
-#. module: repo
\ No newline at end of file
#. module: report_task
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
-msgstr "Невалиден XML за преглед
\ No newline at end of file
+msgstr "Невалиден XML за преглед"
+
+#. module: report_task
+#: field:report.closed.task,delay_hours:0
+msgid "Delay Hours"
+msgstr ""
+
+#. module: report_task
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
msgstr ""
#. module: report_task
-#: field:report.closed.task,project_id:0
\ No newline at end of file
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
#. module: report_task
#: field:report.closed.task,delay_hours:0
-ms
\ No newline at end of file
+msgid "Delay Hours"
+msgstr ""
+
+#. module: report_task
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
\ No newline at end of file
msgid "Project"
msgstr ""
-#. module: repo
\ No newline at end of file
#: field:report.closed.task,project_id:0
msgid "Project"
msgstr ""
-
-#. module: repo
\ No newline at end of file
msgid "Project"
msgstr ""
-#. module: repo
\ No newline at end of file
msgid "Project"
msgstr ""
-#. module: repo
\ No newline at end of file
msgstr "¡XML inválido para la definición de la vista!"
#. module: report_task
-#: field:report.closed.task,delay_hours:
\ No newline at end of file
+#: field:report.closed.task,delay_hours:0
+msgid "Delay Hours"
+msgstr ""
+
+#. module: report_task
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
+
msgstr "Vigane XML vaate arhitektuurile!"
#. module: report_task
-#: field:report.close
\ No newline at end of file
+#: field:report.closed.task,delay_hours:0
+msgid "Delay Hours"
+msgstr ""
+
+#. module: report_task
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
+
#: field:report.closed.task,project_id:0
msgid "Project"
msgstr ""
-
-#. module: repo
\ No newline at end of file
msgid "Project"
msgstr ""
-#. module: repo
\ No newline at end of file
msgid "Project"
msgstr ""
-#. module: repo
\ No newline at end of file
msgstr "XML non valido per Visualizzazione Architettura!"
#. module: report_task
-#: field:report.closed.task,delay_hou
\ No newline at end of file
+#: field:report.closed.task,delay_hours:0
+msgid "Delay Hours"
+msgstr ""
+
+#. module: report_task
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
+
msgid "Project"
msgstr ""
-#. module: repo
\ No newline at end of file
msgstr ""
#. module: report_task
-#: fiel
\ No newline at end of file
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
+
#. module: report_task
#: field:report.closed.task,delay_hours:0
msgid "Delay Hours"
-m
\ No newline at end of file
+msgstr ""
+
+#. module: report_task
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
+
msgstr "XML niewłaściwy dla tej architektury wyświetlania!"
#. module: report_task
-#: field:report.closed.task,
\ No newline at end of file
+#: field:report.closed.task,delay_hours:0
+msgid "Delay Hours"
+msgstr ""
+
+#. module: report_task
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
+
#. module: report_task
#: field:report.closed.task,delay_hours:0
-msgid "Del
\ No newline at end of file
+msgid "Delay Hours"
+msgstr ""
+
+#. module: report_task
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
+
#. module: report_task
#: field:report.closed.task,delay_hours:0
-msgid
\ No newline at end of file
+msgid "Delay Hours"
+msgstr ""
+
+#. module: report_task
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
+
msgid "Project"
msgstr ""
-#. module: repo
\ No newline at end of file
msgid "Project"
msgstr ""
-#. module: repo
\ No newline at end of file
#. module: report_task
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
-msgstr "Неправильный XML д
\ No newline at end of file
+msgstr "Неправильный XML д!"
+
+#. module: report_task
+#: field:report.closed.task,delay_hours:0
+msgid "Delay Hours"
+msgstr ""
+
+#. module: report_task
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
+
#. module: report_task
#: field:report.closed.task,delay_hours:0
-msgid "Delay Hou
\ No newline at end of file
+msgid "Delay Hours"
+msgstr ""
+
+#. module: report_task
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
+
msgstr ""
#. module: report_task
-#:
\ No newline at end of file
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
+
msgstr ""
#. module: report_task
-#:
\ No newline at end of file
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
+
msgstr ""
#. module: report_task
-#: field:report.closed.task,project_id:0
\ No newline at end of file
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
+
#. module: report_task
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
-msgstr "Ð\9dепÑ\80авилÑ\8cний XML длÑ\8f Ð\90Ñ\80Ñ\85Ñ\96Ñ\82екÑ\82Ñ\83Ñ\80и Ð
\ No newline at end of file
+msgstr "Неправильний XML для Архітектури �"
+
+#. module: report_task
+#: field:report.closed.task,delay_hours:0
+msgid "Delay Hours"
+msgstr ""
+
+#. module: report_task
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
+
msgid "Project"
msgstr ""
-#. module
\ No newline at end of file
msgid "Project"
msgstr ""
-#. module: repo
\ No newline at end of file
'sale_wizard.xml',
'stock_view.xml',
'process/sale_process.xml',
- 'product_view.xml'
],
'demo_xml': ['sale_demo.xml'],
'installable': True,
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2009-05-19 14:36+0000\n"
-"PO-Revision-Date: 2009-06-12 06:58+0000\n"
+"POT-Creation-Date: 2009-01-23 14:23+0000\n"
+"PO-Revision-Date: 2009-07-06 13:30+0000\n"
"Last-Translator: Olivier (OpenERP) <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2009-06-12 07:00+0000\n"
+"X-Launchpad-Export-Date: 2009-07-06 14:00+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: sale
msgstr "Partenaire alloti"
#. module: sale
-#: constraint:ir.actions.act_window:0
-msgid "Invalid model name in the action definition."
-msgstr "Nom du Modèle non valide dans la définition de l'action."
+#: view:sale.order:0
+msgid "Recreate Invoice"
+msgstr "Recréer la Facture"
#. module: sale
#: selection:sale.order,state:0
msgid "Waiting Schedule"
-msgstr "Attente de programmation"
-
-#. module: sale
-#: help:sale.order,picking_policy:0
-msgid ""
-"If you don't have enough stock available to deliver all at once, do you "
-"accept partial shipments or not?"
-msgstr ""
-"Si vous n'avez pas suffisamment de stock pour livrer en une seule fois, "
-"acceptez vous les livraisons partielles ?"
+msgstr "Attente de planification"
#. module: sale
#: selection:sale.order.line,type:0
msgid "from stock"
-msgstr "En stock"
+msgstr "Depuis le stock"
#. module: sale
#: field:sale.config.picking_policy,step:0
msgid "Steps To Deliver a Sale Order"
-msgstr "Étapes pour livrer une Commande de Vente"
+msgstr "Étapes pour livrer une commande"
#. module: sale
#: wizard_field:sale.advance_payment_inv,init,qtty:0
#. module: sale
#: wizard_view:sale.advance_payment_inv,create:0
msgid "You invoice has been successfully created !"
-msgstr "Votre facture a été créé avec succès !"
+msgstr "Votre facture a été créée avec succès !"
#. module: sale
#: view:sale.order:0
#: model:ir.actions.act_window,name:sale.action_order_line_tree3
#: model:ir.ui.menu,name:sale.menu_action_order_line_tree3
msgid "Uninvoiced and Delivered Lines"
-msgstr "Lignes librées et non-facturées"
+msgstr "Lignes livrées et non-facturées"
#. module: sale
#: view:sale.order:0
msgstr "Livraison, depuis l'entrepôt vers le client"
#. module: sale
-#: model:ir.actions.todo,note:sale.config_wizard_step_sale_picking_policy
-msgid ""
-"This Configuration step use to set default picking policy when make sale "
-"order"
-msgstr ""
-"Cette configuration utilise la politique de colisage par défaut quand vous "
-"établissez une commande"
+#: field:sale.order,client_order_ref:0
+msgid "Customer Ref."
+msgstr "Réf. Client"
+
+#. module: sale
+#: model:ir.model,name:sale.model_sale_config_picking_policy
+msgid "sale.config.picking_policy"
+msgstr "sale.config.picking_policy"
#. module: sale
#: model:process.transition.action,name:sale.process_transition_action_validate0
#. module: sale
#: model:process.node,note:sale.process_node_order0
msgid "After confirming order, Create the invoice."
-msgstr "Après confirmation de commande, créer une facture."
+msgstr "Après la confirmation de commande, créer une facture."
#. module: sale
#: field:sale.order.line,price_subtotal:0
msgid "Subtotal"
-msgstr "Montant"
+msgstr "Sous-total"
#. module: sale
#: model:process.transition,note:sale.process_transition_confirmquotation0
"Whenever confirm button is clicked, the draft state is moved to manual. that "
"is, quotation is moved to sale order."
msgstr ""
-"Lorsque le bouton 'Confirmer' est cliqué, l'état 'Brouillon' est déplacé "
-"vers 'Manuel'. C'est-à-dire que le Devis est déplacé vers une Commande de "
-"Vente."
+"Quand le bouton \"confirmer\" est pressé, l'état passe de brouillon à "
+"manuel, c'est à dire que le devis est transformé en commande."
#. module: sale
#: model:process.transition.action,name:sale.process_transition_action_cancelorder0
#: view:sale.order:0
msgid "Cancel Order"
-msgstr "Annuler"
+msgstr "Annuler la commande"
#. module: sale
#: field:sale.order.line,move_ids:0
msgstr "Désignation manuelle"
#. module: sale
+#: selection:sale.order,order_policy:0
+msgid "Invoice from the packings"
+msgstr "Facturation sur base des colisages"
+
+#. module: sale
#: view:sale.order:0
#: field:sale.order,note:0
#: view:sale.order.line:0
#. module: sale
#: field:sale.order,order_policy:0
msgid "Shipping Policy"
-msgstr "Méthode d'expédition"
+msgstr "Politique d'expédition"
#. module: sale
-#: selection:sale.order,state:0
-msgid "Shipping Exception"
-msgstr "Exception d'envoi"
+#: field:sale.shop,name:0
+msgid "Shop name"
+msgstr "Nom du magasin"
+
+#. module: sale
+#: rml:sale.order:0
+msgid "VAT"
+msgstr "TVA"
#. module: sale
#: field:sale.order,amount_total:0
#. module: sale
#: model:process.node,name:sale.process_node_packinglist0
msgid "Outgoing Products"
-msgstr "Produits à Livrer"
+msgstr "Produits à expédier"
#. module: sale
#: view:sale.order:0
#. module: sale
#: model:process.transition,note:sale.process_transition_saleprocurement0
msgid "Procurement is created after confirmation of sale order."
-msgstr ""
-"Un approvisionnement est créé après confirmation de la commande de vente."
+msgstr "Un approvisionnement est demandé après confirmation de commande."
#. module: sale
#: field:sale.order,project_id:0
#: field:sale.shop,project_id:0
msgid "Analytic Account"
-msgstr "Centre profit/coût"
+msgstr "Compte analytique"
#. module: sale
#: rml:sale.order:0
#. module: sale
#: field:sale.order.line,type:0
msgid "Procure Method"
-msgstr "Méthode d'appro."
+msgstr "Méthode d'approvisionnement"
#. module: sale
#: view:sale.order:0
msgstr "Mes commandes en cours"
#. module: sale
-#: field:sale.order.line,product_uos_qty:0
-msgid "Quantity (UoS)"
-msgstr "Quantité (UdV)"
-
-#. module: sale
#: help:sale.order,invoice_quantity:0
msgid ""
"The sale order will automatically create the invoice proposition (draft "
"choose if you invoice based on ordered or shipped quantities. If the product "
"is a service, shipped quantities means hours spent on the associated tasks."
msgstr ""
-"La commande créera une proposition de facturation (facture brouillon). Les "
-"quantités commandées et facturées peuvent ne pas être les mêmes. Vous devez "
-"choisir si vous facturez sur base des quantités commandées ou expédiées. Si "
-"le produit est un service, les quantitées expédiées signifies les heures "
-"dépensées aux tâches associées."
+"La commande créera automatiquement une proposition de facturation (facture "
+"brouillon). Les quantités commandées et expédiées peuvent ne pas être les "
+"mêmes. Vous devez choisir si vous facturez sur base des quantités commandées "
+"ou expédiées. Si le produit est un service, les quantités expédiées "
+"signifient les heures passées aux tâches associées."
#. module: sale
#: code:addons/sale/wizard/make_invoice_advance.py:0
"You cannot make an advance on a sale order that is defined as 'Automatic "
"Invoice after delivery'."
msgstr ""
-"Vous ne pouvez pas effectuer d'avance sur une commande de vente qui est "
-"définie comme 'Facture Automatique après Livraison'."
+"Vous ne pouvez pas faire d'avance sur une commande définie en \"Facturation "
+"automatique après expédition\"."
#. module: sale
#: selection:sale.order.line,state:0
#. module: sale
#: field:sale.shop,payment_default_id:0
msgid "Default Payment Term"
-msgstr "Paiement par défaut"
+msgstr "Condition de règlement par défaut"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_order_tree_all
msgstr "Confirmer"
#. module: sale
-#: code:addons/sale/sale.py:0
-#, python-format
-msgid "You must first cancel all packing attached to this sale order."
-msgstr ""
-"Vous devez, avant tout, annuler tous les colisages attachés à cette commande "
-"de vente."
-
-#. module: sale
#: field:sale.order,partner_shipping_id:0
msgid "Shipping Address"
msgstr "Adresse d'expédition"
#. module: sale
-#: code:addons/sale/sale.py:0
-#, python-format
-msgid ""
-"You have to select a customer in the sale form !\n"
-"Please set one customer before choosing a product."
-msgstr ""
-"Vous devez sélectionner une client dans le formulaire de vente !\n"
-"Veuillez sélectionner un client avant de choisir un produit."
-
-#. module: sale
#: selection:sale.order,invoice_quantity:0
msgid "Shipped Quantities"
msgstr "Quantités livrées"
#. module: sale
#: selection:sale.config.picking_policy,order_policy:0
msgid "Invoice Based on Sales Orders"
-msgstr "Facture basée sur les commandes de ventes"
-
-#. module: sale
-#: model:ir.model,name:sale.model_sale_shop
-#: view:sale.shop:0
-msgid "Sale Shop"
-msgstr "Point de vente"
+msgstr "Facturation basée sur les commandes"
#. module: sale
#: field:sale.shop,warehouse_id:0
msgid "Warehouse"
-msgstr "Entrepôt disponible"
+msgstr "Entrepôt"
#. module: sale
#: rml:sale.order:0
"Packing list is created when 'Assign' is being clicked after confirming the "
"sale order. This transaction moves the sale order to packing list."
msgstr ""
-"Une liste de colisage est créée lorsque le bouton 'Assigner' est cliqué "
-"après avoir confirmé la commande de vente. Cette transaction déplace la "
-"commande de vente vers la liste de colisage."
+"La liste de colisages est créée quand on clique sur le bouton « Assigner » "
+"après confirmation de la commande client."
#. module: sale
#: model:ir.actions.act_window,name:sale.action_order_tree8
"When you select Shipping Ploicy = 'Automatic Invoice after delivery' , it "
"will automatic create after delivery."
msgstr ""
-"Lorsque vous sélectionnez 'Politique de Livraison = Facture Automatique "
-"après Livraison', cela créera automatiquement une facture après livraison."
+"Quand vous sélectionnez la politique de livraison = 'Facturation automatique "
+"après livraison', il la créera automatiquement après le livraison."
#. module: sale
#: code:addons/sale/sale.py:0
#. module: sale
#: model:process.node,name:sale.process_node_saleorderprocurement0
msgid "Sale Order Procurement"
-msgstr "Approvisionnement de la Commande de Vente"
+msgstr "Approvisionnement des commandes de ventes"
#. module: sale
#: model:process.transition,name:sale.process_transition_packing0
msgstr "Action invalide !"
#. module: sale
-#: selection:sale.order,state:0
-#: view:sale.order.line:0
-#: selection:sale.order.line,state:0
-msgid "Done"
-msgstr "Facturée"
+#: help:sale.order,state:0
+msgid ""
+"Gives the state of the quotation or sale order. The exception state is "
+"automatically set when a cancel operation occurs in the invoice validation "
+"(Invoice Exception) or in the packing list process (Shipping Exception). The "
+"'Waiting Schedule' state is set when the invoice is confirmed but waiting "
+"for the scheduler to be on the date 'Date Ordered'."
+msgstr ""
+"Donne l'état du devis ou de la commande. L'état d'exception est "
+"automatiquement défini quand une opération d'annulation arrive dans la "
+"validation de facture (Exception de facture) ou dans le processus de "
+"colisage (Exception d'expédition). L'état 'En attente de planninfication' "
+"est défini lorsque la facture est confirmée mais en attente que le "
+"plannificateur soit à la date 'Date commandée'."
#. module: sale
#: field:sale.order,pricelist_id:0
msgstr "Configuration"
#. module: sale
+#: view:sale.order:0
+msgid "Total amount"
+msgstr "Montant total"
+
+#. module: sale
#: selection:sale.order,order_policy:0
msgid "Invoice on Order After Delivery"
msgstr "Facture basée sur la commande après livraison"
msgstr "XML non valide pour l'architecture de la vue"
#. module: sale
-#: field:sale.order,picking_ids:0
-msgid "Related Packing"
-msgstr "Colisage associé"
-
-#. module: sale
-#: field:sale.shop,payment_account_id:0
-msgid "Payment Accounts"
-msgstr "Comptes de Paiement"
+#: model:ir.model,name:sale.model_sale_shop
+#: view:sale.shop:0
+msgid "Sale Shop"
+msgstr "Point de vente"
#. module: sale
#: constraint:product.template:0
"l'unité de mesure"
#. module: sale
-#: field:sale.order,client_order_ref:0
-msgid "Customer Ref"
-msgstr "Réf. Client"
-
-#. module: sale
-#: model:ir.model,name:sale.model_sale_config_picking_policy
-msgid "sale.config.picking_policy"
-msgstr "sale.config.picking_policy"
-
-#. module: sale
#: view:sale.order:0
msgid "Sales orders"
msgstr "Commandes"
msgstr "Approvisionnement"
#. module: sale
+#: selection:sale.order,state:0
+msgid "Manual in progress"
+msgstr "Manuel en cours"
+
+#. module: sale
#: view:sale.shop:0
+#: field:sale.shop,payment_account_id:0
msgid "Payment accounts"
msgstr "Compte de paiement"
#. module: sale
-#: wizard_button:sale.advance_payment_inv,create,end:0
-msgid "Close"
-msgstr "Fermer"
+#: selection:sale.order,state:0
+msgid "Shipping Exception"
+msgstr "Exception d'envoi"
#. module: sale
#: model:process.node,name:sale.process_node_invoice0
msgstr "Toutes les propositions"
#. module: sale
+#: field:sale.order.line,number_packages:0
+msgid "Number packages"
+msgstr "Nombre d'UL"
+
+#. module: sale
#: field:sale.order.line,discount:0
msgid "Discount (%)"
msgstr "Escompte (%)"
#. module: sale
-#: model:process.node,note:sale.process_node_invoice0
-msgid "Draft customer invoice, to be reviewed by accountant."
-msgstr "Facture client en brouillon, doit être vérifier par le comptable"
+#: help:sale.order,order_policy:0
+msgid ""
+"The Shipping Policy is used to synchronise invoice and delivery operations.\n"
+" - The 'Pay before delivery' choice will first generate the invoice and "
+"then generate the packing order after the payment of this invoice.\n"
+" - The 'Shipping & Manual Invoice' will create the packing order directly "
+"and wait for the user to manually click on the 'Invoice' button to generate "
+"the draft invoice.\n"
+" - The 'Invoice on Order Ater Delivery' choice will generate the draft "
+"invoice based on sale order after all packing lists have been finished.\n"
+" - The 'Invoice from the packings' choice is used to create an invoice "
+"during the packing process."
+msgstr ""
+"La Politique de livraison est utilisée pour synchroniser les opérations de "
+"facturation et de livraison. \n"
+" - « Payer avant la livraison » génère d'abord la facture et ensuite le "
+"bon de livraison après le paiement de cette facture. \n"
+" - « Livraison & Facture manuelle » crée directement le bon de livraison "
+"et crée une facture brouillon quand l'utilisateur clique sur le bouton « "
+"Facturer ». \n"
+" - « Facture basée sur la commande après livraison» crée une facture "
+"brouillon basée sur la commande du client à la fin de toutes les livraisons. "
+"\n"
+" - « Facture sur base des livraisons » crée une facture pendant la "
+"livraison."
+
+#. module: sale
+#: selection:sale.order,state:0
+msgid "In progress"
+msgstr "En cours"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_order_tree3
#: model:ir.ui.menu,name:sale.menu_action_order_tree3
msgid "Sales Order To Be Invoiced"
-msgstr "Commandes de ventes Facturables"
+msgstr "Commandes facturables"
#. module: sale
#: model:process.node,note:sale.process_node_saleorderprocurement0
#. module: sale
#: field:sale.config.picking_policy,picking_policy:0
msgid "Packing Default Policy"
-msgstr "Politique par défaut du Colisage"
+msgstr "Politique de colisage par défaut"
#. module: sale
#: model:process.node,note:sale.process_node_saleorder0
#. module: sale
#: field:sale.config.picking_policy,order_policy:0
msgid "Shipping Default Policy"
-msgstr "Politique par défaut de la Livraison"
+msgstr "Politique de livraison par défaut"
#. module: sale
#: code:addons/sale/sale.py:0
msgstr "Réf. Commande"
#. module: sale
-#: view:sale.order:0
-msgid "Recreate Invoice"
-msgstr "Recréer la Facture"
-
-#. module: sale
#: field:sale.order,user_id:0
msgid "Salesman"
msgstr "Vendeur"
"In sale order , procuerement for each line and it comes into the procurement "
"order"
msgstr ""
-"Dans la commande de vente, approvisionnement pour chaque ligne et il viens "
-"dans la commande d'approvisionnement"
+"Dans les commandes de ventes, approvisionnement pour chaques lignes et "
+"provient des ordres d'approvisionnement"
#. module: sale
#: rml:sale.order:0
#. module: sale
#: model:ir.actions.wizard,name:sale.advance_payment
msgid "Advance Invoice"
-msgstr "Facture Anticipée"
+msgstr "Accompte"
#. module: sale
#: field:sale.order,state:0
msgstr "LIgnes non facturés"
#. module: sale
-#: code:addons/sale/sale.py:0
-#, python-format
-msgid "No Customer Defined !"
-msgstr "Aucun Client défini !"
-
-#. module: sale
-#: help:sale.order,order_policy:0
+#: model:ir.actions.todo,note:sale.config_wizard_step_sale_picking_policy
msgid ""
-"The Shipping Policy is used to synchronise invoice and delivery operations.\n"
-" - The 'Pay before delivery' choice will first generate the invoice and "
-"then generate the packing order after the payment of this invoice.\n"
-" - The 'Shipping & Manual Invoice' will create the packing order directly "
-"and wait for the user to manually click on the 'Invoice' button to generate "
-"the draft invoice.\n"
-" - The 'Invoice on Order Ater Delivery' choice will generate the draft "
-"invoice based on sale order after all packing lists have been finished.\n"
-" - The 'Invoice from the packing' choice is used to create an invoice "
-"during the packing process."
+"This Configuration step use to set default picking policy when make sale "
+"order"
msgstr ""
-"La Politique de Livraison est utilisée pour synchroniser la facture et les "
-"opérations de livraison.\n"
-" - le choix 'Payer avant la Livraison' créera directement une facture et "
-"créera la commande de colisage après le paiement de la facture\n"
-" - 'Livraison & Facture Manuelle' créera la commande de colisage "
-"directement et attendra que l'utilisateur clique manuellement sur le bouton "
-"'Facture' pour générer la facture brouillon\n"
-" - 'Facture sur Commande après Livraison' créera la facture brouillon basée "
-"sur la commande de vente après que toutes les listes de colisage soient "
-"terminées\n"
-" - 'Facture basée sur le colisage' créera une facture pendant le processus "
-"de colisage"
+"Cette configuration utilise la politique de colisage par défaut quand vous "
+"établissez une commande"
#. module: sale
#: model:process.process,name:sale.process_process_salesprocess0
msgid "Sales Process"
-msgstr "Processus de Vente"
+msgstr "Processus de ventes"
#. module: sale
#: wizard_view:sale.order.line.make_invoice,init:0
msgstr "Commandes en Exception"
#. module: sale
-#: selection:sale.order.line,type:0
-msgid "on order"
-msgstr "Sur commande"
-
-#. module: sale
#: selection:sale.order.line,state:0
msgid "Draft"
msgstr "Brouillon"
msgstr "Approvisionnement corrigé"
#. module: sale
-#: selection:sale.order,order_policy:0
-msgid "Shipping & Manual Invoice"
-msgstr "Livraison et facture manuelle"
-
-#. module: sale
#: model:process.transition,name:sale.process_transition_saleorderprocurement0
#: model:process.transition,name:sale.process_transition_saleprocurement0
msgid "Sale Procurement"
-msgstr "Approvisionnement de la Vente"
+msgstr "Approvisionnement des ventes"
#. module: sale
#: view:sale.config.picking_policy:0
msgid "Configure Sale Order Logistic"
-msgstr "Configurer la Logistique des Commandes de Vente"
+msgstr "Configurer la logistique des commandes de ventes"
+
+#. module: sale
+#: field:sale.order.line,product_uos_qty:0
+msgid "Quantity (UOS)"
+msgstr "Quantité US"
#. module: sale
#: field:sale.order,amount_untaxed:0
#: code:addons/sale/sale.py:0
#, python-format
msgid "invalid mode for test_state"
-msgstr "Mode non valide pour test_state"
+msgstr "Mode invalide pour test_state"
#. module: sale
#: rml:sale.order:0
msgstr "Un approvisionnement pour chaque produit"
#. module: sale
-#: model:ir.actions.act_window,name:sale.action_order_form
-#: model:ir.ui.menu,name:sale.menu_sale_order
-msgid "Sales Orders"
-msgstr "Commandes de Ventes"
+#: field:sale.order,picking_ids:0
+msgid "Related Packings"
+msgstr "Colisage en relation"
+
+#. module: sale
+#: help:sale.order,picking_policy:0
+msgid ""
+"If you don't have enough stock available to deliver all at once, do you "
+"accept partial shippings or not."
+msgstr ""
+"Si vous n'avez pas de stock suffisant pour tout livrer d'un coup, accèptez "
+"vous de faire une livraison partielle ou pas."
#. module: sale
#: model:ir.model,name:sale.model_sale_order
#. module: sale
#: model:product.template,name:sale.advance_product_0_product_template
msgid "Advance Product"
-msgstr ""
+msgstr "Produit avancé"
#. module: sale
#: model:process.transition,note:sale.process_transition_invoice0
"Invoice is created when 'Create Invoice' is being clicked after confirming "
"the sale order. This transaction moves the sale order to invoices."
msgstr ""
-"Une Facture est créée lorsque 'Créer une Facture' est cliqué après "
-"confirmation de la Commande de Vente. Cette transaction déplacera la "
-"Commande de Vente vers les Factures."
+"La facture est créée quand on clique sur le bouton « Créer la facture » "
+"après confirmation de la commande du client."
#. module: sale
#: view:sale.order:0
msgstr "Calculer"
#. module: sale
-#: model:ir.actions.act_window,name:sale.action_shop_form
-#: model:ir.ui.menu,name:sale.menu_action_shop_form
-#: field:sale.order,shop_id:0
-msgid "Shop"
-msgstr "Magasin"
+#: model:process.node,note:sale.process_node_invoice0
+msgid "Draft customer invoice, to be reviewed by accountant."
+msgstr "Facture client en brouillon, doit être vérifier par le comptable"
#. module: sale
-#: rml:sale.order:0
-msgid "VAT"
-msgstr "TVA"
+#: selection:sale.order,state:0
+#: view:sale.order.line:0
+#: selection:sale.order.line,state:0
+msgid "Done"
+msgstr "Terminée"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_order_tree4
msgstr "Historique"
#. module: sale
+#: code:addons/sale/sale.py:0
+#, python-format
+msgid "You must first cancel all packings attached to this sale order."
+msgstr ""
+"Vous devez annuler en premier tous les colis attachés à cette commande."
+
+#. module: sale
#: view:sale.order:0
msgid "Make Invoice"
msgstr "Créer facture"
#. module: sale
#: model:process.node,note:sale.process_node_packinglist0
msgid "Packing OUT is created for stockable products."
-msgstr "Un colisage sortant est créé pour les produits stockables"
+msgstr "La livraison est créée pour les produits stockables."
#. module: sale
#: view:sale.order:0
msgstr "Annuler"
#. module: sale
-#: help:sale.order,state:0
-msgid ""
-"Gives the state of the quotation or sale order. The exception state is "
-"automatically set when a cancel operation occurs in the invoice validation "
-"(Invoice Exception) or in the packing list process (Shipping Exception). The "
-"'Waiting Schedule' state is set when the invoice is confirmed but waiting "
-"for the scheduler to run on the date 'Date Ordered'."
-msgstr ""
-"Donne l'état du devis ou de la commande de vente. L'état 'en Exception' est "
-"automatiquement placé lorsqu'une opération d'annulation apparaît dans la "
-"validation de la facture (Exception de Facturation) ou dans le processus de "
-"colisage (Exception de Livraison). L'état 'en Attente d'exécution' est placé "
-"lorsque la facture est confirmée mais attend que le Planificateur soit lancé "
-"à la Date de la Commande."
+#: wizard_button:sale.advance_payment_inv,create,end:0
+msgid "Close"
+msgstr "Fermer"
#. module: sale
#: view:sale.order:0
msgstr "UDM"
#. module: sale
-#: field:sale.order.line,number_packages:0
-msgid "Number Packages"
-msgstr ""
+#: selection:sale.order,order_policy:0
+msgid "Shipping & Manual Invoice"
+msgstr "Livraison et facture manuelle"
#. module: sale
#: model:process.transition,note:sale.process_transition_deliver0
"Confirming the packing list moves them to delivery order. This can be done "
"by clicking on 'Validate' button."
msgstr ""
-"Confirmer la liste de colisage les déplacent vers la commande de livraison. "
-"Cela peut être fait en cliquant sur le bouton 'Valider'."
-
-#. module: sale
-#: code:addons/sale/sale.py:0
-#, python-format
-msgid "You cannot cancel a sale order line that has already been invoiced !"
-msgstr ""
-"Vous ne pouvez pas annuler une ligne de commande de vente qui a déjà été "
-"facturée !"
+"Confirmer les mouvements des lignes de colisages des ordres de livraison. "
+"Ceci peut être fait en cliquant sur le bouton 'Valider'."
#. module: sale
-#: selection:sale.order,state:0
-msgid "In Progress"
-msgstr "En cours"
+#: model:ir.actions.act_window,name:sale.action_order_form
+#: model:ir.ui.menu,name:sale.menu_sale_order
+msgid "Sales Orders"
+msgstr "Commandes de Ventes"
#. module: sale
#: wizard_view:sale.advance_payment_inv,init:0
#. module: sale
#: model:process.node,note:sale.process_node_quotation0
msgid "Quotation (A sale order in draft state)"
-msgstr "Devis (Une commande en brouillon)"
+msgstr "Devis (une commande en brouillon)"
#. module: sale
#: model:process.transition,name:sale.process_transition_saleinvoice0
#. module: sale
#: wizard_button:sale.advance_payment_inv,create,open:0
msgid "Open Advance Invoice"
-msgstr "Ouvrir la Facture Anticipée"
+msgstr "Ouvrir les acomptes"
#. module: sale
#: field:sale.order,partner_order_id:0
msgstr "Description"
#. module: sale
-#: model:ir.module.module,shortdesc:sale.module_meta_information
#: model:ir.ui.menu,name:sale.menu_sale_root
msgid "Sales Management"
msgstr "Gestion des ventes"
msgstr "Livraison"
#. module: sale
+#: field:sale.order.line,product_uos:0
+msgid "Product UOS"
+msgstr "Unité secondaire"
+
+#. module: sale
#: model:ir.actions.report.xml,name:sale.report_sale_order
msgid "Quotation / Order"
msgstr "Devis / Commande"
#. module: sale
#: rml:sale.order:0
msgid "Quotation N°"
-msgstr "N° de devis"
+msgstr "Devis N°"
#. module: sale
#: code:addons/sale/sale.py:0
msgstr "Annuler l'assignation"
#. module: sale
-#: selection:sale.order,order_policy:0
-msgid "Invoice from the Packing"
-msgstr "Facture basée sur le Colisage"
+#: selection:sale.order.line,type:0
+msgid "on order"
+msgstr "Sur commande"
#. module: sale
#: model:ir.actions.wizard,name:sale.wizard_sale_order_line_invoice
#: model:ir.actions.wizard,name:sale.wizard_sale_order_make_invoice
msgid "Make invoices"
-msgstr "Creer les factures"
+msgstr "Créer les factures"
#. module: sale
#: help:sale.order,partner_order_id:0
msgstr "Client"
#. module: sale
+#: code:addons/sale/sale.py:0
+#, python-format
+msgid "You can not cancel a sale order line that has already been invoiced !"
+msgstr ""
+"Vous ne pouvez pas annuler un commande de vente qui vous avez déjà facturé !"
+
+#. module: sale
#: field:product.product,pricelist_purchase:0
msgid "Purchase Pricelists"
msgstr "Liste de prix d'achats"
#: code:addons/sale/sale.py:0
#, python-format
msgid "Cannot delete Sale Order(s) which are already confirmed !"
-msgstr ""
-"Impossible de supprimer des commandes de ventes qui sont déjà confirmés !"
+msgstr "Impossible de supprimer des commandes qui sont déjà confirmées !"
#. module: sale
#: field:sale.config.picking_policy,name:0
msgstr "Nouveau devis"
#. module: sale
-#: view:sale.order:0
-msgid "Total amount"
-msgstr "Montant total"
+#: model:ir.actions.act_window,name:sale.action_shop_form
+#: model:ir.ui.menu,name:sale.menu_action_shop_form
+#: field:sale.order,shop_id:0
+msgid "Shop"
+msgstr "Magasin"
#. module: sale
#: rml:sale.order:0
msgstr "Date de commande"
#. module: sale
-#: field:sale.order.line,product_uos:0
-msgid "Product UoS"
-msgstr "UdV Produit"
-
-#. module: sale
-#: selection:sale.order,state:0
-msgid "Manual In Progress"
-msgstr "Manuelle en cours"
-
-#. module: sale
#: field:sale.order.line,product_uom:0
msgid "Product UoM"
msgstr "UP du produit"
"and simple methods to deliver products to the customer in one or two "
"operations by the worker."
msgstr ""
-"Par défaut, Open ERP est capable de gérer des routages et des acheminements "
-"complexes de produits dans vos entrepôts et emplacements partenaire. Cela "
-"configurera les méthodes les plus communes et les plus simples pour livrer "
-"des produits vers le client en une ou deux opérations par travailleur."
+"Par défaut, OpenERP est en mesure de gérer les chemins complexes de routage "
+"et de produits dans votre entrepôt et ceux des partenaires. Cela permettra "
+"de configurer les méthodes plus courantes et les simples pour offrir des "
+"produits au client en une ou deux opérations par le travailleur."
#. module: sale
#: model:ir.actions.act_window,name:sale.action_config_picking_policy
#. module: sale
#: rml:sale.order:0
msgid "Payment Terms"
-msgstr "Conditions de Paiement"
+msgstr "Conditions de règlement"
#. module: sale
#: view:sale.order:0
#. module: sale
#: view:sale.order:0
msgid "Related invoices"
-msgstr "Factures associees"
-
-#. module: sale
-#: field:sale.shop,name:0
-msgid "Shop Name"
-msgstr "Nom du Magasin"
+msgstr "Factures associées"
#. module: sale
#: field:sale.order,payment_term:0
msgid "Payment Term"
-msgstr "Condition de paiement"
+msgstr "Condition de règlement"
#. module: sale
#: selection:sale.order,order_policy:0
msgid "Payment Before Delivery"
-msgstr "Paiement avant livraison"
+msgstr "Règlement avant livraison"
#. module: sale
#: help:sale.order,invoice_ids:0
msgstr "Réceptionné"
#. module: sale
-#: view:sale.shop:0
-msgid "Accounting"
-msgstr "Comptabilité"
-
-#. module: sale
#: selection:sale.config.picking_policy,order_policy:0
msgid "Invoice Based on Deliveries"
msgstr "Facture basé sur les livraisons"
#. module: sale
#: view:sale.order:0
msgid "Stock Moves"
-msgstr "Mouvements de stocks"
+msgstr "Mouvements de stock"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_order_tree
result[product.id] = ""
for pricelist in pricelist_browse:
for version in pricelist.version_id:
- for items in version.items_id:
- qty = items.min_quantity
+ cr.execute("""select min_quantity from product_pricelist_item where price_version_id = %s""", [version.id])
+ items_lines = cr.fetchall()
+ for line in items_lines:
+ qty = line[0]
try:
prices = pricelist_obj.price_get(cr, uid, [pricelist.id], product.id, qty, partner=None, context=None)
price = prices.get(pricelist.id) or 0.0
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<openerp>
- <data>
-
-
- </data>
-</openerp>
<para style="terp_default_8">
<font color="white"> </font>
</para>
- <para style="terp_header">[[ o.state<>'draft' and removeParentNode('para') ]] Quotation N.[[ o.name ]]</para>
- <para style="terp_header">[[ o.state=='draft' and removeParentNode('para') ]] Order N.[[ o.name ]]</para>
+ <para style="terp_header">[[ o.state<>'draft' and removeParentNode('para') ]] Quotation N° [[ o.name ]]</para>
+ <para style="terp_header">[[ o.state=='draft' and removeParentNode('para') ]] Order N° [[ o.name ]]</para>
<para style="terp_default_8">
<font color="white"> </font>
</para>
('shipping_except','Shipping Exception'),
('invoice_except','Invoice Exception'),
('done','Done'),
- ('cancel','Cancel')
+ ('cancel','Cancelled')
], 'Order State', readonly=True, help="Gives the state of the quotation or sale order. The exception state is automatically set when a cancel operation occurs in the invoice validation (Invoice Exception) or in the packing list process (Shipping Exception). The 'Waiting Schedule' state is set when the invoice is confirmed but waiting for the scheduler to run on the date 'Date Ordered'.", select=True),
'date_order':fields.date('Date Ordered', required=True, readonly=True, states={'draft':[('readonly',False)]}),
else:
pay_term = False
for preinv in order.invoice_ids:
- if preinv.state in ('open','paid','proforma'):
+ if preinv.state not in ('cancel',):
for preline in preinv.invoice_line:
inv_line_id = self.pool.get('account.invoice.line').copy(cr, uid, preline.id, {'invoice_id':False, 'price_unit':-preline.price_unit})
lines.append(inv_line_id)
ean = pack.ean
qty_pack = pack.qty
type_ul = pack.ul
- warn_msg = "You selected a quantity of %d Units.\nBut it's not compatible with the selected packaging.\nHere is a proposition of quantities according to the packaging: " % (qty)
- warn_msg = warn_msg + "\n\nEAN: " + str(ean) + " Quantity: " + str(qty_pack) + " Type of ul: " + str(type_ul.name)
+ warn_msg = _("You selected a quantity of %d Units.\nBut it's not compatible with the selected packaging.\nHere is a proposition of quantities according to the packaging: ") % (qty)
+ warn_msg = warn_msg + "\n\n"+_("EAN: ") + str(ean) + _(" Quantity: ") + str(qty_pack) + _(" Type of ul: ") + str(type_ul.name)
warning={
- 'title':'Packing Information !',
+ 'title':_('Packing Information !'),
'message': warn_msg
}
result['product_uom_qty'] = qty
sale_order_line()
-
-_policy_form = '''<?xml version="1.0"?>
-<form string="Select Bank Account">
- <field name="picking_policy" colspan="4"/>
-</form>'''
-
-_policy_fields = {
- 'picking_policy': {'string': 'Packing Policy', 'type': 'selection','selection': [('direct','Direct Delivery'),('one','All at once')],'required': True,}
-}
class sale_config_picking_policy(osv.osv_memory):
_name='sale.config.picking_policy'
_columns = {
'category': 'Generic Modules/Sales & Purchases',
'description': """
This module adds a shortcut on one or several cases in the CRM.
-This shortcut allows you to generate a sale order based the selected case.
+This shortcut allows you to generate a sale order based on the selected case.
If different cases are open (a list), it generates one sale order by
case.
The case is then closed and linked to the generated sale order.
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2009-05-19 14:22:20+0000\n"
-"PO-Revision-Date: 2009-05-20 10:22:20+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2009-04-09 17:23+0000\n"
+"PO-Revision-Date: 2009-07-06 13:26+0000\n"
+"Last-Translator: Olivier (OpenERP) <Unknown>\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: 2009-07-06 13:56+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
#. module: sale_crm
#: model:process.transition,name:sale_crm.process_transition_crmopportunityquotation
msgstr "Chiffrage de l'opportunité"
#. module: sale_crm
-#: wizard_field:crm.case.make_order,init,partner_id:0
-msgid "Customer"
-msgstr "Client"
+#: model:process.transition,name:sale_crm.process_transition_opportunityanalytic0
+msgid "Opportunity Analytic"
+msgstr "Analytique de l'opportunité"
#. module: sale_crm
#: help:crm.case.make_order,init,partner_id:0
#. module: sale_crm
#: selection:crm.case.make_order,init,picking_policy:0
msgid "All at once"
-msgstr ""
+msgstr "Tout en une fois"
#. module: sale_crm
#: constraint:ir.ui.view:0
#. module: sale_crm
#: model:process.transition,note:sale_crm.process_transition_crmopportunityquotation
msgid "Opportunity goes into the quotation"
-msgstr ""
+msgstr "L'opportunité passe en devis"
#. module: sale_crm
#: model:process.node,name:sale_crm.process_node_contractanalytic0
msgstr "Convertir une oportunité en chiffrage"
#. module: sale_crm
-#: code:addons/sale_crm/wizard/makesale.py:0
-#, python-format
-msgid "Data Insufficient!"
-msgstr ""
-
-#. module: sale_crm
-#: code:addons/sale_crm/wizard/makesale.py:0
-#, python-format
-msgid "Customer has no addresses defined!"
-msgstr ""
-
-#. module: sale_crm
#: wizard_field:sale_crm.make_case,init,description:0
msgid "Your action"
msgstr "Votre action"
msgstr "CRM Opportunité"
#. module: sale_crm
-#: model:ir.module.module,shortdesc:sale_crm.module_meta_information
-msgid "Sale CRM Stuff"
-msgstr ""
-
-#. module: sale_crm
#: model:process.transition,note:sale_crm.process_transition_opportunityquotation0
msgid "Opportunity convert into quotation"
msgstr "Convertir une opportunité en chiffrage"
#. module: sale_crm
#: help:crm.case.make_order,init,close:0
msgid "Check this to close the case after having created the sale order."
-msgstr "Vérifier ceci pour fermer le cas après la création de la commande de vente"
+msgstr ""
+"Vérifier ceci pour fermer le cas après la création de la commande de vente"
+
+#. module: sale_crm
+#: wizard_field:crm.case.make_order,init,partner_id:0
+msgid "Customer"
+msgstr "Client"
#. module: sale_crm
#: model:process.transition,note:sale_crm.process_transition_opportunitypricelist0
msgstr "Refleter le contrat passé avec le client"
#. module: sale_crm
-#: model:process.transition,name:sale_crm.process_transition_opportunityanalytic0
-msgid "Opportunity Analytic"
-msgstr "Analytique de l'opportunité"
-
-#. module: sale_crm
#: wizard_field:crm.case.make_order,init,products:0
msgid "Products"
msgstr "Produits"
#. module: sale_crm
#: model:process.node,note:sale_crm.process_node_crmopportunity0
msgid "The CRM Opportunity can lead to a quotation."
-msgstr ""
+msgstr "L'opportunité de CRM peut mener à un devis"
#. module: sale_crm
#: model:process.transition,name:sale_crm.process_transition_opportunitypricelist0
#. module: sale_crm
#: wizard_field:sale_crm.make_case,init,section:0
msgid "Case Section"
-msgstr ""
+msgstr "Section du cas"
+#. module: sale_crm
+#: model:ir.module.module,shortdesc:sale_crm.module_meta_information
+msgid "Sale CRM Stuff"
+msgstr "Ventes à partir de Cas"
#: code:addons/stock/report_stock.py:0
#, python-format
msgid "You cannot delete any record!"
-msgstr ""
+msgstr "Vous ne pouvez pas supprimer d'enregistrement !"
#. module: stock
#: xsl:stock.location.overview:0
#. module: stock
#: field:stock.location,stock_real_value:0
msgid "Real Stock Value"
-msgstr ""
+msgstr "Valeur Réelle du Stock"
#. module: stock
#: view:stock.move:0
#: code:addons/stock/wizard/wizard_inventory.py:0
#, python-format
msgid "No product in this location."
-msgstr ""
+msgstr "Aucun produit à cet emplacement."
#. module: stock
#: field:stock.warehouse,lot_output_id:0
#. module: stock
#: field:stock.location,usage:0
msgid "Location Type"
-msgstr ""
+msgstr "Type d'emplacement"
#. module: stock
#: code:addons/stock/wizard/wizard_invoice_onshipping.py:0
#, python-format
msgid "Invoice cannot be created from Packing."
-msgstr ""
+msgstr "Une Facture ne peut être créée à partir du Colisage."
#. module: stock
#: selection:stock.location,icon:0
#. module: stock
#: field:stock.move,date_planned:0
msgid "Scheduled Date"
-msgstr ""
+msgstr "Date Planifiée"
#. module: stock
#: help:product.category,property_stock_account_output_categ:0
#. module: stock
#: field:stock.location,parent_left:0
msgid "Left Parent"
-msgstr ""
+msgstr "Parent gauche"
#. module: stock
#: field:report.stock.lines.date,create_date:0
#. module: stock
#: field:stock.move,tracking_id:0
msgid "Tracking Lot"
-msgstr ""
+msgstr "Lot de Traçage"
#. module: stock
#: selection:stock.location,icon:0
#. module: stock
#: help:stock.move,tracking_id:0
msgid "Tracking lot is the code that will be put on the logistical unit/pallet"
-msgstr ""
+msgstr "Le Lot de Traçage est le code qui sera placé sur l'unité logistique ou la pallette "
#. module: stock
#: code:addons/stock/product.py:0
#: model:ir.ui.menu,name:stock.menu_action_picking_tree7
#: model:ir.ui.menu,name:stock.menu_picking_waiting
msgid "Available Packing"
-msgstr ""
+msgstr "Colisage Disponible"
#. module: stock
#: model:ir.model,name:stock.model_stock_warehouse
#. module: stock
#: model:ir.actions.report.xml,name:stock.report_location_overview_all
msgid "Location Content (With children)"
-msgstr ""
+msgstr "Contenu de l'emplacement (avec les fils)"
#. module: stock
#: selection:stock.location,icon:0
#: model:ir.ui.menu,name:stock.menu_action_picking_all
#: wizard_field:stock.picking.make,init,pickings:0
msgid "Packing"
-msgstr ""
+msgstr "Colisage"
#. module: stock
#: selection:stock.location,icon:0
#: model:ir.actions.act_window,name:stock.action_picking_tree9
#: model:ir.ui.menu,name:stock.menu_action_picking_tree9
msgid "New Internal Packing"
-msgstr ""
+msgstr "Nouveau Colisage Interne"
#. module: stock
#: view:stock.inventory:0
#. module: stock
#: selection:stock.picking,invoice_state:0
msgid "To Be Invoiced"
-msgstr ""
+msgstr "À facturer"
#. module: stock
#: view:product.product:0
#: view:product.template:0
msgid "Counter-Part Locations Properties"
-msgstr ""
+msgstr "Propriétés des Emplacements Contre-Partie"
#. module: stock
#: code:addons/stock/product.py:0
#: code:addons/stock/wizard/wizard_invoice_onshipping.py:0
#, python-format
msgid "Invoice is not created"
-msgstr ""
+msgstr "Facture non créée"
#. module: stock
#: code:addons/stock/wizard/inventory_merge.py:0
#: code:addons/stock/wizard/wizard_return.py:0
#, python-format
msgid "Provide the quantities of the returned products."
-msgstr ""
+msgstr "Fournissez les quantités des produits retournés."
#. module: stock
#: selection:stock.location,icon:0
#. module: stock
#: field:stock.location,parent_right:0
msgid "Right Parent"
-msgstr ""
+msgstr "Parent Droit"
#. module: stock
#: field:stock.picking,origin:0
#: model:ir.model,name:stock.model_stock_picking
#: field:stock.move,picking_id:0
msgid "Packing List"
-msgstr ""
+msgstr "Liste de Colisage"
#. module: stock
#: selection:stock.location,icon:0
#. module: stock
#: selection:stock.location,chained_auto_packing:0
msgid "Automatic No Step Added"
-msgstr "Automatique aucun pas ajouter"
+msgstr "Aucune Étape Ajoutée Automatiquement"
#. module: stock
#: wizard_view:stock.location.products,init:0
#: code:addons/stock/wizard/wizard_invoice_onshipping.py:0
#, python-format
msgid "Error"
-msgstr ""
+msgstr "Erreur"
#. module: stock
#: code:addons/stock/wizard/wizard_invoice_onshipping.py:0
#, python-format
msgid "Invoice is already created."
-msgstr ""
+msgstr "Facture déjà créée."
#. module: stock
#: selection:stock.picking,invoice_state:0
#. module: stock
#: field:stock.production.lot,ref:0
msgid "Internal Ref"
-msgstr ""
+msgstr "Réf. Interne"
#. module: stock
#: selection:stock.location,icon:0
#. module: stock
#: model:ir.actions.report.xml,name:stock.report_product_history
msgid "Future Stock Forecast"
-msgstr ""
+msgstr "Prévision de Stock Futur"
#. module: stock
#: code:addons/stock/report_stock.py:0
#, python-format
msgid "Error !"
-msgstr ""
+msgstr "Erreur !"
#. module: stock
#: model:ir.module.module,description:stock.module_meta_information
"* Traceability (upstream/downstream, production lots, serial number, ...)\n"
" "
msgstr ""
+"Le module de Gestion de Stock d'Open ERP peut gérer plusieurs entrepôts, ainsi que de multiples emplacements de stock.\n"
+"Grâce à la gestion des écritures en double entrée, le contrôle des inventaires est puissant et flexible:\n"
+"* historique des mouvements et planification,\n"
+"* gestion de plusieurs méthodes d'inventaire différentes (FIFO, LIFO, ...)\n"
+"* valorisation du Stock (prix standard, prix moyen, ...)\n"
+"* robustesse face aux différence d'inventaire\n"
+"* règles de réordonancement automatiques (niveau de stock, JIT, ...)\n"
+"* support des codes barres\n"
+"* détection rapide des erreurs grâce au système de double entrée\n"
+"* traçabilité (amont, aval, lots de production, numéro de série, ...)\n"
+" "
#. module: stock
#: selection:stock.location,chained_location_type:0
#. module: stock
#: model:account.journal,name:stock.stock_journal
msgid "Stock Journal"
-msgstr ""
+msgstr "Journal de Stock"
#. module: stock
#: selection:stock.location,icon:0
#: model:ir.actions.act_window,name:stock.action_picking_tree3_delivery
#: model:ir.ui.menu,name:stock.menu_action_picking_tree3_delivery
msgid "Future Delivery Orders"
-msgstr ""
+msgstr "Commandes de Livraison Futures"
#. module: stock
#: selection:stock.location,icon:0
#. module: stock
#: field:stock.production.lot.revision,date:0
msgid "Revision Date"
-msgstr ""
+msgstr "Date de Révision"
#. module: stock
#: rml:stock.picking.list:0
#: model:ir.actions.act_window,name:stock.action_picking_tree5
#: model:ir.ui.menu,name:stock.menu_action_picking_tree5
msgid "Packing to Process"
-msgstr ""
+msgstr "Colisage à Traiter"
#. module: stock
#: selection:stock.location,icon:0
#. module: stock
#: field:stock.production.lot.revision,name:0
msgid "Revision Name"
-msgstr ""
+msgstr "Nom de Révision"
#. module: stock
#: selection:stock.location,icon:0
#: code:addons/stock/wizard/wizard_inventory.py:0
#, python-format
msgid "Message !"
-msgstr ""
+msgstr "Message !"
#. module: stock
#: view:stock.inventory:0
msgid "This is used only if you selected a chained location type.\n"
"The 'Automatic Move' value will create a stock move after the current one that will be validated automatically. With 'Manual Operation', the stock move has to be validated by a worker. With 'Automatic No Step Added', the location is replaced in the original move."
msgstr ""
+"est uniquement utilisé si vous avez sélectionné le type d'emplacement chainé.\n"
+"La valeur 'Mouvement Automatique' créera un mouvement de stock après celui courant qui sera validé Automatiquement. "
+"Avec 'Opération Manuelle', le mouvement de stock devra être validé par un travailleur. Avec "
+"'Aucune Étape Ajoutée Automatiquement', l'emplacement est remplacé avec le mouvement original."
#. module: stock
#: field:stock.location,icon:0
#. module: stock
#: view:stock.location:0
msgid "Stock Location"
-msgstr ""
+msgstr "Emplacement de Stock"
#. module: stock
#: selection:stock.location,icon:0
#: code:addons/stock/wizard/inventory_merge_zero.py:0
#, python-format
msgid "Warning"
-msgstr ""
+msgstr "Avertissement"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_picking_tree_delivery
#. module: stock
#: view:stock.picking:0
msgid "Confirm (Do Not Process Now)"
-msgstr ""
+msgstr "Confirmer (Ne pas traiter maintenant)"
#. module: stock
#: field:stock.tracking,move_ids:0
msgid "Moves Tracked"
-msgstr ""
+msgstr "Mouvements Tracés"
#. module: stock
#: model:ir.ui.menu,name:stock.next_id_61
#: code:addons/stock/wizard/inventory_merge_zero.py:0
#, python-format
msgid "Please select one and only one inventory !"
-msgstr ""
+msgstr "Veuillez sélectionner un et un seul inventaire !"
#. module: stock
#: selection:stock.location,icon:0
#. module: stock
#: field:stock.location,stock_virtual_value:0
msgid "Virtual Stock Value"
-msgstr ""
+msgstr "Valeur de Stock Virtuel"
#. module: stock
#: selection:stock.location,icon:0
#. module: stock
#: selection:stock.picking,invoice_state:0
msgid "Invoiced"
-msgstr "Facturer"
+msgstr "Facturé"
#. module: stock
#: selection:stock.location,icon:0
#: model:ir.ui.menu,name:stock.menu_action_picking_tree3
#: model:ir.ui.menu,name:stock.menu_action_picking_tree8
msgid "Confirmed Packing Waiting Availability"
-msgstr ""
+msgstr "Colisage Confirmé en attente de disponibilité"
#. module: stock
#: field:stock.location,posy:0
#. module: stock
#: model:ir.actions.act_window,name:stock.act_product_stock_move_futur_open
msgid "Future Stock Moves"
-msgstr ""
+msgstr "Mouvements de Stock Futurs"
#. module: stock
#: code:addons/stock/product.py:0
#: model:ir.actions.act_window,name:stock.action_location_tree_3
#: model:ir.ui.menu,name:stock.menu_action_location_tree_3
msgid "Locations' Values"
-msgstr ""
+msgstr "Valeurs des Emplacements"
#. module: stock
#: model:stock.location,name:stock.stock_location_output
('confirmed','Confirmed'),
('assigned','Available'),
('done','Done'),
- ('cancel','Cancel'),
+ ('cancel','Canceled'),
], 'Status', readonly=True, select=True),
'min_date': fields.function(get_min_max_date, fnct_inv=_set_minimum_date, multi="min_max_date",
method=True,store=True, type='datetime', string='Planned Date', select=1),
# -*- encoding: utf-8 -*-
##############################################################################
#
-# OpenERP, Open Source Management Solution
+# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
# $Id$
#
#
##############################################################################
-import time
import wizard
-import ir
import pooler
-from osv.osv import except_osv
-import netsvc
from tools.translate import _
invoice_form = """<?xml version="1.0"?>
},
'group': {
'string': 'Group by partner',
- 'type':'boolean'
+ 'type': 'boolean'
},
'type': {
'string': 'Type',
},
}
+
def _get_type(obj, cr, uid, data, context):
- picking_obj=pooler.get_pool(cr.dbname).get('stock.picking')
+ picking_obj = pooler.get_pool(cr.dbname).get('stock.picking')
usage = 'customer'
- pick = picking_obj.browse(cr, uid, data['id'], context)
- if pick.invoice_state=='invoiced':
- raise wizard.except_wizard(_('UserError'),_('Invoice is already created.'))
- if pick.invoice_state=='none':
- raise wizard.except_wizard(_('UserError'),_('Invoice cannot be created from Packing.'))
+ pick = picking_obj.browse(cr, uid, data['id'], context)
+ if pick.invoice_state == 'invoiced':
+ raise wizard.except_wizard(_('UserError'), _('Invoice is already created.'))
+ if pick.invoice_state == 'none':
+ raise wizard.except_wizard(_('UserError'), _('Invoice cannot be created from Packing.'))
if pick.move_lines:
- usage=pick.move_lines[0].location_id.usage
+ usage = pick.move_lines[0].location_id.usage
if pick.type == 'out' and usage == 'supplier':
type = 'in_refund'
type = 'out_invoice'
return {'type': type}
+
def _create_invoice(obj, cr, uid, data, context):
- if data['form'].get('new_picking',False):
+ if data['form'].get('new_picking', False):
data['id'] = data['form']['new_picking']
data['ids'] = [data['form']['new_picking']]
pool = pooler.get_pool(cr.dbname)
type = data['form']['type']
res = picking_obj.action_invoice_create(cr, uid, data['ids'],
- journal_id=data['form']['journal_id'],group=data['form']['group'],
+ journal_id = data['form']['journal_id'], group=data['form']['group'],
type=type, context= context)
- invoice_ids = res.values()
+ invoice_ids = res.values()
if not invoice_ids:
- raise wizard.except_wizard(_('Error'),_('Invoice is not created'))
+ raise wizard.except_wizard(_('Error'), _('Invoice is not created'))
if type == 'out_invoice':
xml_id = 'action_invoice_tree5'
xml_id = 'action_invoice_tree12'
result = mod_obj._get_id(cr, uid, 'account', xml_id)
- id = mod_obj.read(cr, uid, result, ['res_id'])
+ id = mod_obj.read(cr, uid, result, ['res_id'])
result = act_obj.read(cr, uid, id['res_id'])
- result['res_id'] = invoice_ids
+ result['res_id'] = invoice_ids
return result
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2009-05-19 14:22:20+0000\n"
-"PO-Revision-Date: 2009-05-20 10:22:20+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2009-04-09 17:23+0000\n"
+"PO-Revision-Date: 2009-07-06 13:01+0000\n"
+"Last-Translator: Olivier (OpenERP) <Unknown>\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: 2009-07-06 13:12+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
#. module: stock_invoice_directly
#: model:ir.module.module,shortdesc:stock_invoice_directly.module_meta_information
msgid "Invoice Picking Directly"
-msgstr ""
-
+msgstr "Facture la livraison directement"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-12 14:13+0000\n"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-12 14:17+0000\n"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-12 14:01+0000\n"
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.0\n"
+"Project-Id-Version: OpenERP Server 5.0.1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
"PO-Revision-Date: 2009-06-12 13:53+0000\n"
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-05-19 14:36+0000\n"
-"PO-Revision-Date: 2009-06-08 09:44+0000\n"
-"Last-Translator: Olivier (OpenERP) <Unknown>\n"
+"PO-Revision-Date: 2009-07-07 13:42+0000\n"
+"Last-Translator: Olivier (Open ERP) <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2009-06-08 09:48+0000\n"
+"X-Launchpad-Export-Date: 2009-07-07 14:08+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: base
#. module: base
#: model:ir.actions.act_window,name:base.action_partner_address_form
#: model:ir.model,name:base.model_res_partner_address
-#: model:ir.ui.menu,name:base.menu_partner_address_form
#: view:res.partner.address:0
msgid "Partner Addresses"
msgstr "Adresses des Partenaires"
#. module: base
#: selection:ir.ui.view,type:0
msgid "mdx"
-msgstr ""
+msgstr "mdx"
#. module: base
#: model:res.country,name:base.bi
#. module: base
#: selection:module.lang.install,init,lang:0
msgid "Dutch (Belgium) / Nederlands (Belgïe)"
-msgstr ""
+msgstr "Néerlandais (Belgique) / Nederlands (Belgïe)"
#. module: base
#: model:ir.actions.act_window,name:base.open_repository_tree
self.id = 0
self.id_protect = threading.Semaphore()
+ self._pg_psw_env_var_is_set = False # on win32, pg_dump need the PGPASSWORD env var
+
def create(self, password, db_name, demo, lang, user_password='admin'):
security.check_super(password)
self.id_protect.acquire()
sql_db.close_db('template1')
return True
+ def _set_pg_psw_env_var(self):
+ if os.name == 'nt' and not os.environ.get('PGPASSWORD', ''):
+ os.environ['PGPASSWORD'] = tools.config['db_password']
+ self._pg_psw_env_var_is_set = True
+
+ def _unset_pg_psw_env_var(self):
+ if os.name == 'nt' and self._pg_psw_env_var_is_set:
+ os.environ['PGPASSWORD'] = ''
+
def dump(self, password, db_name):
security.check_super(password)
logger = netsvc.Logger()
+ self._set_pg_psw_env_var()
+
cmd = ['pg_dump', '--format=c', '--no-owner']
if tools.config['db_user']:
cmd.append('--username=' + tools.config['db_user'])
raise Exception, "Couldn't dump database"
logger.notifyChannel("web-services", netsvc.LOG_INFO,
'DUMP DB: %s' % (db_name))
+
+ self._unset_pg_psw_env_var()
+
return base64.encodestring(data)
def restore(self, password, db_name, data):
security.check_super(password)
logger = netsvc.Logger()
+ self._set_pg_psw_env_var()
+
if self.db_exist(db_name):
logger.notifyChannel("web-services", netsvc.LOG_WARNING,
'RESTORE DB: %s already exists' % (db_name,))
raise Exception, "Couldn't restore database"
logger.notifyChannel("web-services", netsvc.LOG_INFO,
'RESTORE DB: %s' % (db_name))
+
+ self._unset_pg_psw_env_var()
+
return True
def rename(self, password, old_name, new_name):