[MERGE] Sync with trunk.
bzr revid: tde@openerp.com-20121221100320-ntn6zsdcqlvz52xn
This commit is contained in:
+20
-13
@@ -1,14 +1,21 @@
|
||||
.*
|
||||
*.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
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# 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
|
||||
@@ -80,6 +80,7 @@ The kernel of OpenERP, needed for all installation.
|
||||
'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',
|
||||
@@ -102,5 +103,8 @@ The kernel of OpenERP, needed for all installation.
|
||||
'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:
|
||||
|
||||
@@ -13,7 +13,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-20 04:42+0000\n"
|
||||
"X-Launchpad-Export-Date: 2012-12-21 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 16378)\n"
|
||||
|
||||
#. module: base
|
||||
|
||||
@@ -7,13 +7,13 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 6.0.0-rc1\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2012-12-03 16:01+0000\n"
|
||||
"PO-Revision-Date: 2012-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
|
||||
@@ -210,6 +210,15 @@ msgid ""
|
||||
"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
|
||||
@@ -378,6 +387,15 @@ msgid ""
|
||||
" * 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
|
||||
@@ -385,6 +403,8 @@ msgid ""
|
||||
"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
|
||||
@@ -460,6 +480,8 @@ msgid ""
|
||||
"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
|
||||
@@ -554,12 +576,12 @@ msgstr ""
|
||||
#. 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
|
||||
@@ -599,7 +621,7 @@ msgstr ""
|
||||
#. 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
|
||||
@@ -722,7 +744,7 @@ msgstr "Colombia"
|
||||
#. 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
|
||||
@@ -751,7 +773,7 @@ msgstr "Untranslated"
|
||||
#. 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
|
||||
@@ -845,6 +867,14 @@ msgid ""
|
||||
" </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
|
||||
@@ -901,7 +931,7 @@ msgstr "Rumanía - Contabilidad"
|
||||
#. 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
|
||||
@@ -910,6 +940,9 @@ msgid ""
|
||||
"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
|
||||
@@ -931,7 +964,7 @@ msgstr "Seguridad y autenticación"
|
||||
#. 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
|
||||
@@ -942,7 +975,7 @@ msgstr "Swedish / svenska"
|
||||
#: 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
|
||||
@@ -1038,7 +1071,7 @@ msgstr "Preferencias de email"
|
||||
#: 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
|
||||
@@ -1055,6 +1088,7 @@ msgstr "Zimbabwe"
|
||||
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
|
||||
@@ -1136,7 +1170,7 @@ msgstr "Otra licencia OSI Aprobada"
|
||||
#. 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
|
||||
@@ -1163,7 +1197,7 @@ msgstr "Usuarios google"
|
||||
#. 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
|
||||
@@ -1189,7 +1223,7 @@ msgstr "Principado de Andorra"
|
||||
#. 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
|
||||
@@ -1219,7 +1253,7 @@ msgstr ""
|
||||
#: code:addons/base/ir/ir_model.py:727
|
||||
#, python-format
|
||||
msgid "Document model"
|
||||
msgstr ""
|
||||
msgstr "Modelo de documento"
|
||||
|
||||
#. module: base
|
||||
#: view:res.lang:0
|
||||
@@ -1269,12 +1303,12 @@ msgstr "El nombre del país debe ser único"
|
||||
#. 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
|
||||
@@ -1301,7 +1335,7 @@ msgstr "Islas Caimán"
|
||||
#. module: base
|
||||
#: view:ir.rule:0
|
||||
msgid "Record Rule"
|
||||
msgstr ""
|
||||
msgstr "Regla de registro"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.kr
|
||||
@@ -1329,7 +1363,7 @@ msgstr "Contribuyentes"
|
||||
#. 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
|
||||
@@ -1344,7 +1378,7 @@ msgstr "Visible"
|
||||
#. 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
|
||||
@@ -1430,7 +1464,7 @@ msgstr "Tests"
|
||||
#. 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
|
||||
@@ -1467,7 +1501,7 @@ msgstr "Haití"
|
||||
#. 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
|
||||
@@ -1587,6 +1621,12 @@ msgid ""
|
||||
"=============\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
|
||||
@@ -1618,7 +1658,7 @@ msgstr ""
|
||||
#. 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
|
||||
@@ -1635,7 +1675,7 @@ msgstr "Ninguna lengua con el código \"%s\" existe"
|
||||
#: 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
|
||||
@@ -1645,12 +1685,12 @@ msgstr "%Y - Año con siglo."
|
||||
#. 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
|
||||
@@ -1715,7 +1755,7 @@ msgstr ""
|
||||
#. 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
|
||||
@@ -1762,7 +1802,7 @@ msgstr ""
|
||||
#. 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
|
||||
|
||||
@@ -7,13 +7,13 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2012-12-03 16:01+0000\n"
|
||||
"PO-Revision-Date: 2012-12-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
|
||||
@@ -1355,7 +1355,7 @@ msgstr ""
|
||||
#: 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
|
||||
@@ -2005,7 +2005,7 @@ msgstr "Valem"
|
||||
#: 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
|
||||
@@ -2750,7 +2750,7 @@ msgstr "Ekspordi tõlked"
|
||||
#: 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
|
||||
@@ -3055,7 +3055,7 @@ msgstr "Viga! Sa ei saa luua rekursiivseid ettevõtteid."
|
||||
#: view:res.users:0
|
||||
#, python-format
|
||||
msgid "Application"
|
||||
msgstr ""
|
||||
msgstr "Rakendamine"
|
||||
|
||||
#. module: base
|
||||
#: model:res.groups,comment:base.group_hr_manager
|
||||
@@ -4467,6 +4467,8 @@ msgid ""
|
||||
"The selected language has been successfully installed. You must change the "
|
||||
"preferences of the user and open a new menu to view the changes."
|
||||
msgstr ""
|
||||
"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
|
||||
@@ -5694,7 +5696,7 @@ msgstr "Omadus kustutamisel many2one väljadel"
|
||||
#. 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
|
||||
@@ -5717,7 +5719,7 @@ msgstr ""
|
||||
#: 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
|
||||
@@ -5836,7 +5838,7 @@ msgstr "Grupi nimi ei tohi alata \"-\" märgiga"
|
||||
#. module: base
|
||||
#: view:ir.module.module:0
|
||||
msgid "Apps"
|
||||
msgstr ""
|
||||
msgstr "Rakendused"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.ui.view_sc:0
|
||||
@@ -6508,7 +6510,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:res.groups,name:base.group_partner_manager
|
||||
msgid "Contact Creation"
|
||||
msgstr ""
|
||||
msgstr "Kontaktide loomine"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.module.module:0
|
||||
@@ -9180,7 +9182,7 @@ msgstr "Gambia"
|
||||
#: view:res.partner:0
|
||||
#: field:res.users,company_ids:0
|
||||
msgid "Companies"
|
||||
msgstr "Firmad"
|
||||
msgstr "Ettevõtted"
|
||||
|
||||
#. module: base
|
||||
#: help:res.currency,symbol:0
|
||||
@@ -9249,7 +9251,7 @@ msgstr ""
|
||||
#: 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
|
||||
@@ -9665,7 +9667,7 @@ msgstr "Kuvamine"
|
||||
#. 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
|
||||
@@ -10034,7 +10036,7 @@ msgstr "Ettevõttega seotud pangakontod"
|
||||
#: 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
|
||||
@@ -10321,7 +10323,7 @@ msgstr ""
|
||||
#. 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
|
||||
@@ -12095,7 +12097,7 @@ msgstr "ir.values"
|
||||
#. 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
|
||||
@@ -14247,7 +14249,7 @@ msgstr "Faks"
|
||||
#: 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
|
||||
|
||||
+361
-51
@@ -7,13 +7,13 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 6.0\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2012-12-03 16:01+0000\n"
|
||||
"PO-Revision-Date: 2012-12-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
|
||||
@@ -15914,6 +15914,10 @@ msgid ""
|
||||
" 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
|
||||
@@ -15924,11 +15928,16 @@ msgid ""
|
||||
"\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
|
||||
@@ -15938,7 +15947,7 @@ msgstr "A cél tevékenység."
|
||||
#. 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
|
||||
@@ -15954,6 +15963,9 @@ msgid ""
|
||||
"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
|
||||
@@ -15972,11 +15984,26 @@ msgid ""
|
||||
"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
|
||||
@@ -16011,6 +16038,10 @@ msgid ""
|
||||
"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
|
||||
@@ -16018,6 +16049,8 @@ msgid ""
|
||||
"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
|
||||
@@ -16032,7 +16065,7 @@ msgstr "Modulok telepítése"
|
||||
#. 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
|
||||
@@ -16065,7 +16098,7 @@ msgstr "Forrás"
|
||||
#: 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
|
||||
@@ -16096,6 +16129,26 @@ msgid ""
|
||||
" 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
|
||||
@@ -16113,6 +16166,13 @@ msgid ""
|
||||
"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
|
||||
@@ -16147,7 +16207,7 @@ msgstr ""
|
||||
#. 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
|
||||
@@ -16818,6 +16878,38 @@ msgid ""
|
||||
"* 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
|
||||
@@ -16866,7 +16958,7 @@ msgstr "Gyermek elem mező"
|
||||
#. module: base
|
||||
#: view:ir.rule:0
|
||||
msgid "Detailed algorithm:"
|
||||
msgstr ""
|
||||
msgstr "Részletes algoritmus:"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.actions.act_url,usage:0
|
||||
@@ -16883,7 +16975,7 @@ msgstr "Művelet használata"
|
||||
#. 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
|
||||
@@ -16922,7 +17014,7 @@ msgstr "Automatikus betöltés bézet"
|
||||
#. 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
|
||||
@@ -16932,7 +17024,7 @@ msgstr "Németország - Könyvelés"
|
||||
#. 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
|
||||
@@ -16955,6 +17047,8 @@ msgid ""
|
||||
"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
|
||||
@@ -16988,21 +17082,44 @@ msgid ""
|
||||
"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
|
||||
@@ -17016,7 +17133,7 @@ msgstr "Függőség nem teljesült !"
|
||||
#: 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
|
||||
@@ -17032,6 +17149,10 @@ msgid ""
|
||||
"\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
|
||||
@@ -17048,6 +17169,19 @@ msgid ""
|
||||
"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
|
||||
@@ -17056,6 +17190,8 @@ msgid ""
|
||||
"%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
|
||||
@@ -17087,6 +17223,29 @@ msgid ""
|
||||
"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
|
||||
@@ -17099,7 +17258,7 @@ msgstr "Hozzáférés"
|
||||
#: field:res.partner,vat:0
|
||||
#, python-format
|
||||
msgid "TIN"
|
||||
msgstr ""
|
||||
msgstr "TIN"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.aw
|
||||
@@ -17110,7 +17269,7 @@ msgstr "Aruba"
|
||||
#: 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
|
||||
@@ -17164,7 +17323,7 @@ msgstr "Haladó kimutatás"
|
||||
#. 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
|
||||
@@ -17183,6 +17342,19 @@ msgid ""
|
||||
" * 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
|
||||
@@ -17202,7 +17374,7 @@ msgstr "Értékesítés utáni szolgáltatások"
|
||||
#. 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
|
||||
@@ -17217,7 +17389,7 @@ msgstr "Indítás"
|
||||
#. 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
|
||||
@@ -17252,6 +17424,30 @@ msgid ""
|
||||
"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
|
||||
@@ -17261,13 +17457,13 @@ msgstr "Limit"
|
||||
#. 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
|
||||
@@ -17278,7 +17474,7 @@ msgstr "Jamaika"
|
||||
#: 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
|
||||
@@ -17312,12 +17508,26 @@ msgid ""
|
||||
"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
|
||||
@@ -17334,12 +17544,12 @@ msgstr "Figyelem"
|
||||
#. 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
|
||||
@@ -17365,12 +17575,12 @@ msgstr "Cseh / Čeština"
|
||||
#. 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
|
||||
@@ -17384,11 +17594,14 @@ msgid ""
|
||||
"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
|
||||
@@ -17419,7 +17632,7 @@ msgstr "Jelenlegi ablak"
|
||||
#: 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
|
||||
@@ -17427,16 +17640,18 @@ msgid ""
|
||||
"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
|
||||
@@ -17454,7 +17669,7 @@ msgstr "Ország"
|
||||
#. 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
|
||||
@@ -17478,7 +17693,7 @@ msgstr ""
|
||||
#. 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
|
||||
@@ -17486,6 +17701,8 @@ msgid ""
|
||||
"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
|
||||
@@ -17504,7 +17721,7 @@ msgstr "Hollandia - Könyvelés"
|
||||
#. 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
|
||||
@@ -17519,12 +17736,12 @@ msgstr "Spanyol (SV) / Español (SV)"
|
||||
#. 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
|
||||
@@ -17539,6 +17756,18 @@ msgid ""
|
||||
"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
|
||||
@@ -17589,6 +17818,29 @@ msgid ""
|
||||
"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
|
||||
@@ -17637,11 +17889,13 @@ msgid ""
|
||||
"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
|
||||
@@ -17656,7 +17910,7 @@ msgstr "Chile"
|
||||
#. 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
|
||||
@@ -17673,7 +17927,7 @@ msgstr "Feltétel"
|
||||
#. 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
|
||||
@@ -17683,7 +17937,7 @@ msgstr "Nézet neve"
|
||||
#. 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
|
||||
@@ -17718,6 +17972,22 @@ msgid ""
|
||||
"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
|
||||
@@ -17746,7 +18016,7 @@ msgstr "Rendszer frissítés"
|
||||
#: 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
|
||||
@@ -17761,7 +18031,7 @@ msgstr "Seychelle-szigetek"
|
||||
#. 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
|
||||
@@ -17788,7 +18058,7 @@ msgstr "Általános információk"
|
||||
#. 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
|
||||
@@ -17801,6 +18071,8 @@ msgid ""
|
||||
"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
|
||||
@@ -17827,6 +18099,26 @@ msgid ""
|
||||
"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
|
||||
@@ -17887,7 +18179,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: view:res.partner:0
|
||||
msgid "Internal Notes"
|
||||
msgstr ""
|
||||
msgstr "Belső jegyzetek"
|
||||
|
||||
#. module: base
|
||||
#: selection:res.partner.address,type:0
|
||||
@@ -17903,12 +18195,12 @@ msgstr "NyRt."
|
||||
#. 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
|
||||
@@ -17951,7 +18243,7 @@ msgstr "Objektum létrehozása"
|
||||
#. module: base
|
||||
#: model:res.country,name:base.ss
|
||||
msgid "South Sudan"
|
||||
msgstr ""
|
||||
msgstr "Dél-Szudán"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.filters,context:0
|
||||
@@ -17961,7 +18253,7 @@ msgstr "Kontextus"
|
||||
#. 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
|
||||
@@ -17975,6 +18267,15 @@ msgid ""
|
||||
" </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
|
||||
@@ -17984,7 +18285,7 @@ msgstr "Érdeklődő"
|
||||
#. 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
|
||||
@@ -18018,6 +18319,15 @@ msgid ""
|
||||
"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
|
||||
|
||||
@@ -7,13 +7,13 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2012-12-03 16:01+0000\n"
|
||||
"PO-Revision-Date: 2012-12-18 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
|
||||
@@ -158,7 +158,7 @@ msgstr ""
|
||||
#. 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
|
||||
|
||||
@@ -7,13 +7,13 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2012-12-03 16:01+0000\n"
|
||||
"PO-Revision-Date: 2012-12-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
|
||||
@@ -375,7 +375,7 @@ msgstr ""
|
||||
#. 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
|
||||
@@ -647,7 +647,7 @@ msgstr "Wizardul urmator"
|
||||
#. 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
|
||||
@@ -833,7 +833,7 @@ msgstr "Columbia"
|
||||
#. module: base
|
||||
#: model:res.partner.title,name:base.res_partner_title_mister
|
||||
msgid "Mister"
|
||||
msgstr ""
|
||||
msgstr "Domnul"
|
||||
|
||||
#. module: base
|
||||
#: help:res.country,code:0
|
||||
@@ -862,7 +862,7 @@ msgstr "Netradus(e)"
|
||||
#. 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
|
||||
@@ -896,7 +896,7 @@ msgstr "Mexic - Contabilitate"
|
||||
#: 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
|
||||
@@ -940,6 +940,33 @@ msgid ""
|
||||
"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
|
||||
@@ -959,6 +986,16 @@ msgid ""
|
||||
" </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
|
||||
@@ -969,6 +1006,11 @@ msgid ""
|
||||
"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
|
||||
@@ -991,7 +1033,7 @@ msgstr "Iordania"
|
||||
#. 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
|
||||
@@ -1006,7 +1048,7 @@ msgstr "Numele companiei trebuie sa fie unic !"
|
||||
#. 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
|
||||
@@ -1016,7 +1058,7 @@ msgstr "Romania - Contabilitate"
|
||||
#. 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
|
||||
@@ -1025,6 +1067,9 @@ msgid ""
|
||||
"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
|
||||
@@ -1046,7 +1091,7 @@ msgstr "Securitate si Autentificare"
|
||||
#. 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
|
||||
@@ -1057,7 +1102,7 @@ msgstr "Suedeza / svenska"
|
||||
#: 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
|
||||
@@ -1108,6 +1153,33 @@ msgid ""
|
||||
"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
|
||||
@@ -1155,7 +1227,7 @@ msgstr "Preferinte email"
|
||||
#: 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
|
||||
|
||||
@@ -24,12 +24,22 @@ from docutils.transforms import Transform, writer_aux
|
||||
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 _
|
||||
@@ -43,14 +53,29 @@ ACTION_DICT = {
|
||||
'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 \
|
||||
@@ -58,7 +83,7 @@ class module_category(osv.osv):
|
||||
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,))
|
||||
@@ -71,16 +96,16 @@ class module_category(osv.osv):
|
||||
'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):
|
||||
@@ -119,7 +144,6 @@ class module(osv.osv):
|
||||
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)
|
||||
@@ -134,9 +158,10 @@ class module(osv.osv):
|
||||
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):
|
||||
@@ -167,9 +192,11 @@ class module(osv.osv):
|
||||
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'])
|
||||
@@ -181,7 +208,7 @@ class module(osv.osv):
|
||||
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):
|
||||
@@ -191,15 +218,13 @@ class module(osv.osv):
|
||||
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
|
||||
@@ -232,36 +257,34 @@ class module(osv.osv):
|
||||
# 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),
|
||||
@@ -283,7 +306,7 @@ class module(osv.osv):
|
||||
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):
|
||||
@@ -292,10 +315,9 @@ class module(osv.osv):
|
||||
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)])
|
||||
@@ -340,7 +362,7 @@ class module(osv.osv):
|
||||
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):
|
||||
@@ -348,9 +370,9 @@ class module(osv.osv):
|
||||
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
|
||||
@@ -359,7 +381,7 @@ class module(osv.osv):
|
||||
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
|
||||
|
||||
@@ -403,7 +425,7 @@ class module(osv.osv):
|
||||
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):
|
||||
@@ -421,12 +443,13 @@ class module(osv.osv):
|
||||
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
|
||||
@@ -437,13 +460,13 @@ class module(osv.osv):
|
||||
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):
|
||||
@@ -460,9 +483,9 @@ class module(osv.osv):
|
||||
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):
|
||||
@@ -496,20 +519,19 @@ class module(osv.osv):
|
||||
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:
|
||||
@@ -517,7 +539,7 @@ class module(osv.osv):
|
||||
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)
|
||||
@@ -550,8 +572,9 @@ class module(osv.osv):
|
||||
|
||||
# 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])
|
||||
|
||||
@@ -570,7 +593,7 @@ class module(osv.osv):
|
||||
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)
|
||||
@@ -587,24 +610,32 @@ class module(osv.osv):
|
||||
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)
|
||||
@@ -614,17 +645,77 @@ class module(osv.osv):
|
||||
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 = []
|
||||
@@ -679,20 +770,20 @@ class module_dependency(osv.osv):
|
||||
|
||||
_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:
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
<?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>
|
||||
@@ -32,7 +30,6 @@
|
||||
</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>
|
||||
@@ -43,7 +40,7 @@
|
||||
<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...">
|
||||
@@ -53,37 +50,6 @@
|
||||
</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>
|
||||
@@ -100,7 +66,6 @@
|
||||
|
||||
|
||||
<!-- Modules -->
|
||||
|
||||
<record id="module_form" model="ir.ui.view">
|
||||
<field name="name">ir.module.module.form</field>
|
||||
<field name="model">ir.module.module</field>
|
||||
@@ -176,20 +141,74 @@
|
||||
</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>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<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>
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
id="menu_view_base_module_import"
|
||||
parent="menu_management"
|
||||
groups="base.group_no_one"
|
||||
sequence="1"/>
|
||||
sequence="6"/>
|
||||
-->
|
||||
|
||||
</data>
|
||||
|
||||
@@ -18,17 +18,17 @@
|
||||
</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>
|
||||
@@ -45,7 +45,7 @@
|
||||
id="menu_view_base_module_update"
|
||||
groups="base.group_no_one"
|
||||
parent="menu_management"
|
||||
sequence="2"
|
||||
sequence="40"
|
||||
icon="STOCK_CONVERT"/>
|
||||
|
||||
</data>
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
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>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
@@ -15,7 +15,7 @@
|
||||
# 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/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
@@ -32,6 +32,7 @@ import res_lang
|
||||
import ir_property
|
||||
|
||||
import report
|
||||
import wizard
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
||||
@@ -466,7 +466,8 @@ class res_config_settings(osv.osv_memory):
|
||||
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)
|
||||
|
||||
@@ -490,7 +491,7 @@ class res_config_settings(osv.osv_memory):
|
||||
|
||||
# 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):
|
||||
@@ -501,9 +502,7 @@ class res_config_settings(osv.osv_memory):
|
||||
|
||||
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)
|
||||
@@ -526,17 +525,26 @@ class res_config_settings(osv.osv_memory):
|
||||
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 module and module.state in ('installed', 'to 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 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',):
|
||||
|
||||
@@ -402,6 +402,8 @@ class res_partner(osv.osv, format_address):
|
||||
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
|
||||
|
||||
@@ -437,18 +439,23 @@ class res_partner(osv.osv, format_address):
|
||||
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)
|
||||
|
||||
@@ -136,6 +136,10 @@
|
||||
<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"/>
|
||||
@@ -145,7 +149,6 @@
|
||||
</div>
|
||||
<group>
|
||||
<group>
|
||||
<field name="new_password" password="True" attrs="{'required': [('id','=',False)]}"/>
|
||||
<field name="company_id" context="{'user_preference': 0}"/>
|
||||
</group>
|
||||
<group>
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
# -*- 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
|
||||
@@ -0,0 +1,81 @@
|
||||
# -*- 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})
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
<?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>
|
||||
@@ -0,0 +1,117 @@
|
||||
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");
|
||||
|
||||
};
|
||||
@@ -207,10 +207,15 @@ def quit_on_signals():
|
||||
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():
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# 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
|
||||
@@ -32,7 +32,8 @@ from openerp.modules.module import \
|
||||
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
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#
|
||||
# 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
|
||||
@@ -329,7 +329,7 @@ def load_information_from_description_file(module):
|
||||
'license': 'AGPL-3',
|
||||
'name': False,
|
||||
'post_load': None,
|
||||
'version': '0.0.0',
|
||||
'version': '1.0',
|
||||
'web': False,
|
||||
'website': '',
|
||||
'sequence': 100,
|
||||
@@ -349,6 +349,7 @@ def load_information_from_description_file(module):
|
||||
# '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
|
||||
@@ -447,15 +448,22 @@ def get_modules():
|
||||
|
||||
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.
|
||||
|
||||
@@ -50,4 +50,6 @@ author = 'OpenERP S.A.'
|
||||
author_email = 'info@openerp.com'
|
||||
license = 'AGPL-3'
|
||||
|
||||
nt_service_name = "openerp-server-" + serie
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -21,6 +21,10 @@
|
||||
##############################################################################
|
||||
|
||||
import logging
|
||||
import os
|
||||
import signal
|
||||
import subprocess
|
||||
import sys
|
||||
import threading
|
||||
import time
|
||||
|
||||
@@ -33,6 +37,7 @@ import wsgi_server
|
||||
import openerp.modules
|
||||
import openerp.netsvc
|
||||
import openerp.osv
|
||||
from openerp.release import nt_service_name
|
||||
import openerp.tools
|
||||
|
||||
#.apidoc title: RPC Services
|
||||
@@ -97,27 +102,58 @@ def stop_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:
|
||||
|
||||
@@ -54,7 +54,12 @@ from openerp import SUPERUSER_ID
|
||||
|
||||
_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):
|
||||
@@ -120,6 +125,12 @@ class db(netsvc.ExportService):
|
||||
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))
|
||||
|
||||
@@ -442,5 +442,6 @@ def stop_service():
|
||||
"""
|
||||
if httpd:
|
||||
httpd.shutdown()
|
||||
openerp.netsvc.close_socket(httpd.socket)
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -177,6 +177,10 @@ class TestCleaner(unittest2.TestCase):
|
||||
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 """
|
||||
|
||||
|
||||
@@ -130,11 +130,15 @@ def html_email_clean(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__')
|
||||
|
||||
@@ -26,6 +26,12 @@ Some functions related to the os and os.path module
|
||||
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)
|
||||
@@ -56,6 +62,59 @@ def walksymlinks(top, topdown=True, onerror=None):
|
||||
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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
@@ -15,14 +15,12 @@
|
||||
# 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
|
||||
@@ -30,35 +28,32 @@ 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
|
||||
@@ -69,29 +64,19 @@ class OpenERPServerService(win32serviceutil.ServiceFramework):
|
||||
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:
|
||||
|
||||
|
||||
+41
-10
@@ -1,6 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
@@ -15,7 +15,7 @@
|
||||
# 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/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
@@ -30,15 +30,46 @@ def datas():
|
||||
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:
|
||||
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
@PATH=%WINDIR%\system32;%WINDIR%;%WINDIR%\System32\Wbem;.
|
||||
|
||||
@net stop openerp-server-6.1
|
||||
|
||||
@net start openerp-server-6.1
|
||||
|
||||
cls
|
||||
@@ -1,5 +0,0 @@
|
||||
@PATH=%WINDIR%\system32;%WINDIR%;%WINDIR%\System32\Wbem;.
|
||||
|
||||
@net stop openerp-server-6.1
|
||||
|
||||
cls
|
||||
Reference in New Issue
Block a user