diff --git a/MANIFEST.in b/MANIFEST.in
index d27848ab760..034e06807ff 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -8,6 +8,7 @@ recursive-include openerp *.html
recursive-include openerp *.jpeg
recursive-include openerp *.jpg
recursive-include openerp *.js
+recursive-include openerp *.less
recursive-include openerp *.md
recursive-include openerp *.png
recursive-include openerp *.po
diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py
index 3abd46bc02f..6a426c6e774 100644
--- a/addons/account/__openerp__.py
+++ b/addons/account/__openerp__.py
@@ -48,7 +48,6 @@ Processes like maintaining general ledgers are done through the defined Financia
for a particular financial year and for preparation of vouchers there is a module named account_voucher.
""",
'website': 'https://www.odoo.com/page/billing',
- 'images' : ['images/accounts.jpeg','images/bank_statement.jpeg','images/cash_register.jpeg','images/chart_of_accounts.jpeg','images/customer_invoice.jpeg','images/journal_entries.jpeg'],
'depends' : ['base_setup', 'product', 'analytic', 'board', 'edi', 'report'],
'data': [
'security/account_security.xml',
diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py
index d06f85e5115..630af63708b 100644
--- a/addons/account/account_bank_statement.py
+++ b/addons/account/account_bank_statement.py
@@ -873,7 +873,7 @@ class account_bank_statement_line(osv.osv):
# Unfortunately, that spawns a "no access rights" error ; it shouldn't.
def _needaction_domain_get(self, cr, uid, context=None):
user = self.pool.get("res.users").browse(cr, uid, uid)
- return ['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id]), ('journal_entry_ids', '=', False)]
+ return ['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id]), ('journal_entry_ids', '=', False), ('account_id', '=', False)]
_order = "statement_id desc, sequence"
_name = "account.bank.statement.line"
diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml
index 83fcebb45ce..b0dbb55bd51 100644
--- a/addons/account/account_view.xml
+++ b/addons/account/account_view.xml
@@ -2554,7 +2554,7 @@
-
+
diff --git a/addons/account/static/src/css/account_bank_statement_reconciliation.css b/addons/account/static/src/css/account_bank_statement_reconciliation.css
index 3543360fb26..a5710c2e0b1 100644
--- a/addons/account/static/src/css/account_bank_statement_reconciliation.css
+++ b/addons/account/static/src/css/account_bank_statement_reconciliation.css
@@ -55,6 +55,10 @@
top: 2px;
z-index: 10;
text-shadow: -1px -1px 0 #f5f5f5, 1px -1px 0 #f5f5f5, -1px 1px 0 #f5f5f5, 1px 1px 0 #f5f5f5; }
+ .openerp .oe_bank_statement_reconciliation .show_more_container {
+ text-align: center; }
+ .openerp .oe_bank_statement_reconciliation .show_more_container .show_more {
+ display: none; }
.openerp .oe_bank_statement_reconciliation .notification_area {
margin: 0 15px; }
.openerp .oe_bank_statement_reconciliation .interface_options {
diff --git a/addons/account/static/src/css/account_bank_statement_reconciliation.scss b/addons/account/static/src/css/account_bank_statement_reconciliation.scss
index 1b4acdb2ee5..a773e20b4f4 100644
--- a/addons/account/static/src/css/account_bank_statement_reconciliation.scss
+++ b/addons/account/static/src/css/account_bank_statement_reconciliation.scss
@@ -92,6 +92,13 @@ $aestetic_animation_speed: 300ms;
}
}
+ .show_more_container {
+ text-align: center;
+
+ .show_more {
+ display: none;
+ }
+ }
.notification_area {
margin: 0 $actionColWidth;
}
diff --git a/addons/account/static/src/js/account_widgets.js b/addons/account/static/src/js/account_widgets.js
index 126ceaa6d94..136c571f495 100644
--- a/addons/account/static/src/js/account_widgets.js
+++ b/addons/account/static/src/js/account_widgets.js
@@ -15,11 +15,13 @@ openerp.account = function (instance) {
"click .statement_name span": "statementNameClickHandler",
"keyup .change_statement_name_field": "changeStatementNameFieldHandler",
"click .change_statement_name_button": "changeStatementButtonClickHandler",
+ "click .show_more": "showMoreButtonClickHandler",
},
init: function(parent, context) {
this._super(parent);
- this.max_reconciliations_displayed = 10;
+ // Number of reconciliations loaded initially and by clicking 'show more'
+ this.num_reconciliations_fetched_in_batch = 10;
if (context.context.statement_id) this.statement_ids = [context.context.statement_id];
if (context.context.statement_ids) this.statement_ids = context.context.statement_ids;
this.single_statement = this.statement_ids !== undefined && this.statement_ids.length === 1;
@@ -237,7 +239,7 @@ openerp.account = function (instance) {
total_lines: self.already_reconciled_lines+self.st_lines.length
}));
self.updateProgressbar();
- var reconciliations_to_show = self.st_lines.slice(0, self.max_reconciliations_displayed);
+ var reconciliations_to_show = self.st_lines.slice(0, self.num_reconciliations_fetched_in_batch);
self.last_displayed_reconciliation_index = reconciliations_to_show.length;
self.$(".reconciliation_lines_container").css("opacity", 0);
@@ -251,6 +253,7 @@ openerp.account = function (instance) {
$.when.apply($, child_promises).then(function(){
self.$(".reconciliation_lines_container").animate({opacity: 1}, self.aestetic_animation_speed);
self.getChildren()[0].set("mode", "match");
+ self.updateShowMoreButton();
if (self.notifications) {
self.displayNotifications(self.notifications);
}
@@ -340,7 +343,7 @@ openerp.account = function (instance) {
var child = reconciliations[i];
data.push([child.st_line_id, child.makeMoveLineDicts()]);
}
- var deferred_animation = self.$(".reconciliation_lines_container").fadeOut(self.aestetic_animation_speed);
+ var deferred_animation = self.$(".reconciliation_lines_container, .show_more_container").fadeOut(self.aestetic_animation_speed);
deferred_rpc = self.model_bank_statement_line.call("process_reconciliations", [data]);
return $.when(deferred_animation, deferred_rpc)
.done(function() {
@@ -359,48 +362,25 @@ openerp.account = function (instance) {
// Display new line if there are left
if (self.last_displayed_reconciliation_index < self.st_lines.length) {
- var begin = self.last_displayed_reconciliation_index;
- var end = Math.min((begin+self.max_reconciliations_displayed), self.st_lines.length);
- var reconciliations_to_show = self.st_lines.slice(begin, end);
-
- return self.model_bank_statement_line
- .call("get_data_for_reconciliations", [reconciliations_to_show])
- .then(function (data) {
- var child_promises = [];
- var datum;
- while ((datum = data.shift()) !== undefined) {
- var context = {
- st_line_id: datum.st_line.id,
- mode: 'inactive',
- animate_entrance: false,
- initial_data_provided: true,
- st_line: datum.st_line,
- reconciliation_proposition: datum.reconciliation_proposition,
- };
- var widget = new instance.web.account.bankStatementReconciliationLine(self, context);
- child_promises.push(widget.appendTo(self.$(".reconciliation_lines_container")));
+ return self.displayReconciliations(self.num_reconciliations_fetched_in_batch).then(function() {
+ // Put the first line in match mode
+ if (self.reconciled_lines !== self.st_lines.length) {
+ var first_child = self.getChildren()[0];
+ if (first_child.get("mode") === "inactive") {
+ first_child.set("mode", "match");
}
- self.last_displayed_reconciliation_index += reconciliations_to_show.length;
- return $.when.apply($, child_promises).then(function() {
- // Put the first line in match mode
- if (self.reconciled_lines !== self.st_lines.length) {
- var first_child = self.getChildren()[0];
- if (first_child.get("mode") === "inactive") {
- first_child.set("mode", "match");
- }
- }
- self.$(".reconciliation_lines_container").fadeIn(self.aestetic_animation_speed);
- });
- });
+ }
+ self.$(".reconciliation_lines_container, .show_more_container").fadeIn(self.aestetic_animation_speed);
+ });
} else if (self.reconciled_lines === self.st_lines.length) {
// Congratulate the user if the work is done
self.displayDoneMessage();
} else {
// Some lines weren't persisted because they were't valid
- self.$(".reconciliation_lines_container").fadeIn(self.aestetic_animation_speed);
+ self.$(".reconciliation_lines_container, .show_more_container").fadeIn(self.aestetic_animation_speed);
}
}).fail(function() {
- self.$(".reconciliation_lines_container").fadeIn(self.aestetic_animation_speed);
+ self.$(".reconciliation_lines_container, .show_more_container").fadeIn(self.aestetic_animation_speed);
});
},
@@ -433,7 +413,8 @@ openerp.account = function (instance) {
// Update children if needed
_.each(self.getChildren(), function(child){
- if ((child.partner_id === partner_id || child.st_line.has_no_partner) && child !== source_child) {
+ if (child === source_child || child.st_line === undefined) return;
+ if (child.partner_id === partner_id || child.st_line.has_no_partner) {
if (contains_lines(child.get("mv_lines_selected"), line_ids)) {
child.set("mv_lines_selected", _.filter(child.get("mv_lines_selected"), function(o){ return line_ids.indexOf(o.id) === -1 }));
} else if (contains_lines(child.mv_lines_deselected, line_ids)) {
@@ -457,6 +438,7 @@ openerp.account = function (instance) {
// Update children if needed
_.each(self.getChildren(), function(child){
+ if (child.st_line === undefined) return;
if (child.partner_id === partner_id && child !== source_child && (child.get("mode") === "match" || child.$el.hasClass("no_match")))
child.updateMatches();
if (child.st_line.has_no_partner && child.get("mode") === "match" || child.$el.hasClass("no_match"))
@@ -464,6 +446,42 @@ openerp.account = function (instance) {
});
},
+ displayReconciliations: function(number) {
+ var self = this;
+ var begin = self.last_displayed_reconciliation_index;
+ var end = Math.min((begin+number), self.st_lines.length);
+ var reconciliations_to_show = self.st_lines.slice(begin, end);
+
+ // Get ids of selected move lines (to exclude them from reconciliation proposition)
+ var excluded_move_lines_ids = [];
+ _.each(self.excluded_move_lines_ids, function(o){
+ excluded_move_lines_ids = excluded_move_lines_ids.concat(o);
+ });
+
+ return self.model_bank_statement_line
+ .call("get_data_for_reconciliations", [reconciliations_to_show, excluded_move_lines_ids])
+ .then(function (data) {
+ var child_promises = [];
+ var datum;
+ while ((datum = data.shift()) !== undefined) {
+ var context = {
+ st_line_id: datum.st_line.id,
+ mode: 'inactive',
+ animate_entrance: false,
+ initial_data_provided: true,
+ st_line: datum.st_line,
+ reconciliation_proposition: datum.reconciliation_proposition,
+ };
+ var widget = new instance.web.account.bankStatementReconciliationLine(self, context);
+ child_promises.push(widget.appendTo(self.$(".reconciliation_lines_container")));
+ }
+ self.last_displayed_reconciliation_index += reconciliations_to_show.length;
+ return $.when.apply($, child_promises).then(function(){
+ self.updateShowMoreButton();
+ });
+ });
+ },
+
displayReconciliation: function(st_line_id, mode, animate_entrance, initial_data_provided, st_line, reconciliation_proposition) {
var self = this;
animate_entrance = (animate_entrance === undefined ? true : animate_entrance);
@@ -489,7 +507,7 @@ openerp.account = function (instance) {
self.doReloadMenuReconciliation();
// Display new line if there are left
- if (self.last_displayed_reconciliation_index < self.st_lines.length) {
+ if (self.last_displayed_reconciliation_index < self.st_lines.length && self.getChildren().length < self.num_reconciliations_fetched_in_batch) {
self.displayReconciliation(self.st_lines[self.last_displayed_reconciliation_index++], 'inactive');
}
// Congratulate the user if the work is done
@@ -504,6 +522,7 @@ openerp.account = function (instance) {
first_child.set("mode", "match");
}
}
+ self.updateShowMoreButton();
},
goBackToStatementsTreeView: function() {
@@ -557,6 +576,7 @@ openerp.account = function (instance) {
// Render it
self.$(".protip").hide();
+ self.updateShowMoreButton();
self.$(".oe_form_sheet").append(QWeb.render("bank_statement_reconciliation_done_message", {
title: title,
time_taken: time_taken,
@@ -606,7 +626,19 @@ openerp.account = function (instance) {
});
}
},
+
+ showMoreButtonClickHandler: function() {
+ this.displayReconciliations(this.num_reconciliations_fetched_in_batch);
+ },
+ updateShowMoreButton: function() {
+ var items_remaining = this.st_lines.length - this.last_displayed_reconciliation_index;
+ if (items_remaining > 0)
+ this.$(".show_more").show().find(".num_items_remaining").text(items_remaining);
+ else
+ this.$(".show_more").hide();
+ },
+
updateProgressbar: function() {
var self = this;
var done = self.already_reconciled_lines + self.reconciled_lines;
diff --git a/addons/account/static/src/xml/account_bank_statement_reconciliation.xml b/addons/account/static/src/xml/account_bank_statement_reconciliation.xml
index 415be5dde94..9d3ec4a67a4 100644
--- a/addons/account/static/src/xml/account_bank_statement_reconciliation.xml
+++ b/addons/account/static/src/xml/account_bank_statement_reconciliation.xml
@@ -34,6 +34,7 @@
+
Tip : Hit ctrl-enter to validate the whole sheet.
diff --git a/addons/account/tests/__init__.py b/addons/account/tests/__init__.py
index e09bcc6ee99..8a0a9394c3a 100644
--- a/addons/account/tests/__init__.py
+++ b/addons/account/tests/__init__.py
@@ -1,9 +1,3 @@
from . import test_tax
from . import test_search
from . import test_reconciliation
-
-fast_suite = [
- test_tax,
- test_search,
- test_reconciliation,
-]
diff --git a/addons/account_analytic_analysis/__openerp__.py b/addons/account_analytic_analysis/__openerp__.py
index 3e376c526ca..6fe9d954345 100644
--- a/addons/account_analytic_analysis/__openerp__.py
+++ b/addons/account_analytic_analysis/__openerp__.py
@@ -32,7 +32,6 @@ Adds menu to show relevant information to each manager.You can also view the rep
""",
'author': 'Camptocamp / Odoo',
'website': 'https://www.odoo.com/page/billing',
- 'images': ['images/bill_tasks_works.jpeg','images/overpassed_accounts.jpeg'],
'depends': ['hr_timesheet_invoice', 'sale'], #although sale is technically not required to install this module, all menuitems are located under 'Sales' application
'data': [
'security/ir.model.access.csv',
diff --git a/addons/account_analytic_default/__openerp__.py b/addons/account_analytic_default/__openerp__.py
index 74ae986d163..6aa65c4a6c4 100644
--- a/addons/account_analytic_default/__openerp__.py
+++ b/addons/account_analytic_default/__openerp__.py
@@ -37,7 +37,6 @@ Allows to automatically select analytic accounts based on criterions:
""",
'author': 'OpenERP SA',
'website': 'https://www.odoo.com/page/accounting',
- 'images': ['images/analytic_defaults.jpeg'],
'depends': ['sale_stock'],
'data': [
'security/ir.model.access.csv',
diff --git a/addons/account_analytic_plans/__openerp__.py b/addons/account_analytic_plans/__openerp__.py
index d4c99aa8fd3..9b5e467e69f 100644
--- a/addons/account_analytic_plans/__openerp__.py
+++ b/addons/account_analytic_plans/__openerp__.py
@@ -64,7 +64,6 @@ The analytic plan validates the minimum and maximum percentage at the time of cr
""",
'author': 'OpenERP SA',
'website': 'https://www.odoo.com/page/accounting',
- 'images': ['images/analytic_plan.jpeg'],
'depends': ['account', 'account_analytic_default'],
'data': [
'security/account_analytic_plan_security.xml',
diff --git a/addons/account_anglo_saxon/__openerp__.py b/addons/account_anglo_saxon/__openerp__.py
index 89c7768ce6b..ee4f7437785 100644
--- a/addons/account_anglo_saxon/__openerp__.py
+++ b/addons/account_anglo_saxon/__openerp__.py
@@ -39,7 +39,6 @@ account when the invoice is created to transfer this amount to the
debtor or creditor account. Secondly, price differences between actual
purchase price and fixed product standard price are booked on a separate
account.""",
- 'images': ['images/account_anglo_saxon.jpeg'],
'depends': ['product', 'purchase'],
'category': 'Accounting & Finance',
'demo': [],
diff --git a/addons/account_budget/__openerp__.py b/addons/account_budget/__openerp__.py
index 116e84fc960..352914eaa21 100644
--- a/addons/account_budget/__openerp__.py
+++ b/addons/account_budget/__openerp__.py
@@ -48,7 +48,6 @@ Three reports are available:
""",
'author': 'OpenERP SA',
'website': 'https://www.odoo.com/page/accounting',
- 'images': ['images/budget.jpeg','images/budgetary_position.jpeg'],
'depends': ['account'],
'data': [
'security/ir.model.access.csv',
diff --git a/addons/account_cancel/__openerp__.py b/addons/account_cancel/__openerp__.py
index f27901c6c55..7af5d2bd7f0 100644
--- a/addons/account_cancel/__openerp__.py
+++ b/addons/account_cancel/__openerp__.py
@@ -32,7 +32,6 @@ This module adds 'Allow Canceling Entries' field on form view of account journal
If set to true it allows user to cancel entries & invoices.
""",
'website': 'https://www.odoo.com/page/accounting',
- 'images': ['images/account_cancel.jpeg'],
'depends' : ['account'],
'data': ['account_cancel_view.xml' ],
'demo': [],
diff --git a/addons/account_followup/__openerp__.py b/addons/account_followup/__openerp__.py
index fa5d97a3a46..c612d8f6b63 100644
--- a/addons/account_followup/__openerp__.py
+++ b/addons/account_followup/__openerp__.py
@@ -45,7 +45,6 @@ Note that if you want to check the follow-up level for a given partner/account e
""",
'author': 'OpenERP SA',
'website': 'https://www.odoo.com/page/billing',
- 'images': ['images/follow_ups.jpeg','images/send_followups.jpeg'],
'depends': ['account_accountant', 'mail'],
'data': [
'security/account_followup_security.xml',
diff --git a/addons/account_followup/tests/__init__.py b/addons/account_followup/tests/__init__.py
index abad074cc09..84a004e7a11 100644
--- a/addons/account_followup/tests/__init__.py
+++ b/addons/account_followup/tests/__init__.py
@@ -20,6 +20,3 @@
##############################################################################
from . import test_account_followup
-checks = [
- test_account_followup,
-]
diff --git a/addons/account_payment/__openerp__.py b/addons/account_payment/__openerp__.py
index 83940178180..6c04b162e33 100644
--- a/addons/account_payment/__openerp__.py
+++ b/addons/account_payment/__openerp__.py
@@ -42,7 +42,6 @@ when you get the confirmation from your bank that your order has been accepted
that you can book it in your accounting. To help you with that operation, you
have a new option to import payment orders as bank statement lines.
""",
- 'images': ['images/payment_mode.jpeg','images/payment_order.jpeg'],
'depends': ['account','account_voucher'],
'data': [
'security/account_payment_security.xml',
diff --git a/addons/account_sequence/__openerp__.py b/addons/account_sequence/__openerp__.py
index 8f12e4850b5..409fb111825 100644
--- a/addons/account_sequence/__openerp__.py
+++ b/addons/account_sequence/__openerp__.py
@@ -39,7 +39,6 @@ You can customize the following attributes of the sequence:
""",
'author': 'OpenERP SA',
'website': 'https://www.odoo.com',
- 'images': ['images/internal_sequence_number.jpeg'],
'depends': ['account'],
'data': [
'account_sequence_data.xml',
diff --git a/addons/account_voucher/__openerp__.py b/addons/account_voucher/__openerp__.py
index 5dcfb7f28a6..09279f5eea3 100644
--- a/addons/account_voucher/__openerp__.py
+++ b/addons/account_voucher/__openerp__.py
@@ -42,7 +42,6 @@ This module manages:
'category': 'Accounting & Finance',
'sequence': 4,
'website' : 'https://www.odoo.com/page/billing',
- 'images' : ['images/customer_payment.jpeg','images/journal_voucher.jpeg','images/sales_receipt.jpeg','images/supplier_voucher.jpeg','images/customer_invoice.jpeg','images/customer_refunds.jpeg'],
'depends' : ['account'],
'demo' : [],
'data' : [
diff --git a/addons/account_voucher/account_voucher_view.xml b/addons/account_voucher/account_voucher_view.xml
index 353f725e52b..2ec6464d418 100644
--- a/addons/account_voucher/account_voucher_view.xml
+++ b/addons/account_voucher/account_voucher_view.xml
@@ -19,6 +19,24 @@
+
+ account.voucher.tree_nocreate
+ account.voucher
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ account.voucher.line.formaccount.voucher.line
@@ -40,7 +58,7 @@
account.voucher.formaccount.voucher
- tree
+
diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml
index 8024942730e..e6c564177cb 100644
--- a/addons/account_voucher/voucher_payment_receipt_view.xml
+++ b/addons/account_voucher/voucher_payment_receipt_view.xml
@@ -396,7 +396,7 @@
diff --git a/addons/analytic_user_function/__openerp__.py b/addons/analytic_user_function/__openerp__.py
index d8fa800335c..630eb9ee6dc 100644
--- a/addons/analytic_user_function/__openerp__.py
+++ b/addons/analytic_user_function/__openerp__.py
@@ -39,7 +39,6 @@ compatible with older configurations.
""",
'author': 'OpenERP SA',
'website': 'https://www.odoo.com/page/employees',
- 'images': ['images/analytic_user_function.jpeg'],
'depends': ['hr_timesheet_sheet'],
'data': ['analytic_user_function_view.xml', 'security/ir.model.access.csv'],
'demo': [],
diff --git a/addons/anonymization/__openerp__.py b/addons/anonymization/__openerp__.py
index 4415781dd94..89306819bcd 100644
--- a/addons/anonymization/__openerp__.py
+++ b/addons/anonymization/__openerp__.py
@@ -48,5 +48,4 @@ anonymization process to recover your previous data.
],
'installable': True,
'auto_install': False,
- 'images': ['images/anonymization1.jpeg','images/anonymization2.jpeg','images/anonymization3.jpeg'],
}
diff --git a/addons/association/__openerp__.py b/addons/association/__openerp__.py
index 7ed4c0d11f2..84b45367bf3 100644
--- a/addons/association/__openerp__.py
+++ b/addons/association/__openerp__.py
@@ -37,6 +37,5 @@ membership products (schemes).
'demo': [],
'installable': True,
'auto_install': False,
- 'images': ['images/association1.jpeg'],
'website': 'https://www.odoo.com'
}
diff --git a/addons/auth_ldap/__openerp__.py b/addons/auth_ldap/__openerp__.py
index 5373db4f475..e709ab96995 100644
--- a/addons/auth_ldap/__openerp__.py
+++ b/addons/auth_ldap/__openerp__.py
@@ -22,7 +22,6 @@
'name' : 'Authentication via LDAP',
'version' : '1.0',
'depends' : ['base'],
- 'images' : ['images/ldap_configuration.jpeg'],
'author' : 'OpenERP SA',
#'description': < auto-loaded from README file
'website' : 'https://www.odoo.com',
diff --git a/addons/auth_oauth/controllers/main.py b/addons/auth_oauth/controllers/main.py
index 55068bf2742..a5c3a3423e5 100644
--- a/addons/auth_oauth/controllers/main.py
+++ b/addons/auth_oauth/controllers/main.py
@@ -70,9 +70,9 @@ class OAuthLogin(Home):
return providers
def get_state(self, provider):
- redirect = request.params.get('redirect', 'web')
+ redirect = request.params.get('redirect') or 'web'
if not redirect.startswith(('//', 'http://', 'https://')):
- redirect = '%s%s' % (request.httprequest.url_root, redirect)
+ redirect = '%s%s' % (request.httprequest.url_root, redirect[1:] if redirect[0] == '/' else redirect)
state = dict(
d=request.session.db,
p=provider['id'],
diff --git a/addons/base_action_rule/__openerp__.py b/addons/base_action_rule/__openerp__.py
index f824468c52e..53857cf014b 100644
--- a/addons/base_action_rule/__openerp__.py
+++ b/addons/base_action_rule/__openerp__.py
@@ -44,5 +44,4 @@ trigger an automatic reminder email.
'demo': [],
'installable': True,
'auto_install': False,
- 'images': ['images/base_action_rule1.jpeg','images/base_action_rule2.jpeg','images/base_action_rule3.jpeg'],
}
diff --git a/addons/base_action_rule/tests/__init__.py b/addons/base_action_rule/tests/__init__.py
index 7e6a3e21939..7090de46a47 100644
--- a/addons/base_action_rule/tests/__init__.py
+++ b/addons/base_action_rule/tests/__init__.py
@@ -20,6 +20,3 @@
##############################################################################
from . import base_action_rule_test
-checks = [
- base_action_rule_test,
-]
diff --git a/addons/base_geolocalize/__openerp__.py b/addons/base_geolocalize/__openerp__.py
index ac2ac9b9e81..fe8e7b99e17 100644
--- a/addons/base_geolocalize/__openerp__.py
+++ b/addons/base_geolocalize/__openerp__.py
@@ -38,5 +38,4 @@ Partners geolocalization
'test': [],
'installable': True,
'auto_install': False,
- 'images': [],
}
diff --git a/addons/base_iban/__openerp__.py b/addons/base_iban/__openerp__.py
index acf0081d58c..b7196edbded 100644
--- a/addons/base_iban/__openerp__.py
+++ b/addons/base_iban/__openerp__.py
@@ -35,5 +35,4 @@ with a single statement.
'data': ['base_iban_data.xml' , 'base_iban_view.xml'],
'installable': True,
'auto_install': False,
- 'images': ['images/base_iban1.jpeg'],
}
diff --git a/addons/base_import/tests/__init__.py b/addons/base_import/tests/__init__.py
index abef28c8ca1..54ecbe9baab 100644
--- a/addons/base_import/tests/__init__.py
+++ b/addons/base_import/tests/__init__.py
@@ -1,3 +1 @@
from . import test_cases
-
-checks = [test_cases]
diff --git a/addons/base_setup/__openerp__.py b/addons/base_setup/__openerp__.py
index c8756384054..1276a4eff9c 100644
--- a/addons/base_setup/__openerp__.py
+++ b/addons/base_setup/__openerp__.py
@@ -44,5 +44,4 @@ Shows you a list of applications features to install from.
'demo': [],
'installable': True,
'auto_install': False,
- 'images': ['images/base_setup1.jpeg','images/base_setup2.jpeg','images/base_setup3.jpeg','images/base_setup4.jpeg',],
}
diff --git a/addons/base_setup/res_config.py b/addons/base_setup/res_config.py
index fd075e4330c..7742f19d77e 100644
--- a/addons/base_setup/res_config.py
+++ b/addons/base_setup/res_config.py
@@ -32,7 +32,7 @@ class base_config_settings(osv.osv_memory):
help='Work in multi-company environments, with appropriate security access between companies.\n'
'-This installs the module multi_company.'),
'module_share': fields.boolean('Allow documents sharing',
- help="""Share or embbed any screen of openerp."""),
+ help="""Share or embbed any screen of Odoo."""),
'module_portal': fields.boolean('Activate the customer portal',
help="""Give your customers access to their documents."""),
'module_auth_oauth': fields.boolean('Use external authentication providers, sign in with google, facebook, ...'),
diff --git a/addons/base_vat/__openerp__.py b/addons/base_vat/__openerp__.py
index 8f9f0c8784d..076eef77638 100644
--- a/addons/base_vat/__openerp__.py
+++ b/addons/base_vat/__openerp__.py
@@ -58,5 +58,4 @@ only the country code will be validated.
'data': ['base_vat_view.xml'],
'installable': True,
'auto_install': False,
- 'images': ['images/1_partner_vat.jpeg'],
}
diff --git a/addons/board/__openerp__.py b/addons/board/__openerp__.py
index f7b7d47a5ff..d6a98f62e76 100644
--- a/addons/board/__openerp__.py
+++ b/addons/board/__openerp__.py
@@ -41,5 +41,4 @@ Allows users to create custom dashboard.
'qweb': ['static/src/xml/*.xml'],
'installable': True,
'auto_install': False,
- 'images': ['images/1_dashboard_definition.jpeg','images/2_publish_note.jpeg','images/3_admin_dashboard.jpeg',],
}
diff --git a/addons/calendar/__openerp__.py b/addons/calendar/__openerp__.py
index 74dab47d99d..16ef09dd103 100644
--- a/addons/calendar/__openerp__.py
+++ b/addons/calendar/__openerp__.py
@@ -55,5 +55,4 @@ If you need to manage your meetings, you should install the CRM module.
'installable': True,
'application': True,
'auto_install': False,
- 'images': ['images/calendar1.jpeg', 'images/calendar2.jpeg', 'images/calendar3.jpeg', 'images/calendar4.jpeg'],
}
diff --git a/addons/calendar/calendar.py b/addons/calendar/calendar.py
index e7c784d3865..6d950e32541 100644
--- a/addons/calendar/calendar.py
+++ b/addons/calendar/calendar.py
@@ -852,10 +852,11 @@ class calendar_event(osv.Model):
if values.get('start_datetime') or values.get('start_date') or values.get('start') \
or values.get('stop_datetime') or values.get('stop_date') or values.get('stop'):
allday = values.get("allday", None)
+ event = self.browse(cr, uid, id, context=context)
if allday is None:
if id:
- allday = self.read(cr, uid, [id], ['allday'], context=context)[0].get('allday')
+ allday = event.allday
else:
allday = False
_logger.debug("Calendar - All day is not specified, arbitrarily set to False")
@@ -872,10 +873,16 @@ class calendar_event(osv.Model):
values[fld] = values['%s_%s' % (fld, key)]
diff = False
- if allday and values.get('stop_date') and values.get('start_date'):
- diff = datetime.strptime(values['stop_date'].split(' ')[0], DEFAULT_SERVER_DATE_FORMAT) - datetime.strptime(values['start_date'].split(' ')[0], DEFAULT_SERVER_DATE_FORMAT)
- elif values.get('stop_datetime') and values.get('start_datetime'):
- diff = datetime.strptime(values['stop_datetime'].split('.')[0], DEFAULT_SERVER_DATETIME_FORMAT) - datetime.strptime(values['start_datetime'].split('.')[0], DEFAULT_SERVER_DATETIME_FORMAT)
+ if allday and (values.get('stop_date') or values.get('start_date')):
+ stop_date = values.get('stop_date') or event.stop_date
+ start_date = values.get('start_date') or event.start_date
+ if stop_date and start_date:
+ diff = datetime.strptime(stop_date.split(' ')[0], DEFAULT_SERVER_DATE_FORMAT) - datetime.strptime(start_date.split(' ')[0], DEFAULT_SERVER_DATE_FORMAT)
+ elif values.get('stop_datetime') or values.get('start_datetime'):
+ stop_datetime = values.get('stop_datetime') or event.stop_datetime
+ start_datetime = values.get('start_datetime') or event.start_datetime
+ if stop_datetime and start_datetime:
+ diff = datetime.strptime(stop_datetime.split('.')[0], DEFAULT_SERVER_DATETIME_FORMAT) - datetime.strptime(start_datetime.split('.')[0], DEFAULT_SERVER_DATETIME_FORMAT)
if diff:
duration = float(diff.days) * 24 + (float(diff.seconds) / 3600)
values['duration'] = round(duration, 2)
@@ -965,12 +972,14 @@ class calendar_event(osv.Model):
def _check_closing_date(self, cr, uid, ids, context=None):
for event in self.browse(cr, uid, ids, context=context):
- if event.stop < event.start:
+ if event.start_datetime and event.stop_datetime < event.start_datetime:
+ return False
+ if event.start_date and event.stop_date < event.start_date:
return False
return True
_constraints = [
- (_check_closing_date, 'Error ! End date cannot be set before start date.', ['start', 'stop'])
+ (_check_closing_date, 'Error ! End date cannot be set before start date.', ['start_datetime', 'stop_datetime', 'start_date', 'stop_date'])
]
def onchange_allday(self, cr, uid, ids, start=False, end=False, starttime=False, endtime=False, startdatetime=False, enddatetime=False, checkallday=False, context=None):
diff --git a/addons/claim_from_delivery/__openerp__.py b/addons/claim_from_delivery/__openerp__.py
index cfbe1e69bc1..270d5479e31 100644
--- a/addons/claim_from_delivery/__openerp__.py
+++ b/addons/claim_from_delivery/__openerp__.py
@@ -35,5 +35,4 @@ Adds a Claim link to the delivery order.
'claim_delivery_data.xml',],
'auto_install': False,
'installable': True,
- 'images': ['images/1_claim_link_delivery_order.jpeg'],
}
diff --git a/addons/contacts/__openerp__.py b/addons/contacts/__openerp__.py
index 2163fba3949..57733aa8661 100644
--- a/addons/contacts/__openerp__.py
+++ b/addons/contacts/__openerp__.py
@@ -36,7 +36,6 @@ You can track your suppliers, customers and other contacts.
'data': [
'contacts_view.xml',
],
- 'images': ['images/contacts.jpeg'],
'installable': True,
'application': True,
'auto_install': True,
diff --git a/addons/crm/__openerp__.py b/addons/crm/__openerp__.py
index 737551cb424..b91c8e18759 100644
--- a/addons/crm/__openerp__.py
+++ b/addons/crm/__openerp__.py
@@ -119,15 +119,4 @@ Dashboard for CRM will include:
'installable': True,
'application': True,
'auto_install': False,
- 'images': [
- 'images/customers.png',
- 'images/leads.png',
- 'images/opportunities_kanban.png',
- 'images/opportunities_form.png',
- 'images/opportunities_calendar.png',
- 'images/opportunities_graph.png',
- 'images/logged_calls.png',
- 'images/scheduled_calls.png',
- 'images/stages.png',
- ],
}
diff --git a/addons/crm/wizard/crm_lead_to_opportunity.py b/addons/crm/wizard/crm_lead_to_opportunity.py
index 49e65151612..ac06e41b1c4 100644
--- a/addons/crm/wizard/crm_lead_to_opportunity.py
+++ b/addons/crm/wizard/crm_lead_to_opportunity.py
@@ -113,10 +113,11 @@ class crm_lead2opportunity_partner(osv.osv_memory):
res = False
lead_ids = vals.get('lead_ids', [])
team_id = vals.get('team_id', False)
+ partner_id = vals.get('partner_id')
data = self.browse(cr, uid, ids, context=context)[0]
leads = lead.browse(cr, uid, lead_ids, context=context)
for lead_id in leads:
- partner_id = self._create_partner(cr, uid, lead_id.id, data.action, lead_id.partner_id.id, context=context)
+ partner_id = self._create_partner(cr, uid, lead_id.id, data.action, partner_id or lead_id.partner_id.id, context=context)
res = lead.convert_opportunity(cr, uid, [lead_id.id], partner_id, [], False, context=context)
user_ids = vals.get('user_ids', False)
if context.get('no_force_assignation'):
@@ -139,18 +140,26 @@ class crm_lead2opportunity_partner(osv.osv_memory):
w = self.browse(cr, uid, ids, context=context)[0]
opp_ids = [o.id for o in w.opportunity_ids]
+ vals = {
+ 'team_id': w.team_id.id,
+ }
+ if w.partner_id:
+ vals['partner_id'] = w.partner_id.id
if w.name == 'merge':
lead_id = lead_obj.merge_opportunity(cr, uid, opp_ids, context=context)
lead_ids = [lead_id]
lead = lead_obj.read(cr, uid, lead_id, ['type', 'user_id'], context=context)
if lead['type'] == "lead":
context = dict(context, active_ids=lead_ids)
- self._convert_opportunity(cr, uid, ids, {'lead_ids': lead_ids, 'user_ids': [w.user_id.id], 'team_id': w.team_id.id}, context=context)
+ vals.update({'lead_ids': lead_ids, 'user_ids': [w.user_id.id]})
+ self._convert_opportunity(cr, uid, ids, vals, context=context)
elif not context.get('no_force_assignation') or not lead['user_id']:
- lead_obj.write(cr, uid, lead_id, {'user_id': w.user_id.id, 'team_id': w.team_id.id}, context=context)
+ vals.update({'user_id': w.user_id.id})
+ lead_obj.write(cr, uid, lead_id, vals, context=context)
else:
lead_ids = context.get('active_ids', [])
- self._convert_opportunity(cr, uid, ids, {'lead_ids': lead_ids, 'user_ids': [w.user_id.id], 'team_id': w.team_id.id}, context=context)
+ vals.update({'lead_ids': lead_ids, 'user_ids': [w.user_id.id]})
+ self._convert_opportunity(cr, uid, ids, vals, context=context)
return self.pool.get('crm.lead').redirect_opportunity_view(cr, uid, lead_ids[0], context=context)
diff --git a/addons/crm_claim/__openerp__.py b/addons/crm_claim/__openerp__.py
index 79f8470423b..d88f8756320 100644
--- a/addons/crm_claim/__openerp__.py
+++ b/addons/crm_claim/__openerp__.py
@@ -51,9 +51,4 @@ automatically new claims based on incoming emails.
],
'installable': True,
'auto_install': False,
- 'images': [
- 'images/claim_categories.jpeg',
- 'images/claim_stages.jpeg',
- 'images/claims.jpeg'
- ],
}
diff --git a/addons/crm_helpdesk/__openerp__.py b/addons/crm_helpdesk/__openerp__.py
index be2ee411f2a..1f0605a36ae 100644
--- a/addons/crm_helpdesk/__openerp__.py
+++ b/addons/crm_helpdesk/__openerp__.py
@@ -47,5 +47,4 @@ and categorize your interventions with a channel and a priority level.
'test': ['test/process/help-desk.yml'],
'installable': True,
'auto_install': False,
- 'images': ['images/helpdesk_analysis.jpeg','images/helpdesk_categories.jpeg','images/helpdesk_requests.jpeg'],
}
diff --git a/addons/crm_helpdesk/crm_helpdesk_view.xml b/addons/crm_helpdesk/crm_helpdesk_view.xml
index a15c4f8ade8..e9d223e932b 100644
--- a/addons/crm_helpdesk/crm_helpdesk_view.xml
+++ b/addons/crm_helpdesk/crm_helpdesk_view.xml
@@ -105,8 +105,8 @@
-
+
diff --git a/addons/crm_partner_assign/__openerp__.py b/addons/crm_partner_assign/__openerp__.py
index 376107ec76f..97d28164184 100644
--- a/addons/crm_partner_assign/__openerp__.py
+++ b/addons/crm_partner_assign/__openerp__.py
@@ -54,5 +54,4 @@ to an appropriate local partner, based on the distance and the weight that was a
'test': ['test/partner_assign.yml'],
'installable': True,
'auto_install': False,
- 'images': ['images/partner_geo_localization.jpeg','images/partner_grade.jpeg'],
}
diff --git a/addons/decimal_precision/__openerp__.py b/addons/decimal_precision/__openerp__.py
index 817576347c6..851684064ed 100644
--- a/addons/decimal_precision/__openerp__.py
+++ b/addons/decimal_precision/__openerp__.py
@@ -37,5 +37,4 @@ The decimal precision is configured per company.
],
'demo': [],
'installable': True,
- 'images': ['images/1_decimal_accuracy_form.jpeg','images/1_decimal_accuracy_list.jpeg'],
}
diff --git a/addons/decimal_precision/tests/__init__.py b/addons/decimal_precision/tests/__init__.py
index feee24c8f15..b9343853f75 100644
--- a/addons/decimal_precision/tests/__init__.py
+++ b/addons/decimal_precision/tests/__init__.py
@@ -1,6 +1,2 @@
# -*- coding: utf-8 -*-
-import test_qweb_float
-
-checks = [
- test_qweb_float
-]
+from . import test_qweb_float
diff --git a/addons/delivery/__openerp__.py b/addons/delivery/__openerp__.py
index 710a2193608..1d1c59652c4 100644
--- a/addons/delivery/__openerp__.py
+++ b/addons/delivery/__openerp__.py
@@ -44,5 +44,4 @@ invoices from picking, OpenERP is able to add and compute the shipping line.
'test': ['test/delivery_cost.yml'],
'installable': True,
'auto_install': False,
- 'images': ['images/1_delivery_method.jpeg','images/2_delivery_pricelist.jpeg'],
}
diff --git a/addons/delivery/stock.py b/addons/delivery/stock.py
index 2ccb1c41915..3f28e553a29 100644
--- a/addons/delivery/stock.py
+++ b/addons/delivery/stock.py
@@ -54,7 +54,7 @@ class stock_picking(osv.osv):
_columns = {
'carrier_id':fields.many2one("delivery.carrier","Carrier"),
- 'volume': fields.float('Volume'),
+ 'volume': fields.float('Volume', copy=False),
'weight': fields.function(_cal_weight, type='float', string='Weight', digits_compute= dp.get_precision('Stock Weight'), multi='_cal_weight',
store={
'stock.picking': (lambda self, cr, uid, ids, c={}: ids, ['move_lines'], 40),
@@ -65,8 +65,8 @@ class stock_picking(osv.osv):
'stock.picking': (lambda self, cr, uid, ids, c={}: ids, ['move_lines'], 40),
'stock.move': (_get_picking_line, ['picking_id', 'product_id','product_uom_qty','product_uom'], 40),
}),
- 'carrier_tracking_ref': fields.char('Carrier Tracking Ref'),
- 'number_of_packages': fields.integer('Number of Packages'),
+ 'carrier_tracking_ref': fields.char('Carrier Tracking Ref', copy=False),
+ 'number_of_packages': fields.integer('Number of Packages', copy=False),
'weight_uom_id': fields.many2one('product.uom', 'Unit of Measure', required=True,readonly="1",help="Unit of measurement for Weight",),
}
diff --git a/addons/document/__openerp__.py b/addons/document/__openerp__.py
index 25c82d3c84c..7a413f2423e 100644
--- a/addons/document/__openerp__.py
+++ b/addons/document/__openerp__.py
@@ -51,5 +51,4 @@ This is a complete document management system.
'test': ['test/document_test2.yml'],
'installable': True,
'auto_install': False,
- 'images': ['images/1_directories.jpeg','images/2_storage_media.jpeg','images/3_directories_structure.jpeg'],
}
diff --git a/addons/event/__openerp__.py b/addons/event/__openerp__.py
index 029933c1755..7ac32912056 100644
--- a/addons/event/__openerp__.py
+++ b/addons/event/__openerp__.py
@@ -37,5 +37,4 @@ Key Features
],
'installable': True,
'auto_install': False,
- 'images': ['images/1_event_type_list.jpeg', 'images/2_events.jpeg', 'images/3_registrations.jpeg', 'images/events_kanban.jpeg'],
}
diff --git a/addons/fetchmail/__openerp__.py b/addons/fetchmail/__openerp__.py
index be6a6a09a38..1c6ee8bf762 100644
--- a/addons/fetchmail/__openerp__.py
+++ b/addons/fetchmail/__openerp__.py
@@ -64,5 +64,4 @@ For more specific needs, you may also assign custom-defined actions
'demo': [],
'installable': True,
'auto_install': True,
- 'images': ['images/1_email_servers.jpeg'],
}
diff --git a/addons/fleet/__openerp__.py b/addons/fleet/__openerp__.py
index e2cc6595d46..dbe93618ee1 100644
--- a/addons/fleet/__openerp__.py
+++ b/addons/fleet/__openerp__.py
@@ -29,7 +29,7 @@
'description' : """
Vehicle, leasing, insurances, cost
==================================
-With this module, OpenERP helps you managing all your vehicles, the
+With this module, Odoo helps you managing all your vehicles, the
contracts associated to those vehicle as well as services, fuel log
entries, costs and many other features necessary to the management
of your fleet of vehicle(s)
@@ -56,7 +56,6 @@ Main Features
'fleet_data.xml',
'fleet_board_view.xml',
],
- 'images': ['images/costs_analysis.jpeg','images/indicative_costs_analysis.jpeg','images/vehicles.jpeg','images/vehicles_contracts.jpeg','images/vehicles_fuel.jpeg','images/vehicles_odometer.jpeg','images/vehicles_services.jpeg'],
'demo': ['fleet_demo.xml'],
diff --git a/addons/fleet/fleet_view.xml b/addons/fleet/fleet_view.xml
index ed22f2f922d..e1d66457e88 100644
--- a/addons/fleet/fleet_view.xml
+++ b/addons/fleet/fleet_view.xml
@@ -285,8 +285,8 @@
-
+
diff --git a/addons/gamification/tests/__init__.py b/addons/gamification/tests/__init__.py
index 9cafd242b28..49ae47e17c2 100644
--- a/addons/gamification/tests/__init__.py
+++ b/addons/gamification/tests/__init__.py
@@ -20,7 +20,3 @@
##############################################################################
from . import test_challenge
-
-checks = [
- test_challenge,
-]
diff --git a/addons/hr/__openerp__.py b/addons/hr/__openerp__.py
index 8239cfa4ebd..ba9cb8798e0 100644
--- a/addons/hr/__openerp__.py
+++ b/addons/hr/__openerp__.py
@@ -42,12 +42,6 @@ You can manage:
""",
'author': 'OpenERP SA',
'website': 'https://www.odoo.com/page/employees',
- 'images': [
- 'images/hr_department.jpeg',
- 'images/hr_employee.jpeg',
- 'images/hr_job_position.jpeg',
- 'static/src/img/default_image.png',
- ],
'depends': ['base_setup','mail', 'resource', 'board'],
'data': [
'security/hr_security.xml',
diff --git a/addons/hr_attendance/__openerp__.py b/addons/hr_attendance/__openerp__.py
index 146ca202a83..1574129fc81 100644
--- a/addons/hr_attendance/__openerp__.py
+++ b/addons/hr_attendance/__openerp__.py
@@ -33,7 +33,6 @@ actions(Sign in/Sign out) performed by them.
""",
'author': 'OpenERP SA',
'website': 'https://www.odoo.com/page/employees',
- 'images': ['images/hr_attendances.jpeg'],
'depends': ['hr', 'report'],
'data': [
'security/ir_rule.xml',
diff --git a/addons/hr_contract/__openerp__.py b/addons/hr_contract/__openerp__.py
index 7aaeaa7014f..90c650d101e 100644
--- a/addons/hr_contract/__openerp__.py
+++ b/addons/hr_contract/__openerp__.py
@@ -37,7 +37,6 @@ You can assign several contracts per employee.
""",
'author': 'OpenERP SA',
'website': 'https://www.odoo.com/page/employees',
- 'images': ['images/hr_contract.jpeg'],
'depends': ['base_action_rule', 'hr'],
'data': [
'security/ir.model.access.csv',
diff --git a/addons/hr_evaluation/__openerp__.py b/addons/hr_evaluation/__openerp__.py
index b00b37c4d51..7b0a458a8b2 100644
--- a/addons/hr_evaluation/__openerp__.py
+++ b/addons/hr_evaluation/__openerp__.py
@@ -27,9 +27,6 @@
'sequence': 31,
'website': 'https://www.odoo.com/page/appraisal',
'summary': 'Periodical Evaluations, Appraisals, Surveys',
- 'images': ['images/hr_evaluation_analysis.jpeg',
- 'images/hr_evaluation.jpeg',
- 'images/hr_interview_requests.jpeg'],
'depends': ['hr', 'calendar', 'survey'],
'description': """
Periodical Employees evaluation and appraisals
diff --git a/addons/hr_expense/__openerp__.py b/addons/hr_expense/__openerp__.py
index 77a1974abfe..05a75c83e85 100644
--- a/addons/hr_expense/__openerp__.py
+++ b/addons/hr_expense/__openerp__.py
@@ -45,7 +45,6 @@ This module also uses analytic accounting and is compatible with the invoice on
""",
'author': 'OpenERP SA',
'website': 'https://www.odoo.com/page/expenses',
- 'images': ['images/hr_expenses_analysis.jpeg', 'images/hr_expenses.jpeg'],
'depends': ['hr', 'account_accountant', 'report'],
'data': [
'security/ir.model.access.csv',
diff --git a/addons/hr_holidays/__openerp__.py b/addons/hr_holidays/__openerp__.py
index 07ba46b13b5..4f1b2e2265d 100644
--- a/addons/hr_holidays/__openerp__.py
+++ b/addons/hr_holidays/__openerp__.py
@@ -44,7 +44,6 @@ You can keep track of leaves in different ways by following reports:
A synchronization with an internal agenda (Meetings of the CRM module) is also possible in order to automatically create a meeting when a holiday request is accepted by setting up a type of meeting in Leave Type.
""",
- 'images': ['images/hr_allocation_requests.jpeg', 'images/hr_leave_requests.jpeg', 'images/leaves_analysis.jpeg'],
'depends': ['hr', 'calendar', 'resource'],
'data': [
'security/ir.model.access.csv',
diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py
index b8ec3793d71..a7f7d72b6c8 100644
--- a/addons/hr_holidays/hr_holidays.py
+++ b/addons/hr_holidays/hr_holidays.py
@@ -53,14 +53,14 @@ class hr_holidays_status(osv.osv):
# note: add only validated allocation even for the virtual
# count; otherwise pending then refused allocation allow
# the employee to create more leaves than possible
- status_dict['virtual_remaining_leaves'] += holiday.number_of_days
- status_dict['max_leaves'] += holiday.number_of_days
- status_dict['remaining_leaves'] += holiday.number_of_days
+ status_dict['virtual_remaining_leaves'] += holiday.number_of_days_temp
+ status_dict['max_leaves'] += holiday.number_of_days_temp
+ status_dict['remaining_leaves'] += holiday.number_of_days_temp
elif holiday.type == 'remove': # number of days is negative
- status_dict['virtual_remaining_leaves'] += holiday.number_of_days
+ status_dict['virtual_remaining_leaves'] -= holiday.number_of_days_temp
if holiday.state == 'validate':
- status_dict['leaves_taken'] -= holiday.number_of_days
- status_dict['remaining_leaves'] += holiday.number_of_days
+ status_dict['leaves_taken'] += holiday.number_of_days_temp
+ status_dict['remaining_leaves'] -= holiday.number_of_days_temp
return result
def _user_left_days(self, cr, uid, ids, name, args, context=None):
diff --git a/addons/hr_holidays/tests/__init__.py b/addons/hr_holidays/tests/__init__.py
index 08642bb5645..2d8d5ee4cdf 100644
--- a/addons/hr_holidays/tests/__init__.py
+++ b/addons/hr_holidays/tests/__init__.py
@@ -19,8 +19,5 @@
#
##############################################################################
-from openerp.addons.hr_holidays.tests import test_holidays_flow
+from . import test_holidays_flow
-checks = [
- test_holidays_flow,
-]
diff --git a/addons/hr_payroll/__openerp__.py b/addons/hr_payroll/__openerp__.py
index f444cbb5731..f5d0a7c37ae 100644
--- a/addons/hr_payroll/__openerp__.py
+++ b/addons/hr_payroll/__openerp__.py
@@ -40,12 +40,6 @@ Generic Payroll system.
""",
'author': 'OpenERP SA',
'website': 'https://www.odoo.com/page/employees',
- 'images': [
- 'images/hr_company_contributions.jpeg',
- 'images/hr_salary_heads.jpeg',
- 'images/hr_salary_structure.jpeg',
- 'images/hr_employee_payslip.jpeg'
- ],
'depends': [
'hr',
'hr_contract',
diff --git a/addons/hr_payroll_account/__openerp__.py b/addons/hr_payroll_account/__openerp__.py
index dedc9f260dd..1bd591c8706 100644
--- a/addons/hr_payroll_account/__openerp__.py
+++ b/addons/hr_payroll_account/__openerp__.py
@@ -32,7 +32,6 @@ Generic Payroll system Integrated with Accounting.
* Company Contribution Management
""",
'author':'OpenERP SA',
- 'images': ['images/hr_employee_payslip.jpeg'],
'website': 'https://www.odoo.com/page/employees',
'depends': [
'hr_payroll',
diff --git a/addons/hr_recruitment/__openerp__.py b/addons/hr_recruitment/__openerp__.py
index 20745f84c01..3ab147ddf2f 100644
--- a/addons/hr_recruitment/__openerp__.py
+++ b/addons/hr_recruitment/__openerp__.py
@@ -37,8 +37,6 @@ You can define the different phases of interviews and easily rate the applicant
""",
'author': 'OpenERP SA',
'website': 'https://www.odoo.com/page/recruitment',
- 'images': ['images/hr_recruitment_analysis.jpeg',
- 'images/hr_recruitment_applicants.jpeg'],
'depends': [
'decimal_precision',
'hr',
diff --git a/addons/hr_timesheet/__openerp__.py b/addons/hr_timesheet/__openerp__.py
index 7a0e9a66139..bb554756d09 100644
--- a/addons/hr_timesheet/__openerp__.py
+++ b/addons/hr_timesheet/__openerp__.py
@@ -40,7 +40,6 @@ up a management by affair.
""",
'author': 'OpenERP SA',
'website': 'https://www.odoo.com/page/employees',
- 'images': ['images/hr_timesheet_lines.jpeg'],
'depends': ['account', 'hr', 'base', 'hr_attendance'],
'data': [
'security/ir.model.access.csv',
diff --git a/addons/hr_timesheet_invoice/__openerp__.py b/addons/hr_timesheet_invoice/__openerp__.py
index 8fceff84d08..1eb003b1e4f 100644
--- a/addons/hr_timesheet_invoice/__openerp__.py
+++ b/addons/hr_timesheet_invoice/__openerp__.py
@@ -34,7 +34,6 @@ You can define price lists in analytic account, make some theoretical revenue
reports.""",
'author': 'OpenERP SA',
'website': 'https://www.odoo.com/page/employees',
- 'images': ['images/hr_bill_task_work.jpeg','images/hr_type_of_invoicing.jpeg'],
'depends': ['account', 'hr_timesheet', 'report'],
'data': [
'security/ir.model.access.csv',
diff --git a/addons/hr_timesheet_sheet/__openerp__.py b/addons/hr_timesheet_sheet/__openerp__.py
index 287b011719b..4c3f861a399 100644
--- a/addons/hr_timesheet_sheet/__openerp__.py
+++ b/addons/hr_timesheet_sheet/__openerp__.py
@@ -45,7 +45,6 @@ The validation can be configured in the company:
""",
'author': 'OpenERP SA',
'website': 'https://www.odoo.com/page/employees',
- 'images': ['images/hr_my_current_timesheet.jpeg','images/hr_timesheet_analysis.jpeg','images/hr_timesheet_sheet_analysis.jpeg','images/hr_timesheet_activity.jpeg'],
'depends': ['hr_timesheet', 'hr_timesheet_invoice'],
'data': [
'security/ir.model.access.csv',
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
index a10cf4e84a3..7a8b2d1f727 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
@@ -228,7 +228,7 @@ class hr_timesheet_sheet(osv.osv):
def _sheet_date(self, cr, uid, ids, forced_user_id=False, context=None):
for sheet in self.browse(cr, uid, ids, context=context):
- new_user_id = forced_user_id or sheet.user_id and sheet.user_id.id
+ new_user_id = forced_user_id or sheet.employee_id.user_id and sheet.employee_id.user_id.id
if new_user_id:
cr.execute('SELECT id \
FROM hr_timesheet_sheet_sheet \
@@ -591,16 +591,24 @@ class hr_timesheet_sheet_sheet_day(osv.osv):
) union (
select
-min(a.id) as id,
- a.name::date as name,
+ (a.name AT TIME ZONE 'UTC' AT TIME ZONE coalesce(p.tz, 'UTC'))::date as name,
s.id as sheet_id,
0.0 as total_timesheet,
- SUM(((EXTRACT(hour FROM a.name) * 60) + EXTRACT(minute FROM a.name)) * (CASE WHEN a.action = 'sign_in' THEN -1 ELSE 1 END)) as total_attendance
+ SUM(((EXTRACT(hour FROM (a.name AT TIME ZONE 'UTC' AT TIME ZONE coalesce(p.tz, 'UTC'))) * 60) + EXTRACT(minute FROM (a.name AT TIME ZONE 'UTC' AT TIME ZONE coalesce(p.tz, 'UTC')))) * (CASE WHEN a.action = 'sign_in' THEN -1 ELSE 1 END)) as total_attendance
from
hr_attendance a
LEFT JOIN hr_timesheet_sheet_sheet s
ON s.id = a.sheet_id
+ JOIN hr_employee e
+ ON a.employee_id = e.id
+ JOIN resource_resource r
+ ON e.resource_id = r.id
+ LEFT JOIN res_users u
+ ON r.user_id = u.id
+ LEFT JOIN res_partner p
+ ON u.partner_id = p.id
WHERE action in ('sign_in', 'sign_out')
- group by a.name::date, s.id
+ group by (a.name AT TIME ZONE 'UTC' AT TIME ZONE coalesce(p.tz, 'UTC'))::date, s.id
)) AS foo
GROUP BY name, sheet_id
)) AS bar""")
diff --git a/addons/hw_posbox_homepage/controllers/main.py b/addons/hw_posbox_homepage/controllers/main.py
index 6cf639348bf..25e33c409fa 100644
--- a/addons/hw_posbox_homepage/controllers/main.py
+++ b/addons/hw_posbox_homepage/controllers/main.py
@@ -31,8 +31,8 @@ index_template = """
The PosBox is an hardware adapter that allows you to use
receipt printers and barcode scanners with Odoo's Point of
- Sale, version 8.0 or later. You can start an online free trial,
- or download and install it yourself.
+ Sale, version 8.0 or later. You can start an online free trial,
+ or download and install it yourself.
For more information on how to setup the Point of Sale with
diff --git a/addons/hw_proxy/controllers/main.py b/addons/hw_proxy/controllers/main.py
index 56e94d88a6d..64f6cf0765c 100644
--- a/addons/hw_proxy/controllers/main.py
+++ b/addons/hw_proxy/controllers/main.py
@@ -98,7 +98,7 @@ class Proxy(http.Controller):
Copy and paste your printer's device description in the form below. You can find
your printer's description in the device list above. If you find that your printer works
- well, please send your printer's description to
+ well, please send your printer's description to
support@openerp.com so that we can add it to the default list of supported devices.