From 29e45d1cc2a6d4aa175afabcd8569b2f4c9f71b7 Mon Sep 17 00:00:00 2001
From: Christophe Matthieu
Date: Tue, 8 Sep 2015 18:01:39 +0200
Subject: [PATCH 01/53] [FIX] im_livechat, website: typo t-translation
---
addons/im_livechat/views/im_livechat_channel_templates.xml | 2 +-
addons/website/views/website_templates.xml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/addons/im_livechat/views/im_livechat_channel_templates.xml b/addons/im_livechat/views/im_livechat_channel_templates.xml
index ba2facdd817..5864204b236 100644
--- a/addons/im_livechat/views/im_livechat_channel_templates.xml
+++ b/addons/im_livechat/views/im_livechat_channel_templates.xml
@@ -139,7 +139,7 @@
-
+
document.addEventListener("DOMContentLoaded", function(event) {
odoo.define('web.session', function (require) {
diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml
index 2ebc132a395..83b83c2dacf 100644
--- a/addons/website/views/website_templates.xml
+++ b/addons/website/views/website_templates.xml
@@ -893,7 +893,7 @@ Sitemap: sitemap.xml
<?xml version="1.0" encoding="UTF-8"?>
-
+
sitemap- .xml
From b99ef3b125af374c4055908a56563d4da036be65 Mon Sep 17 00:00:00 2001
From: Raphael Collet
Date: Mon, 7 Sep 2015 15:31:07 +0200
Subject: [PATCH 02/53] [IMP] base: rationalize indexes on `ir.model.data`
Indexes on individual columns (module, name, model, res_id) have been dropped,
and the index on (model, name) was duplicated in a unicity constraint. We have
kept two useful indexes, namely:
- a unique index on (module, name)
- a simple index on (model, res_id)
---
openerp/addons/base/ir/ir_model.py | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/openerp/addons/base/ir/ir_model.py b/openerp/addons/base/ir/ir_model.py
index 6f76ac54fa1..3a76ebb3ef0 100644
--- a/openerp/addons/base/ir/ir_model.py
+++ b/openerp/addons/base/ir/ir_model.py
@@ -909,14 +909,13 @@ class ir_model_data(osv.osv):
return result
_columns = {
- 'name': fields.char('External Identifier', required=True, select=1,
+ 'name': fields.char('External Identifier', required=True,
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'),
- '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"),
+ 'model': fields.char('Model Name', required=True),
+ 'module': fields.char('Module', required=True),
+ 'res_id': fields.integer('Record ID', help="ID of the target record in the database"),
'noupdate': fields.boolean('Non Updatable'),
'date_update': fields.datetime('Update Date'),
'date_init': fields.datetime('Init Date')
@@ -927,9 +926,6 @@ class ir_model_data(osv.osv):
'noupdate': False,
'module': ''
}
- _sql_constraints = [
- ('module_name_uniq', 'unique(name, module)', 'You cannot have multiple records with the same external ID in the same module!'),
- ]
def __init__(self, pool, cr):
osv.osv.__init__(self, pool, cr)
@@ -943,7 +939,8 @@ class ir_model_data(osv.osv):
super(ir_model_data, self)._auto_init(cr, context)
cr.execute('SELECT indexname FROM pg_indexes WHERE indexname = \'ir_model_data_module_name_index\'')
if not cr.fetchone():
- cr.execute('CREATE INDEX ir_model_data_module_name_index ON ir_model_data (module, name)')
+ cr.execute('CREATE UNIQUE INDEX ir_model_data_module_name_index ON ir_model_data (module, name)')
+ cr.execute('CREATE INDEX ir_model_data_model_res_id_index ON ir_model_data (model, res_id)')
# NEW V8 API
@tools.ormcache('xmlid')
From 655b13b0933c83eeda45a6da08f8fecccf3f077d Mon Sep 17 00:00:00 2001
From: Nicolas Lempereur
Date: Wed, 9 Sep 2015 09:04:45 +0200
Subject: [PATCH 03/53] [FIX] web: m2m wait deferred to use fields
---
.../static/src/js/views/form_relational_widgets.js | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/addons/web/static/src/js/views/form_relational_widgets.js b/addons/web/static/src/js/views/form_relational_widgets.js
index e4f48e398b0..9b247d529fc 100644
--- a/addons/web/static/src/js/views/form_relational_widgets.js
+++ b/addons/web/static/src/js/views/form_relational_widgets.js
@@ -1371,8 +1371,10 @@ var FieldMany2ManyTags = AbstractManyField.extend(common.CompletionFieldMixin, c
var self = this;
// We need to know if the field 'color' exists on the model
- this.dataset.call('fields_get', []).then(function(fields) {
- self.fields = fields;
+ this.mutex.exec(function(){
+ return self.dataset.call('fields_get', []).then(function(fields) {
+ self.fields = fields;
+ });
});
},
initialize_content: function() {
@@ -1407,8 +1409,11 @@ var FieldMany2ManyTags = AbstractManyField.extend(common.CompletionFieldMixin, c
}
},
get_render_data: function(ids){
- var fields = this.fields.color ? ['name', 'color'] : ['name'];
- return this.dataset.read_ids(ids, fields);
+ var self = this;
+ return this.mutex.exec(function(){
+ var fields = self.fields.color ? ['name', 'color'] : ['name'];
+ return self.dataset.read_ids(ids, fields);
+ });
},
render_tag: function(data) {
this.$('.badge').remove();
From 70b869a0e47a1c34b8083726f27ace53d6ac696f Mon Sep 17 00:00:00 2001
From: Nicolas Lempereur
Date: Wed, 9 Sep 2015 08:31:02 +0200
Subject: [PATCH 04/53] [FIX] website_blog: button could be already removed
---
addons/website_blog/static/src/js/website.tour.blog.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/website_blog/static/src/js/website.tour.blog.js b/addons/website_blog/static/src/js/website.tour.blog.js
index 404f1d2fd2d..db05ea1a8a0 100644
--- a/addons/website_blog/static/src/js/website.tour.blog.js
+++ b/addons/website_blog/static/src/js/website.tour.blog.js
@@ -110,7 +110,7 @@ base.ready().done(function () {
popover: { fixed: true },
},
{
- waitFor: '.modal:has(#mobile-viewport) button[data-dismiss=modal]:not(:visible)',
+ waitNot: '.modal:has(#mobile-viewport) button[data-dismiss=modal]:visible',
element: 'button.btn-danger.js_publish_btn',
placement: 'top',
title: _t("Publishing status"),
From 516b1e1cce86ab9d1529be6f28768cffddba49cd Mon Sep 17 00:00:00 2001
From: Nicolas Martinelli
Date: Wed, 9 Sep 2015 11:28:10 +0200
Subject: [PATCH 05/53] [IMP] auth_signup: rename "Reset password" to "Confirm"
---
addons/auth_signup/views/auth_signup_login.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/auth_signup/views/auth_signup_login.xml b/addons/auth_signup/views/auth_signup_login.xml
index fb201c98d81..149c490ad69 100644
--- a/addons/auth_signup/views/auth_signup_login.xml
+++ b/addons/auth_signup/views/auth_signup_login.xml
@@ -89,7 +89,7 @@
From c61d20366c2a53020dd1004c8ee39af68a7a6121 Mon Sep 17 00:00:00 2001
From: cod-odoo
Date: Tue, 8 Sep 2015 16:37:24 +0530
Subject: [PATCH 06/53] [FIX] l10n_do: add new tags in taxes.
---
addons/l10n_do/data/account.tax.template.csv | 36 +++++------
addons/l10n_do/data/account_account_tag.xml | 66 +++++++++++++++++---
2 files changed, 76 insertions(+), 26 deletions(-)
diff --git a/addons/l10n_do/data/account.tax.template.csv b/addons/l10n_do/data/account.tax.template.csv
index 63132383f5c..cd144c6b56c 100644
--- a/addons/l10n_do/data/account.tax.template.csv
+++ b/addons/l10n_do/data/account.tax.template.csv
@@ -1,19 +1,19 @@
id,name,description,type_tax_use,amount_type,amount,sequence,refund_account_id:id,account_id:id,chart_template_id:id,tag_ids:id
-default_chart_a_tax_1,10% Honorarios por Servicios Independientes,R-ISR 10%,purchase,percent,-10,1,default_chart_a_account_712,default_chart_a_account_712,default_chart_a,
-default_chart_a_tax_2,ITBIS Exento en compras,C-EXENTA,purchase,percent,0,1,,,default_chart_a,,
-default_chart_a_tax_3,ITBIS 8% Ventas,V-ITBIS 8%,sale,percent,11,1,,,default_chart_a,,
-default_chart_a_tax_4,ITBIS 8% Compras,C-ITBIS 8%,purchase,percent,11,1,,,default_chart_a,,
-default_chart_a_tax_5,ITBIS 11% Ventas,V-ITBIS 11%,sale,percent,11,1,,,default_chart_a,,
-default_chart_a_tax_6,ITBIS 11% Compras,C-ITBIS 11%,purchase,percent,11,1,,,default_chart_a,,
-default_chart_a_tax_7,ITBIS Exento en ventas,V-EXENTA,sale,percent,18,1,,,default_chart_a,tax_V-EXENTA,tax_R-ITBIS_18%
-default_chart_a_tax_8,ITBIS 18% Compras,C-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_53,default_chart_a_account_53,default_chart_a,tax_C-ITBIS_18%,
-default_chart_a_tax_9,ITBIS 18% Compras Servicios,CS-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_57,default_chart_a_account_57,default_chart_a,tax_CS-ITBIS_18%,
-default_chart_a_tax_10,ITBIS 18% Compras Importaciones,IMP-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_56,default_chart_a_account_56,default_chart_a,tax_IMP-ITBIS_18%,
-default_chart_a_tax_12,2% Otras Retenciones (Norma 07-2007),R-ISR 2%,purchase,percent,-2,1,,,default_chart_a,,
-default_chart_a_tax_13,18% ITBIS Retenido,R-ITBIS 18%,purchase,percent,-18,1,default_chart_a_account_163,default_chart_a_account_163,default_chart_a,tax_R-ITBIS_18%,
-default_chart_a_tax_14,ITBIS 18% Ventas,V-ITBIS 18%,sale,percent,18,10,default_chart_a_account_71,default_chart_a_account_71,default_chart_a,tax_V-ITBIS_18%,
-default_chart_a_tax_15,ITBIS 18% Compras Includo,C-ITBIS 18% Incluido,purchase,percent,18,1,default_chart_a_account_53,default_chart_a_account_53,default_chart_a,tax_C-ITBIS_18%_Incluido,
-default_chart_a_tax_16,ITBIS 18% Compras Servicios Incluido,CS-ITBIS 18% Incluido,purchase,percent,18,1,default_chart_a_account_57,,default_chart_a,tax_CS-ITBIS_18%_Incluido,
-default_chart_a_tax_19,ISC Telecomunicacones,TELE-ISC,purchase,percent,10,1,default_chart_a_account_529,,default_chart_a,,
-default_chart_a_tax_20,CDT Telecomunicacones,TELE-CDT,purchase,percent,2,1,default_chart_a_account_529,,default_chart_a,,
-default_chart_a_tax_23,10% Retencion por alquileres,R-Alquileres 10%,purchase,percent,-10,1,default_chart_a_account_712,default_chart_a_account_712,default_chart_a,,
+default_chart_a_tax_1,10% Honorarios por Servicios Independientes,R-ISR 10%,purchase,percent,-10,1,default_chart_a_account_712,default_chart_a_account_712,default_chart_a,tag_R_ISR_10
+default_chart_a_tax_2,ITBIS Exento en compras,C-EXENTA,purchase,percent,0,1,,,default_chart_a,tag_C_EXENTA
+default_chart_a_tax_3,ITBIS 8% Ventas,V-ITBIS 8%,sale,percent,11,1,,,default_chart_a,tag_V_ITBIS_8
+default_chart_a_tax_4,ITBIS 8% Compras,C-ITBIS 8%,purchase,percent,11,1,,,default_chart_a,tag_C_ITBIS_8
+default_chart_a_tax_5,ITBIS 11% Ventas,V-ITBIS 11%,sale,percent,11,1,,,default_chart_a,tag_V_ITBIS_11
+default_chart_a_tax_6,ITBIS 11% Compras,C-ITBIS 11%,purchase,percent,11,1,,,default_chart_a,tag_C_ITBIS_11
+default_chart_a_tax_7,ITBIS Exento en ventas,V-EXENTA,sale,percent,18,1,,,default_chart_a,tag_V_EXENTA
+default_chart_a_tax_8,ITBIS 18% Compras,C-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_53,default_chart_a_account_53,default_chart_a,tag_C_ITBIS_18
+default_chart_a_tax_9,ITBIS 18% Compras Servicios,CS-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_57,default_chart_a_account_57,default_chart_a,tag_CS_ITBIS_18
+default_chart_a_tax_10,ITBIS 18% Compras Importaciones,IMP-ITBIS 18%,purchase,percent,18,1,default_chart_a_account_56,default_chart_a_account_56,default_chart_a,tag_IMP_ITBIS_18
+default_chart_a_tax_12,2% Otras Retenciones (Norma 07-2007),R-ISR 2%,purchase,percent,-2,1,,,default_chart_a,tag_R_ISR_2
+default_chart_a_tax_13,18% ITBIS Retenido,R-ITBIS 18%,purchase,percent,-18,1,default_chart_a_account_163,default_chart_a_account_163,default_chart_a,tag_R_ITBIS_18
+default_chart_a_tax_14,ITBIS 18% Ventas,V-ITBIS 18%,sale,percent,18,10,default_chart_a_account_71,default_chart_a_account_71,default_chart_a,tag_V_ITBIS_18
+default_chart_a_tax_15,ITBIS 18% Compras Includo,C-ITBIS 18% Incluido,purchase,percent,18,1,default_chart_a_account_53,default_chart_a_account_53,default_chart_a,tag_C_ITBIS_18_Incluido
+default_chart_a_tax_16,ITBIS 18% Compras Servicios Incluido,CS-ITBIS 18% Incluido,purchase,percent,18,1,default_chart_a_account_57,,default_chart_a,tag_CS_ITBIS_18_Incluido
+default_chart_a_tax_19,ISC Telecomunicacones,TELE-ISC,purchase,percent,10,1,default_chart_a_account_529,,default_chart_a,tag_TELE_ISC
+default_chart_a_tax_20,CDT Telecomunicacones,TELE-CDT,purchase,percent,2,1,default_chart_a_account_529,,default_chart_a,tag_TELE_CDT
+default_chart_a_tax_23,10% Retencion por alquileres,R-Alquileres 10%,purchase,percent,-10,1,default_chart_a_account_712,default_chart_a_account_712,default_chart_a,tag_R_Alquileres_10
diff --git a/addons/l10n_do/data/account_account_tag.xml b/addons/l10n_do/data/account_account_tag.xml
index e8d80f7b58b..68d922c8f63 100644
--- a/addons/l10n_do/data/account_account_tag.xml
+++ b/addons/l10n_do/data/account_account_tag.xml
@@ -5,45 +5,95 @@
-
+
+ R-ISR 10%
+ taxes
+
+
+
+ C-EXENTA
+ taxes
+
+
+
+ V-ITBIS 8%
+ taxes
+
+
+
+ C-ITBIS 8%
+ taxes
+
+
+
+ V-ITBIS 11%
+ taxes
+
+
+
+ C-ITBIS 11%
+ taxes
+
+
+
V-EXENTA
taxes
-
+
V-ITBIS 18%
taxes
-
+
C-ITBIS 18% Incluido
taxes
-
+
C-ITBIS 18%
taxes
-
+
CS-ITBIS 18% Incluido
taxes
-
+
CS-ITBIS 18%
taxes
-
+
IMP-ITBIS 18%
taxes
-
+
R-ITBIS 18%
taxes
+
+ R-ISR 2%
+ taxes
+
+
+
+ TELE-ISC
+ taxes
+
+
+
+ TELE-CDT
+ taxes
+
+
+
+ R-Alquileres 10%
+ taxes
+
+
\ No newline at end of file
From d2d8d1ca5dd5a1d0216210aa8f53c47d301ff62e Mon Sep 17 00:00:00 2001
From: xmo-odoo
Date: Wed, 9 Sep 2015 12:32:22 +0200
Subject: [PATCH 07/53] [REM] hr_applicant_document: view file reintroduced
during forward port
The whole module had previously been removed.
---
.../views/hr_applicant.xml | 37 -------------------
1 file changed, 37 deletions(-)
delete mode 100644 addons/hr_applicant_document/views/hr_applicant.xml
diff --git a/addons/hr_applicant_document/views/hr_applicant.xml b/addons/hr_applicant_document/views/hr_applicant.xml
deleted file mode 100644
index 49ebec5946b..00000000000
--- a/addons/hr_applicant_document/views/hr_applicant.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
- hr.applicant.document.search.inherit
- hr.applicant
-
-
-
- ['|','|','|','|',('partner_id','ilike',self),('partner_name','ilike',self),('email_from','ilike',self),('name', 'ilike', self),('attachment_ids.index_content', 'ilike', self)]
-
-
-
-
-
- Resumes and Letters
- ir.attachment
- form
- kanban,tree,form
-
- [('res_model','=','hr.applicant')]
-
-
-
- Search through resumes and motivation letters.
-
-
-
-
-
-
-
-
From 4f09d136d08dddd924f2cac173cf12a114c58ccf Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Wed, 9 Sep 2015 13:35:28 +0200
Subject: [PATCH 08/53] [FIX] l10n_*: normalise name of modules
Use the format ' - Accounting' for every localisation module.
This allows to have a coherant list of modules sorted by country.
---
addons/l10n_ar/__openerp__.py | 2 +-
addons/l10n_bo/__openerp__.py | 2 +-
addons/l10n_cl/__openerp__.py | 2 +-
addons/l10n_es/__openerp__.py | 2 +-
addons/l10n_hr/__openerp__.py | 2 +-
addons/l10n_no/__openerp__.py | 2 +-
addons/l10n_pa/__openerp__.py | 2 +-
addons/l10n_pe/__openerp__.py | 2 +-
addons/l10n_pt/__openerp__.py | 2 +-
addons/l10n_us/__openerp__.py | 2 +-
addons/l10n_vn/__openerp__.py | 2 +-
11 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/addons/l10n_ar/__openerp__.py b/addons/l10n_ar/__openerp__.py
index c2f2230e844..1bfab877bfb 100644
--- a/addons/l10n_ar/__openerp__.py
+++ b/addons/l10n_ar/__openerp__.py
@@ -4,7 +4,7 @@
# Copyright (c) 2011 Cubic ERP - Teradata SAC. (http://cubicerp.com)
{
- 'name': 'Argentina Localization Chart Account',
+ 'name': 'Argentina - Accounting',
'version': '1.0',
'description': """
Argentinian accounting chart and tax localization.
diff --git a/addons/l10n_bo/__openerp__.py b/addons/l10n_bo/__openerp__.py
index b5c5f643aed..c3752f6acc5 100644
--- a/addons/l10n_bo/__openerp__.py
+++ b/addons/l10n_bo/__openerp__.py
@@ -4,7 +4,7 @@
# Copyright (c) 2011 Cubic ERP - Teradata SAC. (https://cubicerp.com).
{
- "name": "Bolivia Localization Chart Account",
+ "name": "Bolivia - Accounting",
"version": "1.0",
"description": """
Bolivian accounting chart and tax localization.
diff --git a/addons/l10n_cl/__openerp__.py b/addons/l10n_cl/__openerp__.py
index ecff75953e6..686c92a62f5 100644
--- a/addons/l10n_cl/__openerp__.py
+++ b/addons/l10n_cl/__openerp__.py
@@ -4,7 +4,7 @@
# Copyright (c) 2011 Cubic ERP - Teradata SAC. (http://cubicerp.com).
{
- 'name': 'Chile Localization Chart Account',
+ 'name': 'Chile - Accounting',
'version': '1.0',
'description': """
Chilean accounting chart and tax localization.
diff --git a/addons/l10n_es/__openerp__.py b/addons/l10n_es/__openerp__.py
index 632eecb1b7c..c38653d5950 100644
--- a/addons/l10n_es/__openerp__.py
+++ b/addons/l10n_es/__openerp__.py
@@ -9,7 +9,7 @@
# Pedro Manuel Baeza
{
- "name" : "Spanish Charts of Accounts (PGCE 2008)",
+ "name" : "Spain - Accounting (PGCE 2008)",
"version" : "4.0",
"author" : "Spanish Localization Team",
'website' : 'https://launchpad.net/openerp-spain',
diff --git a/addons/l10n_hr/__openerp__.py b/addons/l10n_hr/__openerp__.py
index 292d3726133..b143d849467 100644
--- a/addons/l10n_hr/__openerp__.py
+++ b/addons/l10n_hr/__openerp__.py
@@ -9,7 +9,7 @@
# - account types
{
- "name": "Croatia - RRIF 2012 COA",
+ "name": "Croatia - Accounting (RRIF 2012)",
"description": """
Croatian localisation.
======================
diff --git a/addons/l10n_no/__openerp__.py b/addons/l10n_no/__openerp__.py
index e2f5e0b1048..b86a8ffd398 100644
--- a/addons/l10n_no/__openerp__.py
+++ b/addons/l10n_no/__openerp__.py
@@ -2,7 +2,7 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
- "name" : "Norway - Chart of Accounts",
+ "name" : "Norway - Accounting",
"version" : "1.0",
"author" : "Rolv Råen",
"category" : "Localization/Account Charts",
diff --git a/addons/l10n_pa/__openerp__.py b/addons/l10n_pa/__openerp__.py
index c386888a7f3..6fd0a3766a4 100644
--- a/addons/l10n_pa/__openerp__.py
+++ b/addons/l10n_pa/__openerp__.py
@@ -4,7 +4,7 @@
# Copyright (c) 2011 Cubic ERP - Teradata SAC. (http://cubicerp.com).
{
- "name": "Panama Localization Chart Account",
+ "name": "Panama - Accounting",
"version": "1.0",
"description": """
Panamenian accounting chart and tax localization.
diff --git a/addons/l10n_pe/__openerp__.py b/addons/l10n_pe/__openerp__.py
index f7f6c8e71f7..fce23b033a5 100644
--- a/addons/l10n_pe/__openerp__.py
+++ b/addons/l10n_pe/__openerp__.py
@@ -4,7 +4,7 @@
# Copyright (c) 2011 Cubic ERP - Teradata SAC. (http://cubicerp.com).
{
- 'name': 'Peru Localization Chart Account',
+ 'name': 'Peru - Accounting',
'version': '1.0',
'description': """
Peruvian accounting chart and tax localization. According the PCGE 2010.
diff --git a/addons/l10n_pt/__openerp__.py b/addons/l10n_pt/__openerp__.py
index 56279bc125e..d8b6dd2ccf6 100644
--- a/addons/l10n_pt/__openerp__.py
+++ b/addons/l10n_pt/__openerp__.py
@@ -5,7 +5,7 @@
# http://www.thinkopensolutions.com.
{
- 'name': 'Portugal - Chart of Accounts',
+ 'name': 'Portugal - Accounting',
'version': '0.011',
'author': 'ThinkOpen Solutions',
'website': 'http://www.thinkopensolutions.com/',
diff --git a/addons/l10n_us/__openerp__.py b/addons/l10n_us/__openerp__.py
index 211c33eb7e3..e01259a30b8 100644
--- a/addons/l10n_us/__openerp__.py
+++ b/addons/l10n_us/__openerp__.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
- 'name': 'United States - Chart of accounts',
+ 'name': 'United States - Accounting',
'version': '1.1',
'category': 'Localization/Account Charts',
'description': """
diff --git a/addons/l10n_vn/__openerp__.py b/addons/l10n_vn/__openerp__.py
index d84aeba76a9..edeb18744fc 100644
--- a/addons/l10n_vn/__openerp__.py
+++ b/addons/l10n_vn/__openerp__.py
@@ -4,7 +4,7 @@
# This module is Copyright (c) 2009-2013 General Solutions (http://gscom.vn) All Rights Reserved.
{
- "name" : "Vietnam Chart of Accounts",
+ "name" : "Vietnam - Accounting",
"version" : "1.0",
"author" : "General Solutions",
'website': 'http://gscom.vn',
From d0faf2815428293c16e47ddd3a4ca2e512c730c4 Mon Sep 17 00:00:00 2001
From: Olivier Laurent
Date: Wed, 9 Sep 2015 13:21:43 +0200
Subject: [PATCH 09/53] [FIX] analytic: methods used in default attribute
should return a RecordSet
If a method used as a default returns an id instead of a RecordSet,
it could fail in 'convert_to_write' (Many2One field) because it will try
to return "value.id". If "value" is an integer, it fails.
Also changed the method to a lambda expression and removed the
'_default_user' method because it's not used anywhere.
---
addons/analytic/models/analytic.py | 10 +---------
1 file changed, 1 insertion(+), 9 deletions(-)
diff --git a/addons/analytic/models/analytic.py b/addons/analytic/models/analytic.py
index 35ec3a0992b..1ea482e1601 100644
--- a/addons/analytic/models/analytic.py
+++ b/addons/analytic/models/analytic.py
@@ -41,14 +41,6 @@ class account_analytic_account(models.Model):
account.credit = data_credit.get(account.id, 0.0)
account.balance = account.credit - account.debit
- @api.model
- def _default_company(self):
- return self.env.user.company_id.id
-
- @api.model
- def _default_user(self):
- return self.env.user.id
-
name = fields.Char(string='Analytic Account', index=True, required=True, track_visibility='onchange')
code = fields.Char(string='Reference', index=True, track_visibility='onchange')
account_type = fields.Selection([
@@ -58,7 +50,7 @@ class account_analytic_account(models.Model):
tag_ids = fields.Many2many('account.analytic.tag', 'account_analytic_account_tag_rel', 'account_id', 'tag_id', string='Tags', copy=True)
line_ids = fields.One2many('account.analytic.line', 'account_id', string="Analytic Lines")
- company_id = fields.Many2one('res.company', string='Company', required=True, default=_default_company)
+ company_id = fields.Many2one('res.company', string='Company', required=True, default=lambda self: self.env.user.company_id)
partner_id = fields.Many2one('res.partner', string='Customer')
balance = fields.Monetary(compute='_compute_debit_credit_balance', string='Balance')
From 3bf061dc09dad96ae8930dc38642cd4946a0ed7e Mon Sep 17 00:00:00 2001
From: Martin Trigaux
Date: Wed, 9 Sep 2015 13:38:26 +0200
Subject: [PATCH 10/53] [FIX] crm: incorrect sentense in planner
Courtesy of Eric Geens
---
addons/crm/web_planner_data.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/addons/crm/web_planner_data.xml b/addons/crm/web_planner_data.xml
index 15c887cd729..a2024dc2736 100644
--- a/addons/crm/web_planner_data.xml
+++ b/addons/crm/web_planner_data.xml
@@ -560,8 +560,8 @@
- You may have different sale price for different
- group of customers:
+ You may have a different sale price for different
+ groups of customers:
Consumers
From 7346352fd95a97a84712df3ecd47fca161e2cd6e Mon Sep 17 00:00:00 2001
From: Olivier Dony
Date: Wed, 9 Sep 2015 14:13:25 +0200
Subject: [PATCH 11/53] [FIX] account: new api typo, self.env.user is current
user
`uid` not defined in this context
---
addons/account/models/res_config.py | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/addons/account/models/res_config.py b/addons/account/models/res_config.py
index de6c105d9b0..53414da5992 100644
--- a/addons/account/models/res_config.py
+++ b/addons/account/models/res_config.py
@@ -223,13 +223,12 @@ class AccountConfigSettings(models.TransientModel):
@api.multi
def open_company(self):
- user = self.env['res.users'].browse(uid)
return {
'type': 'ir.actions.act_window',
'name': 'My Company',
'view_type': 'form',
'view_mode': 'form',
'res_model': 'res.company',
- 'res_id': user.company_id.id,
+ 'res_id': self.env.user.company_id.id,
'target': 'current',
}
From 1f28bd83489d37ec67a549e56437f37e1f0526aa Mon Sep 17 00:00:00 2001
From: Yannick Tivisse
Date: Wed, 9 Sep 2015 13:53:05 +0200
Subject: [PATCH 12/53] [FIX] project: task_count counts tasks in undefined
stage, and not inactives tasks anymore
---
addons/project/project.py | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/addons/project/project.py b/addons/project/project.py
index 0c5c135a09a..d3333c89fe6 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -105,9 +105,12 @@ class project(osv.osv):
res[id] = (project_attachments or 0) + (task_attachments or 0)
return res
def _task_count(self, cr, uid, ids, field_name, arg, context=None):
+ if context is None:
+ context = {}
res={}
- for tasks in self.browse(cr, uid, ids, dict(context, active_test=False)):
- res[tasks.id] = len(tasks.task_ids)
+ for project in self.browse(cr, uid, ids, context=context):
+ tasks_undefined_stage = self.pool['project.task'].search_count(cr, uid, [('stage_id', '=', None), ('project_id', '=', project.id)], context=context)
+ res[project.id] = len(project.task_ids) + int(tasks_undefined_stage)
return res
def _get_alias_models(self, cr, uid, context=None):
""" Overriden in project_issue to offer more options """
From 09cd1ab2809d5a416c6981e58902bd50546b4ec0 Mon Sep 17 00:00:00 2001
From: Yannick Tivisse
Date: Wed, 9 Sep 2015 11:11:34 +0200
Subject: [PATCH 13/53] [IMP] Sale: Make demo data 'Deposit' invisible to the
user + invoice wizard cleaning - Move product_product 'Deposit' from demo to
data + make it a product_template - Remove group_no_one on archive button for
product_product and template - Remove a commented import_pdb; pdb.set_trace()
- Add in the sales config 2 fields to edit the account and the taxes for the
deposit product - On the sale orders lines invoicing wizard, display the
account and the taxes for the deposit product instead of the product itself -
Set the product 'Deposit' as inactive to be hidden to the users
---
.../test/partner_assign.yml | 1 -
addons/point_of_sale/point_of_sale_demo.xml | 2 +-
addons/product/product_view.xml | 2 +-
addons/sale/res_config.py | 27 ++++++++++++++++++-
addons/sale/res_config_view.xml | 6 +++++
addons/sale/sale_data.xml | 15 +++++++++++
addons/sale/sale_demo.xml | 15 -----------
addons/sale/tests/test_sale_to_invoice.py | 2 +-
.../sale/wizard/sale_make_invoice_advance.py | 14 +++++++++-
.../sale/wizard/sale_make_invoice_advance.xml | 4 ++-
.../sale_service/demo/sale_service_demo.xml | 12 +--------
11 files changed, 67 insertions(+), 33 deletions(-)
diff --git a/addons/crm_partner_assign/test/partner_assign.yml b/addons/crm_partner_assign/test/partner_assign.yml
index cc3a9aa64ac..35f0adb9b02 100644
--- a/addons/crm_partner_assign/test/partner_assign.yml
+++ b/addons/crm_partner_assign/test/partner_assign.yml
@@ -22,7 +22,6 @@
-
!python {model: crm.lead}: |
lead = self.browse(cr, uid, ref('crm.crm_case_21'))
- # import pdb; pdb.set_trace()
assert lead.partner_assigned_id.id == ref('base.res_partner_18') , "Opportuniy is not assigned nearest partner"
assert 50 < lead.partner_latitude < 55, "Latitude is wrong: 50 < %s < 55" % lead.partner_latitude
assert -4 < lead.partner_longitude < -1, "Longitude is wrong: -4 < %s < -1" % lead.partner_longitude
diff --git a/addons/point_of_sale/point_of_sale_demo.xml b/addons/point_of_sale/point_of_sale_demo.xml
index ef555ed8ae1..3b3839503b0 100644
--- a/addons/point_of_sale/point_of_sale_demo.xml
+++ b/addons/point_of_sale/point_of_sale_demo.xml
@@ -595,7 +595,7 @@
-
+
diff --git a/addons/product/product_view.xml b/addons/product/product_view.xml
index e400f991d51..ea959d44c15 100644
--- a/addons/product/product_view.xml
+++ b/addons/product/product_view.xml
@@ -82,7 +82,7 @@
-
diff --git a/addons/sale/res_config.py b/addons/sale/res_config.py
index b56cd418ca4..bd2a0206498 100644
--- a/addons/sale/res_config.py
+++ b/addons/sale/res_config.py
@@ -64,7 +64,15 @@ class sale_configuration(osv.TransientModel):
('order', 'Invoice ordered quantities'),
('delivery', 'Invoice delivered quantities'),
('cost', 'Invoice based on costs (time and material, expenses)')
- ], 'Default Invoicing', default_model='product.template')
+ ], 'Default Invoicing', default_model='product.template'),
+ 'deposit_property_account_income_id': fields.property(
+ type="many2one",
+ relation="account.account",
+ string="Income Account",
+ domain=[('deprecated', '=', False)],
+ help="This account will be used for invoices instead of the default one to value sales for the deposit."),
+ 'deposit_taxes_ids': fields.many2many('account.tax', 'product_taxes_rel', 'prod_id', 'tax_id', string='Customer Taxes',
+ domain=[('type_tax_use', '=', 'sale')]),
}
_defaults = {
@@ -84,6 +92,23 @@ class sale_configuration(osv.TransientModel):
return {'value': {'group_pricelist_item': True, 'group_sale_pricelist': True, 'group_product_pricelist': False}}
return {'value': {'group_pricelist_item': False, 'group_sale_pricelist': False, 'group_product_pricelist': False}}
+ def get_default_deposit_values(self, cr, uid, fields, context=None):
+ deposit_product_template = self.pool['ir.model.data'].xmlid_to_object(cr, uid, 'sale.advance_product_1', context=context)
+ return {
+ 'deposit_property_account_income_id': deposit_product_template.product_variant_ids.property_account_income_id.id,
+ 'deposit_taxes_ids': deposit_product_template.product_variant_ids.taxes_id.ids
+ }
+
+ def set_deposit_values(self, cr, uid, ids, context=None):
+ if context is None:
+ context = {}
+ config_value = self.browse(cr, uid, ids, context=context)
+ deposit_product_template = self.pool['ir.model.data'].xmlid_to_object(cr, uid, 'sale.advance_product_1', context=context)
+ deposit_product_template.product_variant_ids.write({
+ 'property_account_income_id': config_value.deposit_property_account_income_id.id,
+ 'taxes_id': [(6, 0, config_value.deposit_taxes_ids.ids)],
+ })
+
class account_config_settings(osv.osv_memory):
_inherit = 'account.config.settings'
_columns = {
diff --git a/addons/sale/res_config_view.xml b/addons/sale/res_config_view.xml
index 1b911178797..a08c7a25584 100644
--- a/addons/sale/res_config_view.xml
+++ b/addons/sale/res_config_view.xml
@@ -29,6 +29,12 @@
+
+
+
+
+
+
diff --git a/addons/sale/sale_data.xml b/addons/sale/sale_data.xml
index 6464507a083..44a2f3a5afb 100644
--- a/addons/sale/sale_data.xml
+++ b/addons/sale/sale_data.xml
@@ -74,5 +74,20 @@
team_id
+
+
+ Deposit
+
+ service
+ 150.0
+ order
+ 100.0
+
+
+
+
+
+
+
diff --git a/addons/sale/sale_demo.xml b/addons/sale/sale_demo.xml
index 2fabc306fcb..85ebd419c13 100644
--- a/addons/sale/sale_demo.xml
+++ b/addons/sale/sale_demo.xml
@@ -310,21 +310,6 @@ Thanks!
comment
-
-
-
-
- Deposit
-
- service
- 150.0
- order
- 100.0
-
-
-
-
-
diff --git a/addons/sale/tests/test_sale_to_invoice.py b/addons/sale/tests/test_sale_to_invoice.py
index 342a490c68c..c35abf296be 100644
--- a/addons/sale/tests/test_sale_to_invoice.py
+++ b/addons/sale/tests/test_sale_to_invoice.py
@@ -29,7 +29,7 @@ class TestSale(TestMail):
account_recv_id = account_obj.create({'code': 'X1012', 'name': 'Sales - Test Reicv Account', 'user_type_id': user_type_id, 'reconcile': True})
# Add account to product
- product_template_id = self.env.ref('sale.advance_product_0').product_tmpl_id
+ product_template_id = self.env.ref('sale.advance_product_1')
product_template_id.write({'property_account_income_id': account_rev_id})
# Create Sale Journal
diff --git a/addons/sale/wizard/sale_make_invoice_advance.py b/addons/sale/wizard/sale_make_invoice_advance.py
index b1f4b9d920a..54b110574c9 100644
--- a/addons/sale/wizard/sale_make_invoice_advance.py
+++ b/addons/sale/wizard/sale_make_invoice_advance.py
@@ -26,7 +26,8 @@ class SaleAdvancePaymentInv(models.TransientModel):
@api.model
def _get_advance_product(self):
try:
- return self.env['ir.model.data'].xmlid_to_res_id('sale.advance_product_0', raise_if_not_found=True)
+ deposit_product_template = self.env['ir.model.data'].xmlid_to_object('sale.advance_product_1', raise_if_not_found=True)
+ return deposit_product_template.product_variant_ids.ids[0]
except ValueError:
return False
@@ -39,6 +40,17 @@ class SaleAdvancePaymentInv(models.TransientModel):
product_id = fields.Many2one('product.product', string='Deposit Product', domain=[('type', '=', 'service')], default=_get_advance_product)
count = fields.Integer(default=_count, string='# of Orders')
amount = fields.Float('Deposit Amount', digits=dp.get_precision('Account'), help="The amount to be invoiced in advance, taxes excluded.")
+ deposit_property_account_income_id = fields.Many2one(
+ related="product_id.property_account_income_id",
+ relation="account.account",
+ string="Income Account",
+ domain=[('deprecated', '=', False)],
+ help="This account will be used for invoices instead of the default one to value sales for the deposit.")
+ deposit_taxes_ids = fields.Many2many(
+ related="product_id.taxes_id",
+ string='Customer Taxes',
+ domain=[('type_tax_use', '=', 'sale')])
+
@api.onchange('advance_payment_method')
def onchange_advance_payment_method(self):
diff --git a/addons/sale/wizard/sale_make_invoice_advance.xml b/addons/sale/wizard/sale_make_invoice_advance.xml
index 4bc87920a28..c1c2c19f8d5 100644
--- a/addons/sale/wizard/sale_make_invoice_advance.xml
+++ b/addons/sale/wizard/sale_make_invoice_advance.xml
@@ -16,7 +16,9 @@
attrs="{'invisible': [('count','>',1)]}"/>
+ invisible="1"/>
+
+
-
-
-
-
- Advance
-
-
- 150.0
- 5.0
-
-
+
From 6d0c7c731b7ff8591f8a2f1404bdffd64a707d09 Mon Sep 17 00:00:00 2001
From: Christophe Simonis
Date: Wed, 9 Sep 2015 14:38:35 +0200
Subject: [PATCH 14/53] [FIX] hr: add missing dependency on `web_tip`
The dependency has wrongly been removed by d27910a8f2f2b29810dfa8022ad748cce64df00a
---
addons/hr/__openerp__.py | 1 +
1 file changed, 1 insertion(+)
diff --git a/addons/hr/__openerp__.py b/addons/hr/__openerp__.py
index 6fecf886d24..9ae2782d2fd 100644
--- a/addons/hr/__openerp__.py
+++ b/addons/hr/__openerp__.py
@@ -32,6 +32,7 @@ You can manage:
'mail',
'resource',
'web_kanban',
+ 'web_tip',
],
'data': [
'security/hr_security.xml',
From 1e153e8aa56e71a196e46ce0b23ff9ada17e3660 Mon Sep 17 00:00:00 2001
From: rsi-odoo
Date: Tue, 8 Sep 2015 19:07:30 +0530
Subject: [PATCH 15/53] [FIX] l10n_ch: use right tag in tax for enterprise
report
---
addons/l10n_ch/chart/vat2011.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/l10n_ch/chart/vat2011.xml b/addons/l10n_ch/chart/vat2011.xml
index 03392da0b93..aa82b15e7ab 100644
--- a/addons/l10n_ch/chart/vat2011.xml
+++ b/addons/l10n_ch/chart/vat2011.xml
@@ -179,7 +179,7 @@
sale
-
+
TVA 0% exclue
From 5e1eb5f34c9aebd3ce04d6b4153b7bb9363a6ed0 Mon Sep 17 00:00:00 2001
From: Christophe Simonis
Date: Wed, 9 Sep 2015 15:27:16 +0200
Subject: [PATCH 16/53] [IMP] mail: avoid followers with dissociative identity
disorder
---
addons/mail/models/mail_followers.py | 1 +
addons/mail/tests/test_mail_followers.py | 16 ++++++++++++++++
2 files changed, 17 insertions(+)
diff --git a/addons/mail/models/mail_followers.py b/addons/mail/models/mail_followers.py
index 05250a31de4..2dd62582b1d 100644
--- a/addons/mail/models/mail_followers.py
+++ b/addons/mail/models/mail_followers.py
@@ -128,4 +128,5 @@ class Followers(models.Model):
_sql_constraints = [
('mail_followers_res_partner_res_model_id_uniq', 'unique(res_model,res_id,partner_id)', 'Error, a partner cannot follow twice the same object.'),
('mail_followers_res_channel_res_model_id_uniq', 'unique(res_model,res_id,channel_id)', 'Error, a channel cannot follow twice the same object.'),
+ ('partner_xor_channel', 'CHECK((partner_id IS NULL) != (channel_id IS NULL))', 'Error: A follower must be either a partner or a channel (but not both).')
]
diff --git a/addons/mail/tests/test_mail_followers.py b/addons/mail/tests/test_mail_followers.py
index 7890e91294a..3342dcced8b 100644
--- a/addons/mail/tests/test_mail_followers.py
+++ b/addons/mail/tests/test_mail_followers.py
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
+from psycopg2 import IntegrityError
from openerp.addons.mail.tests.common import TestMail
@@ -102,3 +103,18 @@ class TestMailFollowers(TestMail):
('partner_id', '=', self.user_employee.partner_id.id)])
self.assertEqual(len(follower), 1)
self.assertEqual(follower.subtype_ids, self.mt_mg_nodef | self.mt_al_nodef)
+
+ def test_no_DID(self):
+ """Test that a follower cannot suffer from dissociative identity disorder.
+ It cannot be both a partner and a channel.
+ """
+ test_channel = self.env['mail.channel'].create({
+ 'name': 'I used to be schizo, but now we are alright.'
+ })
+ with self.assertRaises(IntegrityError):
+ self.env['mail.followers'].create({
+ 'res_model': 'mail.channel',
+ 'res_id': test_channel.id,
+ 'partner_id': self.user_employee.partner_id.id,
+ 'channel_id': self.group_pigs.id,
+ })
From 33f686690a11fe177e9a857f8b1958dd47ca4e50 Mon Sep 17 00:00:00 2001
From: Simon Lejeune
Date: Wed, 9 Sep 2015 15:05:57 +0200
Subject: [PATCH 17/53] [FIX] account, crm, stock: various fixes in planners
---
addons/account/views/web_planner_data.xml | 8 ++++----
addons/crm/web_planner_data.xml | 8 ++++----
addons/project/web_planner_data.xml | 12 ++++++------
addons/stock/data/web_planner_data.xml | 2 +-
addons/website/data/web_planner_data.xml | 2 +-
addons/website_sale/data/web_planner_data.xml | 4 ++--
6 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/addons/account/views/web_planner_data.xml b/addons/account/views/web_planner_data.xml
index a3b0ea37eeb..dddef380801 100644
--- a/addons/account/views/web_planner_data.xml
+++ b/addons/account/views/web_planner_data.xml
@@ -195,7 +195,7 @@
To use the multi-currency option:
Activate the option in the Accounting Settings
- Review the list of available currencies (from the Configuration menu)
+ Review the list of available currencies (from the Configuration menu )
@@ -230,9 +230,9 @@
@@ -284,7 +284,7 @@
diff --git a/addons/crm/web_planner_data.xml b/addons/crm/web_planner_data.xml
index a2024dc2736..1d9d108a01d 100644
--- a/addons/crm/web_planner_data.xml
+++ b/addons/crm/web_planner_data.xml
@@ -430,9 +430,9 @@
@@ -491,7 +491,7 @@
@@ -525,7 +525,7 @@
diff --git a/addons/project/web_planner_data.xml b/addons/project/web_planner_data.xml
index 756676d9ff0..6621ee0a5c0 100644
--- a/addons/project/web_planner_data.xml
+++ b/addons/project/web_planner_data.xml
@@ -245,7 +245,7 @@
@@ -329,7 +329,7 @@
@@ -540,7 +540,7 @@
Website Live Chat on
-
+
Email Our Project Expert
@@ -621,7 +621,7 @@
@@ -639,7 +639,7 @@
Billing
Create bills automatically based on Time & Material.
-
Install now
@@ -1017,7 +1017,7 @@
diff --git a/addons/stock/data/web_planner_data.xml b/addons/stock/data/web_planner_data.xml
index 4afb5ab18a9..8d70472526c 100644
--- a/addons/stock/data/web_planner_data.xml
+++ b/addons/stock/data/web_planner_data.xml
@@ -130,7 +130,7 @@
diff --git a/addons/website/data/web_planner_data.xml b/addons/website/data/web_planner_data.xml
index edcbed8a3e1..ed0b29b95ac 100644
--- a/addons/website/data/web_planner_data.xml
+++ b/addons/website/data/web_planner_data.xml
@@ -191,7 +191,7 @@
diff --git a/addons/website_sale/data/web_planner_data.xml b/addons/website_sale/data/web_planner_data.xml
index 492f7c442ab..2fa2de89666 100644
--- a/addons/website_sale/data/web_planner_data.xml
+++ b/addons/website_sale/data/web_planner_data.xml
@@ -89,7 +89,7 @@
@@ -139,7 +139,7 @@
From 6c987e74c4c202b44945ff1c32795a0eb378248a Mon Sep 17 00:00:00 2001
From: Yannick Tivisse
Date: Wed, 9 Sep 2015 16:47:47 +0200
Subject: [PATCH 18/53] [FIX] sale: Wrong filter definition
---
addons/sale/report/sale_report_view.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/sale/report/sale_report_view.xml b/addons/sale/report/sale_report_view.xml
index c91414f76bf..ec87e15eb8b 100644
--- a/addons/sale/report/sale_report_view.xml
+++ b/addons/sale/report/sale_report_view.xml
@@ -59,7 +59,7 @@
-
+
From b9cf338c217a57cbce1d8fae2aa1cf5419b685d2 Mon Sep 17 00:00:00 2001
From: Yannick Tivisse
Date: Wed, 9 Sep 2015 16:48:27 +0200
Subject: [PATCH 19/53] [FIX] hr_timesheet: demo timesheet lines weren't taken
into account in report
---
addons/hr_timesheet/hr_timesheet_demo.yml | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/addons/hr_timesheet/hr_timesheet_demo.yml b/addons/hr_timesheet/hr_timesheet_demo.yml
index 53545ab778e..05ec70a965a 100644
--- a/addons/hr_timesheet/hr_timesheet_demo.yml
+++ b/addons/hr_timesheet/hr_timesheet_demo.yml
@@ -12,6 +12,7 @@
'product_uom_id': ref('product.product_uom_hour'),
'account_id': ref('analytic.analytic_administratif'),
'amount': -60.00,
+ 'is_timesheet': True,
}
self._update(cr, uid, 'account.analytic.line', 'hr_timesheet', vals, 'working_hours_requirements')
vals = {
@@ -23,6 +24,7 @@
'product_uom_id': ref('product.product_uom_hour'),
'account_id': ref('analytic.analytic_administratif'),
'amount': -30.00,
+ 'is_timesheet': True,
}
self._update(cr, uid, 'account.analytic.line', 'hr_timesheet', vals, 'working_hours_design')
vals = {
@@ -34,6 +36,7 @@
'product_uom_id': ref('product.product_uom_hour'),
'account_id': ref('analytic.analytic_administratif'),
'amount': -90.00,
+ 'is_timesheet': True,
}
self._update(cr, uid, 'account.analytic.line', 'hr_timesheet', vals, 'working_hours_coding')
vals = {
@@ -45,6 +48,7 @@
'product_uom_id': ref('product.product_uom_hour'),
'account_id': ref('analytic.analytic_administratif'),
'amount': -30.00,
+ 'is_timesheet': True,
}
self._update(cr, uid, 'account.analytic.line', 'hr_timesheet', vals, 'working_hours_testing')
vals = {
@@ -56,5 +60,6 @@
'product_uom_id': ref('product.product_uom_hour'),
'account_id': ref('analytic.analytic_administratif'),
'amount': -30.00,
+ 'is_timesheet': True,
}
self._update(cr, uid, 'account.analytic.line', 'hr_timesheet', vals, 'working_hours_maintenance')
From 69e42cb2b2b66df701c03482eff74129d440761c Mon Sep 17 00:00:00 2001
From: Yannick Tivisse
Date: Wed, 9 Sep 2015 16:49:05 +0200
Subject: [PATCH 20/53] [IMP] sale: put some SO in confirmed state in demo
---
addons/sale/sale_demo.xml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/addons/sale/sale_demo.xml b/addons/sale/sale_demo.xml
index 85ebd419c13..aa52d24a1a4 100644
--- a/addons/sale/sale_demo.xml
+++ b/addons/sale/sale_demo.xml
@@ -191,6 +191,7 @@
+ sale
@@ -209,6 +210,7 @@
+ sale
@@ -255,6 +257,7 @@
+ sale
From cdc55cf8a62ce18b8b47df7679ecf894efaf7fb0 Mon Sep 17 00:00:00 2001
From: Xavier Morel
Date: Wed, 9 Sep 2015 16:49:30 +0200
Subject: [PATCH 21/53] [REM] membership: yml demo file
* non-deterministic execution (depending on having a chart of account
loaded before it), unreliable as demonstration dataset
* hot mess, very debatable purpose
* apparently not used by membership tests (since unreliable execution)
* most expensive single data file when it happens to run in full (12~15s
on runbot)
* heresy
---
addons/membership/__openerp__.py | 1 -
addons/membership/membership_demo.yml | 49 ---------------------------
2 files changed, 50 deletions(-)
delete mode 100644 addons/membership/membership_demo.yml
diff --git a/addons/membership/__openerp__.py b/addons/membership/__openerp__.py
index 66906a11a9b..880c959b5d8 100644
--- a/addons/membership/__openerp__.py
+++ b/addons/membership/__openerp__.py
@@ -30,7 +30,6 @@ invoice and send propositions for membership renewal.
],
'demo': [
'membership_demo.xml',
- 'membership_demo.yml',
],
'website': 'https://www.odoo.com/page/community-builder',
'test': [
diff --git a/addons/membership/membership_demo.yml b/addons/membership/membership_demo.yml
deleted file mode 100644
index 36e8482caeb..00000000000
--- a/addons/membership/membership_demo.yml
+++ /dev/null
@@ -1,49 +0,0 @@
--
- create invoice and state is 'open' and pay some invoice
--
- !python {model: res.partner}: |
-
- vals = {'free_member': False}
- self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_18')
- self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_4')
- self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_12')
- self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_1')
-
- if self.pool.get('account.invoice')._default_currency(cr, uid):
- import time
- invoice_ids = self.create_membership_invoice(cr, uid, [ref("base.res_partner_1"),ref("base.res_partner_4"),ref("base.res_partner_10"),ref("base.res_partner_2"),ref("base.res_partner_12"),ref("base.res_partner_3"),ref("base.res_partner_4"),ref("base.res_partner_1"),ref("base.res_partner_1"),ref("base.res_partner_10")], product_id=ref("membership_1"), datas={"amount":80.00})
- invoice_pool = self.pool.get('account.invoice')
- invoice_pool.signal_workflow(cr, uid, invoice_ids, 'invoice_open')
-
- bank_journal_id = self.pool.get('account.journal').search(cr, uid, [('type', '=', 'bank')])
- if bank_journal_id:
- for id in invoice_ids[-4:]:
- pay = invoice_pool.pay_and_reconcile(cr, uid, [id], bank_journal_id[0], 9050.0)
-
- self.create_membership_invoice(cr, uid, ref('base.res_partner_2'), ref('membership_0'), {'amount':180})
- self.create_membership_invoice(cr, uid, ref('base.res_partner_10'), ref('membership_0'), {'amount':180})
- self.create_membership_invoice(cr, uid, ref('base.res_partner_12'), ref('membership_0'), {'amount':180})
- self.create_membership_invoice(cr, uid, ref('base.res_partner_2'), ref('membership_0'), {'amount':180})
-
- self.create_membership_invoice(cr, uid, ref('base.res_partner_18'), ref('membership_1'), {'amount':180})
- self.create_membership_invoice(cr, uid, ref('base.res_partner_4'), ref('membership_1'), {'amount':180})
- self.create_membership_invoice(cr, uid, ref('base.res_partner_1'), ref('membership_1'), {'amount':180})
- self.create_membership_invoice(cr, uid, ref('base.res_partner_12'), ref('membership_1'), {'amount':180})
-
- self.create_membership_invoice(cr, uid, ref('base.res_partner_12'), ref('membership_2'), {'amount':180})
- self.create_membership_invoice(cr, uid, ref('base.res_partner_3'), ref('membership_2'), {'amount':180})
- self.create_membership_invoice(cr, uid, ref('base.res_partner_3'), ref('membership_2'), {'amount':180})
- self.create_membership_invoice(cr, uid, ref('base.res_partner_3'), ref('membership_2'), {'amount':180})
-
- vals = {'free_member': True}
- self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_18')
- self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_4')
- self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_12')
- self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_1')
-
- vals = {'associate_member': ref('base.res_partner_2')}
- self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_12')
- self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_12')
- self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_3')
- self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_4')
- self.pool.get('ir.model.data')._update(cr, uid, 'res.partner', 'base', vals, 'res_partner_12')
From a934b9e1ba4031e1bf0689d5cee6feea09424e8b Mon Sep 17 00:00:00 2001
From: Josse Colpaert
Date: Tue, 8 Sep 2015 18:22:36 +0200
Subject: [PATCH 22/53] [IMP] delivery: add fields for retrieving the bulk
weight and the weight of the packages of a picking
As the transporter interfaces will put a label on every package,
it is in handy to have a field with the list of the final packages
(and their weights) treated in the picking.
We give a weight for the products that are not in a package also(bulk).
We only put the weight on the package in the views.
The weights in the product form views should appear entirely or not in
product / product templates (only when only 1 variant)
(attrs was only on the field, not label, ...)
The digits= for the weights are not needed as there is a decimal precision
on these fields.
---
addons/delivery/models/stock_picking.py | 40 +++++++++++++++++++++++++
addons/delivery/views/delivery_view.xml | 11 +++++++
addons/product/product_view.xml | 22 +++++++-------
3 files changed, 61 insertions(+), 12 deletions(-)
diff --git a/addons/delivery/models/stock_picking.py b/addons/delivery/models/stock_picking.py
index b6b9f291d71..344828b27a2 100644
--- a/addons/delivery/models/stock_picking.py
+++ b/addons/delivery/models/stock_picking.py
@@ -6,6 +6,22 @@ from openerp.exceptions import UserError
import openerp.addons.decimal_precision as dp
+class StockQuantPackage(models.Model):
+ _inherit = "stock.quant.package"
+
+ @api.one
+ @api.depends('quant_ids', 'children_ids')
+ def _compute_weight(self):
+ weight = 0
+ for quant in self.quant_ids:
+ weight += quant.qty * quant.product_id.weight
+ for pack in self.children_ids:
+ pack._compute_weight()
+ weight += pack.weight
+ self.weight = weight
+
+ weight = fields.Float(compute='_compute_weight')
+
class StockPicking(models.Model):
_inherit = 'stock.picking'
@@ -14,6 +30,28 @@ class StockPicking(models.Model):
uom_categ_id = self.env.ref('product.product_uom_categ_kgm').id
return self.env['product.uom'].search([('category_id', '=', uom_categ_id), ('factor', '=', 1)], limit=1)
+ @api.one
+ @api.depends('pack_operation_ids')
+ def _compute_packages(self):
+ self.ensure_one()
+ packs = set()
+ for packop in self.pack_operation_ids:
+ if packop.result_package_id:
+ packs.add(packop.result_package_id.id)
+ elif packop.package_id and not packop.product_id:
+ packs.add(packop.package_id.id)
+ self.package_ids = list(packs)
+
+ @api.one
+ @api.depends('pack_operation_ids')
+ def _compute_bulk_weight(self):
+ weight = 0.0
+ uom_obj = self.env['product.uom']
+ for packop in self.pack_operation_ids:
+ if packop.product_id and not packop.result_package_id:
+ weight += uom_obj._compute_qty_obj(packop.product_uom_id , packop.product_qty, packop.product_id.uom_id) * packop.product_id.weight
+ self.weight_bulk = weight
+
carrier_price = fields.Float(string="Shipping Cost", readonly=True)
delivery_type = fields.Selection(related='carrier_id.delivery_type', readonly=True)
carrier_id = fields.Many2one("delivery.carrier", string="Carrier")
@@ -22,6 +60,8 @@ class StockPicking(models.Model):
carrier_tracking_ref = fields.Char(string='Carrier Tracking Ref', copy=False)
number_of_packages = fields.Integer(string='Number of Packages', copy=False)
weight_uom_id = fields.Many2one('product.uom', string='Unit of Measure', required=True, readonly="1", help="Unit of measurement for Weight", default=_default_uom)
+ package_ids = fields.Many2many('stock.quant.package', compute='_compute_packages', string='Packages')
+ weight_bulk = fields.Float('Bulk Weight', compute='_compute_bulk_weight')
@api.depends('product_id', 'move_lines')
def _cal_weight(self):
diff --git a/addons/delivery/views/delivery_view.xml b/addons/delivery/views/delivery_view.xml
index 6d7525be2b8..2b6fbae5902 100644
--- a/addons/delivery/views/delivery_view.xml
+++ b/addons/delivery/views/delivery_view.xml
@@ -195,6 +195,17 @@
+
+ stock.quant.package.weight.form
+ stock.quant.package
+
+
+
+
+
+
+
+
stock.move.form.weight
stock.move
diff --git a/addons/product/product_view.xml b/addons/product/product_view.xml
index ea959d44c15..617c471dddc 100644
--- a/addons/product/product_view.xml
+++ b/addons/product/product_view.xml
@@ -125,11 +125,9 @@
-
-
-
-
kg
+
+
+
@@ -265,7 +263,7 @@
-
+
kg
@@ -482,12 +480,12 @@
-
-
-
-
+
+ {'invisible':[('type', 'not in', ['product', 'consu'])]}
+
+
+
{'invisible':[('type', 'not in', ['product', 'consu'])]}
+
From bfed8706bb96967a6fd22b6713699a83be706902 Mon Sep 17 00:00:00 2001
From: rsi-odoo
Date: Wed, 9 Sep 2015 18:47:32 +0530
Subject: [PATCH 23/53] [FIX] l10n_hr: fixes tags and taxes for enterprise
---
addons/l10n_hr/data/account.tax.template.csv | 22 +++++++-------
addons/l10n_hr/data/account_chart_tag.xml | 32 ++++++++++++++++++++
2 files changed, 43 insertions(+), 11 deletions(-)
diff --git a/addons/l10n_hr/data/account.tax.template.csv b/addons/l10n_hr/data/account.tax.template.csv
index 2579ffc1071..ce3deac1f90 100644
--- a/addons/l10n_hr/data/account.tax.template.csv
+++ b/addons/l10n_hr/data/account.tax.template.csv
@@ -28,15 +28,15 @@ rrif_pp_ino_10,Plaćeni PDV 10% na usluge inozemnih poduzetnika,l10n_hr_chart_te
rrif_ppr2_25,25% R-2 dobavljač,l10n_hr_chart_template_rrif,25% R-2 dobavljač,25,percent,purchase,100,kp_rrif1409,kp_rrif1409,tax_tag_33,
rrif_pp_uvoz_samopdv_25,Samo PDV kod uvoza 25%,l10n_hr_chart_template_rrif,Samo PDV kod uvoza 25%,25,percent,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_32,
rrif_pp_uvoz_samopdv_25usl,Samo PDV kod uvoza 25% usluge,l10n_hr_chart_template_rrif,Samo PDV kod uvoza 25% usluge,25,percent,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_29,
-rrif_ppdnp1_3070_70_3,pp 70% priz.(25%),l10n_hr_chart_template_rrif,Pp 70% priz.(25%),17.5,percent,none,100,kp_rrif14002,kp_rrif14002,,
-rrif_ppdnp1_3070_30_3,pp 30% nep.(25%),l10n_hr_chart_template_rrif,pp 30% nep.(25%),7.5,percent,none,100,kp_rrif4199,kp_rrif4199,,
-rrif_ppdnp1_3070_1,pp 30% Nepriznat 70% Priznat,l10n_hr_chart_template_rrif,pp 30% Nepriznat 70% Priznat,100,group,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_21,"rrif_ppdnp1_3070_70_3,rrif_ppdnp1_3070_30_3"
-rrif_ppdnp1_7030_30_3,Pp 30% priz.(25%),l10n_hr_chart_template_rrif,Pp 30% priz.(25%),7.5,percent,none,100,kp_rrif14002,kp_rrif14002,,
-rrif_ppdnp1_7030_70_3,Pp 70% nep.(25%),l10n_hr_chart_template_rrif,Pp 70% nep.(25%),17.5,percent,none,100,kp_rrif4199,kp_rrif4199,,
+rrif_ppdnp1_3070_30_3,pp 30% nep.(25%),l10n_hr_chart_template_rrif,pp 30% nep.(25%),7.5,percent,none,100,kp_rrif4199,kp_rrif4199,tax_tag_21_1,
+rrif_ppdnp1_3070_70_3,pp 70% priz.(25%),l10n_hr_chart_template_rrif,Pp 70% priz.(25%),17.5,percent,none,100,kp_rrif14002,kp_rrif14002,tax_tag_21_2,
+rrif_ppdnp1_3070_1,pp 30% Nepriznat 70% Priznat,l10n_hr_chart_template_rrif,pp 30% Nepriznat 70% Priznat,100,group,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_21,"rrif_ppdnp1_3070_30_3,rrif_ppdnp1_3070_70_3"
+rrif_ppdnp1_7030_70_3,Pp 70% nep.(25%),l10n_hr_chart_template_rrif,Pp 70% nep.(25%),17.5,percent,none,100,kp_rrif4199,kp_rrif4199,tax_tag_20_1,
+rrif_ppdnp1_7030_30_3,Pp 30% priz.(25%),l10n_hr_chart_template_rrif,Pp 30% priz.(25%),7.5,percent,none,100,kp_rrif14002,kp_rrif14002,tax_tag_20_2,
rrif_ppdnp1_7030_1,pp 70% Nepriznat 30% Priznat,l10n_hr_chart_template_rrif,pp 70% Nepriznat 30% Priznat,100,group,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_20,"rrif_ppdnp1_7030_70_3,rrif_ppdnp1_7030_30_3"
-rrif_ppdnp1_3070_70_3_r2,R2 pp 70% priz.(25%),l10n_hr_chart_template_rrif,R2 pp 70% priz.(25%),17.5,percent,none,100,kp_rrif1408,kp_rrif1408,,
-rrif_ppdnp1_3070_30_3_r2,R2 pp 30% nep.(25%),l10n_hr_chart_template_rrif,R2 pp 30% nep.(25%),7.5,percent,none,100,kp_rrif4199,kp_rrif4199,,
-rrif_ppdnp1_3070_1_r2,R2 pp 30% Nepriznat 70% Priznat,l10n_hr_chart_template_rrif,R2 pp 30% Nepriznat 70% Priznat,100,group,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_30,"rrif_ppdnp1_3070_70_3_r2,rrif_ppdnp1_3070_30_3_r2"
-rrif_ppdnp1_7030_30_3_r2,R2 Pp 30% priz.(25%),l10n_hr_chart_template_rrif,R2 Pp 30% priz.(25%),7.5,percent,none,100,kp_rrif1408,kp_rrif1408,,
-rrif_ppdnp1_7030_70_3_r2,R2 Pp 70% nep.(25%),l10n_hr_chart_template_rrif,R2 Pp 70% nep.(25%),17.5,percent,none,100,kp_rrif4199,kp_rrif4199,,
-rrif_ppdnp1_7030_1_r2,R2 pp 70% Nepriznat 30% Priznat,l10n_hr_chart_template_rrif,R2 pp 70% Nepriznat 30% Priznat,100,group,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_31,"rrif_ppdnp1_7030_30_3_r2,rrif_ppdnp1_7030_70_3_r2"
+rrif_ppdnp1_3070_30_3_r2,R2 pp 30% nep.(25%),l10n_hr_chart_template_rrif,R2 pp 30% nep.(25%),7.5,percent,none,100,kp_rrif4199,kp_rrif4199,tax_tag_30_1,
+rrif_ppdnp1_3070_70_3_r2,R2 pp 70% priz.(25%),l10n_hr_chart_template_rrif,R2 pp 70% priz.(25%),17.5,percent,none,100,kp_rrif1408,kp_rrif1408,tax_tag_30_2,
+rrif_ppdnp1_3070_1_r2,R2 pp 30% Nepriznat 70% Priznat,l10n_hr_chart_template_rrif,R2 pp 30% Nepriznat 70% Priznat,100,group,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_30,"rrif_ppdnp1_3070_30_3_r2,rrif_ppdnp1_3070_70_3_r2"
+rrif_ppdnp1_7030_70_3_r2,R2 Pp 70% nep.(25%),l10n_hr_chart_template_rrif,R2 Pp 70% nep.(25%),17.5,percent,none,100,kp_rrif4199,kp_rrif4199,tax_tag_31_1,
+rrif_ppdnp1_7030_30_3_r2,R2 Pp 30% priz.(25%),l10n_hr_chart_template_rrif,R2 Pp 30% priz.(25%),7.5,percent,none,100,kp_rrif1408,kp_rrif1408,tax_tag_31_2,
+rrif_ppdnp1_7030_1_r2,R2 pp 70% Nepriznat 30% Priznat,l10n_hr_chart_template_rrif,R2 pp 70% Nepriznat 30% Priznat,100,group,purchase,100,kp_rrif4199,kp_rrif4199,tax_tag_31,"rrif_ppdnp1_7030_70_3_r2,rrif_ppdnp1_7030_30_3_r2"
diff --git a/addons/l10n_hr/data/account_chart_tag.xml b/addons/l10n_hr/data/account_chart_tag.xml
index a2877d94839..63d192e500f 100644
--- a/addons/l10n_hr/data/account_chart_tag.xml
+++ b/addons/l10n_hr/data/account_chart_tag.xml
@@ -95,10 +95,26 @@
pp 70% Nepriznat 30% Priznat
taxes
+
+ Pp 30% priz.(25%)
+ taxes
+
+
+ Pp 70% nep.(25%)
+ taxes
+
pp 30% Nepriznat 70% Priznat
taxes
+
+ pp 30% nep.(25%)
+ taxes
+
+
+ pp 70% priz.(25%)
+ taxes
+
Plaćeni PDV 25% pri uvozu dobara
taxes
@@ -135,10 +151,26 @@
R2 pp 30% Nepriznat 70% Priznat
taxes
+
+ R2 pp 30% nep.(25%)
+ taxes
+
+
+ R2 pp 70% priz.(25%)
+ taxes
+
R2 pp 70% Nepriznat 30% Priznat
taxes
+
+ R2 Pp 70% nep.(25%)
+ taxes
+
+
+ R2 Pp 30% priz.(25%)
+ taxes
+
Samo PDV kod uvoza 25%
taxes
From a794f7effa17c1c781bbeb774fc34e5d22d545ef Mon Sep 17 00:00:00 2001
From: Nicolas Martinelli
Date: Wed, 9 Sep 2015 15:21:14 +0200
Subject: [PATCH 24/53] [IMP] sale_timesheet: stat button for timesheet
activities
---
.../sale_timesheet/models/sale_timesheet.py | 36 +++++++++++++++++++
.../views/sale_timesheet_view.xml | 22 ++++++++++--
2 files changed, 55 insertions(+), 3 deletions(-)
diff --git a/addons/sale_timesheet/models/sale_timesheet.py b/addons/sale_timesheet/models/sale_timesheet.py
index 57f7818fbf7..68562bdbd2e 100644
--- a/addons/sale_timesheet/models/sale_timesheet.py
+++ b/addons/sale_timesheet/models/sale_timesheet.py
@@ -76,6 +76,20 @@ class AccountAnalyticLine(models.Model):
class SaleOrder(models.Model):
_inherit = 'sale.order'
+ timesheet_ids = fields.One2many('account.analytic.line', compute='_compute_timesheet_ids', string='Timesheet activities associated to this sale')
+ timesheet_count = fields.Float(string='Timesheet activities', compute='_compute_timesheet_ids')
+
+ @api.multi
+ @api.depends('project_id.line_ids')
+ def _compute_timesheet_ids(self):
+ for order in self:
+ if not order.project_id:
+ order.timesheet_ids = []
+ order.timesheet_count = 0.0
+ else:
+ order.timesheet_ids = self.env['account.analytic.line'].search([('is_timesheet', '=', True), ('account_id', '=', self.project_id.id)]).ids
+ order.timesheet_count = sum([line.unit_amount for line in order.timesheet_ids])
+
@api.one
@api.constrains('order_line')
def _check_multi_timesheet(self):
@@ -97,6 +111,28 @@ class SaleOrder(models.Model):
break
return result
+ @api.multi
+ def action_view_timesheet(self):
+ self.ensure_one()
+ imd = self.env['ir.model.data']
+ action = imd.xmlid_to_object('hr_timesheet.act_hr_timesheet_line_evry1_all_form')
+ list_view_id = imd.xmlid_to_res_id('hr_timesheet.hr_timesheet_line_tree')
+ form_view_id = imd.xmlid_to_res_id('hr_timesheet.hr_timesheet_line_form')
+
+ result = {
+ 'name': action.name,
+ 'help': action.help,
+ 'type': action.type,
+ 'views': [[list_view_id, 'tree'], [form_view_id, 'form']],
+ 'target': action.target,
+ 'context': action.context,
+ 'res_model': action.res_model,
+ }
+ if self.timesheet_count > 0:
+ result['domain'] = "[('id','in',%s)]" % self.timesheet_ids.ids
+ else:
+ result = {'type': 'ir.actions.act_window_close'}
+ return result
class SaleOrderLine(models.Model):
_inherit = "sale.order.line"
diff --git a/addons/sale_timesheet/views/sale_timesheet_view.xml b/addons/sale_timesheet/views/sale_timesheet_view.xml
index b63511a9926..6aab1f27236 100644
--- a/addons/sale_timesheet/views/sale_timesheet_view.xml
+++ b/addons/sale_timesheet/views/sale_timesheet_view.xml
@@ -26,8 +26,24 @@
-
-
+
+ sale.order.form.sale.timesheet
+ sale.order
+
+
+
+
+
+
+
+
+
+
+
+
-
From 7b734f96b1d51c1eb403160194d3068087e3af6b Mon Sep 17 00:00:00 2001
From: Nicolas Martinelli
Date: Wed, 9 Sep 2015 16:25:15 +0200
Subject: [PATCH 25/53] [IMP] sale_service: stat button for tasks
---
addons/sale_service/models/timesheet.py | 46 ++++++++++++++++++-
.../sale_service/views/sale_service_view.xml | 19 ++++++++
2 files changed, 63 insertions(+), 2 deletions(-)
diff --git a/addons/sale_service/models/timesheet.py b/addons/sale_service/models/timesheet.py
index 2257993b424..d2f3c4a6762 100644
--- a/addons/sale_service/models/timesheet.py
+++ b/addons/sale_service/models/timesheet.py
@@ -4,6 +4,50 @@
from openerp import models, api, fields, exceptions
from openerp.tools.translate import _
+
+class SaleOrder(models.Model):
+ _inherit = 'sale.order'
+
+ tasks_ids = fields.One2many('project.task', compute='_compute_tasks_ids', string='Tasks associated to this sale')
+ tasks_count = fields.Integer(string='Tasks', compute='_compute_tasks_ids')
+
+ @api.multi
+ @api.depends('order_line.product_id.project_id')
+ def _compute_tasks_ids(self):
+ for order in self:
+ order.tasks_ids = self.env['project.task'].search([('sale_line_id', 'in', order.order_line.ids)]).ids
+ if not order.tasks_ids:
+ order.tasks_count = 0
+ else:
+ order.tasks_count = len(order.tasks_ids.ids)
+
+ @api.multi
+ def action_view_task(self):
+ self.ensure_one()
+ imd = self.env['ir.model.data']
+ action = imd.xmlid_to_object('project.action_view_task')
+ list_view_id = imd.xmlid_to_res_id('project.view_task_tree2')
+ form_view_id = imd.xmlid_to_res_id('project.view_task_form2')
+
+ result = {
+ 'name': action.name,
+ 'help': action.help,
+ 'type': action.type,
+ 'views': [[list_view_id, 'tree'], [False, 'kanban'], [form_view_id, 'form'], [False, 'graph'], [False, 'calendar'], [False, 'pivot'], [False, 'graph']],
+ 'target': action.target,
+ 'context': action.context,
+ 'res_model': action.res_model,
+ }
+ if len(self.tasks_ids) > 1:
+ result['domain'] = "[('id','in',%s)]" % self.tasks_ids.ids
+ elif len(self.tasks_ids) == 1:
+ result['views'] = [(form_view_id, 'form')]
+ result['res_id'] = self.tasks_ids.id
+ else:
+ result = {'type': 'ir.actions.act_window_close'}
+ return result
+
+
class product_template(models.Model):
_inherit = "product.template"
project_id = fields.Many2one('project.project', string='Project', ondelete='set null')
@@ -30,5 +74,3 @@ class account_analytic_line(models.Model):
self._update_values(values)
result = super(account_analytic_line, self).write(values)
return result
-
-
diff --git a/addons/sale_service/views/sale_service_view.xml b/addons/sale_service/views/sale_service_view.xml
index 17daa8c9133..78c17b828de 100644
--- a/addons/sale_service/views/sale_service_view.xml
+++ b/addons/sale_service/views/sale_service_view.xml
@@ -45,5 +45,24 @@
+
+ sale.order.form.sale.service
+ sale.order
+
+
+
+
+
+
+
+
+
+
+
+
From f4e24b9843e290d37b5f0d72cc7091610bf0421a Mon Sep 17 00:00:00 2001
From: Fabien Pinckaers
Date: Thu, 10 Sep 2015 08:47:57 +0200
Subject: [PATCH 26/53] [IMP] Event form view
---
addons/event/data/event_data_tip.xml | 2 +-
addons/event/models/event.py | 14 ++++++-------
addons/event/views/event_views.xml | 20 +++++++++++++------
.../views/website_event_backend.xml | 14 +++++++------
addons/website_event_track/models/event.py | 2 +-
.../views/event_backend.xml | 9 +++++----
6 files changed, 36 insertions(+), 25 deletions(-)
diff --git a/addons/event/data/event_data_tip.xml b/addons/event/data/event_data_tip.xml
index 02b32f128f1..1bb7eb4afd3 100644
--- a/addons/event/data/event_data_tip.xml
+++ b/addons/event/data/event_data_tip.xml
@@ -2,7 +2,7 @@
- By clicking here, you can create and manage registration(s) for this event, send emails to attendee(s) and print identification badges.
+ Create and manage registrations for this event, send emails to attendees and print identification badges.
event.event
form
diff --git a/addons/event/models/event.py b/addons/event/models/event.py
index a83f4fe8f36..f73257b8a01 100644
--- a/addons/event/models/event.py
+++ b/addons/event/models/event.py
@@ -29,7 +29,7 @@ class event_event(models.Model):
_order = 'date_begin'
name = fields.Char(
- string='Name', translate=True, required=True,
+ string='Event Name', translate=True, required=True,
readonly=False, states={'done': [('readonly', True)]})
active = fields.Boolean(default=True, track_visibility="onchange")
user_id = fields.Many2one(
@@ -60,20 +60,20 @@ class event_event(models.Model):
# Seats and computation
seats_max = fields.Integer(
- string='Maximum Available Seats', oldname='register_max',
+ string='Maximum Attendees Number', oldname='register_max',
readonly=True, states={'draft': [('readonly', False)], 'confirm': [('readonly', False)]},
help="For each event you can define a maximum registration of seats(number of attendees), above this numbers the registrations are not accepted.")
seats_availability = fields.Selection(
[('limited', 'Limited'), ('unlimited', 'Unlimited')],
- 'Available Seat', required=True, default='unlimited')
+ 'Maximum Attendees', required=True, default='unlimited')
seats_min = fields.Integer(
- string='Minimum Reservation of Seats Required', oldname='register_min',
- help="For each event you can define a minimum reserved seats(number of attendees), if it does not reach the mentioned registrations the event can not be confirmed (keep 0 to ignore this rule)")
+ string='Minimum Attendees', oldname='register_min',
+ help="For each event you can define a minimum reserved seats (number of attendees), if it does not reach the mentioned registrations the event can not be confirmed (keep 0 to ignore this rule)")
seats_reserved = fields.Integer(
oldname='register_current', string='Reserved Seats',
store=True, readonly=True, compute='_compute_seats')
seats_available = fields.Integer(
- oldname='register_avail', string='Available Seats',
+ oldname='register_avail', string='Maximum Attendees',
store=True, readonly=True, compute='_compute_seats')
seats_unconfirmed = fields.Integer(
oldname='register_prospect', string='Unconfirmed Seat Reservations',
@@ -158,7 +158,7 @@ class event_event(models.Model):
('confirm', 'Confirmed'), ('done', 'Done')],
string='Status', default='draft', readonly=True, required=True, copy=False,
help="If event is created, the status is 'Draft'. If event is confirmed for the particular dates the status is set to 'Confirmed'. If the event is over, the status is set to 'Done'. If event is cancelled the status is set to 'Cancelled'.")
- auto_confirm = fields.Boolean(string='Auto Confirmation Activated', compute='_compute_auto_confirm')
+ auto_confirm = fields.Boolean(string='Confirmation not required', compute='_compute_auto_confirm')
@api.one
def _compute_auto_confirm(self):
diff --git a/addons/event/views/event_views.xml b/addons/event/views/event_views.xml
index a9659970ed6..750716ef858 100644
--- a/addons/event/views/event_views.xml
+++ b/addons/event/views/event_views.xml
@@ -101,10 +101,18 @@
-
-
-
+
+
+
+
+ to
+
+
+
+
+
+
@@ -198,11 +206,11 @@
diff --git a/addons/website_event/views/website_event_backend.xml b/addons/website_event/views/website_event_backend.xml
index 12799957b70..3d626452a7d 100644
--- a/addons/website_event/views/website_event_backend.xml
+++ b/addons/website_event/views/website_event_backend.xml
@@ -18,14 +18,16 @@
-
+
-
+ states="confirm"
+ string="Print Badges"
+ class="oe_highlight"/>
+
diff --git a/addons/website_event_track/models/event.py b/addons/website_event_track/models/event.py
index 2376dd4c7a9..61b1d891af9 100644
--- a/addons/website_event_track/models/event.py
+++ b/addons/website_event_track/models/event.py
@@ -166,7 +166,7 @@ class event_event(models.Model):
track_ids = fields.One2many('event.track', 'event_id', 'Tracks')
sponsor_ids = fields.One2many('event.sponsor', 'event_id', 'Sponsors')
blog_id = fields.Many2one('blog.blog', 'Event Blog')
- show_track_proposal = fields.Boolean('Talks Proposals')
+ show_track_proposal = fields.Boolean('Tracks Proposals')
show_tracks = fields.Boolean('Show Tracks on Website')
show_blog = fields.Boolean('News')
count_tracks = fields.Integer('Tracks', compute='_count_tracks')
diff --git a/addons/website_event_track/views/event_backend.xml b/addons/website_event_track/views/event_backend.xml
index 53d28c2bca9..cc0f4d985fb 100644
--- a/addons/website_event_track/views/event_backend.xml
+++ b/addons/website_event_track/views/event_backend.xml
@@ -322,20 +322,21 @@ Tracks define the agenda of your event. These can be a talk, a round table, a me
+ icon="fa-inbox"
+ attrs="{'invisible': [('show_tracks', '=', False), ('show_track_proposal', '=', False)]}">
-
+
-
-
+
+
From abe9103db8bbc54de1494c2ed7da98856ef98665 Mon Sep 17 00:00:00 2001
From: Olivier Laurent
Date: Thu, 10 Sep 2015 09:38:52 +0200
Subject: [PATCH 27/53] [ADD] doc: database upgrade API
---
doc/_static/banners/upgrade_api.jpg | Bin 0 -> 226018 bytes
doc/reference.rst | 1 +
doc/reference/upgrade_api.rst | 501 ++++++++++++++++++++++++++++
3 files changed, 502 insertions(+)
create mode 100644 doc/_static/banners/upgrade_api.jpg
create mode 100644 doc/reference/upgrade_api.rst
diff --git a/doc/_static/banners/upgrade_api.jpg b/doc/_static/banners/upgrade_api.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..f176831f840e740507fa7d5a1ac8c81a292bf099
GIT binary patch
literal 226018
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ϺJFy?Lf;^r}&~!Ix{(5lTXqz
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