bzr revid: fp@tinyerp.com-20090706185729-6bubt0hfijcnqxq9
This commit is contained in:
Fabien Pinckaers 2009-07-06 20:57:29 +02:00
commit d4a8a295bd
119 changed files with 5629 additions and 1392 deletions

View 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

View File

@ -921,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'))

View File

@ -404,13 +404,13 @@
<para style="terp_default_2">
<font color="white"> </font>
</para>
<blockTable colWidths="128.0,402.0" style="Table1">
<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">[[ o.fiscal_position and format(o.fiscal_position.note) or removeParentNode('blockTable') ]]</para>
<para style="terp_default_9">[[ format(o.fiscal_position and o.fiscal_position.note or removeParentNode('blockTable')) ]]</para>
</td>
</tr>
</blockTable>

View 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))

View 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

View 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"

View 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"

View 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"

View 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"

View 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"

View 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

View 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"

View 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"

View File

@ -1,545 +1,242 @@
# 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"
"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.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_reporting
#: field:color.rml,code:0
msgid "code"
msgstr "code"
#. 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."
#. 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
#: view:account.report.report:0
msgid "Operators:"
msgstr "Opérateurs"
#. module: account_reporting
#: selection:account.report.bs,font_style:0
msgid "Helvetica-Bold"
msgstr "Helvetica-Bold"
#. module: account_report
#: field:account.report.report,parent_id:0
msgid "Parent"
msgstr "Parent"
#. module: account_reporting
#: selection:account.report.bs,font_style:0
msgid "Helvetica"
msgstr "Helvetica"
#. module: account_report
#: field:account.report.report,disp_graph:0
msgid "Display As Graph"
#. module: account_reporting
#: field:account.report.bs,note:0
msgid "Note"
msgstr "Note"
#. 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
msgid "Account Debit:"
msgstr ""
#. module: account_reporting
#: selection:account.report.bs,font_style:0
msgid "Courier-Oblique"
msgstr "Courier-Oblique"
#. 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 ""
#. 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_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:"
msgstr ""
#. module: account_report
#: model:ir.actions.report.xml,name:account_report.fiscal_statements
msgid "Fiscal Statements"
msgstr "Extraits fiscaux"
#. module: account_report
#: wizard_button:print.indicators,init,next:0
msgid "Next"
msgstr "Suivant"
#. module: account_report
#: model:ir.module.module,shortdesc:account_report.module_meta_information
msgid "Reporting for accounting"
msgstr ""
#. 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:"
msgstr ""
#. 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_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_report
#: model:ir.model,name:account_report.model_account_report_report
msgid "Account reporting"
msgstr "Rapport de compte"
#. module: account_report
#: view:account.report.report:0
msgid "Account Balance:"
msgstr ""
#. 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
msgid "Code"
msgstr "Code"
#. module: account_report
#: field:account.report.history,tmp:0
msgid "temp"
msgstr ""
#. module: account_report
#: field:account.report.history,period_id:0
msgid "Period"
msgstr "Période"
#. module: account_report
#: view:account.report.report: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_report
#: wizard_button:print.indicators,init,end:0
#: wizard_button:print.indicators,next,end:0
#: wizard_button:print.indicators.pdf,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
#. module: account_reporting
#: field:account.report.bs,name:0
#: field:color.rml,name: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_reporting
#: view:account.report.bs:0
msgid "Account reporting"
msgstr "Rapport de compte"
#. 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_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_report
#: view:account.report.report:0
msgid "tax_code(['ACCOUNT_TAX_CODE',],period)"
msgstr ""
#. module: account_reporting
#: view:account.report.bs:0
msgid "Notes"
msgstr "Notes"
#. module: account_report
#: field:account.report.history,fiscalyear_id:0
msgid "Fiscal Year"
msgstr "Année Fiscale"
#. module: account_reporting
#: selection:account.report.bs,font_style:0
msgid "Times-BoldItalic"
msgstr "Times-BoldItalic"
#. 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_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_report
#: code:addons/account_report/wizard/wizard_print_indicators.py:0
#, python-format
msgid "User Error!"
msgstr ""
#. module: account_reporting
#: selection:account.report.bs,font_style:0
msgid "Courier-Bold"
msgstr "Courier-Bold"
#. module: account_report
#: rml:print.indicators:0
msgid "Page"
msgstr "Page"
#. module: account_reporting
#: selection:account.report.bs,font_style:0
msgid "Times-Italic"
msgstr "Times-Italic"
#. module: account_report
#: selection:account.report.report,type:0
msgid "View"
msgstr "Vue"
#. module: account_reporting
#: selection:account.report.bs,report_type:0
msgid "Report Objects Only"
msgstr "Rapport sur les objets seulement"
#. module: account_report
#: rml:print.indicators:0
msgid "Indicators -"
msgstr "Indicateurs -"
#. module: account_reporting
#: model:ir.model,name:account_reporting.model_color_rml
msgid "Rml Colors"
msgstr "Couleurs RML"
#. 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_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_report
#: view:account.report.report:0
msgid "Return value for status"
msgstr "Valeur de retour pour status"
#. module: account_reporting
#: field:account.report.bs,code:0
msgid "Code"
msgstr "Code"
#. module: account_report
#: field:account.report.report,sequence:0
#. module: account_reporting
#: field:account.report.bs,parent_id:0
msgid "Parent"
msgstr "Parent"
#. module: account_reporting
#: field:account.report.bs,sequence:0
msgid "Sequence"
msgstr "Séquence"
#. module: account_report
#: rml:accounting.report:0
msgid "Amount"
msgstr "Montant"
#. module: account_reporting
#: selection:account.report.bs,font_style:0
msgid "Times-Bold"
msgstr "Times-Bold"
#. module: account_report
#: rml:print.indicators:0
msgid "1cm 27.7cm 20cm 27.7cm"
msgstr "1cm 27.7cm 20cm 27.7cm"
#. module: account_reporting
#: view:account.report.bs:0
msgid "General"
msgstr "Général"
#. 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_reporting
#: wizard_field:account.account.balancesheet.report,init,fiscalyear:0
msgid "Fiscal year"
msgstr "Année fiscale"
#. module: account_report
#: selection:account.report.report,type:0
msgid "Fiscal Statement"
msgstr ""
#. 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_reporting
#: wizard_button:account.account.balancesheet.report,init,end:0
msgid "Cancel"
msgstr "Annuler"
#. 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"

View 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"

View 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>

View 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"

View 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
@ -46,12 +46,6 @@ msgstr "BIC"
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"
@ -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"

View File

@ -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.

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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>

View File

@ -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>

Binary file not shown.

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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

View File

@ -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
1 id name model_id:id perm_read perm_write perm_create perm_unlink
2 access_module_quality_check module.quality.check model_module_quality_check 1 1 1 1
3 access_module_quality_detail module.quality.detail model_module_quality_detail 1 1 1 1

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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:

View 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"

View 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"

View 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"

View 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
@ -21,11 +21,6 @@ msgstr ""
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!"
@ -52,11 +47,6 @@ msgstr "Nouveaux Membres"
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"
@ -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"

View 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
@ -30,11 +31,6 @@ msgstr "Ordre de fabrication suivant"
msgid "Invalid XML for View Architecture!"
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"
@ -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
@ -56,11 +52,6 @@ msgstr ""
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"
@ -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"

View 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
@ -51,11 +47,6 @@ msgstr "XML non valide pour l'architecture de la vue"
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"
@ -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"

View 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"

View 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

View 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()

View 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"

View 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"

View 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

View 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"

View 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

View 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"

View 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"

View 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

View 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

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_pos_config_journal pos.config.journal model_pos_config_journal point_of_sale.group_pos_user 1 0 0 0
3 access_pos_config_journal_manager pos.config.journal model_pos_config_journal point_of_sale.group_pos_manager 1 1 1 1
4 access_pos_order pos.order model_pos_order point_of_sale.group_pos_user 1 1 1 1
5 access_pos_order_line pos.order.line model_pos_order_line point_of_sale.group_pos_user 1 1 1 1
6 access_pos_payment pos.payment model_pos_payment point_of_sale.group_pos_user 1 1 1 1

View 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>

View 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,17 +1674,24 @@ 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
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"
@ -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

View File

@ -404,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 '') + \

View 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"

View 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
@ -177,13 +187,6 @@ msgstr "Très urgent"
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
@ -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
@ -498,11 +507,6 @@ msgstr "Mes projets"
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
@ -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
@ -634,12 +634,6 @@ msgstr "Mes tâches"
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"
@ -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,18 +823,15 @@ 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
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"
@ -844,19 +844,18 @@ 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
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."
@ -893,11 +892,6 @@ msgstr "Résumé de la tâche"
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
@ -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
@ -1032,11 +1032,6 @@ msgstr "Travail effectué"
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"
@ -1049,20 +1044,18 @@ 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
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."
@ -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"

View File

@ -140,8 +140,8 @@
<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"/>

View 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"

Some files were not shown because too many files have changed in this diff Show More