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