-.*
-*.egg-info
-*.orig
-*.vim
+.*.swp
+.bzrignore
+.idea
+.project
+.pydevproject
+.ropeproject
+.settings
+.DS_Store
+openerp/addons/*
+openerp/filestore*
+.Python
+*.pyc
+*.pyo
+bin/*
build/
-RE:^bin/
-RE:^dist/
-RE:^include/
-
-RE:^share/
-RE:^man/
-RE:^lib/
-
-RE:^addons/\w+/doc/_build/
+include/
+lib/
+share/
+doc/_build/*
+win32/*.bat
+win32/meta.py
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
-# Copyright (C) 2010, 2012 OpenERP s.a. (<http://openerp.com>).
+# Copyright (C) 2010-2012 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
'res/res_bank_view.xml',
'res/res_country_view.xml',
'res/res_currency_view.xml',
+ 'res/wizard/change_password_wizard_view.xml',
'res/res_users_view.xml',
'res/res_partner_data.xml',
'res/ir_property_view.xml',
'installable': True,
'auto_install': True,
'css': ['static/src/css/modules.css'],
+ 'js': [
+ 'static/src/js/apps.js',
+ ],
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-12-20 04:42+0000\n"
+"X-Launchpad-Export-Date: 2012-12-21 04:39+0000\n"
"X-Generator: Launchpad (build 16378)\n"
#. module: base
"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-12-20 02:14+0000\n"
+"PO-Revision-Date: 2012-12-20 19:00+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-20 04:43+0000\n"
+"X-Launchpad-Export-Date: 2012-12-21 04:39+0000\n"
"X-Generator: Launchpad (build 16378)\n"
#. module: base
"revenue\n"
"reports."
msgstr ""
+"\n"
+"Genere facturas desde los gastos y partes de horas.\n"
+"========================================================\n"
+"\n"
+"Módulo para generar facturas basadas en los costes (recursos humanos, "
+"gastos, ...).\n"
+"\n"
+"Puede definir tarifas en la contabilidad analítica, realizando algún informe "
+"teórico de beneficios."
#. module: base
#: model:ir.module.module,description:base.module_crm
" * Commitment Date\n"
" * Effective Date\n"
msgstr ""
+"\n"
+"Añade información adicional al pedido de venta.\n"
+"===================================================\n"
+"\n"
+"Puede añadir las siguientes fechas adicionales a un pedido de venta:\n"
+"-----------------------------------------------------------\n"
+" * Fecha solicitada\n"
+" * Fecha de confirmación\n"
+" * Fecha efectiva\n"
#. module: base
#: help:ir.actions.act_window,res_id:0
"Database ID of record to open in form view, when ``view_mode`` is set to "
"'form' only"
msgstr ""
+"Id. de la base datos del registro para abrir en el formulario de vista, "
+"cuando se establece el modo de visto únicamente a 'formulario'"
#. module: base
#: field:res.partner.address,name:0
"There is already a shared filter set as default for %(model)s, delete or "
"change it before setting a new default"
msgstr ""
+"Ya existe un filtro compartido por defecto para %(model)s, elimínelo o "
+"cámbielo antes de configurar uno nuevo"
#. module: base
#: code:addons/orm.py:2648
#. module: base
#: field:ir.model.relation,name:0
msgid "Relation Name"
-msgstr ""
+msgstr "Nombre de relación"
#. module: base
#: view:ir.rule:0
msgid "Create Access Right"
-msgstr ""
+msgstr "Crear permisos de acceso"
#. module: base
#: model:res.country,name:base.tv
#. module: base
#: view:workflow.transition:0
msgid "Workflow Transition"
-msgstr ""
+msgstr "Transición del flujo de trabajo"
#. module: base
#: model:res.country,name:base.gf
#. module: base
#: model:res.partner.title,name:base.res_partner_title_mister
msgid "Mister"
-msgstr ""
+msgstr "Señor"
#. module: base
#: help:res.country,code:0
#. module: base
#: view:ir.mail_server:0
msgid "Outgoing Mail Server"
-msgstr ""
+msgstr "Servidor de correo saliente"
#. module: base
#: help:ir.actions.act_window,context:0
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+"Pulse para añadir un contacto en la libreta de direcciones.\n"
+"</p><p>\n"
+"OpenERP le ayuda a gestionar todas las actividades relacionadas con los "
+"clientes: discusiones, historial de oportunidades de negocio, documentos, "
+"etc.\n"
+"</p>\n"
+" "
#. module: base
#: model:ir.module.module,description:base.module_web_linkedin
#. module: base
#: model:ir.model,name:base.model_res_config_settings
msgid "res.config.settings"
-msgstr ""
+msgstr "Parámetros de configuración"
#. module: base
#: help:res.partner,image_small:0
"image, with aspect ratio preserved. Use this field anywhere a small image is "
"required."
msgstr ""
+"Imagen de tamaño pequeño de este contacto. Se redimensiona automáticamente a "
+"64x64 px, con el ratio de aspecto preservado. Use este campo donde se "
+"requiera una imagen pequeña."
#. module: base
#: help:ir.actions.server,mobile:0
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_calendar
msgid "Web Calendar"
-msgstr ""
+msgstr "Calendario web"
#. module: base
#: selection:base.language.install,lang:0
#: field:base.language.export,name:0
#: field:ir.attachment,datas_fname:0
msgid "File Name"
-msgstr ""
+msgstr "Nombre de Archivo"
#. module: base
#: model:res.country,name:base.rs
#: code:addons/base/ir/ir_fields.py:196
#, python-format
msgid "'%s' does not seem to be a valid date for field '%%(field)s'"
-msgstr ""
+msgstr "'%s' no parece ser una fecha valida para el campo '%%(field)s'"
#. module: base
#: view:res.partner:0
msgid ""
"Type of the constraint: `f` for a foreign key, `u` for other constraints."
msgstr ""
+"Tipo de restricción: 'f' para un clave foránea, 'u' para otras restricciones."
#. module: base
#: view:ir.actions.report.xml:0
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_gantt
msgid "Web Gantt"
-msgstr ""
+msgstr "Diagrama Gantt web"
#. module: base
#: model:ir.actions.act_window,name:base.act_menu_create
#. module: base
#: model:ir.module.module,shortdesc:base.module_fleet
msgid "Fleet Management"
-msgstr ""
+msgstr "Gestión de Flotas"
#. module: base
#: help:ir.server.object.lines,value:0
#. module: base
#: field:ir.rule,perm_read:0
msgid "Apply for Read"
-msgstr ""
+msgstr "Aplicar para lectura"
#. module: base
#: model:res.country,name:base.mn
#: code:addons/base/ir/ir_model.py:727
#, python-format
msgid "Document model"
-msgstr ""
+msgstr "Modelo de documento"
#. module: base
#: view:res.lang:0
#. module: base
#: field:ir.module.module,installed_version:0
msgid "Latest Version"
-msgstr ""
+msgstr "Última versión"
#. module: base
#: view:ir.rule:0
msgid "Delete Access Right"
-msgstr ""
+msgstr "Eliminar permiso de acceso"
#. module: base
#: code:addons/base/ir/ir_mail_server.py:213
#. module: base
#: view:ir.rule:0
msgid "Record Rule"
-msgstr ""
+msgstr "Regla de registro"
#. module: base
#: model:res.country,name:base.kr
#. module: base
#: field:ir.rule,perm_unlink:0
msgid "Apply for Delete"
-msgstr ""
+msgstr "Aplicar para eliminación"
#. module: base
#: selection:ir.property,type:0
#. module: base
#: model:ir.actions.client,name:base.action_client_base_menu
msgid "Open Settings Menu"
-msgstr ""
+msgstr "Abrir menú 'Configuración'"
#. module: base
#: selection:base.language.install,lang:0
#. module: base
#: field:ir.actions.report.xml,attachment:0
msgid "Save as Attachment Prefix"
-msgstr ""
+msgstr "Prefijo del adjunto al guardar como"
#. module: base
#: field:ir.ui.view_sc,res_id:0
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_fr_hr_payroll
msgid "French Payroll"
-msgstr ""
+msgstr "Nomina de Francia"
#. module: base
#: view:ir.ui.view:0
"=============\n"
" "
msgstr ""
+"\n"
+"Este módulo añade el menú y características de reclamaciones al portal si "
+"los módulos 'claim' y 'portal' están instalados.\n"
+"============================================================================="
+"====================\n"
+" "
#. module: base
#: model:ir.actions.act_window,help:base.action_res_partner_bank_account_form
#. module: base
#: model:res.country,name:base.mf
msgid "Saint Martin (French part)"
-msgstr ""
+msgstr "San Martín (zona francesa)"
#. module: base
#: model:ir.model,name:base.model_ir_exports
#: model:ir.module.category,name:base.module_category_social_network
#: model:ir.module.module,shortdesc:base.module_mail
msgid "Social Network"
-msgstr ""
+msgstr "Red Social"
#. module: base
#: view:res.lang:0
#. module: base
#: view:res.company:0
msgid "Report Footer Configuration"
-msgstr ""
+msgstr "Configuración de pie de informe"
#. module: base
#: field:ir.translation,comments:0
msgid "Translation comments"
-msgstr ""
+msgstr "Comentarios de traducción"
#. module: base
#: model:ir.module.module,description:base.module_lunch
#. module: base
#: help:res.partner,website:0
msgid "Website of Partner or Company"
-msgstr ""
+msgstr "Sitio web de la empresa o compañía"
#. module: base
#: help:base.language.install,overwrite:0
#. module: base
#: model:ir.module.module,summary:base.module_sale
msgid "Quotations, Sale Orders, Invoicing"
-msgstr ""
+msgstr "Presupuestos, órdenes de venta, facturación"
#. module: base
#: field:res.users,login:0
"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-19 19:49+0000\n"
+"PO-Revision-Date: 2012-12-20 18:03+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-20 04:41+0000\n"
+"X-Launchpad-Export-Date: 2012-12-21 04:38+0000\n"
"X-Generator: Launchpad (build 16378)\n"
#. module: base
#: code:addons/base/module/wizard/base_language_install.py:53
#, python-format
msgid "Language Pack"
-msgstr ""
+msgstr "Keelepakett"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_tests
#: code:addons/base/res/res_users.py:311
#, python-format
msgid "Can not remove root user!"
-msgstr "Ei saa eemaldada root kasutajat!"
+msgstr "Ei saa eemaldada juurkasutajat!"
#. module: base
#: model:res.country,name:base.mw
#: model:res.groups,name:base.group_sale_manager
#: model:res.groups,name:base.group_tool_manager
msgid "Manager"
-msgstr ""
+msgstr "Juht"
#. module: base
#: code:addons/base/ir/ir_model.py:718
#: view:res.users:0
#, python-format
msgid "Application"
-msgstr ""
+msgstr "Rakendamine"
#. module: base
#: model:res.groups,comment:base.group_hr_manager
"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 ""
+"Valitud keel on edukalt paigaldatud. Muudatuste nägemiseks pead sa muutma "
+"kasutaja eelistusi ja avama uue menüü."
#. module: base
#: field:ir.actions.act_window.view,view_id:0
#. module: base
#: model:ir.module.category,name:base.module_category_accounting_and_finance
msgid "Accounting & Finance"
-msgstr ""
+msgstr "Raamatupidamine ja rahandus"
#. module: base
#: field:ir.actions.server,write_id:0
#: model:ir.module.category,name:base.module_category_usability
#: view:res.users:0
msgid "Usability"
-msgstr ""
+msgstr "Kasutatavus"
#. module: base
#: field:ir.actions.act_window,domain:0
#. module: base
#: view:ir.module.module:0
msgid "Apps"
-msgstr ""
+msgstr "Rakendused"
#. module: base
#: view:ir.ui.view_sc:0
#. module: base
#: model:res.groups,name:base.group_partner_manager
msgid "Contact Creation"
-msgstr ""
+msgstr "Kontaktide loomine"
#. module: base
#: view:ir.module.module:0
#: view:res.partner:0
#: field:res.users,company_ids:0
msgid "Companies"
-msgstr "Firmad"
+msgstr "Ettevõtted"
#. module: base
#: help:res.currency,symbol:0
#: view:res.users:0
#: view:wizard.ir.model.menu.create:0
msgid "Cancel"
-msgstr "Tühista"
+msgstr "Loobu"
#. module: base
#: code:addons/orm.py:1509
#. module: base
#: model:res.groups,name:base.group_multi_company
msgid "Multi Companies"
-msgstr ""
+msgstr "Mitu ettevõtet"
#. module: base
#: help:res.users,menu_id:0
#: model:ir.ui.menu,name:base.next_id_64
#: view:res.users:0
msgid "Sales"
-msgstr "Müügid"
+msgstr "Müük"
#. module: base
#: field:ir.actions.server,child_ids:0
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_stock
msgid "Sales and Warehouse Management"
-msgstr ""
+msgstr "Müük ja laohaldus"
#. module: base
#: field:ir.model.fields,model:0
#. module: base
#: model:res.groups,name:base.group_no_one
msgid "Technical Features"
-msgstr ""
+msgstr "Tehnilised funktsioonid"
#. module: base
#: selection:base.language.install,lang:0
#: view:res.users:0
#: field:res.users,company_id:0
msgid "Company"
-msgstr "Firma"
+msgstr "Ettevõte"
#. module: base
#: model:ir.module.category,name:base.module_category_report_designer
"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-19 16:59+0000\n"
+"PO-Revision-Date: 2012-12-20 15:01+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-20 04:41+0000\n"
+"X-Launchpad-Export-Date: 2012-12-21 04:38+0000\n"
"X-Generator: Launchpad (build 16378)\n"
#. module: base
" the rightmost column (value) contains the "
"translations"
msgstr ""
+"CSV formátum: szerkessze egyenesen a megszokott táblázatkezelő "
+"alkalmazásával,\n"
+" a leg jobboldalt lévő oszlop (érték) "
+"tartalmazza a fordításokat"
#. module: base
#: model:ir.module.module,description:base.module_account_chart
"\n"
"Deactivates minimal chart of accounts.\n"
msgstr ""
+"\n"
+"a minimum számlatükör kikapcsolása.\n"
+"=============================\n"
+"\n"
+"Kikapcsolja a minimum számlatükröket.\n"
#. module: base
#: model:ir.module.module,shortdesc:base.module_base_crypt
msgid "DB Password Encryption"
-msgstr ""
+msgstr "DB adatbázis jelszó titkosítás"
#. module: base
#: help:workflow.transition,act_to:0
#. module: base
#: model:ir.module.module,shortdesc:base.module_project_issue
msgid "Issue Tracker"
-msgstr ""
+msgstr "Ügy nyomonkövetése"
#. module: base
#: view:base.module.update:0
"The common interface for plug-in.\n"
"=================================\n"
msgstr ""
+"\n"
+"A plug-in általános intefész\n"
+"============================\n"
#. module: base
#: model:ir.module.module,description:base.module_sale_crm
"modules.\n"
" "
msgstr ""
+"\n"
+"Ez a modul útvonal rövidítéseket ad meg egy vagy több lehetséges eseményhez "
+"a CRM (ügyfélkapcsolat kezelőben).\n"
+"===========================================================================\n"
+"\n"
+"Ezek a rövidebb utak lehetővé teszik a kiválasztott esemény alapján generált "
+"megrendelések létrehozását.\n"
+"Különböző eseményekhez megnyílik (egy lista), ez generálja az események "
+"szerinti megrendeléseket.\n"
+"Az esemény ezután lezárásra kerül és hozzá lesz csatolva egy generált "
+"megrendeléshez.\n"
+"\n"
+"Ajánljuk ennek a modulnak a telepítését, ha az eladás és a crm modult is "
+"telepítette már.\n"
+" "
#. module: base
#: model:res.country,name:base.bq
msgid "Bonaire, Sint Eustatius and Saba"
-msgstr ""
+msgstr "Karib tengeri Bonaire, Sint Eustatius and Saba"
#. module: base
#: model:ir.actions.report.xml,name:base.ir_module_reference_print
"your home page.\n"
"You can track your suppliers, customers and other contacts.\n"
msgstr ""
+"\n"
+"Ez a modul egy gyors áttekintést tesz lehetővé a címjegyzékén, ami elérhető "
+"a saját oldaláról.\n"
+"Nyomon követheti a beszállítóit, vásárlóit és egyéb ügyfeleit.\n"
#. module: base
#: help:res.company,custom_footer:0
"Check this to define the report footer manually. Otherwise it will be "
"filled in automatically."
msgstr ""
+"Jelölje be a kimutatás lábjegyzet kézi meghatározásához. Egyébként "
+"automatikusan ki lesz töltve."
#. module: base
#: view:res.partner:0
#. module: base
#: model:ir.ui.menu,name:base.menu_import_crm
msgid "Import & Synchronize"
-msgstr ""
+msgstr "Import & Szinkronizáció"
#. module: base
#: view:res.partner:0
#: field:ir.model.constraint,date_init:0
#: field:ir.model.relation,date_init:0
msgid "Initialization Date"
-msgstr ""
+msgstr "Alap adatok"
#. module: base
#: model:res.country,name:base.vu
" Unit price=225, Discount=0,00, Net price=225.\n"
" "
msgstr ""
+"\n"
+"Ez a modul lehetővé teszi az árengedmények számítását a megrendelések és "
+"számlák sorain a partner árlistája alapján.\n"
+"============================================================================="
+"==================================\n"
+"\n"
+"Ehhez egy új jelölő négyzet lesz, melynek neve 'látható árengedmény', hozzá "
+"lesz adva az árlista formához.\n"
+"\n"
+"**Például:**\n"
+" A PC1 termékhez és az \"ASUSTEK\" partnerhez: ha a listaár=450, és az ár "
+"az \n"
+" Asustek árlista ár=255 árból lett kalkulálva. Ha be van jelölve a "
+"négyzet akkor\n"
+" megrendelés sorához ez lesz jelölve: Egységár=450, Árengedmény=50,00, "
+"Nettó ár=225.\n"
+" Ha nincs bejelölve a négyzet akkor a megrendelés és a számla sorain a "
+"következő lesz:\n"
+" Egységár=225, Árengedmény=0,00, Nettó ár=225.\n"
+" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_crm
"OpenOffice. \n"
"Once you have modified it you can upload the report using the same wizard.\n"
msgstr ""
+"\n"
+"Ez a modul együtt lesz használva az OpenERP OpenOffice Pluginnal.\n"
+"=========================================================\n"
+"\n"
+"Ez a modul az Import/Export .sxw kimutatáshoz varázsló ad amit az OpenOffice-"
+"al tud módosítani.. \n"
+"módosítás után ezzel a varázslóval újra fel tudja tölteni a kimutatást.\n"
#. module: base
#: view:base.module.upgrade:0
#. module: base
#: selection:ir.mail_server,smtp_encryption:0
msgid "TLS (STARTTLS)"
-msgstr ""
+msgstr "TLS (STARTTLS)"
#. module: base
#: help:ir.actions.act_window,usage:0
"* Moves Analysis\n"
" "
msgstr ""
+"\n"
+"Több-raktárhely kezelése, multi- és struktúrált raktár helyek\n"
+"==============================================================\n"
+"\n"
+"A raktár és leltár kezelés a hierarchikus elhelyezkedés struktúrán alapul, a "
+"raktárhelyből a raktárba kapcsolattal. \n"
+"A dupla bevitelű raktár rendszer lehetővé teszi a vevők és beszállítók "
+"kezelését beleértve a gyártási raktárkészletet is. \n"
+"\n"
+"OpenERP-ben megvan a lehetőség a köteg és gyáriszám kezelésre biztosítva a "
+"nyomon követhetőséget, ami a gyártást szavatolja.\n"
+"\n"
+"Fő jellemzők\n"
+"-------------\n"
+"* Mozgások előzményei és tervezése,\n"
+"* Raktár értékelése (alapár vagy átlagár, ...)\n"
+"* Erőteljesség a raktárkészlet különbségek tükrében\n"
+"* Automata újrarendelés szabályok\n"
+"* Bárkódok támogatása\n"
+"* Gyors hiba érzékelés a dupla beviteli rendszer miatt\n"
+"* Nyomon követhetőség (ellentétes irányú / Folyamat irányú, Széria számok, "
+"...)\n"
+"\n"
+"Dashboard / Műszerfal kimutatások a Raktárhely kezeléshez ideérve:\n"
+"----------------------------------------------------------\n"
+"* Bejövő áruk (Grafikon)\n"
+"* Kimenő áruk (Grafikon)\n"
+"* Lehetséges beszerzés\n"
+"* Raktári tételek analízisei / elemzései\n"
+"* Záró tételek raktárhelyei\n"
+"* Mozgás analízis, elemzés\n"
+" "
#. module: base
#: model:ir.module.module,description:base.module_document_page
#. module: base
#: view:ir.rule:0
msgid "Detailed algorithm:"
-msgstr ""
+msgstr "Részletes algoritmus:"
#. module: base
#: field:ir.actions.act_url,usage:0
#. module: base
#: field:ir.module.module,name:0
msgid "Technical Name"
-msgstr ""
+msgstr "Technikai név"
#. module: base
#: model:ir.model,name:base.model_workflow_workitem
#. module: base
#: view:res.users:0
msgid "Allowed Companies"
-msgstr ""
+msgstr "Engedélyezett vállalatok"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_de
#. module: base
#: view:ir.sequence:0
msgid "Day of the Year: %(doy)s"
-msgstr ""
+msgstr "Az év napja: %(doy)s"
#. module: base
#: field:ir.ui.menu,web_icon:0
"If this field is empty, the view applies to all users. Otherwise, the view "
"applies to the users of those groups only."
msgstr ""
+"Ha ez a mező üres, akkor a nézet az összes felhasználóra érvényes. "
+"Egyébként, csak arra a kijelölt csoport felhasználóra vonatkozik a nézet."
#. module: base
#: selection:base.language.install,lang:0
"customers' expenses if your work by project.\n"
" "
msgstr ""
+"\n"
+"Munkavállalók szerinti kiadások kezelése\n"
+"============================\n"
+"\n"
+"Ez az alkalmazás lehetővé teszi a munkavállalók napi kiadásait. Hozzáférést "
+"biztosít a munkavállalói kiadási jegyzeteihez és azok kiegészítésének és "
+"érvényesítésének jogához vagy érvénytelenítheti is a jegyzeteket. Az "
+"érvényesítés után egy számlát készít a munkavállaló részére.\n"
+"A munkavállalók bevihetik a saját kiadásaikat amit az érvényesítési út "
+"automatikusan felad könyvelésre az osztályvezető érvényesítése után.\n"
+"\n"
+"\n"
+"A teljes folyamat a következő:\n"
+"----------------------------------\n"
+"* Kiadás terve\n"
+"* a munkavállaló visszaigazolása a listára\n"
+"* az osztályvezetője általi érvényesítés\n"
+"* a könyvelő érvényesítése és számla készítés\n"
+"\n"
+"Ez a modul használja az analitikai, elemző számlát és kompatibilis az "
+"időbeosztásos számlázás modullal így automatikus munkavállalói kiadás újra-"
+"számlázást készíthet ha projektenként dolgozik.\n"
+" "
#. module: base
#: view:base.language.export:0
msgid "Export Settings"
-msgstr ""
+msgstr "A beállítások exportálása"
#. module: base
#: field:ir.actions.act_window,src_model:0
msgid "Source Model"
-msgstr ""
+msgstr "Modell forrás"
#. module: base
#: view:ir.sequence:0
msgid "Day of the Week (0:Monday): %(weekday)s"
-msgstr ""
+msgstr "A hét napja (0:Hétfő): %(weekday)s"
#. module: base
#: code:addons/base/module/wizard/base_module_upgrade.py:84
#: code:addons/base/ir/ir_model.py:1023
#, python-format
msgid "Administrator access is required to uninstall a module"
-msgstr ""
+msgstr "Adminisztrátori hozzáférés szükséges a modul törléséhez"
#. module: base
#: model:ir.model,name:base.model_base_module_configuration
"\n"
"(Document type: %s, Operation: %s)"
msgstr ""
+"Az igényelt műveletet nem lehetett végrehajtani biztonsági korlátok miatt. "
+"Kérem vegye fel a kapcsolatot a rendszer adminisztrátorral.\n"
+"\n"
+"(Dokumentum típus: %s, Művelet: %s)"
#. module: base
#: model:ir.module.module,description:base.module_idea
"The managers can obtain an easy view of best ideas from all the users.\n"
"Once installed, check the menu 'Ideas' in the 'Tools' main menu."
msgstr ""
+"\n"
+"Ez a modul lehetővé teszi a felhasználók könnyű és hatékony vállalati "
+"fejlesztéshez való csatlakozását.\n"
+"============================================================================="
+"==========\n"
+"\n"
+"Lehetővé teszi mindenki számára az ötleteinek közzétételét a különböző "
+"témákban.\n"
+"Ezután, a többi felhasználó megjegyzéseket fűzhet hozzá és szavazhat egy "
+"bizonyos ötletre.\n"
+"Minden ötletnek van egy pontértékelése a szavazatok alapján.\n"
+"A vezető rálát az összes felhasználóra és az ötleteikre.\n"
+"Ha telepítve lett, az 'eszközök' menü 'ötletek' címszó alatt találja az meg."
#. module: base
#: code:addons/orm.py:5248
"%s This might be '%s' in the current model, or a field of the same name in "
"an o2m."
msgstr ""
+"%s Ez lehet, hogy '%s' a jelenlegi modellben, vagy egy mező ugyanazzal a "
+"névvel az o2m-ben."
#. module: base
#: model:ir.module.module,description:base.module_account_payment
"have a new option to import payment orders as bank statement lines.\n"
" "
msgstr ""
+"\n"
+"Modul a beszállítók számlái kifizetésének kezeléséhez.\n"
+"=======================================================\n"
+"\n"
+"Ez a modul lehetővé teszi a kifizetések létrehozását és kezelését, a "
+"következő szándékkal\n"
+"-----------------------------------------------------------------------------"
+"---- \n"
+" * egy a könnyű plug-in alap variációkból az automatikus kifizetés "
+"működtetésre.\n"
+" * lehetővé teszi a hatékonyabb számla kifizetés szervezést.\n"
+"\n"
+"Figyelem:\n"
+"~~~~~~~~\n"
+"A kifizetés megbízás visszaigazolása nem készít könyvelés bejegyzést, csak "
+"rögzíti a \n"
+"tényt ,hogy elkészítette a bankhoz a megbízást. A megbízás bevitelét\n"
+"el kell végezni a szokásos módon a banki kivonattal. Azonban, ezt csak\n"
+"akkor, ha megjött a banktól a kivonat, hogy azt a bank befogadta \n"
+"azt és ekkor beviheti azt a könyvelésébe is. Ennek a műveletnek a "
+"segítségéhez, lesz\n"
+"egy új lehetősége a fizetési megbízás importálása mint banki kivonat sorok.\n"
+" "
#. module: base
#: field:ir.model,access_ids:0
#: field:res.partner,vat:0
#, python-format
msgid "TIN"
-msgstr ""
+msgstr "TIN"
#. module: base
#: model:res.country,name:base.aw
#: code:addons/base/module/wizard/base_module_import.py:58
#, python-format
msgid "File is not a zip file!"
-msgstr ""
+msgstr "A fájl nem zip fájl!"
#. module: base
#: model:res.country,name:base.ar
#. module: base
#: model:ir.module.module,summary:base.module_purchase
msgid "Purchase Orders, Receptions, Supplier Invoices"
-msgstr ""
+msgstr "Megrendelések, Átvétel igazolások, Beszállítói számlák"
#. module: base
#: model:ir.module.module,description:base.module_hr_payroll
" * Integrated with Holiday Management\n"
" "
msgstr ""
+"\n"
+"Általános bérszámfejtői rendszer\n"
+"=======================\n"
+"\n"
+" * Munkavállalók adatai\n"
+" * Munkavállalók szerződései\n"
+" * Útlevél alapú szerződés\n"
+" * Engedmények/Levonások\n"
+" * Lehetőség az alap/Bruttó/Nettó fizetés beállításához\n"
+" * Munkavállalók fizetési papírjai\n"
+" * Havi bérszámfejtési regiszter\n"
+" * Integrálva a szabadság szervezővel\n"
+" "
#. module: base
#: model:ir.model,name:base.model_ir_model_data
#. module: base
#: field:base.language.import,code:0
msgid "ISO Code"
-msgstr ""
+msgstr "ISO Kód"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_fr
#. module: base
#: selection:res.partner,type:0
msgid "Shipping"
-msgstr ""
+msgstr "Szállítás"
#. module: base
#: model:ir.module.module,description:base.module_project_mrp
"the\n"
"task is completed.\n"
msgstr ""
+"\n"
+"Az beszerzéssoraiból automatikusan készít projekt/terv feladatot.\n"
+"===========================================================\n"
+"\n"
+"Ez a modul minden beszerzés igény sorból elkészít egy új feladatot\n"
+"(pl.: a megrendelés sorait), ha a szóban forgó termék kielégíti a következő\n"
+"jellemzőket:\n"
+"\n"
+" * Termék típusa = Szolgáltatás\n"
+" * Beszerzés módszere (Megrendelés végrehajtás) = MTO (Rendelés "
+"előkészítése)\n"
+" * Ellátás/Beszerzés módszer = Gyártás\n"
+"\n"
+"Ezen felül, ha a tervet a termék leírásban meghatározták (a beszerzés "
+"fülön), \n"
+"akkor egy új munka lesz létrehozva ehhez a tervhez. Máskülönben, az új\n"
+"feladat nem függ egyik tervtől sem, és később hozzáadható egy másik tervhez "
+"kézzel.\n"
+"\n"
+"Ha a terv feladat el lett végezve vagy törölve lett, akkor a kapcsolódó "
+"beszerzés \n"
+"munkafolyamat frissítve lesz annak megfelelően. Például, ha ez a beszerzés \n"
+"egy megrendelés sorához tartozik, akkor a megrendelés sora leszállításként \n"
+"értendő, ha a feladatot elvégezték.\n"
#. module: base
#: field:ir.actions.act_window,limit:0
#. module: base
#: model:res.groups,name:base.group_hr_user
msgid "Officer"
-msgstr ""
+msgstr "Hivatalnok"
#. module: base
#: code:addons/orm.py:789
#, python-format
msgid "Serialization field `%s` not found for sparse field `%s`!"
-msgstr ""
+msgstr "Soros művelet mező `%s` nem található az elszórt mezőkhöz `%s`!"
#. module: base
#: model:res.country,name:base.jm
#: field:res.partner,color:0
#: field:res.partner.address,color:0
msgid "Color Index"
-msgstr ""
+msgstr "Szín mutató"
#. module: base
#: model:ir.actions.act_window,help:base.action_partner_category_form
"user name and password for the invitation of the survey.\n"
" "
msgstr ""
+"\n"
+"Ez a modul felmérésekhez használható.\n"
+"==================================\n"
+"\n"
+"Ez a különböző felhasználók egyes kérdéseinek a válaszán vagy vizsgálati "
+"szempontjain alapul.\n"
+"Egy felmérésnek több oldala lehet. Mindegyik oldal több kérdést tartalmazhat "
+"és mindegyik\n"
+"kérdésre több választ is tartalmazhat. Különböző felhasználó különböző "
+"választ adhat a \n"
+"különböző kérdésekre ha a felmérés elkészült. Partnerek is küldhetnek emailt "
+"a felhasználó\n"
+"nevével és jelszóval meghívásként a felmérésben való részvételhez.\n"
+" "
#. module: base
#: code:addons/base/ir/ir_model.py:163
#, python-format
msgid "Model '%s' contains module data and cannot be removed!"
-msgstr ""
+msgstr "Modell '%s' modul adatokat tartalmaz és ezért nem lehet törölni!"
#. module: base
#: model:res.country,name:base.az
#. module: base
#: model:ir.module.module,shortdesc:base.module_edi
msgid "Electronic Data Interchange (EDI)"
-msgstr ""
+msgstr "Elektormos adat kicserélés (EDI)"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_anglo_saxon
msgid "Anglo-Saxon Accounting"
-msgstr ""
+msgstr "Angolszász könyvelés"
#. module: base
#: model:res.country,name:base.vg
#. module: base
#: model:ir.module.category,name:base.module_category_generic_modules
msgid "Generic Modules"
-msgstr ""
+msgstr "Általános modulok"
#. module: base
#: model:res.country,name:base.mk
msgid "Macedonia, the former Yugoslav Republic of"
-msgstr ""
+msgstr "Macedónia, korábban Jugoszláv Köztársaság"
#. module: base
#: model:res.country,name:base.rw
"Allow users to login through OpenID.\n"
"====================================\n"
msgstr ""
+"\n"
+"Engedélyezi a felhasználók OpenID általi belépését.\n"
+"====================================\n"
#. module: base
#: help:ir.mail_server,smtp_port:0
msgid "SMTP Port. Usually 465 for SSL, and 25 or 587 for other cases."
-msgstr ""
+msgstr "SMTP Port. Rendszerint 465 az SSL, és 25 vagy 587 egyéb esetben."
#. module: base
#: model:res.country,name:base.ck
#: model:ir.module.category,name:base.module_category_hidden
#: view:res.users:0
msgid "Technical Settings"
-msgstr ""
+msgstr "Műszaki beállítások"
#. module: base
#: model:ir.module.category,description:base.module_category_accounting_and_finance
"Helps you handle your accounting needs, if you are not an accountant, we "
"suggest you to install only the Invoicing."
msgstr ""
+"Segít a könyvelés igényeinek kezelésében, ha Ön nem könyvelő, akkor azt "
+"ajánljuk, hogy csak a számlázást telepítse."
#. module: base
#: model:ir.module.module,shortdesc:base.module_plugin_thunderbird
msgid "Thunderbird Plug-In"
-msgstr ""
+msgstr "Thunderbird kiegészítő plug-in"
#. module: base
#: model:ir.module.module,summary:base.module_event
msgid "Trainings, Conferences, Meetings, Exhibitions, Registrations"
-msgstr ""
+msgstr "Képzések, Konferenciák, Találkozók, Kiállítások, Regisztrációk"
#. module: base
#: model:ir.model,name:base.model_res_country
#. module: base
#: model:res.partner.category,name:base.res_partner_category_15
msgid "Wholesaler"
-msgstr ""
+msgstr "Nagykereskedő"
#. module: base
#: model:ir.module.module,shortdesc:base.module_base_vat
#. module: base
#: view:ir.values:0
msgid "Action Bindings/Defaults"
-msgstr ""
+msgstr "Foglalások/alapértelmezett tevékenységek"
#. module: base
#: view:base.language.export:0
"file encoding, please be sure to view and edit\n"
" using the same encoding."
msgstr ""
+"fájl kódolás, kérem nézze meg és szerkessze\n"
+" ugyanazzal a kódolással."
#. module: base
#: view:ir.rule:0
#. module: base
#: model:res.country,name:base.gs
msgid "South Georgia and the South Sandwich Islands"
-msgstr ""
+msgstr "Dél-Georgia és a Dél-Sandwich-szigetek"
#. module: base
#: view:res.lang:0
#. module: base
#: model:ir.actions.act_window,name:base.open_module_tree
msgid "Install a Module"
-msgstr ""
+msgstr "Egy modul telepítése"
#. module: base
#: field:ir.module.module,auto_install:0
msgid "Automatic Installation"
-msgstr ""
+msgstr "Automata telepítés"
#. module: base
#: model:ir.module.module,description:base.module_l10n_hn
"taxes\n"
"and the Lempira currency."
msgstr ""
+"\n"
+"Hondurasz számlatükör\n"
+"\n"
+"\n"
+"This is the base module to manage the accounting chart for Honduras.\n"
+"====================================================================\n"
+" \n"
+"Agrega una nomenclatura contable para Honduras. También incluye impuestos y "
+"la\n"
+"moneda Lempira. -- Adds accounting chart for Honduras. It also includes "
+"taxes\n"
+"and the Lempira currency."
#. module: base
#: model:res.country,name:base.jp
"gives \n"
" the spreading, for the selected Analytic Accounts of Budgets.\n"
msgstr ""
+"\n"
+"Ez a modul lehetővé teszi könyvelők részére az analitika/elemzés szervezést "
+"és a keresztváltós költségvetéseket.\n"
+"==========================================================================\n"
+"\n"
+"Ha már a költségvetés meg van határozva (a "
+"Számlák/Költségvetés/Költségvetések alatt), a terv irányító vezető "
+"beállíthatja a tervezett összeget mindegyik analitikai/elemző számlán.\n"
+"\n"
+"A könyvelő láthatja a teljes tervezetet mindegyik költségvetésre annak "
+"biztosítására, hogy ne legyen több/kevesebb költségvetés mint amennyi a "
+"tervezett volt.\n"
+"\n"
+"Három kimutatás lehetséges:\n"
+"----------------------------\n"
+" 1. Az első a költségvetés listákból áll elő. Ez az elemző számlák "
+"költségeinek a kiterjesztése.\n"
+"\n"
+" 2. A második az első összegzése, ez csak az válogatott elemző számlák "
+"költségeinek a kiterjesztése.\n"
+"\n"
+" 3. Az utolsó az elérhető az analitikus/elemző számlatükörből .Ez a "
+"költségek kiterjesztése a válogatott elemző számlákon.\n"
#. module: base
#: selection:ir.actions.act_window.view,view_mode:0
"Ambiguous specification for field '%(field)s', only provide one of name, "
"external id or database id"
msgstr ""
+"Kétértelmű meghatározás a mezőre '%(field)s', csak egy nevet adjon meg, "
+"külső azonosító vagy adatbázis azonosító"
#. module: base
#: field:ir.sequence,implementation:0
msgid "Implementation"
-msgstr ""
+msgstr "Végrehajtás"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_ve
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_view_editor
msgid "View Editor"
-msgstr ""
+msgstr "Nézet szerkesztő"
#. module: base
#: view:ir.cron:0
#. module: base
#: help:res.currency,rate:0
msgid "The rate of the currency to the currency of rate 1."
-msgstr ""
+msgstr "Deviza árfolyam az 1 deviza árfolyamához."
#. module: base
#: field:ir.ui.view,name:0
#. module: base
#: model:ir.model,name:base.model_res_groups
msgid "Access Groups"
-msgstr ""
+msgstr "Csoportok hozzáférése"
#. module: base
#: selection:base.language.install,lang:0
"In that case, you can not use priorities any more on the different picking.\n"
" "
msgstr ""
+"\n"
+"Ez a modul lehetővé teszi a Just In Time számítást a beszerzési "
+"megrendelésekhez.\n"
+"==================================================================\n"
+"\n"
+"Ha telepíti ezt a modult, akkor nem kell az általános beszerzési ütemezőt\n"
+"futtatnia többé (de még mindig kell a minimum rendelési pont szabály\n"
+"ütemező, vagy például futtassa naponta).\n"
+"Minden beszerzési megrendelés azonnal futtatva lesz, ami egyes esetekben\n"
+"teljesítmény eséshez vezethet.\n"
+"\n"
+"Ez megemelheti a raktárkészletet mivel a termék le lesz foglalva amint "
+"lehet\n"
+"és az ütemezési idő nem lesz figyelembe véve többé.\n"
+"Ebben az esetben, nem használhat prioritásokat a különböző kiválogatásokon.\n"
+" "
#. module: base
#: model:res.country,name:base.hr
#: field:ir.actions.report.xml,report_sxw_content:0
#: field:ir.actions.report.xml,report_sxw_content_data:0
msgid "SXW Content"
-msgstr ""
+msgstr "SXW tartalom"
#. module: base
#: help:ir.sequence,prefix:0
#. module: base
#: model:res.partner.category,name:base.res_partner_category_4
msgid "Gold"
-msgstr ""
+msgstr "Arany"
#. module: base
#: code:addons/base/res/res_company.py:159
#. module: base
#: field:ir.model.data,complete_name:0
msgid "Complete ID"
-msgstr ""
+msgstr "Teljes azonosító"
#. module: base
#: model:res.country,name:base.tc
"Tax Identification Number. Check the box if this contact is subjected to "
"taxes. Used by the some of the legal statements."
msgstr ""
+"Adó azonosító szám. Jelölje be a négyzetet, ha a kapcsolat adóköteles. Egyes "
+"jogi kifejezések használják."
#. module: base
#: field:res.partner.bank,partner_id:0
"depending on the product's configuration.\n"
" "
msgstr ""
+"\n"
+"A beszerzések kiszámítására használ modul.\n"
+"==============================================\n"
+"\n"
+"Az MRP eljárásban, beszerzési rendeléseket a gyártási rendelések, "
+"megrendelések, \n"
+"raktári elhelyezés elindításához használják. Beszerzési rendelések "
+"automatikusan\n"
+"generáltak a rendszerből és ha hiba nem jön közbe, a felhasználó nem\n"
+"is lesz figyelmeztetve. Hiba esetén a rendszer egyes beszerzési kivételt "
+"visz\n"
+"fel az akadályozó problémáról információt küldve a felhasználónak, hogy azt\n"
+"kézzel kell megoldani (mint, darabjegyzék BoM hiánya vagy nem létező "
+"beszállító).\n"
+"\n"
+"A beszerzési rendelés elindít egy javaslatot a feltölteni kívánt termék\n"
+"automatikus beszerzésére. Ez a beszerzés elindít egy tervet, \n"
+"ami vagy a szállító felé egy beszerzés, vagy a termék beállítása szerinti \n"
+"beszerzést.\n"
+" "
#. module: base
#: code:addons/base/res/res_users.py:174
#. module: base
#: view:res.partner:0
msgid "Internal Notes"
-msgstr ""
+msgstr "Belső jegyzetek"
#. module: base
#: selection:res.partner.address,type:0
#. module: base
#: model:ir.module.module,shortdesc:base.module_purchase_requisition
msgid "Purchase Requisitions"
-msgstr ""
+msgstr "Beszerzési igénylések"
#. module: base
#: selection:ir.actions.act_window,target:0
msgid "Inline Edit"
-msgstr ""
+msgstr "Lineáris szerkesztés"
#. module: base
#: selection:ir.cron,interval_type:0
#. module: base
#: model:res.country,name:base.ss
msgid "South Sudan"
-msgstr ""
+msgstr "Dél-Szudán"
#. module: base
#: field:ir.filters,context:0
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_mrp
msgid "Sales and MRP Management"
-msgstr ""
+msgstr "Eladás és MRP (Anyagszükséglet Tervezés) szervezése"
#. module: base
#: model:ir.actions.act_window,help:base.action_partner_form
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Kattintson egy kapcsolat hozzáadásához a címtárba.\n"
+" </p><p>\n"
+" OpenERP segítséget nyújt az ügyfél tevékenységek könnyű "
+"nyomon követéséhez; \n"
+" megbeszélések, az üzleti lehetőségek története,\n"
+" dokumentumok, stb.\n"
+" </p>\n"
+" "
#. module: base
#: model:res.partner.category,name:base.res_partner_category_2
#. module: base
#: model:ir.module.module,shortdesc:base.module_stock_invoice_directly
msgid "Invoice Picking Directly"
-msgstr ""
+msgstr "Árukiválogatás számlázása közvetlenül"
#. module: base
#: selection:base.language.install,lang:0
"on a supplier purchase order into several accounts and analytic plans.\n"
" "
msgstr ""
+"\n"
+"alap modul az elemző megoszlások és beszerzési megrendelésekhez.\n"
+"====================================================================\n"
+"\n"
+"Lehetővé teszi a felhasználók egyes elemző terveinek karbantartását. Ez "
+"lehetővé\n"
+"teszi a beszállító beszerzési megrendelés sorainak szétválasztását több "
+"számlára és elemző tervekre.\n"
+" "
#. module: base
#: model:res.country,name:base.lk
"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 23:39+0000\n"
+"PO-Revision-Date: 2012-12-20 23:39+0000\n"
"Last-Translator: Sergio Corato <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: 2012-12-20 04:42+0000\n"
+"X-Launchpad-Export-Date: 2012-12-21 04:38+0000\n"
"X-Generator: Launchpad (build 16378)\n"
#. module: base
#. module: base
#: help:res.partner,employee:0
msgid "Check this box if this contact is an Employee."
-msgstr "Seleziona questo box se il contatto è un Impiegato."
+msgstr "Seleziona questo box se il contatto è un Dipendente."
#. module: base
#: help:ir.model.fields,domain:0
"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-19 19:34+0000\n"
+"PO-Revision-Date: 2012-12-20 20:38+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-20 04:42+0000\n"
+"X-Launchpad-Export-Date: 2012-12-21 04:38+0000\n"
"X-Generator: Launchpad (build 16378)\n"
#. module: base
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale
msgid "Sales Management"
-msgstr ""
+msgstr "Gestionarea vanzarilor"
#. module: base
#: help:res.partner,user_id:0
#. module: base
#: field:res.lang,date_format:0
msgid "Date Format"
-msgstr "Format data"
+msgstr "Formatul Datei"
#. module: base
#: model:ir.module.module,shortdesc:base.module_base_report_designer
#. module: base
#: model:res.partner.title,name:base.res_partner_title_mister
msgid "Mister"
-msgstr ""
+msgstr "Domnul"
#. module: base
#: help:res.country,code:0
#. module: base
#: view:ir.mail_server:0
msgid "Outgoing Mail Server"
-msgstr ""
+msgstr "Server Iesire E-mail-uri"
#. module: base
#: help:ir.actions.act_window,context:0
#: help:ir.actions.server,action_id:0
msgid "Select the Action Window, Report, Wizard to be executed."
msgstr ""
-"Selectati Fereastra de Actiune, Raport sau Asistent care urmeaza a fi "
+"Selectati Fereastra de Actiune, Raportul sau Asistentul care urmeaza a fi "
"executat(a)."
#. module: base
"module named account_voucher.\n"
" "
msgstr ""
+"\n"
+"Contabilitate si Management Financiar.\n"
+"====================================\n"
+"\n"
+"Modulul Finante si contabilitate acopera:\n"
+"--------------------------------------------\n"
+" * Contabilitatea Generala\n"
+" * Costuri/Contabilitatea analitica\n"
+" * Contabilitatea partii terte\n"
+" * Gestonarea taxelor si impozitelor\n"
+" * Bugete\n"
+" * Facturile Clientului si ale Furnizorului\n"
+" * Extrase bancare\n"
+" * Procesul de reconciliere dupa partener\n"
+"\n"
+"Creeaza un panou pentru contabili care include:\n"
+"--------------------------------------------------\n"
+" Lista cu Facturile Clientilor care trebuie aprobate\n"
+" Analiza Companiei\n"
+" Grafic Trezorerie\n"
+"\n"
+"Procesele precum pastrarea unui registru contabil general sunt efectuate "
+"prin Jurnalele financiare definite (linia inregistrarii sau gruparea se face "
+"prin jurnal) \n"
+"pentru un anumit an financiar, iar pentru pregatirea voucher-elor exista un "
+"modul numit account_voucher (cont_voucher).\n"
+" "
#. module: base
#: view:ir.model:0
" </p>\n"
" "
msgstr ""
+"<p clasa=\"oe_vizualizare_niciuncontinut_creeaza\">\n"
+" Faceti click pentru a adauga un contact in agenda "
+"dumneavoastra.\n"
+" </p><p>\n"
+" OpenERP va ajuta sa tineti evidenta cu usurinta a tuturor "
+"activitatilor legate de\n"
+" un client: discutii, istoricul oportunitatilor de afaceri,\n"
+" documente, etc.\n"
+" </p>\n"
+" "
#. module: base
#: model:ir.module.module,description:base.module_web_linkedin
"This module provides the Integration of the LinkedIn with OpenERP.\n"
" "
msgstr ""
+"\n"
+"Modulul OpenERP Web LinkedIn.\n"
+"============================\n"
+"Acest modul asigura Integrarea lui LinkedIn in OpenERP.\n"
+" "
#. module: base
#: help:ir.actions.act_window,src_model:0
#. module: base
#: help:ir.cron,nextcall:0
msgid "Next planned execution date for this job."
-msgstr "Data urmatoarei executii planificate pentru acest proiect"
+msgstr "Data urmatoarei executii planificate pentru aceasta sarcina."
#. module: base
#: model:res.country,name:base.er
#. module: base
#: model:ir.ui.menu,name:base.menu_base_action_rule_admin
msgid "Automated Actions"
-msgstr "Actiuni automate"
+msgstr "Actiuni Automate"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_ro
#. module: base
#: model:ir.model,name:base.model_res_config_settings
msgid "res.config.settings"
-msgstr ""
+msgstr "res.configurare.setari"
#. module: base
#: help:res.partner,image_small:0
"image, with aspect ratio preserved. Use this field anywhere a small image is "
"required."
msgstr ""
+"Imagine de dimensiune mica a acestui contact. Este redimensionata automat ca "
+"o imagine de 64x64px, cu raportul aspect pastrat. Folositi acest camp "
+"oriunde este necesara o imagine mica."
#. module: base
#: help:ir.actions.server,mobile:0
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_calendar
msgid "Web Calendar"
-msgstr ""
+msgstr "Calendar Web"
#. module: base
#: selection:base.language.install,lang:0
#: field:base.language.export,name:0
#: field:ir.attachment,datas_fname:0
msgid "File Name"
-msgstr ""
+msgstr "Nume Fisier"
#. module: base
#: model:res.country,name:base.rs
"also possible in order to automatically create a meeting when a holiday "
"request is accepted by setting up a type of meeting in Leave Type.\n"
msgstr ""
+"\n"
+"Gestioneaza concediile si cererile de alocare\n"
+"=====================================\n"
+"\n"
+"Aceasta aplicatie controleaza programul de concedii al companiei "
+"dumneavoastra. Le permite angajatilor sa solicite concedii. Astfel, "
+"managerii pot verifica cererile pentru concedii si le pot aproba sau "
+"respinge. In acest mod puteti controla planificarea in ansamblu a "
+"concediilor pentru companie sau departament.\n"
+"\n"
+"Puteti configura diverse tipuri de concedii (de boala, de odihna, zile "
+"platite, ...) si aloca repede concedii unui angajat sau departament folosind "
+"cererile de alocare. Un angajat poate de asemenea sa faca o cerere pentru "
+"mai multe zile libere facand o noua ALocare. Acest lucru va mari totalul "
+"zilelor disponibile pentru acel tip de concediu (daca cererea este "
+"acceptata).\n"
+"\n"
+"Puteti tine evidenta concediilor in diverse moduri urmarind rapoartele: \n"
+"\n"
+"* Rezumat Concedii \n"
+"* Concedii pe Departamente\n"
+"* Analiza Concediilor\n"
+"\n"
+"O sincronizare cu o agenda interna (Intalnirile modulului MRC) este de "
+"asemenea posibila pentru a crea in mod automat o intalnire atunci cand o "
+"cerere de concediu este acceptata prin setarea unui tip de intalnire in "
+"Tipul Concediului.\n"
#. module: base
#: selection:base.language.install,lang:0
#: code:addons/base/ir/ir_fields.py:196
#, python-format
msgid "'%s' does not seem to be a valid date for field '%%(field)s'"
-msgstr ""
+msgstr "'%s' nu pare a fi o data valabila pentru campul '%%(field)s'"
#. module: base
#: view:res.partner:0
from docutils.writers.html4css1 import Writer
import imp
import logging
+import os
import re
+import shutil
+import tempfile
import urllib
+import urllib2
+import zipfile
import zipimport
+try:
+ from cStringIO import StringIO
+except ImportError:
+ from StringIO import StringIO # NOQA
+
import openerp
-from openerp import modules, pooler, release, tools, addons
+from openerp import modules, pooler, tools, addons
from openerp.modules.db import create_categories
from openerp.tools.parse_version import parse_version
from openerp.tools.translate import _
'res_model': 'base.module.upgrade',
'target': 'new',
'type': 'ir.actions.act_window',
- 'nodestroy':True,
+ 'nodestroy': True,
}
+def backup(path, raise_exception=True):
+ path = os.path.normpath(path)
+ if not os.path.exists(path):
+ if not raise_exception:
+ return None
+ raise OSError('path does not exists')
+ cnt = 1
+ while True:
+ bck = '%s~%d' % (path, cnt)
+ if not os.path.exists(bck):
+ shutil.move(path, bck)
+ return bck
+ cnt += 1
+
+
class module_category(osv.osv):
_name = "ir.module.category"
_description = "Application"
- def _module_nbr(self,cr,uid, ids, prop, unknow_none, context):
+ def _module_nbr(self, cr, uid, ids, prop, unknow_none, context):
cr.execute('SELECT category_id, COUNT(*) \
FROM ir_module_module \
WHERE category_id IN %(ids)s \
FROM ir_module_category \
WHERE parent_id IN %(ids)s) \
GROUP BY category_id', {'ids': tuple(ids)}
- )
+ )
result = dict(cr.fetchall())
for id in ids:
cr.execute('select id from ir_module_category where parent_id=%s', (id,))
'parent_id': fields.many2one('ir.module.category', 'Parent Application', select=True),
'child_ids': fields.one2many('ir.module.category', 'parent_id', 'Child Applications'),
'module_nr': fields.function(_module_nbr, string='Number of Modules', type='integer'),
- 'module_ids' : fields.one2many('ir.module.module', 'category_id', 'Modules'),
- 'description' : fields.text("Description", translate=True),
- 'sequence' : fields.integer('Sequence'),
- 'visible' : fields.boolean('Visible'),
+ 'module_ids': fields.one2many('ir.module.module', 'category_id', 'Modules'),
+ 'description': fields.text("Description", translate=True),
+ 'sequence': fields.integer('Sequence'),
+ 'visible': fields.boolean('Visible'),
'xml_id': fields.function(osv.osv.get_external_id, type='char', size=128, string="External ID"),
}
_order = 'name'
_defaults = {
- 'visible' : 1,
+ 'visible': 1,
}
class MyFilterMessages(Transform):
info = {}
try:
info = modules.load_information_from_description_file(name)
- info['version'] = release.major_version + '.' + info['version']
except Exception:
_logger.debug('Error when trying to fetch informations for '
'module %s', name, exc_info=True)
return res
def _get_latest_version(self, cr, uid, ids, field_name=None, arg=None, context=None):
- res = dict.fromkeys(ids, '')
+ default_version = modules.adapt_version('1.0')
+ res = dict.fromkeys(ids, default_version)
for m in self.browse(cr, uid, ids):
- res[m.id] = self.get_module_info(m.name).get('version', '')
+ res[m.id] = self.get_module_info(m.name).get('version', default_version)
return res
def _get_views(self, cr, uid, ids, field_name=None, arg=None, context=None):
continue
# then, search and group ir.model.data records
- imd_models = dict( [(m,[]) for m in dmodels])
- imd_ids = model_data_obj.search(cr,uid,[('module','=', module_rec.name),
- ('model','in',tuple(dmodels))])
+ imd_models = dict([(m, []) for m in dmodels])
+ imd_ids = model_data_obj.search(cr, uid, [
+ ('module', '=', module_rec.name),
+ ('model', 'in', tuple(dmodels))
+ ])
for imd_res in model_data_obj.read(cr, uid, imd_ids, ['model', 'res_id'], context=context):
imd_models[imd_res['model']].append(imd_res['res_id'])
view_ids = imd_models.get('ir.ui.view', [])
for v in view_obj.browse(cr, uid, view_ids, context=context):
aa = v.inherit_id and '* INHERIT ' or ''
- res_mod_dic['views_by_module'].append(aa + v.name + '('+v.type+')')
+ res_mod_dic['views_by_module'].append('%s%s (%s)' % (aa, v.name, v.type))
report_ids = imd_models.get('ir.actions.report.xml', [])
for rx in report_obj.browse(cr, uid, report_ids, context=context):
for um in menu_obj.browse(cr, uid, menu_ids, context=context):
res_mod_dic['menus_by_module'].append(um.complete_name)
except KeyError, e:
- _logger.warning(
- 'Data not found for items of %s', module_rec.name)
+ _logger.warning('Data not found for items of %s', module_rec.name)
except AttributeError, e:
- _logger.warning(
- 'Data not found for items of %s %s', module_rec.name, str(e))
+ _logger.warning('Data not found for items of %s %s', module_rec.name, str(e))
except Exception, e:
- _logger.warning('Unknown error while fetching data of %s',
- module_rec.name, exc_info=True)
- for key, _ in res.iteritems():
+ _logger.warning('Unknown error while fetching data of %s', module_rec.name, exc_info=True)
+
+ for key in res.iterkeys():
for k, v in res[key].iteritems():
res[key][k] = "\n".join(sorted(v))
return res
# installed_version refer the latest version (the one on disk)
# latest_version refer the installed version (the one in database)
# published_version refer the version available on the repository
- 'installed_version': fields.function(_get_latest_version,
- string='Latest Version', type='char'),
+ 'installed_version': fields.function(_get_latest_version, string='Latest Version', type='char'),
'latest_version': fields.char('Installed Version', size=64, readonly=True),
'published_version': fields.char('Published Version', size=64, readonly=True),
'url': fields.char('URL', size=128, readonly=True),
'sequence': fields.integer('Sequence'),
- 'dependencies_id': fields.one2many('ir.module.module.dependency',
- 'module_id', 'Dependencies', readonly=True),
+ 'dependencies_id': fields.one2many('ir.module.module.dependency', 'module_id', 'Dependencies', readonly=True),
'auto_install': fields.boolean('Automatic Installation',
- help='An auto-installable module is automatically installed by the '
- 'system when all its dependencies are satisfied. '
- 'If the module has no dependency, it is always installed.'),
+ help='An auto-installable module is automatically installed by the '
+ 'system when all its dependencies are satisfied. '
+ 'If the module has no dependency, it is always installed.'),
'state': fields.selection([
- ('uninstallable','Not Installable'),
- ('uninstalled','Not Installed'),
- ('installed','Installed'),
- ('to upgrade','To be upgraded'),
- ('to remove','To be removed'),
- ('to install','To be installed')
+ ('uninstallable', 'Not Installable'),
+ ('uninstalled', 'Not Installed'),
+ ('installed', 'Installed'),
+ ('to upgrade', 'To be upgraded'),
+ ('to remove', 'To be removed'),
+ ('to install', 'To be installed')
], string='Status', readonly=True, select=True),
'demo': fields.boolean('Demo Data', readonly=True),
'license': fields.selection([
- ('GPL-2', 'GPL Version 2'),
- ('GPL-2 or any later version', 'GPL-2 or later version'),
- ('GPL-3', 'GPL Version 3'),
- ('GPL-3 or any later version', 'GPL-3 or later version'),
- ('AGPL-3', 'Affero GPL-3'),
- ('Other OSI approved licence', 'Other OSI Approved Licence'),
- ('Other proprietary', 'Other Proprietary')
+ ('GPL-2', 'GPL Version 2'),
+ ('GPL-2 or any later version', 'GPL-2 or later version'),
+ ('GPL-3', 'GPL Version 3'),
+ ('GPL-3 or any later version', 'GPL-3 or later version'),
+ ('AGPL-3', 'Affero GPL-3'),
+ ('Other OSI approved licence', 'Other OSI Approved Licence'),
+ ('Other proprietary', 'Other Proprietary')
], string='License', readonly=True),
'menus_by_module': fields.function(_get_views, string='Menus', type='text', multi="meta", store=True),
'reports_by_module': fields.function(_get_views, string='Reports', type='text', multi="meta", store=True),
return _('The name of the module must be unique !')
_sql_constraints = [
- ('name_uniq', 'UNIQUE (name)',_name_uniq_msg ),
+ ('name_uniq', 'UNIQUE (name)', _name_uniq_msg),
]
def unlink(self, cr, uid, ids, context=None):
if isinstance(ids, (int, long)):
ids = [ids]
mod_names = []
- for mod in self.read(cr, uid, ids, ['state','name'], context):
+ for mod in self.read(cr, uid, ids, ['state', 'name'], context):
if mod['state'] in ('installed', 'to upgrade', 'to remove', 'to install'):
- raise orm.except_orm(_('Error'),
- _('You try to remove a module that is installed or will be installed'))
+ raise orm.except_orm(_('Error'), _('You try to remove a module that is installed or will be installed'))
mod_names.append(mod['name'])
#Removing the entry from ir_model_data
#ids_meta = self.pool.get('ir.model.data').search(cr, uid, [('name', '=', 'module_meta_information'), ('module', 'in', mod_names)])
raise orm.except_orm(_('Error'), msg % (module_name, e.args[0]))
def state_update(self, cr, uid, ids, newstate, states_to_update, context=None, level=100):
- if level<1:
+ if level < 1:
raise orm.except_orm(_('Error'), _('Recursion error in modules dependencies !'))
demo = False
for module in self.browse(cr, uid, ids, context=context):
for dep in module.dependencies_id:
if dep.state == 'unknown':
raise orm.except_orm(_('Error'), _("You try to install module '%s' that depends on module '%s'.\nBut the latter module is not available in your system.") % (module.name, dep.name,))
- ids2 = self.search(cr, uid, [('name','=',dep.name)])
+ ids2 = self.search(cr, uid, [('name', '=', dep.name)])
if dep.state != newstate:
- mdemo = self.state_update(cr, uid, ids2, newstate, states_to_update, context, level-1,) or mdemo
+ mdemo = self.state_update(cr, uid, ids2, newstate, states_to_update, context, level - 1) or mdemo
else:
od = self.browse(cr, uid, ids2)[0]
mdemo = od.demo or mdemo
if not module.dependencies_id:
mdemo = module.demo
if module.state in states_to_update:
- self.write(cr, uid, [module.id], {'state': newstate, 'demo':mdemo})
+ self.write(cr, uid, [module.id], {'state': newstate, 'demo': mdemo})
demo = demo or mdemo
return demo
return self._button_immediate_function(cr, uid, ids, self.button_install, context=context)
def button_install_cancel(self, cr, uid, ids, context=None):
- self.write(cr, uid, ids, {'state': 'uninstalled', 'demo':False})
+ self.write(cr, uid, ids, {'state': 'uninstalled', 'demo': False})
return True
def module_uninstall(self, cr, uid, ids, context=None):
return True
def downstream_dependencies(self, cr, uid, ids, known_dep_ids=None,
- exclude_states=['uninstalled','uninstallable','to remove'],
+ exclude_states=['uninstalled', 'uninstallable', 'to remove'],
context=None):
"""Return the ids of all modules that directly or indirectly depend
on the given module `ids`, and that satisfy the `exclude_states`
filter"""
- if not ids: return []
+ if not ids:
+ return []
known_dep_ids = set(known_dep_ids or [])
cr.execute('''SELECT DISTINCT m.id
FROM
d.name IN (SELECT name from ir_module_module where id in %s) AND
m.state NOT IN %s AND
m.id NOT IN %s ''',
- (tuple(ids),tuple(exclude_states), tuple(known_dep_ids or ids)))
+ (tuple(ids), tuple(exclude_states), tuple(known_dep_ids or ids)))
new_dep_ids = set([m[0] for m in cr.fetchall()])
missing_mod_ids = new_dep_ids - known_dep_ids
known_dep_ids |= new_dep_ids
if missing_mod_ids:
known_dep_ids |= set(self.downstream_dependencies(cr, uid, list(missing_mod_ids),
- known_dep_ids, exclude_states,context))
+ known_dep_ids, exclude_states, context))
return list(known_dep_ids)
def _button_immediate_function(self, cr, uid, ids, function, context=None):
menu_obj = self.pool.get('ir.ui.menu')
menu_ids = menu_obj.search(cr, uid, [('parent_id', '=', False)], context=context)
return {
- 'type' : 'ir.actions.client',
- 'tag' : 'reload',
- 'params' : {'menu_id' : menu_ids and menu_ids[0] or False}
+ 'type': 'ir.actions.client',
+ 'tag': 'reload',
+ 'params': {'menu_id': menu_ids and menu_ids[0] or False}
}
def button_immediate_uninstall(self, cr, uid, ids, context=None):
self.update_list(cr, uid)
i = 0
- while i<len(todo):
+ while i < len(todo):
mod = todo[i]
i += 1
- if mod.state not in ('installed','to upgrade'):
- raise orm.except_orm(_('Error'),
- _("Can not upgrade module '%s'. It is not installed.") % (mod.name,))
+ if mod.state not in ('installed', 'to upgrade'):
+ raise orm.except_orm(_('Error'), _("Can not upgrade module '%s'. It is not installed.") % (mod.name,))
self.check_external_dependencies(mod.name, 'to upgrade')
iids = depobj.search(cr, uid, [('name', '=', mod.name)], context=context)
for dep in depobj.browse(cr, uid, iids, context=context):
- if dep.module_id.state=='installed' and dep.module_id not in todo:
+ if dep.module_id.state == 'installed' and dep.module_id not in todo:
todo.append(dep.module_id)
ids = map(lambda x: x.id, todo)
- self.write(cr, uid, ids, {'state':'to upgrade'}, context=context)
+ self.write(cr, uid, ids, {'state': 'to upgrade'}, context=context)
to_install = []
for mod in todo:
if dep.state == 'unknown':
raise orm.except_orm(_('Error'), _('You try to upgrade a module that depends on the module: %s.\nBut this module is not available in your system.') % (dep.name,))
if dep.state == 'uninstalled':
- ids2 = self.search(cr, uid, [('name','=',dep.name)])
+ ids2 = self.search(cr, uid, [('name', '=', dep.name)])
to_install.extend(ids2)
self.button_install(cr, uid, to_install, context=context)
# update the list of available packages
def update_list(self, cr, uid, context=None):
- res = [0, 0] # [update, add]
+ res = [0, 0] # [update, add]
+ default_version = modules.adapt_version('1.0')
known_mods = self.browse(cr, uid, self.search(cr, uid, []))
known_mods_names = dict([(m.name, m) for m in known_mods])
updated_values[key] = values[key]
if terp.get('installable', True) and mod.state == 'uninstallable':
updated_values['state'] = 'uninstalled'
- if parse_version(terp.get('version', '')) > parse_version(mod.latest_version or ''):
+ if parse_version(terp.get('version', default_version)) > parse_version(mod.latest_version or default_version):
res[0] += 1
if updated_values:
self.write(cr, uid, mod.id, updated_values)
self._update_dependencies(cr, uid, mod, terp.get('depends', []))
self._update_category(cr, uid, mod, terp.get('category', 'Uncategorized'))
+ # Trigger load_addons if new module have been discovered it exists on
+ # wsgi handlers, so they can react accordingly
+ if tuple(res) != (0, 0):
+ for handler in openerp.service.wsgi_server.module_handlers:
+ if hasattr(handler,'load_addons'):
+ handler.load_addons()
+
return res
def download(self, cr, uid, ids, download=True, context=None):
res = []
+ default_version = modules.adapt_version('1.0')
for mod in self.browse(cr, uid, ids, context=context):
if not mod.url:
continue
match = re.search('-([a-zA-Z0-9\._-]+)(\.zip)', mod.url, re.I)
- version = '0'
+ version = default_version
if match:
version = match.group(1)
- if parse_version(mod.installed_version or '0') >= parse_version(version):
+ if parse_version(mod.installed_version) >= parse_version(version):
continue
res.append(mod.url)
if not download:
continue
zip_content = urllib.urlopen(mod.url).read()
- fname = modules.get_module_path(str(mod.name)+'.zip', downloaded=True)
+ fname = modules.get_module_path(str(mod.name) + '.zip', downloaded=True)
try:
with open(fname, 'wb') as fp:
fp.write(zip_content)
raise orm.except_orm(_('Error'), _('Can not create the module file:\n %s') % (fname,))
terp = self.get_module_info(mod.name)
self.write(cr, uid, mod.id, self.get_values_from_terp(terp))
- cr.execute('DELETE FROM ir_module_module_dependency ' \
- 'WHERE module_id = %s', (mod.id,))
- self._update_dependencies(cr, uid, mod, terp.get('depends',
- []))
- self._update_category(cr, uid, mod, terp.get('category',
- 'Uncategorized'))
+ cr.execute('DELETE FROM ir_module_module_dependency WHERE module_id = %s', (mod.id,))
+ self._update_dependencies(cr, uid, mod, terp.get('depends', []))
+ self._update_category(cr, uid, mod, terp.get('category', 'Uncategorized'))
# Import module
zimp = zipimport.zipimporter(fname)
zimp.load_module(mod.name)
return res
+ def install_from_urls(self, cr, uid, urls, context=None):
+ OPENERP = 'openerp'
+ tmp = tempfile.mkdtemp()
+ try:
+ for module_name, url in urls.items():
+ if not url:
+ continue # nothing to download, local version is already the last one
+ try:
+ content = urllib2.urlopen(url).read()
+ except Exception, e:
+ _logger.exception('ggr')
+ raise osv.except_osv('grrr', e)
+ else:
+ zipfile.ZipFile(StringIO(content)).extractall(tmp)
+ assert os.path.isdir(os.path.join(tmp, module_name))
+
+ for module_name in urls:
+ if module_name == OPENERP:
+ continue # special case. handled below
+ module_path = modules.get_module_path(module_name, downloaded=True, display_warning=False)
+ bck = backup(module_path, False)
+ shutil.move(os.path.join(tmp, module_name), module_path)
+ if bck:
+ shutil.rmtree(bck)
+
+ if urls.get(OPENERP, None):
+ # special case. it containt the server and the base module.
+ # extract path is not the same
+
+ base_path = os.path.dirname(modules.get_module_path('base'))
+
+ # copy all modules in the SERVER/openerp/addons directory to the new "openerp" module (except base itself)
+ for d in os.listdir(base_path):
+ if d != 'base' and os.path.isdir(os.path.join(base_path, d)):
+ destdir = os.path.join(tmp, OPENERP, 'addons', d) # XXX 'openerp' subdirectory ?
+ shutil.copytree(os.path.join(base_path, d), destdir)
+
+ # then replace the server by the new "base" module
+ server_dir = openerp.tools.config['root_path'] # XXX or dirname()
+ bck = backup(server_dir)
+ shutil.move(os.path.join(tmp, OPENERP), server_dir)
+ #if bck:
+ # shutil.rmtree(bck)
+
+ self.update_list(cr, uid, context=context)
+
+ ids = self.search(cr, uid, [('name', 'in', urls.keys())], context=context)
+ if self.search_count(cr, uid, [('id', 'in', ids), ('state', '=', 'installed')], context=context):
+ # if any to update
+ cr.commit()
+ openerp.service.restart_server()
+ return {
+ 'type': 'ir.actions.client',
+ 'tag': 'home',
+ 'params': {'wait': True},
+ }
+ return self.button_immediate_install(cr, uid, ids, context=context)
+ finally:
+ shutil.rmtree(tmp)
+
+ def install_by_names(self, cr, uid, names, context=None):
+ raise NotImplementedError('# TODO')
+
def _update_dependencies(self, cr, uid, mod_browse, depends=None):
if depends is None:
depends = []
_columns = {
# The dependency name
- 'name': fields.char('Name', size=128, select=True),
+ 'name': fields.char('Name', size=128, select=True),
# The module that depends on it
'module_id': fields.many2one('ir.module.module', 'Module', select=True, ondelete='cascade'),
'state': fields.function(_state, type='selection', selection=[
- ('uninstallable','Uninstallable'),
- ('uninstalled','Not Installed'),
- ('installed','Installed'),
- ('to upgrade','To be upgraded'),
- ('to remove','To be removed'),
- ('to install','To be installed'),
+ ('uninstallable', 'Uninstallable'),
+ ('uninstalled', 'Not Installed'),
+ ('installed', 'Installed'),
+ ('to upgrade', 'To be upgraded'),
+ ('to remove', 'To be removed'),
+ ('to install', 'To be installed'),
('unknown', 'Unknown'),
- ], string='Status', readonly=True, select=True),
+ ], string='Status', readonly=True, select=True),
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
-
<!-- Modules Categories -->
-
<record id="view_module_category_form" model="ir.ui.view">
<field name="name">ir.module.category.form</field>
<field name="model">ir.module.category</field>
</record>
<!-- Click on a category -->
-
<record id="view_module_filter" model="ir.ui.view">
<field name="name">ir.module.module.list.select</field>
<field name="model">ir.module.module</field>
<filter name="app" icon="terp-check" string="Apps" domain="[('application', '=', 1)]"/>
<filter name="extra" icon="terp-check" string="Extra" domain="[('application', '=', 0)]"/>
<separator/>
- <filter icon="terp-check" string="Installed" domain="[('state', 'in', ['installed', 'to upgrade', 'to remove'])]"/>
+ <filter name="installed" icon="terp-check" string="Installed" domain="[('state', 'in', ['installed', 'to upgrade', 'to remove'])]"/>
<filter icon="terp-dialog-close" string="Not Installed" domain="[('state', 'in', ['uninstalled', 'uninstallable', 'to install'])]"/>
<field name="category_id"/>
<group expand="0" string="Group By...">
</search>
</field>
</record>
-
- <record model="ir.ui.view" id="module_view_kanban">
- <field name="name">Modules Kanban</field>
- <field name="model">ir.module.module</field>
- <field name="arch" type="xml">
- <kanban create="false">
- <field name="icon"/>
- <field name="name"/>
- <field name="state"/>
- <field name="summary"/>
- <templates>
- <t t-name="kanban-box">
- <div class="oe_module_vignette">
- <t t-set="installed" t-value="record.state.raw_value == 'installed'"/>
- <img t-attf-src="#{record.icon.value}" class="oe_module_icon"/>
- <div class="oe_module_desc">
- <h4><a type="open"><field name="shortdesc"/></a></h4>
- <p class="oe_module_name">
- <t t-if="record.summary.raw_value"><field name="summary"/><br/></t>
- <i><field name="name" groups="base.group_no_one"/></i>
- </p>
- <button type="object" name="button_immediate_install" states="uninstalled">Install</button>
- <button t-if="installed" disabled="disabled">Installed</button>
- </div>
- </div>
- </t>
- </templates>
- </kanban>
- </field>
- </record>
-
<record id="action_module_open_categ" model="ir.actions.act_window">
<field name="name">Modules</field>
<field name="res_model">ir.module.module</field>
<!-- Modules -->
-
<record id="module_form" model="ir.ui.view">
<field name="name">ir.module.module.form</field>
<field name="model">ir.module.module</field>
</tree>
</field>
</record>
+ <record model="ir.ui.view" id="module_view_kanban">
+ <field name="name">Modules Kanban</field>
+ <field name="model">ir.module.module</field>
+ <field name="arch" type="xml">
+ <kanban create="false">
+ <field name="icon"/>
+ <field name="name"/>
+ <field name="state"/>
+ <field name="summary"/>
+ <templates>
+ <t t-name="kanban-box">
+ <div class="oe_module_vignette">
+ <t t-set="installed" t-value="record.state.raw_value == 'installed'"/>
+ <img t-attf-src="#{record.icon.value}" class="oe_module_icon"/>
+ <div class="oe_module_desc">
+ <h4><a type="open"><field name="shortdesc"/></a></h4>
+ <p class="oe_module_name">
+ <t t-if="record.summary.raw_value"><field name="summary"/><br/></t>
+ <i><field name="name" groups="base.group_no_one"/></i>
+ </p>
+ <button type="object" name="button_immediate_install" states="uninstalled">Install</button>
+ <button t-if="installed" disabled="disabled">Installed</button>
+ </div>
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ </field>
+ </record>
<record id="open_module_tree" model="ir.actions.act_window">
- <field name="name">Install a Module</field>
+ <!-- uncomment on released
+ <field name="name">Installed Modules</field>
+ -->
+ <field name="name">Modules</field>
<field name="res_model">ir.module.module</field>
<field name="view_type">form</field>
<field name="view_mode">kanban,tree,form</field>
- <field name="context">{'search_default_app':1}</field>
+ <!-- uncomment on released
+ <field name="context">{'search_default_installed':1}</field>
+ -->
<field name="search_view_id" ref="view_module_filter"/>
<field name="help" type="html">
<p><b>No module found!</b></p>
<p>You should try others search criteria.</p>
</field>
</record>
- <menuitem id="menu_module_tree" parent="base.menu_management" name="Modules"
- sequence="1" action="open_module_tree"/>
+ <menuitem id="menu_module_tree" parent="menu_management" name="Installed Modules" sequence="10" action="open_module_tree"/>
+
+
+ <!-- Apps modules -->
+ <record model="ir.actions.client" id="modules_act_cl">
+ <field name="name">Apps</field>
+ <field name="tag">apps</field>
+ </record>
+ <!-- uncomment on released
+ <menuitem id="module_mi" parent="base.menu_management" sequence="3" action="modules_act_cl"/>
+ -->
+ <menuitem id="module_mi" parent="base.menu_management" sequence="20" action="modules_act_cl"/>
+
+ <record model="ir.actions.client" id="modules_updates_act_cl">
+ <field name="name">Updates</field>
+ <field name="tag">apps.updates</field>
+ <field name="params">{}</field>
+ </record>
+ <!-- uncomment on released
+ <menuitem id="menu_module_updates" parent="base.menu_management" sequence="7" action="modules_updates_act_cl"/>
+ -->
+ <menuitem id="menu_module_updates" parent="base.menu_management" sequence="30" action="modules_updates_act_cl"/>
</data>
</openerp>
<group states="choose" string="Export Settings">
<field name="lang"/>
<field name="format"/>
- <field name="modules"/>
+ <field name="modules" widget="many2many_tags"/>
</group>
<div states="get">
<h2>Export Complete</h2>
id="menu_view_base_module_import"
parent="menu_management"
groups="base.group_no_one"
- sequence="1"/>
+ sequence="6"/>
-->
</data>
</group>
<footer>
<div states="init">
- <button name="update_module" string="Update" type="object" class="oe_highlight"/> or
+ <button name="update_module" string="Update" type="object" class="oe_highlight"/> or
<button special="cancel" string="Cancel" class="oe_link"/>
</div>
<div states="done">
- <button name="action_module_open" string="Open Modules" type="object" class="oe_highlight"/> or
+ <button name="action_module_open" string="Open Modules" type="object" class="oe_highlight"/> or
<button special="cancel" string="Close" class="oe_link"/>
</div>
</footer>
</form>
</field>
- </record>
+ </record>
<record id="action_view_base_module_update" model="ir.actions.act_window">
<field name="name">Module Update</field>
id="menu_view_base_module_update"
groups="base.group_no_one"
parent="menu_management"
- sequence="2"
+ sequence="40"
icon="STOCK_CONVERT"/>
</data>
groups="base.group_no_one"
id="menu_view_base_module_upgrade"
parent="menu_management"
- sequence="3"/>
+ sequence="50"/>
<record id="view_base_module_upgrade_install" model="ir.ui.view">
<field name="name">Module Upgrade Install</field>
# -*- coding: utf-8 -*-
##############################################################################
-#
+#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# 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/>.
#
##############################################################################
import ir_property
import report
+import wizard
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
groups.append((name, ref(field_group), ref(field.implied_group)))
elif name.startswith('module_') and isinstance(field, fields.boolean):
mod_ids = ir_module.search(cr, uid, [('name', '=', name[7:])])
- modules.append((name, ir_module.browse(cr, uid, mod_ids[0], context)))
+ record = ir_module.browse(cr, uid, mod_ids[0], context) if mod_ids else None
+ modules.append((name, record))
else:
others.append(name)
# modules: which modules are installed/to install
for name, module in classified['module']:
- res[name] = module.state in ('installed', 'to install', 'to upgrade')
+ res[name] = module and module.state in ('installed', 'to install', 'to upgrade')
# other fields: call all methods that start with 'get_default_'
for method in dir(self):
def execute(self, cr, uid, ids, context=None):
ir_values = self.pool.get('ir.values')
- ir_model_data = self.pool.get('ir.model.data')
ir_module = self.pool.get('ir.module.module')
- res_groups = self.pool.get('res.groups')
classified = self._get_classified_fields(cr, uid, context)
config = self.browse(cr, uid, ids[0], context)
getattr(self, method)(cr, uid, ids, context)
# module fields: install/uninstall the selected modules
- to_install_ids = []
+ to_install_names = []
to_uninstall_ids = []
+ lm = len('module_')
for name, module in classified['module']:
if config[name]:
- if module.state == 'uninstalled': to_install_ids.append(module.id)
+ if not module or module.state == 'uninstalled':
+ to_install_names.append(name[lm:])
else:
- if module.state in ('installed','upgrade'): to_uninstall_ids.append(module.id)
-
- if to_install_ids or to_uninstall_ids:
- ir_module.button_uninstall(cr, uid, to_uninstall_ids, context=context)
- ir_module.button_immediate_install(cr, uid, to_install_ids, context=context)
+ if module and module.state in ('installed', 'to upgrade'):
+ to_uninstall_ids.append(module.id)
+
+ if to_uninstall_ids:
+ ir_module.button_immediate_uninstall(cr, uid, to_uninstall_ids, context=context)
+
+ if to_install_names:
+ return {
+ 'type': 'ir.actions.client',
+ 'tag': 'apps',
+ 'params': {'modules': to_install_names},
+ }
config = self.pool.get('res.config').next(cr, uid, [], context=context) or {}
if config.get('type') not in ('ir.actions.act_window_close',):
name = name + "\n" + self._display_address(cr, uid, record, without_company=True, context=context)
name = name.replace('\n\n','\n')
name = name.replace('\n\n','\n')
+ if context.get('show_email') and record.email:
+ name = "%s <%s>" % (name, record.email)
res.append((record.id, name))
return res
def name_search(self, cr, uid, name, args=None, operator='ilike', context=None, limit=100):
if not args:
args = []
- if name and operator in ('=', 'ilike', '=ilike', 'like'):
+ if name and operator in ('=', 'ilike', '=ilike', 'like', '=like'):
# search on the name of the contacts and of its company
- name2 = operator == '=' and name or '%' + name + '%'
+ search_name = name
+ if operator in ('ilike', 'like'):
+ search_name = '%%%s%%' % name
+ if operator in ('=ilike', '=like'):
+ operator = operator[1:]
+ query_args = {'name': search_name}
limit_str = ''
- query_args = [name2]
if limit:
- limit_str = ' limit %s'
- query_args += [limit]
+ limit_str = ' limit %(limit)s'
+ query_args['limit'] = limit
cr.execute('''SELECT partner.id FROM res_partner partner
LEFT JOIN res_partner company ON partner.parent_id = company.id
- WHERE partner.name || ' (' || COALESCE(company.name,'') || ')'
- ''' + operator + ''' %s ''' + limit_str, query_args)
+ WHERE partner.email ''' + operator +''' %(name)s
+ OR partner.name || ' (' || COALESCE(company.name,'') || ')'
+ ''' + operator + ' %(name)s ' + limit_str, query_args)
ids = map(lambda x: x[0], cr.fetchall())
if args:
ids = self.search(cr, uid, [('id', 'in', ids)] + args, limit=limit, context=context)
<form string="Users" version="7.0">
<field name="id" invisible="1"/>
<sheet>
+ <div class="oe_right oe_button_box">
+ <button string="Change Password" type="action" name="%(change_password_wizard_action)d"
+ help="Change the user password."/>
+ </div>
<field name="image" widget='image' class="oe_avatar oe_left" options='{"preview_image": "image_medium"}'/>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
</div>
<group>
<group>
- <field name="new_password" password="True" attrs="{'required': [('id','=',False)]}"/>
<field name="company_id" context="{'user_preference': 0}"/>
</group>
<group>
--- /dev/null
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2011 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 change_password_wizard
\ No newline at end of file
--- /dev/null
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2011 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/>.
+#
+##############################################################################
+
+from openerp.osv import fields, osv
+
+class change_password_wizard(osv.TransientModel):
+ """
+ A wizard to manage the change of users' passwords
+ """
+
+ _name = "change.password.wizard"
+ _description = "Change Password Wizard"
+ _columns = {
+ 'user_ids': fields.one2many('change.password.user', 'wizard_id', string='Users'),
+ }
+
+ def default_get(self, cr, uid, fields, context=None):
+ if context == None:
+ context = {}
+ user_ids = context.get('active_ids', [])
+ wiz_id = context.get('active_id', None)
+ res = []
+ users = self.pool.get('res.users').browse(cr, uid, user_ids, context=context)
+ for user in users:
+ res.append((0, 0, {
+ 'wizard_id': wiz_id,
+ 'user_id': user.id,
+ 'user_login': user.login,
+ }))
+ return {'user_ids': res}
+
+
+ def change_password_button(self, cr, uid, id, context=None):
+ wizard = self.browse(cr, uid, id, context=context)[0]
+ user_ids = []
+ for user in wizard.user_ids:
+ user_ids.append(user.id)
+ self.pool.get('change.password.user').change_password_button(cr, uid, user_ids, context=context)
+ return {
+ 'type': 'ir.actions.act_window_close',
+ }
+
+class change_password_user(osv.TransientModel):
+ """
+ A model to configure users in the change password wizard
+ """
+
+ _name = 'change.password.user'
+ _description = 'Change Password Wizard User'
+ _columns = {
+ 'wizard_id': fields.many2one('change.password.wizard', string='Wizard', required=True),
+ 'user_id': fields.many2one('res.users', string='User', required=True),
+ 'user_login': fields.char('User Login', readonly=True),
+ 'new_passwd': fields.char('New Password'),
+ }
+ _defaults = {
+ 'new_passwd': '',
+ }
+
+ def change_password_button(self, cr, uid, ids, context=None):
+ for user in self.browse(cr, uid, ids, context=context):
+ self.pool.get('res.users').write(cr, uid, user.user_id.id, {'password': user.new_passwd})
+
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data>
+
+ <!-- wizard action on res.users -->
+ <act_window id="change_password_wizard_action"
+ name="Change Password"
+ src_model="res.users"
+ res_model="change.password.wizard"
+ view_type="form" view_mode="form"
+ key2="client_action_multi" target="new"
+ groups="base.group_erp_manager"/>
+
+ <!-- wizard view -->
+ <record id="change_password_wizard_view" model="ir.ui.view">
+ <field name="name">Change Password</field>
+ <field name="model">change.password.wizard</field>
+ <field name="arch" type="xml">
+ <form string="Change Password" version="7.0">
+ <field name="user_ids"/>
+ <footer>
+ <button string="Change Password" name="change_password_button" type="object" class="oe_highlight"/>
+ or
+ <button string="Cancel" class="oe_link" special="cancel" />
+ </footer>
+ </form>
+ </field>
+ </record>
+
+ <!-- wizard user list view -->
+ <record id="change_password_wizard_user_tree_view" model="ir.ui.view">
+ <field name="name">Change Password Users</field>
+ <field name="model">change.password.user</field>
+ <field name="arch" type="xml">
+ <!-- the user list is editable, but one cannot add or delete rows -->
+ <tree string="Users" editable="bottom" create="false" delete="false">
+ <field name="user_login"/>
+ <field name="new_passwd" required="True"/>
+ </tree>
+ </field>
+ </record>
+
+ </data>
+</openerp>
--- /dev/null
+openerp.base = function(instance) {
+
+ instance.base.apps_remote = null;
+ instance.base.apps_client = null;
+
+ instance.base.Apps = instance.web.Widget.extend({
+ template: 'EmptyComponent',
+ remote_action_id: 'loempia.action_embed',
+ failback_action_id: 'base.open_module_tree',
+
+ init: function(parent, action) {
+ this._super(parent, action);
+ var options = action.params || {};
+
+ if (options.apps_user) {
+ sessionStorage.setItem('apps.login', options.apps_user);
+ }
+ if (options.apps_access_token) {
+ sessionStorage.setItem('apps.access_token', options.apps_access_token);
+ }
+
+ this.params = options; // NOTE read by embedded client action
+ },
+
+ get_client: function() {
+ // return the client via a deferred, resolved or rejected depending if the remote host is available or not.
+ var check_client_available = function(client) {
+ var d = $.Deferred();
+ var i = new Image();
+ i.onerror = function() {
+ d.reject(client);
+ };
+ i.onload = function() {
+ client.session.session_bind(client.origin).then(function() {
+ // check if client can authenticate
+ client.authenticate().then(
+ function() { /* done */
+ d.resolve(client);
+ }, function() { /* fail */
+ if (client.login === 'anonymous') {
+ d.reject(client);
+ } else {
+ sessionStorage.removeItem('apps.login');
+ sessionStorage.removeItem('apps.access_token');
+ client.bind_crendentials(client.dbname, 'anonymous', 'anonymous');
+ client.authenticate().then(
+ function() { /* done */
+ d.resolve(client);
+ }, function() { /* fail */
+ d.reject(client);
+ });
+ }
+ });
+ });
+
+ };
+ i.src = _.str.sprintf('%s/web/static/src/img/sep-a.gif', client.origin);
+ return d.promise();
+ };
+ if (instance.base.apps_client) {
+ return check_client_available(instance.base.apps_client);
+ } else {
+ var ICP = new instance.web.Model('ir.config_parameter');
+ return ICP.call('get_param', ['apps.server', 'https://apps.openerp.com/apps']).then(function(u) {
+ var link = $(_.str.sprintf('<a href="%s"></a>', u))[0];
+ var host = _.str.sprintf('%s//%s', link.protocol, link.host);
+ var dbname = link.pathname;
+ if (dbname[0] === '/') {
+ dbname = dbname.substr(1);
+ }
+ var login = (sessionStorage ? sessionStorage.getItem('apps.login') : null) || 'anonymous';
+ var passwd = (sessionStorage ? sessionStorage.getItem('apps.access_token') : null) || 'anonymous';
+ if (_.isNull(instance.base.apps_remote)) {
+ instance.base.apps_remote = new openerp.init();
+ }
+ var client = new instance.base.apps_remote.web.EmbeddedClient(null, host, dbname, login, passwd);
+ instance.base.apps_client = client;
+ return check_client_available(client);
+ });
+ }
+ },
+
+ destroy: function() {
+ if (instance.base.apps_client) {
+ instance.base.apps_client.destroy();
+ }
+ return this._super();
+ },
+
+ start: function() {
+ var self = this;
+ return self.get_client().
+ done(function(client) {
+ client.replace(self.$el).
+ done(function() {
+ client.$el.removeClass('openerp');
+ client.do_action(self.remote_action_id);
+ });
+ }).
+ fail(function(client) {
+ self.do_warn('Apps Server not reachable.', 'Showing local modules.', true);
+ self.rpc('/web/action/load', {action_id: self.failback_action_id}).done(function(action) {
+ self.do_action(action);
+ instance.webclient.menu.open_action(action.id);
+ });
+ });
+ },
+ });
+
+ instance.base.AppsUpdates = instance.base.Apps.extend({
+ remote_action_id: 'loempia.action_embed_updates'
+ });
+
+ instance.web.client_actions.add("apps", "instance.base.Apps");
+ instance.web.client_actions.add("apps.updates", "instance.base.AppsUpdates");
+
+};
pass
config = openerp.tools.config
+ openerp.service.stop_services()
+
+ if getattr(openerp, 'phoenix', False):
+ # like the phoenix, reborn from ashes...
+ openerp.service._reexec()
+ return
+
if config['pidfile']:
os.unlink(config['pidfile'])
-
- openerp.service.stop_services()
sys.exit(0)
def configure_babel_localedata_path():
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
-# Copyright (C) 2010-2011 OpenERP s.a. (<http://openerp.com>).
+# Copyright (C) 2010-2012 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
load_information_from_description_file, \
get_module_resource, zip_directory, \
get_module_path, initialize_sys_path, \
- load_openerp_module, init_module_models
+ load_openerp_module, init_module_models, \
+ adapt_version
from openerp.modules.loading import load_modules
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
-# Copyright (C) 2010-2011 OpenERP s.a. (<http://openerp.com>).
+# Copyright (C) 2010-2012 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
'license': 'AGPL-3',
'name': False,
'post_load': None,
- 'version': '0.0.0',
+ 'version': '1.0',
'web': False,
'website': '',
'sequence': 100,
# 'active' has been renamed 'auto_install'
info['auto_install'] = info['active']
+ info['version'] = adapt_version(info['version'])
return info
#TODO: refactor the logger in this file to follow the logging guidelines
def get_modules_with_version():
modules = get_modules()
- res = {}
+ res = dict.fromkeys(modules, adapt_version('1.0'))
for module in modules:
try:
info = load_information_from_description_file(module)
- res[module] = "%s.%s" % (release.major_version, info['version'])
- except Exception, e:
+ res[module] = info['version']
+ except Exception:
continue
return res
+def adapt_version(version):
+ serie = release.major_version
+ if version == serie or not version.startswith(serie + '.'):
+ version = '%s.%s' % (serie, version)
+ return version
+
+
def get_test_modules(module, submodule, explode):
"""
Return a list of submodules containing tests.
author_email = 'info@openerp.com'
license = 'AGPL-3'
+nt_service_name = "openerp-server-" + serie
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
##############################################################################
import logging
+import os
+import signal
+import subprocess
+import sys
import threading
import time
import openerp.modules
import openerp.netsvc
import openerp.osv
+from openerp.release import nt_service_name
import openerp.tools
#.apidoc title: RPC Services
_logger.info("Initiating shutdown")
_logger.info("Hit CTRL-C again or send a second signal to force the shutdown.")
- logging.shutdown()
# Manually join() all threads before calling sys.exit() to allow a second signal
# to trigger _force_quit() in case some non-daemon threads won't exit cleanly.
# threading.Thread.join() should not mask signals (at least in python 2.5).
me = threading.currentThread()
+ _logger.debug('current thread: %r', me)
for thread in threading.enumerate():
+ _logger.debug('process %r (%r)', thread, thread.isDaemon())
if thread != me and not thread.isDaemon() and thread.ident != main_thread_id:
while thread.isAlive():
+ _logger.debug('join and sleep')
# Need a busyloop here as thread.join() masks signals
# and would prevent the forced shutdown.
thread.join(0.05)
time.sleep(0.05)
+ _logger.debug('--')
openerp.modules.registry.RegistryManager.delete_all()
+ logging.shutdown()
def start_services_workers():
import openerp.service.workers
openerp.multi_process = True
-
openerp.service.workers.Multicorn(openerp.service.wsgi_server.application).run()
+def _reexec():
+ """reexecute openerp-server process with (nearly) the same arguments"""
+ if openerp.tools.osutil.is_running_as_nt_service():
+ subprocess.call('sc stop {0} && sc start {0}'.format(nt_service_name), shell=True)
+ exe = os.path.basename(sys.executable)
+ strip_args = ['-d', '-u']
+ a = sys.argv[:]
+ args = [x for i, x in enumerate(a) if x not in strip_args and a[max(i - 1, 0)] not in strip_args]
+ if not args or args[0] != exe:
+ args.insert(0, exe)
+ os.execv(sys.executable, args)
+
+def restart_server():
+ if openerp.multi_process:
+ raise NotImplementedError("Multicorn is not supported (but gunicorn was)")
+ pid = openerp.wsgi.core.arbiter_pid
+ os.kill(pid, signal.SIGHUP)
+ else:
+ if os.name == 'nt':
+ def reborn():
+ stop_services()
+ _reexec()
+
+ # run in a thread to let the current thread return response to the caller.
+ threading.Thread(target=reborn).start()
+ else:
+ openerp.phoenix = True
+ os.kill(os.getpid(), signal.SIGINT)
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
_logger = logging.getLogger(__name__)
-RPC_VERSION_1 = {'server_version': '6.1', 'protocol_version': 1}
+RPC_VERSION_1 = {
+ 'server_version': release.version,
+ 'server_version_info': release.version_info,
+ 'server_serie': release.serie,
+ 'protocol_version': 1,
+}
# This should be moved to openerp.modules.db, along side initialize().
def _initialize_db(serv, id, db_name, demo, lang, user_password):
db = sql_db.db_connect('postgres')
cr = db.cursor()
chosen_template = tools.config['db_template']
+ cr.execute("""SELECT datname
+ FROM pg_database
+ WHERE datname = %s """,
+ (name,))
+ if cr.fetchall():
+ raise openerp.exceptions.Warning(" %s database already exists!" % name )
try:
cr.autocommit(True) # avoid transaction block
cr.execute("""CREATE DATABASE "%s" ENCODING 'unicode' TEMPLATE "%s" """ % (name, chosen_template))
"""
if httpd:
httpd.shutdown()
+ openerp.netsvc.close_socket(httpd.socket)
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
new_html = html_email_clean(False)
self.assertEqual(new_html, False, 'html_email_cleaner did change a False in an other value.')
+ # Test6: Message with xml and doctype tags don't crash
+ new_html = html_email_clean(u'<?xml version="1.0" encoding="iso-8859-1"?>\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\n "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n <head>\n <title>404 - Not Found</title>\n </head>\n <body>\n <h1>404 - Not Found</h1>\n </body>\n</html>\n')
+ self.assertNotIn('encoding', new_html, 'html_email_cleaner did not remove correctly encoding attributes')
+
class TestHtmlTools(unittest2.TestCase):
""" Test some of our generic utility functions about html """
dest += source[idx:]
return dest
- if not html:
+ if not html or not isinstance(html, basestring):
return html
html = ustr(html)
+ # 0. remove encoding attribute inside tags
+ doctype = re.compile(r'(<[^>]*\s)(encoding=(["\'][^"\']*?["\']|[^\s\n\r>]+)(\s[^>]*|/)?>)', re.IGNORECASE | re.DOTALL)
+ html = doctype.sub(r"", html)
+
# 1. <br[ /]> -> \n, because otherwise the tree is obfuscated
br_tags = re.compile(r'([<]\s*[bB][rR]\s*\/?[>])')
html = _replace_matching_regex(br_tags, html, '__BR_TAG__')
import os
from os.path import join as opj
+if os.name == 'nt':
+ import ctypes
+ import win32service as ws
+ import win32serviceutil as wsu
+
+
def listdir(dir, recursive=False):
"""Allow to recursively get the file listing"""
dir = os.path.normpath(dir)
yield dirpath, dirnames, filenames
+if os.name != 'nt':
+ getppid = os.getppid
+ is_running_as_nt_service = lambda: False
+else:
+ # based on http://mail.python.org/pipermail/python-win32/2007-June/006174.html
+ _TH32CS_SNAPPROCESS = 0x00000002
+ class _PROCESSENTRY32(ctypes.Structure):
+ _fields_ = [("dwSize", ctypes.c_ulong),
+ ("cntUsage", ctypes.c_ulong),
+ ("th32ProcessID", ctypes.c_ulong),
+ ("th32DefaultHeapID", ctypes.c_ulong),
+ ("th32ModuleID", ctypes.c_ulong),
+ ("cntThreads", ctypes.c_ulong),
+ ("th32ParentProcessID", ctypes.c_ulong),
+ ("pcPriClassBase", ctypes.c_ulong),
+ ("dwFlags", ctypes.c_ulong),
+ ("szExeFile", ctypes.c_char * 260)]
+
+ def getppid():
+ CreateToolhelp32Snapshot = ctypes.windll.kernel32.CreateToolhelp32Snapshot
+ Process32First = ctypes.windll.kernel32.Process32First
+ Process32Next = ctypes.windll.kernel32.Process32Next
+ CloseHandle = ctypes.windll.kernel32.CloseHandle
+ hProcessSnap = CreateToolhelp32Snapshot(_TH32CS_SNAPPROCESS, 0)
+ current_pid = os.getpid()
+ try:
+ pe32 = _PROCESSENTRY32()
+ pe32.dwSize = ctypes.sizeof(_PROCESSENTRY32)
+ if not Process32First(hProcessSnap, ctypes.byref(pe32)):
+ raise OSError('Failed getting first process.')
+ while True:
+ if pe32.th32ProcessID == current_pid:
+ return pe32.th32ParentProcessID
+ if not Process32Next(hProcessSnap, ctypes.byref(pe32)):
+ return None
+ finally:
+ CloseHandle(hProcessSnap)
+
+ from contextlib import contextmanager
+ from openerp.release import nt_service_name
+
+ def is_running_as_nt_service():
+ @contextmanager
+ def close_srv(srv):
+ try:
+ yield srv
+ finally:
+ ws.CloseServiceHandle(srv)
+
+ with close_srv(ws.OpenSCManager(None, None, ws.SC_MANAGER_ALL_ACCESS)) as hscm:
+ with close_srv(wsu.SmartOpenService(hscm, nt_service_name, ws.SERVICE_ALL_ACCESS)) as hs:
+ info = ws.QueryServiceStatusEx(hs)
+ return info['ProcessId'] == getppid()
if __name__ == '__main__':
from pprint import pprint as pp
# -*- coding: utf-8 -*-
##############################################################################
-#
+#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# 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/>.
#
##############################################################################
-# Win32 python extensions modules
import win32serviceutil
import win32service
-import win32event
import win32api
import win32process
import servicemanager
import sys
import subprocess
import os
-import thread
+
+try:
+ import meta
+except ImportError:
+ if hasattr(sys, 'frozen'):
+ raise
+ from setup import generate_files
+ generate_files()
+ import meta # noqa
class OpenERPServerService(win32serviceutil.ServiceFramework):
# required info
- _svc_name_ = "openerp-server-6.1"
- _svc_display_name_ = "OpenERP Server 6.1"
- # optionnal info
- _svc_description_ = "OpenERP Server 6.1 service"
+ _svc_name_ = meta.nt_service_name
+ _svc_display_name_ = "%s %s" % (meta.description, meta.serie)
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
- # Create an event which we will use to wait on.
- # The "service stop" request will set this event.
- self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
# a reference to the server's process
self.terpprocess = None
- # info if the service terminates correctly or if the server crashed
- self.stopping = False
-
def SvcStop(self):
# Before we do anything, tell the SCM we are starting the stop process.
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
- # stop the running TERP Server: say it's a normal exit
+ # stop the running OpenERP Server: say it's a normal exit
win32api.TerminateProcess(int(self.terpprocess._handle), 0)
servicemanager.LogInfoMsg("OpenERP Server stopped correctly")
- # And set my event.
- win32event.SetEvent(self.hWaitStop)
-
def StartTERP(self):
# The server finds now its configuration automatically on Windows
server_path = os.path.join(server_dir, 'server', 'openerp-server.exe')
self.terpprocess = subprocess.Popen([server_path], cwd=server_dir, creationflags=win32process.CREATE_NO_WINDOW)
-
- def StartControl(self,ws):
- # this listens to the Service Manager's events
- win32event.WaitForSingleObject(ws, win32event.INFINITE)
- self.stopping = True
-
def SvcDoRun(self):
- # Start OpenERP Server itself
self.StartTERP()
- # start the loop waiting for the Service Manager's stop signal
- thread.start_new_thread(self.StartControl, (self.hWaitStop,))
- # Log a info message that the server is running
servicemanager.LogInfoMsg("OpenERP Server up and running")
- # verification if the server is really running, else quit with an error
- self.terpprocess.wait()
- if not self.stopping:
- sys.exit("OpenERP Server check: server not running, check the logfile for more info")
+ # exit with same exit code as OpenERP process
+ sys.exit(self.terpprocess.wait())
+def option_handler(opts):
+ # configure the service to auto restart on failures...
+ subprocess.call(['sc', 'failure', meta.nt_service_name, 'reset=', '0', 'actions=', 'restart/0/restart/0/restart/0'])
-if __name__=='__main__':
+if __name__ == '__main__':
# Do with the service whatever option is passed in the command line
- win32serviceutil.HandleCommandLine(OpenERPServerService)
+ win32serviceutil.HandleCommandLine(OpenERPServerService, customOptionHandler=option_handler)
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
# -*- coding: utf-8 -*-
##############################################################################
-#
+#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# 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/>.
#
##############################################################################
r.append(("Microsoft.VC90.CRT", glob.glob('C:\Microsoft.VC90.CRT\*.*')))
return r
-setup(service=["OpenERPServerService"],
- options={"py2exe":{"excludes":["Tkconstants","Tkinter","tcl",
- "_imagingtk","PIL._imagingtk",
- "ImageTk", "PIL.ImageTk",
- "FixTk"],
- "skip_archive": 1,
- "optimize": 2,}},
+meta = {}
+execfile(os.path.join(os.path.dirname(__file__), '..', 'openerp', 'release.py'), meta)
+
+def generate_files():
+ actions = {
+ 'start': ['stop', 'start'],
+ 'stop': ['stop'],
+ }
+
+ files = []
+ for action, steps in actions.items():
+ fname = action + '.bat'
+ files.append(fname)
+ with open(fname, 'w') as fp:
+ fp.write('@PATH=%WINDIR%\system32;%WINDIR%;%WINDIR%\System32\Wbem;.\n')
+ for step in steps:
+ fp.write('@net %s %s\n' % (step, meta['nt_service_name']))
+
+ files.append('meta.py')
+ with open('meta.py', 'w') as fp:
+ for m in 'description serie nt_service_name'.split():
+ fp.write("%s = %r\n" % (m, meta[m],))
+
+ return files
+
+excludes = "Tkconstants Tkinter tcl _imagingtk PIL._imagingtk ImageTk PIL.ImageTk FixTk".split()
+
+setup(service = ["OpenERPServerService"],
+ version = meta['version'],
+ license = meta['license'],
+ url = meta['url'],
+ author = meta['author'],
+ author_email = meta['author_email'],
+ data_files = generate_files(),
+ options = {"py2exe": {
+ "excludes": excludes,
+ "skip_archive": 1,
+ "optimize": 2,
+ }},
data_files=datas(),
)
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
+++ /dev/null
-@PATH=%WINDIR%\system32;%WINDIR%;%WINDIR%\System32\Wbem;.\r
-\r
-@net stop openerp-server-6.1\r
-\r
-@net start openerp-server-6.1\r
-\r
-cls\r
+++ /dev/null
-@PATH=%WINDIR%\system32;%WINDIR%;%WINDIR%\System32\Wbem;.\r
-\r
-@net stop openerp-server-6.1\r
-\r
-cls\r