[MERGE] forward port branch saas-14 up to 14f8ef59b8
This commit is contained in:
@@ -109,7 +109,11 @@ class AccountAnalyticLine(models.Model):
|
|||||||
result.update({'so_line': so_lines[0].id})
|
result.update({'so_line': so_lines[0].id})
|
||||||
else:
|
else:
|
||||||
if order.state != 'sale':
|
if order.state != 'sale':
|
||||||
raise UserError(_('The Sales Order %s linked to the Analytic Account must be validated before registering expenses.') % order.name)
|
message_unconfirmed = _('The Sales Order %s linked to the Analytic Account %s must be validated before registering expenses.')
|
||||||
|
messages = {'draft': message_unconfirmed, 'sent': message_unconfirmed,
|
||||||
|
'done': _('The Sales Order %s linked to the Analytic Account %s is currently locked. You cannot register an expense on a locked Sales Order. Please create a new SO linked to this Analytic Account.'),
|
||||||
|
'cancel': _('The Sales Order %s linked to the Analytic Account %s is cancelled. You cannot register an expense on a cancelled Sales Order.')}
|
||||||
|
raise UserError(messages[order.state] % (order.name, self.account_id.name))
|
||||||
order_line_vals = self._get_sale_order_line_vals(order, price)
|
order_line_vals = self._get_sale_order_line_vals(order, price)
|
||||||
if order_line_vals:
|
if order_line_vals:
|
||||||
so_line = self.env['sale.order.line'].create(order_line_vals)
|
so_line = self.env['sale.order.line'].create(order_line_vals)
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ class AccountAnalyticLine(models.Model):
|
|||||||
emp = self.env['hr.employee'].search([('user_id', '=', user_id)], limit=1)
|
emp = self.env['hr.employee'].search([('user_id', '=', user_id)], limit=1)
|
||||||
account = values.get('account_id') and self.env['account.analytic.account'].browse([values['account_id']]) or self.account_id or emp.account_id
|
account = values.get('account_id') and self.env['account.analytic.account'].browse([values['account_id']]) or self.account_id or emp.account_id
|
||||||
cost = emp and emp.timesheet_cost or 0.0
|
cost = emp and emp.timesheet_cost or 0.0
|
||||||
uom = account.company_id.sudo().project_time_mode_id
|
uom = account.sudo().company_id.project_time_mode_id
|
||||||
# Nominal employee cost = 1 * company project UoM (project_time_mode_id)
|
# Nominal employee cost = 1 * company project UoM (project_time_mode_id)
|
||||||
return {
|
return {
|
||||||
'amount': -unit_amount * cost,
|
'amount': -unit_amount * cost,
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ var History = function History ($editable) {
|
|||||||
|
|
||||||
if (aUndo[pos]) {
|
if (aUndo[pos]) {
|
||||||
pos = Math.min(pos, aUndo.length);
|
pos = Math.min(pos, aUndo.length);
|
||||||
aUndo.splice(Math.max(pos,1), aUndo.length);
|
aUndo.splice(pos, aUndo.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
// => make a snap when the user change editable zone (because: don't make snap for each keydown)
|
// => make a snap when the user change editable zone (because: don't make snap for each keydown)
|
||||||
|
|||||||
@@ -1115,7 +1115,14 @@ $.summernote.pluginEvents.untab = function (event, editor, layoutInfo) {
|
|||||||
$.summernote.pluginEvents.up = function (event, editor, layoutInfo) {
|
$.summernote.pluginEvents.up = function (event, editor, layoutInfo) {
|
||||||
var r = range.create();
|
var r = range.create();
|
||||||
var node = dom.firstChild(r.sc.childNodes[r.so] || r.sc);
|
var node = dom.firstChild(r.sc.childNodes[r.so] || r.sc);
|
||||||
if (!r.isOnCell() || (!dom.isCell(node) && dom.hasContentBefore(node) && (!dom.isBR(dom.hasContentBefore(node)) || !dom.isText(node) || dom.isVisibleText(node) || dom.hasContentBefore(dom.hasContentBefore(node))))) {
|
if (!r.isOnCell()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// check if an ancestor between node and cell has content before
|
||||||
|
var ancestor = dom.ancestor(node, function (ancestorNode) {
|
||||||
|
return dom.hasContentBefore(ancestorNode) || dom.isCell(ancestorNode);
|
||||||
|
});
|
||||||
|
if (!dom.isCell(ancestor) && (!dom.isBR(dom.hasContentBefore(ancestor)) || !dom.isText(node) || dom.isVisibleText(node) || dom.hasContentBefore(dom.hasContentBefore(ancestor)))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
@@ -1132,7 +1139,14 @@ $.summernote.pluginEvents.up = function (event, editor, layoutInfo) {
|
|||||||
$.summernote.pluginEvents.down = function (event, editor, layoutInfo) {
|
$.summernote.pluginEvents.down = function (event, editor, layoutInfo) {
|
||||||
var r = range.create();
|
var r = range.create();
|
||||||
var node = dom.firstChild(r.sc.childNodes[r.so] || r.sc);
|
var node = dom.firstChild(r.sc.childNodes[r.so] || r.sc);
|
||||||
if (!r.isOnCell() || (!dom.isCell(node) && dom.hasContentAfter(node) && (!dom.isBR(dom.hasContentAfter(node)) || !dom.isText(node) || dom.isVisibleText(node) || dom.hasContentAfter(dom.hasContentAfter(node))))) {
|
if (!r.isOnCell()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// check if an ancestor between node and cell has content after
|
||||||
|
var ancestor = dom.ancestor(node, function (ancestorNode) {
|
||||||
|
return dom.hasContentAfter(ancestorNode) || dom.isCell(ancestorNode);
|
||||||
|
});
|
||||||
|
if (!dom.isCell(ancestor) && (!dom.isBR(dom.hasContentAfter(ancestor)) || !dom.isText(node) || dom.isVisibleText(node) || dom.hasContentAfter(dom.hasContentAfter(ancestor)))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|||||||
@@ -926,9 +926,12 @@ class UsersView(models.Model):
|
|||||||
# add reified groups fields
|
# add reified groups fields
|
||||||
for app, kind, gs in self.env['res.groups'].sudo().get_groups_by_application():
|
for app, kind, gs in self.env['res.groups'].sudo().get_groups_by_application():
|
||||||
if kind == 'selection':
|
if kind == 'selection':
|
||||||
|
field_name = name_selection_groups(gs.ids)
|
||||||
|
if allfields and field_name not in allfields:
|
||||||
|
continue
|
||||||
# selection group field
|
# selection group field
|
||||||
tips = ['%s: %s' % (g.name, g.comment) for g in gs if g.comment]
|
tips = ['%s: %s' % (g.name, g.comment) for g in gs if g.comment]
|
||||||
res[name_selection_groups(gs.ids)] = {
|
res[field_name] = {
|
||||||
'type': 'selection',
|
'type': 'selection',
|
||||||
'string': app.name or _('Other'),
|
'string': app.name or _('Other'),
|
||||||
'selection': [(False, '')] + [(g.id, g.name) for g in gs],
|
'selection': [(False, '')] + [(g.id, g.name) for g in gs],
|
||||||
@@ -939,7 +942,10 @@ class UsersView(models.Model):
|
|||||||
else:
|
else:
|
||||||
# boolean group fields
|
# boolean group fields
|
||||||
for g in gs:
|
for g in gs:
|
||||||
res[name_boolean_group(g.id)] = {
|
field_name = name_boolean_group(g.id)
|
||||||
|
if allfields and field_name not in allfields:
|
||||||
|
continue
|
||||||
|
res[field_name] = {
|
||||||
'type': 'boolean',
|
'type': 'boolean',
|
||||||
'string': g.name,
|
'string': g.name,
|
||||||
'help': g.comment,
|
'help': g.comment,
|
||||||
|
|||||||
Reference in New Issue
Block a user