apa-tiny
2010-11-18 10:20:57 +05:30
44 changed files with 22111 additions and 13101 deletions
+15 -1
View File
@@ -915,7 +915,7 @@
</record>
<record id="uk" model="res.country">
<field name="name">United Kingdom</field>
<field name="code">uk</field>
<field name="code">gb</field>
</record>
<record id="um" model="res.country">
<field name="name">USA Minor Outlying Islands</field>
@@ -1378,5 +1378,19 @@
<field name="name">Reserve</field>
<field name="code">RSV</field>
</record>
<record id="CRC" model="res.currency">
<field name="name">CRC</field>
<field name="code">CRC</field>
<field name="rounding">0.01</field>
<field name="accuracy">4</field>
<field name="symbol">¢</field>
</record>
<record id="rateCRC" model="res.currency.rate">
<field name="rate">691.3153</field>
<field name="currency_id" ref="CRC"/>
<field eval="time.strftime('%Y-01-01')" name="name"/>
</record>
</data>
</openerp>
+3695 -1956
View File
File diff suppressed because it is too large Load Diff
+3139 -2076
View File
File diff suppressed because it is too large Load Diff
+36 -33
View File
@@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2010-10-18 17:46+0000\n"
"PO-Revision-Date: 2010-10-20 07:13+0000\n"
"Last-Translator: Quentin THEURET <quentin@theuret.net>\n"
"PO-Revision-Date: 2010-11-17 07:14+0000\n"
"Last-Translator: OpenERP Administrators <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: 2010-10-21 05:01+0000\n"
"X-Launchpad-Export-Date: 2010-11-18 04:45+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: base
@@ -38,12 +38,12 @@ msgstr "Autre configuration"
#. module: base
#: view:res.lang:0
msgid "%j - Day of the year as a decimal number [001,366]."
msgstr "%j - Jour de l'année comme un nombre décimal [001,366]."
msgstr "%j - Numéro du Jour dans l'année [001,366]."
#. module: base
#: selection:ir.property,type:0
msgid "DateTime"
msgstr ""
msgstr "Horodatage"
#. module: base
#: view:ir.values:0
@@ -106,7 +106,7 @@ msgstr "Vues créées"
#. module: base
#: selection:ir.ui.menu,icon:0
msgid "terp-emblem-important"
msgstr ""
msgstr "terp-emblem-important"
#. module: base
#: field:res.partner,ref:0
@@ -148,7 +148,7 @@ msgstr "STOCK_CANCEL"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_woodsuppliers0
msgid "Wood Suppliers"
msgstr ""
msgstr "Fournisseurs de bois"
#. module: base
#: field:ir.sequence,number_increment:0
@@ -198,7 +198,7 @@ msgstr "Nombre de modules"
#. module: base
#: help:multi_company.default,company_dest_id:0
msgid "Company to store the current record"
msgstr "Société physique ou sera stocké cet enregistrement"
msgstr "Société pour laquelle est fait cet enregistrement"
#. module: base
#: field:res.partner.bank.type.field,size:0
@@ -238,7 +238,7 @@ msgstr "Nom de l'assistant"
#. module: base
#: view:res.lang:0
msgid "%y - Year without century as a decimal number [00,99]."
msgstr "%y - Année dans le siècle comme un nombre décimal [00,99]."
msgstr "%y - Année dans le siècle [00,99]."
#. module: base
#: selection:maintenance.contract.wizard,state:0
@@ -360,7 +360,7 @@ msgstr "Serbe / Serbie"
#. module: base
#: help:res.lang,iso_code:0
msgid "This ISO code is the name of po files to use for translations"
msgstr "Ce code ISO est le nom des fichiers po utiliser pour les traductions"
msgstr "Ce code ISO est le nom des fichiers po utilisés pour les traductions"
#. module: base
#: selection:ir.ui.menu,icon:0
@@ -399,7 +399,7 @@ msgid ""
"The ISO country code in two chars.\n"
"You can use this field for quick search."
msgstr ""
"Le code ISO du pays en deux caractères.\n"
"Le code ISO du pays, sur deux caractères.\n"
"Vous pouvez utiliser ce champ pour effectuer une recherche rapide."
#. module: base
@@ -445,7 +445,7 @@ msgstr "Assistants"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_miscellaneoussuppliers0
msgid "Miscellaneous Suppliers"
msgstr ""
msgstr "Fournisseurs divers"
#. module: base
#: code:addons/base/ir/ir_model.py:0
@@ -462,7 +462,7 @@ msgstr ""
#. module: base
#: selection:ir.ui.menu,icon:0
msgid "terp-gtk-jump-to-ltr"
msgstr ""
msgstr "terp-gtk-jump-to-ltr"
#. module: base
#: view:base.language.export:0
@@ -513,7 +513,7 @@ msgstr "Bulgare / български"
#. module: base
#: model:ir.ui.menu,name:base.menu_base_action_rule
msgid "Automated Actions"
msgstr ""
msgstr "Actions automatisées"
#. module: base
#: model:ir.model,name:base.model_ir_actions_actions
@@ -579,17 +579,17 @@ msgstr "Séquences"
#. module: base
#: model:ir.model,name:base.model_base_language_import
msgid "Language Import"
msgstr ""
msgstr "Importation de langue"
#. module: base
#: model:ir.model,name:base.model_res_config_users
msgid "res.config.users"
msgstr ""
msgstr "res.config.users"
#. module: base
#: model:ir.model,name:base.model_base_language_export
msgid "base.language.export"
msgstr ""
msgstr "base.language.export"
#. module: base
#: selection:ir.ui.menu,icon:0
@@ -609,7 +609,7 @@ msgstr ""
#. module: base
#: selection:ir.ui.menu,icon:0
msgid "terp-folder-yellow"
msgstr ""
msgstr "terp-folder-yellow"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_4
@@ -629,7 +629,7 @@ msgstr "Mes partenaires"
#. module: base
#: view:ir.actions.report.xml:0
msgid "XML Report"
msgstr ""
msgstr "Rapport XML"
#. module: base
#: model:res.country,name:base.es
@@ -651,7 +651,7 @@ msgstr ""
#: model:ir.actions.act_window,name:base.action_view_base_module_upgrade
#: model:ir.model,name:base.model_base_module_upgrade
msgid "Module Upgrade"
msgstr ""
msgstr "Mise à jour de module"
#. module: base
#: view:res.config.users:0
@@ -685,6 +685,9 @@ msgid ""
"\n"
"This addon is already installed on your system"
msgstr ""
"\n"
"\n"
"Ce module est déjà installé sur votre système"
#. module: base
#: model:res.country,name:base.nu
@@ -729,7 +732,7 @@ msgstr "Modules du contrat de maintenance"
#: model:ir.actions.act_window,name:base.res_request_link-act
#: model:ir.ui.menu,name:base.menu_res_request_link_act
msgid "Request Reference Types"
msgstr ""
msgstr "Types de référence des requêtes"
#. module: base
#: view:ir.values:0
@@ -791,7 +794,7 @@ msgstr "STOCK_EDIT"
#. module: base
#: model:ir.ui.menu,name:base.menu_hr_project
msgid "Human Resources Dashboard"
msgstr ""
msgstr "Tableau de bord ressources humaines"
#. module: base
#: selection:ir.ui.menu,icon:0
@@ -822,7 +825,7 @@ msgstr "Îles Caïmans"
#. module: base
#: field:ir.module.module,contributors:0
msgid "Contributors"
msgstr ""
msgstr "Contributeurs"
#. module: base
#: selection:ir.property,type:0
@@ -852,7 +855,7 @@ msgstr "Niger"
#. module: base
#: selection:base.language.install,lang:0
msgid "Chinese (HK)"
msgstr ""
msgstr "Chinois (Hong Kong)"
#. module: base
#: model:res.country,name:base.ba
@@ -934,17 +937,17 @@ msgstr "Pour exporter une langue, ne sélectionnez aucune langue."
#. module: base
#: view:res.request:0
msgid "Request Date"
msgstr ""
msgstr "Date de la requête"
#. module: base
#: model:ir.ui.menu,name:base.menu_hr_dasboard
msgid "Dashboard"
msgstr ""
msgstr "Tableau de bord"
#. module: base
#: model:ir.ui.menu,name:base.menu_purchase_root
msgid "Purchases"
msgstr ""
msgstr "Achats"
#. module: base
#: model:res.country,name:base.md
@@ -1330,7 +1333,7 @@ msgstr "Malawi"
#: code:addons/base/res/res_user.py:0
#, python-format
msgid "%s (copy)"
msgstr ""
msgstr "%s (copie)"
#. module: base
#: field:res.partner.address,type:0
@@ -1419,7 +1422,7 @@ msgstr ""
#. module: base
#: view:base.language.export:0
msgid "https://help.launchpad.net/Translations"
msgstr ""
msgstr "https://help.launchpad.net/Translations"
#. module: base
#: field:ir.actions.act_window,view_mode:0
@@ -1522,7 +1525,7 @@ msgstr ""
#. module: base
#: selection:ir.ui.menu,icon:0
msgid "terp-stock_align_left_24"
msgstr ""
msgstr "terp-stock_align_left_24"
#. module: base
#: field:ir.actions.act_window,groups_id:0
@@ -1679,7 +1682,7 @@ msgstr "Vue originale"
#. module: base
#: selection:ir.ui.menu,icon:0
msgid "terp-camera_test"
msgstr ""
msgstr "terp-camera_test"
#. module: base
#: code:addons/base/res/res_user.py:0
@@ -1840,12 +1843,12 @@ msgstr "Slovénie"
#. module: base
#: selection:ir.ui.menu,icon:0
msgid "terp-stock_format-default"
msgstr ""
msgstr "terp-stock_format-default"
#. module: base
#: view:res.lang:0
msgid "%p - Equivalent of either AM or PM."
msgstr "%p - Soit AM soit à PM."
msgstr "%p - AM ou PM"
#. module: base
#: view:ir.actions.server:0
+3862 -2892
View File
File diff suppressed because it is too large Load Diff
+58 -42
View File
@@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2010-10-18 17:46+0000\n"
"PO-Revision-Date: 2010-11-02 19:15+0000\n"
"Last-Translator: Giammario Pisano <Unknown>\n"
"PO-Revision-Date: 2010-11-11 14:09+0000\n"
"Last-Translator: Leonardo Pistone <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: 2010-11-03 04:59+0000\n"
"X-Launchpad-Export-Date: 2010-11-12 04:45+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: base
@@ -1062,7 +1062,7 @@ msgstr "Percorso del report file principale"
#: field:ir.module.module,reports_by_module:0
#: model:ir.ui.menu,name:base.menu_ir_action_report_xml
msgid "Reports"
msgstr "Resoconti"
msgstr "Reports"
#. module: base
#: field:workflow,on_create:0
@@ -1676,7 +1676,7 @@ msgstr "STOCK_NO"
#: selection:res.config.view,view:0
#: selection:res.users,view:0
msgid "Simplified"
msgstr "Semplificato"
msgstr "Semplificata"
#. module: base
#: model:res.country,name:base.st
@@ -2126,7 +2126,7 @@ msgstr "STOCK_JUSTIFY_CENTER"
#: selection:res.config.view,view:0
#: selection:res.users,view:0
msgid "Extended"
msgstr "Esteso"
msgstr "Estesa"
#. module: base
#: field:res.company,rml_footer1:0
@@ -2415,6 +2415,9 @@ msgid ""
"loading a new language it becomes available as default interface language "
"for users and partners."
msgstr ""
"Questa procedura guidata ti aiuterà ad aggiungere una nuova traduzione al "
"tuo sistema OpenERP. Dopo aver caricato una nuova traduzione questa sarà "
"disponibile come lingua di base per gli utenti ed i collaboratori."
#. module: base
#: view:ir.model:0
@@ -2464,18 +2467,18 @@ msgstr "Registra Regole"
#. module: base
#: view:ir.property:0
msgid "Field Information"
msgstr ""
msgstr "Informazioni sul campo"
#. module: base
#: view:ir.actions.todo:0
msgid "Search Actions"
msgstr ""
msgstr "Azioni di ricerca"
#. module: base
#: model:ir.actions.act_window,name:base.action_view_partner_wizard_ean_check
#: view:partner.wizard.ean.check:0
msgid "Ean check"
msgstr ""
msgstr "Verifica EAN"
#. module: base
#: field:res.partner,vat:0
@@ -2609,7 +2612,7 @@ msgstr "Invia SMS"
#. module: base
#: selection:base.language.install,lang:0
msgid "Hindi / India"
msgstr ""
msgstr "Indi / India"
#. module: base
#: field:res.partner,ean13:0
@@ -2640,12 +2643,12 @@ msgstr "6. %d, %m ==> 05, 12"
#: field:res.config.users,date:0
#: field:res.users,date:0
msgid "Last Connection"
msgstr ""
msgstr "Ultima connessione"
#. module: base
#: field:ir.actions.act_window,help:0
msgid "Action description"
msgstr ""
msgstr "Descrizione dell'azione"
#. module: base
#: help:res.partner,customer:0
@@ -2719,7 +2722,7 @@ msgstr "Campo Base"
#. module: base
#: field:ir.actions.todo,restart:0
msgid "Restart"
msgstr ""
msgstr "Ricomincia"
#. module: base
#: field:ir.actions.report.xml,report_sxw_content:0
@@ -2759,7 +2762,7 @@ msgstr "Obbligatorio"
#. module: base
#: view:res.users:0
msgid "Default Filters"
msgstr ""
msgstr "FIltri di base"
#. module: base
#: field:res.request.history,name:0
@@ -2774,7 +2777,7 @@ msgstr ""
#. module: base
#: field:multi_company.default,expression:0
msgid "Expression"
msgstr ""
msgstr "Espressione"
#. module: base
#: help:ir.actions.server,subject:0
@@ -2796,6 +2799,8 @@ msgid ""
"Optional help text for the users with a description of the target view, such "
"as its usage and purpose."
msgstr ""
"Testo di aiuto opzionale per gli utenti con una descrizione della "
"visualizzazione, come il suo utilizzo e lo scopo."
#. module: base
#: model:res.country,name:base.va
@@ -2825,7 +2830,7 @@ msgstr "Oggetto di innesco"
#. module: base
#: view:res.users:0
msgid "Current Activity"
msgstr ""
msgstr "Attività corrente"
#. module: base
#: view:workflow.activity:0
@@ -2841,7 +2846,7 @@ msgstr "Suriname"
#. module: base
#: model:ir.ui.menu,name:base.marketing_menu
msgid "Marketing"
msgstr ""
msgstr "Marketing"
#. module: base
#: view:res.partner.bank:0
@@ -2877,7 +2882,7 @@ msgstr "STOCK_SAVE_AS"
#. module: base
#: selection:ir.actions.todo,restart:0
msgid "Always"
msgstr ""
msgstr "Sempre"
#. module: base
#: selection:ir.translation,type:0
@@ -2895,6 +2900,8 @@ msgid ""
"The selected language has been successfully installed. You must change the "
"preferences of the user and open a new menu to view the changes."
msgstr ""
"La traduzione selezionata e stata caricata con successo. Devi cambiare le "
"preferenze dell'utente ed aprire un nuovo menu per vedere le modifiche."
#. module: base
#: field:ir.actions.act_window.view,view_id:0
@@ -3044,7 +3051,7 @@ msgstr "Workflow"
#. module: base
#: model:ir.actions.act_window,name:base.action_config_user_form
msgid "Create Users"
msgstr ""
msgstr "Crea utenti"
#. module: base
#: view:ir.values:0
@@ -3054,7 +3061,7 @@ msgstr "tree_but_action, client_print_multi"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_retailers0
msgid "Retailers"
msgstr ""
msgstr "Distributore"
#. module: base
#: help:ir.cron,priority:0
@@ -3090,22 +3097,22 @@ msgstr "Kenia"
#. module: base
#: view:res.partner.event:0
msgid "Event"
msgstr ""
msgstr "Evento"
#. module: base
#: model:ir.ui.menu,name:base.menu_custom_reports
msgid "Custom Reports"
msgstr ""
msgstr "Rapporto personalizzato"
#. module: base
#: view:base.module.configuration:0
msgid "System Configuration Done"
msgstr ""
msgstr "La cofigurazione è stata effettuata"
#. module: base
#: view:ir.property:0
msgid "Generic"
msgstr ""
msgstr "Generico"
#. module: base
#: model:res.country,name:base.sm
@@ -3135,7 +3142,7 @@ msgstr "Benin"
#. module: base
#: help:ir.sequence,suffix:0
msgid "Suffix value of the record for the sequence"
msgstr ""
msgstr "Valore del suffisso per la sequenza dei dati"
#. module: base
#: selection:ir.ui.menu,icon:0
@@ -3200,7 +3207,7 @@ msgstr "Mauritius"
#: view:ir.model.access:0
#: view:ir.rule:0
msgid "Full Access"
msgstr ""
msgstr "Accesso completo"
#. module: base
#: view:ir.actions.act_window:0
@@ -3214,7 +3221,7 @@ msgstr "Sicurezza"
#. module: base
#: model:res.widget,title:base.openerp_twitter_favorites
msgid "OpenERP Favorites"
msgstr ""
msgstr "Favoriti OpenERP"
#. module: base
#: model:res.country,name:base.za
@@ -3267,7 +3274,7 @@ msgstr "Numero Successivo"
#. module: base
#: help:workflow.transition,condition:0
msgid "Expression to be satisfied if we want the transition done."
msgstr ""
msgstr "Espressione da soddisfare se vogliamo effettuare la transazione."
#. module: base
#: selection:ir.ui.menu,icon:0
@@ -3309,7 +3316,7 @@ msgstr ""
#. module: base
#: view:base.module.upgrade:0
msgid "System update completed"
msgstr ""
msgstr "Aggiornamento del sistema completato"
#. module: base
#: field:ir.model.fields,selection:0
@@ -3350,7 +3357,7 @@ msgstr "Menu Superiore"
#. module: base
#: field:ir.rule,perm_unlink:0
msgid "Apply For Delete"
msgstr ""
msgstr "Applica per la cancellazione"
#. module: base
#: help:ir.actions.act_window.view,multi:0
@@ -3407,7 +3414,7 @@ msgstr "Swedish / svenska"
#. module: base
#: model:ir.ui.menu,name:base.menu_base_config_plugins
msgid "Plugins"
msgstr ""
msgstr "Aggiunte"
#. module: base
#: field:res.company,child_ids:0
@@ -3432,7 +3439,7 @@ msgstr "Descrizione Generale"
#. module: base
#: model:ir.actions.act_window,name:base.action_config_simple_view_form
msgid "Configure Your Interface"
msgstr ""
msgstr "Configura lka tua interfaccia"
#. module: base
#: field:ir.values,meta:0
@@ -3529,6 +3536,8 @@ msgid ""
"If set to true, the action will not be displayed on the right toolbar of a "
"form view"
msgstr ""
"Se impostato a vero l'azione non verrà mostarta nella barra degli strumenti "
"della maschera di visualizzazione"
#. module: base
#: model:res.country,name:base.ms
@@ -3547,6 +3556,8 @@ msgid ""
"The user's timezone, used to perform timezone conversions between the server "
"and the client."
msgstr ""
"Il fuso orario dell'utente, usato per effettuare la conversione tra il "
"server ed il client."
#. module: base
#: field:ir.module.module,demo:0
@@ -3569,6 +3580,8 @@ msgid ""
"Source activity. When this activity is over, the condition is tested to "
"determine if we can start the ACT_TO activity."
msgstr ""
"Attività sorgente. Quando l'attività è terminata la condizione viene "
"verificata per determinare se può essere avviata l'attività ACT_TO."
#. module: base
#: model:res.partner.category,name:base.res_partner_category_3
@@ -3578,7 +3591,7 @@ msgstr "Partner iniziale"
#. module: base
#: view:base.module.upgrade:0
msgid "Your system will be updated."
msgstr ""
msgstr "Il sistema verrà aggiornato."
#. module: base
#: model:ir.model,name:base.model_ir_actions_act_window_view
@@ -3638,17 +3651,17 @@ msgstr "Raggruppa per"
#: view:res.config:0
#: view:res.config.installer:0
msgid "title"
msgstr ""
msgstr "Titolo"
#. module: base
#: model:ir.model,name:base.model_base_language_install
msgid "Install Language"
msgstr ""
msgstr "Installa lingua"
#. module: base
#: view:ir.translation:0
msgid "Translation"
msgstr ""
msgstr "Traslazione"
#. module: base
#: selection:ir.ui.menu,icon:0
@@ -3683,7 +3696,7 @@ msgstr "Scrivere Id"
#. module: base
#: model:ir.ui.menu,name:base.menu_product
msgid "Products"
msgstr ""
msgstr "Prodotti"
#. module: base
#: selection:ir.ui.menu,icon:0
@@ -3790,11 +3803,14 @@ msgid ""
"form, signal tests the name of the pressed button. If signal is NULL, no "
"button is necessary to validate this transition."
msgstr ""
"Quando la transazione arriva dalla pressione di un tasto della maschera "
"client, il segnale verifica il nome del tasto premuto. Se il segnale e NULL, "
"nessun tasto è stato premuto per validare la trasazione."
#. module: base
#: help:multi_company.default,object_id:0
msgid "Object affected by this rule"
msgstr ""
msgstr "Oggetto soggetto a questa regola"
#. module: base
#: report:ir.module.reference.graph:0
@@ -3809,12 +3825,12 @@ msgstr "Nome Menu"
#. module: base
#: view:ir.module.module:0
msgid "Author Website"
msgstr ""
msgstr "Sito web dell'autore"
#. module: base
#: view:ir.attachment:0
msgid "Month"
msgstr ""
msgstr "Mese"
#. module: base
#: model:res.country,name:base.my
@@ -3825,7 +3841,7 @@ msgstr "Malesia"
#: view:base.language.install:0
#: model:ir.actions.act_window,name:base.action_view_base_language_install
msgid "Load Official Translation"
msgstr ""
msgstr "Carica traduzione ufficiale"
#. module: base
#: view:ir.actions.server:0
@@ -3900,7 +3916,7 @@ msgstr "Numero di moduli aggiunti"
#. module: base
#: view:res.currency:0
msgid "Price Accuracy"
msgstr ""
msgstr "Approssimazione del prezzo"
#. module: base
#: view:res.config:0
+3962 -1943
View File
File diff suppressed because it is too large Load Diff
+125 -91
View File
@@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: pt_BR\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2010-10-18 17:46+0000\n"
"PO-Revision-Date: 2010-10-29 07:11+0000\n"
"PO-Revision-Date: 2010-11-07 07:00+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: <pt@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-10-30 05:05+0000\n"
"X-Launchpad-Export-Date: 2010-11-08 05:11+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: base
@@ -354,7 +354,7 @@ msgstr "Bósnia"
#. module: base
#: selection:base.language.install,lang:0
msgid "Serbian / Serbia"
msgstr ""
msgstr "Sérvia"
#. module: base
#: help:res.lang,iso_code:0
@@ -1056,7 +1056,7 @@ msgstr ""
#. module: base
#: field:ir.actions.report.xml,report_rml:0
msgid "Main report file path"
msgstr ""
msgstr "Principal caminho para o relatório"
#. module: base
#: model:ir.actions.act_window,name:base.ir_action_report_xml
@@ -1198,7 +1198,7 @@ msgstr "wizard.ir.model.menu.create.line"
#. module: base
#: field:ir.attachment,res_id:0
msgid "Attached ID"
msgstr ""
msgstr "ID do anexo"
#. module: base
#: view:ir.sequence:0
@@ -1296,7 +1296,7 @@ msgstr "Modelo anexado"
#. module: base
#: view:ir.rule:0
msgid "Domain Setup"
msgstr ""
msgstr "Configurar domínio"
#. module: base
#: field:ir.actions.server,trigger_name:0
@@ -1360,7 +1360,7 @@ msgstr "Tipo de endereço"
#. module: base
#: view:ir.ui.menu:0
msgid "Full Path"
msgstr ""
msgstr "Endereço completo"
#. module: base
#: view:res.request:0
@@ -1451,13 +1451,15 @@ msgid ""
"When using CSV format, please also check that the first line of your file is "
"one of the following:"
msgstr ""
"Ao usar o formato CSV, verifique se a primeira linha do seu arquivo contem "
"um dos seguintes procedimentos:"
#. module: base
#: model:ir.actions.act_window,name:base.res_log_act_window
#: model:ir.ui.menu,name:base.menu_res_log_act_window
#: view:res.log:0
msgid "Logs"
msgstr ""
msgstr "Logs"
#. module: base
#: selection:base.language.install,lang:0
@@ -1470,6 +1472,9 @@ msgid ""
"This wizard will scan all module repositories on the server side to detect "
"newly added modules as well as any change to existing modules."
msgstr ""
"Este assistente irá verificar todos os repositórios de módulo no lado do "
"servidor para detecção de novos módulos, bem como qualquer alteração nos "
"módulos existentes."
#. module: base
#: field:res.company,logo:0
@@ -1528,7 +1533,7 @@ msgstr "Número de módulos atualizados"
#. module: base
#: view:workflow.activity:0
msgid "Workflow Activity"
msgstr ""
msgstr "Atividade de Workflow"
#. module: base
#: view:ir.rule:0
@@ -1584,11 +1589,13 @@ msgid ""
"Comma-separated list of allowed view modes, such as 'form', 'tree', "
"'calendar', etc. (Default: tree,form)"
msgstr ""
"Lista separada por virgula, permite modos de visão como 'form', 'tree', "
"'calendar', etc. (Default: tree,form)"
#. module: base
#: view:workflow:0
msgid "Workflow Editor"
msgstr ""
msgstr "Editor de Workflow"
#. module: base
#: selection:ir.module.module,state:0
@@ -1703,7 +1710,7 @@ msgstr ""
#: code:addons/base/res/res_user.py:0
#, python-format
msgid "Make sure you have no users linked with the group(s)!"
msgstr ""
msgstr "Certifique-se de que você não tem usuários ligados ao grupo (s)!"
#. module: base
#: field:ir.actions.url,target:0
@@ -1713,7 +1720,7 @@ msgstr "Ação alvo"
#. module: base
#: model:res.country,name:base.ai
msgid "Anguilla"
msgstr ""
msgstr "Anguilla"
#. module: base
#: field:ir.ui.view_sc,name:0
@@ -1742,7 +1749,7 @@ msgstr "Zimbábue"
#. module: base
#: view:base.module.update:0
msgid "Please be patient, as this operation may take a few seconds..."
msgstr ""
msgstr "Esta operação pode demorar alguns segundos ..."
#. module: base
#: help:ir.values,action_id:0
@@ -1795,7 +1802,7 @@ msgstr "Mapeando campos"
#. module: base
#: view:base.language.export:0
msgid "Export Translations"
msgstr ""
msgstr "Exportar traduções"
#. module: base
#: model:ir.ui.menu,name:base.menu_custom
@@ -1827,7 +1834,7 @@ msgstr "Lituânia"
#: model:ir.model,name:base.model_partner_clear_ids
#: view:partner.clear.ids:0
msgid "Clear IDs"
msgstr ""
msgstr "Limpar IDs"
#. module: base
#: help:ir.cron,model:0
@@ -1835,6 +1842,8 @@ msgid ""
"Name of object whose function will be called when this scheduler will run. "
"e.g. 'res.partener'"
msgstr ""
"Nome do objeto cuja função será chamada quando o agendador for executado. "
"por exemplo \"res.partner '"
#. module: base
#: code:addons/base/module/module.py:0
@@ -1843,6 +1852,8 @@ msgid ""
"You Can Not Load Translation For language Due To Invalid Language/Country "
"Code"
msgstr ""
"Você não pode carregar a tradução devido ao código do pais ou idioma estar "
"inválido"
#. module: base
#: selection:ir.ui.menu,icon:0
@@ -1872,7 +1883,7 @@ msgstr "Ações de repetição"
#. module: base
#: help:multi_company.default,company_id:0
msgid "Company where the user is connected"
msgstr ""
msgstr "Empresa onde o usuário está conectado"
#. module: base
#: field:maintenance.contract,date_stop:0
@@ -1966,7 +1977,7 @@ msgstr "Armênia"
#: model:ir.actions.act_window,name:base.ir_property_form
#: model:ir.ui.menu,name:base.menu_ir_property_form_all
msgid "Configuration Parameters"
msgstr ""
msgstr "Parâmetros de Configuração"
#. module: base
#: model:res.country,name:base.se
@@ -2025,7 +2036,7 @@ msgstr ""
#: field:res.config.users,config_logo:0
#: field:res.config.view,config_logo:0
msgid "Image"
msgstr ""
msgstr "Imagem"
#. module: base
#: view:ir.actions.server:0
@@ -2042,7 +2053,7 @@ msgstr "Austria"
#: selection:base.module.import,state:0
#: selection:base.module.update,state:0
msgid "done"
msgstr ""
msgstr "Concluído"
#. module: base
#: selection:ir.actions.act_window.view,view_mode:0
@@ -2143,6 +2154,8 @@ msgid ""
"Please double-check that the file encoding is set to UTF-8 (sometimes called "
"Unicode) when the translator exports it."
msgstr ""
"Por favor, verifique novamente se a codificação do arquivo é definido como "
"UTF-8 (às vezes chamado de Unicode), quando exportá-lo"
#. module: base
#: model:ir.model,name:base.model_workflow_activity
@@ -2197,7 +2210,7 @@ msgstr "Sr."
#. module: base
#: view:base.module.import:0
msgid "Select module package to import (.zip file):"
msgstr ""
msgstr "Selecione pacote do módulo para importar (arquivo zip.)"
#. module: base
#: field:ir.default,ref_id:0
@@ -2249,17 +2262,17 @@ msgstr "Instâncias"
#. module: base
#: help:res.partner,employee:0
msgid "Check this box if the partner is an Employee."
msgstr ""
msgstr "Marque esta caixa se o parceiro for um empregado."
#. module: base
#: field:ir.actions.report.xml,auto:0
msgid "Custom python parser"
msgstr ""
msgstr "Personalizar analisador python"
#. module: base
#: view:base.language.import:0
msgid "_Import"
msgstr ""
msgstr "_Importar"
#. module: base
#: view:res.partner.canal:0
@@ -2327,7 +2340,7 @@ msgstr "Direita-para-esquerda"
#: model:ir.model,name:base.model_ir_filters
#: model:ir.ui.menu,name:base.menu_ir_filters
msgid "Filters"
msgstr ""
msgstr "Filtros"
#. module: base
#: model:ir.actions.act_window,name:base.ir_cron_act
@@ -2346,7 +2359,7 @@ msgstr "Título"
#. module: base
#: help:ir.property,res_id:0
msgid "If not set, acts as a default value for new resources"
msgstr ""
msgstr "Se não for definido, atua como um valor padrão para novos recursos"
#. module: base
#: selection:ir.ui.menu,icon:0
@@ -2371,6 +2384,9 @@ msgid ""
"loading a new language it becomes available as default interface language "
"for users and partners."
msgstr ""
"Este assistente ajuda você adicionar um novo idioma ao seu sistema OpenERP. "
"Depois de caqrregar uma nova linguagem ela se torna disponível como idioma "
"padrão de interface para usuários e parceiros."
#. module: base
#: view:ir.model:0
@@ -2420,18 +2436,18 @@ msgstr "Registro de Regras"
#. module: base
#: view:ir.property:0
msgid "Field Information"
msgstr ""
msgstr "Informação do campo"
#. module: base
#: view:ir.actions.todo:0
msgid "Search Actions"
msgstr ""
msgstr "Ações de pesquisa"
#. module: base
#: model:ir.actions.act_window,name:base.action_view_partner_wizard_ean_check
#: view:partner.wizard.ean.check:0
msgid "Ean check"
msgstr ""
msgstr "Verificar EAN"
#. module: base
#: field:res.partner,vat:0
@@ -2565,7 +2581,7 @@ msgstr "Enviar SMS"
#. module: base
#: selection:base.language.install,lang:0
msgid "Hindi / India"
msgstr ""
msgstr "India"
#. module: base
#: field:res.partner,ean13:0
@@ -2596,12 +2612,12 @@ msgstr "6. %d, %m ==> 05, 12"
#: field:res.config.users,date:0
#: field:res.users,date:0
msgid "Last Connection"
msgstr ""
msgstr "Última conecção"
#. module: base
#: field:ir.actions.act_window,help:0
msgid "Action description"
msgstr ""
msgstr "Descrição da ação"
#. module: base
#: help:res.partner,customer:0
@@ -2674,7 +2690,7 @@ msgstr "Campo Base"
#. module: base
#: field:ir.actions.todo,restart:0
msgid "Restart"
msgstr ""
msgstr "Reiniciar"
#. module: base
#: field:ir.actions.report.xml,report_sxw_content:0
@@ -2714,7 +2730,7 @@ msgstr "Obrigatório"
#. module: base
#: view:res.users:0
msgid "Default Filters"
msgstr ""
msgstr "Filtros padrões"
#. module: base
#: field:res.request.history,name:0
@@ -2729,7 +2745,7 @@ msgstr ""
#. module: base
#: field:multi_company.default,expression:0
msgid "Expression"
msgstr ""
msgstr "Expressão"
#. module: base
#: help:ir.actions.server,subject:0
@@ -2751,6 +2767,8 @@ msgid ""
"Optional help text for the users with a description of the target view, such "
"as its usage and purpose."
msgstr ""
"Texto de ajuda opcional para os usuários, com uma descrição do modo de "
"exibição de destino, como a sua utilização e finalidade."
#. module: base
#: model:res.country,name:base.va
@@ -2765,12 +2783,12 @@ msgstr "Arquivo de módulo .ZIP"
#. module: base
#: field:ir.ui.view,xml_id:0
msgid "XML ID"
msgstr ""
msgstr "ID do XML"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_16
msgid "Telecom sector"
msgstr ""
msgstr "Setor de Telecom"
#. module: base
#: field:workflow.transition,trigger_model:0
@@ -2780,7 +2798,7 @@ msgstr "Objeto a disparar"
#. module: base
#: view:res.users:0
msgid "Current Activity"
msgstr ""
msgstr "Atividade atual"
#. module: base
#: view:workflow.activity:0
@@ -2796,7 +2814,7 @@ msgstr "Suriname"
#. module: base
#: model:ir.ui.menu,name:base.marketing_menu
msgid "Marketing"
msgstr ""
msgstr "Marketing"
#. module: base
#: view:res.partner.bank:0
@@ -2832,7 +2850,7 @@ msgstr "STOCK_SAVE_AS"
#. module: base
#: selection:ir.actions.todo,restart:0
msgid "Always"
msgstr ""
msgstr "Sempre"
#. module: base
#: selection:ir.translation,type:0
@@ -2850,6 +2868,8 @@ msgid ""
"The selected language has been successfully installed. You must change the "
"preferences of the user and open a new menu to view the changes."
msgstr ""
"O idioma selecionado foi instalado com sucesso. Você precisar alterar as "
"preferências do usuário e abrir um novo menu para ver as alterações."
#. module: base
#: field:ir.actions.act_window.view,view_id:0
@@ -2901,7 +2921,7 @@ msgstr "Autor"
#. module: base
#: model:res.country,name:base.mk
msgid "FYROM"
msgstr ""
msgstr "De"
#. module: base
#: selection:ir.ui.menu,icon:0
@@ -2941,7 +2961,7 @@ msgstr "Direção"
#. module: base
#: selection:base.language.install,lang:0
msgid "Latvian / Latvia"
msgstr ""
msgstr "Letônia"
#. module: base
#: view:ir.actions.act_window:0
@@ -2963,7 +2983,7 @@ msgstr "Regras"
#. module: base
#: selection:base.language.install,lang:0
msgid "Urdu / Pakistan"
msgstr ""
msgstr "Paquistão"
#. module: base
#: code:addons/base/module/module.py:0
@@ -2999,7 +3019,7 @@ msgstr "Workflows"
#. module: base
#: model:ir.actions.act_window,name:base.action_config_user_form
msgid "Create Users"
msgstr ""
msgstr "Criar usuários"
#. module: base
#: view:ir.values:0
@@ -3009,7 +3029,7 @@ msgstr "tree_but_action, client_print_multi"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_retailers0
msgid "Retailers"
msgstr ""
msgstr "Varejistas"
#. module: base
#: help:ir.cron,priority:0
@@ -3045,22 +3065,22 @@ msgstr "Quênia"
#. module: base
#: view:res.partner.event:0
msgid "Event"
msgstr ""
msgstr "Evento"
#. module: base
#: model:ir.ui.menu,name:base.menu_custom_reports
msgid "Custom Reports"
msgstr ""
msgstr "Relatórios personalizados"
#. module: base
#: view:base.module.configuration:0
msgid "System Configuration Done"
msgstr ""
msgstr "Configuração concluída"
#. module: base
#: view:ir.property:0
msgid "Generic"
msgstr ""
msgstr "Genérico"
#. module: base
#: model:res.country,name:base.sm
@@ -3090,7 +3110,7 @@ msgstr ""
#. module: base
#: help:ir.sequence,suffix:0
msgid "Suffix value of the record for the sequence"
msgstr ""
msgstr "Sufíxo do registro para a sequência"
#. module: base
#: selection:ir.ui.menu,icon:0
@@ -3155,7 +3175,7 @@ msgstr ""
#: view:ir.model.access:0
#: view:ir.rule:0
msgid "Full Access"
msgstr ""
msgstr "Acesso completo"
#. module: base
#: view:ir.actions.act_window:0
@@ -3169,7 +3189,7 @@ msgstr "Segurança"
#. module: base
#: model:res.widget,title:base.openerp_twitter_favorites
msgid "OpenERP Favorites"
msgstr ""
msgstr "Favoritos do OpenERP"
#. module: base
#: model:res.country,name:base.za
@@ -3187,7 +3207,7 @@ msgstr "Instalado"
#: model:ir.actions.act_window,name:base.action_translation
#: model:ir.ui.menu,name:base.menu_action_translation
msgid "Translation Terms"
msgstr ""
msgstr "Termos traduzidos"
#. module: base
#: model:res.country,name:base.sn
@@ -3222,7 +3242,7 @@ msgstr "Próximo numero"
#. module: base
#: help:workflow.transition,condition:0
msgid "Expression to be satisfied if we want the transition done."
msgstr ""
msgstr "Expressão a ser satisfeita, se quisermos fazer a transição."
#. module: base
#: selection:ir.ui.menu,icon:0
@@ -3305,7 +3325,7 @@ msgstr "Menu Superior(pai)"
#. module: base
#: field:ir.rule,perm_unlink:0
msgid "Apply For Delete"
msgstr ""
msgstr "Aplique para excluir"
#. module: base
#: help:ir.actions.act_window.view,multi:0
@@ -3387,7 +3407,7 @@ msgstr "Descrição geral"
#. module: base
#: model:ir.actions.act_window,name:base.action_config_simple_view_form
msgid "Configure Your Interface"
msgstr ""
msgstr "Configure sua interface"
#. module: base
#: field:ir.values,meta:0
@@ -3409,7 +3429,7 @@ msgstr "Venezuela"
#. module: base
#: selection:base.language.install,lang:0
msgid "Malayalam / India"
msgstr ""
msgstr "India"
#. module: base
#: view:res.lang:0
@@ -3485,6 +3505,8 @@ msgid ""
"If set to true, the action will not be displayed on the right toolbar of a "
"form view"
msgstr ""
"Se definido como verdadeiro, a ação não será exibida na barra à direito na "
"exibição de formulário"
#. module: base
#: model:res.country,name:base.ms
@@ -3503,6 +3525,8 @@ msgid ""
"The user's timezone, used to perform timezone conversions between the server "
"and the client."
msgstr ""
"Fuso horário do usuário, utilizado para realizar conversões de fuso horário "
"entre o servidor e o cliente."
#. module: base
#: field:ir.module.module,demo:0
@@ -3525,6 +3549,8 @@ msgid ""
"Source activity. When this activity is over, the condition is tested to "
"determine if we can start the ACT_TO activity."
msgstr ""
"Atividade de origem. Quando essa atividade acontece, a condição é testada "
"para determinar se podemos começar a atividade (ACT_TO)."
#. module: base
#: model:res.partner.category,name:base.res_partner_category_3
@@ -3534,7 +3560,7 @@ msgstr "Parceiro Inicial"
#. module: base
#: view:base.module.upgrade:0
msgid "Your system will be updated."
msgstr ""
msgstr "Seu sistema será atualizado."
#. module: base
#: model:ir.model,name:base.model_ir_actions_act_window_view
@@ -3579,7 +3605,7 @@ msgstr "Ilhas Svalbard e Jan Mayen"
#. module: base
#: model:ir.ui.menu,name:base.menu_view_base_module_update
msgid " Update Modules List"
msgstr ""
msgstr " Lista de módulos a atualizar"
#. module: base
#: view:ir.actions.act_window:0
@@ -3594,17 +3620,17 @@ msgstr "Agrupar Por"
#: view:res.config:0
#: view:res.config.installer:0
msgid "title"
msgstr ""
msgstr "Título"
#. module: base
#: model:ir.model,name:base.model_base_language_install
msgid "Install Language"
msgstr ""
msgstr "Instalar idioma"
#. module: base
#: view:ir.translation:0
msgid "Translation"
msgstr ""
msgstr "Tradução"
#. module: base
#: selection:ir.ui.menu,icon:0
@@ -3731,13 +3757,13 @@ msgstr "Horas"
#. module: base
#: model:res.country,name:base.gp
msgid "Guadeloupe (French)"
msgstr ""
msgstr "Guadalupe (em francês)"
#. module: base
#: code:addons/base/res/res_lang.py:0
#, python-format
msgid "User Error"
msgstr ""
msgstr "Erro de usuário"
#. module: base
#: help:workflow.transition,signal:0
@@ -3746,11 +3772,14 @@ msgid ""
"form, signal tests the name of the pressed button. If signal is NULL, no "
"button is necessary to validate this transition."
msgstr ""
"Quando a operação de transição vem de um botão pressionado no formulário de "
"cliente, testa o nome do botão pressionado. Se o sinal for NULL, nenhum "
"botão é necessário para validar esta transição."
#. module: base
#: help:multi_company.default,object_id:0
msgid "Object affected by this rule"
msgstr ""
msgstr "Objeto afetado por esta regra"
#. module: base
#: report:ir.module.reference.graph:0
@@ -3765,12 +3794,12 @@ msgstr "Nome do Menu"
#. module: base
#: view:ir.module.module:0
msgid "Author Website"
msgstr ""
msgstr "Autor do site"
#. module: base
#: view:ir.attachment:0
msgid "Month"
msgstr ""
msgstr "Mês"
#. module: base
#: model:res.country,name:base.my
@@ -3781,7 +3810,7 @@ msgstr "Malásia"
#: view:base.language.install:0
#: model:ir.actions.act_window,name:base.action_view_base_language_install
msgid "Load Official Translation"
msgstr ""
msgstr "Carregar uma tradução oficial"
#. module: base
#: view:ir.actions.server:0
@@ -3802,7 +3831,7 @@ msgstr ""
#. module: base
#: selection:base.language.install,lang:0
msgid "Indonesian / Bahasa Indonesia"
msgstr ""
msgstr "Indonésia"
#. module: base
#: model:res.country,name:base.cv
@@ -3856,7 +3885,7 @@ msgstr "Numero de módulos adicionados"
#. module: base
#: view:res.currency:0
msgid "Price Accuracy"
msgstr ""
msgstr "Precisão do preço"
#. module: base
#: view:res.config:0
@@ -3868,7 +3897,7 @@ msgstr ""
#: model:ir.actions.server,name:base.action_start_configurator
#: model:ir.ui.menu,name:base.menu_view_base_module_configuration
msgid "Start Configuration"
msgstr ""
msgstr "Iniciar configuração"
#. module: base
#: view:ir.module.module:0
@@ -3919,12 +3948,12 @@ msgstr "ir.cron"
#. module: base
#: view:ir.rule:0
msgid "Combination of rules"
msgstr ""
msgstr "Conbinação de regras"
#. module: base
#: view:ir.sequence:0
msgid "Current Year without Century: %(y)s"
msgstr ""
msgstr "Ano atual sem o século: %(y)s"
#. module: base
#: selection:ir.ui.menu,icon:0
@@ -3997,7 +4026,7 @@ msgstr ""
#: model:ir.actions.act_window,name:base.action_maintenance_contract_form
#: model:ir.ui.menu,name:base.menu_maintenance_contract
msgid "Maintenance Contracts"
msgstr ""
msgstr "Contratos de manutenção"
#. module: base
#: model:ir.actions.wizard,name:base.wizard_server_action_create
@@ -4070,7 +4099,7 @@ msgstr "Bancos"
#. module: base
#: view:res.log:0
msgid "Unread"
msgstr ""
msgstr "Não lido"
#. module: base
#: selection:ir.ui.menu,icon:0
@@ -4211,22 +4240,22 @@ msgstr ""
#. module: base
#: model:ir.ui.menu,name:base.menu_main_pm
msgid "Project"
msgstr ""
msgstr "Projeto"
#. module: base
#: view:base.module.import:0
msgid "Module file successfully imported!"
msgstr ""
msgstr "Módulo importado com sucesso!"
#. module: base
#: selection:ir.actions.todo,state:0
msgid "Cancelled"
msgstr ""
msgstr "Cancelado"
#. module: base
#: view:partner.clear.ids:0
msgid "Want to Clear Ids ? "
msgstr ""
msgstr "Quer limpar Ids? "
#. module: base
#: selection:res.request,priority:0
@@ -4260,7 +4289,7 @@ msgstr "Selecione o objeto do modelo sobre o qual o workflow será executado."
#. module: base
#: field:res.partner,employee:0
msgid "Employee"
msgstr ""
msgstr "Empregado"
#. module: base
#: field:ir.model.access,perm_create:0
@@ -4275,7 +4304,7 @@ msgstr "Estado(UF)"
#. module: base
#: field:ir.actions.server,copy_object:0
msgid "Copy Of"
msgstr ""
msgstr "Copiar de"
#. module: base
#: field:ir.model,osv_memory:0
@@ -4285,7 +4314,7 @@ msgstr ""
#. module: base
#: view:partner.clear.ids:0
msgid "Clear Ids"
msgstr ""
msgstr "Limpar Ids"
#. module: base
#: model:res.country,name:base.io
@@ -4297,7 +4326,7 @@ msgstr "Território britânico do Oceano Índico"
#: field:res.config.view,view:0
#: field:res.users,view:0
msgid "Interface"
msgstr ""
msgstr "Interface"
#. module: base
#: view:ir.actions.server:0
@@ -4361,7 +4390,7 @@ msgstr "Nome completo"
#. module: base
#: view:base.module.configuration:0
msgid "_Ok"
msgstr ""
msgstr "_Ok"
#. module: base
#: help:ir.filters,user_id:0
@@ -4376,7 +4405,7 @@ msgstr "Moçambique"
#. module: base
#: model:ir.ui.menu,name:base.menu_project_long_term
msgid "Long Term Planning"
msgstr ""
msgstr "Planejamento de Longo Prazo"
#. module: base
#: field:ir.actions.server,message:0
@@ -4406,7 +4435,7 @@ msgstr "Contatos"
#. module: base
#: model:res.country,name:base.fo
msgid "Faroe Islands"
msgstr ""
msgstr "Ilhas Feroé"
#. module: base
#: code:addons/base/res/res_user.py:0
@@ -4415,6 +4444,9 @@ msgid ""
"\"email_from\" needs to be set to send welcome mails '\n"
" 'to users"
msgstr ""
"\"Email_from\" precisa ser configurado para enviar e-mails de boas vindas "
"\"\n"
" 'aos usuários"
#. module: base
#: view:base.module.upgrade:0
@@ -4431,7 +4463,7 @@ msgstr "Manutenção"
#. module: base
#: view:res.widget:0
msgid "Widgets"
msgstr ""
msgstr "Widgets"
#. module: base
#: model:res.country,name:base.mp
@@ -4441,7 +4473,7 @@ msgstr "Ilhas Marianas do Norte"
#. module: base
#: selection:ir.property,type:0
msgid "Integer"
msgstr ""
msgstr "Inteiro"
#. module: base
#: selection:ir.ui.menu,icon:0
@@ -4454,12 +4486,14 @@ msgid ""
"The path to the main report file (depending on Report Type) or NULL if the "
"content is in another data field"
msgstr ""
"O caminho para o arquivo do relatório principal (dependendo tipo de "
"relatório) ou NULL se o conteúdo está em outro campo de dados"
#. module: base
#: help:res.config.users,company_id:0
#: help:res.users,company_id:0
msgid "The company this user is currently working for."
msgstr ""
msgstr "A empresa onde o usuário está trabalhando."
#. module: base
#: model:ir.model,name:base.model_wizard_ir_model_menu_create
@@ -4539,7 +4573,7 @@ msgstr "Fechar"
#. module: base
#: view:res.log:0
msgid "My Logs"
msgstr ""
msgstr "Meus logs"
#. module: base
#: model:res.country,name:base.bt
@@ -4549,7 +4583,7 @@ msgstr "Butão"
#. module: base
#: help:ir.sequence,number_next:0
msgid "Next number of this sequence"
msgstr ""
msgstr "Próximo número para esta sequência"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_11
@@ -4585,7 +4619,7 @@ msgstr "res.config.view"
#: view:res.log:0
#: field:res.log,read:0
msgid "Read"
msgstr ""
msgstr "Leia"
#. module: base
#: selection:ir.ui.menu,icon:0
+3 -3
View File
@@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2010-10-18 17:46+0000\n"
"PO-Revision-Date: 2010-11-01 08:31+0000\n"
"PO-Revision-Date: 2010-11-14 07:36+0000\n"
"Last-Translator: Chertykov Denis <chertykov@gmail.com>\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: 2010-11-02 04:49+0000\n"
"X-Launchpad-Export-Date: 2010-11-15 04:59+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: base
@@ -96,7 +96,7 @@ msgstr "Рабочий процесс включен"
#. module: base
#: field:ir.actions.act_window,display_menu_tip:0
msgid "Display Menu Tips"
msgstr ""
msgstr "Выводить советы"
#. module: base
#: view:ir.module.module:0
+3891 -2013
View File
File diff suppressed because it is too large Load Diff
+2671 -1738
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -34,6 +34,7 @@ import ir_exports
import workflow
import ir_rule
import wizard
import osv_memory_autovacuum
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+20
View File
@@ -705,6 +705,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.company</field>
<field name="view_type">form</field>
<field name="help">Create and manage the companies that will be managed by OpenERP from here. Shops or subsidiaries can be created and maintained from here.</field>
</record>
<menuitem action="action_res_company_form" id="menu_action_res_company_form" parent="base.menu_res_company_global"/>
@@ -716,6 +717,7 @@
<field name="view_type">form</field>
<field name="view_id" ref="view_users_tree"/>
<field name="search_view_id" ref="view_users_search"/>
<field name="help">Create and manage users that will connect to the system. Users can be deactivated should there be a period of time during which they will/should not connect to the system. You can assign them groups in order to give them specific access to the applications they need to use in the system.</field>
</record>
<record id="action_res_users_view1" model="ir.actions.act_window.view">
<field eval="10" name="sequence"/>
@@ -757,6 +759,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.groups</field>
<field name="view_type">form</field>
<field name="help">A group is a set of functional areas that will be assigned to the user in order to give them access and rights to specific applications and tasks in the system. You can create custom groups or edit the ones existing by default in order to customize the view of the menu that users will be able to see. Whether they can have a read, write, create and delete access right can be managed from here.</field>
</record>
<menuitem action="action_res_groups" id="menu_action_res_groups" parent="base.menu_users"
groups="base.group_extended"/>
@@ -844,6 +847,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">ir.ui.view</field>
<field name="view_id" ref="view_view_tree"/>
<field name="help">Views allows you to personalize each view of OpenERP. You can add new fields, move fields, rename them or delete the ones that you do not need.</field>
</record>
<menuitem action="action_ui_view" id="menu_action_ui_view" parent="base.next_id_2"/>
@@ -1403,6 +1407,7 @@
<field name="view_type">form</field>
<field name="view_id" ref="edit_menu"/>
<field name="search_view_id" ref="edit_menu_access_search"/>
<field name="help">Manage and customize the items available and displayed in your OpenERP system menu. You can delete an item by clicking on the box at the beginning of each line and then delete it through the button that appeared. Items can be assigned to specific groups in order to make them accessible to some users within the system.</field>
</record>
<menuitem action="grant_menu_access" id="menu_grant_menu_access" parent="base.next_id_2" sequence="1"/>
@@ -1868,5 +1873,20 @@
<menuitem action="act_ir_actions_todo_form" id="menu_ir_actions_todo_form"
parent="next_id_11" groups="base.group_extended" sequence="20"/>
<record model="ir.cron" id="cronjob_osv_memory_autovacuum">
<field name='name'>AutoVacuum osv_memory objects</field>
<field name='interval_number'>30</field>
<field name='interval_type'>minutes</field>
<field name="numbercall">-1</field>
<field name="active">True</field>
<field name="doall" eval="False" />
<field name="model">osv_memory.autovacuum</field>
<field name="function">power_on</field>
<field name="args">()</field>
</record>
</data>
</openerp>
+1 -1
View File
@@ -26,7 +26,7 @@ class ir_exports(osv.osv):
_name = "ir.exports"
_columns = {
'name': fields.char('Export Name', size=128),
'resource': fields.char('Resource', size=128),
'resource': fields.char('Resource', size=128, select=True),
'export_fields': fields.one2many('ir.exports.line', 'export_id',
'Export ID'),
}
+44 -57
View File
@@ -24,6 +24,11 @@ from osv.orm import except_orm
import pickle
from tools.translate import _
EXCLUDED_FIELDS = set((
'report_sxw_content', 'report_rml_content', 'report_sxw', 'report_rml',
'report_sxw_content_data', 'report_rml_content_data', 'search_view',
'search_view_id'))
class ir_values(osv.osv):
_name = 'ir.values'
@@ -96,7 +101,7 @@ class ir_values(osv.osv):
cr.execute('CREATE INDEX ir_values_key_model_key2_index ON ir_values (key, model, key2)')
def set(self, cr, uid, key, key2, name, models, value, replace=True, isobject=False, meta=False, preserve_user=False, company=False):
if type(value)==type(u''):
if isinstance(value, unicode):
value = value.encode('utf8')
if not isobject:
value = pickle.dumps(value)
@@ -104,30 +109,24 @@ class ir_values(osv.osv):
meta = pickle.dumps(meta)
ids_res = []
for model in models:
if type(model)==type([]) or type(model)==type(()):
if isinstance(model, (list, tuple)):
model,res_id = model
else:
res_id=False
if replace:
search_criteria = [
('key', '=', key),
('key2', '=', key2),
('model', '=', model),
('res_id', '=', res_id),
('user_id', '=', preserve_user and uid)
]
if key in ('meta', 'default'):
ids = self.search(cr, uid, [
('key', '=', key),
('key2', '=', key2),
('name', '=', name),
('model', '=', model),
('res_id', '=', res_id),
('user_id', '=', preserve_user and uid)
])
search_criteria.append(('name', '=', name))
else:
ids = self.search(cr, uid, [
('key', '=', key),
('key2', '=', key2),
('value', '=', value),
('model', '=', model),
('res_id', '=', res_id),
('user_id', '=', preserve_user and uid)
])
self.unlink(cr, uid, ids)
search_criteria.append(('value', '=', value))
self.unlink(cr, uid, self.search(cr, uid, search_criteria))
vals = {
'name': name,
'value': value,
@@ -149,8 +148,8 @@ class ir_values(osv.osv):
def get(self, cr, uid, key, key2, models, meta=False, context={}, res_id_req=False, without_user=True, key2_req=True):
result = []
for m in models:
if type(m)==type([]) or type(m)==type(()):
m,res_id = m
if isinstance(m, (list, tuple)):
m, res_id = m
else:
res_id=False
@@ -159,9 +158,8 @@ class ir_values(osv.osv):
if key2:
where.append('key2=%s')
params.append(key2[:200])
else:
if key2_req and not meta:
where.append('key2 is null')
elif key2_req and not meta:
where.append('key2 is null')
if res_id_req and (models[-1][0]==m):
if res_id:
where.append('res_id=%s')
@@ -193,48 +191,37 @@ class ir_values(osv.osv):
keys.append(x[1])
if x[3]:
model,id = x[2].split(',')
id = int(id)
fields = self.pool.get(model).fields_get_keys(cr, uid)
pos = 0
while pos<len(fields):
if fields[pos] in ('report_sxw_content', 'report_rml_content',
'report_sxw', 'report_rml', 'report_sxw_content_data',
'report_rml_content_data'):
del fields[pos]
else:
pos+=1
# FIXME: It might be a good idea to opt-in that kind of stuff
# FIXME: instead of arbitrarily removing random fields
fields = [
field
for field in self.pool.get(model).fields_get_keys(cr, uid)
if field not in EXCLUDED_FIELDS]
try:
datas = self.pool.get(model).read(cr, uid, [id], fields, context)
datas = self.pool.get(model).read(cr, uid, [int(id)], fields, context)
except except_orm, e:
return False
datas= datas and datas[0] or None
datas = datas and datas[0]
if not datas:
#ir_del(cr, uid, x[0])
return False
else:
datas = pickle.loads(str(x[2].encode('utf-8')))
datas = pickle.loads(x[2].encode('utf-8'))
if meta:
meta2 = pickle.loads(x[4])
return (x[0],x[1],datas,meta2)
return (x[0],x[1],datas)
return (x[0], x[1], datas, pickle.loads(x[4]))
return (x[0], x[1], datas)
keys = []
res = filter(bool, map(lambda x: _result_get(x, keys), list(result)))
res = filter(None, map(lambda x: _result_get(x, keys), result))
res2 = res[:]
for r in res:
if type(r[2])==type({}) and 'type' in r[2]:
if r[2]['type'] in ('ir.actions.report.xml','ir.actions.act_window','ir.actions.wizard'):
groups = r[2].get('groups_id')
if groups:
cr.execute('SELECT COUNT(1) FROM res_groups_users_rel WHERE gid IN %s AND uid=%s',(tuple(groups), uid))
cnt = cr.fetchone()[0]
if not cnt:
res2.remove(r)
if r[1] == 'Menuitem' and not res2:
raise osv.except_osv('Error !','You do not have the permission to perform this operation !!!')
if isinstance(r[2], dict) and r[2].get('type') in ('ir.actions.report.xml','ir.actions.act_window','ir.actions.wizard'):
groups = r[2].get('groups_id')
if groups:
cr.execute('SELECT COUNT(1) FROM res_groups_users_rel WHERE gid IN %s AND uid=%s',(tuple(groups), uid))
cnt = cr.fetchone()[0]
if not cnt:
res2.remove(r)
if r[1] == 'Menuitem' and not res2:
raise osv.except_osv('Error !','You do not have the permission to perform this operation !!!')
return res2
ir_values()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
@@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2010 OpenERP s.a. (<http://openerp.com>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from osv import osv
from osv.orm import orm_memory
class osv_memory_autovacuum(osv.osv_memory):
_name = 'osv_memory.autovacuum'
def power_on(self, cr, uid, context=None):
for model in self.pool.obj_list():
obj = self.pool.get(model)
if isinstance(obj, orm_memory):
obj.vaccum(cr, uid)
return True
osv_memory_autovacuum()
+2 -2
View File
@@ -53,8 +53,8 @@ class module_category(osv.osv):
result = dict(cr.fetchall())
for id in ids:
cr.execute('select id from ir_module_category where parent_id=%s', (id,))
childs = [c for c, in cr.fetchall()]
result[id] = reduce(lambda x,y:x+y, [result.get(c, 0) for c in childs], result.get(id, 0))
result[id] = sum([result.get(c, 0) for (c,) in cr.fetchall()],
result.get(id, 0))
return result
_columns = {
+2 -2
View File
@@ -68,7 +68,6 @@
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('category_id','=',active_id)]</field>
</record>
<record id="ir_action_module_category" model="ir.values">
<field eval="'tree_but_open'" name="key2"/>
@@ -169,7 +168,8 @@
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="domain"/>
<field name="search_view_id" ref="view_module_filter"/>
<field name="search_view_id" ref="view_module_filter"/>
<field name="help">List all certified modules available to configure your OpenERP. Modules that are installed are flagged as such. You can search for a specific module using the name or the description of the module. You do not need to install modules one by one, you can install many at the same time by clicking on the schedule button in this list. Then, apply the schedule upgrade from Action menu once for all the ones you have scheduled for installation.</field>
</record>
<menuitem action="open_module_tree" id="menu_module_tree" parent="base.menu_management"/>
@@ -22,6 +22,8 @@
<separator orientation="vertical" rowspan="15"/>
<group colspan="4" col="4">
<separator string="Import Translation" colspan="4"/>
<label colspan="4" nolabel="1" string="If you need another language than the official ones available, you can import a language pack from here. Other OpenERP languages than the official ones can be found on launchpad."/>
<newline/>
<field name="name" width="200"/>
<field name="code"/>
<field name="data" colspan="4"/>
@@ -56,7 +56,7 @@ class base_module_import(osv.osv_memory):
fname = fdata.namelist()[0]
module_name = os.path.split(fname)[0]
ad = tools.config['addons_path']
ad = tools.config['addons_path'].split(",")[-1]
fname = os.path.join(ad, module_name+'.zip')
try:
+18 -41
View File
@@ -18,7 +18,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import logging
from operator import attrgetter
from osv import osv, fields
@@ -37,6 +37,7 @@ class res_config_configurable(osv.osv_memory):
_name = 'res.config'
_inherit = 'ir.wizard.screen'
logger = netsvc.Logger()
__logger = logging.getLogger(_name)
def get_current_progress(self, cr, uid, context=None):
'''Return a description the current progress of configuration:
@@ -63,14 +64,13 @@ class res_config_configurable(osv.osv_memory):
def _next_action(self, cr, uid, context=None):
todos = self.pool.get('ir.actions.todo')
self.logger.notifyChannel('actions', netsvc.LOG_INFO,
'getting next %s' % todos)
self.__logger.info('getting next %s', todos)
active_todos = todos.search(cr, uid, [('state','=','open')],
limit=1)
dont_skip_todo = True
if active_todos:
todo_obj = todos.browse(cr, uid, active_todos[0], context=None)
todo_groups = map(lambda x:x.id, todo_obj.groups_id)
dont_skip_todo = True
if todo_groups:
cr.execute("select 1 from res_groups_users_rel where uid=%s and gid IN %s",(uid, tuple(todo_groups),))
dont_skip_todo = bool(cr.fetchone())
@@ -84,30 +84,20 @@ class res_config_configurable(osv.osv_memory):
def _set_previous_todo(self, cr, uid, state, context=None):
""" lookup the previous (which is still the next at this point)
ir.actions.todo, set it to whatever state was provided.
Raises
`LookupError`: if we couldn't find *any* previous todo
`ValueError`: if no state is provided
anything ir_actions_todo.write can throw
"""
if context is None:
context = {}
# this is ultra brittle, but apart from storing the todo id
# into the res.config view, I'm not sure how to get the
# "previous" todo
previous_todo = self._next_action(cr, uid, context=context)
if not previous_todo:
raise LookupError(_("Couldn't find previous ir.actions.todo"))
if not state:
raise ValueError(_("Can't set an ir.actions.todo's state to an empty value."))
self.__logger.warn(_("Couldn't find previous ir.actions.todo"))
return
previous_todo.write({'state':state})
def _next(self, cr, uid, context=None):
self.logger.notifyChannel('actions', netsvc.LOG_INFO,
'getting next operation')
self.__logger.info('getting next operation')
next = self._next_action(cr, uid)
self.logger.notifyChannel('actions', netsvc.LOG_INFO,
'next action is %s' % next)
self.__logger.info('next action is %s', next)
if next:
action = next.action_id
return {
@@ -118,16 +108,13 @@ class res_config_configurable(osv.osv_memory):
'type': action.type,
'target': action.target,
}
self.logger.notifyChannel(
'actions', netsvc.LOG_INFO,
'all configuration actions have been executed')
self.__logger.info('all configuration actions have been executed')
current_user_menu = self.pool.get('res.users')\
.browse(cr, uid, uid).menu_id
# return the action associated with the menu
return self.pool.get(current_user_menu.type)\
.read(cr, uid, current_user_menu.id)
return {'menu_reload':True, 'type': 'object'}
def start(self, cr, uid, ids, context=None):
ids2 = self.pool.get('ir.actions.todo').search(cr, uid, [], context=context)
for todo in self.pool.get('ir.actions.todo').browse(cr, uid, ids2, context=context):
@@ -174,10 +161,7 @@ class res_config_configurable(osv.osv_memory):
an action dictionary -- executes the action provided by calling
``next``.
"""
try:
self._set_previous_todo(cr, uid, state='done', context=context)
except Exception, e:
raise osv.except_osv(_('Error'), e.message)
self._set_previous_todo(cr, uid, state='done', context=context)
next = self.execute(cr, uid, ids, context=None)
if next: return next
return self.next(cr, uid, ids, context=context)
@@ -190,10 +174,7 @@ class res_config_configurable(osv.osv_memory):
an action dictionary -- executes the action provided by calling
``next``.
"""
try:
self._set_previous_todo(cr, uid, state='skip', context=context)
except Exception, e:
raise osv.except_osv(_('Error'), e.message)
self._set_previous_todo(cr, uid, state='skip', context=context)
next = self.cancel(cr, uid, ids, context=None)
if next: return next
return self.next(cr, uid, ids, context=context)
@@ -209,10 +190,7 @@ class res_config_configurable(osv.osv_memory):
an action dictionary -- executes the action provided by calling
``next``.
"""
try:
self._set_previous_todo(cr, uid, state='cancel', context=context)
except Exception, e:
raise osv.except_osv(_('Error'), e.message)
self._set_previous_todo(cr, uid, state='cancel', context=context)
next = self.cancel(cr, uid, ids, context=None)
if next: return next
return self.next(cr, uid, ids, context=context)
@@ -313,6 +291,7 @@ class res_config_installer(osv.osv_memory):
"""
_name = 'res.config.installer'
_inherit = 'res.config'
__logger = logging.getLogger(_name)
_install_if = {}
@@ -408,9 +387,7 @@ class res_config_installer(osv.osv_memory):
modules = self.pool.get('ir.module.module')
to_install = list(self.modules_to_install(
cr, uid, ids, context=context))
self.logger.notifyChannel(
'installer', netsvc.LOG_INFO,
'Selecting addons %s to install'%to_install)
self.__logger.info('Selecting addons %s to install', to_install)
modules.state_update(
cr, uid,
modules.search(cr, uid, [('name','in',to_install)]),
@@ -432,6 +409,7 @@ class ir_actions_configuration_wizard(osv.osv_memory):
'''
_name='ir.actions.configuration.wizard'
_inherit = 'res.config'
__logger = logging.getLogger(_name)
def _next_action_note(self, cr, uid, ids, context=None):
next = self._next_action(cr, uid)
@@ -451,8 +429,7 @@ class ir_actions_configuration_wizard(osv.osv_memory):
}
def execute(self, cr, uid, ids, context=None):
self.logger.notifyChannel(
'configuration', netsvc.LOG_WARNING, DEPRECATION_MESSAGE)
self.__logger.warn(DEPRECATION_MESSAGE)
ir_actions_configuration_wizard()
+1
View File
@@ -33,6 +33,7 @@ import time
class groups(osv.osv):
_name = "res.groups"
_order = 'name'
_description = "Access Groups"
_columns = {
'name': fields.char('Group Name', size=64, required=True),
'model_access': fields.one2many('ir.model.access', 'group_id', 'Access Controls'),
+1 -1
View File
@@ -31,7 +31,7 @@ def ir_del(cr, uid, id):
obj = pooler.get_pool(cr.dbname).get('ir.values')
return obj.unlink(cr, uid, [id])
def ir_get(cr, uid, key, key2, models, meta=False, context={}, res_id_req=False):
def ir_get(cr, uid, key, key2, models, meta=False, context=None, res_id_req=False):
obj = pooler.get_pool(cr.dbname).get('ir.values')
res = obj.get(cr, uid, key, key2, models, meta=meta, context=context, res_id_req=res_id_req)
return res
+18 -10
View File
@@ -63,8 +63,10 @@ class _column(object):
_symbol_set = (_symbol_c, _symbol_f)
_symbol_get = None
def __init__(self, string='unknown', required=False, readonly=False, domain=None, context={}, states=None, priority=0, change_default=False, size=None, ondelete="set null", translate=False, select=False, **args):
if not context:
def __init__(self, string='unknown', required=False, readonly=False, domain=None, context=None, states=None, priority=0, change_default=False, size=None, ondelete="set null", translate=False, select=False, **args):
if domain is None:
domain = []
if context is None:
context = {}
self.states = states or {}
self.string = string
@@ -76,7 +78,7 @@ class _column(object):
self.change_default = change_default
self.ondelete = ondelete
self.translate = translate
self._domain = domain or []
self._domain = domain
self._context = context
self.write = False
self.read = False
@@ -254,7 +256,13 @@ class binary(_column):
if v['id'] == i:
val = v[name]
break
if context.get('bin_size', False) and val:
# If client is requesting only the size of the field, we return it instead
# of the content. Presumably a separate request will be done to read the actual
# content if it's needed at some point.
# TODO: after 6.0 we should consider returning a dict with size and content instead of
# having an implicit convention for the value
if val and context.get('bin_size_%s' % name, context.get('bin_size')):
res[i] = tools.human_size(long(val))
else:
res[i] = val
@@ -397,7 +405,7 @@ class one2many(_column):
assert(self.change_default != True)
def get_memory(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None):
if not context:
if context is None:
context = {}
if self._context:
context = context.copy()
@@ -780,7 +788,7 @@ class function(_column):
class related(function):
def _fnct_search(self, tobj, cr, uid, obj=None, name=None, domain=None, context={}):
def _fnct_search(self, tobj, cr, uid, obj=None, name=None, domain=None, context=None):
self._field_get2(cr, uid, obj, context)
i = len(self._arg)-1
sarg = name
@@ -797,7 +805,7 @@ class related(function):
return [(self._arg[0], 'in', sarg)]
def _fnct_write(self,obj,cr, uid, ids, field_name, values, args, context=None):
self._field_get2(cr, uid, obj, context)
self._field_get2(cr, uid, obj, context=context)
if type(ids) != type([]):
ids=[ids]
objlst = obj.browse(cr, uid, ids)
@@ -878,7 +886,7 @@ class related(function):
# TODO: improve here to change self.store = {...} according to related objects
pass
def _field_get2(self, cr, uid, obj, context={}):
def _field_get2(self, cr, uid, obj, context=None):
if self._relations:
return
obj_name = obj._name
@@ -898,10 +906,10 @@ class related(function):
# ---------------------------------------------------------
class dummy(function):
def _fnct_search(self, tobj, cr, uid, obj=None, name=None, domain=None, context={}):
def _fnct_search(self, tobj, cr, uid, obj=None, name=None, domain=None, context=None):
return []
def _fnct_write(self,obj,cr, uid, ids, field_name, values, args, context=None):
def _fnct_write(self, obj, cr, uid, ids, field_name, values, args, context=None):
return False
def _fnct_read(self, obj, cr, uid, ids, field_name, args, context=None):
+58 -41
View File
@@ -126,12 +126,14 @@ class browse_record_list(list):
class browse_record(object):
logger = netsvc.Logger()
def __init__(self, cr, uid, id, table, cache, context=None, list_class = None, fields_process={}):
def __init__(self, cr, uid, id, table, cache, context=None, list_class=None, fields_process=None):
'''
table : the object (inherited from orm)
context : dictionary with an optional context
'''
if not context:
if fields_process is None:
fields_process = {}
if context is None:
context = {}
self._list_class = list_class or browse_record_list
self._cr = cr
@@ -404,7 +406,9 @@ class orm_template(object):
def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None):
raise NotImplementedError(_('The read_group method is not implemented on this object !'))
def _field_create(self, cr, context={}):
def _field_create(self, cr, context=None):
if context is None:
context = {}
cr.execute("SELECT id FROM ir_model WHERE model=%s", (self._name,))
if not cr.rowcount:
cr.execute('SELECT nextval(%s)', ('ir_model_id_seq',))
@@ -489,8 +493,8 @@ class orm_template(object):
break
cr.commit()
def _auto_init(self, cr, context={}):
self._field_create(cr, context)
def _auto_init(self, cr, context=None):
self._field_create(cr, context=context)
def __init__(self, cr):
if not self._name and not hasattr(self, '_inherit'):
@@ -506,7 +510,7 @@ class orm_template(object):
if not self._table:
self._table = self._name.replace('.', '_')
def browse(self, cr, uid, select, context=None, list_class=None, fields_process={}):
def browse(self, cr, uid, select, context=None, list_class=None, fields_process=None):
"""
Fetch records as objects allowing to use dot notation to browse fields and relations
@@ -517,8 +521,6 @@ class orm_template(object):
:rtype: object or list of objects requested
"""
if not context:
context = {}
self._list_class = list_class or browse_record_list
cache = {}
# need to accepts ints and longs because ids coming from a method
@@ -526,7 +528,7 @@ class orm_template(object):
if isinstance(select, (int, long)):
return browse_record(cr, uid, select, self, cache, context=context, list_class=self._list_class, fields_process=fields_process)
elif isinstance(select, list):
return self._list_class([browse_record(cr, uid, id, self, cache, context=context, list_class=self._list_class, fields_process=fields_process) for id in select], context)
return self._list_class([browse_record(cr, uid, id, self, cache, context=context, list_class=self._list_class, fields_process=fields_process) for id in select], context=context)
else:
return browse_null()
@@ -554,8 +556,8 @@ class orm_template(object):
lines = []
data = map(lambda x: '', range(len(fields)))
done = []
for fpos in range(len(fields)):
done = []
f = fields[fpos]
if f:
r = row
@@ -600,7 +602,8 @@ class orm_template(object):
fields2 = map(lambda x: (x[:i+1]==f[:i+1] and x[i+1:]) \
or [], fields)
if fields2 in done:
break
if [x for x in fields2 if x]:
break
done.append(fields2)
for row2 in r:
lines2 = self.__export_row(cr, uid, row2, fields2,
@@ -1012,6 +1015,27 @@ class orm_template(object):
return (done, 0, 0, 0)
def read(self, cr, user, ids, fields=None, context=None, load='_classic_read'):
"""
Read records with given ids with the given fields
:param cr: database cursor
:param user: current user id
:param ids: id or list of the ids of the records to read
:param fields: optional list of field names to return (default: all fields would be returned)
:type fields: list (example ['field_name_1', ...])
:param context: optional context dictionary - it may contains keys for specifying certain options
like ``context_lang``, ``context_tz`` to alter the results of the call.
A special ``bin_size`` boolean flag may also be passed in the context to request the
value of all fields.binary columns to be returned as the size of the binary instead of its
contents. This can also be selectively overriden by passing a field-specific flag
in the form ``bin_size_XXX: True/False`` where ``XXX`` is the name of the field.
Note: The ``bin_size_XXX`` form is new in OpenERP v6.0.
:return: list of dictionaries((dictionary per record asked)) with requested field values
:rtype: [{‘name_of_the_field’: value, ...}, ...]
:raise AccessError: * if user has no read rights on the requested object
* if user tries to bypass access rules for read on the requested object
"""
raise NotImplementedError(_('The read method is not implemented on this object !'))
def get_invalid_fields(self, cr, uid):
@@ -1049,8 +1073,15 @@ class orm_template(object):
:param fields_list: list of fields to get the default values for (example ['field1', 'field2',])
:type fields_list: list
:param context: usual context dictionary - it may contains keys in the form ``default_XXX``,
where XXX is a field name to set or override a default value.
:param context: optional context dictionary - it may contains keys for specifying certain options
like ``context_lang`` (language) or ``context_tz`` (timezone) to alter the results of the call.
It may contain keys in the form ``default_XXX`` (where XXX is a field name), to set
or override a default value for a field.
A special ``bin_size`` boolean flag may also be passed in the context to request the
value of all fields.binary columns to be returned as the size of the binary instead of its
contents. This can also be selectively overriden by passing a field-specific flag
in the form ``bin_size_XXX: True/False`` where ``XXX`` is the name of the field.
Note: The ``bin_size_XXX`` form is new in OpenERP v6.0.
:return: dictionary of the default values (set on the object model class, through user preferences, or in the context)
"""
# trigger view init hook
@@ -1246,7 +1277,7 @@ class orm_template(object):
context = {}
result = False
fields = {}
childs = True
children = True
def encode(s):
if isinstance(s, unicode):
@@ -1300,7 +1331,7 @@ class orm_template(object):
if column:
relation = self.pool.get(column._obj)
childs = False
children = False
views = {}
for f in node:
if f.tag in ('form', 'tree', 'graph'):
@@ -1362,7 +1393,7 @@ class orm_template(object):
node.set('sum', trans)
for f in node:
if childs or (node.tag == 'field' and f.tag in ('filter','separator')):
if children or (node.tag == 'field' and f.tag in ('filter','separator')):
fields.update(self.__view_look_dom(cr, user, f, view_id, context))
return fields
@@ -1409,7 +1440,7 @@ class orm_template(object):
fields = self.fields_get(cr, user, fields_def.keys(), context)
for field in fields_def:
if field == 'id':
# sometime, the view may containt the (invisible) field 'id' needed for a domain (when 2 objects have cross references)
# sometime, the view may contain the (invisible) field 'id' needed for a domain (when 2 objects have cross references)
fields['id'] = {'readonly': True, 'type': 'integer', 'string': 'ID'}
elif field in fields:
fields[field].update(fields_def[field])
@@ -1419,7 +1450,7 @@ class orm_template(object):
model = res[0][1]
res.insert(0, ("Can't find field '%s' in the following view parts composing the view of object model '%s':" % (field, model), None))
msg = "\n * ".join([r[0] for r in res])
msg += "\n\nEither you wrongly customised this view, or some modules bringing those views are not compatible with your current data model"
msg += "\n\nEither you wrongly customized this view, or some modules bringing those views are not compatible with your current data model"
netsvc.Logger().notifyChannel('orm', netsvc.LOG_ERROR, msg)
raise except_orm('View error', msg)
return arch, fields
@@ -1470,14 +1501,14 @@ class orm_template(object):
return arch
def __get_default_search_view(self, cr, uid, context={}):
def __get_default_search_view(self, cr, uid, context=None):
def encode(s):
if isinstance(s, unicode):
return s.encode('utf8')
return s
view = self.fields_view_get(cr, uid, False, 'form', context)
view = self.fields_view_get(cr, uid, False, 'form', context=context)
root = etree.fromstring(encode(view['arch']))
res = etree.XML("""<search string="%s"></search>""" % root.get("string", ""))
@@ -2327,8 +2358,7 @@ class orm(orm_template):
where += ' order by '+self._parent_order
cr.execute('SELECT id FROM '+self._table+' WHERE '+where)
pos2 = pos + 1
childs = cr.fetchall()
for id in childs:
for id in cr.fetchall():
pos2 = browse_rec(id[0], pos2)
cr.execute('update '+self._table+' set parent_left=%s, parent_right=%s where id=%s', (pos, pos2, root))
return pos2 + 1
@@ -2383,7 +2413,9 @@ class orm(orm_template):
self.__schema.debug("Table '%s': column '%s': dropped NOT NULL constraint",
self._table, column['attname'])
def _auto_init(self, cr, context={}):
def _auto_init(self, cr, context=None):
if context is None:
context = {}
store_compute = False
create = False
todo_end = []
@@ -2941,21 +2973,6 @@ class orm(orm_template):
return super(orm, self).fields_get(cr, user, fields, context, write_access)
def read(self, cr, user, ids, fields=None, context=None, load='_classic_read'):
"""
Read records with given ids with the given fields
:param cr: database cursor
:param user: current user id
:param ids: id or list of the ids of the records to read
:param fields: optional list of field names to return (default: all fields would be returned)
:type fields: list (example ['field_name_1', ...])
:param context: (optional) context arguments, like lang, time zone
:return: list of dictionaries((dictionary per record asked)) with requested field values
:rtype: [{‘name_of_the_field’: value, ...}, ...]
:raise AccessError: * if user has no read rights on the requested object
* if user tries to bypass access rules for read on the requested object
"""
if not context:
context = {}
self.pool.get('ir.model.access').check(cr, user, self._name, 'read', context=context)
@@ -4141,9 +4158,9 @@ class orm(orm_template):
old_record, new_record = self.read(cr, uid, [old_id, new_id], [field_name], context=context)
# here we rely on the order of the ids to match the translations
# as foreseen in copy_data()
old_childs = sorted(old_record[field_name])
new_childs = sorted(new_record[field_name])
for (old_child, new_child) in zip(old_childs, new_childs):
old_children = sorted(old_record[field_name])
new_children = sorted(new_record[field_name])
for (old_child, new_child) in zip(old_children, new_children):
# recursive copy of translations here
target_obj.copy_translations(cr, uid, old_child, new_child, context=context)
# and for translatable fields we keep them for copy
+1 -1
View File
@@ -254,7 +254,7 @@ class document(object):
for el_cld in node:
self.parse_node(el_cld, el, v)
else:
# if there is no "type" attribute in the node, copy it to the xml data and parse its childs
# if there is no "type" attribute in the node, copy it to the xml data and parse its children
if not node.tag == etree.Comment:
if node.tag == parent.tag:
el = parent
+3 -3
View File
@@ -552,8 +552,8 @@ class _rml_flowable(object):
return rc1
def _table(self, node):
childs = utils._child_get(node,self,'tr')
if not childs:
children = utils._child_get(node,self,'tr')
if not children:
return None
length = 0
colwidths = None
@@ -561,7 +561,7 @@ class _rml_flowable(object):
data = []
styles = []
posy = 0
for tr in childs:
for tr in children:
paraStyle = None
if tr.get('style'):
st = copy.deepcopy(self.styles.table_styles[tr.get('style')])
+14 -14
View File
@@ -36,15 +36,14 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
import re
import reportlab
from lxml import etree
import copy
import locale
import traceback, sys
import logging
import re
import reportlab
import tools
from tools.safe_eval import safe_eval as eval
import logging
_regex = re.compile('\[\[(.+?)\]\]')
@@ -117,18 +116,19 @@ def _process_text(self, txt):
sps = _regex.split(txt)
while sps:
# This is a simple text to translate
result += unicode(self.localcontext.get('translate', lambda x:x)(sps.pop(0)))
to_translate = tools.ustr(sps.pop(0))
result += tools.ustr(self.localcontext.get('translate', lambda x:x)(to_translate))
if sps:
try:
txt = None
expr = sps.pop(0)
txt = eval(expr,self.localcontext)
if txt and (isinstance(txt, unicode) or isinstance(txt, str)):
txt = unicode(txt)
except Exception,e:
tb_s = reduce(lambda x, y: x+y, traceback.format_exception(sys.exc_type, sys.exc_value, sys.exc_traceback))
if type(txt)==type('') or type(txt)==type(u''):
txt2 = str2xml(txt)
result += unicode(txt2)
txt = eval(expr, self.localcontext)
if txt and isinstance(txt, basestring):
txt = tools.ustr(txt)
except Exception:
pass
if isinstance(txt, basestring):
result += str2xml(txt)
elif (txt is not None) and (txt is not False):
result += unicode(txt)
return result
+1
View File
@@ -20,3 +20,4 @@
##############################################################################
from test_osv import *
from test_translate import *
+48
View File
@@ -0,0 +1,48 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2010 OpenERP S.A. http://www.openerp.com
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import unittest
from tools.translate import quote, unquote
class TranslationToolsTestCase(unittest.TestCase):
def test_quote_unquote(self):
def test_string(str):
quoted = quote(str)
#print "\n1:", repr(str)
#print "2:", repr(quoted)
unquoted = unquote("".join(quoted.split('"\n"')))
#print "3:", repr(unquoted)
self.assertEquals(str, unquoted)
test_string("""test \nall kinds\n \n o\r
\\\\ nope\n\n"
""")
# The ones with 1+ backslashes directly followed by
# a newline or literal N can fail... we would need a
# state-machine parser to handle these, but this would
# be much slower so it's better to avoid them at the moment
self.assertRaises(AssertionError, quote, """test \nall kinds\n\no\r
\\\\nope\n\n"
""")
+4 -2
View File
@@ -450,11 +450,13 @@ class configmanager(object):
# try to create the directories and write the file
try:
if not os.path.exists(os.path.dirname(self.rcfile)):
rc_exists = os.path.exists(self.rcfile)
if not rc_exists and not os.path.exists(os.path.dirname(self.rcfile)):
os.makedirs(os.path.dirname(self.rcfile))
try:
p.write(file(self.rcfile, 'w'))
os.chmod(self.rcfile, 0600)
if not rc_exists:
os.chmod(self.rcfile, 0600)
except IOError:
sys.stderr.write("ERROR: couldn't write the config file\n")
+79 -69
View File
@@ -68,6 +68,18 @@ def _obj(pool, cr, uid, model_str, context=None):
model = pool.get(model_str)
return lambda x: model.browse(cr, uid, x, context=context)
def _get_idref(self, cr, uid, model_str, context, idref):
idref2 = dict(idref,
time=time,
DateTime=datetime,
timedelta=timedelta,
version=release.major_version,
ref=_ref(self, cr),
pytz=pytz)
if len(model_str):
idref2['obj'] = _obj(self.pool, cr, uid, model_str, context=context)
return idref2
def _fix_multiple_roots(node):
"""
Surround the children of the ``node`` element of an XML field with a
@@ -90,72 +102,68 @@ def _eval_xml(self, node, pool, cr, uid, idref, context=None):
if context is None:
context = {}
if node.tag in ('field','value'):
t = node.get('type','char')
f_model = node.get('model', '').encode('utf-8')
if node.get('search'):
f_search = node.get("search",'').encode('utf-8')
f_use = node.get("use",'id').encode('utf-8')
f_name = node.get("name",'').encode('utf-8')
q = unsafe_eval(f_search, idref)
ids = pool.get(f_model).search(cr, uid, q)
if f_use != 'id':
ids = map(lambda x: x[f_use], pool.get(f_model).read(cr, uid, ids, [f_use]))
_cols = pool.get(f_model)._columns
if (f_name in _cols) and _cols[f_name]._type=='many2many':
return ids
f_val = False
if len(ids):
f_val = ids[0]
if isinstance(f_val, tuple):
f_val = f_val[0]
return f_val
a_eval = node.get('eval','')
if a_eval:
idref2 = dict(idref,
time=time,
DateTime=datetime,
timedelta=timedelta,
version=release.major_version,
ref=lambda x: self.id_get(cr, False, x),
pytz=pytz)
if len(f_model):
idref2['obj'] = _obj(self.pool, cr, uid, f_model, context=context)
try:
return unsafe_eval(a_eval, idref2)
except Exception:
logger = logging.getLogger('init')
logger.warning('could not eval(%s) for %s in %s' % (a_eval, node.get('name'), context), exc_info=True)
return ""
if t == 'xml':
def _process(s, idref):
m = re.findall('[^%]%\((.*?)\)[ds]', s)
for id in m:
if not id in idref:
idref[id]=self.id_get(cr, False, id)
return s % idref
_fix_multiple_roots(node)
return '<?xml version="1.0"?>\n'\
+_process("".join([etree.tostring(n, encoding='utf-8')
for n in node]),
idref)
if t in ('char', 'int', 'float'):
d = node.text
if t == 'int':
d = d.strip()
if d == 'None':
return None
else:
return int(d.strip())
elif t == 'float':
return float(d.strip())
return d
elif t in ('list','tuple'):
res=[]
for n in node.findall('./value'):
res.append(_eval_xml(self,n,pool,cr,uid,idref))
if t=='tuple':
return tuple(res)
return res
t = node.get('type','char')
f_model = node.get('model', '').encode('utf-8')
if node.get('search'):
f_search = node.get("search",'').encode('utf-8')
f_use = node.get("use",'id').encode('utf-8')
f_name = node.get("name",'').encode('utf-8')
idref2 = {}
if f_search:
idref2 = _get_idref(self, cr, uid, f_model, context, idref)
q = unsafe_eval(f_search, idref2)
ids = pool.get(f_model).search(cr, uid, q)
if f_use != 'id':
ids = map(lambda x: x[f_use], pool.get(f_model).read(cr, uid, ids, [f_use]))
_cols = pool.get(f_model)._columns
if (f_name in _cols) and _cols[f_name]._type=='many2many':
return ids
f_val = False
if len(ids):
f_val = ids[0]
if isinstance(f_val, tuple):
f_val = f_val[0]
return f_val
a_eval = node.get('eval','')
idref2 = {}
if a_eval:
idref2 = _get_idref(self, cr, uid, f_model, context, idref)
try:
return unsafe_eval(a_eval, idref2)
except Exception:
logger = logging.getLogger('init')
logger.warning('could not eval(%s) for %s in %s' % (a_eval, node.get('name'), context), exc_info=True)
return ""
if t == 'xml':
def _process(s, idref):
m = re.findall('[^%]%\((.*?)\)[ds]', s)
for id in m:
if not id in idref:
idref[id]=self.id_get(cr, False, id)
return s % idref
_fix_multiple_roots(node)
return '<?xml version="1.0"?>\n'\
+_process("".join([etree.tostring(n, encoding='utf-8')
for n in node]),
idref)
if t in ('char', 'int', 'float'):
d = node.text
if t == 'int':
d = d.strip()
if d == 'None':
return None
else:
return int(d.strip())
elif t == 'float':
return float(d.strip())
return d
elif t in ('list','tuple'):
res=[]
for n in node.findall('./value'):
res.append(_eval_xml(self,n,pool,cr,uid,idref))
if t=='tuple':
return tuple(res)
return res
elif node.tag == "getitem":
for n in node:
res=_eval_xml(self,n,pool,cr,uid,idref)
@@ -273,11 +281,13 @@ form: module.record_id""" % (xml_id,)
def _tag_delete(self, cr, rec, data_node=None):
d_model = rec.get("model",'')
d_search = rec.get("search",'')
d_search = rec.get("search",'').encode('utf-8')
d_id = rec.get("id",'')
ids = []
if d_search:
ids = self.pool.get(d_model).search(cr, self.uid, unsafe_eval(d_search))
idref = _get_idref(self, cr, self.uid, d_model, context={}, idref={})
ids = self.pool.get(d_model).search(cr, self.uid, unsafe_eval(d_search, idref))
if d_id:
try:
ids.append(self.id_get(cr, d_model, d_id))
@@ -655,7 +665,7 @@ form: module.record_id""" % (xml_id,)
self.pool.get('ir.model.data').ir_set(cr, self.uid, 'action', 'tree_but_open', 'Menuitem', [('ir.ui.menu', int(pid))], action, True, True, xml_id=rec_id)
return ('ir.ui.menu', pid)
def _assert_equals(self, f1, f2, prec = 4):
def _assert_equals(self, f1, f2, prec=4):
return not round(f1 - f2, prec)
def _tag_assert(self, cr, rec, data_node=None):
+3 -1
View File
@@ -164,7 +164,7 @@ d[types.InstanceType] = _copy_inst
del d
def deepcopy(x, memo=None, _nil=[]):
def deepcopy(x, memo=None, _nil=None):
"""Deep copy operation on arbitrary Python objects.
See the module's __doc__ string for more info.
@@ -172,6 +172,8 @@ def deepcopy(x, memo=None, _nil=[]):
if memo is None:
memo = {}
if _nil is None:
_nil = {}
d = id(x)
y = memo.get(d, _nil)
+21 -4
View File
@@ -1,8 +1,9 @@
# -*- coding: utf-8 -*-
##############################################################################
#
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
# Copyright (C) 2010 OpenERP s.a. (<http://openerp.com>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@@ -15,17 +16,17 @@
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
__all__ = ['partial', 'wraps', 'update_wrapper']
__all__ = ['partial', 'wraps', 'update_wrapper', 'synchronized']
try:
from functools import partial, wraps, update_wrapper
except ImportError:
# The functools module doesn't exist in python < 2.5
# Code taken from python 2.5
# Code taken from python 2.5
# http://svn.python.org/view/python/tags/r254/Lib/functools.py?view=markup
def partial(fun, *args, **kwargs):
@@ -76,3 +77,19 @@ except ImportError:
return partial(update_wrapper, wrapped=wrapped,
assigned=assigned, updated=updated)
def synchronized(lock_attr='_lock'):
def decorator(func):
@wraps(func)
def wrapper(self, *args, **kwargs):
lock = getattr(self, lock_attr)
try:
lock.acquire()
return func(self, *args, **kwargs)
finally:
lock.release()
return wrapper
return decorator
+115
View File
@@ -0,0 +1,115 @@
# -*- coding: utf-8 -*-
# taken from http://code.activestate.com/recipes/252524-length-limited-o1-lru-cache-implementation/
import threading
from func import synchronized
__all__ = ['LRU']
class LRUNode(object):
__slots__ = ['prev', 'next', 'me']
def __init__(self, prev, me):
self.prev = prev
self.me = me
self.next = None
class LRU:
"""
Implementation of a length-limited O(1) LRU queue.
Built for and used by PyPE:
http://pype.sourceforge.net
Copyright 2003 Josiah Carlson.
"""
def __init__(self, count, pairs=[]):
self._lock = threading.RLock()
self.count = max(count, 1)
self.d = {}
self.first = None
self.last = None
for key, value in pairs:
self[key] = value
@synchronized()
def __contains__(self, obj):
return obj in self.d
@synchronized()
def __getitem__(self, obj):
a = self.d[obj].me
self[a[0]] = a[1]
return a[1]
@synchronized()
def __setitem__(self, obj, val):
if obj in self.d:
del self[obj]
nobj = LRUNode(self.last, (obj, val))
if self.first is None:
self.first = nobj
if self.last:
self.last.next = nobj
self.last = nobj
self.d[obj] = nobj
if len(self.d) > self.count:
if self.first == self.last:
self.first = None
self.last = None
return
a = self.first
a.next.prev = None
self.first = a.next
a.next = None
del self.d[a.me[0]]
del a
@synchronized()
def __delitem__(self, obj):
nobj = self.d[obj]
if nobj.prev:
nobj.prev.next = nobj.next
else:
self.first = nobj.next
if nobj.next:
nobj.next.prev = nobj.prev
else:
self.last = nobj.prev
del self.d[obj]
@synchronized()
def __iter__(self):
cur = self.first
while cur != None:
cur2 = cur.next
yield cur.me[1]
cur = cur2
@synchronized()
def __len__(self):
return len(self.d)
@synchronized()
def iteritems(self):
cur = self.first
while cur != None:
cur2 = cur.next
yield cur.me
cur = cur2
@synchronized()
def iterkeys(self):
return iter(self.d)
@synchronized()
def itervalues(self):
for i,j in self.iteritems():
yield j
@synchronized()
def keys(self):
return self.d.keys()
@synchronized()
def pop(self,key):
v=self[key]
del self[key]
return v
+7 -7
View File
@@ -40,7 +40,6 @@ from email.MIMEBase import MIMEBase
from email.MIMEMultipart import MIMEMultipart
from email.Header import Header
from email.Utils import formatdate, COMMASPACE
from email.Utils import formatdate, COMMASPACE
from email import Encoders
from itertools import islice, izip
from which import which
@@ -51,6 +50,7 @@ else:
import netsvc
from config import config
from lru import LRU
_logger = logging.getLogger('tools')
@@ -432,7 +432,7 @@ def _email_send(smtp_from, smtp_to_list, message, openobject_id=None, ssl=False,
from mailbox import Maildir
maildir_path = smtp_server[8:]
mdir = Maildir(maildir_path,factory=None, create = True)
mdir.add(msg.as_string(True))
mdir.add(message.as_string(True))
return True
oldstderr = smtplib.stderr
@@ -697,7 +697,7 @@ class cache(object):
__caches = []
def __init__(self, timeout=None, skiparg=2, multi=None):
def __init__(self, timeout=None, skiparg=2, multi=None, size=8192):
assert skiparg >= 2 # at least self and cr
if timeout is None:
self.timeout = config['cache_timeout']
@@ -706,7 +706,7 @@ class cache(object):
self.skiparg = skiparg
self.multi = multi
self.lasttime = time.time()
self.cache = {}
self.cache = LRU(size) # TODO take size from config
self.fun = None
cache.__caches.append(self)
@@ -864,14 +864,14 @@ def ustr(value, hint_encoding='utf-8'):
try:
return unicode(value)
except Exception:
raise UnicodeError('unable de to convert %r' % (value,))
raise UnicodeError('unable to convert %r' % (value,))
for ln in get_encodings(hint_encoding):
try:
return unicode(value, ln)
except Exception:
pass
raise UnicodeError('unable de to convert %r' % (value,))
raise UnicodeError('unable to convert %r' % (value,))
def exception_to_unicode(e):
@@ -1408,7 +1408,7 @@ def upload_data(email, data, type='SURVEY'):
return True
# port of python 2.6's attrgetter with support for dotted notation
# port of python 2.6's attrgetter with support for dotted notation
def resolve_attr(obj, attr):
for name in attr.split("."):
obj = getattr(obj, name)
+24 -6
View File
@@ -33,8 +33,10 @@ without flatten, one could further edit the resulting form.
with flatten, everything is turned into text.
"""
from __future__ import with_statement
import os
import netsvc,logging
import tempfile
HEAD="""%FDF-1.2
@@ -58,7 +60,7 @@ trailer
%%EOF
"""
def output_field( f ):
def output_field(f):
return "\xfe\xff" + "".join( [ "\x00"+c for c in f ] )
def extract_keys(lines):
@@ -91,14 +93,30 @@ def write_fields(out, fields):
def extract_keys_from_pdf(filename):
# what about using 'pdftk filename dump_data_fields' and parsing the output ?
os.system('pdftk %s generate_fdf output /tmp/toto.fdf' % filename)
lines = file('/tmp/toto.fdf').readlines()
tmp_file = tempfile.mkstemp(".fdf")[1]
try:
os.system('pdftk %s generate_fdf output \"%s\"' % (filename, tmp_file))
with open(tmp_file, "r") as ofile:
lines = ofile.readlines()
finally:
try:
os.remove(tmp_file)
except Exception:
pass # nothing to do
return extract_keys(lines)
def fill_pdf(infile, outfile, fields):
write_fields(file('/tmp/toto.fdf', 'w'), fields)
os.system('pdftk %s fill_form /tmp/toto.fdf output %s flatten' % (infile, outfile))
tmp_file = tempfile.mkstemp(".fdf")[1]
try:
with open(tmp_file, "w") as ofile:
write_fields(ofile, fields)
os.system('pdftk %s fill_form \"%s\" output %s flatten' % (infile, tmp_file, outfile))
finally:
try:
os.remove(tmp_file)
except Exception:
pass # nothing to do
def testfill_pdf(infile, outfile):
keys = extract_keys_from_pdf(infile)
+6 -3
View File
@@ -54,9 +54,12 @@ _EXPR_OPCODES = _CONST_OPCODES.union(set(opmap[x] for x in [
_SAFE_OPCODES = _EXPR_OPCODES.union(set(opmap[x] for x in [
'STORE_MAP', 'LOAD_NAME', 'CALL_FUNCTION', 'COMPARE_OP', 'LOAD_ATTR',
'STORE_NAME', 'GET_ITER', 'FOR_ITER', 'LIST_APPEND', 'JUMP_ABSOLUTE',
'DELETE_NAME', 'JUMP_IF_TRUE', 'JUMP_IF_FALSE','MAKE_FUNCTION','JUMP_FORWARD',
'SLICE+0', 'SLICE+1', 'SLICE+2', 'SLICE+3'
'STORE_NAME', 'GET_ITER', 'FOR_ITER', 'LIST_APPEND', 'DELETE_NAME',
'JUMP_FORWARD', 'JUMP_IF_TRUE', 'JUMP_IF_FALSE', 'JUMP_ABSOLUTE',
'MAKE_FUNCTION', 'SLICE+0', 'SLICE+1', 'SLICE+2', 'SLICE+3',
# New in Python 2.7 - http://bugs.python.org/issue4715 :
'JUMP_IF_FALSE_OR_POP', 'JUMP_IF_TRUE_OR_POP', 'POP_JUMP_IF_FALSE',
'POP_JUMP_IF_TRUE'
] if x in opmap))
_logger = logging.getLogger('safe_eval')
+69 -40
View File
@@ -200,6 +200,23 @@ class GettextAlias(object):
_ = GettextAlias()
def quote(s):
"""Returns quoted PO term string, with special PO characters escaped"""
assert r"\n" not in s, "Translation terms may not include escaped newlines ('\\n'), please use only literal newlines! (in '%s')" % s
return '"%s"' % s.replace('\\','\\\\') \
.replace('"','\\"') \
.replace('\n', '\\n"\n"')
re_escaped_char = re.compile(r"(\\.)")
re_escaped_replacements = {'n': '\n', }
def _sub_replacement(match_obj):
return re_escaped_replacements.get(match_obj.group(1)[1], match_obj.group(1)[1])
def unquote(str):
"""Returns unquoted PO term string, with special PO characters unescaped"""
return re_escaped_char.sub(_sub_replacement, str[1:-1])
# class to handle po files
class TinyPoFile(object):
def __init__(self, buffer):
@@ -231,11 +248,6 @@ class TinyPoFile(object):
return (self.lines_count - len(self.lines))
def next(self):
def unquote(str):
return str[1:-1].replace("\\n", "\n") \
.replace("\\\\ ", "\\ ") \
.replace('\\"', '"')
type = name = res_id = source = trad = None
if self.tnrs:
@@ -337,11 +349,6 @@ class TinyPoFile(object):
)
def write(self, modules, tnrs, source, trad):
def quote(s):
return '"%s"' % s.replace('"','\\"') \
.replace('\n', '\\n"\n"') \
.replace(' \\ ',' \\\\ ')
plurial = len(modules) > 1 and 's' or ''
self.buffer.write("#. module%s: %s\n" % (plurial, ', '.join(modules)))
@@ -654,29 +661,21 @@ def trans_generate(lang, modules, dbname=None):
# parse source code for _() calls
def get_module_from_path(path, mod_paths=None):
# if not mod_paths:
## First, construct a list of possible paths
# def_path = os.path.abspath(os.path.join(tools.config['root_path'], 'addons')) # default addons path (base)
# ad_paths= map(lambda m: os.path.abspath(m.strip()),tools.config['addons_path'].split(','))
# mod_paths=[def_path]
# for adp in ad_paths:
# mod_paths.append(adp)
# if not adp.startswith('/'):
# mod_paths.append(os.path.join(def_path,adp))
# elif adp.startswith(def_path):
# mod_paths.append(adp[len(def_path)+1:])
# for mp in mod_paths:
# if path.startswith(mp) and (os.path.dirname(path) != mp):
# path = path[len(mp)+1:]
# return path.split(os.path.sep)[0]
path_dir = os.path.dirname(path[1:])
if path_dir:
if os.path.exists(os.path.join(tools.config['addons_path'],path[1:])):
return path.split(os.path.sep)[1]
else:
root_addons = os.path.join(tools.config['root_path'], 'addons')
if os.path.exists(os.path.join(root_addons,path[1:])):
return path.split(os.path.sep)[1]
if not mod_paths:
# First, construct a list of possible paths
def_path = os.path.abspath(os.path.join(tools.config['root_path'], 'addons')) # default addons path (base)
ad_paths= map(lambda m: os.path.abspath(m.strip()),tools.config['addons_path'].split(','))
mod_paths=[def_path]
for adp in ad_paths:
mod_paths.append(adp)
if not os.path.isabs(adp):
mod_paths.append(adp)
elif adp.startswith(def_path):
mod_paths.append(adp[len(def_path)+1:])
for mp in mod_paths:
if path.startswith(mp) and (os.path.dirname(path) != mp):
path = path[len(mp)+1:]
return path.split(os.path.sep)[0]
return 'base' # files that are not in a module are considered as being in 'base' module
modobj = pool.get('ir.module.module')
@@ -685,25 +684,55 @@ def trans_generate(lang, modules, dbname=None):
root_path = os.path.join(tools.config['root_path'], 'addons')
if root_path in tools.config['addons_path'] :
path_list = [root_path]
apaths = map(os.path.abspath, map(str.strip, tools.config['addons_path'].split(',')))
if root_path in apaths:
path_list = apaths
else :
path_list = [root_path,tools.config['addons_path']]
path_list = [root_path,] + apaths
logger.notifyChannel("i18n", netsvc.LOG_DEBUG, "Scanning modules at paths: %s" % (' '.join(path_list),))
mod_paths = []
join_dquotes = re.compile(r'([^\\])"[\s\\]*"', re.DOTALL)
join_quotes = re.compile(r'([^\\])\'[\s\\]*\'', re.DOTALL)
re_dquotes = re.compile(r'[^a-zA-Z0-9_]_\([\s]*"(.+?)"[\s]*?\)', re.DOTALL)
re_quotes = re.compile(r'[^a-zA-Z0-9_]_\([\s]*\'(.+?)\'[\s]*?\)', re.DOTALL)
def export_code_terms_from_file(fname, path, root, terms_type):
fabsolutepath = join(root, fname)
frelativepath = fabsolutepath[len(path):]
module = get_module_from_path(frelativepath)
module = get_module_from_path(fabsolutepath, mod_paths=mod_paths)
is_mod_installed = module in installed_modules
if (('all' in modules) or (module in modules)) and is_mod_installed:
logger.notifyChannel("i18n", netsvc.LOG_DEBUG, "Scanning code of %s at module: %s" % (frelativepath, module))
code_string = tools.file_open(fabsolutepath, subdir='').read()
iter = re.finditer('[^a-zA-Z0-9_]_\([\s]*["\'](.+?)["\'][\s]*\)', code_string, re.S)
if module in installed_modules:
frelativepath = str("addons" + frelativepath)
for i in iter:
push_translation(module, terms_type, frelativepath, 0, encode(i.group(1)))
ite = re_dquotes.finditer(code_string)
for i in ite:
src = i.group(1)
if src.startswith('""'):
assert src.endswith('""'), "Incorrect usage of _(..) function (should contain only literal strings!) in file %s near: %s" % (frelativepath, src[:30])
src = src[2:-2]
else:
src = join_dquotes.sub(r'\1', src)
# now, since we did a binary read of a python source file, we
# have to expand pythonic escapes like the interpreter does.
src = src.decode('string_escape')
push_translation(module, terms_type, frelativepath, 0, encode(src))
ite = re_quotes.finditer(code_string)
for i in ite:
src = i.group(1)
if src.startswith("''"):
assert src.endswith("''"), "Incorrect usage of _(..) function (should contain only literal strings!) in file %s near: %s" % (frelativepath, src[:30])
src = src[2:-2]
else:
src = join_quotes.sub(r'\1', src)
src = src.decode('string_escape')
push_translation(module, terms_type, frelativepath, 0, encode(src))
for path in path_list:
logger.notifyChannel("i18n", netsvc.LOG_DEBUG, "Scanning files of modules at %s" % path)
for root, dummy, files in tools.osutil.walksymlinks(path):
for fname in itertools.chain(fnmatch.filter(files, '*.py')):
export_code_terms_from_file(fname, path, root, 'code')
+1 -1
View File
@@ -162,7 +162,7 @@ License: GPL-2+
On Debian systems, the complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-2 file.
Files: bin/addons/l10n_chart_uk_minimal/*
Files: bin/addons/l10n_uk/*
Copyright:
(C) 2004-2008 Tiny.be <info@tiny.be>
(C) 2004-2008 Seath Solutions Ltd.
+42
View File
@@ -0,0 +1,42 @@
# Brazilian Portuguese translation for openobject-server
# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
# This file is distributed under the same license as the openobject-server package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-server\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-24 22:41+0300\n"
"PO-Revision-Date: 2010-11-07 07:06+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-11-08 05:11+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. Type: string
#. Description
#: ../openerp-server.templates:1001
msgid "Dedicated system account for the Open ERP server:"
msgstr "Conta do sistema dedicada para o servidor de Open ERP:"
#. Type: string
#. Description
#: ../openerp-server.templates:1001
msgid ""
"The Open ERP server must use a dedicated account for its operation so that "
"the system's security is not compromised by running it with superuser "
"privileges."
msgstr ""
"O servidor Open ERP deve usar uma conta específica para o seu funcionamento "
"de modo que a segurança do sistema não seja comprometida por executá-lo com "
"privilégios de super usuário."
#. Type: string
#. Description
#: ../openerp-server.templates:1001
msgid "Please choose that account's username."
msgstr "Escolha um usuário para a conta"
+7 -5
View File
@@ -8,20 +8,20 @@ msgstr ""
"Project-Id-Version: openobject-server\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-24 22:41+0300\n"
"PO-Revision-Date: 2010-07-21 07:32+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2010-11-15 08:27+0000\n"
"Last-Translator: OpenERP Administrators <Unknown>\n"
"Language-Team: Serbian <sr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-09-29 04:47+0000\n"
"X-Launchpad-Export-Date: 2010-11-16 05:05+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. Type: string
#. Description
#: ../openerp-server.templates:1001
msgid "Dedicated system account for the Open ERP server:"
msgstr ""
msgstr "Namenski sistem naloga za OpenERP Server:"
#. Type: string
#. Description
@@ -31,9 +31,11 @@ msgid ""
"the system's security is not compromised by running it with superuser "
"privileges."
msgstr ""
"OpenERP server mora koristiti namenski nalog ya svoje operacije tako da "
"sigurnosni sistem nije kompromitovan pri radu sa superUser privilegijama."
#. Type: string
#. Description
#: ../openerp-server.templates:1001
msgid "Please choose that account's username."
msgstr ""
msgstr "Molim vas izaberite korisničko ime naloga."
+3
View File
@@ -21,6 +21,9 @@ for rendering workflows graphs, you need:
* graphviz
* pyparsing
For Luxembourg localization, you also need:
* pdftk (http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/)
for generating reports using non .jpg images, you need:
* Python Imaging Library for python
+1 -1
View File
@@ -37,7 +37,7 @@ profiles = [
'profile_manufacturing'
]
l10n_charts = [
'l10n_chart_uk_minimal',
'l10n_uk',
False,
'l10n_be',
'l10n_fr'