[MERGE]
authorOlivier Laurent <olt@tinyerp.com>
Thu, 9 Jul 2009 08:39:13 +0000 (10:39 +0200)
committerOlivier Laurent <olt@tinyerp.com>
Thu, 9 Jul 2009 08:39:13 +0000 (10:39 +0200)
bzr revid: olt@tinyerp.com-20090709083913-0jkpicud1kdq01um

169 files changed:
addons/account/__init__.py
addons/account/__terp__.py
addons/account/account.py
addons/account/account_invoice_view.xml
addons/account/account_wizard.xml
addons/account/company.py [new file with mode: 0644]
addons/account/company_view.xml [new file with mode: 0644]
addons/account/i18n/fr_FR.po
addons/account/invoice.py
addons/account/partner.py
addons/account/partner_view.xml
addons/account/project/analytic_account_demo.xml
addons/account/report/invoice.rml
addons/account/report/overdue.rml
addons/account/report/tax_report.py
addons/account/wizard/wizard_account_chart.py
addons/account_analytic_analysis/i18n/fr_FR.po
addons/account_analytic_default/i18n/fr_FR.po
addons/account_analytic_plans/i18n/fr_FR.po
addons/account_balance/i18n/fr_FR.po
addons/account_budget/i18n/fr_FR.po
addons/account_chart/i18n/fr_FR.po
addons/account_date_check/i18n/fr_FR.po
addons/account_invoice_layout/i18n/fr_FR.po
addons/account_report/i18n/fr_FR.po
addons/account_tax_include/i18n/fr_FR.po
addons/account_tax_include/invoice_tax_incl.xml
addons/analytic_journal_billing_rate/i18n/fr_FR.po
addons/base_iban/i18n/fr_FR.po
addons/base_module_quality/README.txt [new file with mode: 0644]
addons/base_module_quality/__init__.py [new file with mode: 0644]
addons/base_module_quality/__terp__.py [new file with mode: 0644]
addons/base_module_quality/base_module_quality.py [new file with mode: 0644]
addons/base_module_quality/base_module_quality_view.xml [new file with mode: 0644]
addons/base_module_quality/base_module_quality_wizard.xml [new file with mode: 0644]
addons/base_module_quality/document/quality.doc [new file with mode: 0644]
addons/base_module_quality/i18n/ar_AR.po [new file with mode: 0644]
addons/base_module_quality/i18n/base_module_quality.pot [new file with mode: 0644]
addons/base_module_quality/i18n/bg_BG.po [new file with mode: 0644]
addons/base_module_quality/i18n/bs_BS.po [new file with mode: 0644]
addons/base_module_quality/i18n/ca_ES.po [new file with mode: 0644]
addons/base_module_quality/i18n/cs_CZ.po [new file with mode: 0644]
addons/base_module_quality/i18n/de_DE.po [new file with mode: 0644]
addons/base_module_quality/i18n/es_AR.po [new file with mode: 0644]
addons/base_module_quality/i18n/es_ES.po [new file with mode: 0644]
addons/base_module_quality/i18n/et_EE.po [new file with mode: 0644]
addons/base_module_quality/i18n/fr_FR.po [new file with mode: 0644]
addons/base_module_quality/i18n/hr_HR.po [new file with mode: 0644]
addons/base_module_quality/i18n/hu_HU.po [new file with mode: 0644]
addons/base_module_quality/i18n/it_IT.po [new file with mode: 0644]
addons/base_module_quality/i18n/lt_LT.po [new file with mode: 0644]
addons/base_module_quality/i18n/nl_NL.po [new file with mode: 0644]
addons/base_module_quality/i18n/pl_PL.po [new file with mode: 0644]
addons/base_module_quality/i18n/pt_BR.po [new file with mode: 0644]
addons/base_module_quality/i18n/pt_PT.po [new file with mode: 0644]
addons/base_module_quality/i18n/ro_RO.po [new file with mode: 0644]
addons/base_module_quality/i18n/ru_RU.po [new file with mode: 0644]
addons/base_module_quality/i18n/sl_SL.po [new file with mode: 0644]
addons/base_module_quality/i18n/sv_SE.po [new file with mode: 0644]
addons/base_module_quality/i18n/tr_TR.po [new file with mode: 0644]
addons/base_module_quality/i18n/uk_UK.po [new file with mode: 0644]
addons/base_module_quality/i18n/zh_CN.po [new file with mode: 0644]
addons/base_module_quality/i18n/zh_TW.po [new file with mode: 0644]
addons/base_module_quality/method_test/__init__.py [new file with mode: 0644]
addons/base_module_quality/method_test/method_test.py [new file with mode: 0644]
addons/base_module_quality/object_test/__init__.py [new file with mode: 0644]
addons/base_module_quality/object_test/object_test.py [new file with mode: 0644]
addons/base_module_quality/pep8_test/__init__.py [new file with mode: 0644]
addons/base_module_quality/pep8_test/pep8_test.py [new file with mode: 0644]
addons/base_module_quality/pyflakes_test/__init__.py [new file with mode: 0644]
addons/base_module_quality/pyflakes_test/pyflakes_test.py [new file with mode: 0644]
addons/base_module_quality/pylint_test/__init__.py [new file with mode: 0644]
addons/base_module_quality/pylint_test/pylint_test.py [new file with mode: 0644]
addons/base_module_quality/pylint_test/pylint_test_config.txt [new file with mode: 0644]
addons/base_module_quality/security/ir.model.access.csv [new file with mode: 0644]
addons/base_module_quality/speed_test/__init__.py [new file with mode: 0644]
addons/base_module_quality/speed_test/speed_test.py [new file with mode: 0644]
addons/base_module_quality/structure_test/__init__.py [new file with mode: 0644]
addons/base_module_quality/structure_test/structure_test.py [new file with mode: 0644]
addons/base_module_quality/terp_test/__init__.py [new file with mode: 0644]
addons/base_module_quality/terp_test/terp_test.py [new file with mode: 0644]
addons/base_module_quality/wizard/__init__.py [new file with mode: 0644]
addons/base_module_quality/wizard/module_quality_check.py [new file with mode: 0644]
addons/base_module_quality/wizard/quality_save_report.py [new file with mode: 0644]
addons/base_module_quality/workflow_test/__init__.py [new file with mode: 0644]
addons/base_module_quality/workflow_test/workflow_test.py [new file with mode: 0644]
addons/base_report_designer/i18n/fr_FR.po
addons/base_setup/i18n/fr_FR.po
addons/board/i18n/fr_FR.po
addons/board_association/i18n/fr_FR.po
addons/board_manufacturing/i18n/fr_FR.po
addons/board_sale/i18n/fr_FR.po
addons/crm_vertical/i18n/fr_FR.po
addons/delivery/i18n/fr_FR.po
addons/document/document.py
addons/event/i18n/fr_FR.po
addons/hr/i18n/fr_FR.po
addons/hr_timesheet_sheet/hr_timesheet_sheet.py
addons/l10n_be/i18n/fr_FR.po
addons/mrp/i18n/fr_FR.po
addons/mrp/schedulers.py
addons/mrp_operations/i18n/fr_FR.po
addons/mrp_repair/i18n/fr_FR.po
addons/point_of_sale/pos.py
addons/point_of_sale/pos_view.xml
addons/point_of_sale/security/ir.model.access.csv
addons/point_of_sale/security/point_of_sale_security.xml
addons/process/process_view.xml
addons/product/i18n/fr_FR.po
addons/product/product.py
addons/product/product_view.xml
addons/profile_crm/i18n/fr_FR.po
addons/project/i18n/fr_FR.po
addons/project/project_view.xml
addons/project_retro_planning/i18n/fr_FR.po
addons/purchase/i18n/fr_FR.po
addons/purchase/purchase.py
addons/purchase/wizard/wizard_group.py
addons/report_analytic/i18n/fr_FR.po
addons/report_intrastat/i18n/fr_FR.po
addons/report_project/i18n/fr_FR.po
addons/report_task/i18n/ar_AR.po
addons/report_task/i18n/bg_BG.po
addons/report_task/i18n/bs_BS.po
addons/report_task/i18n/ca_ES.po
addons/report_task/i18n/cs_CS.po
addons/report_task/i18n/cs_CZ.po
addons/report_task/i18n/de_DE.po
addons/report_task/i18n/es_AR.po
addons/report_task/i18n/es_ES.po
addons/report_task/i18n/et_EE.po
addons/report_task/i18n/fr_FR.po
addons/report_task/i18n/hr_HR.po
addons/report_task/i18n/hu_HU.po
addons/report_task/i18n/it_IT.po
addons/report_task/i18n/lt_LT.po
addons/report_task/i18n/nl_BE.po
addons/report_task/i18n/nl_NL.po
addons/report_task/i18n/pl_PL.po
addons/report_task/i18n/pt_BR.po
addons/report_task/i18n/pt_PT.po
addons/report_task/i18n/report_task.pot
addons/report_task/i18n/ro_RO.po
addons/report_task/i18n/ru_RU.po
addons/report_task/i18n/sl_SL.po
addons/report_task/i18n/sv_SE.po
addons/report_task/i18n/sv_SV.po
addons/report_task/i18n/tr_TR.po
addons/report_task/i18n/uk_UK.po
addons/report_task/i18n/zh_CN.po
addons/report_task/i18n/zh_TW.po
addons/sale/__terp__.py
addons/sale/i18n/fr_FR.po
addons/sale/product.py
addons/sale/product_view.xml [deleted file]
addons/sale/report/order.rml
addons/sale/sale.py
addons/sale_crm/__terp__.py
addons/sale_crm/i18n/fr_FR.po
addons/stock/i18n/fr_FR.po
addons/stock/stock.py
addons/stock/wizard/wizard_invoice_onshipping.py
addons/stock_invoice_directly/i18n/fr_FR.po
addons/stock_location/i18n/fr_FR.po
addons/subscription/i18n/fr_FR.po
addons/warning/i18n/fr_FR.po
addons/wiki/i18n/fr_FR.po
bin/addons/base/i18n/fr_FR.po
bin/service/web_services.py

index 939f996..894daca 100644 (file)
@@ -1,7 +1,7 @@
 # -*- 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$
 #
@@ -31,6 +31,6 @@ import wizard
 import report
 import product
 import sequence
-
+import company
 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 
index 2679bc5..3930b9b 100644 (file)
@@ -1,7 +1,7 @@
 # -*- 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$
 #
@@ -59,7 +59,8 @@
         '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',
index 2af75ae..dad8832 100644 (file)
@@ -2205,9 +2205,11 @@ class wizard_multi_charts_accounts(osv.osv_memory):
             #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,
index aa2eaa4..3da8436 100644 (file)
@@ -35,7 +35,7 @@
             <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"/>
@@ -59,8 +59,8 @@
                             <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', '&lt;&gt;', 'view')]" name="account_id" on_change="onchange_account_id(parent.fiscal_position,account_id)"/>
-                            <field domain="[('type','&lt;&gt;','view'), ('company_id', '=', parent.company_id)]" name="account_analytic_id"/>
+                            <field domain="[('company_id', '=', parent.company_id), ('journal_id', '=', parent.journal_id), ('type', '&lt;&gt;', 'view')]" name="account_id" on_change="onchange_account_id(parent.fiscal_position,account_id)" groups="base.group_user"/>
+                            <field domain="[('type','&lt;&gt;','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)]"/>
@@ -81,7 +81,7 @@
                     <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>
@@ -95,7 +95,7 @@
                 <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','&lt;&gt;','view'), ('company_id', '=', company_id),('journal_id','=',journal_id)]" name="account_id"/>
+                            <field domain="[('type','&lt;&gt;','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>
index 4e44a44..9e06d1d 100644 (file)
@@ -2,9 +2,9 @@
 <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"/>
@@ -80,8 +80,8 @@
         <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 -->
@@ -97,7 +97,7 @@
         <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"/>
diff --git a/addons/account/company.py b/addons/account/company.py
new file mode 100644 (file)
index 0000000..403b886
--- /dev/null
@@ -0,0 +1,99 @@
+# -*- 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()
diff --git a/addons/account/company_view.xml b/addons/account/company_view.xml
new file mode 100644 (file)
index 0000000..29eedc7
--- /dev/null
@@ -0,0 +1,56 @@
+<?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>
index 44b0421..3fa59da 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
@@ -103,7 +103,7 @@ msgstr "Résultat du lettrage"
 #. 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
@@ -151,7 +151,7 @@ msgstr "Coefficient multiplicateur"
 #: 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
@@ -224,7 +224,7 @@ msgid ""
 "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."
 
@@ -271,7 +271,7 @@ msgstr "Echéancier"
 #. 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
@@ -774,7 +774,7 @@ msgstr "Remise (%)"
 #: 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
@@ -1154,7 +1154,7 @@ msgstr "Compte de débit par défaut"
 #: 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
@@ -1336,7 +1336,7 @@ msgstr "Prix unitaire"
 #. 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
@@ -1609,7 +1609,7 @@ msgstr "Séquences"
 #. 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
@@ -1958,7 +1958,7 @@ msgstr "Delta de crédit"
 #: 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
@@ -2425,7 +2425,7 @@ msgstr "Montant"
 #. 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
@@ -2629,7 +2629,7 @@ msgstr "Type de Taxe"
 #. 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
@@ -2673,7 +2673,7 @@ msgstr "Importer une facture"
 #: 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
@@ -2809,7 +2809,7 @@ msgstr "Informations supplémentaires"
 #: 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
@@ -2944,7 +2944,7 @@ msgstr "Ordre de Paiement"
 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
@@ -2997,7 +2997,7 @@ msgid ""
 "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 "
@@ -3240,7 +3240,7 @@ msgstr "Compte de taxe"
 #. 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
@@ -3393,8 +3393,8 @@ msgid ""
 "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
@@ -3421,7 +3421,7 @@ msgstr "Document"
 #. 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
@@ -3882,7 +3882,7 @@ msgid ""
 "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."
 
@@ -3898,7 +3898,7 @@ msgid ""
 "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
@@ -4161,7 +4161,7 @@ msgstr ""
 #: 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
@@ -4234,7 +4234,7 @@ msgstr "Date de facture"
 #: 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
@@ -4565,7 +4565,7 @@ msgid ""
 "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
@@ -4713,7 +4713,7 @@ msgid ""
 "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
@@ -4942,7 +4942,7 @@ msgstr "Modèle de compte de taxe"
 #. 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
@@ -4967,7 +4967,7 @@ msgstr "Débit fournisseur"
 #. 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
@@ -5122,13 +5122,13 @@ msgstr "La taxe est comprise dans le prix indiqué"
 #: 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
@@ -5298,7 +5298,7 @@ msgstr "Adresse de facturation"
 #. 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
@@ -5317,7 +5317,7 @@ msgid ""
 "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."
 
@@ -5546,7 +5546,7 @@ msgstr "Début de la Période"
 #. 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
@@ -5818,7 +5818,7 @@ msgstr "Cette période est déjà cloturée !"
 #. 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
@@ -5858,7 +5858,7 @@ msgstr "Non"
 #. 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
@@ -5927,7 +5927,7 @@ msgstr "PRO-FORMA"
 #. 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
@@ -5948,7 +5948,7 @@ msgstr "Encodage standard"
 #. 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
@@ -6154,7 +6154,7 @@ msgstr "Définition du Journal Analytique"
 #. 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
@@ -6253,7 +6253,7 @@ msgstr "Vous devez définir un journal analytique sur le journal '%s' !"
 #. 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
@@ -6274,7 +6274,7 @@ msgstr "au"
 #. 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
@@ -6459,7 +6459,7 @@ msgstr "account.sequence.fiscalyear"
 #. 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
@@ -6531,12 +6531,12 @@ msgstr "Note de Crédit Fournisseur"
 #: 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
@@ -6591,12 +6591,12 @@ msgstr "Détails de banque"
 #. 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
@@ -6692,7 +6692,7 @@ msgstr "Oui"
 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
index 027079e..2bbd2e9 100644 (file)
@@ -223,7 +223,7 @@ class account_invoice(osv.osv):
             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)]}),
@@ -862,6 +862,7 @@ class account_invoice(osv.osv):
             '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,
@@ -869,6 +870,7 @@ class account_invoice(osv.osv):
             'account_id': pay_account_id,
             'partner_id': invoice.partner_id.id,
             'ref':invoice.number,
+            'date': date,
         }
 
         if not name:
@@ -919,7 +921,7 @@ class account_invoice_line(osv.osv):
         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'))
index ecc8c7f..9c1f13f 100644 (file)
@@ -30,7 +30,8 @@ class account_fiscal_position(osv.osv):
         '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={}):
index 33aeda3..d93349d 100644 (file)
@@ -11,7 +11,8 @@
                     <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)]"/>
@@ -21,7 +22,7 @@
                             <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"/>
index 680d1a7..bb0738d 100644 (file)
@@ -2,7 +2,7 @@
 <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">
index 876b6bc..cb6d549 100644 (file)
     <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>
index f216136..df4c69c 100644 (file)
     <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>
index 79e5995..1f0332d 100644 (file)
@@ -43,20 +43,6 @@ class tax_report(rml_parse.rml_parse):
                })
 
                
-       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)
                
@@ -73,7 +59,6 @@ class tax_report(rml_parse.rml_parse):
                
                i = 0
                top_result = []
-               
                while i < len(res):
                        
                        res_dict = { 'code' : res[i][1].code,
@@ -106,7 +91,6 @@ class tax_report(rml_parse.rml_parse):
        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, \
@@ -125,6 +109,7 @@ class tax_report(rml_parse.rml_parse):
                                                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,
@@ -144,6 +129,7 @@ class tax_report(rml_parse.rml_parse):
                                                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))
index f60dfdc..124a814 100644 (file)
@@ -41,7 +41,7 @@ class wizard_account_chart(wizard.interface):
             '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",
         },
@@ -60,7 +60,7 @@ class wizard_account_chart(wizard.interface):
         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
index 75e5ad8..7e8c4ca 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index 4c0b26e..9e72559 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index 2be6840..2905868 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index d065829..d5d563e 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index 5862945..ad2abbb 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index f578466..793e6ba 100644 (file)
@@ -4,16 +4,16 @@
 #
 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
index 4536f6e..f59cf06 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index 67bddc2..d92ce2d 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index c1edd3d..a0fba03 100644 (file)
 # 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"
index ece0547..eee7d6d 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index 470a1ca..2da7895 100644 (file)
@@ -21,7 +21,7 @@
             <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>
index 7f5c151..191f5c8 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index 5f3b3f4..28cd316 100644 (file)
@@ -4,16 +4,16 @@
 #
 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
@@ -47,12 +47,6 @@ msgid "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"
@@ -61,3 +55,9 @@ 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"
diff --git a/addons/base_module_quality/README.txt b/addons/base_module_quality/README.txt
new file mode 100644 (file)
index 0000000..3819448
--- /dev/null
@@ -0,0 +1,11 @@
+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.
+
+
diff --git a/addons/base_module_quality/__init__.py b/addons/base_module_quality/__init__.py
new file mode 100644 (file)
index 0000000..1f0d6b5
--- /dev/null
@@ -0,0 +1,26 @@
+# -*- 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
diff --git a/addons/base_module_quality/__terp__.py b/addons/base_module_quality/__terp__.py
new file mode 100644 (file)
index 0000000..9c16e9b
--- /dev/null
@@ -0,0 +1,51 @@
+# -*- 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:
diff --git a/addons/base_module_quality/base_module_quality.py b/addons/base_module_quality/base_module_quality.py
new file mode 100644 (file)
index 0000000..ec1a50a
--- /dev/null
@@ -0,0 +1,250 @@
+# -*- 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
diff --git a/addons/base_module_quality/base_module_quality_view.xml b/addons/base_module_quality/base_module_quality_view.xml
new file mode 100644 (file)
index 0000000..18ad044
--- /dev/null
@@ -0,0 +1,70 @@
+<?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
diff --git a/addons/base_module_quality/base_module_quality_wizard.xml b/addons/base_module_quality/base_module_quality_wizard.xml
new file mode 100644 (file)
index 0000000..fe5c7ef
--- /dev/null
@@ -0,0 +1,12 @@
+<?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
diff --git a/addons/base_module_quality/document/quality.doc b/addons/base_module_quality/document/quality.doc
new file mode 100644 (file)
index 0000000..9f42b04
Binary files /dev/null and b/addons/base_module_quality/document/quality.doc differ
diff --git a/addons/base_module_quality/i18n/ar_AR.po b/addons/base_module_quality/i18n/ar_AR.po
new file mode 100644 (file)
index 0000000..0c0354c
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/base_module_quality.pot b/addons/base_module_quality/i18n/base_module_quality.pot
new file mode 100644 (file)
index 0000000..d2f44cc
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/bg_BG.po b/addons/base_module_quality/i18n/bg_BG.po
new file mode 100644 (file)
index 0000000..5a9da30
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/bs_BS.po b/addons/base_module_quality/i18n/bs_BS.po
new file mode 100644 (file)
index 0000000..214027f
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/ca_ES.po b/addons/base_module_quality/i18n/ca_ES.po
new file mode 100644 (file)
index 0000000..53637eb
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/cs_CZ.po b/addons/base_module_quality/i18n/cs_CZ.po
new file mode 100644 (file)
index 0000000..62c5ce1
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/de_DE.po b/addons/base_module_quality/i18n/de_DE.po
new file mode 100644 (file)
index 0000000..7ef5729
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/es_AR.po b/addons/base_module_quality/i18n/es_AR.po
new file mode 100644 (file)
index 0000000..a764318
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/es_ES.po b/addons/base_module_quality/i18n/es_ES.po
new file mode 100644 (file)
index 0000000..0b684af
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/et_EE.po b/addons/base_module_quality/i18n/et_EE.po
new file mode 100644 (file)
index 0000000..3c75cb3
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/fr_FR.po b/addons/base_module_quality/i18n/fr_FR.po
new file mode 100644 (file)
index 0000000..182fd17
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/hr_HR.po b/addons/base_module_quality/i18n/hr_HR.po
new file mode 100644 (file)
index 0000000..1d785ea
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/hu_HU.po b/addons/base_module_quality/i18n/hu_HU.po
new file mode 100644 (file)
index 0000000..0295de5
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/it_IT.po b/addons/base_module_quality/i18n/it_IT.po
new file mode 100644 (file)
index 0000000..82490ab
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/lt_LT.po b/addons/base_module_quality/i18n/lt_LT.po
new file mode 100644 (file)
index 0000000..936b89c
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/nl_NL.po b/addons/base_module_quality/i18n/nl_NL.po
new file mode 100644 (file)
index 0000000..585d3d9
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/pl_PL.po b/addons/base_module_quality/i18n/pl_PL.po
new file mode 100644 (file)
index 0000000..85cd247
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/pt_BR.po b/addons/base_module_quality/i18n/pt_BR.po
new file mode 100644 (file)
index 0000000..6ab229d
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/pt_PT.po b/addons/base_module_quality/i18n/pt_PT.po
new file mode 100644 (file)
index 0000000..dad89f7
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/ro_RO.po b/addons/base_module_quality/i18n/ro_RO.po
new file mode 100644 (file)
index 0000000..8a1790e
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/ru_RU.po b/addons/base_module_quality/i18n/ru_RU.po
new file mode 100644 (file)
index 0000000..8866fa3
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/sl_SL.po b/addons/base_module_quality/i18n/sl_SL.po
new file mode 100644 (file)
index 0000000..d5e1e04
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/sv_SE.po b/addons/base_module_quality/i18n/sv_SE.po
new file mode 100644 (file)
index 0000000..6e28079
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/tr_TR.po b/addons/base_module_quality/i18n/tr_TR.po
new file mode 100644 (file)
index 0000000..7395bc5
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/uk_UK.po b/addons/base_module_quality/i18n/uk_UK.po
new file mode 100644 (file)
index 0000000..92174cf
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/zh_CN.po b/addons/base_module_quality/i18n/zh_CN.po
new file mode 100644 (file)
index 0000000..1534b87
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/i18n/zh_TW.po b/addons/base_module_quality/i18n/zh_TW.po
new file mode 100644 (file)
index 0000000..00d1b15
--- /dev/null
@@ -0,0 +1,74 @@
+# 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 ""
+
diff --git a/addons/base_module_quality/method_test/__init__.py b/addons/base_module_quality/method_test/__init__.py
new file mode 100644 (file)
index 0000000..cfc1f61
--- /dev/null
@@ -0,0 +1,24 @@
+# -*- 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:
diff --git a/addons/base_module_quality/method_test/method_test.py b/addons/base_module_quality/method_test/method_test.py
new file mode 100644 (file)
index 0000000..3171995
--- /dev/null
@@ -0,0 +1,85 @@
+# -*- 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
diff --git a/addons/base_module_quality/object_test/__init__.py b/addons/base_module_quality/object_test/__init__.py
new file mode 100644 (file)
index 0000000..cfc1f61
--- /dev/null
@@ -0,0 +1,24 @@
+# -*- 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:
diff --git a/addons/base_module_quality/object_test/object_test.py b/addons/base_module_quality/object_test/object_test.py
new file mode 100644 (file)
index 0000000..49677c7
--- /dev/null
@@ -0,0 +1,209 @@
+# -*- 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:
+
diff --git a/addons/base_module_quality/pep8_test/__init__.py b/addons/base_module_quality/pep8_test/__init__.py
new file mode 100644 (file)
index 0000000..cfc1f61
--- /dev/null
@@ -0,0 +1,24 @@
+# -*- 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:
diff --git a/addons/base_module_quality/pep8_test/pep8_test.py b/addons/base_module_quality/pep8_test/pep8_test.py
new file mode 100644 (file)
index 0000000..448eb94
--- /dev/null
@@ -0,0 +1,278 @@
+# -*- 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
diff --git a/addons/base_module_quality/pyflakes_test/__init__.py b/addons/base_module_quality/pyflakes_test/__init__.py
new file mode 100644 (file)
index 0000000..8df5ef5
--- /dev/null
@@ -0,0 +1,24 @@
+# -*- 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
diff --git a/addons/base_module_quality/pyflakes_test/pyflakes_test.py b/addons/base_module_quality/pyflakes_test/pyflakes_test.py
new file mode 100644 (file)
index 0000000..635d436
--- /dev/null
@@ -0,0 +1,129 @@
+# -*- 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
diff --git a/addons/base_module_quality/pylint_test/__init__.py b/addons/base_module_quality/pylint_test/__init__.py
new file mode 100644 (file)
index 0000000..7799e20
--- /dev/null
@@ -0,0 +1,26 @@
+# -*- 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:
+
diff --git a/addons/base_module_quality/pylint_test/pylint_test.py b/addons/base_module_quality/pylint_test/pylint_test.py
new file mode 100644 (file)
index 0000000..7cabf4a
--- /dev/null
@@ -0,0 +1,105 @@
+# -*- 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:
+
diff --git a/addons/base_module_quality/pylint_test/pylint_test_config.txt b/addons/base_module_quality/pylint_test/pylint_test_config.txt
new file mode 100644 (file)
index 0000000..04daeed
--- /dev/null
@@ -0,0 +1,308 @@
+# 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
diff --git a/addons/base_module_quality/security/ir.model.access.csv b/addons/base_module_quality/security/ir.model.access.csv
new file mode 100644 (file)
index 0000000..74b8805
--- /dev/null
@@ -0,0 +1,3 @@
+"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
diff --git a/addons/base_module_quality/speed_test/__init__.py b/addons/base_module_quality/speed_test/__init__.py
new file mode 100644 (file)
index 0000000..cfc1f61
--- /dev/null
@@ -0,0 +1,24 @@
+# -*- 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:
diff --git a/addons/base_module_quality/speed_test/speed_test.py b/addons/base_module_quality/speed_test/speed_test.py
new file mode 100644 (file)
index 0000000..a5211c5
--- /dev/null
@@ -0,0 +1,125 @@
+# -*- 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:
diff --git a/addons/base_module_quality/structure_test/__init__.py b/addons/base_module_quality/structure_test/__init__.py
new file mode 100644 (file)
index 0000000..cfc1f61
--- /dev/null
@@ -0,0 +1,24 @@
+# -*- 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:
diff --git a/addons/base_module_quality/structure_test/structure_test.py b/addons/base_module_quality/structure_test/structure_test.py
new file mode 100644 (file)
index 0000000..93b49b4
--- /dev/null
@@ -0,0 +1,176 @@
+# -*- 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:
+
diff --git a/addons/base_module_quality/terp_test/__init__.py b/addons/base_module_quality/terp_test/__init__.py
new file mode 100644 (file)
index 0000000..cfc1f61
--- /dev/null
@@ -0,0 +1,24 @@
+# -*- 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:
diff --git a/addons/base_module_quality/terp_test/terp_test.py b/addons/base_module_quality/terp_test/terp_test.py
new file mode 100644 (file)
index 0000000..9aad0ee
--- /dev/null
@@ -0,0 +1,145 @@
+# -*- 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
diff --git a/addons/base_module_quality/wizard/__init__.py b/addons/base_module_quality/wizard/__init__.py
new file mode 100644 (file)
index 0000000..440ab8c
--- /dev/null
@@ -0,0 +1,28 @@
+# -*- 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:
+
diff --git a/addons/base_module_quality/wizard/module_quality_check.py b/addons/base_module_quality/wizard/module_quality_check.py
new file mode 100644 (file)
index 0000000..2dbefa6
--- /dev/null
@@ -0,0 +1,63 @@
+# -*- 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
diff --git a/addons/base_module_quality/wizard/quality_save_report.py b/addons/base_module_quality/wizard/quality_save_report.py
new file mode 100644 (file)
index 0000000..74e71c9
--- /dev/null
@@ -0,0 +1,61 @@
+# -*- 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
diff --git a/addons/base_module_quality/workflow_test/__init__.py b/addons/base_module_quality/workflow_test/__init__.py
new file mode 100644 (file)
index 0000000..cfc1f61
--- /dev/null
@@ -0,0 +1,24 @@
+# -*- 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:
diff --git a/addons/base_module_quality/workflow_test/workflow_test.py b/addons/base_module_quality/workflow_test/workflow_test.py
new file mode 100644 (file)
index 0000000..76d2fac
--- /dev/null
@@ -0,0 +1,150 @@
+# -*- 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
index 99182d1..6bcee7b 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index 4a739f1..abefdc4 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index 4e239f2..fb0df08 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index 7fe75be..e86b1e5 100644 (file)
@@ -4,16 +4,16 @@
 #
 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
@@ -22,11 +22,6 @@ msgid "Associations"
 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"
@@ -53,11 +48,6 @@ msgid "Unpaid Invoices"
 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"
@@ -66,3 +56,8 @@ 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"
index 967ddb7..e244ace 100644 (file)
@@ -6,14 +6,15 @@ 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: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
@@ -32,11 +33,6 @@ msgstr "XML non valide pour l'architecture de la vue"
 
 #. 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"
 
@@ -46,9 +42,9 @@ msgid "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
@@ -57,11 +53,6 @@ msgid "Production Dashboard"
 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"
@@ -71,3 +62,7 @@ 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"
index 5db02a5..f8d6444 100644 (file)
@@ -6,19 +6,15 @@ 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: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
@@ -39,7 +35,7 @@ msgstr "Tableau de Bord du Gestionnaire des Ventes"
 #. 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
@@ -52,11 +48,6 @@ msgid "My open quotations"
 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"
@@ -71,3 +62,7 @@ msgstr "Statistiques des Cas"
 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"
index 31b90c9..a7d73fb 100644 (file)
@@ -6,23 +6,23 @@ 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: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"
index a620b7b..77a207e 100644 (file)
@@ -38,7 +38,7 @@ msgstr "Destination"
 #. 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
@@ -48,7 +48,7 @@ msgstr "XML non valide pour l'architecture de la vue"
 #. 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
@@ -63,7 +63,7 @@ msgstr ""
 #. 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
@@ -84,7 +84,7 @@ msgstr "Fixe"
 #: 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
@@ -113,7 +113,7 @@ msgstr "Variable"
 #: 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
@@ -138,7 +138,7 @@ msgstr "Grille"
 #. module: delivery
 #: view:res.partner:0
 msgid "Deliveries Properties"
-msgstr ""
+msgstr "Propriétés des Livraisons"
 
 #. module: delivery
 #: field:delivery.carrier,active:0
@@ -165,7 +165,7 @@ msgstr "="
 #. module: delivery
 #: field:delivery.carrier,product_id:0
 msgid "Delivery Product"
-msgstr ""
+msgstr "Produit de Livraison"
 
 #. module: delivery
 #: view:delivery.grid.line:0
@@ -216,7 +216,7 @@ msgstr "facteur variable"
 #: 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
@@ -246,7 +246,7 @@ msgstr "Valeur maximum"
 #. 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
@@ -259,7 +259,7 @@ msgstr "Méthode de livraison"
 #. module: delivery
 #: field:sale.order,id:0
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 #. module: delivery
 #: field:delivery.grid.line,operator:0
@@ -269,13 +269,13 @@ msgstr "Opérateur"
 #. 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
@@ -303,6 +303,9 @@ msgstr "Partenaire pour la Livraison"
 #: 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
@@ -313,29 +316,29 @@ msgstr "Code postal destination"
 #: 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
@@ -356,7 +359,7 @@ msgstr "Grilles de transport"
 #: 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
@@ -367,7 +370,7 @@ msgstr "Annuler"
 #: code:addons/delivery/stock.py:0
 #, python-format
 msgid "Warning"
-msgstr ""
+msgstr "Avertissement"
 
 #. module: delivery
 #: field:sale.order,carrier_id:0
index 0d33efc..585031e 100644 (file)
@@ -103,23 +103,38 @@ class node_class(object):
                     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))
@@ -130,17 +145,17 @@ class node_class(object):
         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')
@@ -150,7 +165,7 @@ class node_class(object):
             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)            
@@ -169,12 +184,17 @@ class node_class(object):
                     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
@@ -183,31 +203,22 @@ class node_class(object):
                     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):
@@ -232,7 +243,7 @@ class document_directory(osv.osv):
     _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),
@@ -304,7 +315,6 @@ class document_directory(osv.osv):
     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 {}
@@ -312,6 +322,7 @@ class document_directory(osv.osv):
     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))
@@ -326,12 +337,17 @@ class document_directory(osv.osv):
             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:
@@ -340,10 +356,10 @@ class document_directory(osv.osv):
                 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)
@@ -351,7 +367,7 @@ class document_directory(osv.osv):
                     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={}):
@@ -378,7 +394,7 @@ class document_directory(osv.osv):
         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:
@@ -591,7 +607,7 @@ class document_file(osv.osv):
         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:
@@ -603,7 +619,6 @@ class document_file(osv.osv):
                 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):
@@ -648,7 +663,7 @@ class document_file(osv.osv):
             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):
@@ -790,6 +805,6 @@ class document_configuration_wizard(osv.osv_memory):
                 "view_mode": 'form',
                 'res_model': 'ir.actions.configuration.wizard',
                 'type': 'ir.actions.act_window',
-                'target':'new',
+                'target': 'new',
         }
 document_configuration_wizard()
index 5dd822b..f01a533 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index 45c6bf1..bac97a1 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index 17eabbc..9d8bdb1 100644 (file)
@@ -503,8 +503,8 @@ class hr_attendance(osv.osv):
                     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()
@@ -623,8 +623,8 @@ class hr_timesheet_sheet_sheet_day(osv.osv):
                                     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
index 443da31..9f8be39 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index 56e572d..0a0ebc5 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
@@ -57,7 +57,7 @@ msgstr "Révision"
 #: 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
@@ -94,7 +94,7 @@ msgstr "Liste des Colisages"
 #. 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
@@ -178,7 +178,7 @@ msgstr "Produit & Localisation"
 #. module: mrp
 #: view:res.company:0
 msgid "MRP & Logistic Scheduler"
-msgstr ""
+msgstr "Plannificateur MRP & Logistique"
 
 #. module: mrp
 #: help:mrp.workcenter,capacity_per_cycle:0
@@ -216,7 +216,7 @@ msgstr "Produits consommés"
 #. module: mrp
 #: field:mrp.workcenter,costs_cycle_account_id:0
 msgid "Cycle Account"
-msgstr ""
+msgstr "Compte Cyclique"
 
 #. module: mrp
 #: view:mrp.workcenter:0
index 14fbb12..7970794 100644 (file)
@@ -59,7 +59,7 @@ class mrp_procurement(osv.osv):
             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
@@ -82,7 +82,7 @@ class mrp_procurement(osv.osv):
             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:
index 4cc5737..bbc86c2 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index bdd065e..c7bdb41 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index 4a0c1fc..68daab9 100644 (file)
@@ -206,6 +206,7 @@ class pos_order(osv.osv):
 
     _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'),
@@ -321,7 +322,10 @@ class pos_order(osv.osv):
                 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
 
@@ -477,11 +481,14 @@ class pos_order(osv.osv):
                 '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
 
@@ -944,14 +951,14 @@ class report_transaction_pos(osv.osv):
                     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()
index 62f048e..4ff34b7 100644 (file)
             <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"/>
index 38d754a..fa9cd42 100644 (file)
@@ -1,5 +1,6 @@
 "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
index d70fd1c..29e7bfe 100644 (file)
@@ -1,6 +1,6 @@
 <?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>
@@ -8,6 +8,13 @@
     <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>
index 360f349..45f3cac 100644 (file)
@@ -32,7 +32,7 @@
                                 <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"/>                                    
index 0e74681..f7936a7 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
@@ -1674,11 +1674,13 @@ msgid ""
 "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
@@ -1686,6 +1688,11 @@ msgid "ATX Mid-size Tower"
 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"
@@ -1788,17 +1795,17 @@ msgstr "Étiquettes de produits"
 #. 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
index 1cb54c7..1937912 100644 (file)
@@ -383,6 +383,7 @@ class product_product(osv.osv):
                         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={}):
@@ -403,7 +404,7 @@ class product_product(osv.osv):
         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 '') + \
@@ -495,12 +496,15 @@ class product_product(osv.osv):
             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
 
index ef19205..681b53a 100644 (file)
                             <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"/>
index 3249920..741a9ea 100644 (file)
@@ -6,17 +6,17 @@ 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: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"
index 5ad4114..730458c 100644 (file)
@@ -6,14 +6,15 @@ 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: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
@@ -33,8 +34,12 @@ msgstr "Nouveau titre de la tâche délégué à l'utilisateur."
 #. 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
@@ -58,15 +63,9 @@ msgid "Operation Not Permitted !"
 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
@@ -81,8 +80,12 @@ msgstr "Achevé"
 #. 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
@@ -112,8 +115,12 @@ msgstr "Tâches déléguées"
 
 #. 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
@@ -131,9 +138,12 @@ msgid "User you want to delegate this task to."
 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
@@ -178,13 +188,6 @@ msgid "Validate"
 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"
@@ -208,8 +211,12 @@ msgstr "Tâche"
 
 #. 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
@@ -250,8 +257,11 @@ msgstr "Mes tâches en brouillon"
 
 #. 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
@@ -283,8 +293,12 @@ msgstr "Tâches délégués à d'autres utilisateurs"
 #. 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
@@ -293,13 +307,12 @@ msgstr "Le calcul utilise la somme de toutes les tâches terminés"
 
 #. 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
@@ -351,14 +364,14 @@ msgid "Reset as Project"
 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
@@ -384,12 +397,8 @@ msgstr "Tache délégué"
 #. 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
@@ -499,11 +508,6 @@ msgid "Estimated time to close this task by the delegated user."
 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"
@@ -600,13 +604,9 @@ msgstr "Nouvelle tâche"
 #. 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
@@ -635,12 +635,6 @@ msgid "Status: %(state)s"
 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é"
@@ -713,8 +707,12 @@ msgstr "État"
 
 #. 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
@@ -725,12 +723,7 @@ msgstr "Unité de temps du projet"
 #: 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
@@ -760,8 +753,13 @@ msgstr "Édition de tâche"
 
 #. 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
@@ -790,10 +788,15 @@ msgstr "Date"
 
 #. 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
@@ -820,7 +823,9 @@ msgstr "Urgent"
 #: 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
@@ -828,11 +833,6 @@ msgid "Delegate this task to a user"
 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"
@@ -844,8 +844,12 @@ msgstr "Assigné à"
 
 #. 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
@@ -853,11 +857,6 @@ msgid "Sum of spent hours of all tasks related to this project."
 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."
@@ -894,11 +893,6 @@ msgid "Date Start: %(date_start)s"
 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
@@ -931,8 +925,11 @@ msgstr "Ouvert"
 #. 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
@@ -946,8 +943,11 @@ msgstr "En cours"
 
 #. 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
@@ -1033,11 +1033,6 @@ msgid "Running"
 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"
@@ -1049,8 +1044,12 @@ msgstr "Tâches du projet"
 
 #. 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
@@ -1058,12 +1057,6 @@ msgid "New 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"
@@ -1107,8 +1100,12 @@ msgstr "Séquence"
 
 #. 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
@@ -1172,3 +1169,82 @@ msgstr "pied du mail"
 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"
index 97f4dc0..f130ec8 100644 (file)
             <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"/>
 
index 987232d..41bad32 100644 (file)
@@ -6,17 +6,17 @@ 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 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"
index a04200e..adaef67 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index 0b33990..68bec40 100644 (file)
@@ -432,7 +432,7 @@ class purchase_order_line(osv.osv):
         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'),
index 0ddfec5..65c09f3 100644 (file)
@@ -27,13 +27,20 @@ import netsvc
 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 = {
 }
index a61e249..c0f2a47 100644 (file)
@@ -6,14 +6,15 @@ 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: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
@@ -22,8 +23,11 @@ msgstr "Comptes analytiques à clôturer"
 
 #. 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
@@ -38,7 +42,7 @@ msgstr "XML non valide pour l'architecture de la vue"
 #. 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
@@ -51,16 +55,6 @@ msgid "Deadline"
 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"
@@ -82,3 +76,7 @@ msgstr "Comptes Analytiques Expirés"
 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"
index 6fe3735..717cccd 100644 (file)
@@ -23,12 +23,12 @@ msgstr "Le nom de l'objet doit commencer avec x_ et ne pas contenir de charactè
 #. 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
@@ -39,12 +39,12 @@ msgstr "Intrastat (ce mois)"
 #. 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
@@ -54,7 +54,7 @@ msgstr ""
 #. 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
@@ -69,22 +69,22 @@ msgstr "Import"
 #. 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
@@ -100,32 +100,32 @@ msgstr "Type"
 #. 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
@@ -135,17 +135,17 @@ msgstr "Ce mois"
 #. 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
@@ -160,17 +160,17 @@ msgstr "Rapport Intrastat"
 #. 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
@@ -192,12 +192,12 @@ msgstr "Intrastat"
 #. 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
@@ -210,7 +210,7 @@ msgstr "Code Intrastat"
 #. module: report_intrastat
 #: field:report.intrastat,ref:0
 msgid "Origin"
-msgstr ""
+msgstr "Origine"
 
 #. module: report_intrastat
 #: rml:account.invoice.intrastat:0
@@ -226,7 +226,7 @@ msgstr "Membre Intrastat"
 #. module: report_intrastat
 #: rml:account.invoice.intrastat:0
 msgid "Tax"
-msgstr ""
+msgstr "Taxe"
 
 #. module: report_intrastat
 #: field:report.intrastat,code:0
@@ -246,22 +246,22 @@ msgstr "Export"
 #. 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
index a7ddf03..759dbae 100644 (file)
@@ -6,94 +6,68 @@ 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: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
@@ -108,32 +82,56 @@ msgid "Avg Closing Delay"
 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"
index 06f4007..75cc7a8 100644 (file)
@@ -168,5 +168,3 @@ msgstr ""
 #: field:report.closed.task,project_id:0
 msgid "Project"
 msgstr ""
-
-#. module: repo
\ No newline at end of file
index a0505c8..724965b 100644 (file)
@@ -157,4 +157,14 @@ msgstr ""
 #. 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 ""
index 0c44d1b..af17437 100644 (file)
@@ -165,4 +165,6 @@ msgid "Delay Hours"
 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 ""
index 15571a3..1471669 100644 (file)
@@ -161,4 +161,10 @@ msgstr "XML invàlid per a la definició de la vista!"
 
 #. 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
index bb86578..af2b645 100644 (file)
@@ -169,4 +169,3 @@ msgstr ""
 msgid "Project"
 msgstr ""
 
-#. module: repo
\ No newline at end of file
index bfd8c03..419eada 100644 (file)
@@ -168,5 +168,3 @@ msgstr ""
 #: field:report.closed.task,project_id:0
 msgid "Project"
 msgstr ""
-
-#. module: repo
\ No newline at end of file
index 80aa37c..2e0fc94 100644 (file)
@@ -169,4 +169,3 @@ msgstr ""
 msgid "Project"
 msgstr ""
 
-#. module: repo
\ No newline at end of file
index 9b12dcb..855e886 100644 (file)
@@ -169,4 +169,3 @@ msgstr ""
 msgid "Project"
 msgstr ""
 
-#. module: repo
\ No newline at end of file
index 2efb4e5..c0cb073 100644 (file)
@@ -160,4 +160,12 @@ msgid "Invalid XML for View Architecture!"
 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 ""
+
index 999dc8e..917c52e 100644 (file)
@@ -160,4 +160,12 @@ msgid "Invalid XML for View Architecture!"
 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 ""
+
index 6caaac9..3555e02 100644 (file)
@@ -168,5 +168,3 @@ msgstr ""
 #: field:report.closed.task,project_id:0
 msgid "Project"
 msgstr ""
-
-#. module: repo
\ No newline at end of file
index d0839a0..a8320ae 100644 (file)
@@ -169,4 +169,3 @@ msgstr ""
 msgid "Project"
 msgstr ""
 
-#. module: repo
\ No newline at end of file
index c9cea9f..c7aa559 100644 (file)
@@ -169,4 +169,3 @@ msgstr ""
 msgid "Project"
 msgstr ""
 
-#. module: repo
\ No newline at end of file
index a02ed03..ce2f195 100644 (file)
@@ -160,4 +160,12 @@ msgid "Invalid XML for View Architecture!"
 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 ""
+
index 91e24ed..d2c83df 100644 (file)
@@ -169,4 +169,3 @@ msgstr ""
 msgid "Project"
 msgstr ""
 
-#. module: repo
\ No newline at end of file
index aa79109..26382d0 100644 (file)
@@ -165,4 +165,7 @@ msgid "Delay Hours"
 msgstr ""
 
 #. module: report_task
-#: fiel
\ No newline at end of file
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
+
index 56e69e1..cefb0d8 100644 (file)
@@ -162,4 +162,10 @@ msgstr "Ongeldige XML voor overzicht"
 #. 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 ""
+
index 0b41059..4b4fe77 100644 (file)
@@ -160,4 +160,12 @@ msgid "Invalid XML for View Architecture!"
 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 ""
+
index 99ba103..6013e9b 100644 (file)
@@ -161,4 +161,11 @@ msgstr "Invalido XML para Arquitetura da View"
 
 #. 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 ""
+
index bd8f192..fb14411 100644 (file)
@@ -161,4 +161,11 @@ msgstr "XML inválido para a arquitectura de vista"
 
 #. 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 ""
+
index 8c8160d..28f5dcf 100644 (file)
@@ -169,4 +169,3 @@ msgstr ""
 msgid "Project"
 msgstr ""
 
-#. module: repo
\ No newline at end of file
index 5a65c4e..cc5a7e1 100644 (file)
@@ -169,4 +169,3 @@ msgstr ""
 msgid "Project"
 msgstr ""
 
-#. module: repo
\ No newline at end of file
index b26ab5f..df07cb5 100644 (file)
@@ -157,4 +157,15 @@ msgstr ""
 #. 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 ""
+
index 3b1cff0..edeeb98 100644 (file)
@@ -161,4 +161,11 @@ msgstr "Neveljaven XML za arhitekturo pogleda."
 
 #. 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 ""
+
index f414cc4..051cb73 100644 (file)
@@ -165,4 +165,7 @@ msgid "Delay Hours"
 msgstr ""
 
 #. module: report_task
-#: 
\ No newline at end of file
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
+
index 859a526..542aa51 100644 (file)
@@ -165,4 +165,7 @@ msgid "Delay Hours"
 msgstr ""
 
 #. module: report_task
-#: 
\ No newline at end of file
+#: field:report.closed.task,project_id:0
+msgid "Project"
+msgstr ""
+
index b031045..ba807c4 100644 (file)
@@ -165,4 +165,7 @@ msgid "Delay Hours"
 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 ""
+
index a7454f4..1530dae 100644 (file)
@@ -157,4 +157,15 @@ 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 ""
+
index 4045dfd..679c0c1 100644 (file)
@@ -169,4 +169,3 @@ msgstr ""
 msgid "Project"
 msgstr ""
 
-#. module
\ No newline at end of file
index 445fe8a..d95473e 100644 (file)
@@ -169,4 +169,3 @@ msgstr ""
 msgid "Project"
 msgstr ""
 
-#. module: repo
\ No newline at end of file
index e9fb423..a734342 100644 (file)
@@ -57,7 +57,6 @@
         'sale_wizard.xml',
         'stock_view.xml',
         'process/sale_process.xml',
-        'product_view.xml'
     ],
     'demo_xml': ['sale_demo.xml'],
     'installable': True,
index 99e5e98..6a0267b 100644 (file)
@@ -4,16 +4,16 @@
 #
 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
@@ -42,33 +42,24 @@ msgid "Allotment Partner"
 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
@@ -79,7 +70,7 @@ msgstr "Quantité"
 #. 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
@@ -91,7 +82,7 @@ msgstr "Déclaration automatique"
 #: 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
@@ -116,13 +107,14 @@ msgid "Delivery, from the warehouse to the customer."
 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
@@ -132,12 +124,12 @@ msgstr "Valider"
 #. 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
@@ -145,15 +137,14 @@ msgid ""
 "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
@@ -166,6 +157,11 @@ msgid "Manual Designation"
 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
@@ -197,12 +193,17 @@ msgstr "Total Net :"
 #. 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
@@ -222,7 +223,7 @@ msgstr "Adresse de facturation"
 #. 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
@@ -237,14 +238,13 @@ msgstr "Tout d'un coup"
 #. 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
@@ -254,7 +254,7 @@ msgstr "TVA :"
 #. 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
@@ -278,11 +278,6 @@ msgid "My sales order in progress"
 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 "
@@ -290,11 +285,11 @@ msgid ""
 "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
@@ -303,8 +298,8 @@ msgid ""
 "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
@@ -314,7 +309,7 @@ msgstr "Confirmée"
 #. 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
@@ -328,29 +323,11 @@ msgid "Confirm"
 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"
@@ -358,18 +335,12 @@ 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
@@ -410,9 +381,8 @@ msgid ""
 "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
@@ -431,8 +401,8 @@ msgid ""
 "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
@@ -477,7 +447,7 @@ msgstr "Quantités commandées"
 #. 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
@@ -501,11 +471,20 @@ msgid "Invalid action !"
 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
@@ -519,6 +498,11 @@ msgid "Configuration"
 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"
@@ -529,14 +513,10 @@ msgid "Invalid XML for View Architecture!"
 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
@@ -546,16 +526,6 @@ msgstr ""
 "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"
@@ -567,14 +537,20 @@ msgid "Procurement"
 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
@@ -595,20 +571,52 @@ msgid "All Quotations"
 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
@@ -634,7 +642,7 @@ msgstr "Commande client"
 #. 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
@@ -644,7 +652,7 @@ msgstr "Gerer le suivi des livraisons et des factures"
 #. 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
@@ -668,11 +676,6 @@ msgid "Order Ref"
 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"
@@ -683,8 +686,8 @@ msgid ""
 "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
@@ -700,7 +703,7 @@ msgstr "Facturer"
 #. 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
@@ -714,42 +717,18 @@ msgid "Uninvoiced Lines"
 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
@@ -785,11 +764,6 @@ msgid "Sales in Exception"
 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"
@@ -805,20 +779,20 @@ msgid "Procurement Corrected"
 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
@@ -844,7 +818,7 @@ msgstr "Ventes de produit"
 #: 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
@@ -862,10 +836,18 @@ msgid "One procurement for each product."
 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
@@ -902,7 +884,7 @@ msgstr "Proposition"
 #. 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
@@ -910,9 +892,8 @@ msgid ""
 "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
@@ -920,16 +901,16 @@ msgid "Compute"
 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
@@ -954,6 +935,13 @@ msgid "History"
 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"
@@ -993,7 +981,7 @@ msgstr "Qté"
 #. 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
@@ -1037,20 +1025,9 @@ msgid "Cancel"
 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
@@ -1059,9 +1036,9 @@ msgid "UoM"
 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
@@ -1069,21 +1046,14 @@ msgid ""
 "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
@@ -1148,7 +1118,7 @@ msgstr "Commandes"
 #. 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
@@ -1169,7 +1139,7 @@ msgstr "Produit"
 #. 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
@@ -1183,7 +1153,6 @@ msgid "Description"
 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"
@@ -1199,6 +1168,11 @@ msgid "Deliver"
 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"
@@ -1211,7 +1185,7 @@ msgstr "Tél. :"
 #. module: sale
 #: rml:sale.order:0
 msgid "Quotation N°"
-msgstr "N° de devis"
+msgstr "Devis N°"
 
 #. module: sale
 #: code:addons/sale/sale.py:0
@@ -1230,15 +1204,15 @@ msgid "Cancel Assignation"
 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
@@ -1253,6 +1227,13 @@ msgid "Customer"
 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"
@@ -1261,8 +1242,7 @@ 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
@@ -1281,9 +1261,11 @@ msgid "New Quotation"
 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
@@ -1292,16 +1274,6 @@ msgid "Date Ordered"
 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"
@@ -1314,10 +1286,10 @@ msgid ""
 "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
@@ -1332,7 +1304,7 @@ msgstr "Commande"
 #. module: sale
 #: rml:sale.order:0
 msgid "Payment Terms"
-msgstr "Conditions de Paiement"
+msgstr "Conditions de règlement"
 
 #. module: sale
 #: view:sale.order:0
@@ -1347,22 +1319,17 @@ msgstr "Délai de livraison"
 #. 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
@@ -1398,11 +1365,6 @@ msgid "Picked"
 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"
@@ -1410,7 +1372,7 @@ 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
index 9ca88d7..6642e9f 100644 (file)
@@ -41,8 +41,10 @@ class product_product(osv.osv):
             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
diff --git a/addons/sale/product_view.xml b/addons/sale/product_view.xml
deleted file mode 100644 (file)
index f7bfdcd..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<openerp>
-    <data>
-
-
-    </data>
-</openerp>
index 25e286f..fac75e4 100644 (file)
     <para style="terp_default_8">
       <font color="white"> </font>
     </para>
-    <para style="terp_header">[[ o.state&lt;&gt;'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&lt;&gt;'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>
index 1521896..e36d1f1 100644 (file)
@@ -193,7 +193,7 @@ class sale_order(osv.osv):
             ('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)]}),
 
@@ -359,7 +359,7 @@ class sale_order(osv.osv):
         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)
@@ -893,10 +893,10 @@ class sale_order_line(osv.osv):
                 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
@@ -998,15 +998,6 @@ class sale_order_line(osv.osv):
 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 = {
index a3d44af..737ceb1 100644 (file)
@@ -27,7 +27,7 @@
     '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.
index ae5fcd6..d858ad5 100644 (file)
@@ -6,14 +6,15 @@ 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: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
@@ -21,9 +22,9 @@ msgid "Crm opportunity quotation"
 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
@@ -38,7 +39,7 @@ msgstr "Créer"
 #. 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
@@ -48,7 +49,7 @@ msgstr "XML non valide pour l'architecture de la vue"
 #. 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
@@ -61,18 +62,6 @@ msgid "Convert opportunity to quotation"
 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"
@@ -98,11 +87,6 @@ msgid "CRM Opportunity"
 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"
@@ -131,7 +115,13 @@ msgstr "Convertir 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
@@ -149,11 +139,6 @@ msgid "Reflect the contract made with customer"
 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"
@@ -177,7 +162,7 @@ msgstr "Magasin"
 #. 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
@@ -214,5 +199,9 @@ msgstr "Annuler"
 #. 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"
index 62620e2..ac42422 100644 (file)
@@ -109,7 +109,7 @@ msgstr "Liste des Colisages"
 #: 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
@@ -202,7 +202,7 @@ msgstr "État"
 #. 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
@@ -235,7 +235,7 @@ msgstr "STOCK_QUIT"
 #: 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
@@ -260,13 +260,13 @@ msgstr "terp-hr"
 #. 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
@@ -527,7 +527,7 @@ msgstr "Cette localisation de stock sera utilisée au lieu de celle par défaut,
 #. 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
@@ -588,7 +588,7 @@ msgstr "STOCK_DIALOG_ERROR"
 #. 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
@@ -632,7 +632,7 @@ msgstr "Emplacement Production"
 #. module: stock
 #: field:stock.move,tracking_id:0
 msgid "Tracking Lot"
-msgstr ""
+msgstr "Lot de Traçage"
 
 #. module: stock
 #: selection:stock.location,icon:0
@@ -697,7 +697,7 @@ msgstr "Emplacements partenaire"
 #. 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
@@ -785,7 +785,7 @@ msgstr "En attente"
 #: 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
@@ -811,7 +811,7 @@ msgstr "Fournisseurs IT Générique"
 #. 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
@@ -838,7 +838,7 @@ msgstr "STOCK_CONNECT"
 #: 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
@@ -860,7 +860,7 @@ msgstr "STOCK_OK"
 #: 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
@@ -972,13 +972,13 @@ msgstr "STOCK_GO_BACK"
 #. 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
@@ -1025,7 +1025,7 @@ msgstr "STOCK_APPLY"
 #: 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
@@ -1135,7 +1135,7 @@ msgstr "Information"
 #: 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
@@ -1177,7 +1177,7 @@ msgstr "Adresses du propriétaire"
 #. module: stock
 #: field:stock.location,parent_right:0
 msgid "Right Parent"
-msgstr ""
+msgstr "Parent Droit"
 
 #. module: stock
 #: field:stock.picking,origin:0
@@ -1238,7 +1238,7 @@ msgstr "Liste des Colisages Entrants"
 #: 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
@@ -1270,7 +1270,7 @@ msgstr "Compte de Stock Sortant"
 #. 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
@@ -1287,13 +1287,13 @@ msgstr "STOCK_CDROM"
 #: 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
@@ -1313,7 +1313,7 @@ msgstr "Casse"
 #. module: stock
 #: field:stock.production.lot,ref:0
 msgid "Internal Ref"
-msgstr ""
+msgstr "Réf. Interne"
 
 #. module: stock
 #: selection:stock.location,icon:0
@@ -1488,13 +1488,13 @@ msgstr "Annuler inventaire"
 #. 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
@@ -1510,6 +1510,17 @@ msgid "OpenERP Stock Management module can manage multi-warehouses, multi and st
 "* 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
@@ -1556,7 +1567,7 @@ msgstr "STOCK_DELETE"
 #. module: stock
 #: model:account.journal,name:stock.stock_journal
 msgid "Stock Journal"
-msgstr ""
+msgstr "Journal de Stock"
 
 #. module: stock
 #: selection:stock.location,icon:0
@@ -1597,7 +1608,7 @@ msgstr "terp-mrp"
 #: 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
@@ -1655,7 +1666,7 @@ msgstr "Créer les factures"
 #. 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
@@ -1676,7 +1687,7 @@ msgstr "Quantité (UP)"
 #: 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
@@ -1764,7 +1775,7 @@ msgstr "Vers"
 #. 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
@@ -2017,7 +2028,7 @@ msgstr "STOCK_FIND"
 #: code:addons/stock/wizard/wizard_inventory.py:0
 #, python-format
 msgid "Message !"
-msgstr ""
+msgstr "Message !"
 
 #. module: stock
 #: view:stock.inventory:0
@@ -2029,6 +2040,10 @@ msgstr "Inventaire du Lot"
 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
@@ -2086,7 +2101,7 @@ msgstr "Réception de marchandise"
 #. module: stock
 #: view:stock.location:0
 msgid "Stock Location"
-msgstr ""
+msgstr "Emplacement de Stock"
 
 #. module: stock
 #: selection:stock.location,icon:0
@@ -2098,7 +2113,7 @@ msgstr "STOCK_MEDIA_PLAY"
 #: 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
@@ -2162,12 +2177,12 @@ msgstr "Ce compte sera utilisé, au lieu de celui par défaut, pour la valeur du
 #. 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
@@ -2194,7 +2209,7 @@ msgstr "Configuration"
 #: 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
@@ -2224,7 +2239,7 @@ msgstr "Mouvement automatique"
 #. 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
@@ -2244,7 +2259,7 @@ msgstr "STOCK_GOTO_LAST"
 #. module: stock
 #: selection:stock.picking,invoice_state:0
 msgid "Invoiced"
-msgstr "Facturer"
+msgstr "Facturé"
 
 #. module: stock
 #: selection:stock.location,icon:0
@@ -2284,7 +2299,7 @@ msgstr "STOCK_JUSTIFY_CENTER"
 #: 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
@@ -2335,7 +2350,7 @@ msgstr "Diviser les lignes"
 #. 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
@@ -2494,7 +2509,7 @@ msgstr "Client"
 #: 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
index 199cb38..2cdb9a2 100644 (file)
@@ -428,7 +428,7 @@ class stock_picking(osv.osv):
             ('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),
index d307a9d..abcab12 100644 (file)
@@ -1,7 +1,7 @@
 # -*- 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"?>
@@ -48,7 +44,7 @@ invoice_fields = {
     },
     'group': {
         'string': 'Group by partner',
-        'type':'boolean'
+        'type': 'boolean'
     },
     'type': {
         'string': 'Type',
@@ -63,17 +59,18 @@ invoice_fields = {
     },
 }
 
+
 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'
@@ -87,8 +84,9 @@ def _get_type(obj, cr, uid, data, context):
         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)
@@ -99,12 +97,12 @@ def _create_invoice(obj, cr, uid, data, context):
     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'
@@ -116,9 +114,9 @@ def _create_invoice(obj, cr, uid, data, context):
         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
 
 
index 7b8b52e..c69102d 100644 (file)
@@ -6,17 +6,17 @@ 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: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"
index af3058b..60f124e 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index 740b44f..18ca907 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index b463db9..6659ae2 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index 3519149..792329d 100644 (file)
@@ -4,7 +4,7 @@
 #
 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"
index b214f1f..f7f24c3 100644 (file)
@@ -7,13 +7,13 @@ msgstr ""
 "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
@@ -3424,7 +3424,6 @@ msgstr "Configuration de l'action client"
 #. 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"
@@ -4024,7 +4023,7 @@ msgstr "Etat d'Esprit Partenaire"
 #. module: base
 #: selection:ir.ui.view,type:0
 msgid "mdx"
-msgstr ""
+msgstr "mdx"
 
 #. module: base
 #: model:res.country,name:base.bi
@@ -6348,7 +6347,7 @@ msgstr "Voir la Réf."
 #. 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
index d67f980..d21297b 100644 (file)
@@ -60,6 +60,8 @@ class db(netsvc.Service):
         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()
@@ -169,10 +171,21 @@ class db(netsvc.Service):
             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'])
@@ -192,12 +205,17 @@ class db(netsvc.Service):
             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,))
@@ -238,6 +256,9 @@ class db(netsvc.Service):
             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):