From 0dfd7068af95b8d7b2af3c4da9acf287d02b0f99 Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Wed, 29 Oct 2014 12:13:16 +0100 Subject: [PATCH] New API: wizards and corrections --- account_credit_control/invoice.py | 3 +- account_credit_control/line.py | 19 +- account_credit_control/policy.py | 13 +- account_credit_control/run.py | 5 +- .../wizard/credit_control_communication.py | 240 ++++++++---------- .../wizard/credit_control_emailer.py | 86 +++---- .../wizard/credit_control_marker.py | 117 ++++----- .../wizard/credit_control_policy_changer.py | 190 ++++++-------- .../credit_control_policy_changer_view.xml | 3 +- .../wizard/credit_control_printer.py | 108 +++----- 10 files changed, 322 insertions(+), 462 deletions(-) diff --git a/account_credit_control/invoice.py b/account_credit_control/invoice.py index 361ffa630..f74be82c0 100644 --- a/account_credit_control/invoice.py +++ b/account_credit_control/invoice.py @@ -18,8 +18,7 @@ # along with this program. If not, see . # ############################################################################## -from openerp import models, fields, api -from openerp.tools.translate import _ +from openerp import models, fields, api, _ class AccountInvoice(models.Model): diff --git a/account_credit_control/line.py b/account_credit_control/line.py index 16fd407e5..43782bb26 100644 --- a/account_credit_control/line.py +++ b/account_credit_control/line.py @@ -20,8 +20,7 @@ ############################################################################## import logging -from openerp import models, fields, api -from openerp.tools.translate import _ +from openerp import models, fields, api, _ logger = logging.getLogger('credit.line.control') @@ -104,15 +103,18 @@ class CreditControlLine(models.Model): required=True, readonly=True) - account_id = fields.Many2one(related='move_line_id.account_id', + account_id = fields.Many2one('account.account', + related='move_line_id.account_id', store=True, readonly=True) - currency_id = fields.Many2one(related='move_line_id.currency_id', + currency_id = fields.Many2one('res.currency', + related='move_line_id.currency_id', store=True, readonly=True) - company_id = fields.Many2one(related='move_line_id.company_id', + company_id = fields.Many2one('res.company', + related='move_line_id.company_id', store=True, readonly=True) @@ -123,11 +125,13 @@ class CreditControlLine(models.Model): readonly=True, states={'draft': [('readonly', False)]}) - policy_id = fields.Many2one(related='policy_level_id.policy_id', + policy_id = fields.Many2one('credit.control.policy', + related='policy_level_id.policy_id', store=True, readonly=True) - level = fields.Integer(related='policy_level_id.level', + level = fields.Integer('credit.control.policy.level', + related='policy_level_id.level', store=True, readonly=True) @@ -176,7 +180,6 @@ class CreditControlLine(models.Model): :returns: recordset of created credit lines """ currency_obj = self.env['res.currency'] - level_obj = self.env['credit.control.policy.level'] user = self.env.user currencies = currency_obj.search([]) diff --git a/account_credit_control/policy.py b/account_credit_control/policy.py index c5a27853f..59cac0612 100644 --- a/account_credit_control/policy.py +++ b/account_credit_control/policy.py @@ -18,8 +18,7 @@ # along with this program. If not, see . # ############################################################################## -from openerp import models, fields, api -from openerp.tools.translate import _ +from openerp import models, fields, api, _ class CreditControlPolicy(models.Model): @@ -50,8 +49,7 @@ class CreditControlPolicy(models.Model): def _move_lines_domain(self, controlling_date): """ Build the default domain for searching move lines """ self.ensure_one() - account_ids = [a.id for a in self.account_ids] - return [('account_id', 'in', account_ids), + return [('account_id', 'in', self.account_ids.ids), ('date_maturity', '<=', controlling_date), ('reconcile_id', '=', False), ('partner_id', '!=', False)] @@ -187,7 +185,7 @@ class CreditControlPolicy(models.Model): cr.execute("SELECT move_line_id FROM credit_control_line" " WHERE policy_id != %s and move_line_id in %s" " AND manually_overridden IS false", - (self.id, tuple(line.id for line in lines))) + (self.id, tuple(lines.ids))) res = cr.fetchall() if res: return move_line_obj.browse([row[0] for row in res]) @@ -341,9 +339,8 @@ class CreditControlPolicyLevel(models.Model): _get_sql_date_part = self._get_sql_date_boundary_for_computation_mode sql += _get_sql_date_part(controlling_date) data_dict = {'controlling_date': controlling_date, - 'line_ids': tuple(line.id for line in lines), + 'line_ids': tuple(lines.ids), 'delay': self.delay_days} - print cr.mogrify(sql, data_dict) cr.execute(sql, data_dict) res = cr.fetchall() if res: @@ -383,7 +380,7 @@ class CreditControlPolicyLevel(models.Model): sql += _get_sql_date_part(controlling_date) previous_level = self._previous_level() data_dict = {'controlling_date': controlling_date, - 'line_ids': tuple(line.id for line in lines), + 'line_ids': tuple(lines.ids), 'delay': self.delay_days, 'previous_level': previous_level.level} diff --git a/account_credit_control/run.py b/account_credit_control/run.py index ae64ac397..740c811d4 100644 --- a/account_credit_control/run.py +++ b/account_credit_control/run.py @@ -20,8 +20,7 @@ ############################################################################## import logging -from openerp import models, fields, api -from openerp.tools.translate import _ +from openerp import models, fields, api, _ logger = logging.getLogger('credit.control.run') @@ -102,7 +101,7 @@ class CreditControlRun(models.Model): raise api.Warning(_('Please select a policy')) report = '' - generated = [] + generated = cr_line_obj.browse() for policy in policies: if policy.do_nothing: continue diff --git a/account_credit_control/wizard/credit_control_communication.py b/account_credit_control/wizard/credit_control_communication.py index 8c72c0345..e988a229b 100644 --- a/account_credit_control/wizard/credit_control_communication.py +++ b/account_credit_control/wizard/credit_control_communication.py @@ -19,14 +19,14 @@ # ############################################################################## import logging +from openerp import models, fields, api from openerp import netsvc -from openerp.osv import orm, fields logger = logging.getLogger('credit.control.line.mailing') -class CreditCommunication(orm.TransientModel): - """Shell class used to provide a base model to email template and reporting. +class CreditCommunication(models.TransientModel): + """Shell class used to provide a base model to email template and reporting Il use this approche in version 7 a browse record will exist even if not saved @@ -34,85 +34,64 @@ class CreditCommunication(orm.TransientModel): _name = "credit.control.communication" _description = "credit control communication" _rec_name = 'partner_id' - _columns = { - 'partner_id': fields.many2one( - 'res.partner', - 'Partner', - required=True - ), - 'current_policy_level': fields.many2one( - 'credit.control.policy.level', - 'Level', - required=True - ), + partner_id = fields.Many2one('res.partner', 'Partner', required=True) - 'credit_control_line_ids': fields.many2many( - 'credit.control.line', - rel='comm_credit_rel', - string='Credit Lines' - ), + current_policy_level = fields.Many2one('credit.control.policy.level', + 'Level', + required=True) + credit_control_line_ids = fields.Many2many('credit.control.line', + rel='comm_credit_rel', + string='Credit Lines') - 'company_id': fields.many2one( - 'res.company', - 'Company', - required=True - ), + @api.model + def _get_company(self): + company_obj = self.env['res.company'] + return company_obj._company_default_get('credit.control.policy') - 'user_id': fields.many2one('res.users', 'User') - } + company_id = fields.Many2one('res.company', + string='Company', + default=_get_company, + required=True) + user_id = fields.Many2one('res.users', + default=lambda self: self.env.user, + string='User') - def _get_comp(self, cr, uid, context=None): - return self.pool.get('res.company')._company_default_get( - cr, uid, - 'credit.control.policy', - context=context - ) - - _defaults = { - 'company_id': _get_comp, - 'user_id': lambda s, cr, uid, c: uid - } - - def get_email(self, cr, uid, com_id, context=None): - """Return a valid email for customer""" - if isinstance(com_id, list): - assert len(com_id) == 1, "get_email only support one id as param." - com_id = com_id[0] - form = self.browse(cr, uid, com_id, context=context) - contact = form.get_contact_address() + @api.multi + def get_email(self): + """ Return a valid email for customer """ + self.ensure_one() + contact = self.get_contact_address() return contact.email - def get_contact_address(self, cr, uid, com_id, context=None): - pmod = self.pool['res.partner'] - if isinstance(com_id, list): - com_id = com_id[0] - form = self.browse(cr, uid, com_id, context=context) - part = form.partner_id - add_ids = part.address_get(adr_pref=['invoice']) or {} + @api.multi + @api.returns('res.partner') + def get_contact_address(self): + self.ensure_one() + partner_obj = self.env['res.partner'] + partner = self.partner_id + add_ids = partner.address_get(adr_pref=['invoice']) or {} add_id = add_ids.get('invoice', add_ids.get('default', False)) - return pmod.browse(cr, uid, add_id, context) + return partner_obj.browse(add_id) - def _get_credit_lines(self, cr, uid, line_ids, partner_id, level_id, - context=None): - """Return credit lines related to a partner and a policy level""" - cr_line_obj = self.pool.get('credit.control.line') - cr_l_ids = cr_line_obj.search(cr, - uid, - [('id', 'in', line_ids), + @api.model + @api.returns('credit.control.line') + def _get_credit_lines(self, line_ids, partner_id, level_id): + """ Return credit lines related to a partner and a policy level """ + cr_line_obj = self.env['credit.control.line'] + cr_lines = cr_line_obj.search([('id', 'in', line_ids), ('partner_id', '=', partner_id), - ('policy_level_id', '=', level_id)], - context=context) - return cr_l_ids + ('policy_level_id', '=', level_id)]) + return cr_lines - def _generate_comm_from_credit_line_ids(self, cr, uid, line_ids, - context=None): - """Aggregate credit control line by partner, level, and currency + @api.model + def _generate_comm_from_credit_lines(self, lines): + """ Aggregate credit control line by partner, level, and currency It also generate a communication object per aggregation. """ - if not line_ids: + if not lines: return [] - comms = [] + comms = self.browse() sql = ( "SELECT distinct partner_id, policy_level_id, " " credit_control_line.currency_id, " @@ -124,54 +103,46 @@ class CreditCommunication(orm.TransientModel): " ORDER by credit_control_policy_level.level, " " credit_control_line.currency_id" ) - - cr.execute(sql, (tuple(line_ids),)) + cr = self._cr + cr.execute(sql, (tuple(lines.ids), )) res = cr.dictfetchall() for level_assoc in res: data = {} - data['credit_control_line_ids'] = [ - ( - 6, 0, self._get_credit_lines( - cr, uid, line_ids, - level_assoc['partner_id'], - level_assoc['policy_level_id'], - context=context - ) - ) - ] + level_lines = self._get_credit_lines(lines.ids, + level_assoc['partner_id'], + level_assoc['policy_level_id'] + ) + + data['credit_control_line_ids'] = [(6, 0, level_lines.ids)] data['partner_id'] = level_assoc['partner_id'] data['current_policy_level'] = level_assoc['policy_level_id'] - comm_id = self.create(cr, uid, data, context=context) - comms.append(self.browse(cr, uid, comm_id, context=context)) + comm = self.create(data) + comms += comm return comms - def _generate_emails(self, cr, uid, comms, context=None): - """Generate email message using template related to level""" - cr_line_obj = self.pool.get('credit.control.line') - email_temp_obj = self.pool.get('email.template') - email_message_obj = self.pool.get('mail.mail') - att_obj = self.pool.get('ir.attachment') - email_ids = [] - essential_fields = ['subject', - 'body_html', - 'email_from', - 'email_to'] - - for comm in comms: - # we want to use a local cr in order to send the maximum - # of email - template = comm.current_policy_level.email_template_id.id - email_values = {} - cl_ids = [cl.id for cl in comm.credit_control_line_ids] - email_values = email_temp_obj.generate_email(cr, uid, - template, - comm.id, - context=context) + @api.multi + @api.returns('mail.mail') + def _generate_emails(self): + """ Generate email message using template related to level """ + email_message_obj = self.env['mail.mail'] + email_template_obj = self.pool['email.template'] + att_obj = self.env['ir.attachment'] + emails = email_message_obj.browse() + required_fields = ['subject', + 'body_html', + 'email_from', + 'email_to'] + cr, uid, context = self.env.cr, self.env.uid, self.env.context + for comm in self: + template = comm.current_policy_level.email_template_id + email_values = email_template_obj.generate_email(cr, uid, + template.id, + comm.id, + context=context) email_values['body_html'] = email_values['body'] email_values['type'] = 'email' - email_id = email_message_obj.create(cr, uid, email_values, - context=context) + email = email_message_obj.create(email_values) state = 'sent' # The mail will not be send, however it will be in the pool, in an @@ -179,16 +150,13 @@ class CreditCommunication(orm.TransientModel): # the credit control line # and put this latter in a `email_error` state we not that we have # a problem with the email - if any(not email_values.get(field) for field in essential_fields): + if not all(email_values.get(field) for field in required_fields): state = 'email_error' - cr_line_obj.write( - cr, uid, cl_ids, - {'mail_message_id': email_id, - 'state': state}, - context=context - ) - att_ids = [] + comm.credit_control_line_ids.write({'mail_message_id': email.id, + 'state': state}) + + attachments = att_obj.browse() for att in email_values.get('attachments', []): attach_fname = att[0] attach_datas = att[1] @@ -197,33 +165,35 @@ class CreditCommunication(orm.TransientModel): 'datas': attach_datas, 'datas_fname': attach_fname, 'res_model': 'mail.mail', - 'res_id': email_id, + 'res_id': email.id, 'type': 'binary', } - att_ids.append( - att_obj.create(cr, uid, data_attach, - context=context) - ) - email_message_obj.write(cr, uid, [email_id], - {'attachment_ids': [(6, 0, att_ids)]}, - context=context) - email_ids.append(email_id) - return email_ids + attachments += att_obj.create(data_attach) + email.write({'attachment_ids': [(6, 0, attachments.ids)]}) + emails += email + return emails - def _generate_report(self, cr, uid, comms, context=None): - """Will generate a report by inserting mako template + @api.multi + def _generate_report(self): + """ Will generate a report by inserting mako template of related policy template """ + return '' service = netsvc.LocalService('report.credit_control_summary') - ids = [x.id for x in comms] - result, format = service.create(cr, uid, ids, {}, {}) + cr, uid = self.env.cr, self.env.uid + result, format = service.create(cr, uid, self.ids, {}, {}) return result + # TODO + # return self.env['report'].get_pdf(self, 'credit_control_summary') - def _mark_credit_line_as_sent(self, cr, uid, comms, context=None): - line_ids = [] - for comm in comms: - line_ids += [x.id for x in comm.credit_control_line_ids] - l_obj = self.pool.get('credit.control.line') - l_obj.write(cr, uid, line_ids, {'state': 'sent'}, context=context) - return line_ids + @api.multi + @api.returns('credit.control.line') + def _mark_credit_line_as_sent(self): + line_obj = self.env['credit.control.line'] + lines = line_obj.browse() + for comm in self: + lines += comm.credit_control_line_ids + + lines.write({'state': 'sent'}) + return lines diff --git a/account_credit_control/wizard/credit_control_emailer.py b/account_credit_control/wizard/credit_control_emailer.py index 17528ce71..934c016df 100644 --- a/account_credit_control/wizard/credit_control_emailer.py +++ b/account_credit_control/wizard/credit_control_emailer.py @@ -19,71 +19,51 @@ # ############################################################################## -from openerp.osv import orm, fields -from openerp.tools.translate import _ +from openerp import models, fields, api, _ -class CreditControlEmailer(orm.TransientModel): - """Send emails for each selected credit control lines.""" +class CreditControlEmailer(models.TransientModel): + """ Send emails for each selected credit control lines. """ _name = "credit.control.emailer" _description = """Mass credit line emailer""" _rec_name = 'id' - def _get_line_ids(self, cr, uid, context=None): - if context is None: - context = {} - res = False - if (context.get('active_model') == 'credit.control.line' and + @api.model + def _get_line_ids(self): + context = self.env.context + if not (context.get('active_model') == 'credit.control.line' and context.get('active_ids')): - res = self._filter_line_ids( - cr, uid, - context['active_ids'], - context=context - ) - return res + return False + line_obj = self.env['credit.control.line'] + lines = line_obj.browse(context['active_id']) + return self._filter_lines(lines) - _columns = { - 'line_ids': fields.many2many( - 'credit.control.line', - string='Credit Control Lines', - domain=[('state', '=', 'to_be_sent'), - ('channel', '=', 'email')] - ), - } + line_ids = fields.Many2many('credit.control.line', + string='Credit Control Lines', + default=_get_line_ids, + domain=[('state', '=', 'to_be_sent'), + ('channel', '=', 'email')]) - _defaults = { - 'line_ids': _get_line_ids, - } - - def _filter_line_ids(self, cr, uid, active_ids, context=None): - """filter lines to use in the wizard""" - line_obj = self.pool.get('credit.control.line') + @api.model + @api.returns('credit.control.line') + def _filter_lines(self, lines): + """ filter lines to use in the wizard """ + line_obj = self.env['credit.control.line'] domain = [('state', '=', 'to_be_sent'), - ('id', 'in', active_ids), + ('id', 'in', lines.ids), ('channel', '=', 'email')] - return line_obj.search(cr, uid, domain, context=context) + return line_obj.search(domain) - def email_lines(self, cr, uid, wiz_id, context=None): - assert not (isinstance(wiz_id, list) and len(wiz_id) > 1), \ - "wiz_id: only one id expected" - comm_obj = self.pool.get('credit.control.communication') - if isinstance(wiz_id, list): - wiz_id = wiz_id[0] - form = self.browse(cr, uid, wiz_id, context) + @api.multi + def email_lines(self): + self.ensure_one() + if not self.line_ids: + raise api.Warning(_('No credit control lines selected.')) - if not form.line_ids: - raise orm.except_orm( - _('Error'), - _('No credit control lines selected.') - ) + comm_obj = self.env['credit.control.communication'] - line_ids = [l.id for l in form.line_ids] - filtered_ids = self._filter_line_ids( - cr, uid, line_ids, context - ) - comms = comm_obj._generate_comm_from_credit_line_ids( - cr, uid, filtered_ids, context=context - ) - comm_obj._generate_emails(cr, uid, comms, context=context) - return {} + filtered_lines = self._filter_lines(self.line_ids) + comms = comm_obj._generate_comm_from_credit_lines(filtered_lines) + comms._generate_emails() + return {'type': 'ir.actions.act_window_close'} diff --git a/account_credit_control/wizard/credit_control_marker.py b/account_credit_control/wizard/credit_control_marker.py index 525ba930e..b0b1f75aa 100644 --- a/account_credit_control/wizard/credit_control_marker.py +++ b/account_credit_control/wizard/credit_control_marker.py @@ -18,90 +18,69 @@ # along with this program. If not, see . # ############################################################################## -from openerp.osv import orm, fields -from openerp.tools.translate import _ +from openerp import models, fields, api, _ -class CreditControlMarker(orm.TransientModel): - """Change the state of lines in mass""" +class CreditControlMarker(models.TransientModel): + """ Change the state of lines in mass """ _name = 'credit.control.marker' _description = 'Mass marker' - def _get_line_ids(self, cr, uid, context=None): - if context is None: - context = {} - res = False - if (context.get('active_model') == 'credit.control.line' and + @api.model + def _get_line_ids(self): + context = self.env.context + if not (context.get('active_model') == 'credit.control.line' and context.get('active_ids')): - res = self._filter_line_ids( - cr, uid, - context['active_ids'], - context=context - ) - return res + return False + line_obj = self.env['credit.control.line'] + lines = line_obj.browse(context['active_id']) + return self._filter_lines(lines) - _columns = { - 'name': fields.selection([('ignored', 'Ignored'), - ('to_be_sent', 'Ready To Send'), - ('sent', 'Done')], - 'Mark as', - required=True), - 'line_ids': fields.many2many( - 'credit.control.line', - string='Credit Control Lines', - domain="[('state', '!=', 'sent')]"), - } + name = fields.Selection([('ignored', 'Ignored'), + ('to_be_sent', 'Ready To Send'), + ('sent', 'Done')], + string='Mark as', + default='to_be_sent', + required=True) + line_ids = fields.Many2many('credit.control.line', + string='Credit Control Lines', + default=_get_line_ids, + domain="[('state', '!=', 'sent')]") - _defaults = { - 'name': 'to_be_sent', - 'line_ids': _get_line_ids, - } + @api.model + @api.returns('credit.control.line') + def _filter_lines(self, lines): + """ get line to be marked filter done lines """ + line_obj = self.env['credit.control.line'] + domain = [('state', '!=', 'sent'), ('id', 'in', lines.ids)] + return line_obj.search(domain) - def _filter_line_ids(self, cr, uid, active_ids, context=None): - """get line to be marked filter done lines""" - line_obj = self.pool.get('credit.control.line') - domain = [('state', '!=', 'sent'), ('id', 'in', active_ids)] - return line_obj.search(cr, uid, domain, context=context) + @api.model + @api.returns('credit.control.line') + def _mark_lines(self, filtered_lines, state): + """ write hook """ + assert state + filtered_lines.write({'state': state}) + return filtered_lines - def _mark_lines(self, cr, uid, filtered_ids, state, context=None): - """write hook""" - line_obj = self.pool.get('credit.control.line') - if not state: - raise ValueError(_('state can not be empty')) - line_obj.write(cr, uid, filtered_ids, - {'state': state}, - context=context) - return filtered_ids + @api.multi + def mark_lines(self): + """ Write state of selected credit lines to the one in entry + done credit line will be ignored """ + self.ensure_one() - def mark_lines(self, cr, uid, wiz_id, context=None): - """Write state of selected credit lines to the one in entry - done credit line will be ignored""" - assert not (isinstance(wiz_id, list) and len(wiz_id) > 1), \ - "wiz_id: only one id expected" - if isinstance(wiz_id, list): - wiz_id = wiz_id[0] - form = self.browse(cr, uid, wiz_id, context) + if not self.line_ids: + raise api.Warning(_('No credit control lines selected.')) - if not form.line_ids: - raise orm.except_orm( - _('Error'), - _('No credit control lines selected.') - ) + filtered_lines = self._filter_lines(self.line_ids) + if not filtered_lines: + raise api.Warning(_('No lines will be changed. ' + 'All the selected lines are already done.')) - line_ids = [l.id for l in form.line_ids] + self._mark_lines(filtered_lines, self.name) - filtered_ids = self._filter_line_ids(cr, uid, line_ids, context) - if not filtered_ids: - raise orm.except_orm( - _('Information'), - _('No lines will be changed. ' - 'All the selected lines are already done.') - ) - - self._mark_lines(cr, uid, filtered_ids, form.name, context) - - return {'domain': unicode([('id', 'in', filtered_ids)]), + return {'domain': unicode([('id', 'in', filtered_lines.ids)]), 'view_type': 'form', 'view_mode': 'tree,form', 'view_id': False, diff --git a/account_credit_control/wizard/credit_control_policy_changer.py b/account_credit_control/wizard/credit_control_policy_changer.py index c4f2416e9..d8bded736 100644 --- a/account_credit_control/wizard/credit_control_policy_changer.py +++ b/account_credit_control/wizard/credit_control_policy_changer.py @@ -19,113 +19,99 @@ # ############################################################################## import logging -from openerp.tools.translate import _ -from openerp.osv import orm, fields +from openerp import models, fields, api, _ logger = logging.getLogger(__name__) -class credit_control_policy_changer(orm.TransientModel): - """Wizard that is run from invoices and allows to set manually a policy +class credit_control_policy_changer(models.TransientModel): + """ Wizard that is run from invoices and allows to set manually a policy Policy are actually apply to related move lines availabe in selection widget """ _name = "credit.control.policy.changer" - _columns = { - 'new_policy_id': fields.many2one('credit.control.policy', - 'New Policy to Apply', - required=True), - 'new_policy_level_id': fields.many2one('credit.control.policy.level', - 'New level to apply', - required=True), - # Only used to provide dynamic filtering on form - 'do_nothing': fields.boolean('No follow policy'), - 'move_line_ids': fields.many2many('account.move.line', - rel='credit_changer_ml_rel', - string='Move line to change'), - } - def _get_default_lines(self, cr, uid, context=None): - """Get default lines for fields move_line_ids + new_policy_id = fields.Many2one('credit.control.policy', + string='New Policy to Apply', + required=True) + new_policy_level_id = fields.Many2one('credit.control.policy.level', + string='New level to apply', + required=True) + # Only used to provide dynamic filtering on form + do_nothing = fields.Boolean(string='No follow policy') + + @api.model + def _get_default_lines(self): + """ Get default lines for fields move_line_ids of wizard. Only take lines that are on the same account and move of the invoice and not reconciled - :return: list of compliant move line ids + :return: list of compliant move lines """ - if context is None: - context = {} + context = self.env.context active_ids = context.get('active_ids') - selected_line_ids = [] - inv_model = self.pool['account.invoice'] - move_line_model = self.pool['account.move.line'] + invoice_obj = self.env['account.invoice'] + move_line_obj = self.env['account.move.line'] if not active_ids: return False - # raise ValueError('No active_ids passed in context') - for invoice in inv_model.browse(cr, uid, active_ids, context=context): + selected_lines = move_line_obj.browse() + for invoice in invoice_obj.browse(active_ids): if invoice.type in ('in_invoice', 'in_refund', 'out_refund'): - raise orm.except_orm( - _('User error'), - _('Please use wizard on cutomer invoices') - ) + raise api.Warning(_('Please use wizard on customer invoices')) domain = [('account_id', '=', invoice.account_id.id), ('move_id', '=', invoice.move_id.id), ('reconcile_id', '=', False)] - move_ids = move_line_model.search(cr, uid, domain, context=context) - selected_line_ids.extend(move_ids) - return selected_line_ids + move_lines = move_line_obj.search(domain) + selected_lines += move_lines + return selected_lines - _defaults = {'move_line_ids': _get_default_lines} + move_line_ids = fields.Many2many('account.move.line', + rel='credit_changer_ml_rel', + string='Move line to change', + default=_get_default_lines) - def onchange_policy_id(self, cr, uid, ids, new_policy_id, context=None): - if not new_policy_id: - return {} - policy = self.pool['credit.control.policy'].browse(cr, uid, - new_policy_id, - context=context) - return {'value': {'do_nothing': policy.do_nothing}} + @api.onchange('new_policy_level_id') + def onchange_policy_id(self): + if not self.new_policy_id: + return + self.do_nothing = self.new_policy_id.do_nothing - def _mark_as_overridden(self, cr, uid, move_lines, context=None): - """Mark `move_lines` related credit control line as overridden + @api.model + @api.returns('credit.control.line') + def _mark_as_overridden(self, move_lines): + """ Mark `move_lines` related credit control line as overridden This is done by setting manually_overridden fields to True :param move_lines: move line to mark as overridden - - :retun: list of credit line ids that where marked as overridden - + :return: list of credit lines that where marked as overridden """ - credit_model = self.pool['credit.control.line'] - domain = [('move_line_id', 'in', [x.id for x in move_lines])] - credits_ids = credit_model.search(cr, uid, domain, context=context) - credit_model.write(cr, uid, - credits_ids, - {'manually_overridden': True}, - context) - return credits_ids + credit_obj = self.env['credit.control.line'] + domain = [('move_line_id', 'in', move_lines.ids)] + credit_lines = credit_obj.search(domain) + credit_lines.write({'manually_overridden': True}) + return credit_lines - def _set_invoice_policy(self, cr, uid, move_line_ids, policy, - context=None): - """Force policy on invoice""" - invoice_model = self.pool['account.invoice'] - invoice_ids = set([x.invoice.id for x in move_line_ids if x.invoice]) - invoice_model.write(cr, uid, list(invoice_ids), - {'credit_policy_id': policy.id}, - context=context) + @api.model + def _set_invoice_policy(self, move_lines, policy): + """ Force policy on invoice """ + invoice_obj = self.env['account.invoice'] + invoice_ids = set(line.invoice.id for line in move_lines + if line.invoice) + invoices = invoice_obj.browse(invoice_ids) + invoices.write({'credit_policy_id': policy.id}) - def _check_accounts_policies(self, cr, uid, lines, policy, context=None): - policy_obj = self.pool['credit.control.policy'] - for line in lines: - policy_obj.check_policy_against_account( - cr, uid, - line.account_id.id, - policy.id, - context=context - ) + @api.model + def _check_accounts_policies(self, lines, policy): + accounts = set(line.account_id for line in lines) + for account in accounts: + policy.check_policy_against_account(account) return True - def set_new_policy(self, cr, uid, wizard_id, context=None): - """Set new policy on an invoice. + @api.multi + def set_new_policy(self): + """ Set new policy on an invoice. This is done by creating a new credit control line related to the move line and the policy setted in @@ -134,49 +120,29 @@ class credit_control_policy_changer(orm.TransientModel): :return: ir.actions.act_windows dict """ - assert len(wizard_id) == 1, "Only one id expected" - wizard_id = wizard_id[0] + self.ensure_one() + credit_line_obj = self.env['credit.control.line'] - credit_line_model = self.pool['credit.control.line'] - ir_model = self.pool['ir.model.data'] - ui_act_model = self.pool['ir.actions.act_window'] - wizard = self.browse(cr, uid, wizard_id, context=context) controlling_date = fields.date.today() - self._check_accounts_policies( - cr, - uid, - wizard.move_line_ids, - wizard.new_policy_id) - self._mark_as_overridden( - cr, - uid, - wizard.move_line_ids, - context=context - ) + self._check_accounts_policies(self.move_line_ids, self.new_policy_id) + self._mark_as_overridden(self.move_line_ids) # As disscused with business expert # draft lines should be passed to ignored # if same level as the new one # As it is a manual action # We also ignore rounding tolerance - generated_ids = None - generated_ids = credit_line_model.create_or_update_from_mv_lines( - cr, uid, [], - [x.id for x in wizard.move_line_ids], - wizard.new_policy_level_id.id, - controlling_date, - check_tolerance=False, - context=None - ) - self._set_invoice_policy(cr, uid, - wizard.move_line_ids, - wizard.new_policy_id, - context=context) - if not generated_ids: - return {} - view_id = ir_model.get_object_reference(cr, uid, - "account_credit_control", - "credit_control_line_action") - assert view_id, 'No view found' - action = ui_act_model.read(cr, uid, view_id[1], context=context) - action['domain'] = [('id', 'in', generated_ids)] + create = credit_line_obj.create_or_update_from_mv_lines + generated_lines = create(self.move_line_ids, + self.new_policy_level_id, + controlling_date, + check_tolerance=False) + self._set_invoice_policy(self.move_line_ids, self.new_policy_id) + + if not generated_lines: + return {'type': 'ir.actions.act_window_close'} + + action_ref = 'account_credit_control.credit_control_line_action' + action = self.env.ref(action_ref) + action = action.read()[0] + action['domain'] = [('id', 'in', generated_lines.ids)] return action diff --git a/account_credit_control/wizard/credit_control_policy_changer_view.xml b/account_credit_control/wizard/credit_control_policy_changer_view.xml index f65356ea0..cee46799d 100644 --- a/account_credit_control/wizard/credit_control_policy_changer_view.xml +++ b/account_credit_control/wizard/credit_control_policy_changer_view.xml @@ -11,8 +11,7 @@ - + 1), \ - "wiz_id: only one id expected" - comm_obj = self.pool.get('credit.control.communication') - if isinstance(wiz_id, list): - wiz_id = wiz_id[0] - form = self.browse(cr, uid, wiz_id, context) + @api.multi + def print_lines(self): + self.ensure_one() + comm_obj = self.env['credit.control.communication'] + if not self.line_ids and not self.print_all: + raise api.Warning(_('No credit control lines selected.')) - if not form.line_ids and not form.print_all: - raise orm.except_orm(_('Error'), - _('No credit control lines selected.')) + lines = self._get_lines(self.line_ids, self._credit_line_predicate) - line_ids = self._get_line_ids(cr, - uid, - form.line_ids, - self._credit_line_predicate, - context=context) + comms = comm_obj._generate_comm_from_credit_lines(lines) - comms = comm_obj._generate_comm_from_credit_line_ids(cr, uid, line_ids, - context=context) - report_file = comm_obj._generate_report(cr, uid, comms, - context=context) + report_content = comms._generate_report() - form.write({'report_file': base64.b64encode(report_file), + self.write({'report_file': base64.b64encode(report_content), 'report_name': ('credit_control_esr_bvr_%s.pdf' % fields.datetime.now()), 'state': 'done'}) - if form.mark_as_sent: - comm_obj._mark_credit_line_as_sent(cr, uid, comms, context=context) - - return {'type': 'ir.actions.act_window', - 'res_model': 'credit.control.printer', - 'view_mode': 'form', - 'view_type': 'form', - 'res_id': form.id, - 'views': [(False, 'form')], - 'target': 'new', - } + if self.mark_as_sent: + comms._mark_credit_line_as_sent() + action = self.get_formview_action()[0] + action['target'] = 'new' + return action