# Copyright 2018-Today datenpol gmbh () # License OPL-1 or later (https://www.odoo.com/documentation/user/11.0/legal/licenses/licenses.html#licenses). import json import requests from odoo import tools, api, fields, models, _ from odoo.exceptions import ValidationError, UserError class PortalAssignCompany(models.TransientModel): _name = 'portal.assign_company' _description = 'Unternehmen zuordnen' main_partner_id = fields.Many2one('res.partner', 'Zugewiesenes Unternehmen', domain=[('is_company', '=', True)]) @api.onchange('main_partner_id') def _onchange_main_partner_id(self): for record in self: if record.main_partner_id and record.main_partner_id.portal_id: return { 'warning': { 'title': _('Warning!'), 'message': _('Achtung: Das ausgewählte Unternehmen ist bereits mit dem Portal verknüpft. ' 'Wenn Sie das Unternehmen zuweisen, dann könnte es zu Problemen im Portal kommen'), } } def send_to_portal(self, portal_id, odoo_id): """ SST-15 :param portal_id: :param odoo_id: :return: """ self.ensure_one() portal_url = tools.config.get('portal_url') application_id = tools.config.get('portal_secret') data = { 'portal_id': portal_id, 'company_odoo_id': odoo_id } response = requests.post(portal_url + '/api/v1/set-odoo-id/?secret=' + application_id, data=json.dumps(data)) if response.status_code != 200: error_content = True error_msg = "" try: error_msg = json.loads(response.content.decode()) except Exception: error_content = False if error_content and error_msg.get('errors'): raise UserError(_('%s') % (error_msg.get('errors')[0])) else: raise UserError(_('Die Odoo id konnte für den Partner nicht gesetzt werden. ' 'Status Code: %s, Reason: %s') % (response.status_code, response.reason)) def button_activate(self): self.ensure_one() partner = self.env['res.partner'].browse(self.env.context.get('active_ids', [])) if not partner: raise ValidationError(_('Der Partner konnte nicht gefunden werden.')) # Wichtig hier ist, dass dieser Call vor dem ersten Write stattfindet, da das Portal # parallel einen Call absetzt, dann dann blockieren würde. self.send_to_portal(partner.portal_id, partner.id) partner.write({'portal_pending': False, 'active': True}) return True def button_assign(self): self.ensure_one() if self.main_partner_id: partner = self.env['res.partner'].browse(self.env.context.get('active_ids', [])) if not partner: raise ValidationError(_('Der Partner konnte nicht gefunden werden.')) portal_id = partner.portal_id # Wichtig hier ist, dass dieser Call vor dem ersten Write stattfindet, da das Portal # parallel einen Call absetzt, dann dann blockieren würde. self.send_to_portal(portal_id, self.main_partner_id.id) partner.unlink() if not self.main_partner_id.portal_id: self.main_partner_id.portal_id = portal_id action = self.env.ref('base.action_partner_form').read()[0] action['res_id'] = self.main_partner_id.id return action return {'type': 'ir.actions.act_window_close'}