diff options
Diffstat (limited to 'addons/snailmail/wizard/multi_compose_message.py')
| -rw-r--r-- | addons/snailmail/wizard/multi_compose_message.py | 244 |
1 files changed, 0 insertions, 244 deletions
diff --git a/addons/snailmail/wizard/multi_compose_message.py b/addons/snailmail/wizard/multi_compose_message.py deleted file mode 100644 index 14df5467e7e..00000000000 --- a/addons/snailmail/wizard/multi_compose_message.py +++ /dev/null @@ -1,244 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. -import re - -from odoo import api, fields, models, _ -from odoo.addons.iap import jsonrpc - -DEFAULT_ENDPOINT = 'https://iap-services.odoo.com' -ESTIMATE_ENDPOINT = '/iap/snailmail/1/estimate' -PRINT_ENDPOINT = '/iap/snailmail/1/print' - - -class MultiComposer(models.TransientModel): - - _name = 'multi.compose.message' - _inherit = 'multi.compose.message' - - partner_id = fields.Many2one('res.partner', string='Partner') - snailmail_color = fields.Boolean(string='Color', default=lambda self: self.env.user.company_id.snailmail_color) - snailmail_duplex = fields.Boolean(string='Both side', default=lambda self: self.env.user.company_id.snailmail_duplex) - snailmail_send_by_letter = fields.Boolean('Post', default=lambda self: self.env.user.company_id.snailmail_send_by_letter) - - snailmail_cost = fields.Float(string='Credits', compute='_snailmail_estimate', store=True, readonly=True) - currency_id = fields.Many2one('res.currency', default=lambda self: self.env.user.company_id.currency_id.id, string="Currency") - - @api.multi - def _update_company(self): - super(MultiComposer,self)._update_company() - for rec in self: - if rec.company_id.snailmail_send_by_letter != rec.snailmail_send_by_letter: - rec.company_id.write({ - 'snailmail_send_by_letter': rec.snailmail_send_by_letter, - }) - - @api.multi - def _snailmail_create(self, route, batch=False): - """ - Create a dictionnary object to send to snailmail server. - - :return: Dict in the form: - { - account_token: string, //IAP Account token of the user - documents: [{ - pages: int, - pdf_bin: pdf file - res_id: int (client-side res_id), - res_model: char (client-side res_model), - address: { - name: char, - street: char, - street2: char (OPTIONAL), - zip: int, - city: char, - state: char (state code (OPTIONAL)), - country_code: char (country code) - } - return_address: { - name: char, - street: char, - street2: char (OPTIONAL), - zip: int, - city: char, - state: char (state code (OPTIONAL)), - country_code: char (country code) - } - }], - options: { - color: boolean (true if color, false if black-white), - duplex: boolean (true if duplex, false otherwise), - } - } - """ - account_token = self.env['iap.account'].get('snailmail').account_token - documents = [] - pdf = self.print_attachment_id.datas - if pdf: - documents.append({ - 'pdf_bin': route == 'print' and pdf, - 'pages': route == 'estimate' and self._count_pages_pdf(pdf), - 'address': { - 'name': self.partner_id.name, - 'street': self.partner_id.street, - 'street2': self.partner_id.street2, - 'zip': self.partner_id.zip, - 'state': self.partner_id.state_id.code if self.partner_id.state_id else False, - 'city': self.partner_id.city, - 'country_code': self.partner_id.country_id.code - }, - 'return_address': { - 'name': self.company_id.partner_id.name, - 'street': self.company_id.partner_id.street, - 'street2': self.company_id.partner_id.street2, - 'zip': self.company_id.partner_id.zip, - 'state': self.company_id.partner_id.state_id.code if self.company_id.partner_id.state_id else False, - 'city': self.company_id.partner_id.city, - 'country_code': self.company_id.partner_id.country_id.code, - } - }) - return { - 'account_token': account_token, - 'documents': documents, - 'options': { - 'color': self.snailmail_color, - 'duplex': self.snailmail_duplex, - }, - 'batch': batch, - } - - @api.multi - def action_snailmail_print(self): - """ - get response - { - 'request_code': RESPONSE_OK, # 200 if good or fail - 'total_cost': total_cost, - 'credit_error': credit_error, - 'request': { - 'documents': documents, - 'options': options - } - } - } - """ - self.ensure_one() - endpoint = self.env['ir.config_parameter'].sudo().get_param('snailmail.endpoint', DEFAULT_ENDPOINT) - params = self._snailmail_create('print', batch=True) - response = jsonrpc(endpoint + PRINT_ENDPOINT, params=params) - - error = False - doc = response['request']['documents'][0] - record = self.env[self.model].browse(self.res_id) - if doc.get('sent') and response['request_code'] == 200: - if hasattr(record, '_message_log'): - message = _('The document was correctly sent by post.<br>The tracking id is %s' % doc['send_id']) - record._message_log(body=message) - else: - activity_data = { - 'res_id': self.res_id, - 'res_model_id': self.env['ir.model']._get(self.model).id, - 'activity_type_id': self.env.ref('snailmail.mail_activity_data_snailmail').id, - 'summary': _('Post letter: an error occured.'), - 'note': _('An error occured when sending the document by post.<br>Error: %s' % \ - self._get_error_message(doc['error'] if response['request_code'] == 200 else response['reason'])), - 'user_id': self.env.user.id, - } - self.env['mail.activity'].create(activity_data) - error = True - if not error: - notification = _('Post letter: document sent.') - else: - notification = _('Post letter: an error occured. Please check the document for more information.') - # as we interact with the exterior world, we commit - self.env.cr.commit() - self._update_company() - return { - 'error': error, - 'message': notification, - } - - @api.multi - @api.depends('print_attachment_id') - @api.onchange('snailmail_send_by_letter') - def _snailmail_estimate(self): - """ - Send a request to estimate the cost of sending all the documents with - the differents options. - - The JSON object sent is the one generated from self._snailmail_create() - - arguments sent: - { - "documents":[{ - pages: int, - res_id: int (client_side, optional), - res_model: int (client_side, optional), - address: { - country_code: char (country name) - } - }], - 'color': # color on the letter, - 'duplex': # one/two side printing, - } - - The answer of the server is the same JSON object with some additionnal fields: - { - "total_cost": integer, //The cost of sending ALL the documents - body: JSON object (same as body param except new param 'cost' in each documents) - } - """ - for composer in self: - if not composer.partner_id: - composer.partner_id = self.env[self.model].browse(self.res_id).partner_id - - if composer.snailmail_send_by_letter and composer.print_attachment_id :# and not composer.is_estimated: - endpoint = self.env['ir.config_parameter'].sudo().get_param('snailmail.endpoint', DEFAULT_ENDPOINT) - - params = composer._snailmail_create('estimate') - req = jsonrpc(endpoint + '/iap/snailmail/1/estimate', params=params) - composer.is_estimated = True - - # The cost is sent in eurocents, we change it to euros and then convert it to the company currency - cost = int(req['total_cost'])/100.0 - currency_eur = self.env.ref('base.EUR') - - composer.snailmail_cost = currency_eur._convert(cost, self.currency_id, self.company_id, fields.Datetime.now()) - - # all the print stuff will go to the cron onsnailail print orders - - def _count_pages_pdf(self, bin_pdf): - """ Count the number of pages of the given pdf file. - :param bin_pdf : binary content of the pdf file - """ - pages = 0 - for match in re.compile(b"/Count\s+(\d+)").finditer(bin_pdf): - pages = int(match.group(1)) - return pages - - def _get_error_message(self, error): - if error == 'CREDIT_ERROR': - link = self.env['iap.account'].get_credits_url(service_name='snailmail') - return _('You don\'t have enough credits to perform this operation.<br>Please go to your <a href=%s target="new">iap account</a>.' % link) - if error == 'NO_PRICE_AVAILABLE': - return _('The country of the partner is not covered by Snailmail.') - if error == 'MISSING_REQUIRED_FIELDS': - return _('One or more required fields are empty.') - if error == 'SOMETHING_IS_WRONG': - return _('An unknown error happened. Please contact the support.') - return error - - - @api.multi - def send_and_print_action(self): - res = super(MultiComposer,self).send_and_print_action() - if self.snailmail_send_by_letter: - self.action_snailmail_print() - return res - - @api.multi - def send_action(self): - res = super(MultiComposer,self).send_action() - for wizard in self: - if wizard.snailmail_send_by_letter: - wizard.action_snailmail_print() - return res |
