[MERGE] Sync with trunk.

bzr revid: tde@openerp.com-20121220091858-ye1t25614ajfv4zl
This commit is contained in:
Thibault Delavallée
2012-12-20 10:18:58 +01:00
17 changed files with 1704 additions and 537 deletions
-5
View File
@@ -93,16 +93,11 @@ The kernel of OpenERP, needed for all installation.
'res/res_partner_image_demo.xml',
],
'test': [
'test/base_test.xml',
'test/base_test.yml',
'test/test_context.xml',
'test/bug_lp541545.xml',
'test/test_osv_expression.yml',
'test/test_ir_rule.yml', # <-- These tests modify/add/delete ir_rules.
# Commented because this takes some time.
# This must be (un)commented with the corresponding import statement
# in test/__init__.py.
# 'test/test_ir_cron.yml', # <-- These tests perform a roolback.
],
'installable': True,
'auto_install': True,
+10 -3
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-server\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-12-03 16:01+0000\n"
"PO-Revision-Date: 2012-12-17 20:41+0000\n"
"PO-Revision-Date: 2012-12-19 19:54+0000\n"
"Last-Translator: David Bowers <sales@skitzotek.com>\n"
"Language-Team: English (United Kingdom) <en_GB@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: 2012-12-18 04:58+0000\n"
"X-Generator: Launchpad (build 16372)\n"
"X-Launchpad-Export-Date: 2012-12-20 04:42+0000\n"
"X-Generator: Launchpad (build 16378)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -4199,6 +4199,13 @@ msgid ""
"invite.\n"
"\n"
msgstr ""
"\n"
"This module updates memos inside OpenERP when using an external pad\n"
"=====================================================================\n"
"\n"
"Use to update your text memo in real time with a user following that you "
"invite.\n"
"\n"
#. module: base
#: code:addons/base/module/module.py:609
File diff suppressed because it is too large Load Diff
+35 -10
View File
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0.0-rc1\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-03 16:01+0000\n"
"PO-Revision-Date: 2012-11-05 00:42+0000\n"
"PO-Revision-Date: 2012-12-20 02:14+0000\n"
"Last-Translator: Cristian Salamea (Gnuthink) <ovnicraft@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: 2012-12-04 05:03+0000\n"
"X-Generator: Launchpad (build 16335)\n"
"X-Launchpad-Export-Date: 2012-12-20 04:43+0000\n"
"X-Generator: Launchpad (build 16378)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -24,6 +24,10 @@ msgid ""
"================================================\n"
" "
msgstr ""
"\n"
"Módulo para la emisión e impresión de cheques\n"
"================================================\n"
" "
#. module: base
#: model:res.country,name:base.sh
@@ -59,7 +63,7 @@ msgstr "Código vista"
#. module: base
#: model:ir.module.module,summary:base.module_sale_stock
msgid "Quotation, Sale Orders, Delivery & Invoicing Control"
msgstr ""
msgstr "Presupuesto, órdenes de venta, entrega y control de facturación"
#. module: base
#: selection:ir.sequence,implementation:0
@@ -88,12 +92,12 @@ msgstr ""
#. module: base
#: model:ir.module.module,summary:base.module_point_of_sale
msgid "Touchscreen Interface for Shops"
msgstr ""
msgstr "Interfaz de pantalla táctil para tiendas"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
msgid "Indian Payroll"
msgstr ""
msgstr "Nomina de la India"
#. module: base
#: help:ir.cron,model:0
@@ -123,6 +127,17 @@ msgid ""
" * Product Attributes\n"
" "
msgstr ""
"\n"
"Módulo que añade fabricantes y atributos en el formulario de producto.\n"
"===========================================================\n"
"\n"
"Puede definir los siguientes campos para un producto:\n"
"-------------------------------------------------\n"
"* Fabricante\n"
"* Nombre del producto del fabricante\n"
"* Código del producto del fabricante\n"
"* Atributos del producto\n"
" "
#. module: base
#: field:ir.actions.client,params:0
@@ -136,11 +151,14 @@ msgid ""
"The module adds google user in res user.\n"
"========================================\n"
msgstr ""
"\n"
"El módulo añade usuarios Google al registro de usuarios\n"
"============================================\n"
#. module: base
#: help:res.partner,employee:0
msgid "Check this box if this contact is an Employee."
msgstr ""
msgstr "Marque si el contacto es un empleado"
#. module: base
#: help:ir.model.fields,domain:0
@@ -171,7 +189,7 @@ msgstr "Ventana destino"
#. module: base
#: field:ir.actions.report.xml,report_rml:0
msgid "Main Report File Path"
msgstr ""
msgstr "Ruta de archivo del informe principal"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_analytic_plans
@@ -269,7 +287,7 @@ msgstr "creado."
#. module: base
#: field:ir.actions.report.xml,report_xsl:0
msgid "XSL Path"
msgstr ""
msgstr "Ruta XSL"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_tr
@@ -295,7 +313,7 @@ msgstr "Inuktitut / ᐃᓄᒃᑎᑐᑦ"
#. module: base
#: model:res.groups,name:base.group_multi_currency
msgid "Multi Currencies"
msgstr ""
msgstr "Multimoneda"
#. module: base
#: model:ir.module.module,description:base.module_l10n_cl
@@ -307,6 +325,12 @@ msgid ""
"\n"
" "
msgstr ""
"\n"
"Plan de cuentas y localización de impuestos chilenos.\n"
"==============================================\n"
"Plan contable chileno e impuestos de acuerdo a disposiciones vigentes\n"
"\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale
@@ -319,6 +343,7 @@ msgid ""
"The internal user that is in charge of communicating with this contact if "
"any."
msgstr ""
"El usuario interno encargado de comunicarse con este contacto si lo hubiese."
#. module: base
#: view:res.partner:0
+27 -27
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: 2012-12-03 16:01+0000\n"
"PO-Revision-Date: 2012-12-18 22:00+0000\n"
"PO-Revision-Date: 2012-12-19 19:49+0000\n"
"Last-Translator: Ahti Hinnov <sipelgas@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: 2012-12-19 05:13+0000\n"
"X-Launchpad-Export-Date: 2012-12-20 04:41+0000\n"
"X-Generator: Launchpad (build 16378)\n"
#. module: base
@@ -531,7 +531,7 @@ msgstr "Kuupäeva vorming"
#. module: base
#: model:ir.module.module,shortdesc:base.module_base_report_designer
msgid "OpenOffice Report Designer"
msgstr ""
msgstr "OpenOffice aruande kujundaja"
#. module: base
#: model:res.country,name:base.an
@@ -980,7 +980,7 @@ msgstr ""
#. module: base
#: view:res.users:0
msgid "Email Preferences"
msgstr ""
msgstr "E-posti seadistused"
#. module: base
#: code:addons/base/ir/ir_fields.py:196
@@ -1571,7 +1571,7 @@ msgstr ""
#. module: base
#: view:res.company:0
msgid "Report Footer Configuration"
msgstr ""
msgstr "Aruande jaluse seadistamine"
#. module: base
#: field:ir.translation,comments:0
@@ -1951,7 +1951,7 @@ msgstr "Lisatud mudel"
#. module: base
#: field:res.partner.bank,footer:0
msgid "Display on Reports"
msgstr ""
msgstr "Kuva aruannetes"
#. module: base
#: model:ir.module.module,description:base.module_project_timesheet
@@ -2144,7 +2144,7 @@ msgstr "Hispaania / Español"
#. module: base
#: selection:base.language.install,lang:0
msgid "Korean (KP) / 한국어 (KP)"
msgstr ""
msgstr "Korea (KP) / 한국어 (KP)"
#. module: base
#: model:res.country,name:base.ax
@@ -2487,7 +2487,7 @@ msgstr ""
#. module: base
#: field:res.company,rml_header1:0
msgid "Company Slogan"
msgstr ""
msgstr "Ettevõtte loosung"
#. module: base
#: model:res.country,name:base.bb
@@ -2537,7 +2537,7 @@ msgstr "Kreeka / Ελληνικά"
#. module: base
#: field:res.company,custom_footer:0
msgid "Custom Footer"
msgstr ""
msgstr "Kohandatud jalus"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_crm
@@ -2593,7 +2593,7 @@ msgstr "Arveldus"
#. module: base
#: field:ir.ui.view_sc,name:0
msgid "Shortcut Name"
msgstr "Kiirkorralduse nimi"
msgstr "Otsetee nimi"
#. module: base
#: field:res.partner,contact_address:0
@@ -3009,7 +3009,7 @@ msgstr "Norfolki saar"
#. module: base
#: selection:base.language.install,lang:0
msgid "Korean (KR) / 한국어 (KR)"
msgstr ""
msgstr "Korea (KR) / 한국어 (KR)"
#. module: base
#: help:ir.model.fields,model:0
@@ -3636,7 +3636,7 @@ msgstr ""
#: field:res.company,rml_footer:0
#: field:res.company,rml_footer_readonly:0
msgid "Report Footer"
msgstr ""
msgstr "Aruande jalus"
#. module: base
#: selection:res.lang,direction:0
@@ -3868,7 +3868,7 @@ msgstr "Peata kõik"
#. module: base
#: field:res.company,paper_format:0
msgid "Paper Format"
msgstr ""
msgstr "Paberi formaat"
#. module: base
#: model:ir.module.module,description:base.module_note_pad
@@ -4714,7 +4714,7 @@ msgstr ""
#. module: base
#: selection:base.language.install,lang:0
msgid "Portuguese (BR) / Português (BR)"
msgstr ""
msgstr "Portugali (BR) / Português (BR)"
#. module: base
#: model:ir.model,name:base.model_ir_needaction_mixin
@@ -5154,7 +5154,7 @@ msgstr ""
#. module: base
#: view:res.company:0
msgid "Preview Header/Footer"
msgstr ""
msgstr "Päise/jaluse eelvaade"
#. module: base
#: field:ir.ui.menu,parent_id:0
@@ -5841,7 +5841,7 @@ msgstr ""
#. module: base
#: view:ir.ui.view_sc:0
msgid "Shortcut"
msgstr "Lühend"
msgstr "Otsetee"
#. module: base
#: field:ir.model.data,date_init:0
@@ -6718,7 +6718,7 @@ msgstr ""
#. module: base
#: selection:res.currency,position:0
msgid "After Amount"
msgstr ""
msgstr "Peale summat"
#. module: base
#: selection:base.language.install,lang:0
@@ -7044,7 +7044,7 @@ msgstr "Mitmel dokumendil"
#: view:res.users:0
#: view:wizard.ir.model.menu.create:0
msgid "or"
msgstr ""
msgstr "või"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_accountant
@@ -7608,7 +7608,7 @@ msgstr "Kohandatud väli"
#. module: base
#: model:ir.module.module,summary:base.module_account_accountant
msgid "Financial and Analytic Accounting"
msgstr ""
msgstr "Finants- ja analüütiline raamatupidamine"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_project
@@ -7708,7 +7708,7 @@ msgstr ""
#. module: base
#: model:res.partner.bank.type,name:base.bank_normal
msgid "Normal Bank Account"
msgstr ""
msgstr "Tavaline pangakonto"
#. module: base
#: view:ir.actions.wizard:0
@@ -7980,7 +7980,7 @@ msgstr "Tühista eemaldus"
#. module: base
#: view:res.bank:0
msgid "Communication"
msgstr "Suhtlemine"
msgstr "Kontakt"
#. module: base
#: model:ir.module.module,shortdesc:base.module_analytic
@@ -9571,7 +9571,7 @@ msgstr "Paigaldamise ootel"
#: model:ir.module.module,shortdesc:base.module_base
#: field:res.currency,base:0
msgid "Base"
msgstr "Baas"
msgstr "Alus"
#. module: base
#: field:ir.model.data,model:0
@@ -9660,7 +9660,7 @@ msgstr "Minutid"
#. module: base
#: view:res.currency:0
msgid "Display"
msgstr ""
msgstr "Kuvamine"
#. module: base
#: model:res.groups,name:base.group_multi_company
@@ -12471,7 +12471,7 @@ msgstr "Küpros"
#. module: base
#: field:res.users,new_password:0
msgid "Set Password"
msgstr ""
msgstr "Määra salasõna"
#. module: base
#: field:ir.actions.server,subject:0
@@ -12503,7 +12503,7 @@ msgstr ""
#. module: base
#: selection:res.currency,position:0
msgid "Before Amount"
msgstr ""
msgstr "Enne summat"
#. module: base
#: field:res.request,act_from:0
@@ -12572,7 +12572,7 @@ msgstr ""
#. module: base
#: field:res.company,company_registry:0
msgid "Company Registry"
msgstr "Ettevõtte register"
msgstr "Ettevõtte registrikood"
#. module: base
#: view:ir.actions.report.xml:0
@@ -12917,7 +12917,7 @@ msgstr "Zaire"
#. module: base
#: model:ir.module.module,summary:base.module_project
msgid "Projects, Tasks"
msgstr ""
msgstr "Projektid, ülesanded"
#. module: base
#: field:workflow.instance,res_id:0
+5 -5
View File
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-03 16:01+0000\n"
"PO-Revision-Date: 2012-12-17 20:19+0000\n"
"PO-Revision-Date: 2012-12-19 20:48+0000\n"
"Last-Translator: Goran Kliska <gkliska@gmail.com>\n"
"Language-Team: openerp-translators\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-12-18 04:58+0000\n"
"X-Generator: Launchpad (build 16372)\n"
"X-Launchpad-Export-Date: 2012-12-20 04:42+0000\n"
"X-Generator: Launchpad (build 16378)\n"
"Language: hr\n"
#. module: base
@@ -714,7 +714,7 @@ msgstr "Palau"
#. module: base
#: view:res.partner:0
msgid "Sales & Purchases"
msgstr "Prodaja i naručivanje"
msgstr "Prodaja i nabava"
#. module: base
#: view:ir.translation:0
@@ -1511,7 +1511,7 @@ msgstr ""
#: model:ir.module.category,name:base.module_category_purchase_management
#: model:ir.ui.menu,name:base.menu_purchase_root
msgid "Purchases"
msgstr "Nabave"
msgstr "Nabava"
#. module: base
#: model:res.country,name:base.md
+281 -15
View File
@@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-03 16:01+0000\n"
"PO-Revision-Date: 2012-12-18 17:37+0000\n"
"PO-Revision-Date: 2012-12-19 16:59+0000\n"
"Last-Translator: krnkris <Unknown>\n"
"Language-Team: Hungarian <openerp-hungarian-team@lists.launchpad.net>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-12-19 05:14+0000\n"
"X-Launchpad-Export-Date: 2012-12-20 04:41+0000\n"
"X-Generator: Launchpad (build 16378)\n"
#. module: base
@@ -251,6 +251,35 @@ msgid ""
"* Planned Revenue by Stage and User (graph)\n"
"* Opportunities by Stage (graph)\n"
msgstr ""
"\n"
"Az alapértelemezett OpenERP CRM Ügyfélkapcsolat-kezelés\n"
"=====================================================\n"
"\n"
"Ez az alkalmazás lehetővé teszi egy csoportnak, hogy inteligensen és "
"hatékonyan kezelje a vezetői gyűléseket, lehetőségeket, találkozókat és "
"telefonokat.\n"
"\n"
"Kezeli a kulcsfontosságú munkákat mint kommunikáció, azonosítás, kiosztás, "
"felosztás és értesítés.\n"
"\n"
"OpenERP biztosítja, hogy minden esetben nyomon követhetőek legyenek a "
"felhasználók, vásárlók és beszállítók. Autómatikusan küldhető emlékeztető, "
"kiterjezti az igényt, bekapcsol speciális eszközt és még több cselekvésen "
"alapuló módot, melyet a vállalkozása szabályaira szabhat.\n"
"\n"
"A legnayobb dolog ebben a rendszerben, hgoy a felhasználónak nem kell semmi "
"speciálisat véghezvinnie. A CRM modulnak van egy e-amil átjárója ami "
"szinkronizálja az e-maileket az OpenERP által. Így, a felhasználók e-"
"maileket küldhetnek az igénylés helyére.\n"
"\n"
"OpenERP törődni fog az üzenetek megköszönésével, automatikusan átirányítva a "
"megfelelő osztályhoz, biztosítva a jövőbeni munkafolyamat megfelő helyét.\n"
"\n"
"\n"
"Dashboard / irányítópult a CRM-ben, ezt is beleértve:\n"
"-------------------------------\n"
"* Tervezett bevétel szintek és felhasználók szerint (grafikon)\n"
"* Lehetőségek szintenként (grafikon)\n"
#. module: base
#: code:addons/base/ir/ir_model.py:397
@@ -5753,6 +5782,23 @@ msgid ""
"since it's the same which has been renamed.\n"
" "
msgstr ""
"\n"
"Ez a modul lehetővé teszi a felhasználók részére a partnerek leválogatását.\n"
"=================================================================\n"
"\n"
"A profil kritériumokat használja az előző leválogató modulból ami fel lett "
"javítva. \n"
"Köszönhető az új felfogású kikérdezőnek. Újra tudja csoportosítani a "
"kérdéseket\n"
"egy kikérdezőbe és direkt használhatja azokat a partnerekhez.\n"
"\n"
"Össze lett kapcsolva az előző CRM & SRM leválogatás eszközzel mivel ezek át "
"lettek fedve.\n"
"\n"
" **Megjegyzés** ez a modul nem kompatibilis a leválogató modullal, mivel "
"ez ugyanaz, csak más \n"
"másként lett elnevezve.\n"
" "
#. module: base
#: model:res.country,name:base.gt
@@ -6358,7 +6404,7 @@ msgstr "Man Sziget"
#. module: base
#: help:ir.actions.client,res_model:0
msgid "Optional model, mostly used for needactions."
msgstr ""
msgstr "Választható modell, főként szükséges műveletekhez használják."
#. module: base
#: field:ir.attachment,create_uid:0
@@ -6523,6 +6569,58 @@ msgid ""
" * Zip return for separated PDF\n"
" * Web client WYSIWYG\n"
msgstr ""
"\n"
"Ez a modul hozzáad egy Kimutatás motort WebKit könyvtárt alapul véve "
"(wkhtmltopdf) a HTML +CCS megalkotott kimutatások támogatásához.\n"
"============================================================================="
"========================================\n"
"\n"
"A modul felépítését és egy pár kódolást a report_openoffice modul "
"ösztönözte.\n"
"\n"
"A modul lehetővé teszi:\n"
"------------------\n"
" - HTML kimutatás meghatározását\n"
" - Többszörös fejléc támogatása\n"
" - Többszörös logó használat\n"
" - Többszörös vállalat támogatás\n"
" - HTML és CSS-3 támogatás (az aktuális WebKIT verzió határain belül)\n"
" - JavaScript támogatás\n"
" - Nyers HTML debugger\n"
" - Könyv nyomtatási lehetőség\n"
" - Margó meghatározás\n"
" - Papír méret meghatározás\n"
"\n"
"Többszörös fejléc és logó meghatározható vállalatonként. CCS stílus, fejléc "
"és\n"
"lábjegyzet meghatározható vállalatonként.\n"
"\n"
"Például kimutatást megtekinthet webkit_report_sample modulban, és ebben a "
"videóban:\n"
" http://files.me.com/nbessi/06n92k.mov\n"
"\n"
"Követelmények és telepítés:\n"
"------------------------------\n"
"Ehhez a modulhoz kell a ``wkthtmltopdf`` könyvtár a HTML dokumentumok PDF "
"ábrázolásához.\n"
"Verzió 0.9.9 vagy későbbi szükséges, és megtalálható a \n"
"http://code.google.com/p/wkhtmltopdf/ a Linux, Mac OS X (i386) és Windows "
"(32bits) rendszerekhez.\n"
"\n"
"A könyvtár OpenERP szerveren való telepítése után, be kell állítani az "
"elérési utat a ``wkthtmltopdf`` futtatójához minden vállalathoz.\n"
"\n"
"Ha nem talál fejlécet/lábjegyzetet vagy egyéb probléma merül fel a Linuxon, "
"akkor győződjön meg, hogy telepíti a könyvtár 'static' verzióját. UBUNTU "
"alatt ez ey ismert ``wkhtmltopdf`` probléma.\n"
"\n"
"\n"
"Tennivaló:\n"
"-----\n"
" * JavaScript támogatás aktiválás deaktiválás\n"
" * Gyűjtő és könyv formátum támogatás\n"
" * Zip visszaadás egy külön PDF-hez\n"
" * Web kliens WYSIWYG\n"
#. module: base
#: model:res.groups,name:base.group_sale_salesman_all_leads
@@ -8175,6 +8273,30 @@ msgid ""
"* In a module, so that administrators and users of OpenERP who do not\n"
" need or want an online import can avoid it being available to users.\n"
msgstr ""
"\n"
"Új fájl import kiterjesztések az OpenERP rendszerhez\n"
"======================================\n"
"\n"
"Az OpenERP fájl rendszerének újra-implementálása:\n"
"\n"
"* Szerver oldal, az előző rendszer a legtöbb végrehalytást a kliensre "
"kényszerítette\n"
" amely megduplázta az energiát (kliensek közt), az importálási rendszert \n"
" nehézkessé teszi a kliens nélkül(direkt RPC vagy\n"
" más automata formátumnál) és az export/import rendszer érthetőségét\n"
" is nehézkessé teszi amint 3 + különböző projekten hajtódik végre.\n"
"\n"
"* Érthetőbben a felhasználók és partnerek a saját import kivitelezést tudnak "
"\n"
" készíteni más fájl formátumokból (pl. OpenDocument fájlok)\n"
" ami leegyszerűsítheti a munka folyamatuk kezelését az adat forrásból "
"való\n"
" előállítását.\n"
"\n"
"* A modulban, azok az OpenERP adminisztrátorok és felhasználók akik nem\n"
" igénylik az online importot biztosíthatják, hogy azok nem lesznek "
"elérhetők \n"
" a felhasználók részére.\n"
#. module: base
#: selection:res.currency,position:0
@@ -12740,7 +12862,7 @@ msgstr "Olvasási hozzáférési jog"
#. module: base
#: model:ir.module.module,shortdesc:base.module_analytic_user_function
msgid "Jobs on Contracts"
msgstr ""
msgstr "Feladatok a szerződésekben"
#. module: base
#: code:addons/base/res/res_lang.py:187
@@ -14646,6 +14768,8 @@ msgid ""
"Helps you manage your inventory and main stock operations: delivery orders, "
"receptions, etc."
msgstr ""
"Segít Önnek a készletek és a fő készletműveletek kezelésében: "
"szállítólevelek, áruátvételek, stb."
#. module: base
#: model:ir.model,name:base.model_base_module_update
@@ -16029,6 +16153,7 @@ msgstr ""
#: help:ir.actions.act_window,usage:0
msgid "Used to filter menu and home actions from the user form."
msgstr ""
"A menű és főoldal műveletek szűrésére használták a felhasználói űrlapból."
#. module: base
#: model:res.country,name:base.sa
@@ -16050,6 +16175,15 @@ msgid ""
"order.\n"
" "
msgstr ""
"\n"
"Ez a modul lehetőséget ad MRP és eladási modul egyszeri telepítésére.\n"
"============================================================================="
"=======\n"
"\n"
"Alapvetően akkor használt, ha nyomon szeretnénk követni a megrendelésekből "
"generált termelési megrendeléseket. A gyártási megrendeléshez ad hozzá "
"eladás nevet és eladási hivatkozást.\n"
" "
#. module: base
#: code:addons/base/ir/ir_fields.py:147
@@ -16073,6 +16207,12 @@ msgid ""
"=========================\n"
" "
msgstr ""
"\n"
"Ez a modul hozzáadja a portáljához a project/terv menűt és annak "
"tulajdonságait (feladatait) ha a projekt/terv és portál telepítve vannak.\n"
"============================================================================="
"=========================\n"
" "
#. module: base
#: code:addons/base/module/wizard/base_module_configuration.py:38
@@ -16085,7 +16225,7 @@ msgstr "Rendszer konfigurálása kész"
#: view:ir.config_parameter:0
#: model:ir.ui.menu,name:base.ir_config_menu
msgid "System Parameters"
msgstr ""
msgstr "Rendszer paraméterek"
#. module: base
#: model:ir.module.module,description:base.module_l10n_ch
@@ -16203,7 +16343,7 @@ msgstr "Művelet több dokumentumon"
#: model:ir.actions.act_window,name:base.action_partner_title_partner
#: model:ir.ui.menu,name:base.menu_partner_title_partner
msgid "Titles"
msgstr ""
msgstr "Címek"
#. module: base
#: model:ir.module.module,description:base.module_anonymization
@@ -16226,6 +16366,22 @@ msgid ""
"anonymization process to recover your previous data.\n"
" "
msgstr ""
"\n"
"Ez a modul lehetővé teszi az adatbázis titkosítását.\n"
"===============================================\n"
"\n"
"Ezzel a modullal a bizalmas adatait biztonságban tarthatja egy megadott "
"adatbázisban.\n"
"Ez az eljárás hasznos, ha költöztetéskor megakarja védeni a saját ügyfelei "
"bizalmas adatait. \n"
"Az alapelv az, hogy egy titkosító eszközt futtat amely elrejti a bizalmas "
"adatokat (ki lesznek \n"
"cserélve ‘XXX’ karakterekkel). Ekkor elküldheti a titkosított adatokat a "
"költözési csoporhoz.\n"
"Amikor visszatértek a költöztetni kívánt adatok, akkor vissza lehet állítani "
"azokat\n"
"a titkosító eljárással az adatok visszanyeréssel.\n"
" "
#. module: base
#: model:ir.module.module,description:base.module_web_analytics
@@ -16237,6 +16393,12 @@ msgid ""
"Collects web application usage with Google Analytics.\n"
" "
msgstr ""
"\n"
"Google Analytics.\n"
"==============================\n"
"\n"
"Összegyűjti a web alkalmazás használaát a Google Analytics rendszerrel.\n"
" "
#. module: base
#: help:ir.sequence,implementation:0
@@ -16245,6 +16407,9 @@ msgid ""
"later is slower than the former but forbids any gap in the sequence (while "
"they are possible in the former)."
msgstr ""
"Két sorrendet ajánl a tárgy beillesztésthez: Alapértelmezett és 'Nincs rés'. "
"A későbbi lasúbb mint a mostani, de megtilt minden rést ami ebben a "
"sorrendben van (mivel ezek az előzőben lehettek)."
#. module: base
#: model:res.country,name:base.gn
@@ -16280,7 +16445,7 @@ msgstr "Hiba ! Nem hozhat létre rekurzív menüket."
#. module: base
#: view:ir.translation:0
msgid "Web-only translations"
msgstr ""
msgstr "Kizárólag-web fordítások"
#. module: base
#: view:ir.rule:0
@@ -16337,16 +16502,60 @@ msgid ""
"\n"
" "
msgstr ""
"\n"
"Belga számlatükör és lokalizáció \n"
"\n"
"This is the base module to manage the accounting chart for Belgium in "
"OpenERP.\n"
"============================================================================="
"=\n"
"\n"
"After installing this module, the Configuration wizard for accounting is "
"launched.\n"
" * We have the account templates which can be helpful to generate Charts "
"of Accounts.\n"
" * On that particular wizard, you will be asked to pass the name of the "
"company,\n"
" the chart template to follow, the no. of digits to generate, the code "
"for your\n"
" account and bank account, currency to create journals.\n"
"\n"
"Thus, the pure copy of Chart Template is generated.\n"
"\n"
"Wizards provided by this module:\n"
"--------------------------------\n"
" * Partner VAT Intra: Enlist the partners with their related VAT and "
"invoiced\n"
" amounts. Prepares an XML file format.\n"
" \n"
" **Path to access :** Invoicing/Reporting/Legal Reports/Belgium "
"Statements/Partner VAT Intra\n"
" * Periodical VAT Declaration: Prepares an XML file for Vat Declaration "
"of\n"
" the Main company of the User currently Logged in.\n"
" \n"
" **Path to access :** Invoicing/Reporting/Legal Reports/Belgium "
"Statements/Periodical VAT Declaration\n"
" * Annual Listing Of VAT-Subjected Customers: Prepares an XML file for "
"Vat\n"
" Declaration of the Main company of the User currently Logged in Based "
"on\n"
" Fiscal year.\n"
" \n"
" **Path to access :** Invoicing/Reporting/Legal Reports/Belgium "
"Statements/Annual Listing Of VAT-Subjected Customers\n"
"\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_base_gengo
msgid "Automated Translations through Gengo API"
msgstr ""
msgstr "Automatikus fordítás a Gengo API keresztül"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_payment
msgid "Suppliers Payment Management"
msgstr ""
msgstr "Szállítói kifizetések kezelése"
#. module: base
#: model:res.country,name:base.sv
@@ -16376,7 +16585,7 @@ msgstr "Thaiföld"
#. module: base
#: model:ir.module.module,summary:base.module_account_voucher
msgid "Send Invoices and Track Payments"
msgstr ""
msgstr "Számlák küldése és fizetések nyomonkövetése"
#. module: base
#: model:ir.ui.menu,name:base.menu_crm_config_lead
@@ -16387,6 +16596,7 @@ msgstr "Lehetőségek"
#: model:res.country,name:base.gg
msgid "Guernsey"
msgstr ""
"Guernsey-sziget - Guernsey valutaunióban van az Egyesült Királysággal"
#. module: base
#: selection:base.language.install,lang:0
@@ -16406,6 +16616,17 @@ msgid ""
" bilgileriniz, ilgili para birimi gibi bilgiler isteyecek.\n"
" "
msgstr ""
"\n"
"Török számlatükör és lokalizáció\n"
"\n"
"Türkiye için Tek düzen hesap planı şablonu OpenERP Modülü.\n"
"==========================================================\n"
"\n"
"Bu modül kurulduktan sonra, Muhasebe yapılandırma sihirbazı çalışır\n"
" * Sihirbaz sizden hesap planı şablonu, planın kurulacağı şirket, banka "
"hesap\n"
" bilgileriniz, ilgili para birimi gibi bilgiler isteyecek.\n"
" "
#. module: base
#: selection:workflow.activity,join_mode:0
@@ -16418,6 +16639,8 @@ msgstr "És"
msgid ""
"Database identifier of the record to which this applies. 0 = for all records"
msgstr ""
"Adatbázis azonosító arra a rekordra amelyre ez vonatkozik. 0 = összes "
"rekordra"
#. module: base
#: field:ir.model.fields,relation:0
@@ -16427,7 +16650,7 @@ msgstr "Objektum kapcsolat"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_voucher
msgid "eInvoicing & Payments"
msgstr ""
msgstr "Számlázás & Kifizetések"
#. module: base
#: model:ir.module.module,description:base.module_base_crypt
@@ -16463,6 +16686,42 @@ msgid ""
"This module is currently not compatible with the ``user_ldap`` module and\n"
"will disable LDAP authentication completely if installed at the same time.\n"
msgstr ""
"\n"
"Rendesszövegű jelszó kiváltása biztonsági hasító függvénnyel az "
"adatbázisban.\n"
"================================================================\n"
"\n"
"A meglévő felhasználói adatbázisban, a rendesszövegű jelszavak azonnal el "
"lesznek távolítva\n"
"amint telepítésre kerül a base_crypt.\n"
"\n"
"Minden jelszó ki lesz cserélve egy biztonságos, konzervált, kriptográfiai "
"hasító függvénnyel, \n"
"ezzel megakadályozva az eredeti jelszó kiolvasását az adatbázisból.\n"
"\n"
"Miután telepítette ezt a modult, nem lesz lehetősége az elfelejtett jelszó "
"visszafejtésére \n"
"a felhasználók részéről, az adminisztátor egyedüli lehetősége lesz egy új "
"jelszó megadása.\n"
"\n"
"Biztonsági figyelmeztetés:\n"
"-----------------\n"
"Ennek a modulnak a telepítésével nem hagyhatja figyelmen kívül a többi "
"biztonsági intézkedést,\n"
"mivel a jelszó a hálózaton keresztül kódolatlanul halad keresztül, kivéve, "
"ha \n"
"biztonsági protokolt használ mint a XML-RPCS vagy HTTPS.\n"
"\n"
"Ez nem védi meg az adatbázis többi részét, mely bizalmas\n"
"adatokat is tartalmazhat. Pontos biztonsági intézkedést kell beileszteni\n"
"a rendszer adminisztrátornak minden területen, mint: adatbázis védelmi "
"mentések,\n"
"rendszer fájlok, távoli héj hozzáférések, fizikai szerver hozzáférések.\n"
"\n"
"Kölcsönhatás az LDAP azonosítással:\n"
"-------------------------------------\n"
"Ez a modul most még nem kompatibilis a ``user_ldap`` modullal és\n"
"ki fogja iktatni a LDAP azonosítást teljesen ha ugyanakkor telepítettek.\n"
#. module: base
#: view:ir.rule:0
@@ -16499,12 +16758,12 @@ msgstr "Valuta árfolyam"
#: view:base.module.upgrade:0
#: field:base.module.upgrade,module_info:0
msgid "Modules to Update"
msgstr ""
msgstr "Frissítendő modulok"
#. module: base
#: model:ir.ui.menu,name:base.menu_custom_multicompany
msgid "Multi-Companies"
msgstr ""
msgstr "Többszörös-vállalatok"
#. module: base
#: field:workflow,osv:0
@@ -16516,12 +16775,12 @@ msgstr "Erőforrás objektum"
#. module: base
#: model:ir.module.module,shortdesc:base.module_crm_helpdesk
msgid "Helpdesk"
msgstr ""
msgstr "Ügyfélszolgálat"
#. module: base
#: field:ir.rule,perm_write:0
msgid "Apply for Write"
msgstr ""
msgstr "Íráshoz alkamaz"
#. module: base
#: model:ir.module.module,description:base.module_stock
@@ -16569,6 +16828,11 @@ msgid ""
"Web pages\n"
" "
msgstr ""
"\n"
"Oldalak\n"
"=====\n"
"Web oldalak\n"
" "
#. module: base
#: help:ir.actions.server,code:0
@@ -16576,6 +16840,8 @@ msgid ""
"Python code to be executed if condition is met.\n"
"It is a Python block that can use the same values as for the condition field"
msgstr ""
"Python code to be executed if condition is met.\n"
"It is a Python block that can use the same values as for the condition field"
#. module: base
#: model:ir.actions.act_window,help:base.grant_menu_access
+1 -1
View File
@@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-12-19 05:14+0000\n"
"X-Launchpad-Export-Date: 2012-12-20 04:42+0000\n"
"X-Generator: Launchpad (build 16378)\n"
#. module: base
+86 -12
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: 2012-12-03 16:01+0000\n"
"PO-Revision-Date: 2012-12-18 18:59+0000\n"
"PO-Revision-Date: 2012-12-19 19:34+0000\n"
"Last-Translator: Fekete Mihai <mihai@erpsystems.ro>\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: 2012-12-19 05:14+0000\n"
"X-Launchpad-Export-Date: 2012-12-20 04:42+0000\n"
"X-Generator: Launchpad (build 16378)\n"
#. module: base
@@ -327,7 +327,7 @@ msgstr "creat(a)."
#. module: base
#: field:ir.actions.report.xml,report_xsl:0
msgid "XSL Path"
msgstr ""
msgstr "Ruta XSL"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_tr
@@ -353,7 +353,7 @@ msgstr "Inuktitut / ᐃᓄᒃᑎᑐᑦ"
#. module: base
#: model:res.groups,name:base.group_multi_currency
msgid "Multi Currencies"
msgstr ""
msgstr "Mzi multe valute"
#. module: base
#: model:ir.module.module,description:base.module_l10n_cl
@@ -365,11 +365,17 @@ msgid ""
"\n"
" "
msgstr ""
"\n"
"Localizarea planului contabil si fiscal chilian\n"
"==============================================\n"
"Plan contabil si fiscal chilian in conformitate cu dispozitiile in vigoare\n"
"\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale
msgid "Sales Management"
msgstr "Gestiune vanzari"
msgstr ""
#. module: base
#: help:res.partner,user_id:0
@@ -377,6 +383,8 @@ msgid ""
"The internal user that is in charge of communicating with this contact if "
"any."
msgstr ""
"Utilizatorul intern care este responsabil cu comunicarea cu acest contact, "
"daca exista."
#. module: base
#: view:res.partner:0
@@ -386,7 +394,7 @@ msgstr "Cauta Partener"
#. module: base
#: field:ir.module.category,module_nr:0
msgid "Number of Modules"
msgstr "Numar de module"
msgstr "Numar de Module"
#. module: base
#: help:multi_company.default,company_dest_id:0
@@ -411,6 +419,15 @@ msgid ""
" * Commitment Date\n"
" * Effective Date\n"
msgstr ""
"\n"
"Adauga informatii suplimentare despre date la comanda de vanzare.\n"
"===================================================\n"
"\n"
"Puteti adauga urmatoarele date suplimentare la o comanda de vanzare:\n"
"-----------------------------------------------------------\n"
" * Data Solicitata\n"
" * Data Angajament\n"
" * Data Efectiva\n"
#. module: base
#: help:ir.actions.act_window,res_id:0
@@ -418,6 +435,8 @@ msgid ""
"Database ID of record to open in form view, when ``view_mode`` is set to "
"'form' only"
msgstr ""
"ID baza de date a inregistrarii de deschis in vizualizare formular, atunci "
"cand ``modul_vizualizare`` este setat doar pe 'formular'"
#. module: base
#: field:res.partner.address,name:0
@@ -468,11 +487,18 @@ msgid ""
"document and Wiki based Hidden.\n"
" "
msgstr ""
"\n"
"Programul de instalare Ascuns bazat pe cunostinte.\n"
"=====================================\n"
"\n"
"Face Configuratia Aplicatiei Cunostinte disponibila, de unde puteti instala\n"
"documente si Ascuns bazat pe Wiki.\n"
" "
#. module: base
#: model:ir.module.category,name:base.module_category_customer_relationship_management
msgid "Customer Relationship Management"
msgstr "Gestionarea relatiilor cu clientii"
msgstr "Gestionarea Relatiilor cu Clientii"
#. module: base
#: model:ir.module.module,description:base.module_delivery
@@ -486,6 +512,14 @@ msgid ""
"invoices from picking, OpenERP is able to add and compute the shipping "
"line.\n"
msgstr ""
"\n"
"Va permite sa adaugati metode de livrare la comenzile de vanzare si "
"ridicare.\n"
"==============================================================\n"
"\n"
"Va puteti defini propriile grile de preturi pentru transport si livrare. "
"Atunci cand creati \n"
"facturi la ridicare, OpenERP poate adauga si calcula linia de transport.\n"
#. module: base
#: code:addons/base/ir/ir_filters.py:83
@@ -494,6 +528,8 @@ msgid ""
"There is already a shared filter set as default for %(model)s, delete or "
"change it before setting a new default"
msgstr ""
"Exista deja un filtru comun setat ca default pentru %(model)s, stergeti-l "
"sau schimbati-l inainte de a seta unul nou."
#. module: base
#: code:addons/orm.py:2648
@@ -536,7 +572,7 @@ msgstr "Obiect Sursa"
#. module: base
#: model:res.partner.bank.type,format_layout:base.bank_normal
msgid "%(bank_name)s: %(acc_number)s"
msgstr "%(bank_name)s: %(acc_number)s"
msgstr "%(nume_banca)s: %(numar_cont)s"
#. module: base
#: view:ir.actions.todo:0
@@ -591,12 +627,12 @@ msgstr ""
#. module: base
#: field:ir.model.relation,name:0
msgid "Relation Name"
msgstr ""
msgstr "Nume Relatie"
#. module: base
#: view:ir.rule:0
msgid "Create Access Right"
msgstr ""
msgstr "Creeaza Drept de acces"
#. module: base
#: model:res.country,name:base.tv
@@ -636,7 +672,7 @@ msgstr ""
#. module: base
#: view:workflow.transition:0
msgid "Workflow Transition"
msgstr ""
msgstr "Tranzitie Flux de lucru"
#. module: base
#: model:res.country,name:base.gf
@@ -646,7 +682,7 @@ msgstr "Guyana Franceza"
#. module: base
#: model:ir.module.module,summary:base.module_hr
msgid "Jobs, Departments, Employees Details"
msgstr ""
msgstr "Posturi, Departamente, Detalii angajati"
#. module: base
#: model:ir.module.module,description:base.module_analytic
@@ -662,6 +698,16 @@ msgid ""
"that have no counterpart in the general financial accounts.\n"
" "
msgstr ""
"\n"
"Modul pentru definirea obiectului contabilitatii analitice.\n"
"===============================================\n"
"\n"
"In OpenERP, conturile analitice sunt legate de conturile generale, dar sunt "
"tratate\n"
"in mod total independent. Astfel, puteti introduce diverse operatiuni "
"analitice\n"
"care nu au niciun corespondent in conturile financiare generale.\n"
" "
#. module: base
#: field:ir.ui.view.custom,ref_id:0
@@ -685,6 +731,19 @@ msgid ""
"* Use emails to automatically confirm and send acknowledgements for any "
"event registration\n"
msgstr ""
"\n"
"Organizarea si gestionarea Evenimentelor.\n"
"======================================\n"
"\n"
"Modulul eveniment va permite sa organizati eficient evenimente si toate "
"sarcinile asociate lor: planificare, urmarirea inregistrarii,\n"
"prezente, etc.\n"
"\n"
"Caracteristici cheie:\n"
"------------\n"
"* Gestioneaza Evenimentele si Inregistrarile dumneavoastra\n"
"* Foloseste email-urile pentru a confirma si trimite automat confirmarile "
"pentru inregistrarea oricarui eveniment\n"
#. module: base
#: selection:base.language.install,lang:0
@@ -710,6 +769,21 @@ msgid ""
"requested it.\n"
" "
msgstr ""
"\n"
"Traduceri Automate prin Gengo API\n"
"----------------------------------------\n"
"\n"
"Acest modul va instala programatorul pasiv pentru traduceri automate \n"
"folosind Gengo API. Pentru a-l activa, trebuie sa\n"
"1) Va configurati parametrii de autentificare Gengo din `Setari > Companii > "
"Parametrii Gengo`\n"
"2) Lansati wizard-ul din `Setari > Termenii Aplicatiei > Gengo: Solicitare "
"Manuala a Traducerii` si sa urmeze wizard-ul.\n"
"\n"
"Acest wizard va activa CRON si Programatorul si va incepe traducerea "
"automata prin intermediul Serviciilor Gengo pentru toti termenii solicitati "
"de dumneavoastra.\n"
" "
#. module: base
#: help:ir.actions.report.xml,attachment_use:0
+25 -7
View File
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-03 16:01+0000\n"
"PO-Revision-Date: 2012-12-06 18:17+0000\n"
"Last-Translator: ccdos <ccdos@163.com>\n"
"PO-Revision-Date: 2012-12-19 07:05+0000\n"
"Last-Translator: Wei \"oldrev\" Li <oldrev@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: 2012-12-07 04:34+0000\n"
"X-Generator: Launchpad (build 16341)\n"
"X-Launchpad-Export-Date: 2012-12-20 04:43+0000\n"
"X-Generator: Launchpad (build 16378)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -1517,7 +1517,7 @@ msgstr "海地"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_fr_hr_payroll
msgid "French Payroll"
msgstr ""
msgstr "法国薪酬管理"
#. module: base
#: view:ir.ui.view:0
@@ -2871,6 +2871,9 @@ msgid ""
"Module to attach a google document to any model.\n"
"================================================\n"
msgstr ""
"\n"
"用于附加 Google 文档到任意模型的模块。\n"
"================================================\n"
#. module: base
#: code:addons/base/ir/ir_fields.py:334
@@ -3118,7 +3121,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_linkedin
msgid "LinkedIn Integration"
msgstr ""
msgstr "LinkedIn 集成"
#. module: base
#: code:addons/orm.py:2021
@@ -3301,6 +3304,10 @@ msgid ""
"==========================================\n"
" "
msgstr ""
"\n"
"比利时薪酬规则的会计数据。\n"
"==========================================\n"
" "
#. module: base
#: model:res.country,name:base.am
@@ -4002,6 +4009,17 @@ msgid ""
"If you need to manage your meetings, you should install the CRM module.\n"
" "
msgstr ""
"\n"
"这是功能完整的日程表系统\n"
"========================================\n"
"\n"
"支持:\n"
"------------\n"
" - 约会排程\n"
" - 重复性事件\n"
"\n"
"如果您需要管理您的会议,您应该安装 CRM 模块。\n"
" "
#. module: base
#: model:res.country,name:base.je
@@ -4039,7 +4057,7 @@ msgstr "%x - 使用日期表示"
#. module: base
#: view:res.partner:0
msgid "Tag"
msgstr ""
msgstr "标签"
#. module: base
#: view:res.lang:0
+163 -56
View File
@@ -18,11 +18,164 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import itertools
import hashlib
import itertools
import os
import re
from openerp import tools
from openerp.osv import fields,osv
class ir_attachment(osv.osv):
"""Attachments are used to link binary files or url to any openerp document.
External attachment storage
---------------------------
The 'data' function field (_data_get,data_set) is implemented using
_file_read, _file_write and _file_delete which can be overridden to
implement other storage engines, shuch methods should check for other
location pseudo uri (example: hdfs://hadoppserver)
The default implementation is the file:dirname location that stores files
on the local filesystem using name based on their sha1 hash
"""
def _name_get_resname(self, cr, uid, ids, object, method, context):
data = {}
for attachment in self.browse(cr, uid, ids, context=context):
model_object = attachment.res_model
res_id = attachment.res_id
if model_object and res_id:
model_pool = self.pool.get(model_object)
res = model_pool.name_get(cr,uid,[res_id],context)
res_name = res and res[0][1] or False
if res_name:
field = self._columns.get('res_name',False)
if field and len(res_name) > field.size:
res_name = res_name[:field.size-3] + '...'
data[attachment.id] = res_name
else:
data[attachment.id] = False
return data
# 'data' field implementation
def _full_path(self, cr, uid, location, path):
# location = 'file:filestore'
assert location.startswith('file:'), "Unhandled filestore location %s" % location
location = location[5:]
# sanitize location name and path
location = re.sub('[.]','',location)
location = location.strip('/\\')
path = re.sub('[.]','',path)
path = path.strip('/\\')
return os.path.join(tools.config['root_path'], location, cr.dbname, path)
def _file_read(self, cr, uid, location, fname, bin_size=False):
full_path = self._full_path(cr, uid, location, fname)
r = ''
try:
if bin_size:
r = os.path.getsize(full_path)
else:
r = open(full_path).read().encode('base64')
except IOError:
_logger.error("_read_file reading %s",full_path)
return r
def _file_write(self, cr, uid, location, value):
bin_value = value.decode('base64')
fname = hashlib.sha1(bin_value).hexdigest()
# scatter files across 1024 dirs
# we use '/' in the db (even on windows)
fname = fname[:3] + '/' + fname
full_path = self._full_path(cr, uid, location, fname)
try:
dirname = os.path.dirname(full_path)
if not os.path.isdir(dirname):
os.makedirs(dirname)
open(full_path,'wb').write(bin_value)
except IOError:
_logger.error("_file_write writing %s",full_path)
return fname
def _file_delete(self, cr, uid, location, fname):
count = self.search(cr, 1, [('store_fname','=',fname)], count=True)
if count <= 1:
full_path = self._full_path(cr, uid, location, fname)
try:
os.unlink(full_path)
except IOError:
# Harmless and needed for race conditions
_logger.error("_file_delete could not unlink %s",full_path)
def _data_get(self, cr, uid, ids, name, arg, context=None):
if context is None:
context = {}
result = {}
location = self.pool.get('ir.config_parameter').get_param(cr, uid, 'ir_attachment.location')
bin_size = context.get('bin_size')
for attach in self.browse(cr, uid, ids, context=context):
if location and attach.store_fname:
result[attach.id] = self._file_read(cr, uid, location, attach.store_fname, bin_size)
else:
result[attach.id] = attach.db_datas
return result
def _data_set(self, cr, uid, id, name, value, arg, context=None):
# We dont handle setting data to null
if not value:
return True
if context is None:
context = {}
location = self.pool.get('ir.config_parameter').get_param(cr, uid, 'ir_attachment.location')
file_size = len(value.decode('base64'))
if location:
attach = self.browse(cr, uid, id, context=context)
if attach.store_fname:
self._file_delete(cr, uid, location, attach.store_fname)
fname = self._file_write(cr, uid, location, value)
super(ir_attachment, self).write(cr, uid, [id], {'store_fname': fname, 'file_size': file_size}, context=context)
else:
super(ir_attachment, self).write(cr, uid, [id], {'db_datas': value, 'file_size': file_size}, context=context)
return True
_name = 'ir.attachment'
_columns = {
'name': fields.char('Attachment Name',size=256, required=True),
'datas_fname': fields.char('File Name',size=256),
'description': fields.text('Description'),
'res_name': fields.function(_name_get_resname, type='char', size=128, string='Resource Name', store=True),
'res_model': fields.char('Resource Model',size=64, readonly=True, help="The database object this attachment will be attached to"),
'res_id': fields.integer('Resource ID', readonly=True, help="The record id this is attached to"),
'create_date': fields.datetime('Date Created', readonly=True),
'create_uid': fields.many2one('res.users', 'Owner', readonly=True),
'company_id': fields.many2one('res.company', 'Company', change_default=True),
'type': fields.selection( [ ('url','URL'), ('binary','Binary'), ],
'Type', help="Binary File or URL", required=True, change_default=True),
'url': fields.char('Url', size=1024),
# al: We keep shitty field names for backward compatibility with document
'datas': fields.function(_data_get, fnct_inv=_data_set, string='File Content', type="binary", nodrop=True),
'store_fname': fields.char('Stored Filename', size=256),
'db_datas': fields.binary('Database Data'),
'file_size': fields.integer('File Size'),
}
_defaults = {
'type': 'binary',
'file_size': 0,
'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'ir.attachment', context=c),
}
def _auto_init(self, cr, context=None):
super(ir_attachment, self)._auto_init(cr, context)
cr.execute('SELECT indexname FROM pg_indexes WHERE indexname = %s', ('ir_attachment_res_idx',))
if not cr.fetchone():
cr.execute('CREATE INDEX ir_attachment_res_idx ON ir_attachment (res_model, res_id)')
cr.commit()
def check(self, cr, uid, ids, mode, context=None, values=None):
"""Restricts the access to an ir.attachment, according to referred model
In the 'document' module, it is overriden to relax this hard rule, since
@@ -108,6 +261,8 @@ class ir_attachment(osv.osv):
def write(self, cr, uid, ids, vals, context=None):
self.check(cr, uid, ids, 'write', context=context, values=vals)
if 'file_size' in vals:
del vals['file_size']
return super(ir_attachment, self).write(cr, uid, ids, vals, context)
def copy(self, cr, uid, id, default=None, context=None):
@@ -116,70 +271,22 @@ class ir_attachment(osv.osv):
def unlink(self, cr, uid, ids, context=None):
self.check(cr, uid, ids, 'unlink', context=context)
location = self.pool.get('ir.config_parameter').get_param(cr, uid, 'ir_attachment.location')
if location:
for attach in self.browse(cr, uid, ids, context=context):
if attach.store_fname:
self._file_delete(cr, uid, location, attach.store_fname)
return super(ir_attachment, self).unlink(cr, uid, ids, context)
def create(self, cr, uid, values, context=None):
self.check(cr, uid, [], mode='create', context=context, values=values)
if 'file_size' in values:
del values['file_size']
return super(ir_attachment, self).create(cr, uid, values, context)
def action_get(self, cr, uid, context=None):
return self.pool.get('ir.actions.act_window').for_xml_id(
cr, uid, 'base', 'action_attachment', context=context)
def _name_get_resname(self, cr, uid, ids, object, method, context):
data = {}
for attachment in self.browse(cr, uid, ids, context=context):
model_object = attachment.res_model
res_id = attachment.res_id
if model_object and res_id:
model_pool = self.pool.get(model_object)
res = model_pool.name_get(cr,uid,[res_id],context)
res_name = res and res[0][1] or False
if res_name:
field = self._columns.get('res_name',False)
if field and len(res_name) > field.size:
res_name = res_name[:field.size-3] + '...'
data[attachment.id] = res_name
else:
data[attachment.id] = False
return data
_name = 'ir.attachment'
_columns = {
'name': fields.char('Attachment Name',size=256, required=True),
'datas': fields.binary('Data'),
'datas_fname': fields.char('File Name',size=256),
'description': fields.text('Description'),
'res_name': fields.function(_name_get_resname, type='char', size=128,
string='Resource Name', store=True),
'res_model': fields.char('Resource Object',size=64, readonly=True,
help="The database object this attachment will be attached to"),
'res_id': fields.integer('Resource ID', readonly=True,
help="The record id this is attached to"),
'url': fields.char('Url', size=512, oldname="link"),
'type': fields.selection(
[ ('url','URL'), ('binary','Binary'), ],
'Type', help="Binary File or external URL", required=True, change_default=True),
'create_date': fields.datetime('Date Created', readonly=True),
'create_uid': fields.many2one('res.users', 'Owner', readonly=True),
'company_id': fields.many2one('res.company', 'Company', change_default=True),
}
_defaults = {
'type': 'binary',
'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'ir.attachment', context=c),
}
def _auto_init(self, cr, context=None):
super(ir_attachment, self)._auto_init(cr, context)
cr.execute('SELECT indexname FROM pg_indexes WHERE indexname = %s', ('ir_attachment_res_idx',))
if not cr.fetchone():
cr.execute('CREATE INDEX ir_attachment_res_idx ON ir_attachment (res_model, res_id)')
cr.commit()
ir_attachment()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-14
View File
@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--
Assert:
-->
<assert model="res.request" id="res_partner_asustek_request" string="Reference field request returns a browsable object">
<test expr="ref_doc1.name">ASUSTeK</test>
</assert>
</data>
</openerp>
-116
View File
@@ -1,116 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2011-TODAY 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 time
from datetime import datetime
from dateutil.relativedelta import relativedelta
import openerp
JOB = {
'function': u'_0_seconds',
'interval_type': u'minutes',
'user_id': 1,
'name': u'test',
'args': False,
'numbercall': 1,
'nextcall': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
'priority': 5,
'doall': True,
'active': True,
'interval_number': 1,
'model': u'ir.cron'
}
class test_ir_cron(openerp.osv.osv.osv):
""" Add a few handy methods to test cron jobs scheduling. """
_inherit = "ir.cron"
def _0_seconds(a, b, c):
print ">>> _0_seconds"
def _20_seconds(self, cr, uid):
print ">>> in _20_seconds"
time.sleep(20)
print ">>> out _20_seconds"
def _80_seconds(self, cr, uid):
print ">>> in _80_seconds"
time.sleep(80)
print ">>> out _80_seconds"
def test_0(self, cr, uid):
now = datetime.now()
t1 = (now + relativedelta(minutes=1)).strftime('%Y-%m-%d %H:%M:%S')
t2 = (now + relativedelta(minutes=1, seconds=5)).strftime('%Y-%m-%d %H:%M:%S')
t3 = (now + relativedelta(minutes=1, seconds=10)).strftime('%Y-%m-%d %H:%M:%S')
self.create(cr, uid, dict(JOB, name='test_0 _20_seconds A', function='_20_seconds', nextcall=t1))
self.create(cr, uid, dict(JOB, name='test_0 _20_seconds B', function='_20_seconds', nextcall=t2))
self.create(cr, uid, dict(JOB, name='test_0 _20_seconds C', function='_20_seconds', nextcall=t3))
def test_1(self, cr, uid):
now = datetime.now()
t1 = (now + relativedelta(minutes=1)).strftime('%Y-%m-%d %H:%M:%S')
self.create(cr, uid, dict(JOB, name='test_1 _20_seconds * 3', function='_20_seconds', nextcall=t1, numbercall=3))
def test_2(self, cr, uid):
now = datetime.now()
t1 = (now + relativedelta(minutes=1)).strftime('%Y-%m-%d %H:%M:%S')
self.create(cr, uid, dict(JOB, name='test_2 _80_seconds * 2', function='_80_seconds', nextcall=t1, numbercall=2))
def test_3(self, cr, uid):
now = datetime.now()
t1 = (now + relativedelta(minutes=1)).strftime('%Y-%m-%d %H:%M:%S')
t2 = (now + relativedelta(minutes=1, seconds=5)).strftime('%Y-%m-%d %H:%M:%S')
t3 = (now + relativedelta(minutes=1, seconds=10)).strftime('%Y-%m-%d %H:%M:%S')
self.create(cr, uid, dict(JOB, name='test_3 _80_seconds A', function='_80_seconds', nextcall=t1))
self.create(cr, uid, dict(JOB, name='test_3 _20_seconds B', function='_20_seconds', nextcall=t2))
self.create(cr, uid, dict(JOB, name='test_3 _20_seconds C', function='_20_seconds', nextcall=t3))
# This test assumes 4 cron threads.
def test_00(self, cr, uid):
self.test_00_set = set()
now = datetime.now()
t1 = (now + relativedelta(minutes=1)).strftime('%Y-%m-%d %H:%M:%S')
t2 = (now + relativedelta(minutes=1, seconds=5)).strftime('%Y-%m-%d %H:%M:%S')
t3 = (now + relativedelta(minutes=1, seconds=10)).strftime('%Y-%m-%d %H:%M:%S')
self.create(cr, uid, dict(JOB, name='test_00 _20_seconds_A', function='_20_seconds_A', nextcall=t1))
self.create(cr, uid, dict(JOB, name='test_00 _20_seconds_B', function='_20_seconds_B', nextcall=t2))
self.create(cr, uid, dict(JOB, name='test_00 _20_seconds_C', function='_20_seconds_C', nextcall=t3))
def _expect(self, cr, uid, to_add, to_sleep, to_expect_in, to_expect_out):
assert self.test_00_set == to_expect_in
self.test_00_set.add(to_add)
time.sleep(to_sleep)
self.test_00_set.discard(to_add)
assert self.test_00_set == to_expect_out
def _20_seconds_A(self, cr, uid):
self._expect(cr, uid, 'A', 20, set(), set(['B', 'C']))
def _20_seconds_B(self, cr, uid):
self._expect(cr, uid, 'B', 20, set('A'), set('C'))
def _20_seconds_C(self, cr, uid):
self._expect(cr, uid, 'C', 20, set(['A', 'B']), set())
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-61
View File
@@ -1,61 +0,0 @@
-
Test the cron jobs scheduling.
-
Disable the existing cron jobs if any during the tests.
-
!python {model: ir.cron }: |
# For this test to work, as it involves multiple database cursors,
# we have to commit changes. But YAML tests must be rollbacked, so
# the final database state is left untouched. So we have to be a bit
# ugly here: use our own cursor, commit, and clean after ourselves.
# We also pass around some ids using setattr/delattr, and we have to
# rollback the previous tests otherwise we won't be able to touch the
# db.
# Well, this should probably be a standalone, or regular unit test,
# instead of using the YAML infrastructure.
cr.rollback()
our_cr = self.pool.db.cursor()
try:
ids = self.search(our_cr, uid, [], {})
setattr(self, 'saved_ids', ids)
self.write(our_cr, uid, ids, {'active': False}, {})
our_cr.commit()
finally:
our_cr.close()
-
Three concurrent jobs started with a slight time gap. Assume 4 cron threads.
This will take about 2 minutes.
-
!python {model: ir.cron }: |
# Pretend initialization is already done. We the use a try/finally
# to reset _init correctly.
self.pool._init = False
our_cr = self.pool.db.cursor()
try:
self.test_00(our_cr, uid) # this will commit using the passed cursor
import openerp.cron
openerp.cron._thread_slots = 4
# Wake up this db as soon as the master cron thread starts.
openerp.cron.schedule_wakeup(1, self.pool.db.dbname)
# Pretend to be the master thread, for 4 iterations.
openerp.cron.runner_body()
openerp.cron.runner_body()
openerp.cron.runner_body()
openerp.cron.runner_body()
finally:
self.pool._init = True
our_cr.close()
-
Clean after ourselves.
-
!python {model: ir.cron }: |
our_cr = self.pool.db.cursor()
try:
ids = [x for x in self.search(our_cr, uid, ['|', ('active', '=', True), ('active', '=', False)], {}) if x not in self.saved_ids]
self.unlink(our_cr, uid, ids, {})
ids = self.saved_ids
delattr(self, 'saved_ids')
self.write(our_cr, uid, ids, {'active': True}, {})
our_cr.commit()
finally:
our_cr.close()
+8 -2
View File
@@ -1,9 +1,15 @@
import test_base, test_expression, test_search, test_ir_values, test_menu
import test_base
import test_expression
import test_ir_attachment
import test_ir_values
import test_menu
import test_search
checks = [
test_base,
test_expression,
test_search,
test_ir_attachment,
test_ir_values,
test_menu,
test_search,
]
@@ -0,0 +1,89 @@
import hashlib
import os
import unittest2
import openerp
import openerp.tests.common
class test_ir_attachment(openerp.tests.common.TransactionCase):
def test_00_attachment_flow(self):
registry, cr, uid = self.registry, self.cr, self.uid
root_path = openerp.tools.config['root_path']
ira = registry('ir.attachment')
# Blob1
blob1 = 'blob1'
blob1_b64 = blob1.encode('base64')
blob1_hash = hashlib.sha1(blob1).hexdigest()
blob1_fname = blob1_hash[:3] + '/' + blob1_hash
# Blob2
blob2 = 'blob2'
blob2_b64 = blob2.encode('base64')
blob2_hash = hashlib.sha1(blob2).hexdigest()
blob2_fname = blob2_hash[:3] + '/' + blob2_hash
# 'ir_attachment.location' is undefined test database storage
a1 = ira.create(cr, uid, {'name': 'a1', 'datas': blob1_b64})
a1_read = ira.read(cr, uid, [a1], ['datas'])
self.assertEqual(a1_read[0]['datas'], blob1_b64)
cr.execute("select id,db_datas from ir_attachment where id = %s", (a1,) )
a1_db_datas = str(cr.fetchall()[0][1])
self.assertEqual(a1_db_datas, blob1_b64)
# define a location for filestore
registry('ir.config_parameter').set_param(cr, uid, 'ir_attachment.location', 'file:///filestore')
# Test file storage
a2 = ira.create(cr, uid, {'name': 'a2', 'datas': blob1_b64})
a2_read = ira.read(cr, uid, [a2], ['datas'])
self.assertEqual(a2_read[0]['datas'], blob1_b64)
cr.execute("select id,store_fname from ir_attachment where id = %s", (a2,) )
a2_store_fname = cr.fetchall()[0][1]
self.assertEqual(a2_store_fname, blob1_fname)
a2_fn = os.path.join(root_path, 'filestore', cr.dbname, blob1_hash[:3], blob1_hash)
fc = file(a2_fn).read()
self.assertEqual(fc, blob1)
# create a3 with same blob
a3 = ira.create(cr, uid, {'name': 'a3', 'datas': blob1_b64})
a3_read = ira.read(cr, uid, [a3], ['datas'])
self.assertEqual(a3_read[0]['datas'], blob1_b64)
cr.execute("select id,store_fname from ir_attachment where id = %s", (a3,) )
a3_store_fname = cr.fetchall()[0][1]
self.assertEqual(a3_store_fname, a2_store_fname)
# create a4 blob2
a4 = ira.create(cr, uid, {'name': 'a4', 'datas': blob2_b64})
a4_read = ira.read(cr, uid, [a4], ['datas'])
self.assertEqual(a4_read[0]['datas'], blob2_b64)
a4_fn = os.path.join(root_path, 'filestore', cr.dbname, blob2_hash[:3], blob2_hash)
self.assertTrue(os.path.isfile(a4_fn))
# delete a3 but file stays
ira.unlink(cr, uid, [a3])
self.assertTrue(os.path.isfile(a2_fn))
# delete a2 it is unlinked
ira.unlink(cr, uid, [a2])
self.assertFalse(os.path.isfile(a2_fn))
# update a4 blob2 by blob1
ira.write(cr, uid, [a4], {'datas': blob1_b64})
a4_read = ira.read(cr, uid, [a4], ['datas'])
self.assertEqual(a4_read[0]['datas'], blob1_b64)
# file of a4 disapear and a2 reappear
self.assertFalse(os.path.isfile(a4_fn))
self.assertTrue(os.path.isfile(a2_fn))
# everybody applause
+15 -7
View File
@@ -8,12 +8,20 @@ Tests can be explicitely added to the `fast_suite` or `checks` lists or not.
See the :ref:`test-framework` section in the :ref:`features` list.
"""
from . import test_acl
from . import test_expression, test_mail, test_ir_sequence, test_orm, \
test_fields, test_basecase, \
test_view_validation, test_uninstall, test_misc, test_db_cursor, \
test_osv, test_translate
from . import test_ir_filters
import test_acl
import test_basecase
import test_db_cursor
import test_expression
import test_fields
import test_ir_filters
import test_ir_sequence
import test_mail
import test_misc
import test_orm
import test_osv
import test_translate
import test_uninstall
import test_view_validation
fast_suite = [
test_ir_sequence,
@@ -33,5 +41,5 @@ checks = [
test_osv,
test_translate,
]
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: