[MERGE] Merge with trunk
bzr revid: jke@openerp.com-20131127175727-76iuqrgmg8fumi5f bzr revid: jke@openerp.com-20131202142549-t1l5pyse00zqw8wm bzr revid: jke@openerp.com-20131210164214-ctl2z8dzkzohha13 bzr revid: jke@openerp.com-20131211085211-zhnm8ylpz0cws1lg bzr revid: jke@openerp.com-20131211131225-v60hox0q6drwajqu
This commit is contained in:
commit
196436f73b
|
@ -25,25 +25,25 @@ create table ir_values
|
||||||
|
|
||||||
CREATE TABLE ir_model (
|
CREATE TABLE ir_model (
|
||||||
id serial,
|
id serial,
|
||||||
model varchar(64) DEFAULT ''::varchar NOT NULL,
|
model varchar DEFAULT ''::varchar NOT NULL,
|
||||||
name varchar(64),
|
name varchar,
|
||||||
state varchar(16),
|
state varchar,
|
||||||
info text,
|
info text,
|
||||||
primary key(id)
|
primary key(id)
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE ir_model_fields (
|
CREATE TABLE ir_model_fields (
|
||||||
id serial,
|
id serial,
|
||||||
model varchar(64) DEFAULT ''::varchar NOT NULL,
|
model varchar DEFAULT ''::varchar NOT NULL,
|
||||||
model_id int references ir_model on delete cascade,
|
model_id int references ir_model on delete cascade,
|
||||||
name varchar(64) DEFAULT ''::varchar NOT NULL,
|
name varchar DEFAULT ''::varchar NOT NULL,
|
||||||
relation varchar(64),
|
relation varchar,
|
||||||
select_level varchar(4),
|
select_level varchar,
|
||||||
field_description varchar(256),
|
field_description varchar,
|
||||||
ttype varchar(64),
|
ttype varchar,
|
||||||
state varchar(64) default 'base',
|
state varchar default 'base',
|
||||||
relate boolean default False,
|
relate boolean default False,
|
||||||
relation_field varchar(128),
|
relation_field varchar,
|
||||||
translate boolean default False,
|
translate boolean default False,
|
||||||
primary key(id)
|
primary key(id)
|
||||||
);
|
);
|
||||||
|
@ -350,11 +350,11 @@ CREATE TABLE ir_model_data (
|
||||||
write_date timestamp without time zone,
|
write_date timestamp without time zone,
|
||||||
write_uid integer,
|
write_uid integer,
|
||||||
noupdate boolean,
|
noupdate boolean,
|
||||||
name character varying(128) NOT NULL,
|
name varchar NOT NULL,
|
||||||
date_init timestamp without time zone,
|
date_init timestamp without time zone,
|
||||||
date_update timestamp without time zone,
|
date_update timestamp without time zone,
|
||||||
module character varying(64) NOT NULL,
|
module varchar NOT NULL,
|
||||||
model character varying(64) NOT NULL,
|
model varchar NOT NULL,
|
||||||
res_id integer, primary key(id)
|
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,
|
module integer NOT NULL references ir_module_module on delete restrict,
|
||||||
model integer NOT NULL references ir_model on delete restrict,
|
model integer NOT NULL references ir_model on delete restrict,
|
||||||
type character varying(1) NOT NULL,
|
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
|
-- 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,
|
date_update timestamp without time zone,
|
||||||
module integer NOT NULL references ir_module_module on delete restrict,
|
module integer NOT NULL references ir_module_module on delete restrict,
|
||||||
model integer NOT NULL references ir_model on delete restrict,
|
model integer NOT NULL references ir_model on delete restrict,
|
||||||
name character varying(128) NOT NULL
|
name varchar NOT NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
|
|
@ -91,5 +91,25 @@ Administrator</field>
|
||||||
<field eval="10" name="sequence"/>
|
<field eval="10" name="sequence"/>
|
||||||
</record>
|
</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>
|
</data>
|
||||||
</openerp>
|
</openerp>
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:46+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:29+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:46+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:29+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:46+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:29+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:46+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:29+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:47+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:30+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:47+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:30+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:47+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:30+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:47+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:30+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
"X-Poedit-Language: Czech\n"
|
"X-Poedit-Language: Czech\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:47+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:31+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:49+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:32+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -12,8 +12,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:49+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:32+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
"X-Poedit-Country: GREECE\n"
|
"X-Poedit-Country: GREECE\n"
|
||||||
"X-Poedit-Language: Greek\n"
|
"X-Poedit-Language: Greek\n"
|
||||||
"X-Poedit-SourceCharset: utf-8\n"
|
"X-Poedit-SourceCharset: utf-8\n"
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:55+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:38+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:53+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:36+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: 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
|
#: code:addons/base/ir/ir_fields.py:195
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "'%s' does not seem to be a valid date for field '%%(field)s'"
|
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
|
#. module: base
|
||||||
#: view:res.partner:0
|
#: view:res.partner:0
|
||||||
|
@ -1718,7 +1718,7 @@ msgstr "Haití"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_l10n_fr_hr_payroll
|
#: model:ir.module.module,shortdesc:base.module_l10n_fr_hr_payroll
|
||||||
msgid "French Payroll"
|
msgid "French Payroll"
|
||||||
msgstr "Nomina de Francia"
|
msgstr "Nómina de Francia"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:ir.ui.view:0
|
#: view:ir.ui.view:0
|
||||||
|
@ -5047,6 +5047,26 @@ msgid ""
|
||||||
" and iban account numbers\n"
|
" and iban account numbers\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
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
|
#. module: base
|
||||||
#: selection:ir.module.module,state:0
|
#: selection:ir.module.module,state:0
|
||||||
|
@ -7260,7 +7280,7 @@ msgstr "El nombre del grupo no puede empezar con \"-\""
|
||||||
#: view:ir.module.module:0
|
#: view:ir.module.module:0
|
||||||
#: model:ir.ui.menu,name:base.module_mi
|
#: model:ir.ui.menu,name:base.module_mi
|
||||||
msgid "Apps"
|
msgid "Apps"
|
||||||
msgstr "Tienda de aplicaciones"
|
msgstr "Aplicaciones en línea"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:ir.ui.view_sc:0
|
#: view:ir.ui.view_sc:0
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:55+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:38+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:56+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:39+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:55+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:39+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:56+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:40+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
"Language: \n"
|
"Language: \n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:55+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:39+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:57+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:40+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -15,8 +15,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:56+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:40+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:55+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:38+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:48+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:31+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:47+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:30+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -9,8 +9,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:51+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:35+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
|
"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
|
||||||
"X-Poedit-Language: Persian\n"
|
"X-Poedit-Language: Persian\n"
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:57+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:40+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:48+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:31+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:55+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:39+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:49+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:32+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
@ -25,6 +25,10 @@ msgid ""
|
||||||
"================================================\n"
|
"================================================\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
"Módulo para a emisión e impresión de cheques\n"
|
||||||
|
"================================================\n"
|
||||||
|
" "
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.country,name:base.sh
|
#: model:res.country,name:base.sh
|
||||||
|
@ -60,7 +64,7 @@ msgstr "Arquitectura de Vistas"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,summary:base.module_sale_stock
|
#: model:ir.module.module,summary:base.module_sale_stock
|
||||||
msgid "Quotation, Sale Orders, Delivery & Invoicing Control"
|
msgid "Quotation, Sale Orders, Delivery & Invoicing Control"
|
||||||
msgstr ""
|
msgstr "Presuposto, ordes de venta, envío e control de facturación"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: selection:ir.sequence,implementation:0
|
#: selection:ir.sequence,implementation:0
|
||||||
|
@ -89,12 +93,12 @@ msgstr ""
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,summary:base.module_point_of_sale
|
#: model:ir.module.module,summary:base.module_point_of_sale
|
||||||
msgid "Touchscreen Interface for Shops"
|
msgid "Touchscreen Interface for Shops"
|
||||||
msgstr ""
|
msgstr "Interfaz de pantalla táctil para tendas"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
|
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
|
||||||
msgid "Indian Payroll"
|
msgid "Indian Payroll"
|
||||||
msgstr ""
|
msgstr "Nómina da India"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:ir.cron,model:0
|
#: help:ir.cron,model:0
|
||||||
|
@ -124,11 +128,22 @@ msgid ""
|
||||||
" * Product Attributes\n"
|
" * Product Attributes\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
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
|
#. module: base
|
||||||
#: field:ir.actions.client,params:0
|
#: field:ir.actions.client,params:0
|
||||||
msgid "Supplementary arguments"
|
msgid "Supplementary arguments"
|
||||||
msgstr ""
|
msgstr "Argumentos suplementarios"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_google_base_account
|
#: model:ir.module.module,description:base.module_google_base_account
|
||||||
|
@ -137,11 +152,14 @@ msgid ""
|
||||||
"The module adds google user in res user.\n"
|
"The module adds google user in res user.\n"
|
||||||
"========================================\n"
|
"========================================\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
"O módulo engade usuarios de Google a res.user.\n"
|
||||||
|
"========================================\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:res.partner,employee:0
|
#: help:res.partner,employee:0
|
||||||
msgid "Check this box if this contact is an Employee."
|
msgid "Check this box if this contact is an Employee."
|
||||||
msgstr ""
|
msgstr "Marque se o contacto é un traballador"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:ir.model.fields,domain:0
|
#: help:ir.model.fields,domain:0
|
||||||
|
@ -172,7 +190,7 @@ msgstr "Fiestra destino"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.actions.report.xml,report_rml:0
|
#: field:ir.actions.report.xml,report_rml:0
|
||||||
msgid "Main Report File Path"
|
msgid "Main Report File Path"
|
||||||
msgstr ""
|
msgstr "Ruta do ficheiro do informe principal"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_sale_analytic_plans
|
#: model:ir.module.module,shortdesc:base.module_sale_analytic_plans
|
||||||
|
@ -193,6 +211,15 @@ msgid ""
|
||||||
"revenue\n"
|
"revenue\n"
|
||||||
"reports."
|
"reports."
|
||||||
msgstr ""
|
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
|
#. module: base
|
||||||
#: code:addons/base/ir/ir_sequence.py:134
|
#: code:addons/base/ir/ir_sequence.py:134
|
||||||
|
@ -244,7 +271,7 @@ msgstr "creado"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.actions.report.xml,report_xsl:0
|
#: field:ir.actions.report.xml,report_xsl:0
|
||||||
msgid "XSL Path"
|
msgid "XSL Path"
|
||||||
msgstr ""
|
msgstr "Ruta XSL"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_l10n_tr
|
#: model:ir.module.module,shortdesc:base.module_l10n_tr
|
||||||
|
@ -270,7 +297,7 @@ msgstr "Inuktitut / ᐃᓄᒃᑎᑐᑦ"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.groups,name:base.group_multi_currency
|
#: model:res.groups,name:base.group_multi_currency
|
||||||
msgid "Multi Currencies"
|
msgid "Multi Currencies"
|
||||||
msgstr ""
|
msgstr "Multidivisa"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_l10n_cl
|
#: 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 "
|
"The internal user that is in charge of communicating with this contact if "
|
||||||
"any."
|
"any."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"O usuario interno encargado de se comunicar con este contacto, se o houber."
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:res.partner:0
|
#: view:res.partner:0
|
||||||
|
@ -321,6 +349,8 @@ msgid ""
|
||||||
"Database ID of record to open in form view, when ``view_mode`` is set to "
|
"Database ID of record to open in form view, when ``view_mode`` is set to "
|
||||||
"'form' only"
|
"'form' only"
|
||||||
msgstr ""
|
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
|
#. module: base
|
||||||
#: help:ir.values,key2:0
|
#: help:ir.values,key2:0
|
||||||
|
@ -365,6 +395,13 @@ msgid ""
|
||||||
"document and Wiki based Hidden.\n"
|
"document and Wiki based Hidden.\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
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
|
#. module: base
|
||||||
#: model:ir.module.category,name:base.module_category_customer_relationship_management
|
#: 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 "
|
"invoices from picking, OpenERP is able to add and compute the shipping "
|
||||||
"line.\n"
|
"line.\n"
|
||||||
msgstr ""
|
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
|
#. module: base
|
||||||
#: code:addons/base/ir/ir_filters.py:80
|
#: 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 "
|
"There is already a shared filter set as default for %(model)s, delete or "
|
||||||
"change it before setting a new default"
|
"change it before setting a new default"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Xa existe un filtro compartido por defecto para %(model)s, elimíneo ou "
|
||||||
|
"cámbieo antes de configurar un novo"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: code:addons/orm.py:2649
|
#: code:addons/orm.py:2649
|
||||||
|
@ -488,7 +534,7 @@ msgstr ""
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.model.relation,name:0
|
#: field:ir.model.relation,name:0
|
||||||
msgid "Relation Name"
|
msgid "Relation Name"
|
||||||
msgstr ""
|
msgstr "Nome da relación"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:ir.rule:0
|
#: view:ir.rule:0
|
||||||
|
@ -533,7 +579,7 @@ msgstr ""
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:workflow.transition:0
|
#: view:workflow.transition:0
|
||||||
msgid "Workflow Transition"
|
msgid "Workflow Transition"
|
||||||
msgstr ""
|
msgstr "Transición do fluxo de traballo"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.country,name:base.gf
|
#: model:res.country,name:base.gf
|
||||||
|
@ -543,7 +589,7 @@ msgstr "Güiana francesa"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,summary:base.module_hr
|
#: model:ir.module.module,summary:base.module_hr
|
||||||
msgid "Jobs, Departments, Employees Details"
|
msgid "Jobs, Departments, Employees Details"
|
||||||
msgstr ""
|
msgstr "Traballos, departamentos e detalles de traballadores"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_analytic
|
#: model:ir.module.module,description:base.module_analytic
|
||||||
|
@ -559,11 +605,20 @@ msgid ""
|
||||||
"that have no counterpart in the general financial accounts.\n"
|
"that have no counterpart in the general financial accounts.\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
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
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_idea
|
#: model:ir.module.module,shortdesc:base.module_idea
|
||||||
msgid "Ideas"
|
msgid "Ideas"
|
||||||
msgstr ""
|
msgstr "Ideas"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_event
|
#: model:ir.module.module,description:base.module_event
|
||||||
|
@ -652,7 +707,7 @@ msgstr "Colombia"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.partner.title,name:base.res_partner_title_mister
|
#: model:res.partner.title,name:base.res_partner_title_mister
|
||||||
msgid "Mister"
|
msgid "Mister"
|
||||||
msgstr ""
|
msgstr "Señor"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:res.country,code:0
|
#: help:res.country,code:0
|
||||||
|
@ -681,7 +736,7 @@ msgstr "Non traducido"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:ir.mail_server:0
|
#: view:ir.mail_server:0
|
||||||
msgid "Outgoing Mail Server"
|
msgid "Outgoing Mail Server"
|
||||||
msgstr ""
|
msgstr "Servidor de correo saínte"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:ir.actions.act_window,context:0
|
#: help:ir.actions.act_window,context:0
|
||||||
|
@ -695,7 +750,7 @@ msgstr ""
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:res.company,logo_web:0
|
#: field:res.company,logo_web:0
|
||||||
msgid "Logo Web"
|
msgid "Logo Web"
|
||||||
msgstr ""
|
msgstr "Logo web"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: code:addons/base/ir/ir_model.py:344
|
#: code:addons/base/ir/ir_model.py:344
|
||||||
|
@ -772,6 +827,12 @@ msgid ""
|
||||||
"Contains the installer for marketing-related modules.\n"
|
"Contains the installer for marketing-related modules.\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
"Menú para Marketing\n"
|
||||||
|
"===================\n"
|
||||||
|
"\n"
|
||||||
|
"Contén o instalador para os módulos relacionados co marketing.\n"
|
||||||
|
" "
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_web_linkedin
|
#: 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"
|
"This module provides the Integration of the LinkedIn with OpenERP.\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
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
|
#. module: base
|
||||||
#: help:ir.actions.act_window,src_model:0
|
#: help:ir.actions.act_window,src_model:0
|
||||||
|
@ -803,7 +869,7 @@ msgstr "Jordan"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_l10n_hr
|
#: model:ir.module.module,shortdesc:base.module_l10n_hr
|
||||||
msgid "Croatia - RRIF 2012 COA"
|
msgid "Croatia - RRIF 2012 COA"
|
||||||
msgstr ""
|
msgstr "Croacia - RRIF 2012 COA"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:ir.cron,nextcall:0
|
#: help:ir.cron,nextcall:0
|
||||||
|
@ -867,7 +933,7 @@ msgstr "Seguridade e autenticación"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_web_calendar
|
#: model:ir.module.module,shortdesc:base.module_web_calendar
|
||||||
msgid "Web Calendar"
|
msgid "Web Calendar"
|
||||||
msgstr ""
|
msgstr "Calendario web"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: selection:base.language.install,lang:0
|
#: selection:base.language.install,lang:0
|
||||||
|
@ -878,7 +944,7 @@ msgstr "Sueco / svenska"
|
||||||
#: field:base.language.export,name:0
|
#: field:base.language.export,name:0
|
||||||
#: field:ir.attachment,datas_fname:0
|
#: field:ir.attachment,datas_fname:0
|
||||||
msgid "File Name"
|
msgid "File Name"
|
||||||
msgstr ""
|
msgstr "Nome do ficheiro"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.country,name:base.rs
|
#: model:res.country,name:base.rs
|
||||||
|
@ -971,7 +1037,7 @@ msgstr "Preferencias de email"
|
||||||
#: code:addons/base/ir/ir_fields.py:195
|
#: code:addons/base/ir/ir_fields.py:195
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "'%s' does not seem to be a valid date for field '%%(field)s'"
|
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
|
#. module: base
|
||||||
#: view:res.partner:0
|
#: view:res.partner:0
|
||||||
|
@ -988,6 +1054,7 @@ msgstr "Cimbabue"
|
||||||
msgid ""
|
msgid ""
|
||||||
"Type of the constraint: `f` for a foreign key, `u` for other constraints."
|
"Type of the constraint: `f` for a foreign key, `u` for other constraints."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Tipo de restricción: 'f' para unha clave allea, 'u' para outras restriccións."
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:ir.actions.report.xml:0
|
#: view:ir.actions.report.xml:0
|
||||||
|
@ -1061,7 +1128,7 @@ msgstr "Outra Licenza OSI Aprobada"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_web_gantt
|
#: model:ir.module.module,shortdesc:base.module_web_gantt
|
||||||
msgid "Web Gantt"
|
msgid "Web Gantt"
|
||||||
msgstr ""
|
msgstr "Diagrama Gantt web"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.actions.act_window,name:base.act_menu_create
|
#: model:ir.actions.act_window,name:base.act_menu_create
|
||||||
|
@ -1088,7 +1155,7 @@ msgstr "Usuarios de Google"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_fleet
|
#: model:ir.module.module,shortdesc:base.module_fleet
|
||||||
msgid "Fleet Management"
|
msgid "Fleet Management"
|
||||||
msgstr ""
|
msgstr "Xestión de flotas"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:ir.server.object.lines,value:0
|
#: help:ir.server.object.lines,value:0
|
||||||
|
@ -1108,7 +1175,7 @@ msgstr "Andorra, Principado de"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.rule,perm_read:0
|
#: field:ir.rule,perm_read:0
|
||||||
msgid "Apply for Read"
|
msgid "Apply for Read"
|
||||||
msgstr ""
|
msgstr "Aplicar para lectura"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.country,name:base.mn
|
#: model:res.country,name:base.mn
|
||||||
|
@ -1167,12 +1234,12 @@ msgstr ""
|
||||||
#: code:addons/base/ir/ir_model.py:735
|
#: code:addons/base/ir/ir_model.py:735
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Document model"
|
msgid "Document model"
|
||||||
msgstr ""
|
msgstr "Modelo de documento"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:res.users:0
|
#: view:res.users:0
|
||||||
msgid "Change the user password."
|
msgid "Change the user password."
|
||||||
msgstr ""
|
msgstr "Cambia-lo contrasinal do usuario"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:res.lang:0
|
#: view:res.lang:0
|
||||||
|
@ -1269,12 +1336,12 @@ msgstr "¡ O nome do país debe ser único !"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.module.module,installed_version:0
|
#: field:ir.module.module,installed_version:0
|
||||||
msgid "Latest Version"
|
msgid "Latest Version"
|
||||||
msgstr ""
|
msgstr "Última versión"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:ir.rule:0
|
#: view:ir.rule:0
|
||||||
msgid "Delete Access Right"
|
msgid "Delete Access Right"
|
||||||
msgstr ""
|
msgstr "Eliminar dereito de acceso"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: code:addons/base/ir/ir_mail_server.py:214
|
#: code:addons/base/ir/ir_mail_server.py:214
|
||||||
|
@ -1301,7 +1368,7 @@ msgstr "Illas Caimán"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:ir.rule:0
|
#: view:ir.rule:0
|
||||||
msgid "Record Rule"
|
msgid "Record Rule"
|
||||||
msgstr ""
|
msgstr "Regla de rexistro"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.country,name:base.kr
|
#: model:res.country,name:base.kr
|
||||||
|
@ -1311,7 +1378,7 @@ msgstr "Corea do Sur"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_l10n_si
|
#: model:ir.module.module,description:base.module_l10n_si
|
||||||
msgid "Kontni načrt za gospodarske družbe"
|
msgid "Kontni načrt za gospodarske družbe"
|
||||||
msgstr ""
|
msgstr "Plan contable para empresas"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: code:addons/orm.py:4920
|
#: code:addons/orm.py:4920
|
||||||
|
@ -1327,7 +1394,7 @@ msgstr "Contribuíntes"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.rule,perm_unlink:0
|
#: field:ir.rule,perm_unlink:0
|
||||||
msgid "Apply for Delete"
|
msgid "Apply for Delete"
|
||||||
msgstr ""
|
msgstr "Marcar para eliminación"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: selection:ir.property,type:0
|
#: selection:ir.property,type:0
|
||||||
|
@ -1337,12 +1404,12 @@ msgstr "Char"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.module.category,visible:0
|
#: field:ir.module.category,visible:0
|
||||||
msgid "Visible"
|
msgid "Visible"
|
||||||
msgstr ""
|
msgstr "Visible"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.actions.client,name:base.action_client_base_menu
|
#: model:ir.actions.client,name:base.action_client_base_menu
|
||||||
msgid "Open Settings Menu"
|
msgid "Open Settings Menu"
|
||||||
msgstr ""
|
msgstr "Abrir menú 'Configuración'"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: selection:base.language.install,lang:0
|
#: selection:base.language.install,lang:0
|
||||||
|
@ -1402,6 +1469,8 @@ msgid ""
|
||||||
" for uploading to OpenERP's translation "
|
" for uploading to OpenERP's translation "
|
||||||
"platform,"
|
"platform,"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Formato TGZ: arquivo comprimido que contén un ficheiro .po, adecuado para "
|
||||||
|
"subilo directamente á plataforma de tradución de OpenERP."
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:res.lang:0
|
#: view:res.lang:0
|
||||||
|
@ -1418,7 +1487,7 @@ msgstr ""
|
||||||
#: code:addons/base/module/wizard/base_language_install.py:53
|
#: code:addons/base/module/wizard/base_language_install.py:53
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Language Pack"
|
msgid "Language Pack"
|
||||||
msgstr ""
|
msgstr "Paquete de idioma"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_web_tests
|
#: model:ir.module.module,shortdesc:base.module_web_tests
|
||||||
|
@ -1428,7 +1497,7 @@ msgstr "Probas"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.actions.report.xml,attachment:0
|
#: field:ir.actions.report.xml,attachment:0
|
||||||
msgid "Save as Attachment Prefix"
|
msgid "Save as Attachment Prefix"
|
||||||
msgstr ""
|
msgstr "Prefixo do anexo ó 'Gardar como'"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.ui.view_sc,res_id:0
|
#: field:ir.ui.view_sc,res_id:0
|
||||||
|
@ -1465,7 +1534,7 @@ msgstr "Haití"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_l10n_fr_hr_payroll
|
#: model:ir.module.module,shortdesc:base.module_l10n_fr_hr_payroll
|
||||||
msgid "French Payroll"
|
msgid "French Payroll"
|
||||||
msgstr ""
|
msgstr "Nómina de Francia"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:ir.ui.view:0
|
#: view:ir.ui.view:0
|
||||||
|
@ -1492,7 +1561,7 @@ msgstr ""
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.module.category,parent_id:0
|
#: field:ir.module.category,parent_id:0
|
||||||
msgid "Parent Application"
|
msgid "Parent Application"
|
||||||
msgstr ""
|
msgstr "Aplicación pai"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.actions.act_window,name:base.ir_action_wizard
|
#: model:ir.actions.act_window,name:base.ir_action_wizard
|
||||||
|
@ -1515,7 +1584,7 @@ msgstr "Sistema de xestión documental"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_crm_claim
|
#: model:ir.module.module,shortdesc:base.module_crm_claim
|
||||||
msgid "Claims Management"
|
msgid "Claims Management"
|
||||||
msgstr ""
|
msgstr "Xestión de reclamacións"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_document_webdav
|
#: 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.category,name:base.module_category_social_network
|
||||||
#: model:ir.module.module,shortdesc:base.module_mail
|
#: model:ir.module.module,shortdesc:base.module_mail
|
||||||
msgid "Social Network"
|
msgid "Social Network"
|
||||||
msgstr ""
|
msgstr "Rede social"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:res.lang:0
|
#: view:res.lang:0
|
||||||
|
@ -1663,12 +1732,12 @@ msgstr "%Y - Ano co século."
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:res.company:0
|
#: view:res.company:0
|
||||||
msgid "Report Footer Configuration"
|
msgid "Report Footer Configuration"
|
||||||
msgstr ""
|
msgstr "Configuración do pé de informe"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.translation,comments:0
|
#: field:ir.translation,comments:0
|
||||||
msgid "Translation comments"
|
msgid "Translation comments"
|
||||||
msgstr ""
|
msgstr "Comentarios de traducción"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_lunch
|
#: model:ir.module.module,description:base.module_lunch
|
||||||
|
@ -1729,7 +1798,7 @@ msgstr ""
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:res.partner,website:0
|
#: help:res.partner,website:0
|
||||||
msgid "Website of Partner or Company"
|
msgid "Website of Partner or Company"
|
||||||
msgstr ""
|
msgstr "Sitio web da empresa ou compañía"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:base.language.install,overwrite:0
|
#: help:base.language.install,overwrite:0
|
||||||
|
@ -1790,7 +1859,7 @@ msgstr ""
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_portal_project_issue
|
#: model:ir.module.module,shortdesc:base.module_portal_project_issue
|
||||||
msgid "Portal Issue"
|
msgid "Portal Issue"
|
||||||
msgstr ""
|
msgstr "Incidencia de portal"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.ui.menu,name:base.menu_tools
|
#: model:ir.ui.menu,name:base.menu_tools
|
||||||
|
@ -1814,12 +1883,12 @@ msgstr ""
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:res.partner,image_small:0
|
#: field:res.partner,image_small:0
|
||||||
msgid "Small-sized image"
|
msgid "Small-sized image"
|
||||||
msgstr ""
|
msgstr "Imaxe pequena"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_stock
|
#: model:ir.module.module,shortdesc:base.module_stock
|
||||||
msgid "Warehouse Management"
|
msgid "Warehouse Management"
|
||||||
msgstr ""
|
msgstr "Xestión de almacéns"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.model,name:base.model_res_request_link
|
#: model:ir.model,name:base.model_res_request_link
|
||||||
|
@ -1847,7 +1916,7 @@ msgstr "Accións de Servidor"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_l10n_lu
|
#: model:ir.module.module,shortdesc:base.module_l10n_lu
|
||||||
msgid "Luxembourg - Accounting"
|
msgid "Luxembourg - Accounting"
|
||||||
msgstr ""
|
msgstr "Luxemburgo - Contabilidade"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.country,name:base.tp
|
#: model:res.country,name:base.tp
|
||||||
|
@ -1859,7 +1928,7 @@ msgstr "Timor Leste"
|
||||||
#: view:ir.module.module:0
|
#: view:ir.module.module:0
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Install"
|
msgid "Install"
|
||||||
msgstr ""
|
msgstr "Instalar"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:res.currency,accuracy:0
|
#: field:res.currency,accuracy:0
|
||||||
|
@ -1914,6 +1983,7 @@ msgstr ""
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Unknown value '%s' for boolean field '%%(field)s', assuming '%s'"
|
msgid "Unknown value '%s' for boolean field '%%(field)s', assuming '%s'"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Valor descoñecido '%s' para o campo booleano '%%(field)s', asúmese '%s'"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.country,name:base.nl
|
#: model:res.country,name:base.nl
|
||||||
|
@ -1923,12 +1993,12 @@ msgstr "Holanda"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_portal_event
|
#: model:ir.module.module,shortdesc:base.module_portal_event
|
||||||
msgid "Portal Event"
|
msgid "Portal Event"
|
||||||
msgstr ""
|
msgstr "Evento do portal"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: selection:ir.translation,state:0
|
#: selection:ir.translation,state:0
|
||||||
msgid "Translation in Progress"
|
msgid "Translation in Progress"
|
||||||
msgstr ""
|
msgstr "Traducción en curso"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.model,name:base.model_ir_rule
|
#: model:ir.model,name:base.model_ir_rule
|
||||||
|
@ -1980,7 +2050,7 @@ msgstr ""
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_process
|
#: model:ir.module.module,shortdesc:base.module_process
|
||||||
msgid "Enterprise Process"
|
msgid "Enterprise Process"
|
||||||
msgstr ""
|
msgstr "Proceso da empresa"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:res.partner,supplier:0
|
#: help:res.partner,supplier:0
|
||||||
|
@ -1992,7 +2062,7 @@ msgstr ""
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_hr_evaluation
|
#: model:ir.module.module,shortdesc:base.module_hr_evaluation
|
||||||
msgid "Employee Appraisals"
|
msgid "Employee Appraisals"
|
||||||
msgstr ""
|
msgstr "Evaluación de traballadores"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: selection:ir.actions.server,state:0
|
#: selection:ir.actions.server,state:0
|
||||||
|
@ -13237,7 +13307,7 @@ msgstr "ir.sequence.type"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_l10n_be_hr_payroll_account
|
#: model:ir.module.module,shortdesc:base.module_l10n_be_hr_payroll_account
|
||||||
msgid "Belgium - Payroll with Accounting"
|
msgid "Belgium - Payroll with Accounting"
|
||||||
msgstr ""
|
msgstr "Bélxica - Nóminas con contabilidad"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: selection:base.language.export,format:0
|
#: selection:base.language.export,format:0
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:49+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:32+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:49+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:32+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:49+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:33+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:53+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:36+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
"Language: hr\n"
|
"Language: hr\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
|
@ -25,6 +25,10 @@ msgid ""
|
||||||
"================================================\n"
|
"================================================\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
"Modul za sastavljanje i ispis čekova\n"
|
||||||
|
"============================\n"
|
||||||
|
" "
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.country,name:base.sh
|
#: model:res.country,name:base.sh
|
||||||
|
@ -3189,7 +3193,7 @@ msgstr ""
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:res.company,rml_header1:0
|
#: field:res.company,rml_header1:0
|
||||||
msgid "Company Tagline"
|
msgid "Company Tagline"
|
||||||
msgstr ""
|
msgstr "Slogan tvrtke"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: code:addons/base/res/res_users.py:674
|
#: code:addons/base/res/res_users.py:674
|
||||||
|
@ -12396,7 +12400,7 @@ msgstr "Kontrolne ploče"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_procurement
|
#: model:ir.module.module,shortdesc:base.module_procurement
|
||||||
msgid "Procurements"
|
msgid "Procurements"
|
||||||
msgstr "Nabave"
|
msgstr "Nabava"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.partner.category,name:base.res_partner_category_6
|
#: model:res.partner.category,name:base.res_partner_category_6
|
||||||
|
|
|
@ -7,14 +7,14 @@ msgstr ""
|
||||||
"Project-Id-Version: OpenERP Server 6.0\n"
|
"Project-Id-Version: OpenERP Server 6.0\n"
|
||||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||||
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
|
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
|
||||||
"PO-Revision-Date: 2013-10-15 13:13+0000\n"
|
"PO-Revision-Date: 2013-11-24 14:57+0000\n"
|
||||||
"Last-Translator: tdombos <Unknown>\n"
|
"Last-Translator: krnkris <Unknown>\n"
|
||||||
"Language-Team: Hungarian <openerp-hungarian-team@lists.launchpad.net>\n"
|
"Language-Team: Hungarian <openerp-hungarian-team@lists.launchpad.net>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:49+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:33+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
@ -6162,18 +6162,18 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"\n"
|
"\n"
|
||||||
"Ez a modul hozzáad állapotot, start_dátumot, stop_dátumot a gyártási "
|
"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"
|
||||||
"\n"
|
"\n"
|
||||||
"Állapot: terv, leigazolt, elvégzett, érévnytelenített\n"
|
"Állapot: terv, leigazolt, elvégzett, érvénytelenített\n"
|
||||||
"Ha elvégzett/visszaigazolt, érévnytelenített a gyártási rendelés akkor "
|
"Ha elvégzett/visszaigazolt, érvénytelenített a gyártási rendelés akkor "
|
||||||
"megfelelő állapot sorokat\n"
|
"megfelelő állapot sorokat\n"
|
||||||
"be kell állítani az állapothoz.\n"
|
"be kell állítani az állapothoz.\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Menük létrehozás:\n"
|
"Menük létrehozás:\n"
|
||||||
"-------------\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"
|
"\n"
|
||||||
"Megtalálható a 'Gyártási megrendelések' soraiban a gyártási "
|
"Megtalálható a 'Gyártási megrendelések' soraiban a gyártási "
|
||||||
"megrendeléseknél.\n"
|
"megrendeléseknél.\n"
|
||||||
|
@ -6184,8 +6184,8 @@ msgstr ""
|
||||||
" * start (állítsa be a visszaigazolt állapotot), állítsa be az "
|
" * start (állítsa be a visszaigazolt állapotot), állítsa be az "
|
||||||
"indulási_dátumot\n"
|
"indulási_dátumot\n"
|
||||||
" * stop (állítsa be az elvégzett állapotot), állítsa be a stop_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"
|
" * Tervezetet állít (állítsa be a tervezett állapotot)\n"
|
||||||
" * érévnytelenít (állítsa be az érvénytelenít állapotot)\n"
|
" * érvénytelenít (állítsa be az érvénytelenít állapotot)\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Ha egy gyártási rendelés 'elvégezhetővé' válik, akkor 'visszaigazoltnak' "
|
"Ha egy gyártási rendelés 'elvégezhetővé' válik, akkor 'visszaigazoltnak' "
|
||||||
"kell lennie.\n"
|
"kell lennie.\n"
|
||||||
|
@ -9157,7 +9157,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"\n"
|
"\n"
|
||||||
"Hosszú távú projekt szervezés modul mely nyomon követi a tervezést, "
|
"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"
|
||||||
"\n"
|
"\n"
|
||||||
|
@ -9171,7 +9171,7 @@ msgstr ""
|
||||||
" feladat megadva akkor az összesre terv, nyitott és folyamatban állapot "
|
" feladat megadva akkor az összesre terv, nyitott és folyamatban állapot "
|
||||||
"lesz választva.\n"
|
"lesz választva.\n"
|
||||||
" * Ügy ütemterv számítás: Ez ugyanúgy működik mint az ütemezés gomb a \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"
|
"kiszámítja az összes nyitott,\n"
|
||||||
" tervet és elintézetlen ügyeket.\n"
|
" tervet és elintézetlen ügyeket.\n"
|
||||||
" * Ütemezett ügyek: Minden ügy, mely terv, elintézetlen és nyitott "
|
" * Ütemezett ügyek: Minden ügy, mely terv, elintézetlen és nyitott "
|
||||||
|
@ -11190,7 +11190,7 @@ msgstr ""
|
||||||
"\n"
|
"\n"
|
||||||
"Beállítás:\n"
|
"Beállítás:\n"
|
||||||
"--------------\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"
|
"részletei\n"
|
||||||
"beállítás fülön. Különböző vállalatoknak különböző LDAP szerverei vannak,\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"
|
"amíg egyedi felhasználó nevei vannak (a felhasználó neveknek az OpenERP-ben\n"
|
||||||
|
@ -11286,7 +11286,7 @@ msgstr "Réunion (Francia)"
|
||||||
msgid ""
|
msgid ""
|
||||||
"New column name must still start with x_ , because it is a custom field!"
|
"New column name must still start with x_ , because it is a custom field!"
|
||||||
msgstr ""
|
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
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_mrp_repair
|
#: model:ir.module.module,shortdesc:base.module_mrp_repair
|
||||||
|
@ -13726,7 +13726,7 @@ msgstr "Normál"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_purchase_double_validation
|
#: model:ir.module.module,shortdesc:base.module_purchase_double_validation
|
||||||
msgid "Double Validation on Purchases"
|
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
|
#. module: base
|
||||||
#: field:res.bank,street2:0
|
#: field:res.bank,street2:0
|
||||||
|
@ -14037,8 +14037,8 @@ msgid ""
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"\n"
|
"\n"
|
||||||
"Ez a modul kiegészíti a Raktárház alkalmazást, hatásosan beágyazva a Belökés "
|
"Ez a modul kiegészíti a Raktárépület alkalmazást, hatásosan beágyazva a "
|
||||||
"& Kihúzás raktár folyamatokat.\n"
|
"Belökés & Kihúzás raktár folyamatokat.\n"
|
||||||
"============================================================================="
|
"============================================================================="
|
||||||
"===============================\n"
|
"===============================\n"
|
||||||
"\n"
|
"\n"
|
||||||
|
@ -18275,8 +18275,8 @@ msgstr ""
|
||||||
"Az Elválasztó formátumnak olyannak kell lennie [,n] ahol 0 < n :egység "
|
"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] "
|
"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 "
|
"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 ',' "
|
"lehetővé tenni, hogy a szám 106,50,0 legyen;[3] fogja jelölni mint 106,500. "
|
||||||
"az ezres elválasztó."
|
"Ebben az esetben mindig a ',' az ezres elválasztó."
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.module.module,auto_install:0
|
#: field:ir.module.module,auto_install:0
|
||||||
|
|
|
@ -9,8 +9,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:47+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:29+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:50+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:33+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:50+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:33+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:50+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:33+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:48+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:32+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:50+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:34+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:50+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:34+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:51+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:34+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:51+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:34+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
@ -811,7 +811,7 @@ msgstr "Automatizētas darbības"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_l10n_ro
|
#: model:ir.module.module,shortdesc:base.module_l10n_ro
|
||||||
msgid "Romania - Accounting"
|
msgid "Romania - Accounting"
|
||||||
msgstr ""
|
msgstr "Rumānija - Grāmatvedība"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.model,name:base.model_res_config_settings
|
#: model:ir.model,name:base.model_res_config_settings
|
||||||
|
@ -937,12 +937,12 @@ msgstr ""
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_document_webdav
|
#: model:ir.module.module,shortdesc:base.module_document_webdav
|
||||||
msgid "Shared Repositories (WebDAV)"
|
msgid "Shared Repositories (WebDAV)"
|
||||||
msgstr ""
|
msgstr "Koplietošanas Krātuves (WebDAV)"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:res.users:0
|
#: view:res.users:0
|
||||||
msgid "Email Preferences"
|
msgid "Email Preferences"
|
||||||
msgstr ""
|
msgstr "E-pasta Uzstādījumi"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: code:addons/base/ir/ir_fields.py:195
|
#: code:addons/base/ir/ir_fields.py:195
|
||||||
|
@ -1005,7 +1005,7 @@ msgstr "Omāna"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_mrp
|
#: model:ir.module.module,shortdesc:base.module_mrp
|
||||||
msgid "MRP"
|
msgid "MRP"
|
||||||
msgstr ""
|
msgstr "Ražošana"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_hr_attendance
|
#: model:ir.module.module,description:base.module_hr_attendance
|
||||||
|
@ -2491,7 +2491,7 @@ msgstr "Grupas (ja nav = globāla)"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:ir.module.module:0
|
#: view:ir.module.module:0
|
||||||
msgid "Extra"
|
msgid "Extra"
|
||||||
msgstr ""
|
msgstr "Papildus"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.country,name:base.st
|
#: model:res.country,name:base.st
|
||||||
|
@ -16443,3 +16443,9 @@ msgstr ""
|
||||||
|
|
||||||
#~ msgid "Administration Dashboard"
|
#~ msgid "Administration Dashboard"
|
||||||
#~ msgstr "Administrēšanas instrumentu panelis"
|
#~ msgstr "Administrēšanas instrumentu panelis"
|
||||||
|
|
||||||
|
#~ msgid "Process"
|
||||||
|
#~ msgstr "Apstrādāt"
|
||||||
|
|
||||||
|
#~ msgid "Website of Partner."
|
||||||
|
#~ msgstr "Partnera Vietne"
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:51+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:34+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:51+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:34+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:51+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:35+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:56+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:39+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:52+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:35+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -9,13 +9,13 @@ msgstr ""
|
||||||
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
|
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
|
||||||
"PO-Revision-Date: 2012-12-16 22:18+0000\n"
|
"PO-Revision-Date: 2012-12-16 22:18+0000\n"
|
||||||
"Last-Translator: Fábio Martinelli - http://zupy.com.br "
|
"Last-Translator: Fábio Martinelli - http://zupy.com.br "
|
||||||
"<webmaster@guaru.net>\n"
|
"<webmaster@zupy.com.br>\n"
|
||||||
"Language-Team: <pt@li.org>\n"
|
"Language-Team: <pt@li.org>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:55+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:38+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:52+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:35+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
@ -211,14 +211,14 @@ msgid ""
|
||||||
"reports."
|
"reports."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"\n"
|
"\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"
|
||||||
"\n"
|
"\n"
|
||||||
"Modul pentru generarea facturilor pe baza costurilor (resurse umane, "
|
"Modul pentru generarea facturilor pe baza costurilor (resurse umane, "
|
||||||
"cheltuieli, ...).\n"
|
"cheltuieli, ...).\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Puteti defini liste de preturi in contul analitic, puteti face unele raporte "
|
"Puteți defini liste de preturi în contul analitic, puteți face unele "
|
||||||
"teoretice\n"
|
"rapoarte teoretice\n"
|
||||||
"ale veniturilor."
|
"ale veniturilor."
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
|
@ -236,8 +236,8 @@ msgid ""
|
||||||
"Properties of base fields cannot be altered in this manner! Please modify "
|
"Properties of base fields cannot be altered in this manner! Please modify "
|
||||||
"them through Python code, preferably through a custom addon!"
|
"them through Python code, preferably through a custom addon!"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Proprietatile campurilor principale nu pot fi modificate in acest mod! Va "
|
"Proprietățile câmpurilor principale nu pot fi modificate în acest mod! Vă "
|
||||||
"rugam sa le modificati prin codul Python, preferabil printr-un addon "
|
"rugăm sa le modificați prin codul Python, preferabil printr-un addon "
|
||||||
"personalizat!"
|
"personalizat!"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
|
@ -333,12 +333,12 @@ msgstr ""
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:res.partner:0
|
#: view:res.partner:0
|
||||||
msgid "Search Partner"
|
msgid "Search Partner"
|
||||||
msgstr "Cauta Partener"
|
msgstr "Caută Partener"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.module.category,module_nr:0
|
#: field:ir.module.category,module_nr:0
|
||||||
msgid "Number of Modules"
|
msgid "Number of Modules"
|
||||||
msgstr "Numar de Module"
|
msgstr "Număr de module"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:multi_company.default,company_dest_id:0
|
#: help:multi_company.default,company_dest_id:0
|
||||||
|
@ -348,7 +348,7 @@ msgstr "Compania unde se pastreaza înregistrarea actuală"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:res.partner.bank.type.field,size:0
|
#: field:res.partner.bank.type.field,size:0
|
||||||
msgid "Max. Size"
|
msgid "Max. Size"
|
||||||
msgstr "Dimensiunea maxima"
|
msgstr "Dimensiunea maximă"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:ir.actions.act_window,res_id:0
|
#: help:ir.actions.act_window,res_id:0
|
||||||
|
@ -451,7 +451,7 @@ msgstr ""
|
||||||
#: code:addons/orm.py:2649
|
#: code:addons/orm.py:2649
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Invalid group_by"
|
msgid "Invalid group_by"
|
||||||
msgstr "Grup invalid_dupa"
|
msgstr "Grupare_După invalidă"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.module.category,child_ids:0
|
#: field:ir.module.category,child_ids:0
|
||||||
|
@ -499,7 +499,7 @@ msgstr "Configurare pași asistent"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.model,name:base.model_ir_ui_view_sc
|
#: model:ir.model,name:base.model_ir_ui_view_sc
|
||||||
msgid "ir.ui.view_sc"
|
msgid "ir.ui.view_sc"
|
||||||
msgstr "ir.ui.vizualizare_sc"
|
msgstr "ir.ui.view_sc"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:ir.model.access:0
|
#: view:ir.model.access:0
|
||||||
|
@ -1289,7 +1289,7 @@ msgstr "Principatul Andorra"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.rule,perm_read:0
|
#: field:ir.rule,perm_read:0
|
||||||
msgid "Apply for Read"
|
msgid "Apply for Read"
|
||||||
msgstr "Se aplică pentru Citit"
|
msgstr "Se aplică pentru citire"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.country,name:base.mn
|
#: model:res.country,name:base.mn
|
||||||
|
@ -2204,7 +2204,7 @@ msgstr "Timorul de Est"
|
||||||
#: view:ir.module.module:0
|
#: view:ir.module.module:0
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Install"
|
msgid "Install"
|
||||||
msgstr "Instalează"
|
msgstr "Instalați"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:res.currency,accuracy:0
|
#: field:res.currency,accuracy:0
|
||||||
|
@ -2704,7 +2704,7 @@ msgstr "Bahamas"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.rule,perm_create:0
|
#: field:ir.rule,perm_create:0
|
||||||
msgid "Apply for Create"
|
msgid "Apply for Create"
|
||||||
msgstr "Aplică pentru Creare"
|
msgstr "Aplică pentru creare"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.category,name:base.module_category_tools
|
#: model:ir.module.category,name:base.module_category_tools
|
||||||
|
@ -3310,7 +3310,7 @@ msgstr "Raport RML"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.ui.menu,name:base.menu_translation_export
|
#: model:ir.ui.menu,name:base.menu_translation_export
|
||||||
msgid "Import / Export"
|
msgid "Import / Export"
|
||||||
msgstr "Import / Export"
|
msgstr "Importați / Exportați"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_sale
|
#: model:ir.module.module,description:base.module_sale
|
||||||
|
@ -3479,7 +3479,7 @@ msgstr "Letonia"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:ir.actions.server:0
|
#: view:ir.actions.server:0
|
||||||
msgid "Field Mappings"
|
msgid "Field Mappings"
|
||||||
msgstr "Aplicatii Camp"
|
msgstr "Corespondențe câmp"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:base.language.export:0
|
#: view:base.language.export:0
|
||||||
|
@ -4557,7 +4557,7 @@ msgstr "Persoane"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:base.language.import:0
|
#: view:base.language.import:0
|
||||||
msgid "_Import"
|
msgid "_Import"
|
||||||
msgstr "_Importă"
|
msgstr "_Importați"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:res.users,action_id:0
|
#: field:res.users,action_id:0
|
||||||
|
@ -6122,7 +6122,7 @@ msgstr "Asistenta IT"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.category,name:base.module_category_specific_industry_applications
|
#: model:ir.module.category,name:base.module_category_specific_industry_applications
|
||||||
msgid "Specific Industry Applications"
|
msgid "Specific Industry Applications"
|
||||||
msgstr "Aplicatii Specifice Industriei"
|
msgstr "Aplicații Specifice Industriei"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_google_docs
|
#: model:ir.module.module,shortdesc:base.module_google_docs
|
||||||
|
@ -6340,7 +6340,7 @@ msgstr "Nu poate fi cautat"
|
||||||
#: view:ir.config_parameter:0
|
#: view:ir.config_parameter:0
|
||||||
#: field:ir.config_parameter,key:0
|
#: field:ir.config_parameter,key:0
|
||||||
msgid "Key"
|
msgid "Key"
|
||||||
msgstr "Tastă"
|
msgstr "Cheie"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:res.company,rml_header:0
|
#: field:res.company,rml_header:0
|
||||||
|
@ -7050,7 +7050,7 @@ msgstr "ir.actions.act_url"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.ui.menu,name:base.menu_translation_app
|
#: model:ir.ui.menu,name:base.menu_translation_app
|
||||||
msgid "Application Terms"
|
msgid "Application Terms"
|
||||||
msgstr "Termeni aplicație"
|
msgstr "Termenii aplicației"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.actions.act_window,help:base.open_module_tree
|
#: model:ir.actions.act_window,help:base.open_module_tree
|
||||||
|
@ -9347,7 +9347,7 @@ msgstr "Burundi"
|
||||||
#: view:base.module.configuration:0
|
#: view:base.module.configuration:0
|
||||||
#: view:base.module.update:0
|
#: view:base.module.update:0
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "Inchide"
|
msgstr "Închideți"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: selection:base.language.install,lang:0
|
#: selection:base.language.install,lang:0
|
||||||
|
@ -9570,7 +9570,7 @@ msgstr "Chineza (CN) / 简体中文"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.model.fields,selection:0
|
#: field:ir.model.fields,selection:0
|
||||||
msgid "Selection Options"
|
msgid "Selection Options"
|
||||||
msgstr "Optiuni de selectie"
|
msgstr "Opțiuni de selecție"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:res.bank,street:0
|
#: field:res.bank,street:0
|
||||||
|
@ -9847,13 +9847,13 @@ msgid ""
|
||||||
" </p>\n"
|
" </p>\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"<p clasa=\"oe_vizualizare_niciuncontinut_creeaza\">\n"
|
"<p clasa=\"oe_view_nocontent_create\">\n"
|
||||||
" Faceti click pentru a adauga un contact in agenda "
|
" Faceți clic pentru a adaugă un contact în agenda "
|
||||||
"dumneavoastra.\n"
|
"dumneavoastră.\n"
|
||||||
" </p><p>\n"
|
" </p><p>\n"
|
||||||
" OpenERP va ajuta sa tineti evidenta cu usurinta a tuturor "
|
" OpenERP vă ajută să țineți evidența cu ușurință a tuturor "
|
||||||
"activitatilor legate de\n"
|
"activităților legate de\n"
|
||||||
" un client: discutii, istoricul oportunitatilor de afaceri,\n"
|
" un client: discuții, istoricul oportunităților de afaceri,\n"
|
||||||
" documente, etc.\n"
|
" documente, etc.\n"
|
||||||
" </p>\n"
|
" </p>\n"
|
||||||
" "
|
" "
|
||||||
|
@ -10656,8 +10656,8 @@ msgid ""
|
||||||
"If the selected language is loaded in the system, all documents related to "
|
"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."
|
"this contact will be printed in this language. If not, it will be English."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Daca limba selectata este incarcata in sistem, toate documentele asociate "
|
"Dacă limba selectata este încărcata în sistem, toate documentele asociate "
|
||||||
"acestui contact vor fi tiparite in aceasta limba. Daca nu, limba va fi "
|
"acestui contact vor fi tipărite în aceasta limba. Dacă nu, limba va fi "
|
||||||
"engleza."
|
"engleza."
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
|
@ -10828,7 +10828,7 @@ msgstr ""
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.actions.report.xml,attachment_use:0
|
#: field:ir.actions.report.xml,attachment_use:0
|
||||||
msgid "Reload from Attachment"
|
msgid "Reload from Attachment"
|
||||||
msgstr "Reincarcati din Atasament"
|
msgstr "Reîncarcați din Atașament"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.country,name:base.mx
|
#: model:res.country,name:base.mx
|
||||||
|
@ -10982,7 +10982,7 @@ msgstr "ID-ul vizualizarii definita in fisierul xml"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.model,name:base.model_base_module_import
|
#: model:ir.model,name:base.model_base_module_import
|
||||||
msgid "Import Module"
|
msgid "Import Module"
|
||||||
msgstr "Importati Modulul"
|
msgstr "Importați Modulul"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.country,name:base.as
|
#: model:res.country,name:base.as
|
||||||
|
@ -11632,7 +11632,7 @@ msgstr "efectuat"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:ir.actions.act_window:0
|
#: view:ir.actions.act_window:0
|
||||||
msgid "General Settings"
|
msgid "General Settings"
|
||||||
msgstr "Configurari generale"
|
msgstr "Configurări generale"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_l10n_in
|
#: 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
|
#: model:ir.actions.act_window,name:base.action_view_base_module_upgrade
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Apply Schedule Upgrade"
|
msgid "Apply Schedule Upgrade"
|
||||||
msgstr "Aplica Programeaza Actualizarea"
|
msgstr "Aplică actualizările planificate"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:workflow.activity:0
|
#: view:workflow.activity:0
|
||||||
|
@ -13444,7 +13444,7 @@ msgstr ""
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:base.module.import:0
|
#: view:base.module.import:0
|
||||||
msgid "Import module"
|
msgid "Import module"
|
||||||
msgstr "Importati modulul"
|
msgstr "Importați modulul"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.actions.server,loop_action:0
|
#: 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 "
|
"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."
|
"specific access to the applications they need to use in the system."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Creati si gestionati utilizatori care se vor conecta la sistem. Utilizatorii "
|
"Creați și gestionați utilizatori care se vor conecta la sistem. Utilizatorii "
|
||||||
"pot fi dezactivati in caz ca exista o perioada de timp in care ei nu se "
|
"pot fi dezactivați în caz că există o perioada de timp în care ei nu se "
|
||||||
"conecteaza la sistem. Le puteti atribui grupuri pentru a le da acces "
|
"conectează la sistem. Le puteți atribui grupuri pentru a le da acces "
|
||||||
"specific la aplicatiile de care ei au nevoie in sistem."
|
"specific la aplicațiile de care ei au nevoie în sistem."
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: selection:res.request,priority:0
|
#: selection:res.request,priority:0
|
||||||
|
@ -13856,7 +13856,7 @@ msgstr "Declansati Configurarea"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:base.language.install:0
|
#: view:base.language.install:0
|
||||||
msgid "Load"
|
msgid "Load"
|
||||||
msgstr "Incarca"
|
msgstr "Încărcați"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_warning
|
#: 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_config
|
||||||
#: model:ir.ui.menu,name:base.menu_mrp_root
|
#: model:ir.ui.menu,name:base.menu_mrp_root
|
||||||
msgid "Manufacturing"
|
msgid "Manufacturing"
|
||||||
msgstr "Fabricatie"
|
msgstr "Fabricație"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.country,name:base.km
|
#: 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.actions.act_window,name:base.action_view_base_import_language
|
||||||
#: model:ir.ui.menu,name:base.menu_view_base_import_language
|
#: model:ir.ui.menu,name:base.menu_view_base_import_language
|
||||||
msgid "Import Translation"
|
msgid "Import Translation"
|
||||||
msgstr "Importati Traducerea"
|
msgstr "Importați Traducerea"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:ir.module.module:0
|
#: view:ir.module.module:0
|
||||||
|
@ -15470,7 +15470,7 @@ msgstr "Grecia"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:res.config:0
|
#: view:res.config:0
|
||||||
msgid "Apply"
|
msgid "Apply"
|
||||||
msgstr "Aplicati"
|
msgstr "Aplicați"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:res.request,trigger_date:0
|
#: field:res.request,trigger_date:0
|
||||||
|
@ -17452,7 +17452,7 @@ msgstr "Helpdesk (Serviciu de asistenta tehnica)"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.rule,perm_write:0
|
#: field:ir.rule,perm_write:0
|
||||||
msgid "Apply for Write"
|
msgid "Apply for Write"
|
||||||
msgstr "Aplica pentru Scriere"
|
msgstr "Aplicați pentru scriere"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.ui.menu,parent_left:0
|
#: field:ir.ui.menu,parent_left:0
|
||||||
|
@ -17558,7 +17558,7 @@ msgstr "Vizualizare :"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.model.fields,view_load:0
|
#: field:ir.model.fields,view_load:0
|
||||||
msgid "View Auto-Load"
|
msgid "View Auto-Load"
|
||||||
msgstr "Vizualizare Incarcare Automata"
|
msgstr "Vizualizare încarcare automată"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_l10n_et
|
#: model:ir.module.module,description:base.module_l10n_et
|
||||||
|
@ -17607,7 +17607,7 @@ msgstr "Fisier Pictograma Web"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.ui.menu,name:base.menu_view_base_module_upgrade
|
#: model:ir.ui.menu,name:base.menu_view_base_module_upgrade
|
||||||
msgid "Apply Scheduled Upgrades"
|
msgid "Apply Scheduled Upgrades"
|
||||||
msgstr "Aplica Actualizarile Planificate"
|
msgstr "Aplică actualizările planificate"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_sale_journal
|
#: 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.actions.client,name:base.modules_updates_act_cl
|
||||||
#: model:ir.ui.menu,name:base.menu_module_updates
|
#: model:ir.ui.menu,name:base.menu_module_updates
|
||||||
msgid "Updates"
|
msgid "Updates"
|
||||||
msgstr "Actualizari"
|
msgstr "Actualizări"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:res.currency,rate:0
|
#: help:res.currency,rate:0
|
||||||
|
@ -18875,7 +18875,7 @@ msgid ""
|
||||||
"Helps you manage your manufacturing processes and generate reports on those "
|
"Helps you manage your manufacturing processes and generate reports on those "
|
||||||
"processes."
|
"processes."
|
||||||
msgstr ""
|
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."
|
"pentru aceste procese."
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
|
@ -19030,13 +19030,13 @@ msgid ""
|
||||||
" </p>\n"
|
" </p>\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"<clasa p=\"oe_vizualizare_niciuncontinut_creeaza\">\n"
|
"<p clasa=\"oe_view_nocontent_create\">\n"
|
||||||
" Faceti click pentru a adauga un contact in agenda "
|
" Faceți clic pentru a adaugă un contact în agenda "
|
||||||
"dumneavoastra.\n"
|
"dumneavoastră.\n"
|
||||||
" </p><p>\n"
|
" </p><p>\n"
|
||||||
" OpenERP va ajuta sa tineti evidenta cu usurinta a tuturor "
|
" OpenERP vă ajută să țineți evidența cu ușurință a tuturor "
|
||||||
"activitatilor asociate unui\n"
|
"activităților legate de\n"
|
||||||
" client; discutii, istoricul oportunitatilor de afaceri,\n"
|
" un client: discuții, istoricul oportunităților de afaceri,\n"
|
||||||
" documente, etc.\n"
|
" documente, etc.\n"
|
||||||
" </p>\n"
|
" </p>\n"
|
||||||
" "
|
" "
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:52+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:35+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
@ -307,6 +307,13 @@ msgid ""
|
||||||
"\n"
|
"\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
"Чилийский бухгалтерский учет и налоги в соответствии с действующими "
|
||||||
|
"положениями\n"
|
||||||
|
"==============================================\n"
|
||||||
|
"Plan contable chileno e impuestos de acuerdo a disposiciones vigentes\n"
|
||||||
|
"\n"
|
||||||
|
" "
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_sale
|
#: 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 "
|
"There is already a shared filter set as default for %(model)s, delete or "
|
||||||
"change it before setting a new default"
|
"change it before setting a new default"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Уже существует общий фильтр по умолчанию для %(model)s, удалите или измените "
|
||||||
|
"его прежде чем устанавливать новый по умолчанию"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: code:addons/orm.py:2649
|
#: code:addons/orm.py:2649
|
||||||
|
@ -597,6 +606,15 @@ msgid ""
|
||||||
"that have no counterpart in the general financial accounts.\n"
|
"that have no counterpart in the general financial accounts.\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
"Модуль для определения объекта аналитического учета.\n"
|
||||||
|
"===============================================\n"
|
||||||
|
"\n"
|
||||||
|
"В OpenERP, аналитические счета связаны с общими счетами, но рассматриваются\n"
|
||||||
|
"полностью независимо. Таким образом, вы можете ввести различные "
|
||||||
|
"аналитические операции\n"
|
||||||
|
"которые не дублируются в общие финансовые счета.\n"
|
||||||
|
" "
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_idea
|
#: model:ir.module.module,shortdesc:base.module_idea
|
||||||
|
@ -620,6 +638,19 @@ msgid ""
|
||||||
"* Use emails to automatically confirm and send acknowledgements for any "
|
"* Use emails to automatically confirm and send acknowledgements for any "
|
||||||
"event registration\n"
|
"event registration\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
"Организация и управление событиями.\n"
|
||||||
|
"======================================\n"
|
||||||
|
"\n"
|
||||||
|
"Модуль мероприятий позволяет Вам эффективно организовывать события и все "
|
||||||
|
"задачи связанные с: планификацией, регистрацией отслеживания,\n"
|
||||||
|
"посещаемостью, и т.д.\n"
|
||||||
|
"\n"
|
||||||
|
"Основные характеристики\n"
|
||||||
|
"------------\n"
|
||||||
|
"* Управление своими Мероприятиями и Регистрациями\n"
|
||||||
|
"* Использовать электронную почту для автоматического подтверждения и "
|
||||||
|
"отправлять подтверждения для регистрации любого события\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: selection:base.language.install,lang:0
|
#: selection:base.language.install,lang:0
|
||||||
|
@ -877,7 +908,7 @@ msgstr "Иордания"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_l10n_hr
|
#: model:ir.module.module,shortdesc:base.module_l10n_hr
|
||||||
msgid "Croatia - RRIF 2012 COA"
|
msgid "Croatia - RRIF 2012 COA"
|
||||||
msgstr ""
|
msgstr "Хорватия - RRIF 2012 COA"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:ir.cron,nextcall:0
|
#: help:ir.cron,nextcall:0
|
||||||
|
@ -2534,6 +2565,10 @@ msgid ""
|
||||||
"=================================\n"
|
"=================================\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
"Позволить неавторизованным пользователям доступ к Порталу.\n"
|
||||||
|
"=================================\n"
|
||||||
|
" "
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.country,name:base.ge
|
#: model:res.country,name:base.ge
|
||||||
|
@ -2712,6 +2747,25 @@ msgid ""
|
||||||
"Print product labels with barcode.\n"
|
"Print product labels with barcode.\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
"Это базовый модуль для управления продуктами и прайс-листами в OpenERP.\n"
|
||||||
|
"========================================================================\n"
|
||||||
|
"\n"
|
||||||
|
"Продукты поддерживают варианты, различные методы ценообразования, информацию "
|
||||||
|
"о поставщиках,\n"
|
||||||
|
"производство в запас / подзаказ, различные единицы мер, упаковки и свойств.\n"
|
||||||
|
"Прайс-листы поддерживают:\n"
|
||||||
|
"--------------------\n"
|
||||||
|
" * Многоуровневые скидки (по продуктам, категориям, количеству)\n"
|
||||||
|
" * Расчет базовой цены по различным критериям:\n"
|
||||||
|
" * другим прайс-листам\n"
|
||||||
|
" * себестоимости\n"
|
||||||
|
" * рыночной цене\n"
|
||||||
|
" * цене поставщиков\n"
|
||||||
|
"\n"
|
||||||
|
"Прайс-листы по продуктам или партнерам.\n"
|
||||||
|
"Печать этикеток с штрих-кодом.\n"
|
||||||
|
" "
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_analytic_default
|
#: model:ir.module.module,description:base.module_account_analytic_default
|
||||||
|
@ -2869,6 +2923,17 @@ msgid ""
|
||||||
" * Files by Partner (graph)\n"
|
" * Files by Partner (graph)\n"
|
||||||
" * Files Size by Month (graph)\n"
|
" * Files Size by Month (graph)\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
"Система управления документооборотом.\n"
|
||||||
|
"==============================================\n"
|
||||||
|
" * Авторизация пользователей\n"
|
||||||
|
" * Индексация документов: файлы .pptx и .docx не поддерживаются в ОС "
|
||||||
|
"Windows\n"
|
||||||
|
" * Панель инструментов для документов, которая включает:\n"
|
||||||
|
" * Новые файлы (список)\n"
|
||||||
|
" * Файлы по типу (график)\n"
|
||||||
|
" * Файлы по партнерам (график)\n"
|
||||||
|
" * Размеры файлов по месяцам (график)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:ir.actions.report.xml:0
|
#: view:ir.actions.report.xml:0
|
||||||
|
@ -2918,6 +2983,40 @@ msgid ""
|
||||||
"* Monthly Turnover (Graph)\n"
|
"* Monthly Turnover (Graph)\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
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
|
#. module: base
|
||||||
#: field:ir.actions.act_window,res_id:0
|
#: 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"
|
"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"
|
"will disable LDAP authentication completely if installed at the same time.\n"
|
||||||
msgstr ""
|
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
|
#. module: base
|
||||||
#: model:res.groups,name:base.group_hr_manager
|
#: model:res.groups,name:base.group_hr_manager
|
||||||
|
@ -3205,6 +3312,15 @@ msgid ""
|
||||||
" * ``base_stage``: stage management\n"
|
" * ``base_stage``: stage management\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
"Этот модуль обрабатывает состояния и стадии. Он является производным от "
|
||||||
|
"классов crm_base и crm_case для crm. \n"
|
||||||
|
"============================================================================="
|
||||||
|
"======================\n"
|
||||||
|
"\n"
|
||||||
|
" * ``base_state``: управление состояниями \n"
|
||||||
|
" * ``base_stage``: управление стадиями\n"
|
||||||
|
" "
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_web_linkedin
|
#: model:ir.module.module,shortdesc:base.module_web_linkedin
|
||||||
|
@ -7907,7 +8023,7 @@ msgstr "Следующее число в этой нумерации"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:res.partner:0
|
#: view:res.partner:0
|
||||||
msgid "at"
|
msgid "at"
|
||||||
msgstr ""
|
msgstr "в"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:ir.rule:0
|
#: view:ir.rule:0
|
||||||
|
@ -8227,7 +8343,7 @@ msgstr "Финансовый и аналитический учет"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_portal_project
|
#: model:ir.module.module,shortdesc:base.module_portal_project
|
||||||
msgid "Portal Project"
|
msgid "Portal Project"
|
||||||
msgstr ""
|
msgstr "Портал: проекты"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.country,name:base.cc
|
#: model:res.country,name:base.cc
|
||||||
|
@ -8519,7 +8635,7 @@ msgstr "Действия клиента"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:res.partner.bank.type,field_ids:0
|
#: field:res.partner.bank.type,field_ids:0
|
||||||
msgid "Type Fields"
|
msgid "Type Fields"
|
||||||
msgstr ""
|
msgstr "Тип поля"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,summary:base.module_hr_recruitment
|
#: model:ir.module.module,summary:base.module_hr_recruitment
|
||||||
|
@ -8744,7 +8860,7 @@ msgstr "Гонконг"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_portal_sale
|
#: model:ir.module.module,shortdesc:base.module_portal_sale
|
||||||
msgid "Portal Sale"
|
msgid "Portal Sale"
|
||||||
msgstr ""
|
msgstr "Портал: продажи"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.default,ref_id:0
|
#: field:ir.default,ref_id:0
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:53+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:36+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:53+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:36+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:46+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:29+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:52+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:36+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:57+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:40+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:53+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:37+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:53+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:37+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:54+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:37+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:54+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:37+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:54+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:37+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:54+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:37+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:54+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:38+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:56+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:40+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
@ -11642,7 +11642,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"\n"
|
"\n"
|
||||||
"模块提供事件变更警告。\n"
|
"模块提供事件变更警告。\n"
|
||||||
" ==============================================\n"
|
"==============================================\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Warning messages can be displayed for objects like sale order, purchase "
|
"Warning messages can be displayed for objects like sale order, purchase "
|
||||||
"order,\n"
|
"order,\n"
|
||||||
|
|
|
@ -14,8 +14,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:54+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:38+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
|
|
@ -13,8 +13,8 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-11-02 05:56+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-03 05:39+0000\n"
|
||||||
"X-Generator: Launchpad (build 16820)\n"
|
"X-Generator: Launchpad (build 16856)\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_account_check_writing
|
#: model:ir.module.module,description:base.module_account_check_writing
|
||||||
|
@ -50,7 +50,7 @@ msgstr "日期時間"
|
||||||
msgid ""
|
msgid ""
|
||||||
"The second argument of the many2many field %s must be a SQL table !You used "
|
"The second argument of the many2many field %s must be a SQL table !You used "
|
||||||
"%s, which is not a valid SQL table name."
|
"%s, which is not a valid SQL table name."
|
||||||
msgstr "「多對多(many2many)」欄位 %s 之第二個引數須為 SQL 表格!您用了並非有效 SQL 表格名稱之 %s。"
|
msgstr "「多對多(many2many)」欄位 %s 之第二個引數須為 SQL 表格!您輸入的 %s 並非有效 SQL 表格名稱。"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.ui.view,arch:0
|
#: field:ir.ui.view,arch:0
|
||||||
|
@ -61,7 +61,7 @@ msgstr "檢視架構"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,summary:base.module_sale_stock
|
#: model:ir.module.module,summary:base.module_sale_stock
|
||||||
msgid "Quotation, Sale Orders, Delivery & Invoicing Control"
|
msgid "Quotation, Sale Orders, Delivery & Invoicing Control"
|
||||||
msgstr "報價, 銷售訂單, 交貨及發票管理"
|
msgstr "報價單, 銷貨單, 發貨及發票管理"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: selection:ir.sequence,implementation:0
|
#: selection:ir.sequence,implementation:0
|
||||||
|
@ -88,7 +88,7 @@ msgstr "幫助你管理專案,追蹤任務,生成計劃"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,summary:base.module_point_of_sale
|
#: model:ir.module.module,summary:base.module_point_of_sale
|
||||||
msgid "Touchscreen Interface for Shops"
|
msgid "Touchscreen Interface for Shops"
|
||||||
msgstr "商店觸控螢幕界面"
|
msgstr "店面用觸控螢幕界面"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
|
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
|
||||||
|
@ -122,15 +122,15 @@ msgid ""
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"\n"
|
"\n"
|
||||||
"在產品表格中加入製造商及屬性之模組\n"
|
"此模組在產品表單中加入製造商及屬性\n"
|
||||||
"====================================================================\n"
|
"====================================================================\n"
|
||||||
"\n"
|
"\n"
|
||||||
"您可以對一件產品做以下定義:\n"
|
"您可以對產品定義以下內容:\n"
|
||||||
"-----------------------------------------------\n"
|
"-----------------------------------------------\n"
|
||||||
" * 製造商\n"
|
" * 製造商\n"
|
||||||
" * 製造商的產品名稱\n"
|
" * 製造商的產品名稱\n"
|
||||||
" * 製造商的產品代碼\n"
|
" * 製造商的產品代碼\n"
|
||||||
" * 產品性質\n"
|
" * 產品屬性\n"
|
||||||
" "
|
" "
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
|
@ -145,11 +145,14 @@ msgid ""
|
||||||
"The module adds google user in res user.\n"
|
"The module adds google user in res user.\n"
|
||||||
"========================================\n"
|
"========================================\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
"此模組將 Google 使用者加到 res user 中。\n"
|
||||||
|
"========================================\n"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:res.partner,employee:0
|
#: help:res.partner,employee:0
|
||||||
msgid "Check this box if this contact is an Employee."
|
msgid "Check this box if this contact is an Employee."
|
||||||
msgstr "如果聯絡人是員工則請勾選"
|
msgstr "如果聯絡人是員工則請勾選此項"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:ir.model.fields,domain:0
|
#: help:ir.model.fields,domain:0
|
||||||
|
@ -232,7 +235,7 @@ msgstr "ir.ui.view.custom"
|
||||||
#: code:addons/base/ir/ir_model.py:374
|
#: code:addons/base/ir/ir_model.py:374
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Renaming sparse field \"%s\" is not allowed"
|
msgid "Renaming sparse field \"%s\" is not allowed"
|
||||||
msgstr ""
|
msgstr "不允許重新命名稀疏欄位「%s」"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.country,name:base.sz
|
#: model:res.country,name:base.sz
|
||||||
|
@ -286,6 +289,12 @@ msgid ""
|
||||||
"\n"
|
"\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"\n"
|
||||||
|
"智利會計科目及稅務在地化。\n"
|
||||||
|
"==============================================\n"
|
||||||
|
"Plan contable chileno e impuestos de acuerdo a disposiciones vigentes\n"
|
||||||
|
"\n"
|
||||||
|
" "
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_sale
|
#: model:ir.module.module,shortdesc:base.module_sale
|
||||||
|
@ -324,7 +333,7 @@ msgstr "最大尺寸"
|
||||||
msgid ""
|
msgid ""
|
||||||
"Database ID of record to open in form view, when ``view_mode`` is set to "
|
"Database ID of record to open in form view, when ``view_mode`` is set to "
|
||||||
"'form' only"
|
"'form' only"
|
||||||
msgstr ""
|
msgstr "當「檢視模式」僅設為「表單」時,將開啟的紀錄的資料庫 ID"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:ir.values,key2:0
|
#: help:ir.values,key2:0
|
||||||
|
@ -389,7 +398,7 @@ msgstr ""
|
||||||
msgid ""
|
msgid ""
|
||||||
"There is already a shared filter set as default for %(model)s, delete or "
|
"There is already a shared filter set as default for %(model)s, delete or "
|
||||||
"change it before setting a new default"
|
"change it before setting a new default"
|
||||||
msgstr ""
|
msgstr "已有一共享的過濾器被設為 %(model)s 的預設過濾器。要設定新的預設過濾器前,請先修改或刪除原有預設過濾器。"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: code:addons/orm.py:2649
|
#: code:addons/orm.py:2649
|
||||||
|
@ -465,7 +474,7 @@ msgstr "所指定為無效的日期/時間格式指示。請參照當您編寫
|
||||||
msgid ""
|
msgid ""
|
||||||
"One of the records you are trying to modify has already been deleted "
|
"One of the records you are trying to modify has already been deleted "
|
||||||
"(Document type: %s)."
|
"(Document type: %s)."
|
||||||
msgstr ""
|
msgstr "您要修改的紀錄已被刪除(文件類型: %s)。"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:ir.actions.act_window,views:0
|
#: help:ir.actions.act_window,views:0
|
||||||
|
@ -691,7 +700,7 @@ msgstr "自訂欄位名稱開頭必須是 'x_' !"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_l10n_mx
|
#: model:ir.module.module,shortdesc:base.module_l10n_mx
|
||||||
msgid "Mexico - Accounting"
|
msgid "Mexico - Accounting"
|
||||||
msgstr ""
|
msgstr "墨西哥 - 會計"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: help:ir.actions.server,action_id:0
|
#: help:ir.actions.server,action_id:0
|
||||||
|
@ -847,7 +856,7 @@ msgstr "自動化動作"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_l10n_ro
|
#: model:ir.module.module,shortdesc:base.module_l10n_ro
|
||||||
msgid "Romania - Accounting"
|
msgid "Romania - Accounting"
|
||||||
msgstr ""
|
msgstr "羅馬尼亞 - 會計"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.model,name:base.model_res_config_settings
|
#: model:ir.model,name:base.model_res_config_settings
|
||||||
|
@ -970,7 +979,7 @@ msgstr "報表類型,如 pdf, html, raw, sxw, odt, html2html, mako2html, ..."
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_document_webdav
|
#: model:ir.module.module,shortdesc:base.module_document_webdav
|
||||||
msgid "Shared Repositories (WebDAV)"
|
msgid "Shared Repositories (WebDAV)"
|
||||||
msgstr ""
|
msgstr "共享的儲存庫(WebDAV)"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:res.users:0
|
#: view:res.users:0
|
||||||
|
@ -997,7 +1006,7 @@ msgstr "辛巴威"
|
||||||
#: help:ir.model.constraint,type:0
|
#: help:ir.model.constraint,type:0
|
||||||
msgid ""
|
msgid ""
|
||||||
"Type of the constraint: `f` for a foreign key, `u` for other constraints."
|
"Type of the constraint: `f` for a foreign key, `u` for other constraints."
|
||||||
msgstr ""
|
msgstr "限制條件類型:「f」為 foreign key ,「u」代表其他限制條件。"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:ir.actions.report.xml:0
|
#: view:ir.actions.report.xml:0
|
||||||
|
@ -1092,7 +1101,7 @@ msgstr "請求參考類型"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_google_base_account
|
#: model:ir.module.module,shortdesc:base.module_google_base_account
|
||||||
msgid "Google Users"
|
msgid "Google Users"
|
||||||
msgstr ""
|
msgstr "Google 使用者"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_fleet
|
#: model:ir.module.module,shortdesc:base.module_fleet
|
||||||
|
@ -1260,6 +1269,8 @@ msgid ""
|
||||||
"Language with code \"%s\" is not defined in your system !\n"
|
"Language with code \"%s\" is not defined in your system !\n"
|
||||||
"Define it through the Administration menu."
|
"Define it through the Administration menu."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"您的系統中尚未定義語言代碼為「 %s 」的語言! \n"
|
||||||
|
"請於管理者介面中定義。"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:res.country,name:base.gu
|
#: model:res.country,name:base.gu
|
||||||
|
@ -1269,7 +1280,7 @@ msgstr "關島(美屬)"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: sql_constraint:res.country:0
|
#: sql_constraint:res.country:0
|
||||||
msgid "The name of the country must be unique !"
|
msgid "The name of the country must be unique !"
|
||||||
msgstr ""
|
msgstr "國家名稱必須為獨一無二的!"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.module.module,installed_version:0
|
#: field:ir.module.module,installed_version:0
|
||||||
|
@ -1406,7 +1417,7 @@ msgid ""
|
||||||
"suitable\n"
|
"suitable\n"
|
||||||
" for uploading to OpenERP's translation "
|
" for uploading to OpenERP's translation "
|
||||||
"platform,"
|
"platform,"
|
||||||
msgstr ""
|
msgstr "TGZ 格式:這是含有 PO 格式檔案的壓縮檔,適用於直接上傳至 OpenERP 的翻譯平台。"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:res.lang:0
|
#: view:res.lang:0
|
||||||
|
@ -1430,7 +1441,7 @@ msgstr "測試"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.actions.report.xml,attachment:0
|
#: field:ir.actions.report.xml,attachment:0
|
||||||
msgid "Save as Attachment Prefix"
|
msgid "Save as Attachment Prefix"
|
||||||
msgstr ""
|
msgstr "另存附件檔案的前綴字元"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: field:ir.ui.view_sc,res_id:0
|
#: field:ir.ui.view_sc,res_id:0
|
||||||
|
@ -1467,7 +1478,7 @@ msgstr "海地"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_l10n_fr_hr_payroll
|
#: model:ir.module.module,shortdesc:base.module_l10n_fr_hr_payroll
|
||||||
msgid "French Payroll"
|
msgid "French Payroll"
|
||||||
msgstr ""
|
msgstr "法國薪資"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: view:ir.ui.view:0
|
#: view:ir.ui.view:0
|
||||||
|
@ -1506,12 +1517,12 @@ msgstr "操作取消"
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_document
|
#: model:ir.module.module,shortdesc:base.module_document
|
||||||
msgid "Document Management System"
|
msgid "Document Management System"
|
||||||
msgstr ""
|
msgstr "文件管理系統"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_crm_claim
|
#: model:ir.module.module,shortdesc:base.module_crm_claim
|
||||||
msgid "Claims Management"
|
msgid "Claims Management"
|
||||||
msgstr ""
|
msgstr "申訴管理"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,description:base.module_document_webdav
|
#: model:ir.module.module,description:base.module_document_webdav
|
||||||
|
@ -13105,7 +13116,7 @@ msgstr ""
|
||||||
#. module: base
|
#. module: base
|
||||||
#: model:ir.module.module,shortdesc:base.module_l10n_be_hr_payroll_account
|
#: model:ir.module.module,shortdesc:base.module_l10n_be_hr_payroll_account
|
||||||
msgid "Belgium - Payroll with Accounting"
|
msgid "Belgium - Payroll with Accounting"
|
||||||
msgstr ""
|
msgstr "比利時 - 薪資(含會計)"
|
||||||
|
|
||||||
#. module: base
|
#. module: base
|
||||||
#: selection:base.language.export,format:0
|
#: selection:base.language.export,format:0
|
||||||
|
|
|
@ -37,6 +37,7 @@ import ir_config_parameter
|
||||||
import osv_memory_autovacuum
|
import osv_memory_autovacuum
|
||||||
import ir_mail_server
|
import ir_mail_server
|
||||||
import ir_fields
|
import ir_fields
|
||||||
|
import ir_http
|
||||||
|
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
##############################################################################
|
##############################################################################
|
||||||
#
|
#
|
||||||
# OpenERP, Open Source Management Solution
|
# 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
|
# This program is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU Affero General Public License as
|
# 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!"))
|
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)
|
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'
|
eval(action.code.strip(), eval_context, mode="exec", nocopy=True) # nocopy allows to return 'action'
|
||||||
if 'action' in eval_context:
|
if 'action' in eval_context:
|
||||||
return eval_context['action']
|
return eval_context['action']
|
||||||
|
@ -933,38 +933,50 @@ class ir_actions_server(osv.osv):
|
||||||
context = {}
|
context = {}
|
||||||
res = False
|
res = False
|
||||||
user = self.pool.get('res.users').browse(cr, uid, uid)
|
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):
|
for action in self.browse(cr, uid, ids, context):
|
||||||
obj = None
|
|
||||||
obj_pool = self.pool[action.model_id.model]
|
obj_pool = self.pool[action.model_id.model]
|
||||||
for active_id in active_ids:
|
obj = None
|
||||||
if context.get('active_model') == action.model_id.model and active_id:
|
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)
|
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
|
|
||||||
}
|
|
||||||
|
|
||||||
# evaluate the condition, with the specific case that a void (aka False) condition is considered as True
|
# evaluation context for python strings to evaluate
|
||||||
condition = action.condition
|
eval_context = {
|
||||||
if action.condition is False:
|
'self': obj_pool,
|
||||||
condition = True
|
'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)
|
expr = eval(str(condition), eval_context)
|
||||||
if not expr:
|
if not expr:
|
||||||
continue
|
continue
|
||||||
# call the method related to the action: run_action_<STATE>
|
# call the multi method
|
||||||
if hasattr(self, 'run_action_%s' % action.state):
|
func = getattr(self, 'run_action_%s_multi' % action.state)
|
||||||
res = getattr(self, 'run_action_%s' % action.state)(cr, uid, action, eval_context=eval_context, context=run_context)
|
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
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -476,7 +476,8 @@
|
||||||
<field name="model_id"/>
|
<field name="model_id"/>
|
||||||
<field name="state"/>
|
<field name="state"/>
|
||||||
<group expand="0" string="Group By" colspan="4" col="4">
|
<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>
|
</group>
|
||||||
</search>
|
</search>
|
||||||
</field>
|
</field>
|
||||||
|
|
|
@ -198,7 +198,7 @@ class ir_attachment(osv.osv):
|
||||||
continue
|
continue
|
||||||
res_ids.setdefault(rmod,set()).add(rid)
|
res_ids.setdefault(rmod,set()).add(rid)
|
||||||
if values:
|
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'])
|
res_ids.setdefault(values['res_model'],set()).add(values['res_id'])
|
||||||
|
|
||||||
ima = self.pool.get('ir.model.access')
|
ima = self.pool.get('ir.model.access')
|
||||||
|
|
|
@ -253,7 +253,7 @@ class ir_fields_converter(orm.Model):
|
||||||
if not isinstance(selection, (tuple, list)):
|
if not isinstance(selection, (tuple, list)):
|
||||||
# FIXME: Don't pass context to avoid translations?
|
# FIXME: Don't pass context to avoid translations?
|
||||||
# Or just copy context & remove lang?
|
# Or just copy context & remove lang?
|
||||||
selection = selection(model, cr, uid)
|
selection = selection(model, cr, uid, context=None)
|
||||||
for item, label in selection:
|
for item, label in selection:
|
||||||
labels = self._get_translations(
|
labels = self._get_translations(
|
||||||
cr, uid, ('selection', 'model', 'code'), label, context=context)
|
cr, uid, ('selection', 'model', 'code'), label, context=context)
|
||||||
|
|
|
@ -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:
|
|
@ -96,8 +96,8 @@ class ir_model(osv.osv):
|
||||||
return res
|
return res
|
||||||
|
|
||||||
_columns = {
|
_columns = {
|
||||||
'name': fields.char('Model Description', size=64, translate=True, required=True),
|
'name': fields.char('Model Description', translate=True, required=True),
|
||||||
'model': fields.char('Model', size=64, required=True, select=1),
|
'model': fields.char('Model', required=True, select=1),
|
||||||
'info': fields.text('Information'),
|
'info': fields.text('Information'),
|
||||||
'field_id': fields.one2many('ir.model.fields', 'model_id', 'Fields', required=True),
|
'field_id': fields.one2many('ir.model.fields', 'model_id', 'Fields', required=True),
|
||||||
'state': fields.selection([('manual','Custom Object'),('base','Base Object')],'Type',readonly=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',
|
'osv_memory': fields.function(_is_osv_memory, string='Transient Model', type='boolean',
|
||||||
fnct_search=_search_osv_memory,
|
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)"),
|
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'),
|
'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'
|
_rec_name = 'field_description'
|
||||||
|
|
||||||
_columns = {
|
_columns = {
|
||||||
'name': fields.char('Name', required=True, size=64, select=1),
|
'name': fields.char('Name', required=True, select=1),
|
||||||
'complete_name': fields.char('Complete Name', size=64, select=1),
|
'complete_name': fields.char('Complete Name', select=1),
|
||||||
'model': fields.char('Object Name', size=64, required=True, select=1,
|
'model': fields.char('Object Name', required=True, select=1,
|
||||||
help="The technical name of the model this field belongs to"),
|
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"),
|
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"),
|
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',
|
'model_id': fields.many2one('ir.model', 'Model', required=True, select=True, ondelete='cascade',
|
||||||
help="The model this field belongs to"),
|
help="The model this field belongs to"),
|
||||||
'field_description': fields.char('Field Label', required=True, size=256),
|
'field_description': fields.char('Field Label', required=True),
|
||||||
'ttype': fields.selection(_get_fields_type, 'Field Type',size=64, required=True),
|
'ttype': fields.selection(_get_fields_type, 'Field Type', required=True),
|
||||||
'selection': fields.char('Selection Options',size=128, help="List of options for a selection field, "
|
'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. "
|
"specified as a Python expression defining a list of (key, label) pairs. "
|
||||||
"For example: [('blue','Blue'),('yellow','Yellow')]"),
|
"For example: [('blue','Blue'),('yellow','Yellow')]"),
|
||||||
'required': fields.boolean('Required'),
|
'required': fields.boolean('Required'),
|
||||||
|
@ -245,12 +245,12 @@ class ir_model_fields(osv.osv):
|
||||||
'size': fields.integer('Size'),
|
'size': fields.integer('Size'),
|
||||||
'state': fields.selection([('manual','Custom Field'),('base','Base Field')],'Type', required=True, readonly=True, select=1),
|
'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'),
|
'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. "
|
"specified as a Python expression defining a list of triplets. "
|
||||||
"For example: [('color','=','red')]"),
|
"For example: [('color','=','red')]"),
|
||||||
'groups': fields.many2many('res.groups', 'ir_model_fields_group_rel', 'field_id', 'group_id', 'Groups'),
|
'groups': fields.many2many('res.groups', 'ir_model_fields_group_rel', 'field_id', 'group_id', 'Groups'),
|
||||||
'selectable': fields.boolean('Selectable'),
|
'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')]",
|
'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 "
|
ondelete='cascade', help="If set, this field will be stored in the sparse "
|
||||||
"structure of the serialization field, instead "
|
"structure of the serialization field, instead "
|
||||||
|
@ -483,7 +483,7 @@ class ir_model_constraint(Model):
|
||||||
"""
|
"""
|
||||||
_name = 'ir.model.constraint'
|
_name = 'ir.model.constraint'
|
||||||
_columns = {
|
_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."),
|
help="PostgreSQL constraint or foreign key name."),
|
||||||
'model': fields.many2one('ir.model', string='Model',
|
'model': fields.many2one('ir.model', string='Model',
|
||||||
required=True, select=1),
|
required=True, select=1),
|
||||||
|
@ -552,7 +552,7 @@ class ir_model_relation(Model):
|
||||||
"""
|
"""
|
||||||
_name = 'ir.model.relation'
|
_name = 'ir.model.relation'
|
||||||
_columns = {
|
_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."),
|
help="PostgreSQL table name implementing a many2many relation."),
|
||||||
'model': fields.many2one('ir.model', string='Model',
|
'model': fields.many2one('ir.model', string='Model',
|
||||||
required=True, select=1),
|
required=True, select=1),
|
||||||
|
@ -601,7 +601,7 @@ class ir_model_relation(Model):
|
||||||
class ir_model_access(osv.osv):
|
class ir_model_access(osv.osv):
|
||||||
_name = 'ir.model.access'
|
_name = 'ir.model.access'
|
||||||
_columns = {
|
_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.'),
|
'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'),
|
'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),
|
'group_id': fields.many2one('res.groups', 'Group', ondelete='cascade', select=True),
|
||||||
|
@ -815,13 +815,13 @@ class ir_model_data(osv.osv):
|
||||||
return result
|
return result
|
||||||
|
|
||||||
_columns = {
|
_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 "
|
help="External Key/Identifier that can be used for "
|
||||||
"data integration with third-party systems"),
|
"data integration with third-party systems"),
|
||||||
'complete_name': fields.function(_complete_name_get, type='char', string='Complete ID'),
|
'complete_name': fields.function(_complete_name_get, type='char', string='Complete ID'),
|
||||||
'display_name': fields.function(_display_name_get, type='char', string='Record Name'),
|
'display_name': fields.function(_display_name_get, type='char', string='Record Name'),
|
||||||
'model': fields.char('Model Name', required=True, size=64, select=1),
|
'model': fields.char('Model Name', required=True, select=1),
|
||||||
'module': fields.char('Module', required=True, size=64, select=1),
|
'module': fields.char('Module', required=True, select=1),
|
||||||
'res_id': fields.integer('Record ID', select=1,
|
'res_id': fields.integer('Record ID', select=1,
|
||||||
help="ID of the target record in the database"),
|
help="ID of the target record in the database"),
|
||||||
'noupdate': fields.boolean('Non Updatable'),
|
'noupdate': fields.boolean('Non Updatable'),
|
||||||
|
@ -1128,7 +1128,7 @@ class ir_model_data(osv.osv):
|
||||||
return True
|
return True
|
||||||
to_unlink = []
|
to_unlink = []
|
||||||
cr.execute("""SELECT id,name,model,res_id,module FROM ir_model_data
|
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))
|
(tuple(modules), False))
|
||||||
for (id, name, model, res_id, module) in cr.fetchall():
|
for (id, name, model, res_id, module) in cr.fetchall():
|
||||||
if (module,name) not in self.loads:
|
if (module,name) not in self.loads:
|
||||||
|
|
|
@ -182,7 +182,7 @@ class ir_translation(osv.osv):
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
record = self.browse(cr, uid, id, context=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_name, field = record.name.split(',')
|
||||||
model = self.pool.get(model_name)
|
model = self.pool.get(model_name)
|
||||||
#We need to take the context without the language information, because we want to write on the
|
#We need to take the context without the language information, because we want to write on the
|
||||||
|
|
|
@ -5,9 +5,9 @@
|
||||||
<!--logo-->
|
<!--logo-->
|
||||||
<fill color="black"/>
|
<fill color="black"/>
|
||||||
<stroke 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>
|
<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>
|
<drawString x="13.8cm" y="19.5cm"><xsl:value-of select="//company"/></drawString>
|
||||||
<stroke color="#000000"/>
|
<stroke color="#000000"/>
|
||||||
<lines size="8">1.3cm 19.3cm 28.5cm 19.3cm</lines>
|
<lines size="8">1.3cm 19.3cm 28.5cm 19.3cm</lines>
|
||||||
|
|
|
@ -27,7 +27,6 @@ from openerp.osv import fields, osv
|
||||||
from openerp.tools.translate import _
|
from openerp.tools.translate import _
|
||||||
from openerp.tools.safe_eval import safe_eval as eval
|
from openerp.tools.safe_eval import safe_eval as eval
|
||||||
from openerp.tools import image_resize_image
|
from openerp.tools import image_resize_image
|
||||||
from openerp.report.render.rml2pdf import customfonts
|
|
||||||
|
|
||||||
class multi_company_default(osv.osv):
|
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):
|
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. """
|
""" To change default header style of all <para> and drawstring. """
|
||||||
|
|
||||||
def _change_header(header,font):
|
def _change_header(header,font):
|
||||||
""" Replace default fontname use in header and setfont tag """
|
""" Replace default fontname use in header and setfont tag """
|
||||||
|
|
||||||
default_para = re.sub('fontName.?=.?".*"', 'fontName="%s"'% font,header)
|
default_para = re.sub('fontName.?=.?".*"', 'fontName="%s"'% font, header)
|
||||||
return re.sub('(<setFont.?name.?=.?)(".*?")(.)', '\g<1>"%s"\g<3>'% font,default_para)
|
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
|
fontname = self.pool.get('res.font').browse(cr, uid, font, context=context).name
|
||||||
return {'value':{
|
return {'value':{
|
||||||
'rml_header': _change_header(rml_header,fontname),
|
'rml_header': _change_header(rml_header, fontname),
|
||||||
'rml_header2':_change_header(rml_header2,fontname),
|
'rml_header2':_change_header(rml_header2, fontname),
|
||||||
'rml_header3':_change_header(rml_header3,fontname)
|
'rml_header3':_change_header(rml_header3, fontname)
|
||||||
}}
|
}}
|
||||||
|
|
||||||
def on_change_country(self, cr, uid, ids, country_id, context=None):
|
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):
|
def _get_font(self, cr, uid, ids):
|
||||||
font_obj = self.pool.get('res.font')
|
font_obj = self.pool.get('res.font')
|
||||||
res = font_obj.search(cr, uid, [('name', '=', 'Helvetica')], limit=1)
|
res = font_obj.search(cr, uid, [('family', '=', 'Helvetica'), ('mode', '=', 'all')], limit=1)
|
||||||
if res:
|
return res and res[0] or False
|
||||||
return res[0]
|
|
||||||
|
|
||||||
font_obj.init_no_scan(cr, uid)
|
|
||||||
return font_obj.search(cr, uid, [('name', '=', 'Helvetica')], limit=1)[0]
|
|
||||||
|
|
||||||
_header = """
|
_header = """
|
||||||
<header>
|
<header>
|
||||||
|
@ -307,20 +305,20 @@ class res_company(osv.osv):
|
||||||
<frame id="first" x1="28.0" y1="28.0" width="%s" height="%s"/>
|
<frame id="first" x1="28.0" y1="28.0" width="%s" height="%s"/>
|
||||||
<stylesheet>
|
<stylesheet>
|
||||||
<!-- Set here the default font to use for all <para> tags -->
|
<!-- Set here the default font to use for all <para> tags -->
|
||||||
<paraStyle name='Normal' fontName="DejaVu Sans"/>
|
<paraStyle name='Normal' fontName="DejaVuSans"/>
|
||||||
</stylesheet>
|
</stylesheet>
|
||||||
<pageGraphics>
|
<pageGraphics>
|
||||||
<fill color="black"/>
|
<fill color="black"/>
|
||||||
<stroke 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>
|
<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>
|
<drawCentredString x="%s" y="%s">[[ company.partner_id.name ]]</drawCentredString>
|
||||||
<stroke color="#000000"/>
|
<stroke color="#000000"/>
|
||||||
<lines>%s</lines>
|
<lines>%s</lines>
|
||||||
<!-- Set here the default font to use for all <drawString> tags -->
|
<!-- 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 -->
|
<!-- 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>
|
</pageGraphics>
|
||||||
</pageTemplate>
|
</pageTemplate>
|
||||||
</header>"""
|
</header>"""
|
||||||
|
@ -345,13 +343,13 @@ class res_company(osv.osv):
|
||||||
<frame id="first" x1="1.3cm" y1="3.0cm" height="%s" width="19.0cm"/>
|
<frame id="first" x1="1.3cm" y1="3.0cm" height="%s" width="19.0cm"/>
|
||||||
<stylesheet>
|
<stylesheet>
|
||||||
<!-- Set here the default font to use for all <para> tags -->
|
<!-- 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_footer" fontSize="8.0" alignment="CENTER"/>
|
||||||
<paraStyle name="main_header" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
|
<paraStyle name="main_header" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
|
||||||
</stylesheet>
|
</stylesheet>
|
||||||
<pageGraphics>
|
<pageGraphics>
|
||||||
<!-- Set here the default font to use for all <drawString> tags -->
|
<!-- 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 -->
|
<!-- You Logo - Change X,Y,Width and Height -->
|
||||||
<image x="1.3cm" y="%s" height="40.0" >[[ company.logo or removeParentNode('image') ]]</image>
|
<image x="1.3cm" y="%s" height="40.0" >[[ company.logo or removeParentNode('image') ]]</image>
|
||||||
<fill color="black"/>
|
<fill color="black"/>
|
||||||
|
@ -396,7 +394,7 @@ class res_company(osv.osv):
|
||||||
return {'value': {'rml_header': self._header_a4}}
|
return {'value': {'rml_header': self._header_a4}}
|
||||||
|
|
||||||
def act_discover_fonts(self, cr, uid, ids, context=None):
|
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 = {
|
_defaults = {
|
||||||
'currency_id': _get_euro,
|
'currency_id': _get_euro,
|
||||||
|
|
|
@ -85,7 +85,7 @@
|
||||||
<label for="font" />
|
<label for="font" />
|
||||||
<div>
|
<div>
|
||||||
<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"/>
|
<button string="(reload fonts)" name="act_discover_fonts" type="object" class="oe_link" colspan="1"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -492,15 +492,19 @@ class res_config_settings(osv.osv_memory, res_config_module_installation_mixin):
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def execute(self, cr, uid, ids, context=None):
|
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_values = self.pool['ir.values']
|
||||||
ir_module = self.pool['ir.module.module']
|
ir_module = self.pool['ir.module.module']
|
||||||
|
|
||||||
classified = self._get_classified_fields(cr, uid, context)
|
classified = self._get_classified_fields(cr, uid, context)
|
||||||
|
|
||||||
config = self.browse(cr, uid, ids[0], context)
|
config = self.browse(cr, uid, ids[0], context)
|
||||||
|
|
||||||
# default values fields
|
# default values fields
|
||||||
for name, model, field in classified['default']:
|
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
|
# group fields: modify group / implied groups
|
||||||
for name, group, implied_group in classified['group']:
|
for name, group, implied_group in classified['group']:
|
||||||
|
|
|
@ -1212,7 +1212,7 @@
|
||||||
<record id="ve" model="res.country">
|
<record id="ve" model="res.country">
|
||||||
<field name="name">Venezuela</field>
|
<field name="name">Venezuela</field>
|
||||||
<field name="code">ve</field>
|
<field name="code">ve</field>
|
||||||
<field name="currency_id" ref="VUB"/>
|
<field name="currency_id" ref="VEF"/>
|
||||||
</record>
|
</record>
|
||||||
<record id="vg" model="res.country">
|
<record id="vg" model="res.country">
|
||||||
<field name="name">Virgin Islands (British)</field>
|
<field name="name">Virgin Islands (British)</field>
|
||||||
|
|
|
@ -1540,7 +1540,7 @@
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="VUB" model="res.currency">
|
<record id="VUB" model="res.currency">
|
||||||
<field name="name">VUB</field>
|
<field name="name">VEB</field>
|
||||||
<field name="symbol">Bs</field>
|
<field name="symbol">Bs</field>
|
||||||
<field name="rounding">0.01</field>
|
<field name="rounding">0.01</field>
|
||||||
<field name="accuracy">4</field>
|
<field name="accuracy">4</field>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
##############################################################################
|
##############################################################################
|
||||||
#
|
#
|
||||||
# OpenERP, Open Source Management Solution
|
# 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
|
# This program is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU Affero General Public License as
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
@ -20,6 +20,7 @@
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
from reportlab.pdfbase import ttfonts
|
from reportlab.pdfbase import ttfonts
|
||||||
|
from openerp.modules.registry import RegistryManager
|
||||||
from openerp.osv import fields, osv
|
from openerp.osv import fields, osv
|
||||||
from openerp.report.render.rml2pdf import customfonts
|
from openerp.report.render.rml2pdf import customfonts
|
||||||
|
|
||||||
|
@ -40,57 +41,75 @@ _logger = logging.getLogger(__name__)
|
||||||
class res_font(osv.Model):
|
class res_font(osv.Model):
|
||||||
_name = "res.font"
|
_name = "res.font"
|
||||||
_description = 'Fonts available'
|
_description = 'Fonts available'
|
||||||
_order = 'name'
|
_order = 'family,name,id'
|
||||||
|
_rec_name = 'family'
|
||||||
|
|
||||||
_columns = {
|
_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 = [
|
_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):
|
def font_scan(self, cr, uid, lazy=False, context=None):
|
||||||
"""Scan fonts on the file system, add them to the list of known fonts
|
"""Action of loading fonts
|
||||||
and create font object for the new ones"""
|
In lazy mode will scan the filesystem only if there is no founts in the database and sync if no font in CustomTTFonts
|
||||||
customfonts.CustomTTFonts = customfonts.BaseCustomTTFonts
|
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():
|
for font_path in customfonts.list_all_sysfonts():
|
||||||
try:
|
try:
|
||||||
font = ttfonts.TTFontFile(font_path)
|
font = ttfonts.TTFontFile(font_path)
|
||||||
_logger.debug("Found font %s at %s", font.name, font_path)
|
_logger.debug("Found font %s at %s", font.name, font_path)
|
||||||
if not found_fonts.get(font.familyName):
|
found_fonts.append((font.familyName, font.name, font_path, font.styleName))
|
||||||
found_fonts[font.familyName] = {'name': font.familyName}
|
|
||||||
|
|
||||||
mode = font.styleName.lower().replace(" ", "")
|
|
||||||
|
|
||||||
customfonts.CustomTTFonts.append((font.familyName, font.name, font_path, mode))
|
|
||||||
except ttfonts.TTFError:
|
except ttfonts.TTFError:
|
||||||
_logger.warning("Could not register Font %s", font_path)
|
_logger.warning("Could not register Font %s", font_path)
|
||||||
|
|
||||||
# add default PDF fonts
|
for family, name, path, mode in found_fonts:
|
||||||
for family in customfonts.BasePDFFonts:
|
if not self.search(cr, uid, [('family', '=', family), ('name', '=', name)], context=context):
|
||||||
if not found_fonts.get(family):
|
self.create(cr, uid, {
|
||||||
found_fonts[family] = {'name': family}
|
'family': family, 'name': name,
|
||||||
|
'path': path, 'mode': mode,
|
||||||
|
}, context=context)
|
||||||
|
|
||||||
# remove deleted fonts
|
# remove fonts not present on the disk anymore
|
||||||
existing_font_ids = self.search(cr, uid, [], context=context)
|
existing_font_names = [name for (family, name, path, mode) in found_fonts]
|
||||||
existing_font_names = []
|
inexistant_fonts = self.search(cr, uid, [('name', 'not in', existing_font_names), ('path', '!=', '/dev/null')], context=context)
|
||||||
for font in self.browse(cr, uid, existing_font_ids):
|
if inexistant_fonts:
|
||||||
existing_font_names.append(font.name)
|
self.unlink(cr, uid, inexistant_fonts, context=context)
|
||||||
if font.name not in found_fonts.keys():
|
|
||||||
self.unlink(cr, uid, font.id, context=context)
|
|
||||||
|
|
||||||
# add unknown fonts
|
RegistryManager.signal_caches_change(cr.dbname)
|
||||||
for family, vals in found_fonts.items():
|
self._sync(cr, uid, context=context)
|
||||||
if family not in existing_font_names:
|
|
||||||
self.create(cr, uid, vals, context=context)
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def init_no_scan(self, cr, uid, context=None):
|
def _sync(self, cr, uid, context=None):
|
||||||
"""Add demo data for PDF fonts without scan (faster for db creation)"""
|
"""Set the customfonts.CustomTTFonts list to the content of the database"""
|
||||||
for font in customfonts.BasePDFFonts:
|
customfonts.CustomTTFonts = []
|
||||||
if not self.search(cr, uid, [('name', '=', font)], context=context):
|
found_fonts_ids = self.search(cr, uid, [('path', '!=', '/dev/null')], context=context)
|
||||||
self.create(cr, uid, {'name':font}, context=context)
|
for font in self.browse(cr, uid, found_fonts_ids, context=None):
|
||||||
return True
|
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()
|
|
@ -329,7 +329,7 @@
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<search string="Search Partner">
|
<search string="Search Partner">
|
||||||
<field name="name"
|
<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)]"/>
|
<filter help="My Partners" icon="terp-personal+" domain="[('user_id','=',uid)]"/>
|
||||||
<separator/>
|
<separator/>
|
||||||
<filter string="Persons" name="type_person" domain="[('is_company','=',0)]"/>
|
<filter string="Persons" name="type_person" domain="[('is_company','=',0)]"/>
|
||||||
|
|
|
@ -169,7 +169,8 @@ class res_users(osv.osv):
|
||||||
}
|
}
|
||||||
|
|
||||||
def on_change_login(self, cr, uid, ids, login, context=None):
|
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):
|
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)]
|
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):
|
def create(self, cr, uid, values, context=None):
|
||||||
self._set_reified_groups(values)
|
self._set_reified_groups(values)
|
||||||
|
|
||||||
return super(users_view, self).create(cr, uid, values, context)
|
return super(users_view, self).create(cr, uid, values, context)
|
||||||
|
|
||||||
def write(self, cr, uid, ids, values, context=None):
|
def write(self, cr, uid, ids, values, context=None):
|
||||||
|
@ -811,7 +811,7 @@ class users_view(osv.osv):
|
||||||
if len(group_split) != 2:
|
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)
|
raise osv.except_osv(_('Invalid context value'), _('Invalid context default_groups_ref value (model.name_id) : "%s"') % group_xml_id)
|
||||||
try:
|
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:
|
except ValueError:
|
||||||
group_id = False
|
group_id = False
|
||||||
groups += [group_id]
|
groups += [group_id]
|
||||||
|
@ -819,14 +819,19 @@ class users_view(osv.osv):
|
||||||
return values
|
return values
|
||||||
|
|
||||||
def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):
|
def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):
|
||||||
if not fields:
|
fields_get = fields if fields is not None else self.fields_get(cr, uid, context=context).keys()
|
||||||
fields = self.fields_get(cr, uid, context=context).keys()
|
group_fields, _ = partition(is_reified_group, fields_get)
|
||||||
group_fields, fields = partition(is_reified_group, fields)
|
|
||||||
if not 'groups_id' in fields:
|
inject_groups_id = group_fields and fields and 'groups_id' not in fields
|
||||||
|
if inject_groups_id:
|
||||||
fields.append('groups_id')
|
fields.append('groups_id')
|
||||||
res = super(users_view, self).read(cr, uid, ids, fields, context=context, load=load)
|
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
|
return res
|
||||||
|
|
||||||
def _get_reified_groups(self, fields, values):
|
def _get_reified_groups(self, fields, values):
|
||||||
|
|
|
@ -43,6 +43,8 @@
|
||||||
"access_ir_values_group_all","ir_values group_all","model_ir_values",,1,1,1,1
|
"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_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_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_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_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
|
"access_res_country_group_user","res_country group_user","model_res_country","group_partner_manager",1,1,1,1
|
||||||
|
|
|
|
@ -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
|
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'}))
|
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__':
|
if __name__ == '__main__':
|
||||||
unittest2.main()
|
unittest2.main()
|
||||||
|
|
|
@ -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):
|
def _insert_view(self, **kw):
|
||||||
"""Insert view into database via a query to passtrough validation"""
|
"""Insert view into database via a query to passtrough validation"""
|
||||||
kw.pop('id', None)
|
kw.pop('id', None)
|
||||||
|
|
|
@ -94,11 +94,11 @@ def preload_registry(dbname):
|
||||||
""" Preload a registry, and start the cron."""
|
""" Preload a registry, and start the cron."""
|
||||||
try:
|
try:
|
||||||
update_module = True if openerp.tools.config['init'] or openerp.tools.config['update'] else False
|
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:
|
except Exception:
|
||||||
_logger.exception('Failed to initialize database `%s`.', dbname)
|
_logger.exception('Failed to initialize database `%s`.', dbname)
|
||||||
return False
|
return False
|
||||||
return True
|
return registry._assertion_report.failures == 0
|
||||||
|
|
||||||
def run_test_file(dbname, test_file):
|
def run_test_file(dbname, test_file):
|
||||||
""" Preload a registry, possibly run a test file, and start the cron."""
|
""" Preload a registry, possibly run a test file, and start the cron."""
|
||||||
|
|
498
openerp/http.py
498
openerp/http.py
|
@ -3,7 +3,7 @@
|
||||||
# OpenERP HTTP layer
|
# OpenERP HTTP layer
|
||||||
#----------------------------------------------------------
|
#----------------------------------------------------------
|
||||||
import ast
|
import ast
|
||||||
import cgi
|
import collections
|
||||||
import contextlib
|
import contextlib
|
||||||
import errno
|
import errno
|
||||||
import functools
|
import functools
|
||||||
|
@ -23,23 +23,32 @@ import urlparse
|
||||||
import warnings
|
import warnings
|
||||||
|
|
||||||
import babel.core
|
import babel.core
|
||||||
|
import psycopg2
|
||||||
import simplejson
|
import simplejson
|
||||||
import werkzeug.contrib.sessions
|
import werkzeug.contrib.sessions
|
||||||
import werkzeug.datastructures
|
import werkzeug.datastructures
|
||||||
import werkzeug.exceptions
|
import werkzeug.exceptions
|
||||||
|
import werkzeug.local
|
||||||
|
import werkzeug.routing
|
||||||
import werkzeug.wrappers
|
import werkzeug.wrappers
|
||||||
import werkzeug.wsgi
|
import werkzeug.wsgi
|
||||||
import werkzeug.routing as routing
|
|
||||||
|
|
||||||
import openerp
|
import openerp
|
||||||
from openerp.service import security, model as service_model
|
from openerp.service import security, model as service_model
|
||||||
from openerp.tools import config
|
|
||||||
|
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
#----------------------------------------------------------
|
#----------------------------------------------------------
|
||||||
# RequestHandler
|
# 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):
|
class WebRequest(object):
|
||||||
""" Parent class for all OpenERP Web request types, mostly deals with
|
""" Parent class for all OpenERP Web request types, mostly deals with
|
||||||
initialization and setup of the request object (the dispatching itself has
|
initialization and setup of the request object (the dispatching itself has
|
||||||
|
@ -98,6 +107,7 @@ class WebRequest(object):
|
||||||
self.disable_db = False
|
self.disable_db = False
|
||||||
self.uid = None
|
self.uid = None
|
||||||
self.func = None
|
self.func = None
|
||||||
|
self.func_arguments = {}
|
||||||
self.auth_method = None
|
self.auth_method = None
|
||||||
self._cr_cm = None
|
self._cr_cm = None
|
||||||
self._cr = None
|
self._cr = None
|
||||||
|
@ -111,14 +121,6 @@ class WebRequest(object):
|
||||||
self.context = dict(self.session.context)
|
self.context = dict(self.session.context)
|
||||||
self.lang = self.context["lang"]
|
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
|
@property
|
||||||
def registry(self):
|
def registry(self):
|
||||||
"""
|
"""
|
||||||
|
@ -142,34 +144,59 @@ class WebRequest(object):
|
||||||
trying to access this property will raise an exception.
|
trying to access this property will raise an exception.
|
||||||
"""
|
"""
|
||||||
# some magic to lazy create the cr
|
# some magic to lazy create the cr
|
||||||
if not self._cr_cm:
|
if not self._cr:
|
||||||
self._cr_cm = self.registry.cursor()
|
self._cr = self.registry.db.cursor()
|
||||||
self._cr = self._cr_cm.__enter__()
|
|
||||||
return self._cr
|
return self._cr
|
||||||
|
|
||||||
def _call_function(self, *args, **kwargs):
|
def __enter__(self):
|
||||||
self._authenticate()
|
_request_stack.push(self)
|
||||||
try:
|
return self
|
||||||
# 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
|
|
||||||
|
|
||||||
with with_obj():
|
def __exit__(self, exc_type, exc_value, traceback):
|
||||||
if self.func_request_type != self._request_type:
|
_request_stack.pop()
|
||||||
raise Exception("%s, %s: Function declared as capable of handling request of type '%s' but called with a request of type '%s'" \
|
if self._cr:
|
||||||
% (self.func, self.httprequest.path, self.func_request_type, self._request_type))
|
if exc_type is None:
|
||||||
return self.func(*args, **kwargs)
|
self._cr.commit()
|
||||||
finally:
|
self._cr.close()
|
||||||
# just to be sure no one tries to re-use the request
|
# just to be sure no one tries to re-use the request
|
||||||
self.disable_db = True
|
self.disable_db = True
|
||||||
self.uid = None
|
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
|
@property
|
||||||
def debug(self):
|
def debug(self):
|
||||||
|
@ -180,27 +207,7 @@ class WebRequest(object):
|
||||||
warnings.warn('please use request.registry and request.cr directly', DeprecationWarning)
|
warnings.warn('please use request.registry and request.cr directly', DeprecationWarning)
|
||||||
yield (self.registry, self.cr)
|
yield (self.registry, self.cr)
|
||||||
|
|
||||||
def auth_method_user():
|
def route(route, type="http", auth="user", methods=None):
|
||||||
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"):
|
|
||||||
"""
|
"""
|
||||||
Decorator marking the decorated method as being a handler for requests. The method must be part of a subclass
|
Decorator marking the decorated method as being a handler for requests. The method must be part of a subclass
|
||||||
of ``Controller``.
|
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
|
* ``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
|
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.
|
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 type in ["http", "json"]
|
||||||
assert auth in auth_methods.keys()
|
|
||||||
def decorator(f):
|
def decorator(f):
|
||||||
if isinstance(route, list):
|
if isinstance(route, list):
|
||||||
f.routes = route
|
f.routes = route
|
||||||
else:
|
else:
|
||||||
f.routes = [route]
|
f.routes = [route]
|
||||||
|
f.methods = methods
|
||||||
f.exposed = type
|
f.exposed = type
|
||||||
if getattr(f, "auth", None) is None:
|
if getattr(f, "auth", None) is None:
|
||||||
f.auth = auth
|
f.auth = auth
|
||||||
return f
|
return f
|
||||||
return decorator
|
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):
|
class JsonRequest(WebRequest):
|
||||||
""" JSON-RPC2 over HTTP.
|
""" JSON-RPC2 over HTTP.
|
||||||
|
|
||||||
|
@ -302,7 +304,7 @@ class JsonRequest(WebRequest):
|
||||||
request = self.httprequest.stream.read()
|
request = self.httprequest.stream.read()
|
||||||
|
|
||||||
# Read POST content or POST Form Data named "request"
|
# 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.params = dict(self.jsonrequest.get("params", {}))
|
||||||
self.context = self.params.pop('context', self.session.context)
|
self.context = self.params.pop('context', self.session.context)
|
||||||
|
|
||||||
|
@ -406,22 +408,9 @@ class HttpRequest(WebRequest):
|
||||||
self.params = params
|
self.params = params
|
||||||
|
|
||||||
def dispatch(self):
|
def dispatch(self):
|
||||||
try:
|
r = self._call_function(**self.params)
|
||||||
r = self._call_function(**self.params)
|
if not r:
|
||||||
except werkzeug.exceptions.HTTPException, e:
|
r = werkzeug.wrappers.Response(status=204) # no content
|
||||||
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
|
|
||||||
return r
|
return r
|
||||||
|
|
||||||
def make_response(self, data, headers=None, cookies=None):
|
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)
|
return route([base, base + "/<path:_ignored_path>"], type="http", auth="user")(f)
|
||||||
|
|
||||||
#----------------------------------------------------------
|
#----------------------------------------------------------
|
||||||
# Thread local global request object
|
# Controller and route registration
|
||||||
#----------------------------------------------------------
|
|
||||||
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
|
|
||||||
#----------------------------------------------------------
|
#----------------------------------------------------------
|
||||||
addons_module = {}
|
addons_module = {}
|
||||||
addons_manifest = {}
|
addons_manifest = {}
|
||||||
controllers_per_module = {}
|
controllers_per_module = collections.defaultdict(list)
|
||||||
|
|
||||||
class ControllerType(type):
|
class ControllerType(type):
|
||||||
def __init__(cls, name, bases, attrs):
|
def __init__(cls, name, bases, attrs):
|
||||||
|
@ -511,11 +480,36 @@ class ControllerType(type):
|
||||||
# but we only store controllers directly inheriting from Controller
|
# but we only store controllers directly inheriting from Controller
|
||||||
if not "Controller" in globals() or not Controller in bases:
|
if not "Controller" in globals() or not Controller in bases:
|
||||||
return
|
return
|
||||||
controllers_per_module.setdefault(module, []).append(name_class)
|
controllers_per_module[module].append(name_class)
|
||||||
|
|
||||||
class Controller(object):
|
class Controller(object):
|
||||||
__metaclass__ = ControllerType
|
__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
|
# HTTP Sessions
|
||||||
#----------------------------------------------------------
|
#----------------------------------------------------------
|
||||||
|
@ -679,6 +673,8 @@ class OpenERPSession(werkzeug.contrib.sessions.Session):
|
||||||
|
|
||||||
context['lang'] = lang or 'en_US'
|
context['lang'] = lang or 'en_US'
|
||||||
|
|
||||||
|
# Deprecated to be removed in 9
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Damn properties for retro-compatibility. All of that is deprecated, all
|
Damn properties for retro-compatibility. All of that is deprecated, all
|
||||||
of that.
|
of that.
|
||||||
|
@ -794,13 +790,25 @@ def session_gc(session_store):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
#----------------------------------------------------------
|
#----------------------------------------------------------
|
||||||
# WSGI Application
|
# WSGI Layer
|
||||||
#----------------------------------------------------------
|
#----------------------------------------------------------
|
||||||
# Add potentially missing (older ubuntu) font mime types
|
# Add potentially missing (older ubuntu) font mime types
|
||||||
mimetypes.add_type('application/font-woff', '.woff')
|
mimetypes.add_type('application/font-woff', '.woff')
|
||||||
mimetypes.add_type('application/vnd.ms-fontobject', '.eot')
|
mimetypes.add_type('application/vnd.ms-fontobject', '.eot')
|
||||||
mimetypes.add_type('application/x-font-ttf', '.ttf')
|
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):
|
class DisableCacheMiddleware(object):
|
||||||
def __init__(self, app):
|
def __init__(self, app):
|
||||||
self.app = app
|
self.app = app
|
||||||
|
@ -848,106 +856,27 @@ class Root(object):
|
||||||
"""Root WSGI application for the OpenERP Web Client.
|
"""Root WSGI application for the OpenERP Web Client.
|
||||||
"""
|
"""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.addons = {}
|
|
||||||
self.statics = {}
|
|
||||||
|
|
||||||
self.no_db_router = None
|
|
||||||
|
|
||||||
self.load_addons()
|
|
||||||
|
|
||||||
# Setup http sessions
|
# Setup http sessions
|
||||||
path = session_path()
|
path = session_path()
|
||||||
self.session_store = werkzeug.contrib.sessions.FilesystemSessionStore(path, session_class=OpenERPSession)
|
|
||||||
_logger.debug('HTTP sessions stored in: %s', path)
|
_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):
|
def __call__(self, environ, start_response):
|
||||||
""" Handle a WSGI request
|
""" Handle a WSGI request
|
||||||
"""
|
"""
|
||||||
return self.dispatch(environ, start_response)
|
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):
|
def load_addons(self):
|
||||||
""" Load all addons from addons patch containg static files and
|
""" Load all addons from addons patch containg static files and
|
||||||
controllers and configure them. """
|
controllers and configure them. """
|
||||||
|
statics = {}
|
||||||
|
|
||||||
for addons_path in openerp.modules.module.ad_paths:
|
for addons_path in openerp.modules.module.ad_paths:
|
||||||
for module in sorted(os.listdir(str(addons_path))):
|
for module in sorted(os.listdir(str(addons_path))):
|
||||||
|
@ -960,99 +889,123 @@ class Root(object):
|
||||||
_logger.debug("Loading %s", module)
|
_logger.debug("Loading %s", module)
|
||||||
if 'openerp.addons' in sys.modules:
|
if 'openerp.addons' in sys.modules:
|
||||||
m = __import__('openerp.addons.' + module)
|
m = __import__('openerp.addons.' + module)
|
||||||
else:
|
|
||||||
m = __import__(module)
|
|
||||||
addons_module[module] = m
|
addons_module[module] = m
|
||||||
addons_manifest[module] = manifest
|
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)
|
self.dispatch = DisableCacheMiddleware(app)
|
||||||
|
|
||||||
def _build_router(self, db):
|
def setup_session(self, httprequest):
|
||||||
_logger.info("Generating routing configuration for database %s" % db)
|
# recover or create session
|
||||||
routing_map = routing.Map(strict_slashes=False)
|
session_gc(self.session_store)
|
||||||
|
|
||||||
def gen(modules, nodb_only):
|
sid = httprequest.args.get('session_id')
|
||||||
for module in modules:
|
explicit_session = True
|
||||||
for v in controllers_per_module[module]:
|
if not sid:
|
||||||
cls = v[1]
|
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__()
|
def setup_db(self, httprequest):
|
||||||
subclasses = [c for c in subclasses if c.__module__.startswith('openerp.addons.') and
|
if not httprequest.session.db:
|
||||||
c.__module__.split(".")[2] in modules]
|
# allow "admin" routes to works without being logged in when in monodb.
|
||||||
if subclasses:
|
httprequest.session.db = db_monodb(httprequest)
|
||||||
name = "%s (extended by %s)" % (cls.__name__, ', '.join(sub.__name__ for sub in subclasses))
|
|
||||||
cls = type(name, tuple(reversed(subclasses)), {})
|
|
||||||
|
|
||||||
o = cls()
|
def setup_lang(self, httprequest):
|
||||||
members = inspect.getmembers(o)
|
if not "lang" in httprequest.session.context:
|
||||||
for mk, mv in members:
|
lang = httprequest.accept_languages.best or "en_US"
|
||||||
if inspect.ismethod(mv) and getattr(mv, 'exposed', False) and \
|
lang = babel.core.LOCALE_ALIASES.get(lang, lang).replace('-', '_')
|
||||||
nodb_only == (getattr(mv, "auth", "none") == "none"):
|
httprequest.session.context["lang"] = lang
|
||||||
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))
|
|
||||||
|
|
||||||
modules_set = set(controllers_per_module.keys()) - set(['', 'web'])
|
def get_request(self, httprequest):
|
||||||
# building all none methods
|
# deduce type of request
|
||||||
gen(['', "web"] + sorted(modules_set), True)
|
if httprequest.args.get('jsonp'):
|
||||||
if not db:
|
return JsonRequest(httprequest)
|
||||||
return routing_map
|
if httprequest.mimetype == "application/json":
|
||||||
|
return JsonRequest(httprequest)
|
||||||
|
else:
|
||||||
|
return HttpRequest(httprequest)
|
||||||
|
|
||||||
registry = openerp.modules.registry.RegistryManager.get(db)
|
def get_response(self, httprequest, result, explicit_session):
|
||||||
with registry.cursor() as cr:
|
if isinstance(result, LazyResponse):
|
||||||
m = registry.get('ir.module.module')
|
try:
|
||||||
ids = m.search(cr, openerp.SUPERUSER_ID, [('state', '=', 'installed'), ('name', '!=', 'web')])
|
result.process()
|
||||||
installed = set(x['name'] for x in m.read(cr, 1, ids, ['name']))
|
except(Exception), e:
|
||||||
modules_set = modules_set & installed
|
result = request.registry['ir.http']._handle_exception(e)
|
||||||
|
|
||||||
# building all other methods
|
if isinstance(result, basestring):
|
||||||
gen(['', "web"] + sorted(modules_set), False)
|
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):
|
def get_db_router(self, db):
|
||||||
if db is None:
|
if not db:
|
||||||
router = self.no_db_router
|
return self.nodb_routing_map
|
||||||
else:
|
return request.registry['ir.http'].routing_map()
|
||||||
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
|
|
||||||
|
|
||||||
def db_list(force=False, httprequest=None):
|
def db_list(force=False, httprequest=None):
|
||||||
httprequest = httprequest or request.httprequest
|
httprequest = httprequest or request.httprequest
|
||||||
|
@ -1091,6 +1044,9 @@ def db_monodb(httprequest=None):
|
||||||
return dbs[0]
|
return dbs[0]
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
#----------------------------------------------------------
|
||||||
|
# RPC controller
|
||||||
|
#----------------------------------------------------------
|
||||||
class CommonController(Controller):
|
class CommonController(Controller):
|
||||||
|
|
||||||
@route('/jsonrpc', type='json', auth="none")
|
@route('/jsonrpc', type='json', auth="none")
|
||||||
|
|
|
@ -342,7 +342,7 @@ def load_modules(db, force_demo=False, status=None, update_module=False):
|
||||||
if processed_modules:
|
if processed_modules:
|
||||||
cr.execute("""select model,name from ir_model where id NOT IN (select distinct model_id from ir_model_access)""")
|
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():
|
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',
|
_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('.', '_'))
|
model, model.replace('.', '_'), model.replace('.', '_'), model.replace('.', '_'))
|
||||||
|
|
||||||
|
|
|
@ -199,15 +199,16 @@ class RegistryManager(object):
|
||||||
@classmethod
|
@classmethod
|
||||||
def get(cls, db_name, force_demo=False, status=None, update_module=False):
|
def get(cls, db_name, force_demo=False, status=None, update_module=False):
|
||||||
""" Return a registry for a given database name."""
|
""" Return a registry for a given database name."""
|
||||||
try:
|
with cls.registries_lock:
|
||||||
return cls.registries[db_name]
|
try:
|
||||||
except KeyError:
|
return cls.registries[db_name]
|
||||||
return cls.new(db_name, force_demo, status,
|
except KeyError:
|
||||||
update_module)
|
return cls.new(db_name, force_demo, status,
|
||||||
finally:
|
update_module)
|
||||||
# set db tracker - cleaned up at the WSGI
|
finally:
|
||||||
# dispatching phase in openerp.service.wsgi_server.application
|
# set db tracker - cleaned up at the WSGI
|
||||||
threading.current_thread().dbname = db_name
|
# dispatching phase in openerp.service.wsgi_server.application
|
||||||
|
threading.current_thread().dbname = db_name
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def new(cls, db_name, force_demo=False, status=None,
|
def new(cls, db_name, force_demo=False, status=None,
|
||||||
|
|
|
@ -1147,7 +1147,7 @@ class function(_column):
|
||||||
# make the result a tuple if it is not already one
|
# make the result a tuple if it is not already one
|
||||||
if isinstance(value, (int,long)) and hasattr(obj._columns[field], 'relation'):
|
if isinstance(value, (int,long)) and hasattr(obj._columns[field], 'relation'):
|
||||||
obj_model = obj.pool[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])
|
result = (value, dict_names[value])
|
||||||
|
|
||||||
if field_type == 'binary':
|
if field_type == 'binary':
|
||||||
|
|
|
@ -383,10 +383,12 @@ class browse_record(object):
|
||||||
self.__logger.debug(''.join(traceback.format_stack()))
|
self.__logger.debug(''.join(traceback.format_stack()))
|
||||||
raise KeyError(error_msg)
|
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 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
|
# 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())
|
fields_to_fetch = filter(field_filter, self._table._columns.items())
|
||||||
# gen the list of inherited fields
|
# gen the list of inherited fields
|
||||||
inherits = map(lambda x: (x[0], x[1][2]), self._table._inherit_fields.items())
|
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())
|
ids = filter(lambda id: name not in self._data[id], self._data.keys())
|
||||||
# read the results
|
# read the results
|
||||||
field_names = map(lambda x: x[0], fields_to_fetch)
|
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
|
# TODO: improve this, very slow for reports
|
||||||
if self._fields_process:
|
if self._fields_process:
|
||||||
|
@ -2153,8 +2163,8 @@ class BaseModel(object):
|
||||||
attribute = (child.get('name'), child.text and child.text.encode('utf8') or None)
|
attribute = (child.get('name'), child.text and child.text.encode('utf8') or None)
|
||||||
if attribute[1]:
|
if attribute[1]:
|
||||||
node.set(attribute[0], attribute[1])
|
node.set(attribute[0], attribute[1])
|
||||||
else:
|
elif attribute[0] in node.attrib:
|
||||||
del(node.attrib[attribute[0]])
|
del node.attrib[attribute[0]]
|
||||||
else:
|
else:
|
||||||
sib = node.getnext()
|
sib = node.getnext()
|
||||||
for child in spec:
|
for child in spec:
|
||||||
|
@ -4983,8 +4993,8 @@ class BaseModel(object):
|
||||||
context = {}
|
context = {}
|
||||||
|
|
||||||
# avoid recursion through already copied records in case of circular relationship
|
# avoid recursion through already copied records in case of circular relationship
|
||||||
seen_map = context.setdefault('__copy_data_seen',{})
|
seen_map = context.setdefault('__copy_data_seen', {})
|
||||||
if id in seen_map.setdefault(self._name,[]):
|
if id in seen_map.setdefault(self._name, []):
|
||||||
return
|
return
|
||||||
seen_map[self._name].append(id)
|
seen_map[self._name].append(id)
|
||||||
|
|
||||||
|
@ -4997,15 +5007,6 @@ class BaseModel(object):
|
||||||
else:
|
else:
|
||||||
default['state'] = self._defaults['state']
|
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
|
# build a black list of fields that should not be copied
|
||||||
blacklist = set(MAGIC_COLUMNS + ['parent_left', 'parent_right'])
|
blacklist = set(MAGIC_COLUMNS + ['parent_left', 'parent_right'])
|
||||||
def blacklist_given_fields(obj):
|
def blacklist_given_fields(obj):
|
||||||
|
@ -5018,8 +5019,21 @@ class BaseModel(object):
|
||||||
blacklist.update(set(self.pool[other]._all_columns) - set(self._columns))
|
blacklist.update(set(self.pool[other]._all_columns) - set(self._columns))
|
||||||
else:
|
else:
|
||||||
blacklist_given_fields(self.pool[other])
|
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)
|
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)
|
res = dict(default)
|
||||||
for f, colinfo in self._all_columns.items():
|
for f, colinfo in self._all_columns.items():
|
||||||
field = colinfo.column
|
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)
|
# TODO it seems fields_get can be replaced by _all_columns (no need for translation)
|
||||||
fields = self.fields_get(cr, uid, context=context)
|
fields = self.fields_get(cr, uid, context=context)
|
||||||
|
|
||||||
translation_records = []
|
|
||||||
for field_name, field_def in fields.items():
|
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
|
# we must recursively copy the translations for o2o and o2m
|
||||||
if field_def['type'] == 'one2many':
|
if field_def['type'] == 'one2many':
|
||||||
target_obj = self.pool[field_def['relation']]
|
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
|
# here we rely on the order of the ids to match the translations
|
||||||
# as foreseen in copy_data()
|
# as foreseen in copy_data()
|
||||||
old_children = sorted(old_record[field_name])
|
old_children = sorted(r.id for r in old_record[field_name])
|
||||||
new_children = sorted(new_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):
|
for (old_child, new_child) in zip(old_children, new_children):
|
||||||
target_obj.copy_translations(cr, uid, old_child, new_child, context=context)
|
target_obj.copy_translations(cr, uid, old_child, new_child, context=context)
|
||||||
# and for translatable fields we keep them for copy
|
# and for translatable fields we keep them for copy
|
||||||
elif field_def.get('translate'):
|
elif field_def.get('translate'):
|
||||||
trans_name = ''
|
|
||||||
if field_name in self._columns:
|
if field_name in self._columns:
|
||||||
trans_name = self._name + "," + field_name
|
trans_name = self._name + "," + field_name
|
||||||
|
target_id = new_id
|
||||||
|
source_id = old_id
|
||||||
elif field_name in self._inherit_fields:
|
elif field_name in self._inherit_fields:
|
||||||
trans_name = self._inherit_fields[field_name][0] + "," + field_name
|
trans_name = self._inherit_fields[field_name][0] + "," + field_name
|
||||||
if trans_name:
|
# get the id of the parent record to set the translation
|
||||||
trans_ids = trans_obj.search(cr, uid, [
|
inherit_field_name = self._inherit_fields[field_name][1]
|
||||||
('name', '=', trans_name),
|
target_id = new_record[inherit_field_name].id
|
||||||
('res_id', '=', old_id)
|
source_id = old_record[inherit_field_name].id
|
||||||
])
|
else:
|
||||||
translation_records.extend(trans_obj.read(cr, uid, trans_ids, context=context))
|
continue
|
||||||
|
|
||||||
for record in translation_records:
|
trans_ids = trans_obj.search(cr, uid, [
|
||||||
del record['id']
|
('name', '=', trans_name),
|
||||||
record['res_id'] = new_id
|
('res_id', '=', source_id)
|
||||||
trans_obj.create(cr, uid, record, context=context)
|
])
|
||||||
|
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):
|
def copy(self, cr, uid, id, default=None, context=None):
|
||||||
|
|
|
@ -24,8 +24,6 @@ import re
|
||||||
|
|
||||||
from lxml import etree
|
from lxml import etree
|
||||||
|
|
||||||
import openerp
|
|
||||||
|
|
||||||
import openerp
|
import openerp
|
||||||
import openerp.tools as tools
|
import openerp.tools as tools
|
||||||
import openerp.modules
|
import openerp.modules
|
||||||
|
@ -33,6 +31,9 @@ import print_xml
|
||||||
import render
|
import render
|
||||||
import urllib
|
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)
|
# coerce any type to a unicode string (to preserve non-ascii characters)
|
||||||
# and escape XML entities
|
# and escape XML entities
|
||||||
|
@ -91,13 +92,16 @@ class report_rml(report_int):
|
||||||
}
|
}
|
||||||
|
|
||||||
def create(self, cr, uid, ids, datas, context):
|
def create(self, cr, uid, ids, datas, context):
|
||||||
|
registry = openerp.registry(cr.dbname)
|
||||||
xml = self.create_xml(cr, uid, ids, datas, context)
|
xml = self.create_xml(cr, uid, ids, datas, context)
|
||||||
xml = tools.ustr(xml).encode('utf8')
|
xml = tools.ustr(xml).encode('utf8')
|
||||||
report_type = datas.get('report_type', 'pdf')
|
report_type = datas.get('report_type', 'pdf')
|
||||||
if report_type == 'raw':
|
if report_type == 'raw':
|
||||||
return xml, report_type
|
return xml, report_type
|
||||||
|
|
||||||
|
registry['res.font'].font_scan(cr, SUPERUSER_ID, lazy=True, context=context)
|
||||||
|
|
||||||
rml = self.create_rml(cr, xml, uid, context)
|
rml = self.create_rml(cr, xml, uid, context)
|
||||||
registry = openerp.registry(cr.dbname)
|
|
||||||
ir_actions_report_xml_obj = registry['ir.actions.report.xml']
|
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)
|
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'
|
self.title = report_xml_ids and ir_actions_report_xml_obj.browse(cr,uid,report_xml_ids)[0].name or 'OpenERP Report'
|
||||||
|
|
|
@ -21,10 +21,9 @@
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
from reportlab import rl_config
|
from reportlab import rl_config
|
||||||
from reportlab.lib import fonts
|
|
||||||
from reportlab.pdfbase import pdfmetrics, ttfonts
|
|
||||||
import logging
|
import logging
|
||||||
import os,platform
|
import glob
|
||||||
|
import os
|
||||||
|
|
||||||
# .apidoc title: TTF Font Table
|
# .apidoc title: TTF Font Table
|
||||||
|
|
||||||
|
@ -39,35 +38,14 @@ and Ubuntu distros, we have to override the search path, too.
|
||||||
"""
|
"""
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
# Basic fonts family included in PDF standart, will always be in the font list
|
CustomTTFonts = []
|
||||||
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'),
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
# Search path for TTF files, in addition of rl_config.TTFSearchPath
|
# Search path for TTF files, in addition of rl_config.TTFSearchPath
|
||||||
TTFSearchPath = [
|
TTFSearchPath = [
|
||||||
'/usr/share/fonts/truetype', # SuSE
|
'/usr/share/fonts/truetype', # SuSE
|
||||||
'/usr/share/fonts/dejavu', '/usr/share/fonts/liberation', # Fedora, RHEL
|
'/usr/share/fonts/dejavu', '/usr/share/fonts/liberation', # Fedora, RHEL
|
||||||
'/usr/share/fonts/truetype/*','/usr/local/share/fonts' # Ubuntu,
|
'/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/share/fonts/TTF', # Arch Linux
|
||||||
'/usr/lib/openoffice/share/fonts/truetype/',
|
'/usr/lib/openoffice/share/fonts/truetype/',
|
||||||
'~/.fonts',
|
'~/.fonts',
|
||||||
|
@ -95,10 +73,8 @@ def list_all_sysfonts():
|
||||||
# TTFOpenFile is not very good at it.
|
# TTFOpenFile is not very good at it.
|
||||||
searchpath = list(set(TTFSearchPath + rl_config.TTFSearchPath))
|
searchpath = list(set(TTFSearchPath + rl_config.TTFSearchPath))
|
||||||
for dirname in searchpath:
|
for dirname in searchpath:
|
||||||
dirname = os.path.expanduser(dirname)
|
for filename in glob.glob(os.path.join(os.path.expanduser(dirname), '*.[Tt][Tt][Ff]')):
|
||||||
if os.path.exists(dirname):
|
filepath.append(filename)
|
||||||
for filename in [x for x in os.listdir(dirname) if x.lower().endswith('.ttf')]:
|
|
||||||
filepath.append(os.path.join(dirname, filename))
|
|
||||||
return filepath
|
return filepath
|
||||||
|
|
||||||
def SetCustomFonts(rmldoc):
|
def SetCustomFonts(rmldoc):
|
||||||
|
@ -109,9 +85,9 @@ def SetCustomFonts(rmldoc):
|
||||||
This function is called once per report, so it should
|
This function is called once per report, so it should
|
||||||
avoid system-wide processing (cache it, instead).
|
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):
|
if os.path.isabs(filename) and os.path.exists(filename):
|
||||||
rmldoc.setTTFontMapping(name, font, filename, mode)
|
rmldoc.setTTFontMapping(family, font, filename, mode)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
# 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
Loading…
Reference in New Issue