jke-openerp 2013-12-11 14:12:25 +01:00
commit 196436f73b
112 changed files with 18120 additions and 1720 deletions

View File

@ -25,25 +25,25 @@ create table ir_values
CREATE TABLE ir_model (
id serial,
model varchar(64) DEFAULT ''::varchar NOT NULL,
name varchar(64),
state varchar(16),
model varchar DEFAULT ''::varchar NOT NULL,
name varchar,
state varchar,
info text,
primary key(id)
);
CREATE TABLE ir_model_fields (
id serial,
model varchar(64) DEFAULT ''::varchar NOT NULL,
model varchar DEFAULT ''::varchar NOT NULL,
model_id int references ir_model on delete cascade,
name varchar(64) DEFAULT ''::varchar NOT NULL,
relation varchar(64),
select_level varchar(4),
field_description varchar(256),
ttype varchar(64),
state varchar(64) default 'base',
name varchar DEFAULT ''::varchar NOT NULL,
relation varchar,
select_level varchar,
field_description varchar,
ttype varchar,
state varchar default 'base',
relate boolean default False,
relation_field varchar(128),
relation_field varchar,
translate boolean default False,
primary key(id)
);
@ -350,11 +350,11 @@ CREATE TABLE ir_model_data (
write_date timestamp without time zone,
write_uid integer,
noupdate boolean,
name character varying(128) NOT NULL,
name varchar NOT NULL,
date_init timestamp without time zone,
date_update timestamp without time zone,
module character varying(64) NOT NULL,
model character varying(64) NOT NULL,
module varchar NOT NULL,
model varchar NOT NULL,
res_id integer, primary key(id)
);
@ -373,7 +373,7 @@ CREATE TABLE ir_model_constraint (
module integer NOT NULL references ir_module_module on delete restrict,
model integer NOT NULL references ir_model on delete restrict,
type character varying(1) NOT NULL,
name character varying(128) NOT NULL
name varchar NOT NULL
);
-- Records relation tables (i.e. implementing many2many) installed by a module
@ -388,7 +388,7 @@ CREATE TABLE ir_model_relation (
date_update timestamp without time zone,
module integer NOT NULL references ir_module_module on delete restrict,
model integer NOT NULL references ir_model on delete restrict,
name character varying(128) NOT NULL
name varchar NOT NULL
);
---------------------------------

View File

@ -91,5 +91,25 @@ Administrator</field>
<field eval="10" name="sequence"/>
</record>
<!-- Basic fonts family included in PDF standart, will always be in the font list -->
<record model="res.font" id="base.font_helvetica">
<field name="name">Helvetica</field>
<field name="family">Helvetica</field>
<field name="path">/dev/null</field>
<field name="mode">all</field>
</record>
<record model="res.font" id="base.font_times">
<field name="name">Times</field>
<field name="family">Times</field>
<field name="path">/dev/null</field>
<field name="mode">all</field>
</record>
<record model="res.font" id="base.font_courier">
<field name="name">Courier</field>
<field name="family">Courier</field>
<field name="path">/dev/null</field>
<field name="mode">all</field>
</record>
</data>
</openerp>

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:46+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:29+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:46+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:29+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:46+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:29+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:46+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:29+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:47+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:30+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:47+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:30+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:47+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:30+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:47+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:30+0000\n"
"X-Generator: Launchpad (build 16856)\n"
"X-Poedit-Language: Czech\n"
#. module: base

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:47+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:31+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:49+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:32+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -12,8 +12,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:49+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:32+0000\n"
"X-Generator: Launchpad (build 16856)\n"
"X-Poedit-Country: GREECE\n"
"X-Poedit-Language: Greek\n"
"X-Poedit-SourceCharset: utf-8\n"

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:55+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:38+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:53+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:36+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -1139,7 +1139,7 @@ msgstr "Preferencias de email"
#: code:addons/base/ir/ir_fields.py:195
#, python-format
msgid "'%s' does not seem to be a valid date for field '%%(field)s'"
msgstr "'%s' no parece ser una fecha valida para el campo '%%(field)s'"
msgstr "'%s' no parece ser una fecha válida para el campo '%%(field)s'"
#. module: base
#: view:res.partner:0
@ -1718,7 +1718,7 @@ msgstr "Haití"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_fr_hr_payroll
msgid "French Payroll"
msgstr "Nomina de Francia"
msgstr "Nómina de Francia"
#. module: base
#: view:ir.ui.view:0
@ -5047,6 +5047,26 @@ msgid ""
" and iban account numbers\n"
" "
msgstr ""
"\n"
"Módulo que extiende el objeto estándar account_bank_statement_line para un "
"mejor soporte de banca electrónica.\n"
"============================================================================="
"======================\n"
"\n"
"Este módulo añade:\n"
"-----------------\n"
" - fecha de cambio de divisa\n"
" - pagos por lotes\n"
" - trazabilidad de los cambios en las líneas de extractos bancarios\n"
" - vistas de líneas de extractos bancarios\n"
" - informe de saldos de extractos bancarios\n"
" - mejoras en el rendimiento para la importación digital de extractos "
"bancarios \n"
" (mediante el flag de contexto 'ebanking_import')\n"
" - name_search en res.partner.bank mejorada para permitir buscar tanto en "
"el código de cuenta bancaria \n"
" como en el código IBAN.\n"
" "
#. module: base
#: selection:ir.module.module,state:0
@ -7260,7 +7280,7 @@ msgstr "El nombre del grupo no puede empezar con \"-\""
#: view:ir.module.module:0
#: model:ir.ui.menu,name:base.module_mi
msgid "Apps"
msgstr "Tienda de aplicaciones"
msgstr "Aplicaciones en línea"
#. module: base
#: view:ir.ui.view_sc:0

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:55+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:38+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:56+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:39+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:55+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:39+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:56+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:40+0000\n"
"X-Generator: Launchpad (build 16856)\n"
"Language: \n"
#. module: base

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:55+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:39+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:57+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:40+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:56+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:40+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

File diff suppressed because it is too large Load Diff

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:55+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:38+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:48+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:31+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:47+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:30+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -9,8 +9,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:51+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:35+0000\n"
"X-Generator: Launchpad (build 16856)\n"
"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
"X-Poedit-Language: Persian\n"

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:57+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:40+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

File diff suppressed because it is too large Load Diff

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:48+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:31+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:55+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:39+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:49+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:32+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -25,6 +25,10 @@ msgid ""
"================================================\n"
" "
msgstr ""
"\n"
"Módulo para a emisión e impresión de cheques\n"
"================================================\n"
" "
#. module: base
#: model:res.country,name:base.sh
@ -60,7 +64,7 @@ msgstr "Arquitectura de Vistas"
#. module: base
#: model:ir.module.module,summary:base.module_sale_stock
msgid "Quotation, Sale Orders, Delivery & Invoicing Control"
msgstr ""
msgstr "Presuposto, ordes de venta, envío e control de facturación"
#. module: base
#: selection:ir.sequence,implementation:0
@ -89,12 +93,12 @@ msgstr ""
#. module: base
#: model:ir.module.module,summary:base.module_point_of_sale
msgid "Touchscreen Interface for Shops"
msgstr ""
msgstr "Interfaz de pantalla táctil para tendas"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
msgid "Indian Payroll"
msgstr ""
msgstr "Nómina da India"
#. module: base
#: help:ir.cron,model:0
@ -124,11 +128,22 @@ msgid ""
" * Product Attributes\n"
" "
msgstr ""
"\n"
"Módulo que engade fabricantes e atributos no formulario de producto.\n"
"===========================================================\n"
"\n"
"Pode defini-los seguintes campos para un producto:\n"
"-------------------------------------------------\n"
"* Fabricante\n"
"* Nome do producto do fabricante\n"
"* Código do producto do fabricante\n"
"* Atributos do producto\n"
" "
#. module: base
#: field:ir.actions.client,params:0
msgid "Supplementary arguments"
msgstr ""
msgstr "Argumentos suplementarios"
#. module: base
#: model:ir.module.module,description:base.module_google_base_account
@ -137,11 +152,14 @@ msgid ""
"The module adds google user in res user.\n"
"========================================\n"
msgstr ""
"\n"
"O módulo engade usuarios de Google a res.user.\n"
"========================================\n"
#. module: base
#: help:res.partner,employee:0
msgid "Check this box if this contact is an Employee."
msgstr ""
msgstr "Marque se o contacto é un traballador"
#. module: base
#: help:ir.model.fields,domain:0
@ -172,7 +190,7 @@ msgstr "Fiestra destino"
#. module: base
#: field:ir.actions.report.xml,report_rml:0
msgid "Main Report File Path"
msgstr ""
msgstr "Ruta do ficheiro do informe principal"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_analytic_plans
@ -193,6 +211,15 @@ msgid ""
"revenue\n"
"reports."
msgstr ""
"\n"
"Xere facturas dende os gastos e partes de horas.\n"
"========================================================\n"
"\n"
"Módulo para xerar facturas baseadas nos costes (recursos humanos, gastos, "
"...).\n"
"\n"
"Pode definir tarifas na contabilidade analítica, realizando algún informe "
"teórico de beneficios."
#. module: base
#: code:addons/base/ir/ir_sequence.py:134
@ -244,7 +271,7 @@ msgstr "creado"
#. module: base
#: field:ir.actions.report.xml,report_xsl:0
msgid "XSL Path"
msgstr ""
msgstr "Ruta XSL"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_tr
@ -270,7 +297,7 @@ msgstr "Inuktitut / ᐃᓄᒃᑎᑐᑦ"
#. module: base
#: model:res.groups,name:base.group_multi_currency
msgid "Multi Currencies"
msgstr ""
msgstr "Multidivisa"
#. module: base
#: model:ir.module.module,description:base.module_l10n_cl
@ -294,6 +321,7 @@ msgid ""
"The internal user that is in charge of communicating with this contact if "
"any."
msgstr ""
"O usuario interno encargado de se comunicar con este contacto, se o houber."
#. module: base
#: view:res.partner:0
@ -321,6 +349,8 @@ msgid ""
"Database ID of record to open in form view, when ``view_mode`` is set to "
"'form' only"
msgstr ""
"ID da base de datos do rexistro para abrir no formulario de vista, cando se "
"establece o modo de vista únicamente a 'formulario'"
#. module: base
#: help:ir.values,key2:0
@ -365,6 +395,13 @@ msgid ""
"document and Wiki based Hidden.\n"
" "
msgstr ""
"\n"
"Instalador oculto para a xestión do coñecemiento.\n"
"==========================================\n"
"\n"
"Fai disponible a configuración da aplicación de conocimiento dende a que se "
"pode instala-lo módulo 'document' e o módulo 'wiki'.\n"
" "
#. module: base
#: model:ir.module.category,name:base.module_category_customer_relationship_management
@ -383,6 +420,13 @@ msgid ""
"invoices from picking, OpenERP is able to add and compute the shipping "
"line.\n"
msgstr ""
"\n"
"Permite engadir métodos de envío nos pedidos de venta e nos albaráns.\n"
"==============================================================\n"
"\n"
"Pode defini-lo seu propio transportista e as suas tarifas de envío. Cando se "
"creen facturas dende o albarán, OpenERP poderá engadir e calcula-la liña de "
"envío.\n"
#. module: base
#: code:addons/base/ir/ir_filters.py:80
@ -391,6 +435,8 @@ msgid ""
"There is already a shared filter set as default for %(model)s, delete or "
"change it before setting a new default"
msgstr ""
"Xa existe un filtro compartido por defecto para %(model)s, elimíneo ou "
"cámbieo antes de configurar un novo"
#. module: base
#: code:addons/orm.py:2649
@ -488,7 +534,7 @@ msgstr ""
#. module: base
#: field:ir.model.relation,name:0
msgid "Relation Name"
msgstr ""
msgstr "Nome da relación"
#. module: base
#: view:ir.rule:0
@ -533,7 +579,7 @@ msgstr ""
#. module: base
#: view:workflow.transition:0
msgid "Workflow Transition"
msgstr ""
msgstr "Transición do fluxo de traballo"
#. module: base
#: model:res.country,name:base.gf
@ -543,7 +589,7 @@ msgstr "Güiana francesa"
#. module: base
#: model:ir.module.module,summary:base.module_hr
msgid "Jobs, Departments, Employees Details"
msgstr ""
msgstr "Traballos, departamentos e detalles de traballadores"
#. module: base
#: model:ir.module.module,description:base.module_analytic
@ -559,11 +605,20 @@ msgid ""
"that have no counterpart in the general financial accounts.\n"
" "
msgstr ""
"\n"
"Módulo para defini-lo obxeto contabilidad analítica\n"
"===============================================\n"
"\n"
"En OpenERP, as contas analíticas están vinculadas cas contas xerais \n"
"pero trátanse de forma totalmente independiente. Polo tanto, pódense "
"introducir \n"
"operacións analíticas sen contrapartida na contabilidade financieira.\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_idea
msgid "Ideas"
msgstr ""
msgstr "Ideas"
#. module: base
#: model:ir.module.module,description:base.module_event
@ -652,7 +707,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
@ -681,7 +736,7 @@ msgstr "Non traducido"
#. module: base
#: view:ir.mail_server:0
msgid "Outgoing Mail Server"
msgstr ""
msgstr "Servidor de correo saínte"
#. module: base
#: help:ir.actions.act_window,context:0
@ -695,7 +750,7 @@ msgstr ""
#. module: base
#: field:res.company,logo_web:0
msgid "Logo Web"
msgstr ""
msgstr "Logo web"
#. module: base
#: code:addons/base/ir/ir_model.py:344
@ -772,6 +827,12 @@ msgid ""
"Contains the installer for marketing-related modules.\n"
" "
msgstr ""
"\n"
"Menú para Marketing\n"
"===================\n"
"\n"
"Contén o instalador para os módulos relacionados co marketing.\n"
" "
#. module: base
#: model:ir.module.module,description:base.module_web_linkedin
@ -782,6 +843,11 @@ msgid ""
"This module provides the Integration of the LinkedIn with OpenERP.\n"
" "
msgstr ""
"\n"
"Módulo web de LinkedIn para OpenERP.\n"
"=================================\n"
"Este módulo provee a integración de LinkedIn con OpenERP.\n"
" "
#. module: base
#: help:ir.actions.act_window,src_model:0
@ -803,7 +869,7 @@ msgstr "Jordan"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_hr
msgid "Croatia - RRIF 2012 COA"
msgstr ""
msgstr "Croacia - RRIF 2012 COA"
#. module: base
#: help:ir.cron,nextcall:0
@ -867,7 +933,7 @@ msgstr "Seguridade e 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
@ -878,7 +944,7 @@ msgstr "Sueco / svenska"
#: field:base.language.export,name:0
#: field:ir.attachment,datas_fname:0
msgid "File Name"
msgstr ""
msgstr "Nome do ficheiro"
#. module: base
#: model:res.country,name:base.rs
@ -971,7 +1037,7 @@ msgstr "Preferencias de email"
#: code:addons/base/ir/ir_fields.py:195
#, python-format
msgid "'%s' does not seem to be a valid date for field '%%(field)s'"
msgstr ""
msgstr "'%s' non semella ser unha data válida para o campo '%%(field)s'"
#. module: base
#: view:res.partner:0
@ -988,6 +1054,7 @@ msgstr "Cimbabue"
msgid ""
"Type of the constraint: `f` for a foreign key, `u` for other constraints."
msgstr ""
"Tipo de restricción: 'f' para unha clave allea, 'u' para outras restriccións."
#. module: base
#: view:ir.actions.report.xml:0
@ -1061,7 +1128,7 @@ msgstr "Outra Licenza 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
@ -1088,7 +1155,7 @@ msgstr "Usuarios de Google"
#. module: base
#: model:ir.module.module,shortdesc:base.module_fleet
msgid "Fleet Management"
msgstr ""
msgstr "Xestión de flotas"
#. module: base
#: help:ir.server.object.lines,value:0
@ -1108,7 +1175,7 @@ msgstr "Andorra, Principado de"
#. 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
@ -1167,12 +1234,12 @@ msgstr ""
#: code:addons/base/ir/ir_model.py:735
#, python-format
msgid "Document model"
msgstr ""
msgstr "Modelo de documento"
#. module: base
#: view:res.users:0
msgid "Change the user password."
msgstr ""
msgstr "Cambia-lo contrasinal do usuario"
#. module: base
#: view:res.lang:0
@ -1269,12 +1336,12 @@ msgstr "¡ O nome do 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 dereito de acceso"
#. module: base
#: code:addons/base/ir/ir_mail_server.py:214
@ -1301,7 +1368,7 @@ msgstr "Illas Caimán"
#. module: base
#: view:ir.rule:0
msgid "Record Rule"
msgstr ""
msgstr "Regla de rexistro"
#. module: base
#: model:res.country,name:base.kr
@ -1311,7 +1378,7 @@ msgstr "Corea do Sur"
#. module: base
#: model:ir.module.module,description:base.module_l10n_si
msgid "Kontni načrt za gospodarske družbe"
msgstr ""
msgstr "Plan contable para empresas"
#. module: base
#: code:addons/orm.py:4920
@ -1327,7 +1394,7 @@ msgstr "Contribuíntes"
#. module: base
#: field:ir.rule,perm_unlink:0
msgid "Apply for Delete"
msgstr ""
msgstr "Marcar para eliminación"
#. module: base
#: selection:ir.property,type:0
@ -1337,12 +1404,12 @@ msgstr "Char"
#. module: base
#: field:ir.module.category,visible:0
msgid "Visible"
msgstr ""
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
@ -1402,6 +1469,8 @@ msgid ""
" for uploading to OpenERP's translation "
"platform,"
msgstr ""
"Formato TGZ: arquivo comprimido que contén un ficheiro .po, adecuado para "
"subilo directamente á plataforma de tradución de OpenERP."
#. module: base
#: view:res.lang:0
@ -1418,7 +1487,7 @@ msgstr ""
#: code:addons/base/module/wizard/base_language_install.py:53
#, python-format
msgid "Language Pack"
msgstr ""
msgstr "Paquete de idioma"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_tests
@ -1428,7 +1497,7 @@ msgstr "Probas"
#. module: base
#: field:ir.actions.report.xml,attachment:0
msgid "Save as Attachment Prefix"
msgstr ""
msgstr "Prefixo do anexo ó 'Gardar como'"
#. module: base
#: field:ir.ui.view_sc,res_id:0
@ -1465,7 +1534,7 @@ msgstr "Haití"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_fr_hr_payroll
msgid "French Payroll"
msgstr ""
msgstr "Nómina de Francia"
#. module: base
#: view:ir.ui.view:0
@ -1492,7 +1561,7 @@ msgstr ""
#. module: base
#: field:ir.module.category,parent_id:0
msgid "Parent Application"
msgstr ""
msgstr "Aplicación pai"
#. module: base
#: model:ir.actions.act_window,name:base.ir_action_wizard
@ -1515,7 +1584,7 @@ msgstr "Sistema de xestión documental"
#. module: base
#: model:ir.module.module,shortdesc:base.module_crm_claim
msgid "Claims Management"
msgstr ""
msgstr "Xestión de reclamacións"
#. module: base
#: model:ir.module.module,description:base.module_document_webdav
@ -1653,7 +1722,7 @@ msgstr "Non existe ningunha linguaxe con código \"%s\""
#: model:ir.module.category,name:base.module_category_social_network
#: model:ir.module.module,shortdesc:base.module_mail
msgid "Social Network"
msgstr ""
msgstr "Rede social"
#. module: base
#: view:res.lang:0
@ -1663,12 +1732,12 @@ msgstr "%Y - Ano co século."
#. module: base
#: view:res.company:0
msgid "Report Footer Configuration"
msgstr ""
msgstr "Configuración do pé 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
@ -1729,7 +1798,7 @@ msgstr ""
#. module: base
#: help:res.partner,website:0
msgid "Website of Partner or Company"
msgstr ""
msgstr "Sitio web da empresa ou compañía"
#. module: base
#: help:base.language.install,overwrite:0
@ -1790,7 +1859,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_project_issue
msgid "Portal Issue"
msgstr ""
msgstr "Incidencia de portal"
#. module: base
#: model:ir.ui.menu,name:base.menu_tools
@ -1814,12 +1883,12 @@ msgstr ""
#. module: base
#: field:res.partner,image_small:0
msgid "Small-sized image"
msgstr ""
msgstr "Imaxe pequena"
#. module: base
#: model:ir.module.module,shortdesc:base.module_stock
msgid "Warehouse Management"
msgstr ""
msgstr "Xestión de almacéns"
#. module: base
#: model:ir.model,name:base.model_res_request_link
@ -1847,7 +1916,7 @@ msgstr "Accións de Servidor"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_lu
msgid "Luxembourg - Accounting"
msgstr ""
msgstr "Luxemburgo - Contabilidade"
#. module: base
#: model:res.country,name:base.tp
@ -1859,7 +1928,7 @@ msgstr "Timor Leste"
#: view:ir.module.module:0
#, python-format
msgid "Install"
msgstr ""
msgstr "Instalar"
#. module: base
#: field:res.currency,accuracy:0
@ -1914,6 +1983,7 @@ msgstr ""
#, python-format
msgid "Unknown value '%s' for boolean field '%%(field)s', assuming '%s'"
msgstr ""
"Valor descoñecido '%s' para o campo booleano '%%(field)s', asúmese '%s'"
#. module: base
#: model:res.country,name:base.nl
@ -1923,12 +1993,12 @@ msgstr "Holanda"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_event
msgid "Portal Event"
msgstr ""
msgstr "Evento do portal"
#. module: base
#: selection:ir.translation,state:0
msgid "Translation in Progress"
msgstr ""
msgstr "Traducción en curso"
#. module: base
#: model:ir.model,name:base.model_ir_rule
@ -1980,7 +2050,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_process
msgid "Enterprise Process"
msgstr ""
msgstr "Proceso da empresa"
#. module: base
#: help:res.partner,supplier:0
@ -1992,7 +2062,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_hr_evaluation
msgid "Employee Appraisals"
msgstr ""
msgstr "Evaluación de traballadores"
#. module: base
#: selection:ir.actions.server,state:0
@ -13237,7 +13307,7 @@ msgstr "ir.sequence.type"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_be_hr_payroll_account
msgid "Belgium - Payroll with Accounting"
msgstr ""
msgstr "Bélxica - Nóminas con contabilidad"
#. module: base
#: selection:base.language.export,format:0

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:49+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:32+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:49+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:32+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:49+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:33+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:53+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:36+0000\n"
"X-Generator: Launchpad (build 16856)\n"
"Language: hr\n"
#. module: base
@ -25,6 +25,10 @@ msgid ""
"================================================\n"
" "
msgstr ""
"\n"
"Modul za sastavljanje i ispis čekova\n"
"============================\n"
" "
#. module: base
#: model:res.country,name:base.sh
@ -3189,7 +3193,7 @@ msgstr ""
#. module: base
#: field:res.company,rml_header1:0
msgid "Company Tagline"
msgstr ""
msgstr "Slogan tvrtke"
#. module: base
#: code:addons/base/res/res_users.py:674
@ -12396,7 +12400,7 @@ msgstr "Kontrolne ploče"
#. module: base
#: model:ir.module.module,shortdesc:base.module_procurement
msgid "Procurements"
msgstr "Nabave"
msgstr "Nabava"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_6

View File

@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
"PO-Revision-Date: 2013-10-15 13:13+0000\n"
"Last-Translator: tdombos <Unknown>\n"
"PO-Revision-Date: 2013-11-24 14:57+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: 2013-11-02 05:49+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:33+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -6162,18 +6162,18 @@ msgid ""
msgstr ""
"\n"
"Ez a modul hozzáad állapotot, start_dátumot, stop_dátumot a gyártási "
"megrendelés végrehalytási soraihoz (a 'Gyártási megrendelések' fülön).\n"
"megrendelés végrehajtási soraihoz (a 'Gyártási megrendelések' fülön).\n"
"============================================================================="
"===================================\n"
"\n"
"Állapot: terv, leigazolt, elvégzett, érévnytelenített\n"
"Ha elvégzett/visszaigazolt, érévnytelenített a gyártási rendelés akkor "
"Állapot: terv, leigazolt, elvégzett, érvénytelenített\n"
"Ha elvégzett/visszaigazolt, érvénytelenített a gyártási rendelés akkor "
"megfelelő állapot sorokat\n"
"be kell állítani az állapothoz.\n"
"\n"
"Menük létrehozás:\n"
"-------------\n"
" **Gyátás** > **Gyártás** > **Gyártási megrendelések**\n"
" **Gyártás** > **Gyártás** > **Gyártási megrendelések**\n"
"\n"
"Megtalálható a 'Gyártási megrendelések' soraiban a gyártási "
"megrendeléseknél.\n"
@ -6184,8 +6184,8 @@ msgstr ""
" * start (állítsa be a visszaigazolt állapotot), állítsa be az "
"indulási_dátumot\n"
" * stop (állítsa be az elvégzett állapotot), állítsa be a stop_dátumot\n"
" * Tervezettr állít (állítsa be a tervezett állapotot)\n"
" * érévnytelenít (állítsa be az érvénytelenít állapotot)\n"
" * Tervezetet állít (állítsa be a tervezett állapotot)\n"
" * érvénytelenít (állítsa be az érvénytelenít állapotot)\n"
"\n"
"Ha egy gyártási rendelés 'elvégezhetővé' válik, akkor 'visszaigazoltnak' "
"kell lennie.\n"
@ -9157,7 +9157,7 @@ msgid ""
msgstr ""
"\n"
"Hosszú távú projekt szervezés modul mely nyomon követi a tervezést, "
"ütemtervet, erőforrás kiosztás.\n"
"ütemtervet, erőforrás kiosztást.\n"
"============================================================================="
"==============\n"
"\n"
@ -9171,7 +9171,7 @@ msgstr ""
" feladat megadva akkor az összesre terv, nyitott és folyamatban állapot "
"lesz választva.\n"
" * Ügy ütemterv számítás: Ez ugyanúgy működik mint az ütemezés gomb a \n"
" project.phase project.fázis-on. Ez alapul veszi a projectet és "
" projekt.projekt fázis.fázis-on. Ez alapul veszi a projektet és "
"kiszámítja az összes nyitott,\n"
" tervet és elintézetlen ügyeket.\n"
" * Ütemezett ügyek: Minden ügy, mely terv, elintézetlen és nyitott "
@ -11190,7 +11190,7 @@ msgstr ""
"\n"
"Beállítás:\n"
"--------------\n"
"A madul telepítése után konfigurálni kell az LDAP paramétereket a vállalat "
"A modul telepítése után konfigurálni kell az LDAP paramétereket a vállalat "
"részletei\n"
"beállítás fülön. Különböző vállalatoknak különböző LDAP szerverei vannak,\n"
"amíg egyedi felhasználó nevei vannak (a felhasználó neveknek az OpenERP-ben\n"
@ -11286,7 +11286,7 @@ msgstr "Réunion (Francia)"
msgid ""
"New column name must still start with x_ , because it is a custom field!"
msgstr ""
"Az új oszlopnévnek még mindig x_-sal kell kezdődnie, mert ez egy egyéni mező!"
"Az új oszlopnévnek még mindig x_-al kell kezdődnie, mert ez egy egyéni mező!"
#. module: base
#: model:ir.module.module,shortdesc:base.module_mrp_repair
@ -13726,7 +13726,7 @@ msgstr "Normál"
#. module: base
#: model:ir.module.module,shortdesc:base.module_purchase_double_validation
msgid "Double Validation on Purchases"
msgstr "A vásárlásokra kétszeres jóváhagyás"
msgstr "Kkétszeres jóváhagyás a beszerzésekre"
#. module: base
#: field:res.bank,street2:0
@ -14037,8 +14037,8 @@ msgid ""
" "
msgstr ""
"\n"
"Ez a modul kiegészíti a Raktárház alkalmazást, hatásosan beágyazva a Belökés "
"& Kihúzás raktár folyamatokat.\n"
"Ez a modul kiegészíti a Raktárépület alkalmazást, hatásosan beágyazva a "
"Belökés & Kihúzás raktár folyamatokat.\n"
"============================================================================="
"===============================\n"
"\n"
@ -18275,8 +18275,8 @@ msgstr ""
"Az Elválasztó formátumnak olyannak kell lennie [,n] ahol 0 < n :egység "
"számjegytől indul. A -1 fogja jelezni az elválasztás végét. Pl. a [3,2,-1] "
"fogja jelölni a 106500-nál, hogy 1,06,500 lehessen; az [1,2,-1] fogja "
"lehetővé tenni, hogy a szám 106,50,0 legyen. Ebben az esetben mindig a ',' "
"az ezres elválasztó."
"lehetővé tenni, hogy a szám 106,50,0 legyen;[3] fogja jelölni mint 106,500. "
"Ebben az esetben mindig a ',' az ezres elválasztó."
#. module: base
#: field:ir.module.module,auto_install:0

View File

@ -9,8 +9,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:47+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:29+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:50+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:33+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:50+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:33+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:50+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:33+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

File diff suppressed because it is too large Load Diff

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:48+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:32+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:50+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:34+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:50+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:34+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:51+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:34+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:51+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:34+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -811,7 +811,7 @@ msgstr "Automatizētas darbības"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_ro
msgid "Romania - Accounting"
msgstr ""
msgstr "Rumānija - Grāmatvedība"
#. module: base
#: model:ir.model,name:base.model_res_config_settings
@ -937,12 +937,12 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_document_webdav
msgid "Shared Repositories (WebDAV)"
msgstr ""
msgstr "Koplietošanas Krātuves (WebDAV)"
#. module: base
#: view:res.users:0
msgid "Email Preferences"
msgstr ""
msgstr "E-pasta Uzstādījumi"
#. module: base
#: code:addons/base/ir/ir_fields.py:195
@ -1005,7 +1005,7 @@ msgstr "Omāna"
#. module: base
#: model:ir.module.module,shortdesc:base.module_mrp
msgid "MRP"
msgstr ""
msgstr "Ražošana"
#. module: base
#: model:ir.module.module,description:base.module_hr_attendance
@ -2491,7 +2491,7 @@ msgstr "Grupas (ja nav = globāla)"
#. module: base
#: view:ir.module.module:0
msgid "Extra"
msgstr ""
msgstr "Papildus"
#. module: base
#: model:res.country,name:base.st
@ -16443,3 +16443,9 @@ msgstr ""
#~ msgid "Administration Dashboard"
#~ msgstr "Administrēšanas instrumentu panelis"
#~ msgid "Process"
#~ msgstr "Apstrādāt"
#~ msgid "Website of Partner."
#~ msgstr "Partnera Vietne"

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:51+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:34+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:51+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:34+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:51+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:35+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

File diff suppressed because it is too large Load Diff

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:56+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:39+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

File diff suppressed because it is too large Load Diff

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:52+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:35+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -9,13 +9,13 @@ msgstr ""
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
"PO-Revision-Date: 2012-12-16 22:18+0000\n"
"Last-Translator: Fábio Martinelli - http://zupy.com.br "
"<webmaster@guaru.net>\n"
"<webmaster@zupy.com.br>\n"
"Language-Team: <pt@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:55+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:38+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:52+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:35+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -211,14 +211,14 @@ msgid ""
"reports."
msgstr ""
"\n"
"Genereaza Facturi din Cheltuieli, Inregistrari ale Fiselor de Pontaj.\n"
"Generează Facturi din Cheltuieli, Înregistrări ale Fișelor de Pontaj.\n"
"========================================================\n"
"\n"
"Modul pentru generarea facturilor pe baza costurilor (resurse umane, "
"cheltuieli, ...).\n"
"\n"
"Puteti defini liste de preturi in contul analitic, puteti face unele raporte "
"teoretice\n"
"Puteți defini liste de preturi în contul analitic, puteți face unele "
"rapoarte teoretice\n"
"ale veniturilor."
#. module: base
@ -236,8 +236,8 @@ msgid ""
"Properties of base fields cannot be altered in this manner! Please modify "
"them through Python code, preferably through a custom addon!"
msgstr ""
"Proprietatile campurilor principale nu pot fi modificate in acest mod! Va "
"rugam sa le modificati prin codul Python, preferabil printr-un addon "
"Proprietățile câmpurilor principale nu pot fi modificate în acest mod! Vă "
"rugăm sa le modificați prin codul Python, preferabil printr-un addon "
"personalizat!"
#. module: base
@ -333,12 +333,12 @@ msgstr ""
#. module: base
#: view:res.partner:0
msgid "Search Partner"
msgstr "Cauta Partener"
msgstr "Caută Partener"
#. module: base
#: field:ir.module.category,module_nr:0
msgid "Number of Modules"
msgstr "Numar de Module"
msgstr "Număr de module"
#. module: base
#: help:multi_company.default,company_dest_id:0
@ -348,7 +348,7 @@ msgstr "Compania unde se pastreaza înregistrarea actuală"
#. module: base
#: field:res.partner.bank.type.field,size:0
msgid "Max. Size"
msgstr "Dimensiunea maxima"
msgstr "Dimensiunea maximă"
#. module: base
#: help:ir.actions.act_window,res_id:0
@ -451,7 +451,7 @@ msgstr ""
#: code:addons/orm.py:2649
#, python-format
msgid "Invalid group_by"
msgstr "Grup invalid_dupa"
msgstr "Grupare_După invalidă"
#. module: base
#: field:ir.module.category,child_ids:0
@ -499,7 +499,7 @@ msgstr "Configurare pași asistent"
#. module: base
#: model:ir.model,name:base.model_ir_ui_view_sc
msgid "ir.ui.view_sc"
msgstr "ir.ui.vizualizare_sc"
msgstr "ir.ui.view_sc"
#. module: base
#: view:ir.model.access:0
@ -1289,7 +1289,7 @@ msgstr "Principatul Andorra"
#. module: base
#: field:ir.rule,perm_read:0
msgid "Apply for Read"
msgstr "Se aplică pentru Citit"
msgstr "Se aplică pentru citire"
#. module: base
#: model:res.country,name:base.mn
@ -2204,7 +2204,7 @@ msgstr "Timorul de Est"
#: view:ir.module.module:0
#, python-format
msgid "Install"
msgstr "Instalează"
msgstr "Instalați"
#. module: base
#: field:res.currency,accuracy:0
@ -2704,7 +2704,7 @@ msgstr "Bahamas"
#. module: base
#: field:ir.rule,perm_create:0
msgid "Apply for Create"
msgstr "Aplică pentru Creare"
msgstr "Aplică pentru creare"
#. module: base
#: model:ir.module.category,name:base.module_category_tools
@ -3310,7 +3310,7 @@ msgstr "Raport RML"
#. module: base
#: model:ir.ui.menu,name:base.menu_translation_export
msgid "Import / Export"
msgstr "Import / Export"
msgstr "Importați / Exportați"
#. module: base
#: model:ir.module.module,description:base.module_sale
@ -3479,7 +3479,7 @@ msgstr "Letonia"
#. module: base
#: view:ir.actions.server:0
msgid "Field Mappings"
msgstr "Aplicatii Camp"
msgstr "Corespondențe câmp"
#. module: base
#: view:base.language.export:0
@ -4557,7 +4557,7 @@ msgstr "Persoane"
#. module: base
#: view:base.language.import:0
msgid "_Import"
msgstr "_Importă"
msgstr "_Importați"
#. module: base
#: field:res.users,action_id:0
@ -6122,7 +6122,7 @@ msgstr "Asistenta IT"
#. module: base
#: model:ir.module.category,name:base.module_category_specific_industry_applications
msgid "Specific Industry Applications"
msgstr "Aplicatii Specifice Industriei"
msgstr "Aplicații Specifice Industriei"
#. module: base
#: model:ir.module.module,shortdesc:base.module_google_docs
@ -6340,7 +6340,7 @@ msgstr "Nu poate fi cautat"
#: view:ir.config_parameter:0
#: field:ir.config_parameter,key:0
msgid "Key"
msgstr "Tastă"
msgstr "Cheie"
#. module: base
#: field:res.company,rml_header:0
@ -7050,7 +7050,7 @@ msgstr "ir.actions.act_url"
#. module: base
#: model:ir.ui.menu,name:base.menu_translation_app
msgid "Application Terms"
msgstr "Termeni aplicație"
msgstr "Termenii aplicației"
#. module: base
#: model:ir.actions.act_window,help:base.open_module_tree
@ -9347,7 +9347,7 @@ msgstr "Burundi"
#: view:base.module.configuration:0
#: view:base.module.update:0
msgid "Close"
msgstr "Inchide"
msgstr "Închideți"
#. module: base
#: selection:base.language.install,lang:0
@ -9570,7 +9570,7 @@ msgstr "Chineza (CN) / 简体中文"
#. module: base
#: field:ir.model.fields,selection:0
msgid "Selection Options"
msgstr "Optiuni de selectie"
msgstr "Opțiuni de selecție"
#. module: base
#: field:res.bank,street:0
@ -9847,13 +9847,13 @@ msgid ""
" </p>\n"
" "
msgstr ""
"<p clasa=\"oe_vizualizare_niciuncontinut_creeaza\">\n"
" Faceti click pentru a adauga un contact in agenda "
"dumneavoastra.\n"
"<p clasa=\"oe_view_nocontent_create\">\n"
" Faceți clic pentru a adaugă un contact în agenda "
"dumneavoastră.\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"
" OpenERP vă ajută să țineți evidența cu ușurință a tuturor "
"activităților legate de\n"
" un client: discuții, istoricul oportunităților de afaceri,\n"
" documente, etc.\n"
" </p>\n"
" "
@ -10656,8 +10656,8 @@ msgid ""
"If the selected language is loaded in the system, all documents related to "
"this contact will be printed in this language. If not, it will be English."
msgstr ""
"Daca limba selectata este incarcata in sistem, toate documentele asociate "
"acestui contact vor fi tiparite in aceasta limba. Daca nu, limba va fi "
"Dacă limba selectata este încărcata în sistem, toate documentele asociate "
"acestui contact vor fi tipărite în aceasta limba. Dacă nu, limba va fi "
"engleza."
#. module: base
@ -10828,7 +10828,7 @@ msgstr ""
#. module: base
#: field:ir.actions.report.xml,attachment_use:0
msgid "Reload from Attachment"
msgstr "Reincarcati din Atasament"
msgstr "Reîncarcați din Atașament"
#. module: base
#: model:res.country,name:base.mx
@ -10982,7 +10982,7 @@ msgstr "ID-ul vizualizarii definita in fisierul xml"
#. module: base
#: model:ir.model,name:base.model_base_module_import
msgid "Import Module"
msgstr "Importati Modulul"
msgstr "Importați Modulul"
#. module: base
#: model:res.country,name:base.as
@ -11632,7 +11632,7 @@ msgstr "efectuat"
#. module: base
#: view:ir.actions.act_window:0
msgid "General Settings"
msgstr "Configurari generale"
msgstr "Configurări generale"
#. module: base
#: model:ir.module.module,description:base.module_l10n_in
@ -13074,7 +13074,7 @@ msgstr ""
#: model:ir.actions.act_window,name:base.action_view_base_module_upgrade
#, python-format
msgid "Apply Schedule Upgrade"
msgstr "Aplica Programeaza Actualizarea"
msgstr "Aplică actualizările planificate"
#. module: base
#: view:workflow.activity:0
@ -13444,7 +13444,7 @@ msgstr ""
#. module: base
#: view:base.module.import:0
msgid "Import module"
msgstr "Importati modulul"
msgstr "Importați modulul"
#. module: base
#: field:ir.actions.server,loop_action:0
@ -13745,10 +13745,10 @@ msgid ""
"not connect to the system. You can assign them groups in order to give them "
"specific access to the applications they need to use in the system."
msgstr ""
"Creati si gestionati utilizatori care se vor conecta la sistem. Utilizatorii "
"pot fi dezactivati in caz ca exista o perioada de timp in care ei nu se "
"conecteaza la sistem. Le puteti atribui grupuri pentru a le da acces "
"specific la aplicatiile de care ei au nevoie in sistem."
"Creați și gestionați utilizatori care se vor conecta la sistem. Utilizatorii "
"pot fi dezactivați în caz că există o perioada de timp în care ei nu se "
"conectează la sistem. Le puteți atribui grupuri pentru a le da acces "
"specific la aplicațiile de care ei au nevoie în sistem."
#. module: base
#: selection:res.request,priority:0
@ -13856,7 +13856,7 @@ msgstr "Declansati Configurarea"
#. module: base
#: view:base.language.install:0
msgid "Load"
msgstr "Incarca"
msgstr "Încărcați"
#. module: base
#: model:ir.module.module,description:base.module_warning
@ -14298,7 +14298,7 @@ msgstr "Contactul nu a putut fi creat fara adresa de email !"
#: model:ir.ui.menu,name:base.menu_mrp_config
#: model:ir.ui.menu,name:base.menu_mrp_root
msgid "Manufacturing"
msgstr "Fabricatie"
msgstr "Fabricație"
#. module: base
#: model:res.country,name:base.km
@ -14931,7 +14931,7 @@ msgstr ""
#: model:ir.actions.act_window,name:base.action_view_base_import_language
#: model:ir.ui.menu,name:base.menu_view_base_import_language
msgid "Import Translation"
msgstr "Importati Traducerea"
msgstr "Importați Traducerea"
#. module: base
#: view:ir.module.module:0
@ -15470,7 +15470,7 @@ msgstr "Grecia"
#. module: base
#: view:res.config:0
msgid "Apply"
msgstr "Aplicati"
msgstr "Aplicați"
#. module: base
#: field:res.request,trigger_date:0
@ -17452,7 +17452,7 @@ msgstr "Helpdesk (Serviciu de asistenta tehnica)"
#. module: base
#: field:ir.rule,perm_write:0
msgid "Apply for Write"
msgstr "Aplica pentru Scriere"
msgstr "Aplicați pentru scriere"
#. module: base
#: field:ir.ui.menu,parent_left:0
@ -17558,7 +17558,7 @@ msgstr "Vizualizare :"
#. module: base
#: field:ir.model.fields,view_load:0
msgid "View Auto-Load"
msgstr "Vizualizare Incarcare Automata"
msgstr "Vizualizare încarcare automată"
#. module: base
#: model:ir.module.module,description:base.module_l10n_et
@ -17607,7 +17607,7 @@ msgstr "Fisier Pictograma Web"
#. module: base
#: model:ir.ui.menu,name:base.menu_view_base_module_upgrade
msgid "Apply Scheduled Upgrades"
msgstr "Aplica Actualizarile Planificate"
msgstr "Aplică actualizările planificate"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_journal
@ -18572,7 +18572,7 @@ msgstr "Conditie"
#: model:ir.actions.client,name:base.modules_updates_act_cl
#: model:ir.ui.menu,name:base.menu_module_updates
msgid "Updates"
msgstr "Actualizari"
msgstr "Actualizări"
#. module: base
#: help:res.currency,rate:0
@ -18875,7 +18875,7 @@ msgid ""
"Helps you manage your manufacturing processes and generate reports on those "
"processes."
msgstr ""
"Va ajuta sa va administrati procesele de fabricatie si sa generati rapoarte "
"Vă ajută să vă administrați procesele de fabricație și să generați rapoarte "
"pentru aceste procese."
#. module: base
@ -19030,13 +19030,13 @@ msgid ""
" </p>\n"
" "
msgstr ""
"<clasa p=\"oe_vizualizare_niciuncontinut_creeaza\">\n"
" Faceti click pentru a adauga un contact in agenda "
"dumneavoastra.\n"
"<p clasa=\"oe_view_nocontent_create\">\n"
" Faceți clic pentru a adaugă un contact în agenda "
"dumneavoastră.\n"
" </p><p>\n"
" OpenERP va ajuta sa tineti evidenta cu usurinta a tuturor "
"activitatilor asociate unui\n"
" client; discutii, istoricul oportunitatilor de afaceri,\n"
" OpenERP vă ajută să țineți evidența cu ușurință a tuturor "
"activităților legate de\n"
" un client: discuții, istoricul oportunităților de afaceri,\n"
" documente, etc.\n"
" </p>\n"
" "

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:52+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:35+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -307,6 +307,13 @@ msgid ""
"\n"
" "
msgstr ""
"\n"
"Чилийский бухгалтерский учет и налоги в соответствии с действующими "
"положениями\n"
"==============================================\n"
"Plan contable chileno e impuestos de acuerdo a disposiciones vigentes\n"
"\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale
@ -429,6 +436,8 @@ msgid ""
"There is already a shared filter set as default for %(model)s, delete or "
"change it before setting a new default"
msgstr ""
"Уже существует общий фильтр по умолчанию для %(model)s, удалите или измените "
"его прежде чем устанавливать новый по умолчанию"
#. module: base
#: code:addons/orm.py:2649
@ -597,6 +606,15 @@ msgid ""
"that have no counterpart in the general financial accounts.\n"
" "
msgstr ""
"\n"
"Модуль для определения объекта аналитического учета.\n"
"===============================================\n"
"\n"
"В OpenERP, аналитические счета связаны с общими счетами, но рассматриваются\n"
"полностью независимо. Таким образом, вы можете ввести различные "
"аналитические операции\n"
"которые не дублируются в общие финансовые счета.\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_idea
@ -620,6 +638,19 @@ msgid ""
"* Use emails to automatically confirm and send acknowledgements for any "
"event registration\n"
msgstr ""
"\n"
"Организация и управление событиями.\n"
"======================================\n"
"\n"
"Модуль мероприятий позволяет Вам эффективно организовывать события и все "
"задачи связанные с: планификацией, регистрацией отслеживания,\n"
"посещаемостью, и т.д.\n"
"\n"
"Основные характеристики\n"
"------------\n"
"* Управление своими Мероприятиями и Регистрациями\n"
"* Использовать электронную почту для автоматического подтверждения и "
"отправлять подтверждения для регистрации любого события\n"
#. module: base
#: selection:base.language.install,lang:0
@ -877,7 +908,7 @@ msgstr "Иордания"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_hr
msgid "Croatia - RRIF 2012 COA"
msgstr ""
msgstr "Хорватия - RRIF 2012 COA"
#. module: base
#: help:ir.cron,nextcall:0
@ -2534,6 +2565,10 @@ msgid ""
"=================================\n"
" "
msgstr ""
"\n"
"Позволить неавторизованным пользователям доступ к Порталу.\n"
"=================================\n"
" "
#. module: base
#: model:res.country,name:base.ge
@ -2712,6 +2747,25 @@ msgid ""
"Print product labels with barcode.\n"
" "
msgstr ""
"\n"
"Это базовый модуль для управления продуктами и прайс-листами в OpenERP.\n"
"========================================================================\n"
"\n"
"Продукты поддерживают варианты, различные методы ценообразования, информацию "
"о поставщиках,\n"
"производство в запас / подзаказ, различные единицы мер, упаковки и свойств.\n"
"Прайс-листы поддерживают:\n"
"--------------------\n"
" * Многоуровневые скидки (по продуктам, категориям, количеству)\n"
" * Расчет базовой цены по различным критериям:\n"
" * другим прайс-листам\n"
" * себестоимости\n"
" * рыночной цене\n"
" * цене поставщиков\n"
"\n"
"Прайс-листы по продуктам или партнерам.\n"
"Печать этикеток с штрих-кодом.\n"
" "
#. module: base
#: model:ir.module.module,description:base.module_account_analytic_default
@ -2869,6 +2923,17 @@ msgid ""
" * Files by Partner (graph)\n"
" * Files Size by Month (graph)\n"
msgstr ""
"\n"
"Система управления документооборотом.\n"
"==============================================\n"
" * Авторизация пользователей\n"
" * Индексация документов: файлы .pptx и .docx не поддерживаются в ОС "
"Windows\n"
" * Панель инструментов для документов, которая включает:\n"
" * Новые файлы (список)\n"
" * Файлы по типу (график)\n"
" * Файлы по партнерам (график)\n"
" * Размеры файлов по месяцам (график)\n"
#. module: base
#: view:ir.actions.report.xml:0
@ -2918,6 +2983,40 @@ msgid ""
"* Monthly Turnover (Graph)\n"
" "
msgstr ""
"\n"
"Управление предложениями цен и заказами покупателей \n"
"==================================\n"
"\n"
"This application allows you to manage your sales goals in an effective and "
"efficient manner by keeping track of all sales orders and history.\n"
"\n"
"It handles the full sales workflow:\n"
"\n"
"* **Quotation** -> **Sales order** -> **Invoice**\n"
"\n"
"Preferences (only with Warehouse Management installed)\n"
"------------------------------------------------------\n"
"\n"
"If you also installed the Warehouse Management, you can deal with the "
"following preferences:\n"
"\n"
"* Shipping: Choice of delivery at once or partial delivery\n"
"* Invoicing: choose how invoices will be paid\n"
"* Incoterms: International Commercial terms\n"
"\n"
"You can choose flexible invoicing methods:\n"
"\n"
"* *On Demand*: Invoices are created manually from Sales Orders when needed\n"
"* *On Delivery Order*: Invoices are generated from picking (delivery)\n"
"* *Before Delivery*: A Draft invoice is created and must be paid before "
"delivery\n"
"\n"
"\n"
"The Dashboard for the Sales Manager will include\n"
"------------------------------------------------\n"
"* My Quotations\n"
"* Monthly Turnover (Graph)\n"
" "
#. module: base
#: field:ir.actions.act_window,res_id:0
@ -3020,6 +3119,14 @@ msgid ""
"This module is currently not compatible with the ``user_ldap`` module and\n"
"will disable LDAP authentication completely if installed at the same time.\n"
msgstr ""
"\n"
"Зашифрованные пароли\n"
"==================\n"
"\n"
"Взаимодействие с LDAP - авторизацией\n"
"-------------------------------------\n"
"This module is currently not compatible with the ``user_ldap`` module and\n"
"will disable LDAP authentication completely if installed at the same time.\n"
#. module: base
#: model:res.groups,name:base.group_hr_manager
@ -3205,6 +3312,15 @@ msgid ""
" * ``base_stage``: stage management\n"
" "
msgstr ""
"\n"
"Этот модуль обрабатывает состояния и стадии. Он является производным от "
"классов crm_base и crm_case для crm. \n"
"============================================================================="
"======================\n"
"\n"
" * ``base_state``: управление состояниями \n"
" * ``base_stage``: управление стадиями\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_linkedin
@ -7907,7 +8023,7 @@ msgstr "Следующее число в этой нумерации"
#. module: base
#: view:res.partner:0
msgid "at"
msgstr ""
msgstr "в"
#. module: base
#: view:ir.rule:0
@ -8227,7 +8343,7 @@ msgstr "Финансовый и аналитический учет"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_project
msgid "Portal Project"
msgstr ""
msgstr "Портал: проекты"
#. module: base
#: model:res.country,name:base.cc
@ -8519,7 +8635,7 @@ msgstr "Действия клиента"
#. module: base
#: field:res.partner.bank.type,field_ids:0
msgid "Type Fields"
msgstr ""
msgstr "Тип поля"
#. module: base
#: model:ir.module.module,summary:base.module_hr_recruitment
@ -8744,7 +8860,7 @@ msgstr "Гонконг"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_sale
msgid "Portal Sale"
msgstr ""
msgstr "Портал: продажи"
#. module: base
#: field:ir.default,ref_id:0

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:53+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:36+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:53+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:36+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:46+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:29+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:52+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:36+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:57+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:40+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:53+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:37+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:53+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:37+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:54+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:37+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:54+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:37+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:54+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:37+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:54+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:37+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:54+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:38+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:56+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:40+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -11642,7 +11642,7 @@ msgid ""
msgstr ""
"\n"
"模块提供事件变更警告。\n"
" ==============================================\n"
"==============================================\n"
"\n"
"Warning messages can be displayed for objects like sale order, purchase "
"order,\n"

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:54+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:38+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-11-02 05:56+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Launchpad-Export-Date: 2013-12-03 05:39+0000\n"
"X-Generator: Launchpad (build 16856)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -50,7 +50,7 @@ msgstr "日期時間"
msgid ""
"The second argument of the many2many field %s must be a SQL table !You used "
"%s, which is not a valid SQL table name."
msgstr "「多對多(many2many)」欄位 %s 之第二個引數須為 SQL 表格!您用了並非有效 SQL 表格名稱之 %s。"
msgstr "「多對多(many2many)」欄位 %s 之第二個引數須為 SQL 表格!您輸入的 %s 並非有效 SQL 表格名稱。"
#. module: base
#: field:ir.ui.view,arch:0
@ -61,7 +61,7 @@ msgstr "檢視架構"
#. module: base
#: model:ir.module.module,summary:base.module_sale_stock
msgid "Quotation, Sale Orders, Delivery & Invoicing Control"
msgstr "報價, 銷售訂單, 交貨及發票管理"
msgstr "報價單, 銷貨單, 發貨及發票管理"
#. module: base
#: selection:ir.sequence,implementation:0
@ -88,7 +88,7 @@ msgstr "幫助你管理專案,追蹤任務,生成計劃"
#. module: base
#: model:ir.module.module,summary:base.module_point_of_sale
msgid "Touchscreen Interface for Shops"
msgstr "店觸控螢幕界面"
msgstr "店面用觸控螢幕界面"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
@ -122,15 +122,15 @@ msgid ""
" "
msgstr ""
"\n"
"在產品表格中加入製造商及屬性之模組\n"
"此模組在產品表單中加入製造商及屬性\n"
"====================================================================\n"
"\n"
"您可以對一件產品做以下定義:\n"
"您可以對產品定義以下內容:\n"
"-----------------------------------------------\n"
" * 製造商\n"
" * 製造商的產品名稱\n"
" * 製造商的產品代碼\n"
" * 產品性\n"
" * 產品性\n"
" "
#. module: base
@ -145,11 +145,14 @@ msgid ""
"The module adds google user in res user.\n"
"========================================\n"
msgstr ""
"\n"
"此模組將 Google 使用者加到 res user 中。\n"
"========================================\n"
#. module: base
#: help:res.partner,employee:0
msgid "Check this box if this contact is an Employee."
msgstr "如果聯絡人是員工則請勾選"
msgstr "如果聯絡人是員工則請勾選此項"
#. module: base
#: help:ir.model.fields,domain:0
@ -232,7 +235,7 @@ msgstr "ir.ui.view.custom"
#: code:addons/base/ir/ir_model.py:374
#, python-format
msgid "Renaming sparse field \"%s\" is not allowed"
msgstr ""
msgstr "不允許重新命名稀疏欄位「%s」"
#. module: base
#: model:res.country,name:base.sz
@ -286,6 +289,12 @@ msgid ""
"\n"
" "
msgstr ""
"\n"
"智利會計科目及稅務在地化。\n"
"==============================================\n"
"Plan contable chileno e impuestos de acuerdo a disposiciones vigentes\n"
"\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale
@ -324,7 +333,7 @@ msgstr "最大尺寸"
msgid ""
"Database ID of record to open in form view, when ``view_mode`` is set to "
"'form' only"
msgstr ""
msgstr "當「檢視模式」僅設為「表單」時,將開啟的紀錄的資料庫 ID"
#. module: base
#: help:ir.values,key2:0
@ -389,7 +398,7 @@ msgstr ""
msgid ""
"There is already a shared filter set as default for %(model)s, delete or "
"change it before setting a new default"
msgstr ""
msgstr "已有一共享的過濾器被設為 %(model)s 的預設過濾器。要設定新的預設過濾器前,請先修改或刪除原有預設過濾器。"
#. module: base
#: code:addons/orm.py:2649
@ -465,7 +474,7 @@ msgstr "所指定為無效的日期/時間格式指示。請參照當您編寫
msgid ""
"One of the records you are trying to modify has already been deleted "
"(Document type: %s)."
msgstr ""
msgstr "您要修改的紀錄已被刪除(文件類型: %s"
#. module: base
#: help:ir.actions.act_window,views:0
@ -691,7 +700,7 @@ msgstr "自訂欄位名稱開頭必須是 'x_' !"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_mx
msgid "Mexico - Accounting"
msgstr ""
msgstr "墨西哥 - 會計"
#. module: base
#: help:ir.actions.server,action_id:0
@ -847,7 +856,7 @@ msgstr "自動化動作"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_ro
msgid "Romania - Accounting"
msgstr ""
msgstr "羅馬尼亞 - 會計"
#. module: base
#: model:ir.model,name:base.model_res_config_settings
@ -970,7 +979,7 @@ msgstr "報表類型,如 pdf, html, raw, sxw, odt, html2html, mako2html, ..."
#. module: base
#: model:ir.module.module,shortdesc:base.module_document_webdav
msgid "Shared Repositories (WebDAV)"
msgstr ""
msgstr "共享的儲存庫WebDAV"
#. module: base
#: view:res.users:0
@ -997,7 +1006,7 @@ msgstr "辛巴威"
#: help:ir.model.constraint,type:0
msgid ""
"Type of the constraint: `f` for a foreign key, `u` for other constraints."
msgstr ""
msgstr "限制條件類型「f」為 foreign key 「u」代表其他限制條件。"
#. module: base
#: view:ir.actions.report.xml:0
@ -1092,7 +1101,7 @@ msgstr "請求參考類型"
#. module: base
#: model:ir.module.module,shortdesc:base.module_google_base_account
msgid "Google Users"
msgstr ""
msgstr "Google 使用者"
#. module: base
#: model:ir.module.module,shortdesc:base.module_fleet
@ -1260,6 +1269,8 @@ msgid ""
"Language with code \"%s\" is not defined in your system !\n"
"Define it through the Administration menu."
msgstr ""
"您的系統中尚未定義語言代碼為「 %s 」的語言! \n"
"請於管理者介面中定義。"
#. module: base
#: model:res.country,name:base.gu
@ -1269,7 +1280,7 @@ msgstr "關島(美屬)"
#. module: base
#: sql_constraint:res.country:0
msgid "The name of the country must be unique !"
msgstr ""
msgstr "國家名稱必須為獨一無二的!"
#. module: base
#: field:ir.module.module,installed_version:0
@ -1406,7 +1417,7 @@ msgid ""
"suitable\n"
" for uploading to OpenERP's translation "
"platform,"
msgstr ""
msgstr "TGZ 格式:這是含有 PO 格式檔案的壓縮檔,適用於直接上傳至 OpenERP 的翻譯平台。"
#. module: base
#: view:res.lang:0
@ -1430,7 +1441,7 @@ msgstr "測試"
#. module: base
#: field:ir.actions.report.xml,attachment:0
msgid "Save as Attachment Prefix"
msgstr ""
msgstr "另存附件檔案的前綴字元"
#. module: base
#: field:ir.ui.view_sc,res_id:0
@ -1467,7 +1478,7 @@ msgstr "海地"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_fr_hr_payroll
msgid "French Payroll"
msgstr ""
msgstr "法國薪資"
#. module: base
#: view:ir.ui.view:0
@ -1506,12 +1517,12 @@ msgstr "操作取消"
#. module: base
#: model:ir.module.module,shortdesc:base.module_document
msgid "Document Management System"
msgstr ""
msgstr "文件管理系統"
#. module: base
#: model:ir.module.module,shortdesc:base.module_crm_claim
msgid "Claims Management"
msgstr ""
msgstr "申訴管理"
#. module: base
#: model:ir.module.module,description:base.module_document_webdav
@ -13105,7 +13116,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_be_hr_payroll_account
msgid "Belgium - Payroll with Accounting"
msgstr ""
msgstr "比利時 - 薪資(含會計)"
#. module: base
#: selection:base.language.export,format:0

View File

@ -37,6 +37,7 @@ import ir_config_parameter
import osv_memory_autovacuum
import ir_mail_server
import ir_fields
import ir_http
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -2,7 +2,7 @@
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2011 OpenERP S.A. <http://www.openerp.com>
# Copyright (C) 2004-2013 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
@ -801,7 +801,7 @@ class ir_actions_server(osv.osv):
raise osv.except_osv(_('Error'), _("Please specify an action to launch!"))
return self.pool[action.action_id.type].read(cr, uid, action.action_id.id, context=context)
def run_action_code(self, cr, uid, action, eval_context=None, context=None):
def run_action_code_multi(self, cr, uid, action, eval_context=None, context=None):
eval(action.code.strip(), eval_context, mode="exec", nocopy=True) # nocopy allows to return 'action'
if 'action' in eval_context:
return eval_context['action']
@ -933,38 +933,50 @@ class ir_actions_server(osv.osv):
context = {}
res = False
user = self.pool.get('res.users').browse(cr, uid, uid)
active_ids = context.get('active_ids', [context.get('active_id', None)])
active_ids = context.get('active_ids', [context.get('active_id')])
for action in self.browse(cr, uid, ids, context):
obj = None
obj_pool = self.pool[action.model_id.model]
for active_id in active_ids:
if context.get('active_model') == action.model_id.model and active_id:
obj = obj_pool.browse(cr, uid, context['active_id'], context=context)
# run context dedicated to a particular active_id
run_context = dict(context, active_ids=[active_id], active_id=active_id)
# evaluation context for python strings to evaluate
eval_context = {
'self': obj_pool,
'object': obj,
'obj': obj,
'pool': self.pool,
'time': time,
'cr': cr,
'context': dict(run_context), # copy context to prevent side-effects of eval
'uid': uid,
'user': user
}
obj = None
if context.get('active_model') == action.model_id.model and context.get('active_id'):
obj = obj_pool.browse(cr, uid, context['active_id'], context=context)
# evaluate the condition, with the specific case that a void (aka False) condition is considered as True
condition = action.condition
if action.condition is False:
condition = True
# evaluation context for python strings to evaluate
eval_context = {
'self': obj_pool,
'object': obj,
'obj': obj,
'pool': self.pool,
'time': time,
'cr': cr,
'uid': uid,
'user': user,
}
condition = action.condition
if condition is False:
# Void (aka False) conditions are considered as True
condition = True
if hasattr(self, 'run_action_%s_multi' % action.state):
# set active_ids in context only needed if one active_id
run_context = dict(context, active_ids=active_ids)
eval_context["context"] = run_context
expr = eval(str(condition), eval_context)
if not expr:
continue
# call the method related to the action: run_action_<STATE>
if hasattr(self, 'run_action_%s' % action.state):
res = getattr(self, 'run_action_%s' % action.state)(cr, uid, action, eval_context=eval_context, context=run_context)
# call the multi method
func = getattr(self, 'run_action_%s_multi' % action.state)
res = func(cr, uid, action, eval_context=eval_context, context=run_context)
elif hasattr(self, 'run_action_%s' % action.state):
func = getattr(self, 'run_action_%s' % action.state)
for active_id in active_ids:
# run context dedicated to a particular active_id
run_context = dict(context, active_ids=[active_id], active_id=active_id)
eval_context["context"] = run_context
expr = eval(str(condition), eval_context)
if not expr:
continue
# call the single method related to the action: run_action_<STATE>
res = func(cr, uid, action, eval_context=eval_context, context=run_context)
return res

View File

@ -476,7 +476,8 @@
<field name="model_id"/>
<field name="state"/>
<group expand="0" string="Group By" colspan="4" col="4">
<filter string="Action Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'state'}"/>
<filter string="Action Type" domain="[]" context="{'group_by':'state'}"/>
<filter string="Model" domain="[]" context="{'group_by':'model_id'}"/>
</group>
</search>
</field>

View File

@ -198,7 +198,7 @@ class ir_attachment(osv.osv):
continue
res_ids.setdefault(rmod,set()).add(rid)
if values:
if values.get('res_model') and 'res_id' in values:
if values.get('res_model') and values.get('res_id'):
res_ids.setdefault(values['res_model'],set()).add(values['res_id'])
ima = self.pool.get('ir.model.access')

View File

@ -253,7 +253,7 @@ class ir_fields_converter(orm.Model):
if not isinstance(selection, (tuple, list)):
# FIXME: Don't pass context to avoid translations?
# Or just copy context & remove lang?
selection = selection(model, cr, uid)
selection = selection(model, cr, uid, context=None)
for item, label in selection:
labels = self._get_translations(
cr, uid, ('selection', 'model', 'code'), label, context=context)

View File

@ -0,0 +1,171 @@
#----------------------------------------------------------
# ir_http modular http routing
#----------------------------------------------------------
import logging
import re
import sys
import werkzeug.exceptions
import werkzeug.routing
import openerp
from openerp import http
from openerp.http import request
from openerp.osv import osv, orm
_logger = logging.getLogger(__name__)
# FIXME: replace by proxy on request.uid?
_uid = object()
class ModelConverter(werkzeug.routing.BaseConverter):
def __init__(self, url_map, model=False):
super(ModelConverter, self).__init__(url_map)
self.model = model
self.regex = '([0-9]+)'
def to_python(self, value):
m = re.match(self.regex, value)
return request.registry[self.model].browse(
request.cr, _uid, int(m.group(1)), context=request.context)
def to_url(self, value):
return value.id
class ModelsConverter(werkzeug.routing.BaseConverter):
def __init__(self, url_map, model=False):
super(ModelsConverter, self).__init__(url_map)
self.model = model
# TODO add support for slug in the form [A-Za-z0-9-] bla-bla-89 -> id 89
self.regex = '([0-9,]+)'
def to_python(self, value):
# TODO:
# - raise routing.ValidationError() if no browse record can be createdm
# - support slug
return request.registry[self.model].browse(request.cr, _uid, [int(i) for i in value.split(',')], context=request.context)
def to_url(self, value):
return ",".join(i.id for i in value)
class ir_http(osv.AbstractModel):
_name = 'ir.http'
_description = "HTTP routing"
def _get_converters(self):
return {'model': ModelConverter, 'models': ModelsConverter}
def _find_handler(self):
return self.routing_map().bind_to_environ(request.httprequest.environ).match()
def _auth_method_user(self):
request.uid = request.session.uid
if not request.uid:
raise http.SessionExpiredException("Session expired")
def _auth_method_admin(self):
if not request.db:
raise http.SessionExpiredException("No valid database for request %s" % request.httprequest)
request.uid = openerp.SUPERUSER_ID
def _auth_method_none(self):
request.disable_db = True
request.uid = None
def _authenticate(self, auth_method='user'):
if request.session.uid:
try:
request.session.check_security()
# what if error in security.check()
# -> res_users.check()
# -> res_users.check_credentials()
except Exception:
request.session.logout()
getattr(self, "_auth_method_%s" % auth_method)()
return auth_method
def _handle_exception(self, exception):
if isinstance(exception, openerp.exceptions.AccessError):
code = 403
else:
code = getattr(exception, 'code', 500)
fn = getattr(self, '_handle_%d' % code, self._handle_unknown_exception)
return fn(exception)
def _handle_unknown_exception(self, exception):
raise exception
def _dispatch(self):
# locate the controller method
try:
func, arguments = self._find_handler()
except werkzeug.exceptions.NotFound, e:
return self._handle_exception(e)
# check authentication level
try:
auth_method = self._authenticate(getattr(func, "auth", None))
except Exception:
# force a Forbidden exception with the original traceback
return self._handle_exception(
convert_exception_to(
werkzeug.exceptions.Forbidden))
# post process arg to set uid on browse records
for arg in arguments.itervalues():
if isinstance(arg, orm.browse_record) and arg._uid is _uid:
arg._uid = request.uid
# set and execute handler
try:
request.set_handler(func, arguments, auth_method)
result = request.dispatch()
if isinstance(result, Exception):
raise result
except Exception, e:
return self._handle_exception(e)
return result
def routing_map(self):
if not hasattr(self, '_routing_map'):
_logger.info("Generating routing map")
cr = request.cr
m = request.registry.get('ir.module.module')
ids = m.search(cr, openerp.SUPERUSER_ID, [('state', '=', 'installed'), ('name', '!=', 'web')], context=request.context)
installed = set(x['name'] for x in m.read(cr, 1, ids, ['name'], context=request.context))
mods = ['', "web"] + sorted(installed)
self._routing_map = http.routing_map(mods, False, converters=self._get_converters())
return self._routing_map
def convert_exception_to(to_type, with_message=False):
""" Should only be called from an exception handler. Fetches the current
exception data from sys.exc_info() and creates a new exception of type
``to_type`` with the original traceback.
If ``with_message`` is ``True``, sets the new exception's message to be
the stringification of the original exception. If ``False``, does not
set the new exception's message. Otherwise, uses ``with_message`` as the
new exception's message.
:type with_message: str|bool
"""
etype, original, tb = sys.exc_info()
try:
if with_message is False:
message = None
elif with_message is True:
message = str(original)
else:
message = str(with_message)
raise to_type, message, tb
except to_type, e:
return e
# vim:et:

View File

@ -96,8 +96,8 @@ class ir_model(osv.osv):
return res
_columns = {
'name': fields.char('Model Description', size=64, translate=True, required=True),
'model': fields.char('Model', size=64, required=True, select=1),
'name': fields.char('Model Description', translate=True, required=True),
'model': fields.char('Model', required=True, select=1),
'info': fields.text('Information'),
'field_id': fields.one2many('ir.model.fields', 'model_id', 'Fields', required=True),
'state': fields.selection([('manual','Custom Object'),('base','Base Object')],'Type',readonly=True),
@ -105,7 +105,7 @@ class ir_model(osv.osv):
'osv_memory': fields.function(_is_osv_memory, string='Transient Model', type='boolean',
fnct_search=_search_osv_memory,
help="This field specifies whether the model is transient or not (i.e. if records are automatically deleted from the database or not)"),
'modules': fields.function(_in_modules, type='char', size=128, string='In Modules', help='List of modules in which the object is defined or inherited'),
'modules': fields.function(_in_modules, type='char', string='In Modules', help='List of modules in which the object is defined or inherited'),
'view_ids': fields.function(_view_ids, type='one2many', obj='ir.ui.view', string='Views'),
}
@ -223,19 +223,19 @@ class ir_model_fields(osv.osv):
_rec_name = 'field_description'
_columns = {
'name': fields.char('Name', required=True, size=64, select=1),
'complete_name': fields.char('Complete Name', size=64, select=1),
'model': fields.char('Object Name', size=64, required=True, select=1,
'name': fields.char('Name', required=True, select=1),
'complete_name': fields.char('Complete Name', select=1),
'model': fields.char('Object Name', required=True, select=1,
help="The technical name of the model this field belongs to"),
'relation': fields.char('Object Relation', size=64,
'relation': fields.char('Object Relation',
help="For relationship fields, the technical name of the target model"),
'relation_field': fields.char('Relation Field', size=64,
'relation_field': fields.char('Relation Field',
help="For one2many fields, the field on the target model that implement the opposite many2one relationship"),
'model_id': fields.many2one('ir.model', 'Model', required=True, select=True, ondelete='cascade',
help="The model this field belongs to"),
'field_description': fields.char('Field Label', required=True, size=256),
'ttype': fields.selection(_get_fields_type, 'Field Type',size=64, required=True),
'selection': fields.char('Selection Options',size=128, help="List of options for a selection field, "
'field_description': fields.char('Field Label', required=True),
'ttype': fields.selection(_get_fields_type, 'Field Type', required=True),
'selection': fields.char('Selection Options', help="List of options for a selection field, "
"specified as a Python expression defining a list of (key, label) pairs. "
"For example: [('blue','Blue'),('yellow','Yellow')]"),
'required': fields.boolean('Required'),
@ -245,12 +245,12 @@ class ir_model_fields(osv.osv):
'size': fields.integer('Size'),
'state': fields.selection([('manual','Custom Field'),('base','Base Field')],'Type', required=True, readonly=True, select=1),
'on_delete': fields.selection([('cascade','Cascade'),('set null','Set NULL')], 'On Delete', help='On delete property for many2one fields'),
'domain': fields.char('Domain', size=256, help="The optional domain to restrict possible values for relationship fields, "
'domain': fields.char('Domain', help="The optional domain to restrict possible values for relationship fields, "
"specified as a Python expression defining a list of triplets. "
"For example: [('color','=','red')]"),
'groups': fields.many2many('res.groups', 'ir_model_fields_group_rel', 'field_id', 'group_id', 'Groups'),
'selectable': fields.boolean('Selectable'),
'modules': fields.function(_in_modules, type='char', size=128, string='In Modules', help='List of modules in which the field is defined'),
'modules': fields.function(_in_modules, type='char', string='In Modules', help='List of modules in which the field is defined'),
'serialization_field_id': fields.many2one('ir.model.fields', 'Serialization Field', domain = "[('ttype','=','serialized')]",
ondelete='cascade', help="If set, this field will be stored in the sparse "
"structure of the serialization field, instead "
@ -483,7 +483,7 @@ class ir_model_constraint(Model):
"""
_name = 'ir.model.constraint'
_columns = {
'name': fields.char('Constraint', required=True, size=128, select=1,
'name': fields.char('Constraint', required=True, select=1,
help="PostgreSQL constraint or foreign key name."),
'model': fields.many2one('ir.model', string='Model',
required=True, select=1),
@ -552,7 +552,7 @@ class ir_model_relation(Model):
"""
_name = 'ir.model.relation'
_columns = {
'name': fields.char('Relation Name', required=True, size=128, select=1,
'name': fields.char('Relation Name', required=True, select=1,
help="PostgreSQL table name implementing a many2many relation."),
'model': fields.many2one('ir.model', string='Model',
required=True, select=1),
@ -601,7 +601,7 @@ class ir_model_relation(Model):
class ir_model_access(osv.osv):
_name = 'ir.model.access'
_columns = {
'name': fields.char('Name', size=64, required=True, select=True),
'name': fields.char('Name', required=True, select=True),
'active': fields.boolean('Active', help='If you uncheck the active field, it will disable the ACL without deleting it (if you delete a native ACL, it will be re-created when you reload the module.'),
'model_id': fields.many2one('ir.model', 'Object', required=True, domain=[('osv_memory','=', False)], select=True, ondelete='cascade'),
'group_id': fields.many2one('res.groups', 'Group', ondelete='cascade', select=True),
@ -815,13 +815,13 @@ class ir_model_data(osv.osv):
return result
_columns = {
'name': fields.char('External Identifier', required=True, size=128, select=1,
'name': fields.char('External Identifier', required=True, select=1,
help="External Key/Identifier that can be used for "
"data integration with third-party systems"),
'complete_name': fields.function(_complete_name_get, type='char', string='Complete ID'),
'display_name': fields.function(_display_name_get, type='char', string='Record Name'),
'model': fields.char('Model Name', required=True, size=64, select=1),
'module': fields.char('Module', required=True, size=64, select=1),
'model': fields.char('Model Name', required=True, select=1),
'module': fields.char('Module', required=True, select=1),
'res_id': fields.integer('Record ID', select=1,
help="ID of the target record in the database"),
'noupdate': fields.boolean('Non Updatable'),
@ -1128,7 +1128,7 @@ class ir_model_data(osv.osv):
return True
to_unlink = []
cr.execute("""SELECT id,name,model,res_id,module FROM ir_model_data
WHERE module IN %s AND res_id IS NOT NULL AND noupdate=%s""",
WHERE module IN %s AND res_id IS NOT NULL AND noupdate=%s ORDER BY id DESC""",
(tuple(modules), False))
for (id, name, model, res_id, module) in cr.fetchall():
if (module,name) not in self.loads:

View File

@ -182,7 +182,7 @@ class ir_translation(osv.osv):
if context is None:
context = {}
record = self.browse(cr, uid, id, context=context)
if value and record.type == 'model':
if record.type == 'model':
model_name, field = record.name.split(',')
model = self.pool.get(model_name)
#We need to take the context without the language information, because we want to write on the

View File

@ -5,9 +5,9 @@
<!--logo-->
<fill color="black"/>
<stroke color="black"/>
<setFont name="DejaVu Sans" size="8"/>
<setFont name="DejaVuSans" size="8"/>
<drawString x="1.3cm" y="19.5cm"><xsl:value-of select="//header-date"/></drawString>
<setFont name="DejaVu Sans Bold" size="10"/>
<setFont name="DejaVuSans-Bold" size="10"/>
<drawString x="13.8cm" y="19.5cm"><xsl:value-of select="//company"/></drawString>
<stroke color="#000000"/>
<lines size="8">1.3cm 19.3cm 28.5cm 19.3cm</lines>

View File

@ -27,7 +27,6 @@ from openerp.osv import fields, osv
from openerp.tools.translate import _
from openerp.tools.safe_eval import safe_eval as eval
from openerp.tools import image_resize_image
from openerp.report.render.rml2pdf import customfonts
class multi_company_default(osv.osv):
"""
@ -183,17 +182,20 @@ class res_company(osv.osv):
def onchange_font_name(self, cr, uid, ids, font, rml_header, rml_header2, rml_header3, context=None):
""" To change default header style of all <para> and drawstring. """
def _change_header(header,font):
""" Replace default fontname use in header and setfont tag """
default_para = re.sub('fontName.?=.?".*"', 'fontName="%s"'% font,header)
return re.sub('(<setFont.?name.?=.?)(".*?")(.)', '\g<1>"%s"\g<3>'% font,default_para)
default_para = re.sub('fontName.?=.?".*"', 'fontName="%s"'% font, header)
return re.sub('(<setFont.?name.?=.?)(".*?")(.)', '\g<1>"%s"\g<3>'% font, default_para)
if not font:
return True
fontname = self.pool.get('res.font').browse(cr, uid, font, context=context).name
return {'value':{
'rml_header': _change_header(rml_header,fontname),
'rml_header2':_change_header(rml_header2,fontname),
'rml_header3':_change_header(rml_header3,fontname)
'rml_header': _change_header(rml_header, fontname),
'rml_header2':_change_header(rml_header2, fontname),
'rml_header3':_change_header(rml_header3, fontname)
}}
def on_change_country(self, cr, uid, ids, country_id, context=None):
@ -294,12 +296,8 @@ class res_company(osv.osv):
def _get_font(self, cr, uid, ids):
font_obj = self.pool.get('res.font')
res = font_obj.search(cr, uid, [('name', '=', 'Helvetica')], limit=1)
if res:
return res[0]
font_obj.init_no_scan(cr, uid)
return font_obj.search(cr, uid, [('name', '=', 'Helvetica')], limit=1)[0]
res = font_obj.search(cr, uid, [('family', '=', 'Helvetica'), ('mode', '=', 'all')], limit=1)
return res and res[0] or False
_header = """
<header>
@ -307,20 +305,20 @@ class res_company(osv.osv):
<frame id="first" x1="28.0" y1="28.0" width="%s" height="%s"/>
<stylesheet>
<!-- Set here the default font to use for all <para> tags -->
<paraStyle name='Normal' fontName="DejaVu Sans"/>
<paraStyle name='Normal' fontName="DejaVuSans"/>
</stylesheet>
<pageGraphics>
<fill color="black"/>
<stroke color="black"/>
<setFont name="DejaVu Sans" size="8"/>
<setFont name="DejaVuSans" size="8"/>
<drawString x="%s" y="%s"> [[ formatLang(time.strftime("%%Y-%%m-%%d"), date=True) ]] [[ time.strftime("%%H:%%M") ]]</drawString>
<setFont name="DejaVu Sans Bold" size="10"/>
<setFont name="DejaVuSans-Bold" size="10"/>
<drawCentredString x="%s" y="%s">[[ company.partner_id.name ]]</drawCentredString>
<stroke color="#000000"/>
<lines>%s</lines>
<!-- Set here the default font to use for all <drawString> tags -->
<!-- don't forget to change the 2 other occurence of <setFont> above if needed -->
<setFont name="DejaVu Sans" size="8"/>
<setFont name="DejaVuSans" size="8"/>
</pageGraphics>
</pageTemplate>
</header>"""
@ -345,13 +343,13 @@ class res_company(osv.osv):
<frame id="first" x1="1.3cm" y1="3.0cm" height="%s" width="19.0cm"/>
<stylesheet>
<!-- Set here the default font to use for all <para> tags -->
<paraStyle name='Normal' fontName="DejaVu Sans"/>
<paraStyle name='Normal' fontName="DejaVuSans"/>
<paraStyle name="main_footer" fontSize="8.0" alignment="CENTER"/>
<paraStyle name="main_header" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
</stylesheet>
<pageGraphics>
<!-- Set here the default font to use for all <drawString> tags -->
<setFont name="DejaVu Sans" size="8"/>
<setFont name="DejaVuSans" size="8"/>
<!-- You Logo - Change X,Y,Width and Height -->
<image x="1.3cm" y="%s" height="40.0" >[[ company.logo or removeParentNode('image') ]]</image>
<fill color="black"/>
@ -396,7 +394,7 @@ class res_company(osv.osv):
return {'value': {'rml_header': self._header_a4}}
def act_discover_fonts(self, cr, uid, ids, context=None):
return self.pool.get("res.font").discover_fonts(cr, uid, ids, context)
return self.pool.get("res.font").font_scan(cr, uid, context=context)
_defaults = {
'currency_id': _get_euro,

View File

@ -85,7 +85,7 @@
<label for="font" />
<div>
<div>
<field name="font" class="oe_inline" colspan="2"/>
<field name="font" class="oe_inline" colspan="2" on_change="onchange_font_name(font, rml_header, rml_header2, rml_header3)" domain="[('mode', 'in', ('normal', 'regular', 'all', 'book'))]" />
<button string="(reload fonts)" name="act_discover_fonts" type="object" class="oe_link" colspan="1"/>
</div>
</div>

View File

@ -492,15 +492,19 @@ class res_config_settings(osv.osv_memory, res_config_module_installation_mixin):
return res
def execute(self, cr, uid, ids, context=None):
if uid != SUPERUSER_ID and not self.pool['res.users'].has_group(cr, uid, 'base.group_erp_manager'):
raise openerp.exceptions.AccessError(_("Only administrators can change the settings"))
ir_values = self.pool['ir.values']
ir_module = self.pool['ir.module.module']
classified = self._get_classified_fields(cr, uid, context)
config = self.browse(cr, uid, ids[0], context)
# default values fields
for name, model, field in classified['default']:
ir_values.set_default(cr, uid, model, field, config[name])
ir_values.set_default(cr, SUPERUSER_ID, model, field, config[name])
# group fields: modify group / implied groups
for name, group, implied_group in classified['group']:

View File

@ -1212,7 +1212,7 @@
<record id="ve" model="res.country">
<field name="name">Venezuela</field>
<field name="code">ve</field>
<field name="currency_id" ref="VUB"/>
<field name="currency_id" ref="VEF"/>
</record>
<record id="vg" model="res.country">
<field name="name">Virgin Islands (British)</field>

View File

@ -1540,7 +1540,7 @@
</record>
<record id="VUB" model="res.currency">
<field name="name">VUB</field>
<field name="name">VEB</field>
<field name="symbol">Bs</field>
<field name="rounding">0.01</field>
<field name="accuracy">4</field>

View File

@ -2,7 +2,7 @@
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
# Copyright (C) 2013 OpenERP SA (<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
@ -20,6 +20,7 @@
##############################################################################
from reportlab.pdfbase import ttfonts
from openerp.modules.registry import RegistryManager
from openerp.osv import fields, osv
from openerp.report.render.rml2pdf import customfonts
@ -40,57 +41,75 @@ _logger = logging.getLogger(__name__)
class res_font(osv.Model):
_name = "res.font"
_description = 'Fonts available'
_order = 'name'
_order = 'family,name,id'
_rec_name = 'family'
_columns = {
'name': fields.char("Name", required=True),
'family': fields.char("Font family", required=True),
'name': fields.char("Font Name", required=True),
'path': fields.char("Path", required=True),
'mode': fields.char("Mode", required=True),
}
_sql_constraints = [
('name_font_uniq', 'unique(name)', 'You can not register two fonts with the same name'),
('name_font_uniq', 'unique(family, name)', 'You can not register two fonts with the same name'),
]
def discover_fonts(self, cr, uid, ids, context=None):
"""Scan fonts on the file system, add them to the list of known fonts
and create font object for the new ones"""
customfonts.CustomTTFonts = customfonts.BaseCustomTTFonts
def font_scan(self, cr, uid, lazy=False, context=None):
"""Action of loading fonts
In lazy mode will scan the filesystem only if there is no founts in the database and sync if no font in CustomTTFonts
In not lazy mode will force scan filesystem and sync
"""
if lazy:
# lazy loading, scan only if no fonts in db
found_fonts_ids = self.search(cr, uid, [('path', '!=', '/dev/null')], context=context)
if not found_fonts_ids:
# no scan yet or no font found on the system, scan the filesystem
self._scan_disk(cr, uid, context=context)
elif len(customfonts.CustomTTFonts) == 0:
# CustomTTFonts list is empty
self._sync(cr, uid, context=context)
else:
self._scan_disk(cr, uid, context=context)
return True
found_fonts = {}
def _scan_disk(self, cr, uid, context=None):
"""Scan the file system and register the result in database"""
found_fonts = []
for font_path in customfonts.list_all_sysfonts():
try:
font = ttfonts.TTFontFile(font_path)
_logger.debug("Found font %s at %s", font.name, font_path)
if not found_fonts.get(font.familyName):
found_fonts[font.familyName] = {'name': font.familyName}
mode = font.styleName.lower().replace(" ", "")
customfonts.CustomTTFonts.append((font.familyName, font.name, font_path, mode))
found_fonts.append((font.familyName, font.name, font_path, font.styleName))
except ttfonts.TTFError:
_logger.warning("Could not register Font %s", font_path)
# add default PDF fonts
for family in customfonts.BasePDFFonts:
if not found_fonts.get(family):
found_fonts[family] = {'name': family}
for family, name, path, mode in found_fonts:
if not self.search(cr, uid, [('family', '=', family), ('name', '=', name)], context=context):
self.create(cr, uid, {
'family': family, 'name': name,
'path': path, 'mode': mode,
}, context=context)
# remove deleted fonts
existing_font_ids = self.search(cr, uid, [], context=context)
existing_font_names = []
for font in self.browse(cr, uid, existing_font_ids):
existing_font_names.append(font.name)
if font.name not in found_fonts.keys():
self.unlink(cr, uid, font.id, context=context)
# remove fonts not present on the disk anymore
existing_font_names = [name for (family, name, path, mode) in found_fonts]
inexistant_fonts = self.search(cr, uid, [('name', 'not in', existing_font_names), ('path', '!=', '/dev/null')], context=context)
if inexistant_fonts:
self.unlink(cr, uid, inexistant_fonts, context=context)
# add unknown fonts
for family, vals in found_fonts.items():
if family not in existing_font_names:
self.create(cr, uid, vals, context=context)
RegistryManager.signal_caches_change(cr.dbname)
self._sync(cr, uid, context=context)
return True
def init_no_scan(self, cr, uid, context=None):
"""Add demo data for PDF fonts without scan (faster for db creation)"""
for font in customfonts.BasePDFFonts:
if not self.search(cr, uid, [('name', '=', font)], context=context):
self.create(cr, uid, {'name':font}, context=context)
return True
def _sync(self, cr, uid, context=None):
"""Set the customfonts.CustomTTFonts list to the content of the database"""
customfonts.CustomTTFonts = []
found_fonts_ids = self.search(cr, uid, [('path', '!=', '/dev/null')], context=context)
for font in self.browse(cr, uid, found_fonts_ids, context=None):
customfonts.CustomTTFonts.append((font.family, font.name, font.path, font.mode))
return True
def clear_caches(self):
"""Force worker to resync at next report loading by setting an empty font list"""
customfonts.CustomTTFonts = []
return super(res_font, self).clear_caches()

View File

@ -329,7 +329,7 @@
<field name="arch" type="xml">
<search string="Search Partner">
<field name="name"
filter_domain="['|','|',('display_name','ilike',self),('ref','=',self),('email,'ilike',self)]"/>
filter_domain="['|','|',('display_name','ilike',self),('ref','=',self),('email','ilike',self)]"/>
<filter help="My Partners" icon="terp-personal+" domain="[('user_id','=',uid)]"/>
<separator/>
<filter string="Persons" name="type_person" domain="[('is_company','=',0)]"/>

View File

@ -169,7 +169,8 @@ class res_users(osv.osv):
}
def on_change_login(self, cr, uid, ids, login, context=None):
return {'value': {'email': login}}
v = {'email': login} if tools.single_email_re.match(login) else {}
return {'value': v}
def onchange_state(self, cr, uid, ids, state_id, context=None):
partner_ids = [user.partner_id.id for user in self.browse(cr, uid, ids, context=context)]
@ -762,7 +763,6 @@ class users_view(osv.osv):
def create(self, cr, uid, values, context=None):
self._set_reified_groups(values)
return super(users_view, self).create(cr, uid, values, context)
def write(self, cr, uid, ids, values, context=None):
@ -811,7 +811,7 @@ class users_view(osv.osv):
if len(group_split) != 2:
raise osv.except_osv(_('Invalid context value'), _('Invalid context default_groups_ref value (model.name_id) : "%s"') % group_xml_id)
try:
temp, group_id = ir_model_data.get_object_reference(cr, uid, group_split[0], group_split[1])
temp, group_id = ir_model_data.get_object_reference(cr, uid, group_split[0], group_split[1])
except ValueError:
group_id = False
groups += [group_id]
@ -819,14 +819,19 @@ class users_view(osv.osv):
return values
def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):
if not fields:
fields = self.fields_get(cr, uid, context=context).keys()
group_fields, fields = partition(is_reified_group, fields)
if not 'groups_id' in fields:
fields_get = fields if fields is not None else self.fields_get(cr, uid, context=context).keys()
group_fields, _ = partition(is_reified_group, fields_get)
inject_groups_id = group_fields and fields and 'groups_id' not in fields
if inject_groups_id:
fields.append('groups_id')
res = super(users_view, self).read(cr, uid, ids, fields, context=context, load=load)
for values in (res if isinstance(res, list) else [res]):
self._get_reified_groups(group_fields, values)
if group_fields:
for values in (res if isinstance(res, list) else [res]):
self._get_reified_groups(group_fields, values)
if inject_groups_id:
values.pop('groups_id', None)
return res
def _get_reified_groups(self, fields, values):

View File

@ -43,6 +43,8 @@
"access_ir_values_group_all","ir_values group_all","model_ir_values",,1,1,1,1
"access_res_company_group_erp_manager","res_company group_erp_manager","model_res_company","group_erp_manager",1,1,1,1
"access_res_company_group_user","res_company group_user","model_res_company",,1,0,0,0
"access_res_font_group_erp_manager","res_font group_erp_manager","model_res_font","group_erp_manager",1,1,1,1
"access_res_font_group_all","res_font group_all","model_res_font",,1,0,0,0
"access_res_country_group_all","res_country group_user_all","model_res_country",,1,0,0,0
"access_res_country_state_group_all","res_country_state group_user_all","model_res_country_state",,1,0,0,0
"access_res_country_group_user","res_country group_user","model_res_country","group_partner_manager",1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
43 access_ir_values_group_all ir_values group_all model_ir_values 1 1 1 1
44 access_res_company_group_erp_manager res_company group_erp_manager model_res_company group_erp_manager 1 1 1 1
45 access_res_company_group_user res_company group_user model_res_company 1 0 0 0
46 access_res_font_group_erp_manager res_font group_erp_manager model_res_font group_erp_manager 1 1 1 1
47 access_res_font_group_all res_font group_all model_res_font 1 0 0 0
48 access_res_country_group_all res_country group_user_all model_res_country 1 0 0 0
49 access_res_country_state_group_all res_country_state group_user_all model_res_country_state 1 0 0 0
50 access_res_country_group_user res_country group_user model_res_country group_partner_manager 1 1 1 1

View File

@ -304,5 +304,47 @@ class test_partner_recursion(common.TransactionCase):
cr, uid, p1, p2, p3 = self.cr, self.uid, self.p1, self.p2, self.p3
self.assertTrue(self.res_partner.write(cr, uid, [p1,p2,p3], {'phone': '123456'}))
class test_translation(common.TransactionCase):
def setUp(self):
super(test_translation, self).setUp()
self.res_category = self.registry('res.partner.category')
self.ir_translation = self.registry('ir.translation')
cr, uid = self.cr, self.uid
self.registry('ir.translation').load(cr, ['base'], ['fr_FR'])
self.cat_id = self.res_category.create(cr, uid, {'name': 'Customers'})
self.ir_translation.create(cr, uid, {'name': 'res.partner.category,name', 'module':'base',
'value': 'Clients', 'res_id': self.cat_id, 'lang':'fr_FR', 'state':'translated', 'type': 'model'})
def test_101_create_translated_record(self):
cr, uid = self.cr, self.uid
no_context_cat = self.res_category.browse(cr, uid, self.cat_id)
self.assertEqual(no_context_cat.name, 'Customers', "Error in basic name_get")
fr_context_cat = self.res_category.browse(cr, uid, self.cat_id, context={'lang':'fr_FR'})
self.assertEqual(fr_context_cat.name, 'Clients', "Translation not found")
def test_102_duplicate_record(self):
cr, uid = self.cr, self.uid
self.new_cat_id = self.res_category.copy(cr, uid, self.cat_id, context={'lang':'fr_FR'})
no_context_cat = self.res_category.browse(cr, uid, self.new_cat_id)
self.assertEqual(no_context_cat.name, 'Customers', "Duplication did not set untranslated value")
fr_context_cat = self.res_category.browse(cr, uid, self.new_cat_id, context={'lang':'fr_FR'})
self.assertEqual(fr_context_cat.name, 'Clients', "Did not found translation for initial value")
def test_103_duplicate_record_fr(self):
cr, uid = self.cr, self.uid
self.new_fr_cat_id = self.res_category.copy(cr, uid, self.cat_id, default={'name': 'Clients (copie)'}, context={'lang':'fr_FR'})
no_context_cat = self.res_category.browse(cr, uid, self.new_fr_cat_id)
self.assertEqual(no_context_cat.name, 'Customers', "Duplication erased original untranslated value")
fr_context_cat = self.res_category.browse(cr, uid, self.new_fr_cat_id, context={'lang':'fr_FR'})
self.assertEqual(fr_context_cat.name, 'Clients (copie)', "Did not used default value for translated value")
if __name__ == '__main__':
unittest2.main()

View File

@ -40,6 +40,19 @@ class test_views(common.TransactionCase):
""",
})
def test_20_remove_unexisting_attribute(self):
Views = self.registry('ir.ui.view')
Views.create(self.cr, self.uid, {
'name': 'Test View',
'model': 'ir.ui.view',
'inherit_id': self.browse_ref('base.view_view_tree').id,
'arch': """<?xml version="1.0"?>
<xpath expr="//field[@name='name']" position="attributes">
<attribute name="non_existing_attribute"></attribute>
</xpath>
""",
})
def _insert_view(self, **kw):
"""Insert view into database via a query to passtrough validation"""
kw.pop('id', None)

View File

@ -94,11 +94,11 @@ def preload_registry(dbname):
""" Preload a registry, and start the cron."""
try:
update_module = True if openerp.tools.config['init'] or openerp.tools.config['update'] else False
openerp.modules.registry.RegistryManager.new(dbname, update_module=update_module)
registry = openerp.modules.registry.RegistryManager.new(dbname, update_module=update_module)
except Exception:
_logger.exception('Failed to initialize database `%s`.', dbname)
return False
return True
return registry._assertion_report.failures == 0
def run_test_file(dbname, test_file):
""" Preload a registry, possibly run a test file, and start the cron."""

View File

@ -3,7 +3,7 @@
# OpenERP HTTP layer
#----------------------------------------------------------
import ast
import cgi
import collections
import contextlib
import errno
import functools
@ -23,23 +23,32 @@ import urlparse
import warnings
import babel.core
import psycopg2
import simplejson
import werkzeug.contrib.sessions
import werkzeug.datastructures
import werkzeug.exceptions
import werkzeug.local
import werkzeug.routing
import werkzeug.wrappers
import werkzeug.wsgi
import werkzeug.routing as routing
import openerp
from openerp.service import security, model as service_model
from openerp.tools import config
_logger = logging.getLogger(__name__)
#----------------------------------------------------------
# RequestHandler
#----------------------------------------------------------
# Thread local global request object
_request_stack = werkzeug.local.LocalStack()
request = _request_stack()
"""
A global proxy that always redirect to the current request object.
"""
class WebRequest(object):
""" Parent class for all OpenERP Web request types, mostly deals with
initialization and setup of the request object (the dispatching itself has
@ -98,6 +107,7 @@ class WebRequest(object):
self.disable_db = False
self.uid = None
self.func = None
self.func_arguments = {}
self.auth_method = None
self._cr_cm = None
self._cr = None
@ -111,14 +121,6 @@ class WebRequest(object):
self.context = dict(self.session.context)
self.lang = self.context["lang"]
def _authenticate(self):
if self.session.uid:
try:
self.session.check_security()
except SessionExpiredException, e:
self.session.logout()
raise SessionExpiredException("Session expired for request %s" % self.httprequest)
auth_methods[self.auth_method]()
@property
def registry(self):
"""
@ -142,34 +144,59 @@ class WebRequest(object):
trying to access this property will raise an exception.
"""
# some magic to lazy create the cr
if not self._cr_cm:
self._cr_cm = self.registry.cursor()
self._cr = self._cr_cm.__enter__()
if not self._cr:
self._cr = self.registry.db.cursor()
return self._cr
def _call_function(self, *args, **kwargs):
self._authenticate()
try:
# ugly syntax only to get the __exit__ arguments to pass to self._cr
request = self
class with_obj(object):
def __enter__(self):
pass
def __exit__(self, *args):
if request._cr_cm:
request._cr_cm.__exit__(*args)
request._cr_cm = None
request._cr = None
def __enter__(self):
_request_stack.push(self)
return self
with with_obj():
if self.func_request_type != self._request_type:
raise Exception("%s, %s: Function declared as capable of handling request of type '%s' but called with a request of type '%s'" \
% (self.func, self.httprequest.path, self.func_request_type, self._request_type))
return self.func(*args, **kwargs)
finally:
# just to be sure no one tries to re-use the request
self.disable_db = True
self.uid = None
def __exit__(self, exc_type, exc_value, traceback):
_request_stack.pop()
if self._cr:
if exc_type is None:
self._cr.commit()
self._cr.close()
# just to be sure no one tries to re-use the request
self.disable_db = True
self.uid = None
def set_handler(self, func, arguments, auth):
# is this needed ?
arguments = dict((k, v) for k, v in arguments.iteritems()
if not k.startswith("_ignored_"))
self.func = func
self.func_request_type = func.exposed
self.func_arguments = arguments
self.auth_method = auth
def _call_function(self, *args, **kwargs):
request = self
if self.func_request_type != self._request_type:
raise Exception("%s, %s: Function declared as capable of handling request of type '%s' but called with a request of type '%s'" \
% (self.func, self.httprequest.path, self.func_request_type, self._request_type))
kwargs.update(self.func_arguments)
# Backward for 7.0
if getattr(self.func, '_first_arg_is_req', False):
args = (request,) + args
# Correct exception handling and concurency retry
@service_model.check
def checked_call(dbname, *a, **kw):
return self.func(*a, **kw)
# FIXME: code and rollback management could be cleaned
try:
if self.db:
return checked_call(self.db, *args, **kwargs)
return self.func(*args, **kwargs)
except Exception:
if self._cr:
self._cr.rollback()
raise
@property
def debug(self):
@ -180,27 +207,7 @@ class WebRequest(object):
warnings.warn('please use request.registry and request.cr directly', DeprecationWarning)
yield (self.registry, self.cr)
def auth_method_user():
request.uid = request.session.uid
if not request.uid:
raise SessionExpiredException("Session expired")
def auth_method_admin():
if not request.db:
raise SessionExpiredException("No valid database for request %s" % request.httprequest)
request.uid = openerp.SUPERUSER_ID
def auth_method_none():
request.disable_db = True
request.uid = None
auth_methods = {
"user": auth_method_user,
"admin": auth_method_admin,
"none": auth_method_none,
}
def route(route, type="http", auth="user"):
def route(route, type="http", auth="user", methods=None):
"""
Decorator marking the decorated method as being a handler for requests. The method must be part of a subclass
of ``Controller``.
@ -217,26 +224,21 @@ def route(route, type="http", auth="user"):
* ``none``: The method is always active, even if there is no database. Mainly used by the framework and
authentication modules. There request code will not have any facilities to access the database nor have any
configuration indicating the current database nor the current user.
:param methods: A sequence of http methods this route applies to. If not specified, all methods are allowed.
"""
assert type in ["http", "json"]
assert auth in auth_methods.keys()
def decorator(f):
if isinstance(route, list):
f.routes = route
else:
f.routes = [route]
f.methods = methods
f.exposed = type
if getattr(f, "auth", None) is None:
f.auth = auth
return f
return decorator
def reject_nonliteral(dct):
if '__ref' in dct:
raise ValueError(
"Non literal contexts can not be sent to the server anymore (%r)" % (dct,))
return dct
class JsonRequest(WebRequest):
""" JSON-RPC2 over HTTP.
@ -302,7 +304,7 @@ class JsonRequest(WebRequest):
request = self.httprequest.stream.read()
# Read POST content or POST Form Data named "request"
self.jsonrequest = simplejson.loads(request, object_hook=reject_nonliteral)
self.jsonrequest = simplejson.loads(request)
self.params = dict(self.jsonrequest.get("params", {}))
self.context = self.params.pop('context', self.session.context)
@ -406,22 +408,9 @@ class HttpRequest(WebRequest):
self.params = params
def dispatch(self):
try:
r = self._call_function(**self.params)
except werkzeug.exceptions.HTTPException, e:
r = e
except Exception, e:
_logger.exception("An exception occured during an http request")
se = serialize_exception(e)
error = {
'code': 200,
'message': "OpenERP Server Error",
'data': se
}
r = werkzeug.exceptions.InternalServerError(cgi.escape(simplejson.dumps(error)))
else:
if not r:
r = werkzeug.wrappers.Response(status=204) # no content
r = self._call_function(**self.params)
if not r:
r = werkzeug.wrappers.Response(status=204) # no content
return r
def make_response(self, data, headers=None, cookies=None):
@ -462,31 +451,11 @@ def httprequest(f):
return route([base, base + "/<path:_ignored_path>"], type="http", auth="user")(f)
#----------------------------------------------------------
# Thread local global request object
#----------------------------------------------------------
from werkzeug.local import LocalStack
_request_stack = LocalStack()
request = _request_stack()
"""
A global proxy that always redirect to the current request object.
"""
@contextlib.contextmanager
def set_request(req):
_request_stack.push(req)
try:
yield
finally:
_request_stack.pop()
#----------------------------------------------------------
# Controller metaclass registration
# Controller and route registration
#----------------------------------------------------------
addons_module = {}
addons_manifest = {}
controllers_per_module = {}
controllers_per_module = collections.defaultdict(list)
class ControllerType(type):
def __init__(cls, name, bases, attrs):
@ -511,11 +480,36 @@ class ControllerType(type):
# but we only store controllers directly inheriting from Controller
if not "Controller" in globals() or not Controller in bases:
return
controllers_per_module.setdefault(module, []).append(name_class)
controllers_per_module[module].append(name_class)
class Controller(object):
__metaclass__ = ControllerType
def routing_map(modules, nodb_only, converters=None):
routing_map = werkzeug.routing.Map(strict_slashes=False, converters=converters)
for module in modules:
if module not in controllers_per_module:
continue
for _, cls in controllers_per_module[module]:
subclasses = cls.__subclasses__()
subclasses = [c for c in subclasses if c.__module__.startswith('openerp.addons.') and c.__module__.split(".")[2] in modules]
if subclasses:
name = "%s (extended by %s)" % (cls.__name__, ', '.join(sub.__name__ for sub in subclasses))
cls = type(name, tuple(reversed(subclasses)), {})
o = cls()
members = inspect.getmembers(o)
for mk, mv in members:
if inspect.ismethod(mv) and getattr(mv, 'exposed', False) and (not nodb_only or nodb_only == (mv.auth == "none")):
for url in mv.routes:
if getattr(mv, "combine", False):
url = o._cp_path.rstrip('/') + '/' + url.lstrip('/')
if url.endswith("/") and len(url) > 1:
url = url[: -1]
routing_map.add(werkzeug.routing.Rule(url, endpoint=mv, methods=mv.methods))
return routing_map
#----------------------------------------------------------
# HTTP Sessions
#----------------------------------------------------------
@ -679,6 +673,8 @@ class OpenERPSession(werkzeug.contrib.sessions.Session):
context['lang'] = lang or 'en_US'
# Deprecated to be removed in 9
"""
Damn properties for retro-compatibility. All of that is deprecated, all
of that.
@ -794,13 +790,25 @@ def session_gc(session_store):
pass
#----------------------------------------------------------
# WSGI Application
# WSGI Layer
#----------------------------------------------------------
# Add potentially missing (older ubuntu) font mime types
mimetypes.add_type('application/font-woff', '.woff')
mimetypes.add_type('application/vnd.ms-fontobject', '.eot')
mimetypes.add_type('application/x-font-ttf', '.ttf')
class LazyResponse(werkzeug.wrappers.Response):
""" Lazy werkzeug response.
API not yet frozen"""
def __init__(self, callback, **kwargs):
super(LazyResponse, self).__init__(mimetype='text/html')
self.callback = callback
self.params = kwargs
def process(self):
response = self.callback(**self.params)
self.response.append(response)
class DisableCacheMiddleware(object):
def __init__(self, app):
self.app = app
@ -848,106 +856,27 @@ class Root(object):
"""Root WSGI application for the OpenERP Web Client.
"""
def __init__(self):
self.addons = {}
self.statics = {}
self.no_db_router = None
self.load_addons()
# Setup http sessions
path = session_path()
self.session_store = werkzeug.contrib.sessions.FilesystemSessionStore(path, session_class=OpenERPSession)
_logger.debug('HTTP sessions stored in: %s', path)
self.session_store = werkzeug.contrib.sessions.FilesystemSessionStore(path, session_class=OpenERPSession)
# TODO should we move this to ir.http so that only configured modules are served ?
_logger.info("HTTP Configuring static files")
self.load_addons()
_logger.info("Generating nondb routing")
self.nodb_routing_map = routing_map(['', "web"], True)
def __call__(self, environ, start_response):
""" Handle a WSGI request
"""
return self.dispatch(environ, start_response)
def dispatch(self, environ, start_response):
"""
Performs the actual WSGI dispatching for the application.
"""
try:
httprequest = werkzeug.wrappers.Request(environ)
httprequest.parameter_storage_class = werkzeug.datastructures.ImmutableDict
httprequest.app = self
session_gc(self.session_store)
sid = httprequest.args.get('session_id')
explicit_session = True
if not sid:
sid = httprequest.headers.get("X-Openerp-Session-Id")
if not sid:
sid = httprequest.cookies.get('session_id')
explicit_session = False
if sid is None:
httprequest.session = self.session_store.new()
else:
httprequest.session = self.session_store.get(sid)
self._find_db(httprequest)
if not "lang" in httprequest.session.context:
lang = httprequest.accept_languages.best or "en_US"
lang = babel.core.LOCALE_ALIASES.get(lang, lang).replace('-', '_')
httprequest.session.context["lang"] = lang
request = self._build_request(httprequest)
db = request.db
if db:
openerp.modules.registry.RegistryManager.check_registry_signaling(db)
with set_request(request):
self.find_handler()
result = request.dispatch()
if db:
openerp.modules.registry.RegistryManager.signal_caches_change(db)
if isinstance(result, basestring):
headers=[('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', len(result))]
response = werkzeug.wrappers.Response(result, headers=headers)
else:
response = result
if httprequest.session.should_save:
self.session_store.save(httprequest.session)
# We must not set the cookie if the session id was specified using a http header or a GET parameter.
# There are two reasons to this:
# - When using one of those two means we consider that we are overriding the cookie, which means creating a new
# session on top of an already existing session and we don't want to create a mess with the 'normal' session
# (the one using the cookie). That is a special feature of the Session Javascript class.
# - It could allow session fixation attacks.
if not explicit_session and hasattr(response, 'set_cookie'):
response.set_cookie('session_id', httprequest.session.sid, max_age=90 * 24 * 60 * 60)
return response(environ, start_response)
except werkzeug.exceptions.HTTPException, e:
return e(environ, start_response)
def _find_db(self, httprequest):
db = db_monodb(httprequest)
if db != httprequest.session.db:
httprequest.session.logout()
httprequest.session.db = db
def _build_request(self, httprequest):
if httprequest.args.get('jsonp'):
return JsonRequest(httprequest)
if httprequest.mimetype == "application/json":
return JsonRequest(httprequest)
else:
return HttpRequest(httprequest)
def load_addons(self):
""" Load all addons from addons patch containg static files and
controllers and configure them. """
statics = {}
for addons_path in openerp.modules.module.ad_paths:
for module in sorted(os.listdir(str(addons_path))):
@ -960,99 +889,123 @@ class Root(object):
_logger.debug("Loading %s", module)
if 'openerp.addons' in sys.modules:
m = __import__('openerp.addons.' + module)
else:
m = __import__(module)
addons_module[module] = m
addons_manifest[module] = manifest
self.statics['/%s/static' % module] = path_static
statics['/%s/static' % module] = path_static
app = werkzeug.wsgi.SharedDataMiddleware(self.dispatch, self.statics)
app = werkzeug.wsgi.SharedDataMiddleware(self.dispatch, statics)
self.dispatch = DisableCacheMiddleware(app)
def _build_router(self, db):
_logger.info("Generating routing configuration for database %s" % db)
routing_map = routing.Map(strict_slashes=False)
def setup_session(self, httprequest):
# recover or create session
session_gc(self.session_store)
def gen(modules, nodb_only):
for module in modules:
for v in controllers_per_module[module]:
cls = v[1]
sid = httprequest.args.get('session_id')
explicit_session = True
if not sid:
sid = httprequest.headers.get("X-Openerp-Session-Id")
if not sid:
sid = httprequest.cookies.get('session_id')
explicit_session = False
if sid is None:
httprequest.session = self.session_store.new()
else:
httprequest.session = self.session_store.get(sid)
return explicit_session
subclasses = cls.__subclasses__()
subclasses = [c for c in subclasses if c.__module__.startswith('openerp.addons.') and
c.__module__.split(".")[2] in modules]
if subclasses:
name = "%s (extended by %s)" % (cls.__name__, ', '.join(sub.__name__ for sub in subclasses))
cls = type(name, tuple(reversed(subclasses)), {})
def setup_db(self, httprequest):
if not httprequest.session.db:
# allow "admin" routes to works without being logged in when in monodb.
httprequest.session.db = db_monodb(httprequest)
o = cls()
members = inspect.getmembers(o)
for mk, mv in members:
if inspect.ismethod(mv) and getattr(mv, 'exposed', False) and \
nodb_only == (getattr(mv, "auth", "none") == "none"):
for url in mv.routes:
if getattr(mv, "combine", False):
url = o._cp_path.rstrip('/') + '/' + url.lstrip('/')
if url.endswith("/") and len(url) > 1:
url = url[: -1]
routing_map.add(routing.Rule(url, endpoint=mv))
def setup_lang(self, httprequest):
if not "lang" in httprequest.session.context:
lang = httprequest.accept_languages.best or "en_US"
lang = babel.core.LOCALE_ALIASES.get(lang, lang).replace('-', '_')
httprequest.session.context["lang"] = lang
modules_set = set(controllers_per_module.keys()) - set(['', 'web'])
# building all none methods
gen(['', "web"] + sorted(modules_set), True)
if not db:
return routing_map
def get_request(self, httprequest):
# deduce type of request
if httprequest.args.get('jsonp'):
return JsonRequest(httprequest)
if httprequest.mimetype == "application/json":
return JsonRequest(httprequest)
else:
return HttpRequest(httprequest)
registry = openerp.modules.registry.RegistryManager.get(db)
with registry.cursor() as cr:
m = registry.get('ir.module.module')
ids = m.search(cr, openerp.SUPERUSER_ID, [('state', '=', 'installed'), ('name', '!=', 'web')])
installed = set(x['name'] for x in m.read(cr, 1, ids, ['name']))
modules_set = modules_set & installed
def get_response(self, httprequest, result, explicit_session):
if isinstance(result, LazyResponse):
try:
result.process()
except(Exception), e:
result = request.registry['ir.http']._handle_exception(e)
# building all other methods
gen(['', "web"] + sorted(modules_set), False)
if isinstance(result, basestring):
response = werkzeug.wrappers.Response(result, mimetype='text/html')
else:
response = result
return routing_map
if httprequest.session.should_save:
self.session_store.save(httprequest.session)
# We must not set the cookie if the session id was specified using a http header or a GET parameter.
# There are two reasons to this:
# - When using one of those two means we consider that we are overriding the cookie, which means creating a new
# session on top of an already existing session and we don't want to create a mess with the 'normal' session
# (the one using the cookie). That is a special feature of the Session Javascript class.
# - It could allow session fixation attacks.
if not explicit_session and hasattr(response, 'set_cookie'):
response.set_cookie('session_id', httprequest.session.sid, max_age=90 * 24 * 60 * 60)
return response
def dispatch(self, environ, start_response):
"""
Performs the actual WSGI dispatching for the application.
"""
try:
httprequest = werkzeug.wrappers.Request(environ)
httprequest.parameter_storage_class = werkzeug.datastructures.ImmutableDict
httprequest.app = self
explicit_session = self.setup_session(httprequest)
self.setup_db(httprequest)
self.setup_lang(httprequest)
request = self.get_request(httprequest)
def _dispatch_nodb():
func, arguments = self.nodb_routing_map.bind_to_environ(request.httprequest.environ).match()
request.set_handler(func, arguments, "none")
result = request.dispatch()
return result
with request:
db = request.session.db
if db:
openerp.modules.registry.RegistryManager.check_registry_signaling(db)
try:
ir_http = request.registry['ir.http']
except psycopg2.OperationalError:
# psycopg2 error. At this point, that's mean the database does not exists
# anymore. We unlog the user and failback in nodb mode
request.session.logout()
result = _dispatch_nodb()
else:
result = ir_http._dispatch()
openerp.modules.registry.RegistryManager.signal_caches_change(db)
else:
result = _dispatch_nodb()
response = self.get_response(httprequest, result, explicit_session)
return response(environ, start_response)
except werkzeug.exceptions.HTTPException, e:
return e(environ, start_response)
def get_db_router(self, db):
if db is None:
router = self.no_db_router
else:
router = getattr(openerp.modules.registry.RegistryManager.get(db), "werkzeug_http_router", None)
if not router:
router = self._build_router(db)
if db is None:
self.no_db_router = router
else:
openerp.modules.registry.RegistryManager.get(db).werkzeug_http_router = router
return router
def find_handler(self):
"""
Tries to discover the controller handling the request for the path specified in the request.
"""
path = request.httprequest.path
urls = self.get_db_router(request.db).bind_to_environ(request.httprequest.environ)
func, arguments = urls.match(path)
arguments = dict([(k, v) for k, v in arguments.items() if not k.startswith("_ignored_")])
@service_model.check
def checked_call(dbname, *a, **kw):
return func(*a, **kw)
def nfunc(*args, **kwargs):
kwargs.update(arguments)
if getattr(func, '_first_arg_is_req', False):
args = (request,) + args
if request.db:
return checked_call(request.db, *args, **kwargs)
return func(*args, **kwargs)
request.func = nfunc
request.auth_method = getattr(func, "auth", "user")
request.func_request_type = func.exposed
if not db:
return self.nodb_routing_map
return request.registry['ir.http'].routing_map()
def db_list(force=False, httprequest=None):
httprequest = httprequest or request.httprequest
@ -1091,6 +1044,9 @@ def db_monodb(httprequest=None):
return dbs[0]
return None
#----------------------------------------------------------
# RPC controller
#----------------------------------------------------------
class CommonController(Controller):
@route('/jsonrpc', type='json', auth="none")

View File

@ -342,7 +342,7 @@ def load_modules(db, force_demo=False, status=None, update_module=False):
if processed_modules:
cr.execute("""select model,name from ir_model where id NOT IN (select distinct model_id from ir_model_access)""")
for (model, name) in cr.fetchall():
if model in registry and not registry[model].is_transient():
if model in registry and not registry[model].is_transient() and not isinstance(registry[model], openerp.osv.orm.AbstractModel):
_logger.warning('The model %s has no access rules, consider adding one. E.g. access_%s,access_%s,model_%s,,1,1,1,1',
model, model.replace('.', '_'), model.replace('.', '_'), model.replace('.', '_'))

View File

@ -199,15 +199,16 @@ class RegistryManager(object):
@classmethod
def get(cls, db_name, force_demo=False, status=None, update_module=False):
""" Return a registry for a given database name."""
try:
return cls.registries[db_name]
except KeyError:
return cls.new(db_name, force_demo, status,
update_module)
finally:
# set db tracker - cleaned up at the WSGI
# dispatching phase in openerp.service.wsgi_server.application
threading.current_thread().dbname = db_name
with cls.registries_lock:
try:
return cls.registries[db_name]
except KeyError:
return cls.new(db_name, force_demo, status,
update_module)
finally:
# set db tracker - cleaned up at the WSGI
# dispatching phase in openerp.service.wsgi_server.application
threading.current_thread().dbname = db_name
@classmethod
def new(cls, db_name, force_demo=False, status=None,

View File

@ -1147,7 +1147,7 @@ class function(_column):
# make the result a tuple if it is not already one
if isinstance(value, (int,long)) and hasattr(obj._columns[field], 'relation'):
obj_model = obj.pool[obj._columns[field].relation]
dict_names = dict(obj_model.name_get(cr, uid, [value], context))
dict_names = dict(obj_model.name_get(cr, SUPERUSER_ID, [value], context))
result = (value, dict_names[value])
if field_type == 'binary':

View File

@ -383,10 +383,12 @@ class browse_record(object):
self.__logger.debug(''.join(traceback.format_stack()))
raise KeyError(error_msg)
prefetchable = lambda f: f._classic_write and f._prefetch and not f.groups and not f.deprecated
# if the field is a classic one or a many2one, we'll fetch all classic and many2one fields
if col._prefetch and not col.groups:
if prefetchable(col):
# gen the list of "local" (ie not inherited) fields which are classic or many2one
field_filter = lambda x: x[1]._classic_write and x[1]._prefetch and not x[1].groups
field_filter = lambda x: prefetchable(x[1])
fields_to_fetch = filter(field_filter, self._table._columns.items())
# gen the list of inherited fields
inherits = map(lambda x: (x[0], x[1][2]), self._table._inherit_fields.items())
@ -399,7 +401,15 @@ class browse_record(object):
ids = filter(lambda id: name not in self._data[id], self._data.keys())
# read the results
field_names = map(lambda x: x[0], fields_to_fetch)
field_values = self._table.read(self._cr, self._uid, ids, field_names, context=self._context, load="_classic_write")
try:
field_values = self._table.read(self._cr, self._uid, ids, field_names, context=self._context, load="_classic_write")
except (openerp.exceptions.AccessError, except_orm):
if len(ids) == 1:
raise
# prefetching attempt failed, perhaps we're violating ACL restrictions involuntarily
_logger.info('Prefetching attempt for fields %s on %s failed for ids %s, re-trying just for id %s', field_names, self._model._name, ids, self._id)
ids = [self._id]
field_values = self._table.read(self._cr, self._uid, ids, field_names, context=self._context, load="_classic_write")
# TODO: improve this, very slow for reports
if self._fields_process:
@ -2153,8 +2163,8 @@ class BaseModel(object):
attribute = (child.get('name'), child.text and child.text.encode('utf8') or None)
if attribute[1]:
node.set(attribute[0], attribute[1])
else:
del(node.attrib[attribute[0]])
elif attribute[0] in node.attrib:
del node.attrib[attribute[0]]
else:
sib = node.getnext()
for child in spec:
@ -4983,8 +4993,8 @@ class BaseModel(object):
context = {}
# avoid recursion through already copied records in case of circular relationship
seen_map = context.setdefault('__copy_data_seen',{})
if id in seen_map.setdefault(self._name,[]):
seen_map = context.setdefault('__copy_data_seen', {})
if id in seen_map.setdefault(self._name, []):
return
seen_map[self._name].append(id)
@ -4997,15 +5007,6 @@ class BaseModel(object):
else:
default['state'] = self._defaults['state']
context_wo_lang = context.copy()
if 'lang' in context:
del context_wo_lang['lang']
data = self.read(cr, uid, [id,], context=context_wo_lang)
if data:
data = data[0]
else:
raise IndexError( _("Record #%d of %s not found, cannot copy!") %( id, self._name))
# build a black list of fields that should not be copied
blacklist = set(MAGIC_COLUMNS + ['parent_left', 'parent_right'])
def blacklist_given_fields(obj):
@ -5018,8 +5019,21 @@ class BaseModel(object):
blacklist.update(set(self.pool[other]._all_columns) - set(self._columns))
else:
blacklist_given_fields(self.pool[other])
# blacklist deprecated fields
for name, field in obj._columns.items():
if field.deprecated:
blacklist.add(name)
blacklist_given_fields(self)
fields_to_read = [f for f in self.check_field_access_rights(cr, uid, 'read', None)
if f not in blacklist]
data = self.read(cr, uid, [id], fields_to_read, context=context)
if data:
data = data[0]
else:
raise IndexError(_("Record #%d of %s not found, cannot copy!") % (id, self._name))
res = dict(default)
for f, colinfo in self._all_columns.items():
field = colinfo.column
@ -5060,36 +5074,50 @@ class BaseModel(object):
# TODO it seems fields_get can be replaced by _all_columns (no need for translation)
fields = self.fields_get(cr, uid, context=context)
translation_records = []
for field_name, field_def in fields.items():
# removing the lang to compare untranslated values
context_wo_lang = dict(context, lang=None)
old_record, new_record = self.browse(cr, uid, [old_id, new_id], context=context_wo_lang)
# we must recursively copy the translations for o2o and o2m
if field_def['type'] == 'one2many':
target_obj = self.pool[field_def['relation']]
old_record, new_record = self.read(cr, uid, [old_id, new_id], [field_name], context=context)
# here we rely on the order of the ids to match the translations
# as foreseen in copy_data()
old_children = sorted(old_record[field_name])
new_children = sorted(new_record[field_name])
old_children = sorted(r.id for r in old_record[field_name])
new_children = sorted(r.id for r in new_record[field_name])
for (old_child, new_child) in zip(old_children, new_children):
target_obj.copy_translations(cr, uid, old_child, new_child, context=context)
# and for translatable fields we keep them for copy
elif field_def.get('translate'):
trans_name = ''
if field_name in self._columns:
trans_name = self._name + "," + field_name
target_id = new_id
source_id = old_id
elif field_name in self._inherit_fields:
trans_name = self._inherit_fields[field_name][0] + "," + field_name
if trans_name:
trans_ids = trans_obj.search(cr, uid, [
('name', '=', trans_name),
('res_id', '=', old_id)
])
translation_records.extend(trans_obj.read(cr, uid, trans_ids, context=context))
# get the id of the parent record to set the translation
inherit_field_name = self._inherit_fields[field_name][1]
target_id = new_record[inherit_field_name].id
source_id = old_record[inherit_field_name].id
else:
continue
for record in translation_records:
del record['id']
record['res_id'] = new_id
trans_obj.create(cr, uid, record, context=context)
trans_ids = trans_obj.search(cr, uid, [
('name', '=', trans_name),
('res_id', '=', source_id)
])
user_lang = context.get('lang')
for record in trans_obj.read(cr, uid, trans_ids, context=context):
del record['id']
# remove source to avoid triggering _set_src
del record['source']
record.update({'res_id': target_id})
if user_lang and user_lang == record['lang']:
# 'source' to force the call to _set_src
# 'value' needed if value is changed in copy(), want to see the new_value
record['source'] = old_record[field_name]
record['value'] = new_record[field_name]
trans_obj.create(cr, uid, record, context=context)
def copy(self, cr, uid, id, default=None, context=None):

View File

@ -24,8 +24,6 @@ import re
from lxml import etree
import openerp
import openerp
import openerp.tools as tools
import openerp.modules
@ -33,6 +31,9 @@ import print_xml
import render
import urllib
from openerp import SUPERUSER_ID
from openerp.report.render.rml2pdf import customfonts
#
# coerce any type to a unicode string (to preserve non-ascii characters)
# and escape XML entities
@ -91,13 +92,16 @@ class report_rml(report_int):
}
def create(self, cr, uid, ids, datas, context):
registry = openerp.registry(cr.dbname)
xml = self.create_xml(cr, uid, ids, datas, context)
xml = tools.ustr(xml).encode('utf8')
report_type = datas.get('report_type', 'pdf')
if report_type == 'raw':
return xml, report_type
registry['res.font'].font_scan(cr, SUPERUSER_ID, lazy=True, context=context)
rml = self.create_rml(cr, xml, uid, context)
registry = openerp.registry(cr.dbname)
ir_actions_report_xml_obj = registry['ir.actions.report.xml']
report_xml_ids = ir_actions_report_xml_obj.search(cr, uid, [('report_name', '=', self.name[7:])], context=context)
self.title = report_xml_ids and ir_actions_report_xml_obj.browse(cr,uid,report_xml_ids)[0].name or 'OpenERP Report'

View File

@ -21,10 +21,9 @@
##############################################################################
from reportlab import rl_config
from reportlab.lib import fonts
from reportlab.pdfbase import pdfmetrics, ttfonts
import logging
import os,platform
import glob
import os
# .apidoc title: TTF Font Table
@ -39,35 +38,14 @@ and Ubuntu distros, we have to override the search path, too.
"""
_logger = logging.getLogger(__name__)
# Basic fonts family included in PDF standart, will always be in the font list
BasePDFFonts = [
'Helvetica',
'Times',
'Courier'
]
# List of fonts found on the disk
CustomTTFonts = BaseCustomTTFonts = [ ('Helvetica', "DejaVu Sans", "DejaVuSans.ttf", 'normal'),
('Helvetica', "DejaVu Sans Bold", "DejaVuSans-Bold.ttf", 'bold'),
('Helvetica', "DejaVu Sans Oblique", "DejaVuSans-Oblique.ttf", 'italic'),
('Helvetica', "DejaVu Sans BoldOblique", "DejaVuSans-BoldOblique.ttf", 'bolditalic'),
('Times', "Liberation Serif", "LiberationSerif-Regular.ttf", 'normal'),
('Times', "Liberation Serif Bold", "LiberationSerif-Bold.ttf", 'bold'),
('Times', "Liberation Serif Italic", "LiberationSerif-Italic.ttf", 'italic'),
('Times', "Liberation Serif BoldItalic", "LiberationSerif-BoldItalic.ttf", 'bolditalic'),
('Courier', "FreeMono", "FreeMono.ttf", 'normal'),
('Courier', "FreeMono Bold", "FreeMonoBold.ttf", 'bold'),
('Courier', "FreeMono Oblique", "FreeMonoOblique.ttf", 'italic'),
('Courier', "FreeMono BoldOblique", "FreeMonoBoldOblique.ttf", 'bolditalic'),
]
CustomTTFonts = []
# Search path for TTF files, in addition of rl_config.TTFSearchPath
TTFSearchPath = [
'/usr/share/fonts/truetype', # SuSE
'/usr/share/fonts/dejavu', '/usr/share/fonts/liberation', # Fedora, RHEL
'/usr/share/fonts/truetype/*','/usr/local/share/fonts' # Ubuntu,
'/usr/share/fonts/TTF/*', # at Mandriva/Mageia
'/usr/share/fonts/TTF/*', # Mandriva/Mageia
'/usr/share/fonts/TTF', # Arch Linux
'/usr/lib/openoffice/share/fonts/truetype/',
'~/.fonts',
@ -95,10 +73,8 @@ def list_all_sysfonts():
# TTFOpenFile is not very good at it.
searchpath = list(set(TTFSearchPath + rl_config.TTFSearchPath))
for dirname in searchpath:
dirname = os.path.expanduser(dirname)
if os.path.exists(dirname):
for filename in [x for x in os.listdir(dirname) if x.lower().endswith('.ttf')]:
filepath.append(os.path.join(dirname, filename))
for filename in glob.glob(os.path.join(os.path.expanduser(dirname), '*.[Tt][Tt][Ff]')):
filepath.append(filename)
return filepath
def SetCustomFonts(rmldoc):
@ -109,9 +85,9 @@ def SetCustomFonts(rmldoc):
This function is called once per report, so it should
avoid system-wide processing (cache it, instead).
"""
for name, font, filename, mode in CustomTTFonts:
for family, font, filename, mode in CustomTTFonts:
if os.path.isabs(filename) and os.path.exists(filename):
rmldoc.setTTFontMapping(name, font, filename, mode)
rmldoc.setTTFontMapping(family, font, filename, mode)
return True
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

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