[REM] *: calls to @api.multi
Multi is the default api for methods, it is not necessary to explicitly decorate methods with it, adds clutter and most people use it because they see that the rest of the code uses it. Done with `find . -type f -name '*.py' | xargs sed -i '/@api.multi/d'`
This commit is contained in:
@@ -173,14 +173,12 @@ class AccountAccount(models.Model):
|
||||
_description = "Account"
|
||||
_order = "code"
|
||||
|
||||
@api.multi
|
||||
@api.constrains('internal_type', 'reconcile')
|
||||
def _check_reconcile(self):
|
||||
for account in self:
|
||||
if account.internal_type in ('receivable', 'payable') and account.reconcile == False:
|
||||
raise ValidationError(_('You cannot have a receivable/payable account that is not reconcilable. (account code: %s)') % account.code)
|
||||
|
||||
@api.multi
|
||||
@api.constrains('user_type_id')
|
||||
def _check_user_type_id(self):
|
||||
data_unaffected_earnings = self.env.ref('account.data_unaffected_earnings')
|
||||
@@ -340,7 +338,6 @@ class AccountAccount(models.Model):
|
||||
code_prefix = code_prefix[:-1]
|
||||
self.group_id = group
|
||||
|
||||
@api.multi
|
||||
def name_get(self):
|
||||
result = []
|
||||
for account in self:
|
||||
@@ -348,7 +345,6 @@ class AccountAccount(models.Model):
|
||||
result.append((account.id, name))
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
@api.returns('self', lambda value: value.id)
|
||||
def copy(self, default=None):
|
||||
default = dict(default or {})
|
||||
@@ -421,7 +417,6 @@ class AccountAccount(models.Model):
|
||||
"""
|
||||
self.env.cr.execute(query, [tuple(self.ids)])
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
# Do not allow changing the company_id when account_move_line already exist
|
||||
if vals.get('company_id', False):
|
||||
@@ -442,7 +437,6 @@ class AccountAccount(models.Model):
|
||||
|
||||
return super(AccountAccount, self).write(vals)
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
if self.env['account.move.line'].search([('account_id', 'in', self.ids)], limit=1):
|
||||
raise UserError(_('You cannot perform this action on an account that contains journal items.'))
|
||||
@@ -453,7 +447,6 @@ class AccountAccount(models.Model):
|
||||
raise UserError(_('You cannot remove/deactivate an account which is set on a customer or vendor.'))
|
||||
return super(AccountAccount, self).unlink()
|
||||
|
||||
@api.multi
|
||||
def action_open_reconcile(self):
|
||||
self.ensure_one()
|
||||
# Open reconciliation view for this account
|
||||
@@ -613,13 +606,11 @@ class AccountJournal(models.Model):
|
||||
('code_company_uniq', 'unique (code, name, company_id)', 'The code and name of the journal must be unique per company !'),
|
||||
]
|
||||
|
||||
@api.multi
|
||||
def _compute_alias_domain(self):
|
||||
alias_domain = self.env["ir.config_parameter"].sudo().get_param("mail.catchall.domain")
|
||||
for record in self:
|
||||
record.alias_domain = alias_domain
|
||||
|
||||
@api.multi
|
||||
# do not depend on 'sequence_id.date_range_ids', because
|
||||
# sequence_id._get_current_sequence() may invalidate it!
|
||||
@api.depends('sequence_id.use_date_range', 'sequence_id.number_next_actual')
|
||||
@@ -634,7 +625,6 @@ class AccountJournal(models.Model):
|
||||
else:
|
||||
journal.sequence_number_next = 1
|
||||
|
||||
@api.multi
|
||||
def _inverse_seq_number_next(self):
|
||||
'''Inverse 'sequence_number_next' to edit the current sequence next number.
|
||||
'''
|
||||
@@ -643,7 +633,6 @@ class AccountJournal(models.Model):
|
||||
sequence = journal.sequence_id._get_current_sequence()
|
||||
sequence.sudo().number_next = journal.sequence_number_next
|
||||
|
||||
@api.multi
|
||||
# do not depend on 'refund_sequence_id.date_range_ids', because
|
||||
# refund_sequence_id._get_current_sequence() may invalidate it!
|
||||
@api.depends('refund_sequence_id.use_date_range', 'refund_sequence_id.number_next_actual')
|
||||
@@ -658,7 +647,6 @@ class AccountJournal(models.Model):
|
||||
else:
|
||||
journal.refund_sequence_number_next = 1
|
||||
|
||||
@api.multi
|
||||
def _inverse_refund_seq_number_next(self):
|
||||
'''Inverse 'refund_sequence_number_next' to edit the current sequence next number.
|
||||
'''
|
||||
@@ -697,7 +685,6 @@ class AccountJournal(models.Model):
|
||||
if not self.default_debit_account_id:
|
||||
self.default_debit_account_id = self.default_credit_account_id
|
||||
|
||||
@api.multi
|
||||
def _get_alias_values(self, type, alias_name=None):
|
||||
if not alias_name:
|
||||
alias_name = self.name
|
||||
@@ -709,7 +696,6 @@ class AccountJournal(models.Model):
|
||||
'alias_name': re.sub(r'[^\w]+', '-', alias_name)
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
bank_accounts = self.env['res.partner.bank'].browse()
|
||||
for bank_account in self.mapped('bank_account_id'):
|
||||
@@ -721,7 +707,6 @@ class AccountJournal(models.Model):
|
||||
bank_accounts.unlink()
|
||||
return ret
|
||||
|
||||
@api.multi
|
||||
@api.returns('self', lambda value: value.id)
|
||||
def copy(self, default=None):
|
||||
default = dict(default or {})
|
||||
@@ -743,7 +728,6 @@ class AccountJournal(models.Model):
|
||||
# remove alias_name to avoid useless write on alias
|
||||
del(vals['alias_name'])
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
for journal in self:
|
||||
company = journal.company_id
|
||||
@@ -922,7 +906,6 @@ class AccountJournal(models.Model):
|
||||
'partner_id': self.company_id.partner_id.id,
|
||||
}).id
|
||||
|
||||
@api.multi
|
||||
def name_get(self):
|
||||
res = []
|
||||
for journal in self:
|
||||
@@ -943,13 +926,11 @@ class AccountJournal(models.Model):
|
||||
journal_ids = self._search(expression.AND([domain, args]), limit=limit, access_rights_uid=name_get_uid)
|
||||
return self.browse(journal_ids).name_get()
|
||||
|
||||
@api.multi
|
||||
@api.depends('company_id')
|
||||
def _belong_to_company(self):
|
||||
for journal in self:
|
||||
journal.belong_to_company = (journal.company_id.id == self.env.company.id)
|
||||
|
||||
@api.multi
|
||||
def _search_company_journals(self, operator, value):
|
||||
if value:
|
||||
recs = self.search([('company_id', operator, self.env.company.id)])
|
||||
@@ -959,7 +940,6 @@ class AccountJournal(models.Model):
|
||||
recs = self.search([('company_id', operator, self.env.company.id)])
|
||||
return [('id', 'in', [x.id for x in recs])]
|
||||
|
||||
@api.multi
|
||||
@api.depends('inbound_payment_method_ids', 'outbound_payment_method_ids')
|
||||
def _methods_compute(self):
|
||||
for journal in self:
|
||||
@@ -1119,7 +1099,6 @@ class AccountTax(models.Model):
|
||||
if not all(child.type_tax_use in ('none', tax.type_tax_use) for child in tax.children_tax_ids):
|
||||
raise ValidationError(_('The application scope of taxes in a group must be either the same as the group or left empty.'))
|
||||
|
||||
@api.multi
|
||||
@api.returns('self', lambda value: value.id)
|
||||
def copy(self, default=None):
|
||||
default = dict(default or {}, name=_("%s (Copy)") % self.name)
|
||||
@@ -1212,7 +1191,6 @@ class AccountTax(models.Model):
|
||||
if self.amount_type == 'division' and price_include:
|
||||
return base_amount - (base_amount * (self.amount / 100))
|
||||
|
||||
@api.multi
|
||||
def json_friendly_compute_all(self, price_unit, currency_id=None, quantity=1.0, product_id=None, partner_id=None, is_refund=False):
|
||||
""" Just converts parameters in browse records and calls for compute_all, because js widgets can't serialize browse records """
|
||||
if currency_id:
|
||||
@@ -1240,7 +1218,6 @@ class AccountTax(models.Model):
|
||||
rep_lines = self.mapped(is_refund and 'refund_repartition_line_ids' or 'invoice_repartition_line_ids')
|
||||
return rep_lines.filtered(lambda x: x.repartition_type == repartition_type).mapped('tag_ids')
|
||||
|
||||
@api.multi
|
||||
def compute_all(self, price_unit, currency=None, quantity=1.0, product=None, partner=None, is_refund=False, handle_price_include=True):
|
||||
""" Returns all information required to apply taxes (in self + their children in case of a tax group).
|
||||
We consider the sequence of the parent for group of taxes.
|
||||
|
||||
@@ -38,7 +38,6 @@ class AccountBankStmtCashWizard(models.Model):
|
||||
|
||||
cashbox_lines_ids = fields.One2many('account.cashbox.line', 'cashbox_id', string='Cashbox Lines')
|
||||
|
||||
@api.multi
|
||||
def validate(self):
|
||||
bnk_stmt_id = self.env.context.get('bank_statement_id', False) or self.env.context.get('active_id', False)
|
||||
bnk_stmt = self.env['account.bank.statement'].browse(bnk_stmt_id)
|
||||
@@ -61,7 +60,6 @@ class AccountBankStmtCloseCheck(models.TransientModel):
|
||||
_name = 'account.bank.statement.closebalance'
|
||||
_description = 'Bank Statement Closing Balance'
|
||||
|
||||
@api.multi
|
||||
def validate(self):
|
||||
bnk_stmt_id = self.env.context.get('active_id', False)
|
||||
if bnk_stmt_id:
|
||||
@@ -78,7 +76,6 @@ class AccountBankStatement(models.Model):
|
||||
statement.balance_end = statement.balance_start + statement.total_entry_encoding
|
||||
statement.difference = statement.balance_end_real - statement.balance_end
|
||||
|
||||
@api.multi
|
||||
def _is_difference_zero(self):
|
||||
for bank_stmt in self:
|
||||
bank_stmt.is_difference_zero = float_is_zero(bank_stmt.difference, precision_digits=bank_stmt.currency_id.decimal_places)
|
||||
@@ -112,14 +109,12 @@ class AccountBankStatement(models.Model):
|
||||
return journals[0]
|
||||
return self.env['account.journal']
|
||||
|
||||
@api.multi
|
||||
def _get_opening_balance(self, journal_id):
|
||||
last_bnk_stmt = self.search([('journal_id', '=', journal_id)], limit=1)
|
||||
if last_bnk_stmt:
|
||||
return last_bnk_stmt.balance_end
|
||||
return 0
|
||||
|
||||
@api.multi
|
||||
def _set_opening_balance(self, journal_id):
|
||||
self.balance_start = self._get_opening_balance(journal_id)
|
||||
|
||||
@@ -169,7 +164,6 @@ class AccountBankStatement(models.Model):
|
||||
def onchange_journal_id(self):
|
||||
self._set_opening_balance(self.journal_id.id)
|
||||
|
||||
@api.multi
|
||||
def _balance_check(self):
|
||||
for stmt in self:
|
||||
if not stmt.currency_id.is_zero(stmt.difference):
|
||||
@@ -198,7 +192,6 @@ class AccountBankStatement(models.Model):
|
||||
% (balance_end_real, balance_end))
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
for statement in self:
|
||||
if statement.state != 'open':
|
||||
@@ -207,7 +200,6 @@ class AccountBankStatement(models.Model):
|
||||
statement.line_ids.unlink()
|
||||
return super(AccountBankStatement, self).unlink()
|
||||
|
||||
@api.multi
|
||||
def open_cashbox_id(self):
|
||||
context = dict(self.env.context or {})
|
||||
if context.get('cashbox_id'):
|
||||
@@ -223,7 +215,6 @@ class AccountBankStatement(models.Model):
|
||||
'target': 'new'
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def check_confirm_bank(self):
|
||||
if self.journal_type == 'cash' and not self.currency_id.is_zero(self.difference):
|
||||
action_rec = self.env['ir.model.data'].xmlid_to_object('account.action_view_account_bnk_stmt_check')
|
||||
@@ -232,7 +223,6 @@ class AccountBankStatement(models.Model):
|
||||
return action
|
||||
return self.button_confirm_bank()
|
||||
|
||||
@api.multi
|
||||
def button_confirm_bank(self):
|
||||
self._balance_check()
|
||||
statements = self.filtered(lambda r: r.state == 'open')
|
||||
@@ -255,7 +245,6 @@ class AccountBankStatement(models.Model):
|
||||
statement.message_post(body=_('Statement %s confirmed, journal items were created.') % (statement.name,))
|
||||
statements.write({'state': 'confirm', 'date_done': time.strftime("%Y-%m-%d %H:%M:%S")})
|
||||
|
||||
@api.multi
|
||||
def button_journal_entries(self):
|
||||
context = dict(self._context or {})
|
||||
context['journal_id'] = self.journal_id.id
|
||||
@@ -269,7 +258,6 @@ class AccountBankStatement(models.Model):
|
||||
'context': context,
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def button_open(self):
|
||||
""" Changes statement state to Running."""
|
||||
for statement in self:
|
||||
@@ -283,7 +271,6 @@ class AccountBankStatement(models.Model):
|
||||
statement.name = st_number
|
||||
statement.state = 'open'
|
||||
|
||||
@api.multi
|
||||
def action_bank_reconcile_bank_statements(self):
|
||||
self.ensure_one()
|
||||
bank_stmt_lines = self.mapped('line_ids')
|
||||
@@ -365,14 +352,12 @@ class AccountBankStatementLine(models.Model):
|
||||
line.amount = line.amount
|
||||
return line
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
for line in self:
|
||||
if line.journal_entry_ids.ids:
|
||||
raise UserError(_('In order to delete a bank statement line, you must first cancel it to delete related journal items.'))
|
||||
return super(AccountBankStatementLine, self).unlink()
|
||||
|
||||
@api.multi
|
||||
def button_cancel_reconciliation(self):
|
||||
aml_to_unbind = self.env['account.move.line']
|
||||
aml_to_cancel = self.env['account.move.line']
|
||||
@@ -500,7 +485,6 @@ class AccountBankStatementLine(models.Model):
|
||||
aml_dict['move_id'] = move.id
|
||||
return aml_dict
|
||||
|
||||
@api.multi
|
||||
def fast_counterpart_creation(self):
|
||||
"""This function is called when confirming a bank statement and will allow to automatically process lines without
|
||||
going in the bank reconciliation widget. By setting an account_id on bank statement lines, it will create a journal
|
||||
@@ -766,7 +750,6 @@ class AccountBankStatementLine(models.Model):
|
||||
counterpart_moves._check_balanced()
|
||||
return counterpart_moves
|
||||
|
||||
@api.multi
|
||||
def _prepare_move_line_for_currency(self, aml_dict, date):
|
||||
self.ensure_one()
|
||||
company_currency = self.journal_id.company_id.currency_id
|
||||
|
||||
@@ -25,7 +25,6 @@ class AccountCashRounding(models.Model):
|
||||
selection=[('UP', 'UP'), ('DOWN', 'DOWN'), ('HALF-UP', 'HALF-UP')],
|
||||
default='HALF-UP', help='The tie-breaking rule used for float rounding operations')
|
||||
|
||||
@api.multi
|
||||
def round(self, amount):
|
||||
"""Compute the rounding on the amount passed as parameter.
|
||||
|
||||
@@ -34,7 +33,6 @@ class AccountCashRounding(models.Model):
|
||||
"""
|
||||
return float_round(amount, precision_rounding=self.rounding, rounding_method=self.rounding_method)
|
||||
|
||||
@api.multi
|
||||
def compute_difference(self, currency, amount):
|
||||
"""Compute the difference between the base_amount and the amount after rounding.
|
||||
For example, base_amount=23.91, after rounding=24.00, the result will be 0.09.
|
||||
|
||||
@@ -73,7 +73,6 @@ class account_journal(models.Model):
|
||||
return ['', _('Bank: Balance')]
|
||||
|
||||
# Below method is used to get data of bank and cash statemens
|
||||
@api.multi
|
||||
def get_line_graph_datas(self):
|
||||
"""Computes the data used to display the graph for bank and cash journals in the accounting dashboard"""
|
||||
|
||||
@@ -133,7 +132,6 @@ class account_journal(models.Model):
|
||||
|
||||
return [{'values': data, 'title': graph_title, 'key': graph_key, 'area': True, 'color': color, 'is_sample_data': is_sample_data}]
|
||||
|
||||
@api.multi
|
||||
def get_bar_graph_datas(self):
|
||||
data = []
|
||||
today = fields.Datetime.now(self)
|
||||
@@ -205,7 +203,6 @@ class account_journal(models.Model):
|
||||
AND move.type IN ('out_invoice', 'out_refund', 'in_invoice', 'in_refund', 'out_receipt', 'in_receipt')
|
||||
''', {'journal_id': self.id})
|
||||
|
||||
@api.multi
|
||||
def get_journal_dashboard_datas(self):
|
||||
currency = self.currency_id or self.company_id.currency_id
|
||||
number_to_reconcile = number_to_check = last_balance = account_sum = 0
|
||||
@@ -368,7 +365,6 @@ class account_journal(models.Model):
|
||||
rslt_sum += target_currency.round(amount)
|
||||
return (rslt_count, rslt_sum)
|
||||
|
||||
@api.multi
|
||||
def action_create_new(self):
|
||||
ctx = self._context.copy()
|
||||
ctx['default_journal_id'] = self.id
|
||||
@@ -388,7 +384,6 @@ class account_journal(models.Model):
|
||||
'context': ctx,
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def create_cash_statement(self):
|
||||
ctx = self._context.copy()
|
||||
ctx.update({'journal_id': self.id, 'default_journal_id': self.id, 'default_journal_type': 'cash'})
|
||||
@@ -400,7 +395,6 @@ class account_journal(models.Model):
|
||||
'context': ctx,
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def action_open_reconcile(self):
|
||||
if self.type in ['bank', 'cash']:
|
||||
# Open reconciliation view for bank statements belonging to this journal
|
||||
@@ -423,7 +417,6 @@ class account_journal(models.Model):
|
||||
'context': action_context,
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def action_open_to_check(self):
|
||||
self.ensure_one()
|
||||
ids = self.to_check_ids().ids
|
||||
@@ -443,7 +436,6 @@ class account_journal(models.Model):
|
||||
statement_line_ids = self.env['account.move.line'].search(domain).mapped('statement_line_id')
|
||||
return statement_line_ids
|
||||
|
||||
@api.multi
|
||||
def open_action(self):
|
||||
"""return action based on type for related journals"""
|
||||
action_name = self._context.get('action_name')
|
||||
@@ -484,19 +476,15 @@ class account_journal(models.Model):
|
||||
|
||||
return action
|
||||
|
||||
@api.multi
|
||||
def open_spend_money(self):
|
||||
return self.open_payments_action('outbound')
|
||||
|
||||
@api.multi
|
||||
def open_collect_money(self):
|
||||
return self.open_payments_action('inbound')
|
||||
|
||||
@api.multi
|
||||
def open_transfer_money(self):
|
||||
return self.open_payments_action('transfer')
|
||||
|
||||
@api.multi
|
||||
def open_payments_action(self, payment_type, mode='tree'):
|
||||
if payment_type == 'outbound':
|
||||
action_ref = 'account.action_account_payments_payable'
|
||||
@@ -510,7 +498,6 @@ class account_journal(models.Model):
|
||||
action['views'] = [[False, 'form']]
|
||||
return action
|
||||
|
||||
@api.multi
|
||||
def open_action_with_context(self):
|
||||
action_name = self.env.context.get('action_name', False)
|
||||
if not action_name:
|
||||
@@ -528,7 +515,6 @@ class account_journal(models.Model):
|
||||
action['name'] += ' for journal ' + self.name
|
||||
return action
|
||||
|
||||
@api.multi
|
||||
def create_bank_statement(self):
|
||||
"""return action to create a bank statements. This button should be called only on journals with type =='bank'"""
|
||||
action = self.env.ref('account.action_bank_statement_tree').read()[0]
|
||||
@@ -538,17 +524,14 @@ class account_journal(models.Model):
|
||||
})
|
||||
return action
|
||||
|
||||
@api.multi
|
||||
def create_customer_payment(self):
|
||||
"""return action to create a customer payment"""
|
||||
return self.open_payments_action('inbound', mode='form')
|
||||
|
||||
@api.multi
|
||||
def create_supplier_payment(self):
|
||||
"""return action to create a supplier payment"""
|
||||
return self.open_payments_action('outbound', mode='form')
|
||||
|
||||
@api.multi
|
||||
def create_internal_transfer(self):
|
||||
"""return action to create a internal transfer"""
|
||||
return self.open_payments_action('transfer', mode='form')
|
||||
|
||||
@@ -409,7 +409,6 @@ class AccountMove(models.Model):
|
||||
'tag_ids': [(6, 0, tax_vals['tag_ids'])],
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def _recompute_tax_lines(self):
|
||||
''' Compute the dynamic tax lines of the journal entry.
|
||||
|
||||
@@ -554,7 +553,6 @@ class AccountMove(models.Model):
|
||||
tax_line._onchange_amount_currency()
|
||||
tax_line._onchange_balance()
|
||||
|
||||
@api.multi
|
||||
def _recompute_cash_rounding_lines(self):
|
||||
''' Handle the cash rounding feature on invoices.
|
||||
|
||||
@@ -676,7 +674,6 @@ class AccountMove(models.Model):
|
||||
|
||||
_apply_cash_rounding(self, diff_balance, diff_amount_currency, existing_cash_rounding_line)
|
||||
|
||||
@api.multi
|
||||
def _recompute_payment_terms_lines(self):
|
||||
''' Compute the dynamic payment term lines of the journal entry.'''
|
||||
self.ensure_one()
|
||||
@@ -803,7 +800,6 @@ class AccountMove(models.Model):
|
||||
self.invoice_payment_ref = new_terms_lines[-1].name or ''
|
||||
self.invoice_date_due = new_terms_lines[-1].date_maturity
|
||||
|
||||
@api.multi
|
||||
def _recompute_dynamic_lines(self, recompute_all_taxes=False):
|
||||
''' Recompute all lines that depend of others.
|
||||
|
||||
@@ -838,7 +834,6 @@ class AccountMove(models.Model):
|
||||
if self != self._origin:
|
||||
self.invoice_line_ids = self.line_ids.filtered(lambda line: not line.exclude_from_invoice_tab)
|
||||
|
||||
@api.multi
|
||||
def onchange(self, values, field_name, field_onchange):
|
||||
# OVERRIDE
|
||||
# As the dynamic lines in this model are quite complex, we need to ensure some computations are done exactly
|
||||
@@ -962,7 +957,6 @@ class AccountMove(models.Model):
|
||||
else:
|
||||
move.invoice_payment_state = 'not_paid'
|
||||
|
||||
@api.multi
|
||||
def _inverse_amount_total(self):
|
||||
for move in self:
|
||||
if len(move.line_ids) != 2 or move.type != 'entry':
|
||||
@@ -986,7 +980,6 @@ class AccountMove(models.Model):
|
||||
|
||||
move.write({'line_ids': to_write})
|
||||
|
||||
@api.multi
|
||||
def _get_domain_matching_supsense_moves(self):
|
||||
self.ensure_one()
|
||||
domain = self.env['account.move.line']._get_suspense_moves_domain()
|
||||
@@ -1063,7 +1056,6 @@ class AccountMove(models.Model):
|
||||
move.invoice_sequence_number_next_prefix = prefix
|
||||
move.invoice_sequence_number_next = '%%0%sd' % sequence.padding % number_next
|
||||
|
||||
@api.multi
|
||||
def _inverse_invoice_sequence_number_next(self):
|
||||
''' Set the number_next on the sequence related to the invoice/bill/refund'''
|
||||
# Check user group.
|
||||
@@ -1081,7 +1073,6 @@ class AccountMove(models.Model):
|
||||
date_sequence = sequence._get_current_sequence()
|
||||
date_sequence.number_next_actual = int(result.group(2))
|
||||
|
||||
@api.multi
|
||||
def _compute_payments_widget_to_reconcile_info(self):
|
||||
for move in self:
|
||||
move.invoice_outstanding_credits_debits_widget = json.dumps(False)
|
||||
@@ -1128,7 +1119,6 @@ class AccountMove(models.Model):
|
||||
move.invoice_outstanding_credits_debits_widget = json.dumps(info)
|
||||
move.invoice_has_outstanding = True
|
||||
|
||||
@api.multi
|
||||
def _get_reconciled_info_JSON_values(self):
|
||||
self.ensure_one()
|
||||
foreign_currency = self.currency_id if self.currency_id != self.company_id.currency_id else False
|
||||
@@ -1258,7 +1248,6 @@ class AccountMove(models.Model):
|
||||
if self._cr.fetchone():
|
||||
raise ValidationError(_('Duplicated vendor reference detected. You probably encoded twice the same vendor bill/credit note.'))
|
||||
|
||||
@api.multi
|
||||
def _check_balanced(self):
|
||||
''' Assert the move is fully balanced debit = credit.
|
||||
An error is raised if it's not the case.
|
||||
@@ -1287,7 +1276,6 @@ class AccountMove(models.Model):
|
||||
ids = [res[0] for res in query_res]
|
||||
raise UserError(_("Cannot create unbalanced journal entry. Ids: %s") % str(ids))
|
||||
|
||||
@api.multi
|
||||
def _check_fiscalyear_lock_date(self):
|
||||
for move in self:
|
||||
lock_date = max(move.company_id.period_lock_date or date.min, move.company_id.fiscalyear_lock_date or date.min)
|
||||
@@ -1301,7 +1289,6 @@ class AccountMove(models.Model):
|
||||
raise UserError(message)
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def _check_tax_lock_date(self):
|
||||
if not self:
|
||||
return
|
||||
@@ -1322,7 +1309,6 @@ class AccountMove(models.Model):
|
||||
Please change the journal entry date or the tax lock date set in the settings (%s) to proceed
|
||||
''' % query_res[1]))
|
||||
|
||||
@api.multi
|
||||
def _check_move_consistency(self):
|
||||
for move in self:
|
||||
if move.line_ids:
|
||||
@@ -1336,7 +1322,6 @@ class AccountMove(models.Model):
|
||||
# LOW-LEVEL METHODS
|
||||
# -------------------------------------------------------------------------
|
||||
|
||||
@api.multi
|
||||
def _move_autocomplete_invoice_lines_values(self):
|
||||
''' This method recomputes dynamic lines on the current journal entry that include taxes, cash rounding
|
||||
and payment terms lines.
|
||||
@@ -1414,7 +1399,6 @@ class AccountMove(models.Model):
|
||||
new_vals_list.append(move._move_autocomplete_invoice_lines_values())
|
||||
return new_vals_list
|
||||
|
||||
@api.multi
|
||||
def _move_autocomplete_invoice_lines_write(self, vals):
|
||||
''' During the write of an account.move with only 'invoice_line_ids' set and not 'line_ids', this method is called
|
||||
to auto compute accounting lines of the invoice. In that case, accounts will be retrieved and taxes, cash rounding
|
||||
@@ -1450,7 +1434,6 @@ class AccountMove(models.Model):
|
||||
|
||||
return moves
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
not_paid_invoices = self.filtered(lambda move: move.is_invoice(include_receipts=True) and move.invoice_payment_state not in ('paid', 'in_payment'))
|
||||
|
||||
@@ -1470,7 +1453,6 @@ class AccountMove(models.Model):
|
||||
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
for move in self:
|
||||
# check the lock date + check if some entries are reconciled
|
||||
@@ -1478,7 +1460,6 @@ class AccountMove(models.Model):
|
||||
move.line_ids.unlink()
|
||||
return super(AccountMove, self).unlink()
|
||||
|
||||
@api.multi
|
||||
@api.depends('name', 'state')
|
||||
def name_get(self):
|
||||
result = []
|
||||
@@ -1497,7 +1478,6 @@ class AccountMove(models.Model):
|
||||
result.append((move.id, name))
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def _track_subtype(self, init_values):
|
||||
# OVERRIDE to add custom subtype depending of the state.
|
||||
self.ensure_one()
|
||||
@@ -1552,7 +1532,6 @@ class AccountMove(models.Model):
|
||||
def is_outbound(self, include_receipts=True):
|
||||
return self.type in self.get_outbound_types(include_receipts)
|
||||
|
||||
@api.multi
|
||||
def _get_invoice_reference_euro_invoice(self):
|
||||
""" This computes the reference based on the RF Creditor Reference.
|
||||
The data of the reference is the database id number of the invoice.
|
||||
@@ -1565,7 +1544,6 @@ class AccountMove(models.Model):
|
||||
reference = 'RF{} {}'.format(check_digits, " ".join(["".join(x) for x in zip_longest(*[iter(str(base))]*4, fillvalue="")]))
|
||||
return reference
|
||||
|
||||
@api.multi
|
||||
def _get_invoice_reference_euro_partner(self):
|
||||
""" This computes the reference based on the RF Creditor Reference.
|
||||
The data of the reference is the user defined reference of the
|
||||
@@ -1585,7 +1563,6 @@ class AccountMove(models.Model):
|
||||
reference = 'RF{} {}'.format(check_digits, " ".join(["".join(x) for x in zip_longest(*[iter(partner_ref_nr)]*4, fillvalue="")]))
|
||||
return reference
|
||||
|
||||
@api.multi
|
||||
def _get_invoice_reference_odoo_invoice(self):
|
||||
""" This computes the reference based on the Odoo format.
|
||||
We simply return the number of the invoice, defined on the journal
|
||||
@@ -1594,7 +1571,6 @@ class AccountMove(models.Model):
|
||||
self.ensure_one()
|
||||
return self.name
|
||||
|
||||
@api.multi
|
||||
def _get_invoice_reference_odoo_partner(self):
|
||||
""" This computes the reference based on the Odoo format.
|
||||
The data used is the reference set on the partner or its database
|
||||
@@ -1605,7 +1581,6 @@ class AccountMove(models.Model):
|
||||
prefix = _('CUST')
|
||||
return '%s/%s' % (prefix, ref)
|
||||
|
||||
@api.multi
|
||||
def _get_invoice_computed_reference(self):
|
||||
self.ensure_one()
|
||||
if self.journal_id.invoice_reference_type == 'none':
|
||||
@@ -1617,7 +1592,6 @@ class AccountMove(models.Model):
|
||||
else:
|
||||
raise UserError(_('The combination of reference model and reference type on the journal is not implemented'))
|
||||
|
||||
@api.multi
|
||||
def _get_sequence(self):
|
||||
''' Return the sequence to be used during the post of the current move.
|
||||
:return: An ir.sequence record or False.
|
||||
@@ -1631,7 +1605,6 @@ class AccountMove(models.Model):
|
||||
return
|
||||
return journal.refund_sequence_id
|
||||
|
||||
@api.multi
|
||||
def _get_invoice_display_name(self, show_ref=False):
|
||||
''' Helper to get the display name of an invoice depending of its type.
|
||||
:param show_ref: A flag indicating of the display name must include or not the journal entry reference.
|
||||
@@ -1650,7 +1623,6 @@ class AccountMove(models.Model):
|
||||
else:
|
||||
return ('%s' % self.name) + (show_ref and self.ref and '(%s)' % self.ref or '')
|
||||
|
||||
@api.multi
|
||||
def _get_invoice_delivery_partner_id(self):
|
||||
''' Hook allowing to retrieve the right delivery address depending of installed modules.
|
||||
:return: A res.partner record's id representing the delivery address.
|
||||
@@ -1658,7 +1630,6 @@ class AccountMove(models.Model):
|
||||
self.ensure_one()
|
||||
return self.partner_id.address_get(['delivery'])['delivery']
|
||||
|
||||
@api.multi
|
||||
def _get_invoice_intrastat_country_id(self):
|
||||
''' Hook allowing to retrieve the intrastat country depending of installed modules.
|
||||
:return: A res.country record's id.
|
||||
@@ -1666,7 +1637,6 @@ class AccountMove(models.Model):
|
||||
self.ensure_one()
|
||||
return self.partner_id.country_id.id
|
||||
|
||||
@api.multi
|
||||
def _get_cash_basis_matched_percentage(self):
|
||||
"""Compute the percentage to apply for cash basis method. This value is relevant only for moves that
|
||||
involve journal items on receivable or payable accounts.
|
||||
@@ -1701,7 +1671,6 @@ class AccountMove(models.Model):
|
||||
else:
|
||||
return abs(total_reconciled / total_amount)
|
||||
|
||||
@api.multi
|
||||
def _reverse_move_vals(self, default_values, cancel=True):
|
||||
''' Reverse values passed as parameter being the copied values of the original journal entry.
|
||||
For example, debit / credit must be switched. The tax lines must be edited in case of refunds.
|
||||
@@ -1794,7 +1763,6 @@ class AccountMove(models.Model):
|
||||
})
|
||||
return move_vals
|
||||
|
||||
@api.multi
|
||||
def _reverse_moves(self, default_values_list=None, cancel=False):
|
||||
''' Reverse a recordset of account.move.
|
||||
If cancel parameter is true, the reconcilable or liquidity lines
|
||||
@@ -1844,11 +1812,9 @@ class AccountMove(models.Model):
|
||||
|
||||
return reverse_moves
|
||||
|
||||
@api.multi
|
||||
def open_reconcile_view(self):
|
||||
return self.line_ids.open_reconcile_view()
|
||||
|
||||
@api.multi
|
||||
def post(self):
|
||||
for move in self:
|
||||
if move.auto_post and move.date > fields.Date.today():
|
||||
@@ -1910,7 +1876,6 @@ class AccountMove(models.Model):
|
||||
# installing Accounting- with bank statements)
|
||||
move.company_id.account_bank_reconciliation_start = move.date
|
||||
|
||||
@api.multi
|
||||
def action_reverse(self):
|
||||
action = self.env.ref('account.action_view_account_move_reversal').read()[0]
|
||||
|
||||
@@ -1919,26 +1884,22 @@ class AccountMove(models.Model):
|
||||
|
||||
return action
|
||||
|
||||
@api.multi
|
||||
def action_post(self):
|
||||
if self.mapped('line_ids.payment_id') and any(self.mapped('journal_id.post_at_bank_rec')):
|
||||
raise UserError(_("A payment journal entry generated in a journal configured to post entries only when payments are reconciled with a bank statement cannot be manually posted. Those will be posted automatically after performing the bank reconciliation."))
|
||||
return self.post()
|
||||
|
||||
@api.multi
|
||||
def js_assign_outstanding_line(self, line_id):
|
||||
self.ensure_one()
|
||||
lines = self.env['account.move.line'].browse(line_id)
|
||||
lines += self.line_ids.filtered(lambda line: line.account_id == lines[0].account_id and not line.reconciled)
|
||||
return lines.reconcile()
|
||||
|
||||
@api.multi
|
||||
def button_draft(self):
|
||||
if any(move.state != 'cancel' for move in self):
|
||||
raise UserError(_('Only cancelled journal entries can be reset to draft.'))
|
||||
self.write({'state': 'draft'})
|
||||
|
||||
@api.multi
|
||||
def button_cancel(self):
|
||||
AccountMoveLine = self.env['account.move.line']
|
||||
excluded_move_ids = []
|
||||
@@ -1961,7 +1922,6 @@ class AccountMove(models.Model):
|
||||
self.mapped('line_ids').remove_move_reconcile()
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def action_invoice_sent(self):
|
||||
""" Open a window to compose an email, with the edi invoice template
|
||||
message loaded by default
|
||||
@@ -1991,7 +1951,6 @@ class AccountMove(models.Model):
|
||||
'context': ctx,
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def action_invoice_print(self):
|
||||
""" Print the invoice and mark it as sent, so that we can see more
|
||||
easily the next step of the workflow
|
||||
@@ -2005,12 +1964,10 @@ class AccountMove(models.Model):
|
||||
else:
|
||||
return self.env.ref('account.account_invoices_without_payment').report_action(self)
|
||||
|
||||
@api.multi
|
||||
def action_invoice_paid(self):
|
||||
''' Hook to be overrided called when the invoice moves to the paid state. '''
|
||||
pass
|
||||
|
||||
@api.multi
|
||||
def action_open_matching_suspense_moves(self):
|
||||
self.ensure_one()
|
||||
domain = self._get_domain_matching_supsense_moves()
|
||||
@@ -2026,19 +1983,16 @@ class AccountMove(models.Model):
|
||||
'context': action_context,
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def action_invoice_register_payment(self):
|
||||
return self.env['account.payment']\
|
||||
.with_context(active_ids=self.ids, active_model='account.move', active_id=self.id)\
|
||||
.action_register_payment()
|
||||
|
||||
@api.multi
|
||||
def _get_report_base_filename(self):
|
||||
if any(not move.is_invoice() for move in self):
|
||||
raise UserError(_("Only invoices could be printed."))
|
||||
return self._get_invoice_display_name()
|
||||
|
||||
@api.multi
|
||||
def preview_invoice(self):
|
||||
self.ensure_one()
|
||||
return {
|
||||
@@ -2047,7 +2001,6 @@ class AccountMove(models.Model):
|
||||
'url': self.get_portal_url(),
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def _compute_access_url(self):
|
||||
super(AccountMove, self)._compute_access_url()
|
||||
for move in self.filtered(lambda move: move.is_invoice()):
|
||||
@@ -2058,7 +2011,6 @@ class AccountMove(models.Model):
|
||||
for move in self:
|
||||
move.has_reconciled_entries = len(move.line_ids._reconciled_lines()) > 1
|
||||
|
||||
@api.multi
|
||||
def action_view_reverse_entry(self):
|
||||
self.ensure_one()
|
||||
|
||||
@@ -2095,7 +2047,6 @@ class AccountMove(models.Model):
|
||||
records.post()
|
||||
|
||||
# offer the possibility to duplicate thanks to a button instead of a hidden menu, which is more visible
|
||||
@api.multi
|
||||
def action_duplicate(self):
|
||||
self.ensure_one()
|
||||
action = self.env.ref('account.action_move_journal_line').read()[0]
|
||||
@@ -2269,7 +2220,6 @@ class AccountMoveLine(models.Model):
|
||||
account = repartition_line.account_id
|
||||
return account
|
||||
|
||||
@api.multi
|
||||
def _get_computed_name(self):
|
||||
self.ensure_one()
|
||||
|
||||
@@ -2292,7 +2242,6 @@ class AccountMoveLine(models.Model):
|
||||
values.append(product.description_purchase)
|
||||
return '\n'.join(values)
|
||||
|
||||
@api.multi
|
||||
def _get_computed_price_unit(self):
|
||||
self.ensure_one()
|
||||
|
||||
@@ -2316,7 +2265,6 @@ class AccountMoveLine(models.Model):
|
||||
price_unit, self.move_id.currency_id, company, self.move_id.date)
|
||||
return price_unit
|
||||
|
||||
@api.multi
|
||||
def _get_computed_account(self):
|
||||
self.ensure_one()
|
||||
|
||||
@@ -2332,7 +2280,6 @@ class AccountMoveLine(models.Model):
|
||||
# In invoice.
|
||||
return accounts['expense']
|
||||
|
||||
@api.multi
|
||||
def _get_computed_taxes(self):
|
||||
self.ensure_one()
|
||||
|
||||
@@ -2369,14 +2316,12 @@ class AccountMoveLine(models.Model):
|
||||
else:
|
||||
return tax_ids
|
||||
|
||||
@api.multi
|
||||
def _get_computed_uom(self):
|
||||
self.ensure_one()
|
||||
if self.product_id:
|
||||
return self.product_id.uom_id
|
||||
return False
|
||||
|
||||
@api.multi
|
||||
def _get_price_total_and_subtotal(self, price_unit=None, quantity=None, discount=None, currency=None, product=None, partner=None, taxes=None, move_type=None):
|
||||
self.ensure_one()
|
||||
return self._get_price_total_and_subtotal_model(
|
||||
@@ -2420,7 +2365,6 @@ class AccountMoveLine(models.Model):
|
||||
res['price_total'] = res['price_subtotal'] = subtotal
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def _get_fields_onchange_subtotal(self, price_subtotal=None, move_type=None, currency=None, company=None, date=None):
|
||||
self.ensure_one()
|
||||
return self._get_fields_onchange_subtotal_model(
|
||||
@@ -2467,7 +2411,6 @@ class AccountMoveLine(models.Model):
|
||||
'credit': price_subtotal < 0.0 and -price_subtotal or 0.0,
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def _get_fields_onchange_balance(self, quantity=None, discount=None, balance=None, move_type=None, currency=None, taxes=None):
|
||||
self.ensure_one()
|
||||
return self._get_fields_onchange_balance_model(
|
||||
@@ -2584,7 +2527,6 @@ class AccountMoveLine(models.Model):
|
||||
if not self.display_type in ('line_section', 'line_note'):
|
||||
self.tax_ids = self._get_computed_taxes()
|
||||
|
||||
@api.multi
|
||||
def _onchange_balance(self):
|
||||
for line in self:
|
||||
if line.currency_id:
|
||||
@@ -2775,7 +2717,6 @@ class AccountMoveLine(models.Model):
|
||||
"Please change the journal entry date or the tax lock date set in the settings ({}) to proceed").format(
|
||||
line.company_id.tax_lock_date or date.min))
|
||||
|
||||
@api.multi
|
||||
def _update_check(self):
|
||||
""" Raise Warning to cause rollback if the move is posted, some entries are reconciled or the move is older than the lock date"""
|
||||
move_ids = set()
|
||||
@@ -2886,7 +2827,6 @@ class AccountMoveLine(models.Model):
|
||||
|
||||
return lines
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
# OVERRIDE
|
||||
ACCOUNTING_FIELDS = ('debit', 'credit', 'amount_currency')
|
||||
@@ -2942,7 +2882,6 @@ class AccountMoveLine(models.Model):
|
||||
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
self._update_check()
|
||||
self._check_tax_lock_date2()
|
||||
@@ -2997,7 +2936,6 @@ class AccountMoveLine(models.Model):
|
||||
values['account_id'] = accounts.id
|
||||
return values
|
||||
|
||||
@api.multi
|
||||
@api.depends('ref', 'move_id')
|
||||
def name_get(self):
|
||||
result = []
|
||||
@@ -3012,7 +2950,6 @@ class AccountMoveLine(models.Model):
|
||||
# RECONCILIATION
|
||||
# -------------------------------------------------------------------------
|
||||
|
||||
@api.multi
|
||||
def check_full_reconcile(self):
|
||||
"""
|
||||
This method check if a move is totally reconciled and if we need to create exchange rate entries for the move.
|
||||
@@ -3110,7 +3047,6 @@ class AccountMoveLine(models.Model):
|
||||
'exchange_move_id': exchange_move_id,
|
||||
})
|
||||
|
||||
@api.multi
|
||||
def _reconcile_lines(self, debit_moves, credit_moves, field):
|
||||
""" This function loops on the 2 recordsets given as parameter as long as it
|
||||
can find a debit and a credit to reconcile together. It returns the recordset of the
|
||||
@@ -3188,7 +3124,6 @@ class AccountMoveLine(models.Model):
|
||||
|
||||
return debit_moves+credit_moves
|
||||
|
||||
@api.multi
|
||||
def auto_reconcile_lines(self):
|
||||
# Create list of debit and list of credit move ordered by date-currency
|
||||
debit_moves = self.filtered(lambda r: r.debit != 0 or r.amount_currency > 0)
|
||||
@@ -3223,7 +3158,6 @@ class AccountMoveLine(models.Model):
|
||||
if not (all_accounts[0].reconcile or all_accounts[0].internal_type == 'liquidity'):
|
||||
raise UserError(_('Account %s (%s) does not allow reconciliation. First change the configuration of this account to allow it.') % (all_accounts[0].name, all_accounts[0].code))
|
||||
|
||||
@api.multi
|
||||
def reconcile(self, writeoff_acc_id=False, writeoff_journal_id=False):
|
||||
# Empty self can happen if the user tries to reconcile entries which are already reconciled.
|
||||
# The calling method might have filtered out reconciled lines.
|
||||
@@ -3342,19 +3276,16 @@ class AccountMoveLine(models.Model):
|
||||
# Return the writeoff move.line which is to be reconciled
|
||||
return line_to_reconcile
|
||||
|
||||
@api.multi
|
||||
def remove_move_reconcile(self):
|
||||
""" Undo a reconciliation """
|
||||
(self.mapped('matched_debit_ids') + self.mapped('matched_credit_ids')).unlink()
|
||||
|
||||
@api.multi
|
||||
def _copy_data_extend_business_fields(self, values):
|
||||
''' Hook allowing copying business fields under certain conditions.
|
||||
E.g. The link to the sale order lines must be preserved in case of a refund.
|
||||
'''
|
||||
self.ensure_one()
|
||||
|
||||
@api.multi
|
||||
def copy_data(self, default=None):
|
||||
res = super(AccountMoveLine, self).copy_data(default=default)
|
||||
if self._context.get('include_business_fields'):
|
||||
@@ -3409,7 +3340,6 @@ class AccountMoveLine(models.Model):
|
||||
self.ensure_one()
|
||||
return self.analytic_tag_ids.filtered(lambda r: not r.active_analytic_distribution).ids
|
||||
|
||||
@api.multi
|
||||
def create_analytic_lines(self):
|
||||
""" Create analytic items upon validation of an account.move.line having an analytic account or an analytic distribution.
|
||||
"""
|
||||
@@ -3427,7 +3357,6 @@ class AccountMoveLine(models.Model):
|
||||
values_list = lines_to_create_analytic_entries._prepare_analytic_line()
|
||||
self.env['account.analytic.line'].create(values_list)
|
||||
|
||||
@api.multi
|
||||
def _prepare_analytic_line(self):
|
||||
""" Prepare the values used to create() an account.analytic.line upon validation of an account.move.line having
|
||||
an analytic account. This method is intended to be extended in other modules.
|
||||
@@ -3558,7 +3487,6 @@ class AccountMoveLine(models.Model):
|
||||
ids.append(aml.id)
|
||||
return ids
|
||||
|
||||
@api.multi
|
||||
def open_reconcile_view(self):
|
||||
[action] = self.env.ref('account.action_account_moves_all_a').read()
|
||||
ids = self._reconciled_lines()
|
||||
@@ -3591,7 +3519,6 @@ class AccountPartialReconcile(models.Model):
|
||||
readonly=True, copy=False, store=True,
|
||||
help='Technical field used to determine at which date this reconciliation needs to be shown on the aged receivable/payable reports.')
|
||||
|
||||
@api.multi
|
||||
@api.depends('debit_move_id.date', 'credit_move_id.date')
|
||||
def _compute_max_date(self):
|
||||
for rec in self:
|
||||
@@ -3794,7 +3721,6 @@ class AccountPartialReconcile(models.Model):
|
||||
}
|
||||
return self.env['account.move'].create(move_vals)
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
""" When removing a partial reconciliation, also unlink its full reconciliation if it exists """
|
||||
full_to_unlink = self.env['account.full.reconcile']
|
||||
@@ -3822,7 +3748,6 @@ class AccountFullReconcile(models.Model):
|
||||
reconciled_line_ids = fields.One2many('account.move.line', 'full_reconcile_id', string='Matched Journal Items')
|
||||
exchange_move_id = fields.Many2one('account.move')
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
""" When removing a full reconciliation, we need to revert the eventual journal entries we created to book the
|
||||
fluctuation of the foreign currency's exchange rate.
|
||||
|
||||
@@ -145,7 +145,6 @@ class account_payment(models.Model):
|
||||
payment.show_partner_bank_account = payment.payment_method_code in self._get_method_codes_using_bank_account()
|
||||
payment.require_partner_bank_account = payment.payment_method_code in self._get_method_codes_needing_bank_account()
|
||||
|
||||
@api.multi
|
||||
@api.depends('payment_type', 'journal_id')
|
||||
def _compute_hide_payment_method(self):
|
||||
for payment in self:
|
||||
@@ -324,11 +323,9 @@ class account_payment(models.Model):
|
||||
total += move_currency._convert(res['amount_residual'], currency, company, date)
|
||||
return total
|
||||
|
||||
@api.multi
|
||||
def name_get(self):
|
||||
return [(payment.id, payment.name or _('Draft Payment')) for payment in self]
|
||||
|
||||
@api.multi
|
||||
@api.depends('move_line_ids.reconciled')
|
||||
def _get_move_reconciled(self):
|
||||
for payment in self:
|
||||
@@ -392,7 +389,6 @@ class account_payment(models.Model):
|
||||
record.reconciled_invoice_ids = reconciled_moves.filtered(lambda move: move.is_invoice())
|
||||
record.has_invoices = bool(record.reconciled_invoice_ids)
|
||||
|
||||
@api.multi
|
||||
def action_register_payment(self):
|
||||
active_ids = self.env.context.get('active_ids')
|
||||
if not active_ids:
|
||||
@@ -408,7 +404,6 @@ class account_payment(models.Model):
|
||||
'type': 'ir.actions.act_window',
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def button_journal_entries(self):
|
||||
return {
|
||||
'name': _('Journal Items'),
|
||||
@@ -419,7 +414,6 @@ class account_payment(models.Model):
|
||||
'domain': [('payment_id', 'in', self.ids)],
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def button_invoices(self):
|
||||
return {
|
||||
'name': _('Paid Invoices'),
|
||||
@@ -431,7 +425,6 @@ class account_payment(models.Model):
|
||||
'domain': [('id', 'in', [x.id for x in self.reconciled_invoice_ids])],
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def unreconcile(self):
|
||||
""" Set back the payments in 'posted' or 'sent' state, without deleting the journal entries.
|
||||
Called when cancelling a bank statement line linked to a pre-registered payment.
|
||||
@@ -442,7 +435,6 @@ class account_payment(models.Model):
|
||||
else:
|
||||
payment.write({'state': 'posted'})
|
||||
|
||||
@api.multi
|
||||
def cancel(self):
|
||||
for rec in self:
|
||||
for move in rec.move_line_ids.mapped('move_id'):
|
||||
@@ -452,7 +444,6 @@ class account_payment(models.Model):
|
||||
move.unlink()
|
||||
rec.state = 'cancelled'
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
if any(bool(rec.move_line_ids) for rec in self):
|
||||
raise UserError(_("You cannot delete a payment that is already posted."))
|
||||
@@ -460,7 +451,6 @@ class account_payment(models.Model):
|
||||
raise UserError(_('It is not allowed to delete a payment that already created a journal entry since it would create a gap in the numbering. You should create the journal entry again and cancel it thanks to a regular revert.'))
|
||||
return super(account_payment, self).unlink()
|
||||
|
||||
@api.multi
|
||||
def _prepare_payment_moves(self):
|
||||
''' Prepare the creation of journal entries (account.move) by creating a list of python dictionary to be passed
|
||||
to the 'create' method.
|
||||
@@ -640,7 +630,6 @@ class account_payment(models.Model):
|
||||
all_move_vals.append(transfer_move_vals)
|
||||
return all_move_vals
|
||||
|
||||
@api.multi
|
||||
def post(self):
|
||||
""" Create the journal items for the payment and update the payment's state to 'posted'.
|
||||
A journal entry is created containing an item in the source liquidity account (selected journal's default_debit or default_credit)
|
||||
@@ -697,11 +686,9 @@ class account_payment(models.Model):
|
||||
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def action_draft(self):
|
||||
return self.write({'state': 'draft'})
|
||||
|
||||
@api.multi
|
||||
def _get_invoice_payment_amount(self, inv):
|
||||
"""
|
||||
Computes the amount covered by the current payment in the given invoice.
|
||||
@@ -769,7 +756,6 @@ class payment_register(models.TransientModel):
|
||||
return {'domain': {'payment_method_id': domain}}
|
||||
return {}
|
||||
|
||||
@api.multi
|
||||
def _prepare_payment_vals(self, invoice):
|
||||
'''Create the payment values.
|
||||
|
||||
@@ -792,7 +778,6 @@ class payment_register(models.TransientModel):
|
||||
}
|
||||
return values
|
||||
|
||||
@api.multi
|
||||
def get_payments_vals(self):
|
||||
'''Compute the values for payments.
|
||||
|
||||
@@ -800,7 +785,6 @@ class payment_register(models.TransientModel):
|
||||
'''
|
||||
return [self._prepare_payment_vals(invoice) for invoice in self.invoice_ids]
|
||||
|
||||
@api.multi
|
||||
def create_payments(self):
|
||||
'''Create payments according to the invoices.
|
||||
Having invoices with different commercial_partner_id or different type
|
||||
|
||||
@@ -31,7 +31,6 @@ class AccountPaymentTerm(models.Model):
|
||||
if len(lines) > 1:
|
||||
raise ValidationError(_('A Payment Term should have only one line of type Balance.'))
|
||||
|
||||
@api.multi
|
||||
def compute(self, value, date_ref=False, currency=None):
|
||||
self.ensure_one()
|
||||
date_ref = date_ref or fields.Date.today()
|
||||
@@ -68,7 +67,6 @@ class AccountPaymentTerm(models.Model):
|
||||
result.append((last_date, dist))
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
for terms in self:
|
||||
if self.env['account.move'].search([('payment_term_id', 'in', terms.ids)]):
|
||||
|
||||
@@ -105,7 +105,6 @@ class AccountReconcileModel(models.Model):
|
||||
|
||||
number_entries = fields.Integer(string='Number of entries related to this model', compute='_compute_number_entries')
|
||||
|
||||
@api.multi
|
||||
def action_reconcile_stat(self):
|
||||
self.ensure_one()
|
||||
action = self.env.ref('account.action_move_journal_line').read()[0]
|
||||
@@ -121,7 +120,6 @@ class AccountReconcileModel(models.Model):
|
||||
})
|
||||
return action
|
||||
|
||||
@api.multi
|
||||
def _compute_number_entries(self):
|
||||
data = self.env['account.move.line'].read_group([('reconcile_model_id', 'in', self.ids)], ['reconcile_model_ids'], 'reconcile_model_id')
|
||||
mapped_data = dict([(d['reconcile_model_id'][0], d['reconcile_model_id_count']) for d in data])
|
||||
@@ -193,7 +191,6 @@ class AccountReconcileModel(models.Model):
|
||||
base_line_dict['tag_ids'] = [(6, 0, res['base_tags'])]
|
||||
return new_aml_dicts
|
||||
|
||||
@api.multi
|
||||
def _get_write_off_move_lines_dict(self, st_line, move_lines=None):
|
||||
''' Get move.lines dict (to be passed to the create()) corresponding to the reconciliation model's write-off lines.
|
||||
:param st_line: An account.bank.statement.line record.
|
||||
@@ -265,7 +262,6 @@ class AccountReconcileModel(models.Model):
|
||||
|
||||
return new_aml_dicts
|
||||
|
||||
@api.multi
|
||||
def _prepare_reconciliation(self, st_line, move_lines=None, partner=None):
|
||||
''' Reconcile the statement line with some move lines using this reconciliation model.
|
||||
:param st_line: An account.bank.statement.line record.
|
||||
@@ -324,7 +320,6 @@ class AccountReconcileModel(models.Model):
|
||||
# RECONCILIATION CRITERIA
|
||||
####################################################
|
||||
|
||||
@api.multi
|
||||
def _apply_conditions(self, query, params):
|
||||
self.ensure_one()
|
||||
rule = self
|
||||
@@ -382,7 +377,6 @@ class AccountReconcileModel(models.Model):
|
||||
|
||||
return query, params
|
||||
|
||||
@api.multi
|
||||
def _get_with_tables(self, st_lines, partner_map=None):
|
||||
with_tables = '''
|
||||
WITH jnl_precision AS (
|
||||
@@ -403,7 +397,6 @@ class AccountReconcileModel(models.Model):
|
||||
with_tables += ', partners_table AS (' + partners_table + ')'
|
||||
return with_tables
|
||||
|
||||
@api.multi
|
||||
def _get_invoice_matching_query(self, st_lines, excluded_ids=None, partner_map=None):
|
||||
''' Get the query applying all rules trying to match existing entries with the given statement lines.
|
||||
:param st_lines: Account.bank.statement.lines recordset.
|
||||
@@ -534,7 +527,6 @@ class AccountReconcileModel(models.Model):
|
||||
full_query += ' ORDER BY aml_date_maturity, aml_id'
|
||||
return full_query, all_params
|
||||
|
||||
@api.multi
|
||||
def _get_writeoff_suggestion_query(self, st_lines, excluded_ids=None, partner_map=None):
|
||||
''' Get the query applying all reconciliation rules.
|
||||
:param st_lines: Account.bank.statement.lines recordset.
|
||||
@@ -570,7 +562,6 @@ class AccountReconcileModel(models.Model):
|
||||
full_query += ' UNION ALL '.join(queries)
|
||||
return full_query, all_params
|
||||
|
||||
@api.multi
|
||||
def _check_rule_propositions(self, statement_line, candidates):
|
||||
''' Check restrictions that can't be handled for each move.line separately.
|
||||
/!\ Only used by models having a type equals to 'invoice_matching'.
|
||||
@@ -601,7 +592,6 @@ class AccountReconcileModel(models.Model):
|
||||
amount_percentage = (line_residual / total_residual) * 100 if total_residual else 0
|
||||
return amount_percentage >= self.match_total_amount_param
|
||||
|
||||
@api.multi
|
||||
def _apply_rules(self, st_lines, excluded_ids=None, partner_map=None):
|
||||
''' Apply criteria to get candidates for all reconciliation models.
|
||||
:param st_lines: Account.bank.statement.lines recordset.
|
||||
|
||||
@@ -78,7 +78,6 @@ class AccountAccountTemplate(models.Model):
|
||||
tag_ids = fields.Many2many('account.account.tag', 'account_account_template_account_tag', string='Account tag', help="Optional tags you may want to assign for custom reporting")
|
||||
group_id = fields.Many2one('account.group')
|
||||
|
||||
@api.multi
|
||||
@api.depends('name', 'code')
|
||||
def name_get(self):
|
||||
res = []
|
||||
@@ -346,7 +345,6 @@ class AccountChartTemplate(models.Model):
|
||||
"""
|
||||
return [{'acc_name': _('Cash'), 'account_type': 'cash'}, {'acc_name': _('Bank'), 'account_type': 'bank'}]
|
||||
|
||||
@api.multi
|
||||
def open_select_template_wizard(self):
|
||||
# Add action to open wizard to select between several templates
|
||||
if not self.company_id.chart_template_id:
|
||||
@@ -397,7 +395,6 @@ class AccountChartTemplate(models.Model):
|
||||
company.write({'tax_cash_basis_journal_id': journal.id})
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def _prepare_all_journals(self, acc_template_ref, company, journals_dict=None):
|
||||
def _get_default_account(journal_vals, type='debit'):
|
||||
# Get the default accounts
|
||||
@@ -438,7 +435,6 @@ class AccountChartTemplate(models.Model):
|
||||
journal_data.append(vals)
|
||||
return journal_data
|
||||
|
||||
@api.multi
|
||||
def generate_properties(self, acc_template_ref, company):
|
||||
"""
|
||||
This method used for creating properties.
|
||||
@@ -490,7 +486,6 @@ class AccountChartTemplate(models.Model):
|
||||
company.write({stock_property: value})
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def _install_template(self, company, code_digits=None, obj_wizard=None, acc_ref=None, taxes_ref=None):
|
||||
""" Recursively load the template objects and create the real objects from them.
|
||||
|
||||
@@ -520,7 +515,6 @@ class AccountChartTemplate(models.Model):
|
||||
taxes_ref.update(tmp2)
|
||||
return acc_ref, taxes_ref
|
||||
|
||||
@api.multi
|
||||
def _load_template(self, company, code_digits=None, account_ref=None, taxes_ref=None):
|
||||
""" Generate all the objects from the templates
|
||||
|
||||
@@ -581,7 +575,6 @@ class AccountChartTemplate(models.Model):
|
||||
|
||||
return account_ref, taxes_ref
|
||||
|
||||
@api.multi
|
||||
def create_record_with_xmlid(self, company, template, model, vals):
|
||||
return self._create_records_with_xmlid(model, [(template, vals)], company).id
|
||||
|
||||
@@ -647,7 +640,6 @@ class AccountChartTemplate(models.Model):
|
||||
}
|
||||
return val
|
||||
|
||||
@api.multi
|
||||
def generate_account(self, tax_template_ref, acc_template_ref, code_digits, company):
|
||||
""" This method generates accounts from account templates.
|
||||
|
||||
@@ -713,7 +705,6 @@ class AccountChartTemplate(models.Model):
|
||||
'second_tax_ids': [[4, tax_template_ref[tax.id], 0] for tax in account_reconcile_model.second_tax_ids],
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def generate_account_reconcile_model(self, tax_template_ref, acc_template_ref, company):
|
||||
""" This method creates account reconcile models
|
||||
|
||||
@@ -732,7 +723,6 @@ class AccountChartTemplate(models.Model):
|
||||
self.create_record_with_xmlid(company, account_reconcile_model, 'account.reconcile.model', vals)
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def _get_fp_vals(self, company, position):
|
||||
return {
|
||||
'company_id': company.id,
|
||||
@@ -748,7 +738,6 @@ class AccountChartTemplate(models.Model):
|
||||
'zip_to': position.zip_to,
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def generate_fiscal_position(self, tax_template_ref, acc_template_ref, company):
|
||||
""" This method generates Fiscal Position, Fiscal Position Accounts
|
||||
and Fiscal Position Taxes from templates.
|
||||
@@ -838,7 +827,6 @@ class AccountTaxTemplate(models.Model):
|
||||
('name_company_uniq', 'unique(name, type_tax_use, chart_template_id)', 'Tax names must be unique !'),
|
||||
]
|
||||
|
||||
@api.multi
|
||||
@api.depends('name', 'description')
|
||||
def name_get(self):
|
||||
res = []
|
||||
@@ -883,7 +871,6 @@ class AccountTaxTemplate(models.Model):
|
||||
val['tax_group_id'] = self.tax_group_id.id
|
||||
return val
|
||||
|
||||
@api.multi
|
||||
def _generate_tax(self, company):
|
||||
""" This method generate taxes from templates.
|
||||
|
||||
|
||||
@@ -145,7 +145,6 @@ Best Regards,'''))
|
||||
'account_setup_coa_state',
|
||||
])
|
||||
|
||||
@api.multi
|
||||
def _check_lock_dates(self, vals):
|
||||
'''Check the lock dates for the current companies. This can't be done in a api.constrains because we need
|
||||
to perform some comparison between new/old values. This method forces the lock dates to be irreversible.
|
||||
@@ -199,7 +198,6 @@ Best Regards,'''))
|
||||
if period_lock_date < fiscalyear_lock_date:
|
||||
raise ValidationError(_('You cannot define stricter conditions on advisors than on users. Please make sure that the lock date on advisor is set before the lock date for users.'))
|
||||
|
||||
@api.multi
|
||||
def compute_fiscalyear_dates(self, current_date):
|
||||
'''Computes the start and end dates of the fiscal year where the given 'date' belongs to.
|
||||
|
||||
@@ -266,7 +264,6 @@ Best Regards,'''))
|
||||
if account.code.startswith(old_code):
|
||||
account.write({'code': self.get_new_account_code(account.code, old_code, new_code)})
|
||||
|
||||
@api.multi
|
||||
def _validate_fiscalyear_lock(self, values):
|
||||
if values.get('fiscalyear_lock_date'):
|
||||
nb_draft_entries = self.env['account.move'].search([
|
||||
@@ -276,7 +273,6 @@ Best Regards,'''))
|
||||
if nb_draft_entries:
|
||||
raise ValidationError(_('There are still unposted entries in the period you want to lock. You should either post or delete them.'))
|
||||
|
||||
@api.multi
|
||||
def write(self, values):
|
||||
#restrict the closing of FY if there are still unposted entries
|
||||
self._validate_fiscalyear_lock(values)
|
||||
@@ -538,13 +534,11 @@ Best Regards,'''))
|
||||
}
|
||||
return action
|
||||
|
||||
@api.multi
|
||||
def action_save_onboarding_invoice_layout(self):
|
||||
""" Set the onboarding step as done """
|
||||
if bool(self.logo) and self.logo != self._get_logo():
|
||||
self.set_onboarding_step_done('account_onboarding_invoice_layout_state')
|
||||
|
||||
@api.multi
|
||||
def action_save_onboarding_sale_tax(self):
|
||||
""" Set the onboarding step as done """
|
||||
self.set_onboarding_step_done('account_onboarding_sale_tax_state')
|
||||
|
||||
@@ -6,7 +6,6 @@ from odoo.exceptions import UserError
|
||||
class IrActionsReport(models.Model):
|
||||
_inherit = 'ir.actions.report'
|
||||
|
||||
@api.multi
|
||||
def retrieve_attachment(self, record):
|
||||
# get the original bills through the message_main_attachment_id field of the record
|
||||
if self.report_name == 'account.report_original_vendor_bill' and record.message_main_attachment_id:
|
||||
@@ -15,7 +14,6 @@ class IrActionsReport(models.Model):
|
||||
return record.message_main_attachment_id
|
||||
return super(IrActionsReport, self).retrieve_attachment(record)
|
||||
|
||||
@api.multi
|
||||
def _post_pdf(self, save_in_attachment, pdf_content=None, res_ids=None):
|
||||
# don't include the generated dummy report
|
||||
if self.report_name == 'account.report_original_vendor_bill':
|
||||
@@ -25,7 +23,6 @@ class IrActionsReport(models.Model):
|
||||
raise UserError(_("No original vendor bills could be found for any of the selected vendor bills."))
|
||||
return super(IrActionsReport, self)._post_pdf(save_in_attachment, pdf_content=pdf_content, res_ids=res_ids)
|
||||
|
||||
@api.multi
|
||||
def postprocess_pdf_report(self, record, buffer):
|
||||
# don't save the 'account.report_original_vendor_bill' report as it's just a mean to print existing attachments
|
||||
if self.report_name == 'account.report_original_vendor_bill':
|
||||
|
||||
@@ -107,7 +107,6 @@ class AccountFiscalPosition(models.Model):
|
||||
vals['zip_from'], vals['zip_to'] = self._convert_zip_values(zip_from, zip_to)
|
||||
return super(AccountFiscalPosition, self).create(vals)
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
zip_from = vals.get('zip_from')
|
||||
zip_to = vals.get('zip_to')
|
||||
@@ -224,7 +223,6 @@ class ResPartner(models.Model):
|
||||
_name = 'res.partner'
|
||||
_inherit = 'res.partner'
|
||||
|
||||
@api.multi
|
||||
def _credit_debit_get(self):
|
||||
tables, where_clause, where_params = self.env['account.move.line'].with_context(company_id=self.env.company.id)._query_get()
|
||||
where_params = [tuple(self.ids)] + where_params
|
||||
@@ -247,7 +245,6 @@ class ResPartner(models.Model):
|
||||
elif type == 'payable':
|
||||
partner.debit = -val
|
||||
|
||||
@api.multi
|
||||
def _asset_difference_search(self, account_type, operator, operand):
|
||||
if operator not in ('<', '=', '>', '>=', '<='):
|
||||
return []
|
||||
@@ -278,7 +275,6 @@ class ResPartner(models.Model):
|
||||
def _debit_search(self, operator, operand):
|
||||
return self._asset_difference_search('payable', operator, operand)
|
||||
|
||||
@api.multi
|
||||
def _invoice_total(self):
|
||||
account_invoice_report = self.env['account.invoice.report']
|
||||
if not self.ids:
|
||||
@@ -317,13 +313,11 @@ class ResPartner(models.Model):
|
||||
for partner, child_ids in all_partners_and_children.items():
|
||||
partner.total_invoiced = sum(price['total'] for price in price_totals if price['partner_id'] in child_ids)
|
||||
|
||||
@api.multi
|
||||
def _compute_journal_item_count(self):
|
||||
AccountMoveLine = self.env['account.move.line']
|
||||
for partner in self:
|
||||
partner.journal_item_count = AccountMoveLine.search_count([('partner_id', '=', partner.id)])
|
||||
|
||||
@api.multi
|
||||
def _compute_contracts_count(self):
|
||||
AccountAnalyticAccount = self.env['account.analytic.account']
|
||||
for partner in self:
|
||||
@@ -380,7 +374,6 @@ class ResPartner(models.Model):
|
||||
""", (partner.id,))
|
||||
partner.has_unreconciled_entries = self.env.cr.rowcount == 1
|
||||
|
||||
@api.multi
|
||||
def mark_as_reconciled(self):
|
||||
self.env['account.partial.reconcile'].check_access_rights('write')
|
||||
return self.sudo().with_context(company_id=self.env.company.id).write({'last_time_entries_checked': time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)})
|
||||
@@ -438,7 +431,6 @@ class ResPartner(models.Model):
|
||||
invoice_warn = fields.Selection(WARNING_MESSAGE, 'Invoice', help=WARNING_HELP, default="no-message")
|
||||
invoice_warn_msg = fields.Text('Message for Invoice')
|
||||
|
||||
@api.multi
|
||||
def _compute_bank_count(self):
|
||||
bank_data = self.env['res.partner.bank'].read_group([('partner_id', 'in', self.ids)], ['partner_id'], ['partner_id'])
|
||||
mapped_data = dict([(bank['partner_id'][0], bank['partner_id_count']) for bank in bank_data])
|
||||
@@ -455,7 +447,6 @@ class ResPartner(models.Model):
|
||||
['debit_limit', 'property_account_payable_id', 'property_account_receivable_id', 'property_account_position_id',
|
||||
'property_payment_term_id', 'property_supplier_payment_term_id', 'last_time_entries_checked']
|
||||
|
||||
@api.multi
|
||||
def action_view_partner_invoices(self):
|
||||
self.ensure_one()
|
||||
action = self.env.ref('account.action_move_out_invoice_type').read()[0]
|
||||
|
||||
@@ -35,21 +35,18 @@ class ProductTemplate(models.Model):
|
||||
domain=[('deprecated', '=', False)],
|
||||
help="Keep this field empty to use the default value from the product category. If anglo-saxon accounting with automated valuation method is configured, the expense account on the product category will be used.")
|
||||
|
||||
@api.multi
|
||||
def _get_product_accounts(self):
|
||||
return {
|
||||
'income': self.property_account_income_id or self.categ_id.property_account_income_categ_id,
|
||||
'expense': self.property_account_expense_id or self.categ_id.property_account_expense_categ_id
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def _get_asset_accounts(self):
|
||||
res = {}
|
||||
res['stock_input'] = False
|
||||
res['stock_output'] = False
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def get_product_accounts(self, fiscal_pos=None):
|
||||
accounts = self._get_product_accounts()
|
||||
if not fiscal_pos:
|
||||
|
||||
@@ -91,7 +91,6 @@ class ResConfigSettings(models.TransientModel):
|
||||
oldname='default_use_sale_note',
|
||||
config_parameter='account.use_invoice_terms')
|
||||
|
||||
@api.multi
|
||||
def set_values(self):
|
||||
super(ResConfigSettings, self).set_values()
|
||||
if self.group_multi_currency:
|
||||
|
||||
@@ -8,7 +8,6 @@ from odoo.exceptions import ValidationError
|
||||
class Users(models.Model):
|
||||
_inherit = "res.users"
|
||||
|
||||
@api.multi
|
||||
@api.constrains('groups_id')
|
||||
def _check_one_user_type(self):
|
||||
super(Users, self)._check_one_user_type()
|
||||
|
||||
@@ -10,18 +10,15 @@ class ImportInvoiceImportWizard(models.TransientModel):
|
||||
|
||||
attachment_ids = fields.Many2many('ir.attachment', string='Files')
|
||||
|
||||
@api.multi
|
||||
def _create_invoice_from_file(self, attachment):
|
||||
invoice = self.env['account.move'].create({})
|
||||
attachment.write({'res_model': 'account.move', 'res_id': invoice.id})
|
||||
invoice.message_post(attachment_ids=[attachment.id])
|
||||
return invoice
|
||||
|
||||
@api.multi
|
||||
def _create_invoice(self, attachment):
|
||||
return self._create_invoice_from_file(attachment)
|
||||
|
||||
@api.multi
|
||||
def create_invoices(self):
|
||||
''' Create the invoices from files.
|
||||
:return: A action redirecting to account.invoice tree/form view.
|
||||
|
||||
@@ -40,7 +40,6 @@ class AccountInvoiceSend(models.TransientModel):
|
||||
})
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
@api.onchange('invoice_ids')
|
||||
def _compute_composition_mode(self):
|
||||
for wizard in self:
|
||||
@@ -68,14 +67,12 @@ class AccountInvoiceSend(models.TransientModel):
|
||||
else:
|
||||
wizard.invoice_without_email = False
|
||||
|
||||
@api.multi
|
||||
def _send_email(self):
|
||||
if self.is_email:
|
||||
self.composer_id.send_mail()
|
||||
if self.env.context.get('mark_invoice_as_sent'):
|
||||
self.mapped('invoice_ids').write({'invoice_sent': True})
|
||||
|
||||
@api.multi
|
||||
def _print_document(self):
|
||||
""" to override for each type of models that will use this composer."""
|
||||
self.ensure_one()
|
||||
@@ -83,7 +80,6 @@ class AccountInvoiceSend(models.TransientModel):
|
||||
action.update({'close_on_report_download': True})
|
||||
return action
|
||||
|
||||
@api.multi
|
||||
def send_and_print_action(self):
|
||||
self.ensure_one()
|
||||
self._send_email()
|
||||
@@ -91,7 +87,6 @@ class AccountInvoiceSend(models.TransientModel):
|
||||
return self._print_document()
|
||||
return {'type': 'ir.actions.act_window_close'}
|
||||
|
||||
@api.multi
|
||||
def save_as_template(self):
|
||||
self.ensure_one()
|
||||
self.composer_id.save_as_template()
|
||||
|
||||
@@ -43,7 +43,6 @@ class AccountMoveReversal(models.TransientModel):
|
||||
currency_id = fields.Many2one(related='move_id.currency_id')
|
||||
move_type = fields.Selection(related='move_id.type')
|
||||
|
||||
@api.multi
|
||||
def reverse_moves(self):
|
||||
moves = self.move_id or self.env['account.move'].browse(self._context['active_ids'])
|
||||
|
||||
|
||||
@@ -36,7 +36,6 @@ class AccountCommonReport(models.TransientModel):
|
||||
def _print_report(self, data):
|
||||
raise NotImplementedError()
|
||||
|
||||
@api.multi
|
||||
def check_report(self):
|
||||
self.ensure_one()
|
||||
data = {}
|
||||
|
||||
@@ -10,7 +10,6 @@ class AccountCommonJournalReport(models.TransientModel):
|
||||
|
||||
amount_currency = fields.Boolean('With Currency', help="Print Report with the currency column if the currency differs from the company currency.")
|
||||
|
||||
@api.multi
|
||||
def pre_print_report(self, data):
|
||||
data['form'].update({'amount_currency': self.amount_currency})
|
||||
return data
|
||||
|
||||
@@ -5,7 +5,6 @@ class AccountUnreconcile(models.TransientModel):
|
||||
_name = "account.unreconcile"
|
||||
_description = "Account Unreconcile"
|
||||
|
||||
@api.multi
|
||||
def trans_unrec(self):
|
||||
context = dict(self._context or {})
|
||||
if context.get('active_ids', False):
|
||||
|
||||
@@ -6,7 +6,6 @@ class ValidateAccountMove(models.TransientModel):
|
||||
_name = "validate.account.move"
|
||||
_description = "Validate Account Move"
|
||||
|
||||
@api.multi
|
||||
def validate_move(self):
|
||||
context = dict(self._context or {})
|
||||
moves = self.env['account.move'].browse(context.get('active_ids'))
|
||||
|
||||
@@ -9,7 +9,6 @@ class CashBox(models.TransientModel):
|
||||
# in the context of the action
|
||||
amount = fields.Float(string='Amount', digits=0, required=True)
|
||||
|
||||
@api.multi
|
||||
def run(self):
|
||||
context = dict(self._context or {})
|
||||
active_model = context.get('active_model', False)
|
||||
@@ -19,7 +18,6 @@ class CashBox(models.TransientModel):
|
||||
|
||||
return self._run(records)
|
||||
|
||||
@api.multi
|
||||
def _run(self, records):
|
||||
for box in self:
|
||||
for record in records:
|
||||
@@ -44,7 +42,6 @@ class CashBoxIn(CashBox):
|
||||
|
||||
ref = fields.Char('Reference')
|
||||
|
||||
@api.multi
|
||||
def _calculate_values_for_statement_line(self, record):
|
||||
if not record.journal_id.company_id.transfer_account_id:
|
||||
raise UserError(_("You have to define an 'Internal Transfer Account' in your cash register's journal."))
|
||||
@@ -63,7 +60,6 @@ class CashBoxOut(CashBox):
|
||||
_name = 'cash.box.out'
|
||||
_description = 'Cash Box Out'
|
||||
|
||||
@api.multi
|
||||
def _calculate_values_for_statement_line(self, record):
|
||||
if not record.journal_id.company_id.transfer_account_id:
|
||||
raise UserError(_("You have to define an 'Internal Transfer Account' in your cash register's journal."))
|
||||
|
||||
@@ -40,7 +40,6 @@ class FinancialYearOpeningWizard(models.TransientModel):
|
||||
(wiz.fiscalyear_last_month, wiz.fiscalyear_last_day)
|
||||
)
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
# Amazing workaround: non-stored related fields on company are a BAD idea since the 3 fields
|
||||
# must follow the constraint '_check_fiscalyear_last_day'. The thing is, in case of related
|
||||
@@ -57,7 +56,6 @@ class FinancialYearOpeningWizard(models.TransientModel):
|
||||
vals.pop('fiscalyear_last_month', None)
|
||||
return super().write(vals)
|
||||
|
||||
@api.multi
|
||||
def action_save_onboarding_fiscal_year(self):
|
||||
self.env.company.set_onboarding_step_done('account_setup_fy_data_state')
|
||||
|
||||
|
||||
@@ -8,7 +8,6 @@ class TaxAdjustments(models.TransientModel):
|
||||
_name = 'tax.adjustments.wizard'
|
||||
_description = 'Tax Adjustments Wizard'
|
||||
|
||||
@api.multi
|
||||
def _get_default_journal(self):
|
||||
return self.env['account.journal'].search([('type', '=', 'general')], limit=1).id
|
||||
|
||||
|
||||
@@ -28,7 +28,6 @@ class AccountBankStatementImport(models.TransientModel):
|
||||
data_file = fields.Binary(string='Bank Statement File', attachment=False, required=True, help='Get you bank statements in electronic format from your bank and select them here.')
|
||||
filename = fields.Char()
|
||||
|
||||
@api.multi
|
||||
def import_file(self):
|
||||
""" Process the file chosen in the wizard, create bank statement(s) and go to reconciliation. """
|
||||
self.ensure_one()
|
||||
|
||||
@@ -20,7 +20,6 @@ class AccountJournal(models.Model):
|
||||
rslt.append(("file_import", _("Import") + "(" + import_formats_str + ")"))
|
||||
return rslt
|
||||
|
||||
@api.multi
|
||||
def import_statement(self):
|
||||
"""return action to import bank/cash statements. This button should be called only on journals with type =='bank'"""
|
||||
action_name = 'action_account_bank_statement_import'
|
||||
|
||||
@@ -9,7 +9,6 @@ class AccountBankStatementImportJounalCreation(models.TransientModel):
|
||||
|
||||
journal_id = fields.Many2one('account.journal', delegate=True, required=True, ondelete='cascade')
|
||||
|
||||
@api.multi
|
||||
def create_journal(self):
|
||||
""" Create the journal (the record is automatically created in the process of calling this method) and reprocess the statement """
|
||||
statement_import_transient = self.env['account.bank.statement.import'].browse(self.env.context['statement_import_transient_id'])
|
||||
|
||||
@@ -8,7 +8,6 @@ from odoo.exceptions import UserError
|
||||
class BankStatement(models.Model):
|
||||
_inherit = 'account.bank.statement'
|
||||
|
||||
@api.multi
|
||||
def button_draft(self):
|
||||
self.state = 'open'
|
||||
|
||||
|
||||
@@ -47,7 +47,6 @@ class AccountJournal(models.Model):
|
||||
rec._create_check_sequence()
|
||||
return rec
|
||||
|
||||
@api.multi
|
||||
@api.returns('self', lambda value: value.id)
|
||||
def copy(self, default=None):
|
||||
rec = super(AccountJournal, self).copy(default)
|
||||
@@ -82,7 +81,6 @@ class AccountJournal(models.Model):
|
||||
'outbound_payment_method_ids': [(4, check_printing.id, None)],
|
||||
})
|
||||
|
||||
@api.multi
|
||||
def get_journal_dashboard_datas(self):
|
||||
domain_checks_to_print = [
|
||||
('journal_id', '=', self.id),
|
||||
@@ -94,7 +92,6 @@ class AccountJournal(models.Model):
|
||||
num_checks_to_print=len(self.env['account.payment'].search(domain_checks_to_print))
|
||||
)
|
||||
|
||||
@api.multi
|
||||
def action_checks_to_print(self):
|
||||
return {
|
||||
'name': _('Checks to Print'),
|
||||
|
||||
@@ -50,7 +50,6 @@ class AccountPayment(models.Model):
|
||||
if len(communication) > 60:
|
||||
raise ValidationError(_("A check memo cannot exceed 60 characters."))
|
||||
|
||||
@api.multi
|
||||
def post(self):
|
||||
res = super(AccountPayment, self).post()
|
||||
payment_method_check = self.env.ref('account_check_printing.account_payment_method_check')
|
||||
@@ -59,7 +58,6 @@ class AccountPayment(models.Model):
|
||||
payment.check_number = sequence.next_by_id()
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def print_checks(self):
|
||||
""" Check that the recordset is valid, set the payments state to sent and call print_checks() """
|
||||
# Since this method can be called via a client_action_multi, we need to make sure the received records are what we expect
|
||||
@@ -94,11 +92,9 @@ class AccountPayment(models.Model):
|
||||
self.filtered(lambda r: r.state == 'draft').post()
|
||||
return self.do_print_checks()
|
||||
|
||||
@api.multi
|
||||
def unmark_sent(self):
|
||||
self.write({'state': 'posted'})
|
||||
|
||||
@api.multi
|
||||
def do_print_checks(self):
|
||||
""" This method is a hook for l10n_xx_check_printing modules to implement actual check printing capabilities """
|
||||
raise UserError(_("You have to choose a check layout. For this, go in Apps, search for 'Checks layout' and install one."))
|
||||
|
||||
@@ -6,7 +6,6 @@ from odoo import api, models
|
||||
class AccountChartTemplate(models.Model):
|
||||
_inherit = 'account.chart.template'
|
||||
|
||||
@api.multi
|
||||
def _create_bank_journals(self, company, acc_template_ref):
|
||||
'''
|
||||
When system automatically creates journals of bank and cash type when CoA is being installed
|
||||
|
||||
@@ -18,7 +18,6 @@ class PrintPreNumberedChecks(models.TransientModel):
|
||||
if check.next_check_number and not re.match(r'^[0-9]+$', check.next_check_number):
|
||||
raise ValidationError(_('Next Check Number should only contains numbers.'))
|
||||
|
||||
@api.multi
|
||||
def print_checks(self):
|
||||
check_number = int(self.next_check_number)
|
||||
payments = self.env['account.payment'].browse(self.env.context['payment_ids'])
|
||||
|
||||
@@ -22,7 +22,6 @@ DEFAULT_FACTURX_DATE_FORMAT = '%Y%m%d'
|
||||
class AccountMove(models.Model):
|
||||
_inherit = 'account.move'
|
||||
|
||||
@api.multi
|
||||
def _export_as_facturx_xml(self):
|
||||
''' Create the Factur-x xml file content.
|
||||
:return: The XML content as str.
|
||||
@@ -47,7 +46,6 @@ class AccountMove(models.Model):
|
||||
content = self.env.ref('account_facturx.account_invoice_facturx_export').render(template_values)
|
||||
return b"<?xml version='1.0' encoding='UTF-8'?>" + content
|
||||
|
||||
@api.multi
|
||||
def _import_facturx_invoice(self, tree):
|
||||
''' Extract invoice values from the Factur-x xml tree passed as parameter.
|
||||
|
||||
@@ -217,7 +215,6 @@ class AccountMove(models.Model):
|
||||
|
||||
return invoice_form.save()
|
||||
|
||||
@api.multi
|
||||
@api.returns('mail.message', lambda value: value.id)
|
||||
def message_post(self, **kwargs):
|
||||
# OVERRIDE
|
||||
@@ -302,7 +299,6 @@ class AccountMove(models.Model):
|
||||
# TO BE OVERWRITTEN
|
||||
return []
|
||||
|
||||
@api.multi
|
||||
def _create_invoice_from_xml(self, attachment):
|
||||
decoders = self._get_xml_decoders()
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@ import io
|
||||
class IrActionsReport(models.Model):
|
||||
_inherit = 'ir.actions.report'
|
||||
|
||||
@api.multi
|
||||
def _post_pdf(self, save_in_attachment, pdf_content=None, res_ids=None):
|
||||
# OVERRIDE
|
||||
if self.model == 'account.move' and res_ids and len(res_ids) == 1:
|
||||
|
||||
@@ -6,7 +6,6 @@ from odoo import models, api
|
||||
class ResCompany(models.Model):
|
||||
_inherit = 'res.company'
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
# fiscalyear_lock_date can't be set to a prior date
|
||||
if 'fiscalyear_lock_date' in vals or 'period_lock_date' in vals:
|
||||
|
||||
@@ -35,7 +35,6 @@ class AccountTaxPython(models.Model):
|
||||
return localdict['result']
|
||||
return super(AccountTaxPython, self)._compute_amount(base_amount, price_unit, quantity, product, partner)
|
||||
|
||||
@api.multi
|
||||
def compute_all(self, price_unit, currency=None, quantity=1.0, product=None, partner=None, is_refund=False, handle_price_include=True):
|
||||
taxes = self.filtered(lambda r: r.amount_type != 'code')
|
||||
company = self.env.company
|
||||
|
||||
@@ -78,7 +78,6 @@ class AccountAnalyticAccount(models.Model):
|
||||
line['credit'] = sum(accounts.mapped('credit'))
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def _compute_debit_credit_balance(self):
|
||||
Curr = self.env['res.currency']
|
||||
analytic_line_obj = self.env['account.analytic.line']
|
||||
@@ -140,7 +139,6 @@ class AccountAnalyticAccount(models.Model):
|
||||
|
||||
currency_id = fields.Many2one(related="company_id.currency_id", string="Currency", readonly=True)
|
||||
|
||||
@api.multi
|
||||
def name_get(self):
|
||||
res = []
|
||||
for analytic in self:
|
||||
@@ -190,7 +188,6 @@ class AccountAnalyticLine(models.Model):
|
||||
currency_id = fields.Many2one(related="company_id.currency_id", string="Currency", readonly=True, store=True, compute_sudo=True)
|
||||
group_id = fields.Many2one('account.analytic.group', related='account_id.group_id', store=True, readonly=True, compute_sudo=True)
|
||||
|
||||
@api.multi
|
||||
@api.constrains('company_id', 'account_id')
|
||||
def _check_company_id(self):
|
||||
for line in self:
|
||||
|
||||
@@ -17,7 +17,6 @@ class ResConfigSettings(models.TransientModel):
|
||||
auth_signup_template_user_id = fields.Many2one('res.users', string='Template user for new users created through signup',
|
||||
config_parameter='base.template_portal_user_id')
|
||||
|
||||
@api.multi
|
||||
def open_template_user(self):
|
||||
action = self.env.ref('base.action_res_users').read()[0]
|
||||
action['res_id'] = literal_eval(self.env['ir.config_parameter'].sudo().get_param('base.template_portal_user_id', 'False'))
|
||||
|
||||
@@ -30,7 +30,6 @@ class ResPartner(models.Model):
|
||||
signup_valid = fields.Boolean(compute='_compute_signup_valid', string='Signup Token is Valid')
|
||||
signup_url = fields.Char(compute='_compute_signup_url', string='Signup URL')
|
||||
|
||||
@api.multi
|
||||
@api.depends('signup_token', 'signup_expiration')
|
||||
def _compute_signup_valid(self):
|
||||
dt = now()
|
||||
@@ -38,7 +37,6 @@ class ResPartner(models.Model):
|
||||
partner.signup_valid = bool(partner_sudo.signup_token) and \
|
||||
(not partner_sudo.signup_expiration or dt <= partner_sudo.signup_expiration)
|
||||
|
||||
@api.multi
|
||||
def _compute_signup_url(self):
|
||||
""" proxy for function field towards actual implementation """
|
||||
result = self.sudo()._get_signup_url_for_action()
|
||||
@@ -47,7 +45,6 @@ class ResPartner(models.Model):
|
||||
self.env['res.users'].check_access_rights('write')
|
||||
partner.signup_url = result.get(partner.id, False)
|
||||
|
||||
@api.multi
|
||||
def _get_signup_url_for_action(self, url=None, action=None, view_type=None, menu_id=None, res_id=None, model=None):
|
||||
""" generate a signup url for the given partner ids and action, possibly overriding
|
||||
the url state components (menu_id, id, view_type) """
|
||||
@@ -101,7 +98,6 @@ class ResPartner(models.Model):
|
||||
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def action_signup_prepare(self):
|
||||
return self.signup_prepare()
|
||||
|
||||
@@ -121,11 +117,9 @@ class ResPartner(models.Model):
|
||||
res[partner.id]['auth_login'] = partner.user_ids[0].login
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def signup_cancel(self):
|
||||
return self.write({'signup_token': False, 'signup_type': False, 'signup_expiration': False})
|
||||
|
||||
@api.multi
|
||||
def signup_prepare(self, signup_type="signup", expiration=False):
|
||||
""" generate a new token for the partners with the given validity, if necessary
|
||||
:param expiration: the expiration datetime of the token (string, optional)
|
||||
|
||||
@@ -48,7 +48,6 @@ class ResUsers(models.Model):
|
||||
|
||||
return expression.TRUE_DOMAIN
|
||||
|
||||
@api.multi
|
||||
def _compute_state(self):
|
||||
for user in self:
|
||||
user.state = 'active' if user.login_date else 'new'
|
||||
@@ -119,7 +118,6 @@ class ResUsers(models.Model):
|
||||
raise SignupError(_('Signup is not allowed for uninvited users'))
|
||||
return self._create_user_from_template(values)
|
||||
|
||||
@api.multi
|
||||
def _notify_inviter(self):
|
||||
for user in self:
|
||||
invite_partner = user.create_uid.partner_id
|
||||
@@ -165,7 +163,6 @@ class ResUsers(models.Model):
|
||||
raise Exception(_('Reset password: invalid username or email'))
|
||||
return users.action_reset_password()
|
||||
|
||||
@api.multi
|
||||
def action_reset_password(self):
|
||||
""" create signup token for each user, and send their signup url by email """
|
||||
# prepare reset password signup
|
||||
@@ -203,7 +200,6 @@ class ResUsers(models.Model):
|
||||
template.with_context(lang=user.lang).send_mail(user.id, force_send=True, raise_exception=True)
|
||||
_logger.info("Password reset email sent for user <%s> to <%s>", user.login, user.email)
|
||||
|
||||
@api.multi
|
||||
def send_unregistered_user_reminder(self, after_days=5):
|
||||
datetime_min = fields.Datetime.today() - relativedelta(days=after_days)
|
||||
datetime_max = datetime_min + relativedelta(hours=23, minutes=59, seconds=59)
|
||||
@@ -245,7 +241,6 @@ class ResUsers(models.Model):
|
||||
user.partner_id.with_context(create_user=True).signup_cancel()
|
||||
return user
|
||||
|
||||
@api.multi
|
||||
@api.returns('self', lambda value: value.id)
|
||||
def copy(self, default=None):
|
||||
self.ensure_one()
|
||||
|
||||
@@ -42,7 +42,6 @@ class Partner(models.Model):
|
||||
Overwrite this function if you want to add your own fields."""
|
||||
return STREET_FIELDS
|
||||
|
||||
@api.multi
|
||||
def _set_street(self):
|
||||
"""Updates the street field.
|
||||
Writes the `street` field on the partners when one of the sub-fields in STREET_FIELDS
|
||||
@@ -121,7 +120,6 @@ class Partner(models.Model):
|
||||
return vals
|
||||
|
||||
|
||||
@api.multi
|
||||
@api.depends('street')
|
||||
def _split_street(self):
|
||||
"""Splits street value into sub-fields.
|
||||
|
||||
@@ -102,7 +102,6 @@ class BaseAutomation(models.Model):
|
||||
self._update_registry()
|
||||
return base_automation
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
res = super(BaseAutomation, self).write(vals)
|
||||
if set(vals).intersection(self.CRITICAL_FIELDS):
|
||||
@@ -110,7 +109,6 @@ class BaseAutomation(models.Model):
|
||||
self._update_registry()
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
res = super(BaseAutomation, self).unlink()
|
||||
self._update_cron()
|
||||
@@ -265,7 +263,6 @@ class BaseAutomation(models.Model):
|
||||
# Note: we patch method _write() instead of write() in order to
|
||||
# catch updates made by field recomputations.
|
||||
#
|
||||
@api.multi
|
||||
def _write(self, vals, **kw):
|
||||
# retrieve the action rules to possibly execute
|
||||
actions = self.env['base.automation']._get_actions(self, ['on_write', 'on_create_or_write'])
|
||||
@@ -289,7 +286,6 @@ class BaseAutomation(models.Model):
|
||||
|
||||
def make_unlink():
|
||||
""" Instanciate an unlink method that processes action rules. """
|
||||
@api.multi
|
||||
def unlink(self, **kwargs):
|
||||
# retrieve the action rules to possibly execute
|
||||
actions = self.env['base.automation']._get_actions(self, ['on_unlink'])
|
||||
|
||||
@@ -54,7 +54,6 @@ class BaseGengoTranslations(models.TransientModel):
|
||||
icp = self.env['ir.config_parameter'].sudo()
|
||||
return icp.get_param(self.GENGO_KEY, default="Undefined")
|
||||
|
||||
@api.multi
|
||||
def open_company(self):
|
||||
self.ensure_one()
|
||||
return {
|
||||
@@ -92,7 +91,6 @@ class BaseGengoTranslations(models.TransientModel):
|
||||
_logger.exception('Gengo connection failed')
|
||||
return (False, _("Gengo connection failed with this message:\n``%s``") % e)
|
||||
|
||||
@api.multi
|
||||
def act_update(self):
|
||||
'''
|
||||
Function called by the wizard.
|
||||
|
||||
@@ -16,7 +16,6 @@ class ResPartner(models.Model):
|
||||
result = geo_obj.geo_find(search, force_country=country)
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def geo_localize(self):
|
||||
# We need country names in English below
|
||||
for partner in self.with_context(lang='en_US'):
|
||||
|
||||
@@ -77,7 +77,6 @@ class ResPartnerBank(models.Model):
|
||||
pass
|
||||
return super(ResPartnerBank, self).create(vals)
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
if vals.get('acc_number'):
|
||||
try:
|
||||
|
||||
@@ -223,7 +223,6 @@ class Import(models.TransientModel):
|
||||
# TODO: cache on model?
|
||||
return importable_fields
|
||||
|
||||
@api.multi
|
||||
def _read_file(self, options):
|
||||
""" Dispatch to specific method to read file content, according to its mimetype or file type
|
||||
:param options : dict of reading options (quoting, separator, ...)
|
||||
@@ -261,7 +260,6 @@ class Import(models.TransientModel):
|
||||
raise ImportError(_("Unable to load \"{extension}\" file: requires Python module \"{modname}\"").format(extension=file_extension, modname=req))
|
||||
raise ValueError(_("Unsupported file format \"{}\", import only supports CSV, ODS, XLS and XLSX").format(self.file_type))
|
||||
|
||||
@api.multi
|
||||
def _read_xls(self, options):
|
||||
""" Read file content, using xlrd lib """
|
||||
book = xlrd.open_workbook(file_contents=self.file or b'')
|
||||
@@ -307,7 +305,6 @@ class Import(models.TransientModel):
|
||||
# use the same method for xlsx and xls files
|
||||
_read_xlsx = _read_xls
|
||||
|
||||
@api.multi
|
||||
def _read_ods(self, options):
|
||||
""" Read file content using ODSReader custom lib """
|
||||
doc = odf_ods_reader.ODSReader(file=io.BytesIO(self.file or b''))
|
||||
@@ -318,7 +315,6 @@ class Import(models.TransientModel):
|
||||
if any(x for x in row if x.strip())
|
||||
)
|
||||
|
||||
@api.multi
|
||||
def _read_csv(self, options):
|
||||
""" Returns a CSV-parsed iterator of all non-empty lines in the file
|
||||
:throws csv.Error: if an error is detected during CSV parsing
|
||||
@@ -561,7 +557,6 @@ class Import(models.TransientModel):
|
||||
matches[index] = match_field or None
|
||||
return headers, matches
|
||||
|
||||
@api.multi
|
||||
def parse_preview(self, options, count=10):
|
||||
""" Generates a preview of the uploaded files, and performs
|
||||
fields-matching between the import's file data and the model's
|
||||
@@ -737,7 +732,6 @@ class Import(models.TransientModel):
|
||||
decimal_separator = options.get('float_decimal_separator', '.')
|
||||
return thousand_separator, decimal_separator
|
||||
|
||||
@api.multi
|
||||
def _parse_import_data(self, data, import_fields, options):
|
||||
""" Lauch first call to _parse_import_data_recursive with an
|
||||
empty prefix. _parse_import_data_recursive will be run
|
||||
@@ -745,7 +739,6 @@ class Import(models.TransientModel):
|
||||
"""
|
||||
return self._parse_import_data_recursive(self.res_model, '', data, import_fields, options)
|
||||
|
||||
@api.multi
|
||||
def _parse_import_data_recursive(self, model, prefix, data, import_fields, options):
|
||||
# Get fields of type date/datetime
|
||||
all_fields = self.env[model].fields_get()
|
||||
@@ -845,7 +838,6 @@ class Import(models.TransientModel):
|
||||
'error': e
|
||||
})
|
||||
|
||||
@api.multi
|
||||
def do(self, fields, columns, options, dryrun=False):
|
||||
""" Actual execution of the import
|
||||
|
||||
|
||||
@@ -14,7 +14,6 @@ class BaseImportModule(models.TransientModel):
|
||||
import_message = fields.Text()
|
||||
force = fields.Boolean(string='Force init', help="Force init mode even if installed. (will update `noupdate='1'` records)")
|
||||
|
||||
@api.multi
|
||||
def import_module(self):
|
||||
self.ensure_one()
|
||||
IrModule = self.env['ir.module.module']
|
||||
@@ -35,7 +34,6 @@ class BaseImportModule(models.TransientModel):
|
||||
'context': context,
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def action_module_open(self):
|
||||
self.ensure_one()
|
||||
return {
|
||||
|
||||
@@ -31,7 +31,6 @@ class IrModule(models.Model):
|
||||
module.installed_version = module.latest_version
|
||||
super(IrModule, self - imported_modules)._get_latest_version()
|
||||
|
||||
@api.multi
|
||||
def _import_module(self, module, path, force=False):
|
||||
known_mods = self.search([])
|
||||
known_mods_names = {m.name: m for m in known_mods}
|
||||
|
||||
@@ -53,12 +53,10 @@ class ResConfigSettings(models.TransientModel):
|
||||
)
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def set_values(self):
|
||||
super(ResConfigSettings, self).set_values()
|
||||
self.env.ref('base.res_partner_rule').write({'active': not self.company_share_partner})
|
||||
|
||||
@api.multi
|
||||
def open_company(self):
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
@@ -68,7 +66,6 @@ class ResConfigSettings(models.TransientModel):
|
||||
'res_id': self.env.company.id,
|
||||
'target': 'current',
|
||||
}
|
||||
@api.multi
|
||||
def open_default_user(self):
|
||||
action = self.env.ref('base.action_res_users').read()[0]
|
||||
action['res_id'] = self.env.ref('base.default_user').id
|
||||
@@ -85,13 +82,11 @@ class ResConfigSettings(models.TransientModel):
|
||||
'res_id': template_id.id,
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def edit_external_header(self):
|
||||
if not self.external_report_layout_id:
|
||||
return False
|
||||
return self._prepare_report_view_action(self.external_report_layout_id.key)
|
||||
|
||||
@api.multi
|
||||
def change_report_template(self):
|
||||
self.ensure_one()
|
||||
template = self.env.ref('base.view_company_document_template_form')
|
||||
|
||||
@@ -15,7 +15,6 @@ class IrModelFields(models.Model):
|
||||
"This cannot be changed after creation.",
|
||||
)
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
# Limitation: renaming a sparse field or changing the storing system is
|
||||
# currently not allowed
|
||||
|
||||
@@ -414,7 +414,6 @@ class ResPartner(models.Model):
|
||||
values['vat'] = self._fix_vat_number(values['vat'])
|
||||
return super(ResPartner, self).create(values)
|
||||
|
||||
@api.multi
|
||||
def write(self, values):
|
||||
if values.get('vat'):
|
||||
values['vat'] = self._fix_vat_number(values['vat'])
|
||||
|
||||
@@ -10,7 +10,6 @@ class ResPartner(models.Model):
|
||||
|
||||
im_status = fields.Char('IM Status', compute='_compute_im_status')
|
||||
|
||||
@api.multi
|
||||
def _compute_im_status(self):
|
||||
self.env.cr.execute("""
|
||||
SELECT
|
||||
|
||||
@@ -11,7 +11,6 @@ class ResUsers(models.Model):
|
||||
|
||||
im_status = fields.Char('IM Status', compute='_compute_im_status')
|
||||
|
||||
@api.multi
|
||||
def _compute_im_status(self):
|
||||
""" Compute the im_status of the users """
|
||||
self.env.cr.execute("""
|
||||
|
||||
@@ -154,12 +154,10 @@ class Attendee(models.Model):
|
||||
values['common_name'] = values.get("common_name")
|
||||
return super(Attendee, self).create(vals_list)
|
||||
|
||||
@api.multi
|
||||
@api.returns('self', lambda value: value.id)
|
||||
def copy(self, default=None):
|
||||
raise UserError(_('You cannot duplicate a calendar attendee.'))
|
||||
|
||||
@api.multi
|
||||
def _send_mail_to_attendees(self, template_xmlid, force_send=False):
|
||||
""" Send mail for event invitation to event attendees.
|
||||
:param template_xmlid: xml id of the email template to use to send the invitation
|
||||
@@ -216,12 +214,10 @@ class Attendee(models.Model):
|
||||
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def do_tentative(self):
|
||||
""" Makes event invitation as Tentative. """
|
||||
return self.write({'state': 'tentative'})
|
||||
|
||||
@api.multi
|
||||
def do_accept(self):
|
||||
""" Marks event invitation as Accepted. """
|
||||
result = self.write({'state': 'accepted'})
|
||||
@@ -230,7 +226,6 @@ class Attendee(models.Model):
|
||||
attendee.event_id.message_post(body=_("%s has accepted invitation") % (attendee.common_name), subtype="calendar.subtype_invitation")
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def do_decline(self):
|
||||
""" Marks event invitation as Declined. """
|
||||
res = self.write({'state': 'declined'})
|
||||
@@ -519,13 +514,11 @@ class Alarm(models.Model):
|
||||
self._update_cron()
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def write(self, values):
|
||||
result = super(Alarm, self).write(values)
|
||||
self._update_cron()
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
result = super(Alarm, self).unlink()
|
||||
self._update_cron()
|
||||
@@ -588,14 +581,12 @@ class Meeting(models.Model):
|
||||
partners |= self.env['res.partner'].browse(active_id)
|
||||
return partners
|
||||
|
||||
@api.multi
|
||||
def _get_recurrent_dates_by_event(self):
|
||||
""" Get recurrent start and stop dates based on Rule string"""
|
||||
start_dates = self._get_recurrent_date_by_event(date_field='start')
|
||||
stop_dates = self._get_recurrent_date_by_event(date_field='stop')
|
||||
return list(zip(start_dates, stop_dates))
|
||||
|
||||
@api.multi
|
||||
def _get_recurrent_date_by_event(self, date_field='start'):
|
||||
""" Get recurrent dates based on Rule string and all event where recurrent_id is child
|
||||
|
||||
@@ -648,7 +639,6 @@ class Meeting(models.Model):
|
||||
return timezone.localize(d.replace(tzinfo=None), is_dst=True).astimezone(pytz.UTC)
|
||||
return [naive_tz_to_utc(d) if not use_naive_datetime else d for d in rset1 if d.year < MAXYEAR]
|
||||
|
||||
@api.multi
|
||||
def _get_recurrency_end_date(self):
|
||||
""" Return the last date a recurring event happens, according to its end_type. """
|
||||
self.ensure_one()
|
||||
@@ -678,7 +668,6 @@ class Meeting(models.Model):
|
||||
return computed_final_date or deadline
|
||||
return final_date
|
||||
|
||||
@api.multi
|
||||
def _find_my_attendee(self):
|
||||
""" Return the first attendee where the user connected has been invited
|
||||
from all the meeting_ids in parameters.
|
||||
@@ -860,25 +849,21 @@ class Meeting(models.Model):
|
||||
alarm_ids = fields.Many2many('calendar.alarm', 'calendar_alarm_calendar_event_rel', string='Reminders', ondelete="restrict", copy=False)
|
||||
is_highlighted = fields.Boolean(compute='_compute_is_highlighted', string='Is the Event Highlighted')
|
||||
|
||||
@api.multi
|
||||
def _compute_attendee(self):
|
||||
for meeting in self:
|
||||
attendee = meeting._find_my_attendee()
|
||||
meeting.is_attendee = bool(attendee)
|
||||
meeting.attendee_status = attendee.state if attendee else 'needsAction'
|
||||
|
||||
@api.multi
|
||||
def _compute_display_time(self):
|
||||
for meeting in self:
|
||||
meeting.display_time = self._get_display_time(meeting.start, meeting.stop, meeting.duration, meeting.allday)
|
||||
|
||||
@api.multi
|
||||
@api.depends('allday', 'start_date', 'start_datetime')
|
||||
def _compute_display_start(self):
|
||||
for meeting in self:
|
||||
meeting.display_start = meeting.start_date if meeting.allday else meeting.start_datetime
|
||||
|
||||
@api.multi
|
||||
@api.depends('allday', 'start', 'stop')
|
||||
def _compute_dates(self):
|
||||
""" Adapt the value of start_date(time)/stop_date(time) according to start/stop fields and allday. Also, compute
|
||||
@@ -900,7 +885,6 @@ class Meeting(models.Model):
|
||||
|
||||
meeting.duration = self._get_duration(meeting.start, meeting.stop)
|
||||
|
||||
@api.multi
|
||||
def _inverse_dates(self):
|
||||
for meeting in self:
|
||||
if meeting.allday:
|
||||
@@ -935,7 +919,6 @@ class Meeting(models.Model):
|
||||
else:
|
||||
meeting.rrule = ''
|
||||
|
||||
@api.multi
|
||||
def _inverse_rrule(self):
|
||||
for meeting in self:
|
||||
if meeting.rrule:
|
||||
@@ -983,7 +966,6 @@ class Meeting(models.Model):
|
||||
# Calendar Business, Reccurency, ...
|
||||
####################################################
|
||||
|
||||
@api.multi
|
||||
def _get_ics_file(self):
|
||||
""" Returns iCalendar file for the event invitation.
|
||||
:returns a dict of .ics file content for each meeting
|
||||
@@ -1044,7 +1026,6 @@ class Meeting(models.Model):
|
||||
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def create_attendees(self):
|
||||
current_user = self.env.user
|
||||
result = {}
|
||||
@@ -1095,7 +1076,6 @@ class Meeting(models.Model):
|
||||
}
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def get_search_fields(self, order_fields, r_date=None):
|
||||
sort_fields = {}
|
||||
for field in order_fields:
|
||||
@@ -1113,7 +1093,6 @@ class Meeting(models.Model):
|
||||
sort_fields['sort_start'] = display_start.replace(' ', '').replace('-', '') if display_start else False
|
||||
return sort_fields
|
||||
|
||||
@api.multi
|
||||
def get_recurrent_ids(self, domain, order=None):
|
||||
""" Gives virtual event ids for recurring events. This method gives ids of dates
|
||||
that comes between start date and end date of calendar views
|
||||
@@ -1240,7 +1219,6 @@ class Meeting(models.Model):
|
||||
]
|
||||
return [r['id'] for r in sorted(result_data, key=key)]
|
||||
|
||||
@api.multi
|
||||
def _rrule_serialize(self):
|
||||
""" Compute rule string according to value type RECUR of iCalendar
|
||||
:return: string containing recurring rule (empty if no rule)
|
||||
@@ -1351,7 +1329,6 @@ class Meeting(models.Model):
|
||||
data['end_type'] = 'end_date'
|
||||
return data
|
||||
|
||||
@api.multi
|
||||
def get_interval(self, interval, tz=None):
|
||||
""" Format and localize some dates to be used in email templates
|
||||
:param string interval: Among 'day', 'month', 'dayname' and 'time' indicating the desired formatting
|
||||
@@ -1385,7 +1362,6 @@ class Meeting(models.Model):
|
||||
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def get_display_time_tz(self, tz=False):
|
||||
""" get the display_time of the meeting, forcing the timezone. This method is called from email template, to not use sudo(). """
|
||||
self.ensure_one()
|
||||
@@ -1393,7 +1369,6 @@ class Meeting(models.Model):
|
||||
self = self.with_context(tz=tz)
|
||||
return self._get_display_time(self.start, self.stop, self.duration, self.allday)
|
||||
|
||||
@api.multi
|
||||
def detach_recurring_event(self, values=None):
|
||||
""" Detach a virtual recurring event by duplicating the original and change reccurent values
|
||||
:param values : dict of value to override on the detached event
|
||||
@@ -1422,7 +1397,6 @@ class Meeting(models.Model):
|
||||
del data['id']
|
||||
return meeting_origin.copy(default=data)
|
||||
|
||||
@api.multi
|
||||
def action_detach_recurring_event(self):
|
||||
meeting = self.detach_recurring_event()
|
||||
return {
|
||||
@@ -1434,13 +1408,11 @@ class Meeting(models.Model):
|
||||
'flags': {'form': {'action_buttons': True, 'options': {'mode': 'edit'}}}
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def action_open_calendar_event(self):
|
||||
if self.res_model and self.res_id:
|
||||
return self.env[self.res_model].browse(self.res_id).get_formview_action()
|
||||
return False
|
||||
|
||||
@api.multi
|
||||
def action_sendmail(self):
|
||||
email = self.env.user.email
|
||||
if email:
|
||||
@@ -1452,7 +1424,6 @@ class Meeting(models.Model):
|
||||
# Messaging
|
||||
####################################################
|
||||
|
||||
@api.multi
|
||||
def _get_message_unread(self):
|
||||
id_map = {x: calendar_id2real_id(x) for x in self.ids}
|
||||
real = self.browse(set(id_map.values()))
|
||||
@@ -1464,7 +1435,6 @@ class Meeting(models.Model):
|
||||
event.message_unread_counter = rec.message_unread_counter
|
||||
event.message_unread = rec.message_unread
|
||||
|
||||
@api.multi
|
||||
def _get_message_needaction(self):
|
||||
id_map = {x: calendar_id2real_id(x) for x in self.ids}
|
||||
real = self.browse(set(id_map.values()))
|
||||
@@ -1476,7 +1446,6 @@ class Meeting(models.Model):
|
||||
event.message_needaction_counter = rec.message_needaction_counter
|
||||
event.message_needaction = rec.message_needaction
|
||||
|
||||
@api.multi
|
||||
@api.returns('mail.message', lambda value: value.id)
|
||||
def message_post(self, **kwargs):
|
||||
thread_id = self.id
|
||||
@@ -1488,17 +1457,14 @@ class Meeting(models.Model):
|
||||
self = self.with_context(context)
|
||||
return super(Meeting, self.browse(thread_id)).message_post(**kwargs)
|
||||
|
||||
@api.multi
|
||||
def message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None):
|
||||
records = self.browse(get_real_ids(self.ids))
|
||||
return super(Meeting, records).message_subscribe(partner_ids=partner_ids, channel_ids=channel_ids, subtype_ids=subtype_ids)
|
||||
|
||||
@api.multi
|
||||
def _message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None, customer_ids=None):
|
||||
records = self.browse(get_real_ids(self.ids))
|
||||
return super(Meeting, records)._message_subscribe(partner_ids=partner_ids, channel_ids=channel_ids, subtype_ids=subtype_ids, customer_ids=customer_ids)
|
||||
|
||||
@api.multi
|
||||
def message_unsubscribe(self, partner_ids=None, channel_ids=None):
|
||||
records = self.browse(get_real_ids(self.ids))
|
||||
return super(Meeting, records).message_unsubscribe(partner_ids=partner_ids, channel_ids=channel_ids)
|
||||
@@ -1507,7 +1473,6 @@ class Meeting(models.Model):
|
||||
# ORM Overrides
|
||||
####################################################
|
||||
|
||||
@api.multi
|
||||
def get_metadata(self):
|
||||
real = self.browse({calendar_id2real_id(x) for x in self.ids})
|
||||
return super(Meeting, real).get_metadata()
|
||||
@@ -1521,7 +1486,6 @@ class Meeting(models.Model):
|
||||
arg[2][n] = calendar_id.split('-')[0]
|
||||
return super(Meeting, self)._name_search(name=name, args=args, operator=operator, limit=limit, name_get_uid=name_get_uid)
|
||||
|
||||
@api.multi
|
||||
def write(self, values):
|
||||
# FIXME: neverending recurring events
|
||||
if 'rrule' in values:
|
||||
@@ -1640,7 +1604,6 @@ class Meeting(models.Model):
|
||||
self.env['calendar.alarm_manager']._notify_next_alarm(meeting.partner_ids.ids)
|
||||
return meeting
|
||||
|
||||
@api.multi
|
||||
def export_data(self, fields_to_export, raw_data=False):
|
||||
""" Override to convert virtual ids to ids """
|
||||
records = self.browse(set(get_real_ids(self.ids)))
|
||||
@@ -1652,7 +1615,6 @@ class Meeting(models.Model):
|
||||
raise UserError(_('Group by date is not supported, use the calendar view instead.'))
|
||||
return super(Meeting, self.with_context(virtual_id=False)).read_group(domain, fields, groupby, offset=offset, limit=limit, orderby=orderby, lazy=lazy)
|
||||
|
||||
@api.multi
|
||||
def read(self, fields=None, load='_classic_read'):
|
||||
if not fields:
|
||||
fields = list(self._fields)
|
||||
@@ -1714,7 +1676,6 @@ class Meeting(models.Model):
|
||||
del r[k]
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def unlink(self, can_be_deleted=True):
|
||||
# Get concerned attendees to notify them if there is an alarm on the unlinked events,
|
||||
# as it might have changed their next event notification
|
||||
@@ -1784,7 +1745,6 @@ class Meeting(models.Model):
|
||||
return events[offset: offset + limit].ids
|
||||
return events.ids
|
||||
|
||||
@api.multi
|
||||
@api.returns('self', lambda value: value.id)
|
||||
def copy(self, default=None):
|
||||
self.ensure_one()
|
||||
|
||||
@@ -20,7 +20,6 @@ class Attachment(models.Model):
|
||||
args[index] = (args[index][0], args[index][1], get_real_ids(args[index][2]))
|
||||
return super(Attachment, self)._search(args, offset=offset, limit=limit, order=order, count=count, access_rights_uid=access_rights_uid)
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
""" When posting an attachment (new or not), convert the virtual ids in real ids. """
|
||||
if isinstance(vals.get('res_id'), str):
|
||||
|
||||
@@ -15,7 +15,6 @@ class MailActivity(models.Model):
|
||||
|
||||
calendar_event_id = fields.Many2one('calendar.event', string="Calendar Meeting", ondelete='cascade')
|
||||
|
||||
@api.multi
|
||||
def action_create_calendar_event(self):
|
||||
self.ensure_one()
|
||||
action = self.env.ref('calendar.action_calendar_event').read()[0]
|
||||
|
||||
@@ -13,7 +13,6 @@ class Partner(models.Model):
|
||||
|
||||
calendar_last_notif_ack = fields.Datetime('Last notification marked as read from base Calendar', default=fields.Datetime.now)
|
||||
|
||||
@api.multi
|
||||
def get_attendee_detail(self, meeting_id):
|
||||
""" Return a list of tuple (id, name, status)
|
||||
Used by base_calendar.js : Many2ManyAttendee
|
||||
|
||||
@@ -167,7 +167,6 @@ class Lead(models.Model):
|
||||
stage_ids = stages._search(search_domain, order=order, access_rights_uid=SUPERUSER_ID)
|
||||
return stages.browse(stage_ids)
|
||||
|
||||
@api.multi
|
||||
def _compute_kanban_state(self):
|
||||
today = date.today()
|
||||
for lead in self:
|
||||
@@ -234,7 +233,6 @@ class Lead(models.Model):
|
||||
break
|
||||
lead.email_state = email_state
|
||||
|
||||
@api.multi
|
||||
def _compute_meeting_count(self):
|
||||
meeting_data = self.env['calendar.event'].read_group([('opportunity_id', 'in', self.ids)], ['opportunity_id'], ['opportunity_id'])
|
||||
mapped_data = {m['opportunity_id'][0]: m['opportunity_id_count'] for m in meeting_data}
|
||||
@@ -335,7 +333,6 @@ class Lead(models.Model):
|
||||
self._onchange_compute_probability(optional_field_name='email_state')
|
||||
|
||||
@api.constrains('user_id')
|
||||
@api.multi
|
||||
def _valid_team(self):
|
||||
for lead in self:
|
||||
if lead.user_id:
|
||||
@@ -396,7 +393,6 @@ class Lead(models.Model):
|
||||
result._write_probability(vals)
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
# stage change:
|
||||
if 'stage_id' in vals:
|
||||
@@ -441,7 +437,6 @@ class Lead(models.Model):
|
||||
super(Lead, lead).write(proba_vals)
|
||||
return
|
||||
|
||||
@api.multi
|
||||
@api.returns('self', lambda value: value.id)
|
||||
def copy(self, default=None):
|
||||
self.ensure_one()
|
||||
@@ -473,13 +468,11 @@ class Lead(models.Model):
|
||||
# Actions Methods
|
||||
# ----------------------------------------
|
||||
|
||||
@api.multi
|
||||
def action_set_lost(self):
|
||||
""" Lost semantic: probability = 0 or active = False """
|
||||
result = self.write({'active': False, 'probability': 0})
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def action_set_won(self):
|
||||
""" Won semantic: probability = 100 (active untouched) """
|
||||
for lead in self:
|
||||
@@ -490,7 +483,6 @@ class Lead(models.Model):
|
||||
def action_set_automated_probability(self):
|
||||
self.write({'probability': self.automated_probability})
|
||||
|
||||
@api.multi
|
||||
def action_set_won_rainbowman(self):
|
||||
self.ensure_one()
|
||||
self.action_set_won()
|
||||
@@ -542,7 +534,6 @@ class Lead(models.Model):
|
||||
}
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def action_schedule_meeting(self):
|
||||
""" Open meeting's calendar view to schedule meeting on current opportunity.
|
||||
:return dict: dictionary value for created Meeting view
|
||||
@@ -561,11 +552,9 @@ class Lead(models.Model):
|
||||
}
|
||||
return action
|
||||
|
||||
@api.multi
|
||||
def close_dialog(self):
|
||||
return {'type': 'ir.actions.act_window_close'}
|
||||
|
||||
@api.multi
|
||||
def edit_dialog(self):
|
||||
form_view = self.env.ref('crm.crm_case_form_view_oppor')
|
||||
return {
|
||||
@@ -606,7 +595,6 @@ class Lead(models.Model):
|
||||
# perform search, return the first found
|
||||
return self.env['crm.stage'].search(search_domain, order=order, limit=1)
|
||||
|
||||
@api.multi
|
||||
def _merge_get_result_type(self):
|
||||
""" Define the type of the result of the merge. If at least one of the
|
||||
element to merge is an opp, the resulting new element will be an opp.
|
||||
@@ -622,7 +610,6 @@ class Lead(models.Model):
|
||||
return 'opportunity'
|
||||
return 'lead'
|
||||
|
||||
@api.multi
|
||||
def _merge_data(self, fields):
|
||||
""" Prepare lead/opp data into a dictionary for merging. Different types
|
||||
of fields are processed in different ways:
|
||||
@@ -696,7 +683,6 @@ class Lead(models.Model):
|
||||
bodies.append("<br/>".join(body + ['<br/>']))
|
||||
return bodies
|
||||
|
||||
@api.multi
|
||||
def _merge_notify(self, opportunities):
|
||||
""" Create a message gathering merged leads/opps informations. Using message_post, send a
|
||||
message explaining which fields has been merged and their new value. `self` is the
|
||||
@@ -715,7 +701,6 @@ class Lead(models.Model):
|
||||
message_body = "\n\n".join(message_bodies)
|
||||
return self.message_post(body=message_body, subject=subject)
|
||||
|
||||
@api.multi
|
||||
def _merge_opportunity_history(self, opportunities):
|
||||
""" Move mail.message from the given opportunities to the current one. `self` is the
|
||||
crm.lead record destination for message of `opportunities`.
|
||||
@@ -730,7 +715,6 @@ class Lead(models.Model):
|
||||
})
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def _merge_opportunity_attachments(self, opportunities):
|
||||
""" Move attachments of given opportunities to the current one `self`, and rename
|
||||
the attachments having same name than native ones.
|
||||
@@ -756,7 +740,6 @@ class Lead(models.Model):
|
||||
attachment.write(values)
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def merge_dependences(self, opportunities):
|
||||
""" Merge dependences (messages, attachments, ...). These dependences will be
|
||||
transfered to `self`, the most important lead.
|
||||
@@ -768,7 +751,6 @@ class Lead(models.Model):
|
||||
self._merge_opportunity_history(opportunities)
|
||||
self._merge_opportunity_attachments(opportunities)
|
||||
|
||||
@api.multi
|
||||
def merge_opportunity(self, user_id=False, team_id=False):
|
||||
""" Merge opportunities in one. Different cases of merge:
|
||||
- merge leads together = 1 new lead
|
||||
@@ -821,7 +803,6 @@ class Lead(models.Model):
|
||||
|
||||
return opportunities_head
|
||||
|
||||
@api.multi
|
||||
def get_duplicated_leads(self, partner_id, include_lost=False):
|
||||
""" Search for opportunities that have the same partner and that arent done or cancelled
|
||||
:param partner_id : partner to search
|
||||
@@ -850,7 +831,6 @@ class Lead(models.Model):
|
||||
domain += ['|', '&', ('type', '=', 'lead'), ('active', '=', True), ('type', '=', 'opportunity')]
|
||||
return self.search(domain)
|
||||
|
||||
@api.multi
|
||||
def _convert_opportunity_data(self, customer, team_id=False):
|
||||
""" Extract the data from a lead to create the opportunity
|
||||
:param customer : res.partner record
|
||||
@@ -874,7 +854,6 @@ class Lead(models.Model):
|
||||
value['stage_id'] = stage.id
|
||||
return value
|
||||
|
||||
@api.multi
|
||||
def convert_opportunity(self, partner_id, user_ids=False, team_id=False):
|
||||
customer = False
|
||||
if partner_id:
|
||||
@@ -890,7 +869,6 @@ class Lead(models.Model):
|
||||
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def _create_lead_partner_data(self, name, is_company, parent_id=False):
|
||||
""" extract data from lead to create a partner
|
||||
:param name : furtur name of the partner
|
||||
@@ -921,7 +899,6 @@ class Lead(models.Model):
|
||||
'type': 'contact'
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def _create_lead_partner(self):
|
||||
""" Create a partner from lead data
|
||||
:returns res.partner record
|
||||
@@ -945,7 +922,6 @@ class Lead(models.Model):
|
||||
return partner_company
|
||||
return Partner.create(self._create_lead_partner_data(self.name, False))
|
||||
|
||||
@api.multi
|
||||
def handle_partner_assignation(self, action='create', partner_id=False):
|
||||
""" Handle partner assignation during a lead conversion.
|
||||
if action is 'create', create new partner with contact and assign lead to new partner_id.
|
||||
@@ -970,7 +946,6 @@ class Lead(models.Model):
|
||||
partner_ids[lead.id] = partner_id
|
||||
return partner_ids
|
||||
|
||||
@api.multi
|
||||
def allocate_salesman(self, user_ids=None, team_id=False):
|
||||
""" Assign salesmen and salesteam to a batch of leads. If there are more
|
||||
leads than salesmen, these salesmen will be assigned in round-robin.
|
||||
@@ -996,7 +971,6 @@ class Lead(models.Model):
|
||||
lead.write(value)
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def redirect_opportunity_view(self):
|
||||
self.ensure_one()
|
||||
# Get opportunity views
|
||||
@@ -1020,7 +994,6 @@ class Lead(models.Model):
|
||||
'context': {'default_type': 'opportunity'}
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def redirect_lead_view(self):
|
||||
self.ensure_one()
|
||||
# Get lead views
|
||||
@@ -1062,7 +1035,6 @@ class Lead(models.Model):
|
||||
sub_title = _('or send an email to %s') % (email_link)
|
||||
return '<p class="o_view_nocontent_smiling_face">%s</p><p class="oe_view_nocontent_alias">%s</p>' % (help_title, sub_title)
|
||||
|
||||
@api.multi
|
||||
def log_meeting(self, meeting_subject, meeting_date, duration):
|
||||
if not duration:
|
||||
duration = _('unknown')
|
||||
@@ -1209,7 +1181,6 @@ class Lead(models.Model):
|
||||
def _creation_subtype(self):
|
||||
return self.env.ref('crm.mt_lead_create')
|
||||
|
||||
@api.multi
|
||||
def _track_subtype(self, init_values):
|
||||
self.ensure_one()
|
||||
if 'stage_id' in init_values and self.probability == 100 and self.stage_id:
|
||||
@@ -1220,7 +1191,6 @@ class Lead(models.Model):
|
||||
return self.env.ref('crm.mt_lead_stage')
|
||||
return super(Lead, self)._track_subtype(init_values)
|
||||
|
||||
@api.multi
|
||||
def _notify_get_groups(self):
|
||||
""" Handle salesman recipients that can convert leads into opportunities
|
||||
and set opportunities as won / lost. """
|
||||
@@ -1248,7 +1218,6 @@ class Lead(models.Model):
|
||||
|
||||
return [new_group] + groups
|
||||
|
||||
@api.multi
|
||||
def _notify_get_reply_to(self, default=None, records=None, company=None, doc_names=None):
|
||||
""" Override to set alias of lead and opportunities to their sales team if any. """
|
||||
aliases = self.mapped('team_id').sudo()._notify_get_reply_to(default=default, records=None, company=company, doc_names=None)
|
||||
@@ -1258,7 +1227,6 @@ class Lead(models.Model):
|
||||
res.update(super(Lead, leftover)._notify_get_reply_to(default=default, records=None, company=company, doc_names=doc_names))
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def get_formview_id(self, access_uid=None):
|
||||
if self.type == 'opportunity':
|
||||
view_id = self.env.ref('crm.crm_case_form_view_oppor').id
|
||||
@@ -1266,7 +1234,6 @@ class Lead(models.Model):
|
||||
view_id = super(Lead, self).get_formview_id()
|
||||
return view_id
|
||||
|
||||
@api.multi
|
||||
def _message_get_default_recipients(self):
|
||||
return {r.id: {
|
||||
'partner_ids': [],
|
||||
@@ -1274,7 +1241,6 @@ class Lead(models.Model):
|
||||
'email_cc': False}
|
||||
for r in self}
|
||||
|
||||
@api.multi
|
||||
def _message_get_suggested_recipients(self):
|
||||
recipients = super(Lead, self)._message_get_suggested_recipients()
|
||||
try:
|
||||
@@ -1331,7 +1297,6 @@ class Lead(models.Model):
|
||||
('stage_id.fold', '=', False)]).write({'partner_id': new_partner.id})
|
||||
return super(Lead, self)._message_post_after_hook(message, msg_vals)
|
||||
|
||||
@api.multi
|
||||
def _message_partner_info_from_emails(self, emails, link_mail=False):
|
||||
result = super(Lead, self)._message_partner_info_from_emails(emails, link_mail=link_mail)
|
||||
for partner_info in result:
|
||||
|
||||
@@ -44,7 +44,6 @@ class Stage(models.Model):
|
||||
# This field for interface only
|
||||
team_count = fields.Integer('team_count', compute='_compute_team_count')
|
||||
|
||||
@api.multi
|
||||
def _compute_team_count(self):
|
||||
for stage in self:
|
||||
stage.team_count = self.env['crm.team'].search_count([])
|
||||
|
||||
@@ -93,7 +93,6 @@ class Team(models.Model):
|
||||
defaults['team_id'] = self.id
|
||||
return values
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
result = super(Team, self).write(vals)
|
||||
if 'alias_defaults' in vals:
|
||||
|
||||
@@ -86,7 +86,6 @@ class ResConfigSettings(models.TransientModel):
|
||||
)
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def set_values(self):
|
||||
super(ResConfigSettings, self).set_values()
|
||||
alias = self._find_default_lead_alias_id()
|
||||
|
||||
@@ -36,13 +36,11 @@ class Partner(models.Model):
|
||||
)
|
||||
return rec
|
||||
|
||||
@api.multi
|
||||
def _compute_opportunity_count(self):
|
||||
for partner in self:
|
||||
operator = 'child_of' if partner.is_company else '=' # the opportunity count should counts the opportunities of this company and all its contacts
|
||||
partner.opportunity_count = self.env['crm.lead'].search_count([('partner_id', operator, partner.id), ('type', '=', 'opportunity')])
|
||||
|
||||
@api.multi
|
||||
def _compute_meeting_count(self):
|
||||
for partner in self:
|
||||
partner.meeting_count = len(partner.meeting_ids)
|
||||
@@ -59,7 +57,6 @@ class Partner(models.Model):
|
||||
if self.mobile:
|
||||
self.mobile = self.phone_format(self.mobile)
|
||||
|
||||
@api.multi
|
||||
def schedule_meeting(self):
|
||||
partner_ids = self.ids
|
||||
partner_ids.append(self.env.user.partner_id.id)
|
||||
|
||||
@@ -9,7 +9,6 @@ class CrmLeadLost(models.TransientModel):
|
||||
|
||||
lost_reason_id = fields.Many2one('crm.lost.reason', 'Lost Reason')
|
||||
|
||||
@api.multi
|
||||
def action_lost_reason_apply(self):
|
||||
leads = self.env['crm.lead'].browse(self.env.context.get('active_ids'))
|
||||
leads.write({'lost_reason': self.lost_reason_id.id})
|
||||
|
||||
@@ -87,7 +87,6 @@ class Lead2OpportunityPartner(models.TransientModel):
|
||||
raise UserError(_("Closed/Dead leads cannot be converted into opportunities."))
|
||||
return False
|
||||
|
||||
@api.multi
|
||||
def _convert_opportunity(self, vals):
|
||||
self.ensure_one()
|
||||
|
||||
@@ -110,7 +109,6 @@ class Lead2OpportunityPartner(models.TransientModel):
|
||||
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def action_apply(self):
|
||||
""" Convert lead to opportunity or merge lead and opportunity and open
|
||||
the freshly created opportunity view.
|
||||
@@ -205,7 +203,6 @@ class Lead2OpportunityMassConvert(models.TransientModel):
|
||||
|
||||
self.opportunity_ids = self.env['crm.lead'].browse(leads_with_duplicates)
|
||||
|
||||
@api.multi
|
||||
def _convert_opportunity(self, vals):
|
||||
""" When "massively" (more than one at a time) converting leads to
|
||||
opportunities, check the salesteam_id and salesmen_ids and update
|
||||
@@ -219,7 +216,6 @@ class Lead2OpportunityMassConvert(models.TransientModel):
|
||||
vals.update({'user_ids': salesmen_ids, 'team_id': salesteam_id})
|
||||
return super(Lead2OpportunityMassConvert, self)._convert_opportunity(vals)
|
||||
|
||||
@api.multi
|
||||
def mass_convert(self):
|
||||
self.ensure_one()
|
||||
if self.name == 'convert' and self.deduplicate:
|
||||
|
||||
@@ -36,7 +36,6 @@ class MergeOpportunity(models.TransientModel):
|
||||
user_id = fields.Many2one('res.users', 'Salesperson', index=True)
|
||||
team_id = fields.Many2one('crm.team', 'Sales Team', oldname='section_id', index=True)
|
||||
|
||||
@api.multi
|
||||
def action_merge(self):
|
||||
self.ensure_one()
|
||||
merge_opportunity = self.opportunity_ids.merge_opportunity(self.user_id.id, self.team_id.id)
|
||||
|
||||
@@ -158,7 +158,6 @@ class CRMLeadMiningRequest(models.Model):
|
||||
self._cr.commit()
|
||||
raise e
|
||||
|
||||
@api.multi
|
||||
def _create_leads_from_response(self, result):
|
||||
""" This method will get the response from the service and create the leads accordingly """
|
||||
self.ensure_one()
|
||||
@@ -188,13 +187,11 @@ class CRMLeadMiningRequest(models.Model):
|
||||
sub_title = _('Generate new leads based on their country, industry, size, etc.')
|
||||
return '<p class="o_view_nocontent_smiling_face">%s</p><p class="oe_view_nocontent_alias">%s</p>' % (help_title, sub_title)
|
||||
|
||||
@api.multi
|
||||
def action_draft(self):
|
||||
self.ensure_one()
|
||||
self.name = _('New')
|
||||
self.state = 'draft'
|
||||
|
||||
@api.multi
|
||||
def action_submit(self):
|
||||
self.ensure_one()
|
||||
if self.name == _('New'):
|
||||
@@ -208,7 +205,6 @@ class CRMLeadMiningRequest(models.Model):
|
||||
elif self.lead_type == 'opportunity':
|
||||
return self.action_get_opportunity_action()
|
||||
|
||||
@api.multi
|
||||
def action_get_lead_action(self):
|
||||
self.ensure_one()
|
||||
action = self.env.ref('crm.crm_lead_all_leads').read()[0]
|
||||
@@ -220,7 +216,6 @@ class CRMLeadMiningRequest(models.Model):
|
||||
</p>""")
|
||||
return action
|
||||
|
||||
@api.multi
|
||||
def action_get_opportunity_action(self):
|
||||
self.ensure_one()
|
||||
action = self.env.ref('crm.crm_lead_opportunities').read()[0]
|
||||
|
||||
@@ -81,7 +81,6 @@ class DeliveryCarrier(models.Model):
|
||||
for c in self:
|
||||
c.debug_logging = not c.debug_logging
|
||||
|
||||
@api.multi
|
||||
def install_more_provider(self):
|
||||
return {
|
||||
'name': 'New Providers',
|
||||
|
||||
@@ -37,11 +37,9 @@ class SaleOrder(models.Model):
|
||||
if delivery_line:
|
||||
self.recompute_delivery_price = True
|
||||
|
||||
@api.multi
|
||||
def _remove_delivery_line(self):
|
||||
self.env['sale.order.line'].search([('order_id', 'in', self.ids), ('is_delivery', '=', True)]).unlink()
|
||||
|
||||
@api.multi
|
||||
def set_delivery_line(self, carrier, amount):
|
||||
|
||||
# Remove delivery products from the sales order
|
||||
@@ -156,7 +154,6 @@ class SaleOrderLine(models.Model):
|
||||
return 0.0
|
||||
line.product_qty = line.product_uom._compute_quantity(line.product_uom_qty, line.product_id.uom_id)
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
for line in self:
|
||||
if line.is_delivery:
|
||||
|
||||
@@ -112,7 +112,6 @@ class StockPicking(models.Model):
|
||||
for picking in self:
|
||||
picking.weight = sum(move.weight for move in picking.move_lines if move.state != 'cancel')
|
||||
|
||||
@api.multi
|
||||
def action_done(self):
|
||||
res = super(StockPicking, self).action_done()
|
||||
for pick in self:
|
||||
@@ -121,7 +120,6 @@ class StockPicking(models.Model):
|
||||
pick.send_to_shipper()
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def _pre_put_in_pack_hook(self, move_line_ids):
|
||||
res = super(StockPicking, self)._pre_put_in_pack_hook(move_line_ids)
|
||||
if not res:
|
||||
@@ -151,7 +149,6 @@ class StockPicking(models.Model):
|
||||
),
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def action_send_confirmation_email(self):
|
||||
self.ensure_one()
|
||||
delivery_template_id = self.env.ref('delivery.mail_template_data_delivery_confirmation').id
|
||||
@@ -173,7 +170,6 @@ class StockPicking(models.Model):
|
||||
'context': ctx,
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def send_to_shipper(self):
|
||||
self.ensure_one()
|
||||
res = self.carrier_id.send_shipping(self)[0]
|
||||
@@ -188,12 +184,10 @@ class StockPicking(models.Model):
|
||||
self._add_delivery_cost_to_so()
|
||||
|
||||
|
||||
@api.multi
|
||||
def print_return_label(self):
|
||||
self.ensure_one()
|
||||
res = self.carrier_id.get_return_label(self)
|
||||
|
||||
@api.multi
|
||||
def _add_delivery_cost_to_so(self):
|
||||
self.ensure_one()
|
||||
sale_order = self.sale_id
|
||||
@@ -209,7 +203,6 @@ class StockPicking(models.Model):
|
||||
'name': sale_order.carrier_id.with_context(lang=self.partner_id.lang).name,
|
||||
})
|
||||
|
||||
@api.multi
|
||||
def open_website_url(self):
|
||||
self.ensure_one()
|
||||
if not self.carrier_tracking_url:
|
||||
@@ -242,7 +235,6 @@ class StockPicking(models.Model):
|
||||
picking.message_post(body=msg)
|
||||
picking.carrier_tracking_ref = False
|
||||
|
||||
@api.multi
|
||||
def check_packages_are_identical(self):
|
||||
'''Some shippers require identical packages in the same shipment. This utility checks it.'''
|
||||
self.ensure_one()
|
||||
@@ -257,7 +249,6 @@ class StockPicking(models.Model):
|
||||
class StockReturnPicking(models.TransientModel):
|
||||
_inherit = 'stock.return.picking'
|
||||
|
||||
@api.multi
|
||||
def _create_returns(self):
|
||||
# Prevent copy of the carrier and carrier price when generating return picking
|
||||
# (we have no integration of returns for now)
|
||||
|
||||
@@ -80,21 +80,17 @@ class Digest(models.Model):
|
||||
vals['next_run_date'] = date.today() + relativedelta(days=3)
|
||||
return super(Digest, self).create(vals)
|
||||
|
||||
@api.multi
|
||||
def action_subscribe(self):
|
||||
if self.env.user not in self.user_ids:
|
||||
self.sudo().user_ids |= self.env.user
|
||||
|
||||
@api.multi
|
||||
def action_unsubcribe(self):
|
||||
if self.env.user in self.user_ids:
|
||||
self.sudo().user_ids -= self.env.user
|
||||
|
||||
@api.multi
|
||||
def action_activate(self):
|
||||
self.state = 'activated'
|
||||
|
||||
@api.multi
|
||||
def action_deactivate(self):
|
||||
self.state = 'deactivated'
|
||||
|
||||
|
||||
@@ -182,7 +182,6 @@ class EventEvent(models.Model):
|
||||
badge_innerright = fields.Html(string='Badge Inner Right')
|
||||
event_logo = fields.Html(string='Event Logo')
|
||||
|
||||
@api.multi
|
||||
@api.depends('seats_max', 'registration_ids.state')
|
||||
def _compute_seats(self):
|
||||
""" Determine reserved, available, reserved but unconfirmed and used seats. """
|
||||
@@ -281,7 +280,6 @@ class EventEvent(models.Model):
|
||||
if event.date_end < event.date_begin:
|
||||
raise ValidationError(_('The closing date cannot be earlier than the beginning date.'))
|
||||
|
||||
@api.multi
|
||||
@api.depends('name', 'date_begin', 'date_end')
|
||||
def name_get(self):
|
||||
result = []
|
||||
@@ -302,14 +300,12 @@ class EventEvent(models.Model):
|
||||
res.button_confirm()
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
res = super(EventEvent, self).write(vals)
|
||||
if vals.get('organizer_id'):
|
||||
self.message_subscribe([vals['organizer_id']])
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
@api.returns('self', lambda value: value.id)
|
||||
def copy(self, default=None):
|
||||
self.ensure_one()
|
||||
@@ -319,7 +315,6 @@ class EventEvent(models.Model):
|
||||
def button_draft(self):
|
||||
self.write({'state': 'draft'})
|
||||
|
||||
@api.multi
|
||||
def button_cancel(self):
|
||||
if any('done' in event.mapped('registration_ids.state') for event in self):
|
||||
raise UserError(_("There are already attendees who attended this event. Please reset it to draft if you want to cancel this event."))
|
||||
@@ -337,11 +332,9 @@ class EventEvent(models.Model):
|
||||
for attendee in event.registration_ids.filtered(filter_func):
|
||||
self.env['mail.template'].browse(template_id).send_mail(attendee.id, force_send=force_send)
|
||||
|
||||
@api.multi
|
||||
def _is_event_registrable(self):
|
||||
return self.date_end > fields.Datetime.now()
|
||||
|
||||
@api.multi
|
||||
def _get_ics_file(self):
|
||||
""" Returns iCalendar file for the event invitation.
|
||||
:returns a dict of .ics file content for each event
|
||||
@@ -401,7 +394,6 @@ class EventRegistration(models.Model):
|
||||
if registration.event_id.seats_availability == 'limited' and registration.event_id.seats_max and registration.event_id.seats_available < (1 if registration.state == 'draft' else 0):
|
||||
raise ValidationError(_('No more seats available for this event.'))
|
||||
|
||||
@api.multi
|
||||
def _check_auto_confirmation(self):
|
||||
if self._context.get('registration_force_draft'):
|
||||
return False
|
||||
@@ -471,7 +463,6 @@ class EventRegistration(models.Model):
|
||||
self.email = contact.email or self.email
|
||||
self.phone = contact.phone or self.phone
|
||||
|
||||
@api.multi
|
||||
def _message_get_suggested_recipients(self):
|
||||
recipients = super(EventRegistration, self)._message_get_suggested_recipients()
|
||||
public_users = self.env['res.users'].sudo()
|
||||
@@ -489,7 +480,6 @@ class EventRegistration(models.Model):
|
||||
pass
|
||||
return recipients
|
||||
|
||||
@api.multi
|
||||
def _message_get_default_recipients(self):
|
||||
# Prioritize registration email over partner_id, which may be shared when a single
|
||||
# partner booked multiple seats
|
||||
@@ -513,7 +503,6 @@ class EventRegistration(models.Model):
|
||||
]).write({'partner_id': new_partner.id})
|
||||
return super(EventRegistration, self)._message_post_after_hook(message, msg_vals)
|
||||
|
||||
@api.multi
|
||||
def action_send_badge_email(self):
|
||||
""" Open a window to compose an email, with the template - 'event_badge'
|
||||
message loaded by default
|
||||
@@ -540,7 +529,6 @@ class EventRegistration(models.Model):
|
||||
'context': ctx,
|
||||
}
|
||||
|
||||
@api.multi
|
||||
def get_date_range_str(self):
|
||||
self.ensure_one()
|
||||
today = fields.Datetime.now()
|
||||
@@ -559,7 +547,6 @@ class EventRegistration(models.Model):
|
||||
else:
|
||||
return _('on ') + format_datetime(self.env, self.event_begin_date, tz=self.event_id.date_tz, dt_format='medium')
|
||||
|
||||
@api.multi
|
||||
def summary(self):
|
||||
self.ensure_one()
|
||||
return {'information': []}
|
||||
|
||||
@@ -14,7 +14,6 @@ class ResPartner(models.Model):
|
||||
for partner in self:
|
||||
partner.event_count = self.env['event.event'].search_count([('registration_ids.partner_id', 'child_of', partner.ids)])
|
||||
|
||||
@api.multi
|
||||
def action_event_view(self):
|
||||
action = self.env.ref('event.action_event_view').read()[0]
|
||||
action['context'] = {}
|
||||
|
||||
@@ -9,7 +9,6 @@ class event_confirm(models.TransientModel):
|
||||
_name = "event.confirm"
|
||||
_description = 'Event Confirmation'
|
||||
|
||||
@api.multi
|
||||
def confirm(self):
|
||||
events = self.env['event.event'].browse(self._context.get('event_ids', []))
|
||||
events.do_confirm()
|
||||
|
||||
@@ -7,7 +7,6 @@ from odoo import api, models
|
||||
class AccountMove(models.Model):
|
||||
_inherit = 'account.move'
|
||||
|
||||
@api.multi
|
||||
def action_invoice_paid(self):
|
||||
""" When an invoice linked to a sales order selling registrations is
|
||||
paid confirm attendees. Attendees should indeed not be confirmed before
|
||||
|
||||
@@ -53,7 +53,6 @@ class Event(models.Model):
|
||||
})
|
||||
for ticket in self.event_type_id.event_ticket_ids]
|
||||
|
||||
@api.multi
|
||||
def _is_event_registrable(self):
|
||||
if super(Event, self)._is_event_registrable():
|
||||
self.ensure_one()
|
||||
@@ -93,7 +92,6 @@ class EventTicket(models.Model):
|
||||
seats_unconfirmed = fields.Integer(string='Unconfirmed Seat Reservations', compute='_compute_seats', store=True)
|
||||
seats_used = fields.Integer(compute='_compute_seats', store=True)
|
||||
|
||||
@api.multi
|
||||
def _compute_is_expired(self):
|
||||
for record in self:
|
||||
if record.deadline:
|
||||
@@ -102,7 +100,6 @@ class EventTicket(models.Model):
|
||||
else:
|
||||
record.is_expired = False
|
||||
|
||||
@api.multi
|
||||
def _compute_price_reduce(self):
|
||||
for record in self:
|
||||
product = record.product_id
|
||||
@@ -116,7 +113,6 @@ class EventTicket(models.Model):
|
||||
taxes = tax_ids.compute_all(record.price_reduce, record.event_id.company_id.currency_id, 1.0, product=record.product_id)
|
||||
record.price_reduce_taxinc = taxes['total_included']
|
||||
|
||||
@api.multi
|
||||
@api.depends('seats_max', 'registration_ids.state')
|
||||
def _compute_seats(self):
|
||||
""" Determine reserved, available, reserved but unconfirmed and used seats. """
|
||||
@@ -145,7 +141,6 @@ class EventTicket(models.Model):
|
||||
if ticket.seats_max > 0:
|
||||
ticket.seats_available = ticket.seats_max - (ticket.seats_reserved + ticket.seats_used)
|
||||
|
||||
@api.multi
|
||||
@api.constrains('registration_ids', 'seats_max')
|
||||
def _check_seats_limit(self):
|
||||
for record in self:
|
||||
@@ -201,14 +196,12 @@ class EventRegistration(models.Model):
|
||||
if self.event_ticket_id and (not self.event_id or self.event_id != self.event_ticket_id.event_id):
|
||||
self.event_ticket_id = None
|
||||
|
||||
@api.multi
|
||||
@api.constrains('event_ticket_id', 'state')
|
||||
def _check_ticket_seats_limit(self):
|
||||
for record in self:
|
||||
if record.event_ticket_id.seats_max and record.event_ticket_id.seats_available < 0:
|
||||
raise ValidationError(_('No more available seats for this ticket'))
|
||||
|
||||
@api.multi
|
||||
def _check_auto_confirmation(self):
|
||||
res = super(EventRegistration, self)._check_auto_confirmation()
|
||||
if res:
|
||||
@@ -244,7 +237,6 @@ class EventRegistration(models.Model):
|
||||
})
|
||||
return att_data
|
||||
|
||||
@api.multi
|
||||
def summary(self):
|
||||
res = super(EventRegistration, self).summary()
|
||||
if self.event_ticket_id.product_id.image_medium:
|
||||
|
||||
@@ -6,7 +6,6 @@ from odoo import api, fields, models
|
||||
class SaleOrder(models.Model):
|
||||
_inherit = "sale.order"
|
||||
|
||||
@api.multi
|
||||
def _action_confirm(self):
|
||||
res = super(SaleOrder, self)._action_confirm()
|
||||
for so in self:
|
||||
@@ -14,7 +13,6 @@ class SaleOrder(models.Model):
|
||||
so.order_line._update_registrations(confirm=so.amount_total == 0, cancel_to_draft=False)
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def action_confirm(self):
|
||||
res = super(SaleOrder, self).action_confirm()
|
||||
for so in self:
|
||||
@@ -35,7 +33,6 @@ class SaleOrderLine(models.Model):
|
||||
"an event ticket and it will automatically create a registration for this event ticket.")
|
||||
event_ok = fields.Boolean(related='product_id.event_ok', readonly=True)
|
||||
|
||||
@api.multi
|
||||
def _update_registrations(self, confirm=True, cancel_to_draft=False, registration_data=None):
|
||||
""" Create or update registrations linked to a sales order line. A sale
|
||||
order line has a product_uom_qty attribute that will be the number of
|
||||
|
||||
@@ -45,7 +45,6 @@ class RegistrationEditor(models.TransientModel):
|
||||
res = self._convert_to_write(res)
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def action_make_registration(self):
|
||||
self.ensure_one()
|
||||
for registration_line in self.event_registration_ids:
|
||||
@@ -74,7 +73,6 @@ class RegistrationEditorLine(models.TransientModel):
|
||||
phone = fields.Char(string='Phone')
|
||||
name = fields.Char(string='Name', index=True)
|
||||
|
||||
@api.multi
|
||||
def get_registration_data(self):
|
||||
self.ensure_one()
|
||||
return {
|
||||
|
||||
@@ -84,24 +84,20 @@ odoo_mailgate: "|/path/to/odoo-mailgate.py --host=localhost -u %(uid)d -p PASSWO
|
||||
self._update_cron()
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def write(self, values):
|
||||
res = super(FetchmailServer, self).write(values)
|
||||
self._update_cron()
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
res = super(FetchmailServer, self).unlink()
|
||||
self._update_cron()
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def set_draft(self):
|
||||
self.write({'state': 'draft'})
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def connect(self):
|
||||
self.ensure_one()
|
||||
if self.server_type == 'imap':
|
||||
@@ -123,7 +119,6 @@ odoo_mailgate: "|/path/to/odoo-mailgate.py --host=localhost -u %(uid)d -p PASSWO
|
||||
connection.sock.settimeout(MAIL_TIMEOUT)
|
||||
return connection
|
||||
|
||||
@api.multi
|
||||
def button_confirm_login(self):
|
||||
for server in self:
|
||||
try:
|
||||
@@ -149,7 +144,6 @@ odoo_mailgate: "|/path/to/odoo-mailgate.py --host=localhost -u %(uid)d -p PASSWO
|
||||
""" Method called by cron to fetch mails from servers """
|
||||
return self.search([('state', '=', 'done'), ('server_type', 'in', ['pop', 'imap'])]).fetch_mail()
|
||||
|
||||
@api.multi
|
||||
def fetch_mail(self):
|
||||
""" WARNING: meant for cron usage only - will commit() after each email! """
|
||||
additionnal_context = {
|
||||
|
||||
@@ -220,7 +220,6 @@ class FleetVehicle(models.Model):
|
||||
future_driver.write({'plan_to_change_car': True})
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
if 'driver_id' in vals and vals['driver_id']:
|
||||
driver_id = vals['driver_id']
|
||||
@@ -276,7 +275,6 @@ class FleetVehicle(models.Model):
|
||||
rec = self._search(expression.AND([domain, args]), limit=limit, access_rights_uid=name_get_uid)
|
||||
return self.browse(rec).name_get()
|
||||
|
||||
@api.multi
|
||||
def return_action_to_open(self):
|
||||
""" This opens the xml view specified in xml_id for the current vehicle """
|
||||
self.ensure_one()
|
||||
@@ -290,7 +288,6 @@ class FleetVehicle(models.Model):
|
||||
return res
|
||||
return False
|
||||
|
||||
@api.multi
|
||||
def act_show_log_cost(self):
|
||||
""" This opens log view to view and add new log for this vehicle, groupby default to only show effective costs
|
||||
@return: the costs log view
|
||||
@@ -305,7 +302,6 @@ class FleetVehicle(models.Model):
|
||||
)
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def _track_subtype(self, init_values):
|
||||
self.ensure_one()
|
||||
if 'driver_id' in init_values:
|
||||
|
||||
@@ -176,24 +176,20 @@ class FleetVehicleLogContract(models.Model):
|
||||
if self.vehicle_id:
|
||||
self.odometer_unit = self.vehicle_id.odometer_unit
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
res = super(FleetVehicleLogContract, self).write(vals)
|
||||
if vals.get('expiration_date') or vals.get('user_id'):
|
||||
self.activity_reschedule(['fleet.mail_act_fleet_contract_to_renew'], date_deadline=vals.get('expiration_date'), new_user_id=vals.get('user_id'))
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def contract_close(self):
|
||||
for record in self:
|
||||
record.state = 'closed'
|
||||
|
||||
@api.multi
|
||||
def contract_open(self):
|
||||
for record in self:
|
||||
record.state = 'open'
|
||||
|
||||
@api.multi
|
||||
def act_renew_contract(self):
|
||||
assert len(self.ids) == 1, "This operation should only be done for 1 single contract at a time, as it it suppose to open a window as result"
|
||||
for element in self:
|
||||
|
||||
@@ -18,7 +18,6 @@ class FleetVehicleModel(models.Model):
|
||||
image_medium = fields.Binary(related='brand_id.image_medium', string="Logo (medium)", readonly=False)
|
||||
image_small = fields.Binary(related='brand_id.image_small', string="Logo (small)", readonly=False)
|
||||
|
||||
@api.multi
|
||||
@api.depends('name', 'brand_id')
|
||||
def name_get(self):
|
||||
res = []
|
||||
@@ -60,7 +59,6 @@ class FleetVehicleModelBrand(models.Model):
|
||||
tools.image_resize_images(vals)
|
||||
return super(FleetVehicleModelBrand, self).create(vals_list)
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
tools.image_resize_images(vals)
|
||||
return super(FleetVehicleModelBrand, self).write(vals)
|
||||
|
||||
@@ -143,7 +143,6 @@ class GamificationBadge(models.Model):
|
||||
tools.image_resize_images(vals)
|
||||
return super(GamificationBadge, self).create(values_list)
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
tools.image_resize_images(vals)
|
||||
return super(GamificationBadge, self).write(vals)
|
||||
|
||||
@@ -167,7 +167,6 @@ class Challenge(models.Model):
|
||||
|
||||
return super(Challenge, self).create(vals)
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
if vals.get('user_domain'):
|
||||
users = self._get_challenger_users(ustr(vals.get('user_domain')))
|
||||
@@ -299,12 +298,10 @@ class Challenge(models.Model):
|
||||
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def action_start(self):
|
||||
"""Start a challenge"""
|
||||
return self.write({'state': 'inprogress'})
|
||||
|
||||
@api.multi
|
||||
def action_check(self):
|
||||
"""Check a challenge
|
||||
|
||||
@@ -317,7 +314,6 @@ class Challenge(models.Model):
|
||||
|
||||
return self._update_all()
|
||||
|
||||
@api.multi
|
||||
def action_report_progress(self):
|
||||
"""Manual report of a goal, does not influence automatic report frequency"""
|
||||
for challenge in self:
|
||||
@@ -602,7 +598,6 @@ class Challenge(models.Model):
|
||||
return challenge.write({'last_report_date': fields.Date.today()})
|
||||
|
||||
##### Challenges #####
|
||||
@api.multi
|
||||
def accept_challenge(self):
|
||||
user = self.env.user
|
||||
sudoed = self.sudo()
|
||||
@@ -610,7 +605,6 @@ class Challenge(models.Model):
|
||||
sudoed.write({'invited_user_ids': [(3, user.id)], 'user_ids': [(4, user.id)]})
|
||||
return sudoed._generate_goals_from_challenge()
|
||||
|
||||
@api.multi
|
||||
def discard_challenge(self):
|
||||
"""The user discard the suggested challenge"""
|
||||
user = self.env.user
|
||||
|
||||
@@ -54,7 +54,6 @@ class KarmaRank(models.Model):
|
||||
users._recompute_rank()
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
tools.image_resize_images(vals)
|
||||
res = super(KarmaRank, self).write(vals)
|
||||
|
||||
@@ -117,7 +117,6 @@ class GoalDefinition(models.Model):
|
||||
definition._check_model_validity()
|
||||
return definition
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
res = super(GoalDefinition, self).write(vals)
|
||||
if vals.get('computation_mode', 'count') in ('count', 'sum') and (vals.get('domain') or vals.get('model_id')):
|
||||
@@ -250,7 +249,6 @@ class Goal(models.Model):
|
||||
|
||||
return {self: result}
|
||||
|
||||
@api.multi
|
||||
def update_goal(self):
|
||||
"""Update the goals to recomputes values and change of states
|
||||
|
||||
@@ -362,7 +360,6 @@ class Goal(models.Model):
|
||||
self.env.cr.commit()
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def action_start(self):
|
||||
"""Mark a goal as started.
|
||||
|
||||
@@ -370,7 +367,6 @@ class Goal(models.Model):
|
||||
self.write({'state': 'inprogress'})
|
||||
return self.update_goal()
|
||||
|
||||
@api.multi
|
||||
def action_reach(self):
|
||||
"""Mark a goal as reached.
|
||||
|
||||
@@ -378,14 +374,12 @@ class Goal(models.Model):
|
||||
Progress at the next goal update until the end date."""
|
||||
return self.write({'state': 'reached'})
|
||||
|
||||
@api.multi
|
||||
def action_fail(self):
|
||||
"""Set the state of the goal to failed.
|
||||
|
||||
A failed goal will be ignored in future checks."""
|
||||
return self.write({'state': 'failed'})
|
||||
|
||||
@api.multi
|
||||
def action_cancel(self):
|
||||
"""Reset the completion after setting a goal as reached or failed.
|
||||
|
||||
@@ -398,7 +392,6 @@ class Goal(models.Model):
|
||||
def create(self, vals):
|
||||
return super(Goal, self.with_context(no_remind_goal=True)).create(vals)
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
"""Overwrite the write method to update the last_update field to today
|
||||
|
||||
@@ -417,7 +410,6 @@ class Goal(models.Model):
|
||||
goal.challenge_id.sudo().report_progress(users=goal.user_id)
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def get_action(self):
|
||||
"""Get the ir.action related to update the goal
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@ class Users(models.Model):
|
||||
for user in self:
|
||||
user.karma_position = 0
|
||||
|
||||
@api.multi
|
||||
@api.depends('badge_ids')
|
||||
def _get_user_badge_level(self):
|
||||
""" Return total badge per level of users
|
||||
@@ -55,14 +54,12 @@ class Users(models.Model):
|
||||
res._recompute_rank()
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
result = super(Users, self).write(vals)
|
||||
if 'karma' in vals:
|
||||
self._recompute_rank()
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def add_karma(self, karma):
|
||||
for user in self:
|
||||
user.karma += karma
|
||||
|
||||
@@ -13,7 +13,6 @@ class grant_badge_wizard(models.TransientModel):
|
||||
badge_id = fields.Many2one("gamification.badge", string='Badge', required=True)
|
||||
comment = fields.Text('Comment')
|
||||
|
||||
@api.multi
|
||||
def action_grant_badge(self):
|
||||
"""Wizard action for sending a badge to a chosen user"""
|
||||
|
||||
|
||||
@@ -11,7 +11,6 @@ class goal_manual_wizard(models.TransientModel):
|
||||
goal_id = fields.Many2one("gamification.goal", string='Goal', required=True)
|
||||
current = fields.Float('Current')
|
||||
|
||||
@api.multi
|
||||
def action_update_current(self):
|
||||
"""Wizard action for updating the current value"""
|
||||
for wiz in self:
|
||||
|
||||
@@ -17,14 +17,12 @@ class Meeting(models.Model):
|
||||
'attendee_ids', 'alarm_ids', 'location', 'privacy', 'active',
|
||||
'start_date', 'start_datetime', 'stop_date', 'stop_datetime']
|
||||
|
||||
@api.multi
|
||||
def write(self, values):
|
||||
sync_fields = set(self.get_fields_need_update_google())
|
||||
if (set(values) and sync_fields) and 'oe_update_date' not in values and 'NewMeeting' not in self._context:
|
||||
values['oe_update_date'] = fields.Datetime.now()
|
||||
return super(Meeting, self).write(values)
|
||||
|
||||
@api.multi
|
||||
@api.returns('self', lambda value: value.id)
|
||||
def copy(self, default=None):
|
||||
default = default or {}
|
||||
@@ -36,7 +34,6 @@ class Meeting(models.Model):
|
||||
default['oe_update_date'] = False
|
||||
return super(Meeting, self).copy(default)
|
||||
|
||||
@api.multi
|
||||
def unlink(self, can_be_deleted=False):
|
||||
return super(Meeting, self).unlink(can_be_deleted=can_be_deleted)
|
||||
|
||||
@@ -52,7 +49,6 @@ class Attendee(models.Model):
|
||||
('google_id_uniq', 'unique(google_internal_event_id,partner_id,event_id)', 'Google ID should be unique!')
|
||||
]
|
||||
|
||||
@api.multi
|
||||
def write(self, values):
|
||||
for attendee in self:
|
||||
meeting_id_to_update = values.get('event_id', attendee.event_id.id)
|
||||
|
||||
@@ -22,7 +22,6 @@ class GoogleDrive(models.Model):
|
||||
_name = 'google.drive.config'
|
||||
_description = "Google Drive templates config"
|
||||
|
||||
@api.multi
|
||||
def get_google_drive_url(self, res_id, template_id):
|
||||
self.ensure_one()
|
||||
self = self.sudo()
|
||||
@@ -191,7 +190,6 @@ class GoogleDrive(models.Model):
|
||||
return word.group(2)
|
||||
return None
|
||||
|
||||
@api.multi
|
||||
def _compute_ressource_id(self):
|
||||
result = {}
|
||||
for record in self:
|
||||
@@ -202,7 +200,6 @@ class GoogleDrive(models.Model):
|
||||
raise UserError(_("Please enter a valid Google Document URL."))
|
||||
return result
|
||||
|
||||
@api.multi
|
||||
def _compute_client_id(self):
|
||||
google_drive_client_id = self.env['ir.config_parameter'].sudo().get_param('google_drive_client_id')
|
||||
for record in self:
|
||||
|
||||
@@ -23,7 +23,6 @@ class ResConfigSettings(models.TransientModel):
|
||||
res.update(is_google_drive_token_generated=bool(refresh_token))
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def confirm_setup_token(self):
|
||||
params = self.env['ir.config_parameter'].sudo()
|
||||
authorization_code_before = params.get_param('google_drive_authorization_code')
|
||||
@@ -33,7 +32,6 @@ class ResConfigSettings(models.TransientModel):
|
||||
refresh_token = self.env['google.service'].generate_refresh_token('drive', authorization_code)
|
||||
params.set_param('google_drive_refresh_token', refresh_token)
|
||||
|
||||
@api.multi
|
||||
def action_setup_token(self):
|
||||
self.ensure_one()
|
||||
template = self.env.ref('google_drive.google_drive_auth_code_wizard')
|
||||
|
||||
@@ -24,7 +24,6 @@ class Department(models.Model):
|
||||
note = fields.Text('Note')
|
||||
color = fields.Integer('Color Index')
|
||||
|
||||
@api.multi
|
||||
def name_get(self):
|
||||
if not self.env.context.get('hierarchical_naming', True):
|
||||
return [(record.id, record.name) for record in self]
|
||||
@@ -54,7 +53,6 @@ class Department(models.Model):
|
||||
department.message_subscribe(partner_ids=manager.user_id.partner_id.ids)
|
||||
return department
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
""" If updating manager of a department, we need to update all the employees
|
||||
of department hierarchy, and subscribe the new manager.
|
||||
|
||||
@@ -128,13 +128,11 @@ class HrEmployeePrivate(models.Model):
|
||||
('user_uniq', 'unique (user_id, company_id)', "A user cannot be linked to multiple employees in the same company.")
|
||||
]
|
||||
|
||||
@api.multi
|
||||
def name_get(self):
|
||||
if self.check_access_rights('read', raise_exception=False):
|
||||
return super(HrEmployeePrivate, self).name_get()
|
||||
return self.env['hr.employee.public'].browse(self.ids).name_get()
|
||||
|
||||
@api.multi
|
||||
def read(self, fields, load='_classic_read'):
|
||||
if self.check_access_rights('read', raise_exception=False):
|
||||
return super(HrEmployeePrivate, self).read(fields, load=load)
|
||||
@@ -163,7 +161,6 @@ class HrEmployeePrivate(models.Model):
|
||||
return super(HrEmployeePrivate, self)._search(args, offset=offset, limit=limit, order=order, count=count, access_rights_uid=access_rights_uid)
|
||||
return self.env['hr.employee.public']._search(args, offset=offset, limit=limit, order=order, count=count, access_rights_uid=access_rights_uid)
|
||||
|
||||
@api.multi
|
||||
def get_formview_id(self, access_uid=None):
|
||||
""" Override this method in order to redirect many2one towards the right model depending on access_uid """
|
||||
if access_uid:
|
||||
@@ -176,7 +173,6 @@ class HrEmployeePrivate(models.Model):
|
||||
# Hardcode the form view for public employee
|
||||
return self.env.ref('hr.hr_employee_public_view_form').id
|
||||
|
||||
@api.multi
|
||||
def get_formview_action(self, access_uid=None):
|
||||
""" Override this method in order to redirect many2one towards the right model depending on access_uid """
|
||||
res = super(HrEmployeePrivate, self).get_formview_action(access_uid=access_uid)
|
||||
@@ -259,7 +255,6 @@ class HrEmployeePrivate(models.Model):
|
||||
])._subscribe_users()
|
||||
return employee
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
if 'address_home_id' in vals:
|
||||
account_id = vals.get('bank_account_id') or self.bank_account_id.id
|
||||
@@ -277,7 +272,6 @@ class HrEmployeePrivate(models.Model):
|
||||
])._subscribe_users()
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
resources = self.mapped('resource_id')
|
||||
super(HrEmployeePrivate, self).unlink()
|
||||
@@ -301,7 +295,6 @@ class HrEmployeePrivate(models.Model):
|
||||
}
|
||||
return res
|
||||
|
||||
@api.multi
|
||||
def generate_random_barcode(self):
|
||||
for employee in self:
|
||||
employee.barcode = "".join(choice(digits) for i in range(8))
|
||||
@@ -392,7 +385,6 @@ class HrEmployeePrivate(models.Model):
|
||||
def _message_log(self, **kwargs):
|
||||
return super(HrEmployeePrivate, self._post_author())._message_log(**kwargs)
|
||||
|
||||
@api.multi
|
||||
@api.returns('mail.message', lambda value: value.id)
|
||||
def message_post(self, *args, **kwargs):
|
||||
return super(HrEmployeePrivate, self._post_author()).message_post(*args, **kwargs)
|
||||
|
||||
@@ -46,7 +46,6 @@ class Job(models.Model):
|
||||
""" We don't want the current user to be follower of all created job """
|
||||
return super(Job, self.with_context(mail_create_nosubscribe=True)).create(values)
|
||||
|
||||
@api.multi
|
||||
@api.returns('self', lambda value: value.id)
|
||||
def copy(self, default=None):
|
||||
self.ensure_one()
|
||||
@@ -55,14 +54,12 @@ class Job(models.Model):
|
||||
default['name'] = _("%s (copy)") % (self.name)
|
||||
return super(Job, self).copy(default=default)
|
||||
|
||||
@api.multi
|
||||
def set_recruit(self):
|
||||
for record in self:
|
||||
no_of_recruitment = 1 if record.no_of_recruitment == 0 else record.no_of_recruitment
|
||||
record.write({'state': 'recruit', 'no_of_recruitment': no_of_recruitment})
|
||||
return True
|
||||
|
||||
@api.multi
|
||||
def set_open(self):
|
||||
return self.write({
|
||||
'state': 'open',
|
||||
|
||||
@@ -22,7 +22,6 @@ class Partner(models.Model):
|
||||
except AccessError:
|
||||
return suggestions
|
||||
|
||||
@api.multi
|
||||
def name_get(self):
|
||||
""" Override to allow an employee to see its private address in his profile.
|
||||
This avoids to relax access rules on `res.parter` and to add an `ir.rule`.
|
||||
|
||||
@@ -139,7 +139,6 @@ class User(models.Model):
|
||||
self = self.sudo()
|
||||
return super(User, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu)
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
"""
|
||||
Synchronize user and its related employee
|
||||
@@ -178,7 +177,6 @@ class User(models.Model):
|
||||
for user in self:
|
||||
user.employee_id = self.env['hr.employee'].search([('id', 'in', user.employee_ids.ids), ('company_id', '=', user.company_id.id)], limit=1)
|
||||
|
||||
@api.multi
|
||||
def action_create_employee(self):
|
||||
self.ensure_one()
|
||||
self.env['hr.employee'].create(dict(
|
||||
|
||||
@@ -19,7 +19,6 @@ class HrPlanWizard(models.TransientModel):
|
||||
plan_id = fields.Many2one('hr.plan', default=lambda self: self.env['hr.plan'].search([], limit=1))
|
||||
employee_id = fields.Many2one('hr.employee', string='Employee', required=True)
|
||||
|
||||
@api.multi
|
||||
def action_launch(self):
|
||||
for activity_type in self.plan_id.plan_activity_type_ids:
|
||||
self.env['mail.activity'].create({
|
||||
|
||||
@@ -19,7 +19,6 @@ class HrAttendance(models.Model):
|
||||
check_out = fields.Datetime(string="Check Out")
|
||||
worked_hours = fields.Float(string='Worked Hours', compute='_compute_worked_hours', store=True, readonly=True)
|
||||
|
||||
@api.multi
|
||||
def name_get(self):
|
||||
result = []
|
||||
for attendance in self:
|
||||
@@ -97,7 +96,6 @@ class HrAttendance(models.Model):
|
||||
'datetime': fields.Datetime.to_string(fields.Datetime.context_timestamp(self, fields.Datetime.from_string(last_attendance_before_check_out.check_in))),
|
||||
})
|
||||
|
||||
@api.multi
|
||||
@api.returns('self', lambda value: value.id)
|
||||
def copy(self):
|
||||
raise exceptions.UserError(_('You cannot duplicate an attendance.'))
|
||||
|
||||
@@ -88,7 +88,6 @@ class HrEmployeeBase(models.AbstractModel):
|
||||
return employee._attendance_action('hr_attendance.hr_attendance_action_kiosk_mode')
|
||||
return {'warning': _('No employee corresponding to barcode %(barcode)s') % {'barcode': barcode}}
|
||||
|
||||
@api.multi
|
||||
def attendance_manual(self, next_action, entered_pin=None):
|
||||
self.ensure_one()
|
||||
can_check_without_pin = not self.env.user.has_group('hr_attendance.group_hr_attendance_use_pin') or (self.user_id == self.env.user and entered_pin is None)
|
||||
@@ -96,7 +95,6 @@ class HrEmployeeBase(models.AbstractModel):
|
||||
return self._attendance_action(next_action)
|
||||
return {'warning': _('Wrong PIN')}
|
||||
|
||||
@api.multi
|
||||
def _attendance_action(self, next_action):
|
||||
""" Changes the attendance of the employee.
|
||||
Returns an action to the check in/out message,
|
||||
@@ -117,7 +115,6 @@ class HrEmployeeBase(models.AbstractModel):
|
||||
action_message['attendance'] = modified_attendance.read()[0]
|
||||
return {'action': action_message}
|
||||
|
||||
@api.multi
|
||||
def _attendance_action_change(self):
|
||||
""" Check In/Check Out action
|
||||
Check In: create a new attendance record
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user