[MERGE]with main branch

bzr revid: jpr@tinyerp.com-20140505095333-v514kj2dz0advdf8
This commit is contained in:
Jitendra Prajapati (OpenERP) 2014-05-05 15:23:33 +05:30
commit 1bb22f2ddd
105 changed files with 608 additions and 598 deletions

View File

@ -93,15 +93,11 @@ The kernel of OpenERP, needed for all installation.
'res/res_partner_image_demo.xml',
],
'test': [
'test/base_test.yml',
'test/test_osv_expression.yml',
'test/test_ir_rule.yml', # <-- These tests modify/add/delete ir_rules.
'tests/base_test.yml',
'tests/test_osv_expression.yml',
'tests/test_ir_rule.yml', # <-- These tests modify/add/delete ir_rules.
],
'installable': True,
'auto_install': True,
'css': ['static/src/css/modules.css'],
'js': [
'static/src/js/apps.js',
],
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -2,30 +2,20 @@
-- Pure SQL
-------------------------------------------------------------------------
-------------------------------------------------------------------------
-- IR dictionary
-------------------------------------------------------------------------
create table ir_values
(
id serial,
name varchar(128) not null,
key varchar(128) not null,
key2 varchar(256) not null,
model varchar(128) not null,
value text,
meta text default NULL,
res_id integer default null,
primary key (id)
CREATE TABLE ir_actions (
id serial,
primary key(id)
);
CREATE TABLE ir_act_window (primary key(id)) INHERITS (ir_actions);
CREATE TABLE ir_act_report_xml (primary key(id)) INHERITS (ir_actions);
CREATE TABLE ir_act_url (primary key(id)) INHERITS (ir_actions);
CREATE TABLE ir_act_server (primary key(id)) INHERITS (ir_actions);
CREATE TABLE ir_act_client (primary key(id)) INHERITS (ir_actions);
-------------------------------------------------------------------------
-- Modules Description
-------------------------------------------------------------------------
CREATE TABLE ir_model (
id serial,
model varchar DEFAULT ''::varchar NOT NULL,
model varchar NOT NULL,
name varchar,
state varchar,
info text,
@ -34,103 +24,27 @@ CREATE TABLE ir_model (
CREATE TABLE ir_model_fields (
id serial,
model varchar DEFAULT ''::varchar NOT NULL,
model_id int references ir_model on delete cascade,
name varchar DEFAULT ''::varchar NOT NULL,
model varchar NOT NULL,
model_id integer references ir_model on delete cascade,
name varchar NOT NULL,
relation varchar,
select_level varchar,
field_description varchar,
ttype varchar,
state varchar default 'base',
relate boolean default False,
relation_field varchar,
translate boolean default False,
serialization_field_id integer references ir_model_fields on delete cascade,
primary key(id)
);
ALTER TABLE ir_model_fields ADD column serialization_field_id int references ir_model_fields on delete cascade;
-------------------------------------------------------------------------
-- Actions
-------------------------------------------------------------------------
CREATE TABLE ir_actions (
id serial NOT NULL,
name varchar(64) DEFAULT ''::varchar NOT NULL,
"type" varchar(32) NOT NULL,
usage varchar(32) DEFAULT null,
CREATE TABLE res_lang (
id serial,
name VARCHAR(64) NOT NULL UNIQUE,
code VARCHAR(16) NOT NULL UNIQUE,
primary key(id)
);
CREATE TABLE ir_act_window (
view_id integer,
res_model varchar(64),
view_type varchar(16),
"domain" varchar(250),
primary key(id)
)
INHERITS (ir_actions);
CREATE TABLE ir_act_report_xml (
model varchar(64) NOT NULL,
report_name varchar(64) NOT NULL,
report_xsl varchar(256),
report_xml varchar(256),
auto boolean default true,
primary key(id)
)
INHERITS (ir_actions);
create table ir_act_report_custom (
report_id int,
-- report_id int references ir_report_custom
primary key(id)
)
INHERITS (ir_actions);
CREATE TABLE ir_act_wizard (
wiz_name varchar(64) NOT NULL,
primary key(id)
)
INHERITS (ir_actions);
CREATE TABLE ir_act_url (
url text NOT NULL,
target varchar(64) NOT NULL,
primary key(id)
)
INHERITS (ir_actions);
CREATE TABLE ir_act_server (
primary key(id)
)
INHERITS (ir_actions);
CREATE TABLE ir_act_client (
primary key(id)
)
INHERITS (ir_actions);
CREATE TABLE ir_ui_menu (
id serial NOT NULL,
parent_id int references ir_ui_menu on delete set null,
name varchar(64) DEFAULT ''::varchar NOT NULL,
icon varchar(64) DEFAULT ''::varchar,
primary key (id)
);
select setval('ir_ui_menu_id_seq', 2);
---------------------------------
-- Res users
---------------------------------
-- level:
-- 0 RESTRICT TO USER
-- 1 RESTRICT TO GROUP
-- 2 PUBLIC
CREATE TABLE res_users (
id serial NOT NULL,
active boolean default True,
@ -138,146 +52,44 @@ CREATE TABLE res_users (
password varchar(64) default null,
-- No FK references below, will be added later by ORM
-- (when the destination rows exist)
company_id int,
partner_id int,
primary key(id)
);
alter table res_users add constraint res_users_login_uniq unique (login);
CREATE TABLE res_groups (
id serial NOT NULL,
name varchar(64) NOT NULL,
company_id integer, -- references res_company,
partner_id integer, -- references res_partner,
primary key(id)
);
CREATE TABLE res_groups_users_rel (
uid integer NOT NULL references res_users on delete cascade,
gid integer NOT NULL references res_groups on delete cascade,
UNIQUE("uid","gid")
);
create index res_groups_users_rel_uid_idx on res_groups_users_rel (uid);
create index res_groups_users_rel_gid_idx on res_groups_users_rel (gid);
---------------------------------
-- Workflows
---------------------------------
create table wkf
(
create table wkf (
id serial,
name varchar(64),
osv varchar(64),
on_create bool default False,
on_create bool default false,
primary key(id)
);
create table wkf_activity
(
id serial,
wkf_id int references wkf on delete cascade,
subflow_id int references wkf on delete set null,
split_mode varchar(3) default 'XOR',
join_mode varchar(3) default 'XOR',
kind varchar(16) not null default 'dummy',
name varchar(64),
signal_send varchar(32) default null,
flow_start boolean default False,
flow_stop boolean default False,
action text default null,
primary key(id)
);
create table wkf_transition
(
id serial,
act_from int references wkf_activity on delete cascade,
act_to int references wkf_activity on delete cascade,
condition varchar(128) default NULL,
trigger_type varchar(128) default NULL,
trigger_expr_id varchar(128) default NULL,
signal varchar(64) default null,
group_id int references res_groups on delete set null,
primary key(id)
);
create table wkf_instance
(
id serial,
wkf_id int references wkf on delete restrict,
uid int default null,
res_id int not null,
res_type varchar(64) not null,
state varchar(32) not null default 'active',
primary key(id)
);
create table wkf_workitem
(
id serial,
act_id int not null references wkf_activity on delete cascade,
inst_id int not null references wkf_instance on delete cascade,
subflow_id int references wkf_instance on delete cascade,
state varchar(64) default 'blocked',
primary key(id)
);
create table wkf_witm_trans
(
trans_id int not null references wkf_transition on delete cascade,
inst_id int not null references wkf_instance on delete cascade
);
create index wkf_witm_trans_inst_idx on wkf_witm_trans (inst_id);
create table wkf_logs
(
id serial,
res_type varchar(128) not null,
res_id int not null,
uid int references res_users on delete set null,
act_id int references wkf_activity on delete set null,
time time not null,
info varchar(128) default NULL,
primary key(id)
);
---------------------------------
-- Modules
---------------------------------
CREATE TABLE ir_module_category (
id serial NOT NULL,
create_uid integer references res_users on delete set null,
create_uid integer, -- references res_users on delete set null,
create_date timestamp without time zone,
write_date timestamp without time zone,
write_uid integer references res_users on delete set null,
write_uid integer, -- references res_users on delete set null,
parent_id integer REFERENCES ir_module_category ON DELETE SET NULL,
name character varying(128) NOT NULL,
primary key(id)
);
CREATE TABLE ir_module_module (
id serial NOT NULL,
create_uid integer references res_users on delete set null,
create_uid integer, -- references res_users on delete set null,
create_date timestamp without time zone,
write_date timestamp without time zone,
write_uid integer references res_users on delete set null,
write_uid integer, -- references res_users on delete set null,
website character varying(256),
summary character varying(256),
name character varying(128) NOT NULL,
author character varying(128),
url character varying(128),
icon character varying(64),
state character varying(16),
latest_version character varying(64),
shortdesc character varying(256),
complexity character varying(32),
category_id integer REFERENCES ir_module_category ON DELETE SET NULL,
description text,
application boolean default False,
@ -292,45 +104,15 @@ ALTER TABLE ir_module_module add constraint name_uniq unique (name);
CREATE TABLE ir_module_module_dependency (
id serial NOT NULL,
create_uid integer references res_users on delete set null,
create_uid integer, -- references res_users on delete set null,
create_date timestamp without time zone,
write_date timestamp without time zone,
write_uid integer references res_users on delete set null,
write_uid integer, -- references res_users on delete set null,
name character varying(128),
version_pattern character varying(128) default NULL,
module_id integer REFERENCES ir_module_module ON DELETE cascade,
primary key(id)
);
CREATE TABLE res_partner (
id serial NOT NULL,
name character varying(128),
lang varchar(64),
company_id int,
primary key(id)
);
CREATE TABLE res_currency (
id serial PRIMARY KEY,
name VARCHAR(32) NOT NULL
);
CREATE TABLE res_company (
id serial PRIMARY KEY,
name character varying(128) not null,
parent_id integer references res_company on delete set null,
partner_id integer not null references res_partner,
currency_id integer not null references res_currency
);
CREATE TABLE res_lang (
id serial PRIMARY KEY,
name VARCHAR(64) NOT NULL UNIQUE,
code VARCHAR(16) NOT NULL UNIQUE
);
CREATE TABLE ir_model_data (
id serial NOT NULL,
create_uid integer,
@ -343,7 +125,8 @@ CREATE TABLE ir_model_data (
date_update timestamp without time zone,
module varchar NOT NULL,
model varchar NOT NULL,
res_id integer, primary key(id)
res_id integer,
primary key(id)
);
-- Records foreign keys and constraints installed by a module (so they can be
@ -352,49 +135,64 @@ CREATE TABLE ir_model_data (
-- - for a constraint: type is 'u' (this is the convention PostgreSQL uses).
CREATE TABLE ir_model_constraint (
id serial NOT NULL,
create_uid integer,
create_date timestamp without time zone,
write_date timestamp without time zone,
write_uid integer,
date_init timestamp without time zone,
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,
type character varying(1) NOT NULL,
name varchar NOT NULL
name varchar NOT NULL,
primary key(id)
);
-- Records relation tables (i.e. implementing many2many) installed by a module
-- (so they can be removed when the module is uninstalled).
CREATE TABLE ir_model_relation (
id serial NOT NULL,
create_uid integer,
create_date timestamp without time zone,
write_date timestamp without time zone,
write_uid integer,
date_init timestamp without time zone,
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 varchar NOT NULL
name varchar NOT NULL,
primary key(id)
);
---------------------------------
-- Users
---------------------------------
insert into res_users (id,login,password,active,company_id,partner_id) VALUES (1,'admin','admin',true,1,1);
insert into ir_model_data (name,module,model,noupdate,res_id) VALUES ('user_root','base','res.users',true,1);
CREATE TABLE res_currency (
id serial,
name varchar NOT NULL,
primary key(id)
);
insert into res_partner (id, name, lang, company_id) VALUES (1, 'Your Company', 'en_US', 1);
insert into ir_model_data (name,module,model,noupdate,res_id) VALUES ('main_partner','base','res.partner',true,1);
CREATE TABLE res_company (
id serial,
name varchar NOT NULL,
partner_id integer,
currency_id integer,
primary key(id)
);
CREATE TABLE res_partner (
id serial,
name varchar,
company_id integer,
primary key(id)
);
---------------------------------
-- Default data
---------------------------------
insert into res_currency (id, name) VALUES (1, 'EUR');
insert into ir_model_data (name,module,model,noupdate,res_id) VALUES ('EUR','base','res.currency',true,1);
insert into ir_model_data (name, module, model, noupdate, res_id) VALUES ('EUR', 'base', 'res.currency', true, 1);
select setval('res_currency_id_seq', 2);
insert into res_company (id, name, partner_id, currency_id) VALUES (1, 'Your Company', 1, 1);
insert into ir_model_data (name,module,model,noupdate,res_id) VALUES ('main_company','base','res.company',true,1);
insert into ir_model_data (name, module, model, noupdate, res_id) VALUES ('main_company', 'base', 'res.company', true, 1);
select setval('res_company_id_seq', 2);
select setval('res_users_id_seq', 2);
insert into res_partner (id, name, company_id) VALUES (1, 'Your Company', 1);
insert into ir_model_data (name, module, model, noupdate, res_id) VALUES ('main_partner', 'base', 'res.partner', true, 1);
select setval('res_partner_id_seq', 2);
select setval('res_currency_id_seq', 2);
insert into res_users (id, login, password, active, partner_id, company_id) VALUES (1, 'admin', 'admin', true, 1, 1);
insert into ir_model_data (name, module, model, noupdate, res_id) VALUES ('user_root', 'base', 'res.users', true, 1);
select setval('res_users_id_seq', 2);

View File

@ -11,15 +11,6 @@
</field>
<field name="field_parent">child_id</field>
</record>
<record id="action_menu_admin" model="ir.actions.act_window">
<field name="name">Menu</field>
<field name="usage">menu</field>
<field name="type">ir.actions.act_window</field>
<field name="view_id" ref="view_menu"/>
<field name="res_model">ir.ui.menu</field>
<field name="view_type">tree</field>
<field name="domain">[('parent_id', '=', False)]</field>
</record>
<record id="lang_en" model="res.lang">
<field name="code">en_US</field>
@ -75,7 +66,6 @@
<field name="partner_id" ref="base.partner_root"/>
<field name="company_id" ref="main_company"/>
<field name="company_ids" eval="[(4, ref('main_company'))]"/>
<field name="menu_id" ref="action_menu_admin"/>
<field name="signature">--
Administrator</field>
</record>

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:37+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:43+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:38+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:43+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:38+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:43+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:38+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:44+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:39+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:45+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base
@ -579,7 +579,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_idea
msgid "Ideas"
msgstr ""
msgstr "Идеи"
#. module: base
#: model:ir.module.module,description:base.module_event
@ -668,7 +668,7 @@ msgstr "Колумбия"
#. module: base
#: model:res.partner.title,name:base.res_partner_title_mister
msgid "Mister"
msgstr ""
msgstr "Господин"
#. module: base
#: help:res.country,code:0
@ -720,7 +720,7 @@ msgstr "Персонализираните полета трябва да има
#. 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
@ -835,7 +835,7 @@ msgstr "Еритрея"
#. module: base
#: sql_constraint:res.company:0
msgid "The company name must be unique !"
msgstr ""
msgstr "Името на фирмата трябва да е уникално!"
#. module: base
#: model:ir.ui.menu,name:base.menu_base_action_rule_admin
@ -845,7 +845,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
@ -890,7 +890,7 @@ msgstr "шведски / svenska"
#: field:base.language.export,name:0
#: field:ir.attachment,datas_fname:0
msgid "File Name"
msgstr ""
msgstr "Име на файла"
#. module: base
#: model:res.country,name:base.rs
@ -1169,6 +1169,8 @@ msgstr "TGZ Архив"
msgid ""
"Users added to this group are automatically added in the following groups."
msgstr ""
"Потребителите добавени в тази група автоматично ще бъдат добавени и в "
"следните групи."
#. module: base
#: code:addons/base/ir/ir_model.py:732
@ -1205,7 +1207,7 @@ msgstr "Вид"
#. module: base
#: field:ir.mail_server,smtp_user:0
msgid "Username"
msgstr ""
msgstr "Потребителско име"
#. module: base
#: model:ir.module.module,description:base.module_l10n_br
@ -1345,7 +1347,7 @@ msgstr ""
#. module: base
#: field:ir.module.category,visible:0
msgid "Visible"
msgstr ""
msgstr "Видим"
#. module: base
#: model:ir.actions.client,name:base.action_client_base_menu
@ -1431,7 +1433,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_tests
msgid "Tests"
msgstr ""
msgstr "Тестове"
#. module: base
#: field:ir.actions.report.xml,attachment:0
@ -1512,7 +1514,7 @@ 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
@ -1655,7 +1657,7 @@ msgstr "Не съществува език с код \"%s\""
#: model:ir.module.category,name:base.module_category_social_network
#: model:ir.module.module,shortdesc:base.module_mail
msgid "Social Network"
msgstr ""
msgstr "Социална мрежа"
#. module: base
#: view:res.lang:0
@ -1814,12 +1816,12 @@ msgstr ""
#. module: base
#: field:res.partner,image_small:0
msgid "Small-sized image"
msgstr ""
msgstr "Картинка с малък размер"
#. module: base
#: model:ir.module.module,shortdesc:base.module_stock
msgid "Warehouse Management"
msgstr ""
msgstr "Управление на складове"
#. module: base
#: model:ir.model,name:base.model_res_request_link
@ -1859,7 +1861,7 @@ msgstr "Източен Тимор"
#: view:ir.module.module:0
#, python-format
msgid "Install"
msgstr ""
msgstr "Инсталиране"
#. module: base
#: field:res.currency,accuracy:0
@ -2188,7 +2190,7 @@ msgstr ""
#: model:ir.ui.menu,name:base.menu_administration
#: model:res.groups,name:base.group_system
msgid "Settings"
msgstr ""
msgstr "Настройки"
#. module: base
#: selection:ir.actions.act_window,view_type:0
@ -2274,7 +2276,7 @@ msgstr ""
#. module: base
#: model:ir.module.category,name:base.module_category_tools
msgid "Extra Tools"
msgstr ""
msgstr "Допълнителни инструменти"
#. module: base
#: view:ir.attachment:0
@ -2292,6 +2294,8 @@ msgid ""
"Appears by default on the top right corner of your printed documents (report "
"header)."
msgstr ""
"По подразбиране се появява в горния десен ъгъл на принтираните документи "
"(горния колонтитул на отчетите)"
#. module: base
#: field:base.module.update,update:0
@ -2301,7 +2305,7 @@ msgstr "Брой обновени модули"
#. module: base
#: field:ir.cron,function:0
msgid "Method"
msgstr ""
msgstr "Метод"
#. module: base
#: model:ir.module.module,shortdesc:base.module_auth_crypt
@ -2350,7 +2354,7 @@ msgstr ""
#. module: base
#: field:change.password.user,new_passwd:0
msgid "New Password"
msgstr ""
msgstr "Нова парола"
#. module: base
#: model:ir.actions.act_window,help:base.action_ui_view
@ -2968,7 +2972,7 @@ msgstr ""
#: code:addons/base/ir/ir_fields.py:146
#, python-format
msgid "yes"
msgstr ""
msgstr "да"
#. module: base
#: field:ir.model.fields,serialization_field_id:0
@ -3184,7 +3188,7 @@ msgstr ""
#: view:res.users:0
#, python-format
msgid "Application"
msgstr ""
msgstr "Приложение"
#. module: base
#: model:res.groups,comment:base.group_hr_manager
@ -3507,7 +3511,7 @@ msgstr "workflow.activity"
#. module: base
#: view:base.language.export:0
msgid "Export Complete"
msgstr ""
msgstr "Изнасянето завърши"
#. module: base
#: help:ir.ui.view_sc,res_id:0
@ -3744,7 +3748,7 @@ msgstr ""
#: field:res.company,rml_footer:0
#: field:res.company,rml_footer_readonly:0
msgid "Report Footer"
msgstr ""
msgstr "Долен колонтитул на отчета"
#. module: base
#: selection:res.lang,direction:0
@ -3869,7 +3873,7 @@ msgstr ""
#: code:addons/orm.py:3902
#, python-format
msgid "Access Denied"
msgstr ""
msgstr "Отказан достъп"
#. module: base
#: field:res.company,name:0
@ -3952,7 +3956,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.je
msgid "Jersey"
msgstr ""
msgstr "Джърси (остров)"
#. module: base
#: model:ir.model,name:base.model_ir_translation
@ -4017,7 +4021,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.sk
msgid "Slovakia"
msgstr ""
msgstr "Словакия"
#. module: base
#: model:res.country,name:base.nr
@ -4378,7 +4382,7 @@ msgstr "Обобщение"
#. module: base
#: model:ir.module.category,name:base.module_category_hidden_dependency
msgid "Dependency"
msgstr ""
msgstr "Зависимост"
#. module: base
#: model:ir.module.module,description:base.module_portal
@ -4472,7 +4476,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_knowledge
msgid "Knowledge Management System"
msgstr ""
msgstr "Система за управление на ЗНАНИЯ"
#. module: base
#: view:workflow.activity:0
@ -4685,7 +4689,7 @@ msgstr "Изглед"
#: code:addons/base/ir/ir_fields.py:146
#, python-format
msgid "no"
msgstr ""
msgstr "не"
#. module: base
#: model:ir.module.module,description:base.module_crm_partner_assign
@ -4767,7 +4771,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.ps
msgid "Palestinian Territory, Occupied"
msgstr ""
msgstr "Палестинска територия, Окупирана"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_ch
@ -4859,7 +4863,7 @@ msgstr "Правила"
#. module: base
#: field:ir.mail_server,smtp_host:0
msgid "SMTP Server"
msgstr ""
msgstr "SMTP сървър"
#. module: base
#: code:addons/base/module/module.py:320
@ -5239,7 +5243,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_hr_recruitment
msgid "Recruitment Process"
msgstr ""
msgstr "Процес на наемане"
#. module: base
#: model:res.country,name:base.br
@ -5693,7 +5697,7 @@ msgstr "Монсерат"
#. module: base
#: model:ir.module.module,shortdesc:base.module_decimal_precision
msgid "Decimal Precision Configuration"
msgstr ""
msgstr "Настройки на десетична точност"
#. module: base
#: model:ir.model,name:base.model_ir_actions_act_url
@ -5850,7 +5854,7 @@ msgstr ""
#. module: base
#: view:ir.translation:0
msgid "Comments"
msgstr ""
msgstr "Коментари"
#. module: base
#: model:res.country,name:base.et
@ -5860,7 +5864,7 @@ msgstr "Етиопия"
#. module: base
#: model:ir.module.category,name:base.module_category_authentication
msgid "Authentication"
msgstr ""
msgstr "Идентификация"
#. module: base
#: model:res.country,name:base.sj
@ -5929,7 +5933,7 @@ msgstr "Свойство при изтриване на полета много-
#. module: base
#: model:ir.module.category,name:base.module_category_accounting_and_finance
msgid "Accounting & Finance"
msgstr ""
msgstr "Счетоводство и финанси"
#. module: base
#: field:ir.actions.server,write_id:0
@ -6082,7 +6086,7 @@ msgstr "Името на група не може да започва с \"-\""
#: view:ir.module.module:0
#: model:ir.ui.menu,name:base.module_mi
msgid "Apps"
msgstr ""
msgstr "Приложения"
#. module: base
#: view:ir.ui.view_sc:0
@ -6135,7 +6139,7 @@ msgstr ""
#. module: base
#: view:res.partner:0
msgid "Phone:"
msgstr ""
msgstr "Телефон:"
#. module: base
#: field:res.partner,is_company:0
@ -6811,7 +6815,7 @@ msgstr ""
#. module: base
#: field:res.users,id:0
msgid "ID"
msgstr ""
msgstr "ID"
#. module: base
#: field:ir.cron,doall:0
@ -6833,7 +6837,7 @@ msgstr "Свързване на обекти"
#: field:ir.module.category,xml_id:0
#: field:ir.ui.view,xml_id:0
msgid "External ID"
msgstr ""
msgstr "Външен ID"
#. module: base
#: help:res.currency.rate,rate:0
@ -7286,7 +7290,7 @@ msgstr "Върху множество документи"
#: view:res.users:0
#: view:wizard.ir.model.menu.create:0
msgid "or"
msgstr ""
msgstr "или"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_accountant
@ -7296,7 +7300,7 @@ msgstr ""
#. module: base
#: view:ir.module.module:0
msgid "Upgrade"
msgstr ""
msgstr "Надгради"
#. module: base
#: model:ir.module.module,description:base.module_base_action_rule
@ -7334,7 +7338,7 @@ msgstr "Фарьорски острови"
#. module: base
#: field:ir.mail_server,smtp_encryption:0
msgid "Connection Security"
msgstr ""
msgstr "Сигурност на връзката"
#. module: base
#: code:addons/base/ir/ir_actions.py:606
@ -7437,7 +7441,7 @@ msgstr ""
#. module: base
#: model:res.partner.category,name:base.res_partner_category_14
msgid "Manufacturer"
msgstr ""
msgstr "Производител"
#. module: base
#: help:res.users,company_id:0
@ -7724,7 +7728,7 @@ msgstr ""
#. module: base
#: view:ir.mail_server:0
msgid "Test Connection"
msgstr ""
msgstr "Тестване на връзка"
#. module: base
#: model:res.country,name:base.mm
@ -8251,7 +8255,7 @@ msgstr "ir.ui.menu"
#. module: base
#: model:ir.module.module,shortdesc:base.module_project
msgid "Project Management"
msgstr ""
msgstr "Управление на проекти"
#. module: base
#: view:ir.module.module:0
@ -8965,7 +8969,7 @@ msgstr ""
#. module: base
#: field:res.partner.title,shortcut:0
msgid "Abbreviation"
msgstr ""
msgstr "Абревиатура"
#. module: base
#: model:ir.ui.menu,name:base.menu_crm_case_job_req_main
@ -9209,7 +9213,7 @@ msgstr "Справка"
#. module: base
#: model:res.partner.title,shortcut:base.res_partner_title_prof
msgid "Prof."
msgstr ""
msgstr "Проф."
#. module: base
#: code:addons/base/ir/ir_mail_server.py:241
@ -9237,7 +9241,7 @@ msgstr "Уеб-страница"
#. module: base
#: selection:ir.mail_server,smtp_encryption:0
msgid "None"
msgstr ""
msgstr "Няма"
#. module: base
#: model:ir.module.module,shortdesc:base.module_hr_holidays
@ -10243,7 +10247,7 @@ msgstr "Питкерн"
#. module: base
#: field:res.partner,category_id:0
msgid "Tags"
msgstr ""
msgstr "Етикети"
#. module: base
#: view:base.module.upgrade:0
@ -15371,7 +15375,7 @@ msgstr "Съдържание"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_mrp
msgid "Sales and MRP Management"
msgstr ""
msgstr "Продажби и MRP управление"
#. module: base
#: model:ir.actions.act_window,help:base.action_partner_form

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:39+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:44+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:39+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:44+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:39+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:45+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:40+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:45+0000\n"
"X-Generator: Launchpad (build 16985)\n"
"X-Poedit-Language: Czech\n"

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:40+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:46+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:42+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:48+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base
@ -8669,7 +8669,7 @@ msgstr ""
#. module: base
#: field:ir.ui.menu,needaction_enabled:0
msgid "Target model uses the need action mechanism"
msgstr ""
msgstr "Ziel-Modell nutzt den need_action Mechanismus"
#. module: base
#: help:ir.model.fields,relation:0
@ -17357,7 +17357,7 @@ msgstr "Helpdesk"
#. module: base
#: field:ir.rule,perm_write:0
msgid "Apply for Write"
msgstr ""
msgstr "Zum Schreiben anwenden"
#. module: base
#: field:ir.ui.menu,parent_left:0
@ -18812,7 +18812,7 @@ msgstr "Funktion"
#. module: base
#: field:ir.ui.menu,parent_right:0
msgid "Parent Right"
msgstr ""
msgstr "Oberkonto Rechts"
#. module: base
#: model:ir.module.category,description:base.module_category_customer_relationship_management
@ -18887,7 +18887,7 @@ msgstr "Bedarfsmeldungen"
#. module: base
#: selection:ir.actions.act_window,target:0
msgid "Inline Edit"
msgstr ""
msgstr "Eingebettet Bearbeiten"
#. module: base
#: selection:ir.cron,interval_type:0

View File

@ -12,7 +12,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:42+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:49+0000\n"
"X-Generator: Launchpad (build 16985)\n"
"X-Poedit-Country: GREECE\n"
"X-Poedit-Language: Greek\n"

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:52+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:58+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:49+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:55+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:52+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:58+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:53+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:59+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:52+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:58+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:53+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:59+0000\n"
"X-Generator: Launchpad (build 16985)\n"
"Language: \n"

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:52+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:58+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:54+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 06:00+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:54+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 06:00+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:54+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 06:01+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:51+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:57+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:40+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:47+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:39+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:44+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -9,7 +9,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:46+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:53+0000\n"
"X-Generator: Launchpad (build 16985)\n"
"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
"X-Poedit-Language: Persian\n"

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:55+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 06:01+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:41+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:47+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:41+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:48+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:53+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:58+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:42+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:49+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:42+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:49+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:43+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:49+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:43+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:50+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base
@ -25,6 +25,9 @@ msgid ""
"================================================\n"
" "
msgstr ""
"\n"
"धनादेश लेखन और मुद्रण मापांक.\n"
" "
#. module: base
#: model:res.country,name:base.sh
@ -34,12 +37,12 @@ msgstr "सैंट हेलेना"
#. module: base
#: view:ir.actions.report.xml:0
msgid "Other Configuration"
msgstr ""
msgstr "इतर समाकृति"
#. module: base
#: selection:ir.property,type:0
msgid "DateTime"
msgstr "वेड"
msgstr "तारीखवक़्त"
#. module: base
#: code:addons/fields.py:652
@ -53,17 +56,17 @@ msgstr ""
#: field:ir.ui.view,arch:0
#: field:ir.ui.view.custom,arch:0
msgid "View Architecture"
msgstr ""
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
msgid "No gap"
msgstr ""
msgstr "कोई अंतर नहीं"
#. module: base
#: selection:base.language.install,lang:0

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:48+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:54+0000\n"
"X-Generator: Launchpad (build 16985)\n"
"Language: hr\n"

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:43+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:50+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -9,7 +9,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:38+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:44+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:43+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:50+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:43+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:50+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:44+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:51+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:44+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:51+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:41+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:48+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:44+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:51+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:44+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:51+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:45+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:52+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:45+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:52+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:45+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:52+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:46+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:52+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:46+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:53+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:40+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:46+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:53+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:59+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:47+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:53+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:47+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:53+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:51+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:57+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:47+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:54+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:48+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:54+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:49+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:55+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:49+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:55+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:38+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:43+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:48+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:54+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:55+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 06:01+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:49+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:55+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:50+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:56+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:50+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:56+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:50+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:56+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:50+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:56+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:50+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:57+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:51+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:57+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:54+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:59+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:51+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:57+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -13,7 +13,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2014-04-17 05:53+0000\n"
"X-Launchpad-Export-Date: 2014-04-24 05:59+0000\n"
"X-Generator: Launchpad (build 16985)\n"
#. module: base

View File

@ -43,7 +43,5 @@ class ir_default(osv.osv):
_defaults = {
'company_id': _get_company_id,
}
ir_default()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -31,7 +31,6 @@ class ir_exports(osv.osv):
'export_fields': fields.one2many('ir.exports.line', 'export_id',
'Export ID'),
}
ir_exports()
class ir_exports_line(osv.osv):
@ -41,7 +40,6 @@ class ir_exports_line(osv.osv):
'name': fields.char('Field Name', size=64),
'export_id': fields.many2one('ir.exports', 'Export', select=True, ondelete='cascade'),
}
ir_exports_line()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -142,6 +142,4 @@ class ir_filters(osv.osv):
'is_default': False
}
ir_filters()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -2,19 +2,27 @@
import collections
import cStringIO
import datetime
import hashlib
import json
import logging
import math
import os
import re
import sys
import xml # FIXME use lxml and etree
import itertools
import lxml.html
from urlparse import urlparse
import babel
import babel.dates
import werkzeug.utils
import werkzeug
from PIL import Image
import openerp.http
import openerp.tools
import openerp.tools.func
import openerp.tools.lru
from openerp.tools.safe_eval import safe_eval as eval
from openerp.osv import osv, orm, fields
from openerp.tools.translate import _
@ -396,6 +404,22 @@ class QWeb(orm.AbstractModel):
pass
return self.render(cr, uid, template, d)
def render_tag_call_assets(self, element, template_attributes, generated_attributes, qwebcontext):
""" This special 't-call' tag can be used in order to aggregate/minify javascript and css assets"""
name = template_attributes['call-assets']
# Backward compatibility hack for manifest usage
qwebcontext['manifest_list'] = openerp.addons.web.controllers.main.manifest_list
d = qwebcontext.copy()
d.context['inherit_branding'] = False
content = self.render_tag_call(
element, {'call': name}, generated_attributes, d)
if qwebcontext.get('debug'):
return content
bundle = AssetsBundle(name, html=content)
return bundle.to_html()
def render_tag_set(self, element, template_attributes, generated_attributes, qwebcontext):
if "value" in template_attributes:
qwebcontext[template_attributes["set"]] = self.eval_object(template_attributes["value"], qwebcontext)
@ -821,7 +845,6 @@ class RelativeDatetimeConverter(osv.AbstractModel):
return babel.dates.format_timedelta(
value - reference, add_direction=True, locale=locale)
class Contact(orm.AbstractModel):
_name = 'ir.qweb.field.contact'
_inherit = 'ir.qweb.field.many2one'
@ -836,7 +859,7 @@ class Contact(orm.AbstractModel):
id = getattr(record, field_name).id
field_browse = self.pool[column._obj].browse(cr, openerp.SUPERUSER_ID, id, context={"show_address": True})
value = werkzeug.utils.escape( field_browse.name_get()[0][1] )
value = field_browse.name_get()[0][1]
val = {
'name': value.split("\n")[0],
@ -951,4 +974,237 @@ def get_field_type(column, options):
"""
return options.get('widget', column._type)
class AssetsBundle(object):
cache = openerp.tools.lru.LRU(32)
rx_css_import = re.compile("(@import[^;{]+;?)", re.M)
def __init__(self, xmlid, html=None, debug=False):
self.debug = debug
self.xmlid = xmlid
self.javascripts = []
self.stylesheets = []
self.remains = []
self._checksum = None
if html:
self.parse(html)
def parse(self, html):
fragments = lxml.html.fragments_fromstring(html)
for el in fragments:
if isinstance(el, basestring):
self.remains.append(el)
elif isinstance(el, lxml.html.HtmlElement):
src = el.get('src')
href = el.get('href')
if el.tag == 'style':
self.stylesheets.append(StylesheetAsset(source=el.text))
elif el.tag == 'link' and el.get('rel') == 'stylesheet' and self.can_aggregate(href):
self.stylesheets.append(StylesheetAsset(url=href))
elif el.tag == 'script' and not src:
self.javascripts.append(JavascriptAsset(source=el.text))
elif el.tag == 'script' and self.can_aggregate(src):
self.javascripts.append(JavascriptAsset(url=src))
else:
self.remains.append(lxml.html.tostring(el))
else:
try:
self.remains.append(lxml.html.tostring(el))
except Exception:
# notYETimplementederror
raise NotImplementedError
def can_aggregate(self, url):
return not urlparse(url).netloc and not url.startswith(('/web/css', '/web/js'))
def to_html(self, sep='\n'):
response = []
if self.stylesheets:
response.append('<link href="/web/css/%s" rel="stylesheet"/>' % self.xmlid)
if self.javascripts:
response.append('<script type="text/javascript" src="/web/js/%s"></script>' % self.xmlid)
response.extend(self.remains)
return sep.join(response)
@openerp.tools.func.lazy_property
def last_modified(self):
return max(itertools.chain(
(asset.last_modified for asset in self.javascripts),
(asset.last_modified for asset in self.stylesheets),
[datetime.datetime(1970, 1, 1)],
))
@openerp.tools.func.lazy_property
def checksum(self):
checksum = hashlib.new('sha1')
for asset in itertools.chain(self.javascripts, self.stylesheets):
checksum.update(asset.content.encode("utf-8"))
return checksum.hexdigest()
def js(self):
key = 'js_' + self.checksum
if key not in self.cache:
content =';\n'.join(asset.minify() for asset in self.javascripts)
self.cache[key] = content
if self.debug:
return "/*\n%s\n*/\n" % '\n'.join(
[asset.filename for asset in self.javascripts if asset.filename]) + self.cache[key]
return self.cache[key]
def css(self):
key = 'css_' + self.checksum
if key not in self.cache:
content = '\n'.join(asset.minify() for asset in self.stylesheets)
# move up all @import rules to the top
matches = []
def push(matchobj):
matches.append(matchobj.group(0))
return ''
content = re.sub(self.rx_css_import, push, content)
matches.append(content)
content = u'\n'.join(matches)
self.cache[key] = content
if self.debug:
return "/*\n%s\n*/\n" % '\n'.join(
[asset.filename for asset in self.javascripts if asset.filename]) + self.cache[key]
return self.cache[key]
class WebAsset(object):
def __init__(self, source=None, url=None):
self.source = source
self.url = url
self._filename = None
self._content = None
@property
def filename(self):
if self._filename is None and self.url:
module = filter(None, self.url.split('/'))[0]
try:
mpath = openerp.http.addons_manifest[module]['addons_path']
except Exception:
raise KeyError("Could not find asset '%s' for '%s' addon" % (self.url, module))
self._filename = mpath + self.url.replace('/', os.path.sep)
return self._filename
@property
def content(self):
if self._content is None:
self._content = self.get_content()
return self._content
def get_content(self):
if self.source:
return self.source
with open(self.filename, 'rb') as fp:
return fp.read().decode('utf-8')
def minify(self):
return self.content
@property
def last_modified(self):
if self.source:
# TODO: return last_update of bundle's ir.ui.view
return datetime.datetime(1970, 1, 1)
return datetime.datetime.fromtimestamp(os.path.getmtime(self.filename))
class JavascriptAsset(WebAsset):
def minify(self):
return rjsmin(self.content)
class StylesheetAsset(WebAsset):
rx_import = re.compile(r"""@import\s+('|")(?!'|"|/|https?://)""", re.U)
rx_url = re.compile(r"""url\s*\(\s*('|"|)(?!'|"|/|https?://|data:)""", re.U)
rx_sourceMap = re.compile(r'(/\*# sourceMappingURL=.*)', re.U)
def _get_content(self):
if self.source:
return self.source
with open(self.filename, 'rb') as fp:
firstline = fp.readline()
m = re.match(r'@charset "([^"]+)";', firstline)
if m:
encoding = m.group(1)
else:
encoding = "utf-8"
# "reinject" first line as it's not @charset
fp.seek(0)
return fp.read().decode(encoding)
def get_content(self):
content = self._get_content()
if self.url:
web_dir = os.path.dirname(self.url)
content = self.rx_import.sub(
r"""@import \1%s/""" % (web_dir,),
content,
)
content = self.rx_url.sub(
r"url(\1%s/" % (web_dir,),
content,
)
return content
def minify(self):
# remove existing sourcemaps, make no sense after re-mini
content = self.rx_sourceMap.sub('', self.content)
# comments
content = re.sub(r'/\*.*?\*/', '', content, flags=re.S)
# space
content = re.sub(r'\s+', ' ', content)
content = re.sub(r' *([{}]) *', r'\1', content)
return content
def rjsmin(script):
""" Minify js with a clever regex.
Taken from http://opensource.perlig.de/rjsmin
Apache License, Version 2.0 """
def subber(match):
""" Substitution callback """
groups = match.groups()
return (
groups[0] or
groups[1] or
groups[2] or
groups[3] or
(groups[4] and '\n') or
(groups[5] and ' ') or
(groups[6] and ' ') or
(groups[7] and ' ') or
''
)
result = re.sub(
r'([^\047"/\000-\040]+)|((?:(?:\047[^\047\\\r\n]*(?:\\(?:[^\r\n]|\r?'
r'\n|\r)[^\047\\\r\n]*)*\047)|(?:"[^"\\\r\n]*(?:\\(?:[^\r\n]|\r?\n|'
r'\r)[^"\\\r\n]*)*"))[^\047"/\000-\040]*)|(?:(?<=[(,=:\[!&|?{};\r\n]'
r')(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/'
r'))*((?:/(?![\r\n/*])[^/\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*'
r'(?:\\[^\r\n][^\\\]\r\n]*)*\]))[^/\\\[\r\n]*)*/)[^\047"/\000-\040]*'
r'))|(?:(?<=[\000-#%-,./:-@\[-^`{-~-]return)(?:[\000-\011\013\014\01'
r'6-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*((?:/(?![\r\n/*])[^/'
r'\\\[\r\n]*(?:(?:\\[^\r\n]|(?:\[[^\\\]\r\n]*(?:\\[^\r\n][^\\\]\r\n]'
r'*)*\]))[^/\\\[\r\n]*)*/)[^\047"/\000-\040]*))|(?<=[^\000-!#%&(*,./'
r':-@\[\\^`{|~])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/'
r'*][^*]*\*+)*/))*(?:((?:(?://[^\r\n]*)?[\r\n]))(?:[\000-\011\013\01'
r'4\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))*)+(?=[^\000-\040"#'
r'%-\047)*,./:-@\\-^`|-~])|(?<=[^\000-#%-,./:-@\[-^`{-~-])((?:[\000-'
r'\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=[^'
r'\000-#%-,./:-@\[-^`{-~-])|(?<=\+)((?:[\000-\011\013\014\016-\040]|'
r'(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=\+)|(?<=-)((?:[\000-\011\0'
r'13\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)))+(?=-)|(?:[\0'
r'00-\011\013\014\016-\040]|(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/))+|(?:'
r'(?:(?://[^\r\n]*)?[\r\n])(?:[\000-\011\013\014\016-\040]|(?:/\*[^*'
r']*\*+(?:[^/*][^*]*\*+)*/))*)+', subber, '\n%s\n' % script
).strip()
return result
# vim:et:

View File

@ -172,7 +172,4 @@ class ir_rule(osv.osv):
self.clear_cache(cr,uid)
return res
ir_rule()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -20,15 +20,19 @@
##############################################################################
import collections
import copy
import datetime
import dateutil
from dateutil.relativedelta import relativedelta
import fnmatch
import logging
from lxml import etree
from operator import itemgetter
import os
import time
from operator import itemgetter
import simplejson
import werkzeug
import HTMLParser
from lxml import etree
import openerp
from openerp import tools
@ -873,9 +877,13 @@ class view(osv.osv):
values = dict()
qcontext = dict(
keep_query=keep_query,
request=request,
request=request, # might be unbound if we're not in an httprequest context
debug=request.debug if request else False,
json=simplejson,
quote_plus=werkzeug.url_quote_plus,
time=time,
datetime=datetime,
relativedelta=relativedelta,
)
qcontext.update(values)
@ -973,12 +981,23 @@ class view(osv.osv):
def _validate_module_views(self, cr, uid, module):
"""Validate architecture of all the views of a given module"""
assert not self.pool._init or module in self.pool._init_modules
xmlid_filter = ''
params = (module,)
if self.pool._init:
# only validate the views that are still existing...
xmlid_filter = "AND md.name IN %s"
names = tuple(name for (xmod, name), (model, res_id) in self.pool.model_data_reference_ids.items() if xmod == module and model == self._name)
if not names:
# no views for this module, nothing to validate
return
params += (names,)
cr.execute("""SELECT max(v.id)
FROM ir_ui_view v
LEFT JOIN ir_model_data md ON (md.model = 'ir.ui.view' AND md.res_id = v.id)
WHERE md.module = %s
{0}
GROUP BY coalesce(v.inherit_id, v.id)
""", (module,))
""".format(xmlid_filter), params)
for vid, in cr.fetchall():
if not self._check_xml(cr, uid, [vid]):

View File

@ -59,6 +59,7 @@
<field name="model"/>
<field name="inherit_id"/>
<field name="type"/>
<field name="arch"/>
<group expand="0" string="Group By...">
<filter string="Object" domain="[]" context="{'group_by':'model'}"/>
<filter string="Type" domain="[]" context="{'group_by':'type'}"/>

View File

@ -182,9 +182,4 @@ class ir_property(osv.osv):
'|', ('company_id', '=', cid), ('company_id', '=', False)]
return domain
ir_property()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -51,9 +51,6 @@ class Bank(osv.osv):
result.append((bank.id, (bank.bic and (bank.bic + ' - ') or '') + bank.name))
return result
Bank()
class res_partner_bank_type(osv.osv):
_description='Bank Account Type'
_name = 'res.partner.bank.type'
@ -67,7 +64,6 @@ class res_partner_bank_type(osv.osv):
_defaults = {
'format_layout': lambda *args: "%(bank_name)s: %(acc_number)s"
}
res_partner_bank_type()
class res_partner_bank_type_fields(osv.osv):
_description='Bank type fields'
@ -80,8 +76,6 @@ class res_partner_bank_type_fields(osv.osv):
'readonly': fields.boolean('Readonly'),
'size': fields.integer('Max. Size'),
}
res_partner_bank_type_fields()
class res_partner_bank(osv.osv):
'''Bank Accounts'''
@ -234,6 +228,4 @@ class res_partner_bank(osv.osv):
result['state_id'] = part.state_id.id
return {'value': result}
res_partner_bank()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -80,33 +80,30 @@
</group>
</group>
</page>
<page string="Reports Configuration">
<group string="Footer Configuration">
<page string="Report Configuration">
<group string="Configuration">
<field name="custom_footer" on_change="onchange_footer(custom_footer, phone, fax, email, website, vat, company_registry, bank_ids)"/>
<field name="rml_footer" attrs="{'invisible': [('custom_footer','=',False)]}"/>
<field name="rml_footer_readonly" attrs="{'invisible': [('custom_footer','=',True)]}"/>
</group>
<group string="RML Configuration">
<group string="Configuration (RML)" col="2" groups="base.group_no_one">
<field name="rml_paper_format" on_change="onchange_rml_paper_format(rml_paper_format)"/>
</group>
<group>
<label for="font" />
<div>
<div>
<field name="font" class="oe_inline" colspan="2" on_change="onchange_font_name(font, rml_header, rml_header2, rml_header3)" />
<button string="(reload fonts)" name="act_discover_fonts" type="object" class="oe_link" colspan="1"/>
</div>
<field name="font" class="oe_inline" on_change="onchange_font_name(font, rml_header, rml_header2, rml_header3)" />
<button string="(reload fonts)" name="act_discover_fonts" type="object" class="oe_link" colspan="1"/>
</div>
<div class="oe_right oe_button_box" name="button_box" colspan="2">
<button name="%(preview_report)d" string="Preview Header/Footer" type="action"/>
</div>
<group col="1" colspan="2">
<field name="rml_header"/>
<field name="rml_header2"/>
<field name="rml_header3"/>
</group>
</group>
<div class="oe_right oe_button_box" name="button_box" groups="base.group_no_one" >
<button name="%(preview_report)d" string="Preview Header/Footer" type="action"/>
</div>
<label for="rml_header" groups="base.group_no_one" />
<field name="rml_header" groups="base.group_no_one" />
<label for="rml_header2" groups="base.group_no_one" />
<field name="rml_header2" groups="base.group_no_one" />
<label for="rml_header3" groups="base.group_no_one" />
<field name="rml_header3" groups="base.group_no_one" />
</page>
</notebook>
</sheet>

View File

@ -235,8 +235,6 @@ class res_currency(osv.osv):
else:
return from_amount * rate
res_currency()
class res_currency_rate_type(osv.osv):
_name = "res.currency.rate.type"
_description = "Currency Rate Type"
@ -244,8 +242,6 @@ class res_currency_rate_type(osv.osv):
'name': fields.char('Name', size=64, required=True, translate=True),
}
res_currency_rate_type()
class res_currency_rate(osv.osv):
_name = "res.currency.rate"
_description = "Currency Rate"
@ -261,7 +257,5 @@ class res_currency_rate(osv.osv):
}
_order = "name desc"
res_currency_rate()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -340,7 +340,7 @@
<separator/>
<field name="category_id" string="Tag" filter_domain="[('category_id','ilike', self)]"/>
<field name="user_id"/>
<field name="parent_id" domain="[('is_company','=',1)]" filter_domain="[('parent_id','child_of',[self])]"/>
<field name="parent_id" domain="[('is_company','=',1)]" operator="child_of"/>
<group expand="0" string="Group By...">
<filter string="Salesperson" icon="terp-personal" domain="[]" context="{'group_by' : 'user_id'}" />
<filter string="Company" context="{'group_by': 'parent_id'}"/>

View File

@ -7,9 +7,11 @@
</record>
<record model="ir.ui.menu" id="menu_config_address_book">
<field name="name">Address Book</field>
<field eval="[(6,0,[ref('group_system'), ref('group_partner_manager')])]" name="groups_id"/>
</record>
<record model="ir.ui.menu" id="menu_base_config">
<field name="name">Configuration</field>
<field eval="[(6,0,[ref('group_system'), ref('group_partner_manager')])]" name="groups_id"/>
</record>

View File

@ -28,7 +28,7 @@ import openerp
from openerp import SUPERUSER_ID
from openerp import tools
import openerp.exceptions
from openerp.osv import fields,osv
from openerp.osv import fields,osv, expression
from openerp.osv.orm import browse_record
from openerp.tools.translate import _
@ -56,13 +56,33 @@ class res_groups(osv.osv):
def _search_group(self, cr, uid, obj, name, args, context=None):
operand = args[0][2]
operator = args[0][1]
values = operand.split('/')
group_name = values[0]
where = [('name', operator, group_name)]
if len(values) > 1:
application_name = values[0]
group_name = values[1]
where = ['|',('category_id.name', operator, application_name)] + where
lst = True
if isinstance(operand, bool):
domains = [[('name', operator, operand)], [('category_id.name', operator, operand)]]
if operator in expression.NEGATIVE_TERM_OPERATORS == (not operand):
return expression.AND(domains)
else:
return expression.OR(domains)
if isinstance(operand, basestring):
lst = False
operand = [operand]
where = []
for group in operand:
values = filter(bool, group.split('/'))
group_name = values.pop().strip()
category_name = values and '/'.join(values).strip() or group_name
group_domain = [('name', operator, lst and [group_name] or group_name)]
category_domain = [('category_id.name', operator, lst and [category_name] or category_name)]
if operator in expression.NEGATIVE_TERM_OPERATORS and not values:
category_domain = expression.OR([category_domain, [('category_id', '=', False)]])
if (operator in expression.NEGATIVE_TERM_OPERATORS) == (not values):
sub_where = expression.AND([group_domain, category_domain])
else:
sub_where = expression.OR([group_domain, category_domain])
if operator in expression.NEGATIVE_TERM_OPERATORS:
where = expression.AND([where, sub_where])
else:
where = expression.OR([where, sub_where])
return where
_columns = {
@ -154,8 +174,7 @@ class res_users(osv.osv):
"a change of password, the user has to login again."),
'signature': fields.text('Signature'),
'active': fields.boolean('Active'),
'action_id': fields.many2one('ir.actions.actions', 'Home Action', help="If specified, this action will be opened at logon for this user, in addition to the standard menu."),
'menu_id': fields.many2one('ir.actions.actions', 'Menu Action', help="If specified, the action will replace the standard menu for this user."),
'action_id': fields.many2one('ir.actions.actions', 'Home Action', help="If specified, this action will be opened at log on for this user, in addition to the standard menu."),
'groups_id': fields.many2many('res.groups', 'res_groups_users_rel', 'uid', 'gid', 'Groups'),
# Special behavior for this field: res.company.search() will only return the companies
# available to the current user (should be the user's companies?), when the user_preference
@ -217,16 +236,6 @@ class res_users(osv.osv):
return [c]
return False
def _get_menu(self,cr, uid, context=None):
dataobj = self.pool.get('ir.model.data')
try:
model, res_id = dataobj.get_object_reference(cr, uid, 'base', 'action_menu_admin')
if model != 'ir.actions.act_window':
return False
return res_id
except ValueError:
return False
def _get_group(self,cr, uid, context=None):
dataobj = self.pool.get('ir.model.data')
result = []
@ -244,7 +253,6 @@ class res_users(osv.osv):
'password': '',
'active': True,
'customer': False,
'menu_id': _get_menu,
'company_id': _get_company,
'company_ids': _get_companies,
'groups_id': _get_group,

View File

@ -201,7 +201,6 @@
</group>
<group string="Menus Customization" groups="base.group_no_one">
<field name="action_id"/>
<field domain="[('usage','=','menu')]" name="menu_id" required="True"/>
</group>
</group>
<group string="Messaging and Social" name="messaging">

View File

@ -652,6 +652,7 @@
<rng:optional><rng:attribute name="event_open_popup" /></rng:optional>
<rng:optional><rng:attribute name="attendee" /></rng:optional>
<rng:optional><rng:attribute name="color_is_attendee" /></rng:optional>
<rng:optional><rng:attribute name="avatar_filter" /></rng:optional>
<rng:optional><rng:attribute name="avatar_model" /></rng:optional>
<rng:optional><rng:attribute name="avatar_title" /></rng:optional>
<rng:optional><rng:attribute name="use_contacts" /></rng:optional>

View File

@ -43,6 +43,7 @@
<!-- Set accesses to menu -->
<record model="ir.ui.menu" id="base.menu_administration">
<field name="name">Administration</field>
<field name="groups_id" eval="[(6,0, [ref('group_system'), ref('group_erp_manager')])]"/>
</record>

View File

@ -1,73 +0,0 @@
-
I will now stress the authentication layer of the ORM
-
I create a test user.
-
!record {model: res.users, id: res_user_test_a1}:
name: Test Auth User 1
login: test_base_a1
password: 'base-test-passwd'
active: True
-
I will prepare the context
-
!python {model: res.users }: |
from openerp.tools import config
host = config.get_misc('httpd', 'interface')
port = config.get_misc('httpd', 'port', 8069)
if not host:
host = config.get('xmlrpc_interface')
port = config.get('xmlrpc_port') or self.port
if host == '0.0.0.0' or not host:
host = '127.0.0.1'
port = int(port)
context['test_xmlrpc_url'] = 'http://%s:%d/xmlrpc/' % (host, port)
-
I will commit the cursor and try to login.
-
!python {model: res.users }: |
from xmlrpclib import ServerProxy
cr.commit()
try:
logsock = ServerProxy(context['test_xmlrpc_url']+'common')
luid = logsock.login(cr.dbname, 'test_base_a1', 'base-test-passwd')
assert luid, "User is not activated after res.users commit!"
except Exception:
raise
-
I will just try to read something as that user
-
!python {model: res.users }: |
from xmlrpclib import ServerProxy
cr.commit()
try:
logsock = ServerProxy(context['test_xmlrpc_url']+'object')
luid = ref('res_user_test_a1')
res = logsock.execute(cr.dbname, luid, 'base-test-passwd', 'res.users', 'read', luid, ['name',])
assert res and res['name'], "User cannot read its name!"
except Exception:
raise
-
I will now disable the user.
-
!record {model: res.users, id: res_user_test_a1}:
active: False
-
I will commit the cursor.
-
!python {model: res.users }: |
cr.commit()
-
I will try to read again, connecting as the disabled user.
-
!python {model: res.users }: |
from xmlrpclib import ServerProxy
cr.commit()
try:
logsock = ServerProxy(context['test_xmlrpc_url']+'object')
luid = ref('res_user_test_a1')
res = logsock.execute(cr.dbname, luid, 'base-test-passwd', 'res.users', 'read', luid, ['name',])
raise AssertionError("User should not be enabled!")
except Fault, e:
if e.faultCode != 'AccessDenied':
raise

View File

@ -302,3 +302,17 @@
float_round(0.01, precision_digits=3, precision_rounding=0.01)
except AssertionError:
pass
-
Test res.groups name search
-
!python {model: res.groups}: |
all_groups = self.search(cr, uid, [])
full_names = [(group.id, group.full_name) for group in self.browse(cr, uid, all_groups)]
group_ids = self.search(cr, uid, [('full_name', 'like', '%Sale%')])
assert set(group_ids) == set([id for (id, full_name) in full_names if 'Sale' in full_name]), "did not match search for 'Sale'"
group_ids = self.search(cr, uid, [('full_name', 'like', '%Technical%')])
assert set(group_ids) == set([id for (id, full_name) in full_names if 'Technical' in full_name]), "did not match search for 'Technical'"
group_ids = self.search(cr, uid, [('full_name', 'like', '%Sales /%')])
assert set(group_ids) == set([id for (id, full_name) in full_names if 'Sales /' in full_name]), "did not match search for 'Sales /'"
group_ids = self.search(cr, uid, [('full_name', 'in', ['Administration / Access Rights','Contact Creation'])])
assert group_ids, "did not match search for 'Administration / Access Rights' and 'Contact Creation'"

View File

@ -2,7 +2,7 @@
##############################################################################
#
# OpenERP, Open Source Business Applications
# Copyright (C) 2004-2012 OpenERP S.A. (<http://openerp.com>).
# Copyright (C) 2004-2014 OpenERP S.A. (<http://openerp.com>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@ -137,10 +137,12 @@ class wkf_instance(osv.osv):
_rec_name = 'res_type'
_log_access = False
_columns = {
'uid': fields.integer('User'), # FIXME no constraint??
'wkf_id': fields.many2one('workflow', 'Workflow', ondelete='cascade', select=True),
'res_id': fields.integer('Resource ID'),
'res_type': fields.char('Resource Object', size=64),
'state': fields.char('Status', size=32),
'transition_ids': fields.many2many('workflow.transition', 'wkf_witm_trans', 'inst_id', 'trans_id'),
}
def _auto_init(self, cr, context=None):
super(wkf_instance, self)._auto_init(cr, context)

View File

@ -81,8 +81,11 @@ def report_configuration():
def rm_pid_file():
config = openerp.tools.config
if not openerp.evented and os.path.exists(config['pidfile']):
os.unlink(config['pidfile'])
if not openerp.evented and config['pidfile']:
try:
os.unlink(config['pidfile'])
except OSError:
pass
def setup_pid_file():
""" Create a file with the process id written in it.

View File

@ -559,7 +559,7 @@ class HttpRequest(WebRequest):
response.set_cookie(k, v)
return response
def render(self, template, qcontext=None, **kw):
def render(self, template, qcontext=None, lazy=True, **kw):
""" Lazy render of QWeb template.
The actual rendering of the given template will occur at then end of
@ -568,8 +568,12 @@ class HttpRequest(WebRequest):
:param basestring template: template to render
:param dict qcontext: Rendering context to use
:param dict lazy: Lazy rendering is processed later in wsgi response layer (default True)
"""
return Response(template=template, qcontext=qcontext, **kw)
response = Response(template=template, qcontext=qcontext, **kw)
if not lazy:
return response.render()
return response
def not_found(self, description=None):
""" Helper for 404 response, return its result from the method
@ -601,6 +605,16 @@ class ControllerType(type):
# flag old-style methods with req as first argument
for k, v in attrs.items():
if inspect.isfunction(v) and hasattr(v, 'original_func'):
# Set routing type on original functions
routing_type = v.routing.get('type')
parent = [claz for claz in bases if isinstance(claz, ControllerType) and hasattr(claz, k)]
parent_routing_type = getattr(parent[0], k).original_func.routing_type if parent else routing_type or 'http'
if routing_type is not None and routing_type is not parent_routing_type:
routing_type = parent_routing_type
_logger.warn("Subclass re-defines <function %s.%s.%s> with different type than original."
" Will use original type: %r" % (cls.__module__, cls.__name__, k, parent_routing_type))
v.original_func.routing_type = routing_type or parent_routing_type
spec = inspect.getargspec(v.original_func)
first_arg = spec.args[1] if len(spec.args) >= 2 else None
if first_arg in ["req", "request"]:
@ -660,15 +674,6 @@ def routing_map(modules, nodb_only, converters=None):
for claz in reversed(mv.im_class.mro()):
fn = getattr(claz, mv.func_name, None)
if fn and hasattr(fn, 'routing') and fn not in methods_done:
fn_type = fn.routing.get('type')
if not routing_type:
routing_type = fn_type
else:
if fn_type and routing_type != fn_type:
_logger.warn("Subclass re-defines <function %s.%s> with different type than original."
" Will use original type: %r", fn.__module__, fn.__name__, routing_type)
fn.routing['type'] = routing_type
fn.original_func.routing_type = routing_type
methods_done.append(fn)
routing.update(fn.routing)
if not nodb_only or nodb_only == (routing['auth'] == "none"):
@ -1224,10 +1229,11 @@ class Root(object):
try:
with openerp.tools.mute_logger('openerp.sql_db'):
ir_http = request.registry['ir.http']
except psycopg2.OperationalError:
# psycopg2 error. At this point, that means the
# database probably does not exists anymore. Log the
# user out and fall back to nodb
except (AttributeError, psycopg2.OperationalError):
# psycopg2 error or attribute error while constructing
# the registry. That means the database probably does
# not exists anymore or the code doesnt match the db.
# Log the user out and fall back to nodb
request.session.logout()
result = _dispatch_nodb()
else:
@ -1295,6 +1301,11 @@ class CommonController(Controller):
""" Method used by client APIs to contact OpenERP. """
return dispatch_rpc(service, method, args)
@route('/gen_session_id', type='json', auth="none")
def gen_session_id(self):
nsession = root.session_store.new()
return nsession.sid
# register main wsgi handler
root = Root()
openerp.service.wsgi_server.register_wsgi_handler(root)

View File

@ -30,7 +30,7 @@ RELEASE_LEVELS_DISPLAY = {ALPHA: ALPHA,
# properly comparable using normal operarors, for example:
# (6,1,0,'beta',0) < (6,1,0,'candidate',1) < (6,1,0,'candidate',2)
# (6,1,0,'candidate',2) < (6,1,0,'final',0) < (6,1,2,'final',0)
version_info = (7, 'saas~4', 0, FINAL, 0)
version_info = (8, 0, 0, ALPHA, 1)
version = '.'.join(map(str, version_info[:2])) + RELEASE_LEVELS_DISPLAY[version_info[3]] + str(version_info[4] or '')
series = serie = major_version = '.'.join(map(str, version_info[:2]))

View File

@ -229,6 +229,7 @@ class HttpCase(TransactionCase):
# kill phantomjs if phantom.exit() wasn't called in the test
if phantom.poll() is None:
phantom.terminate()
phantom.wait()
self._wait_remaining_requests()
_logger.info("phantom_run execution finished")

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