# -*- coding: utf-8 -*- import random import uuid from odoo import models, fields, api, _ from odoo.exceptions import UserError, ValidationError class SlideChannel(models.Model): _inherit = 'slide.channel' uuid = fields.Char('UUID', required=True, copy=False, readonly=True, default=lambda self: uuid.uuid4(), tracking=True) code = fields.Char('Code', required=True, copy=False, readonly=True, default=lambda self: _('New'), tracking=True) instance_arrangement = fields.Selection( [('share', 'Share'), ('exclude', 'Exclude'), ('both', 'Both'), ('no_need', 'No Need')], required=True, default="no_need", string="Instance Arrangement") shared_instance_count = fields.Integer('Shared Instance Count', default=1) instance_base = fields.Many2one('ospp.instance', string="Instance Base") instance_ids = fields.One2many('channel.instance', 'channel_id', string="Instances") # @api.depends('slide_partner_ids') def action_generate_instance(self): instance_obj = self.env['channel.instance'].sudo() for rec in self: if rec.instance_arrangement not in ['no_need'] and not (rec.instance_arrangement and rec.instance_base): raise ValidationError(_("No Instance Arrangement or Base provided!")) if not rec.instance_ids: if rec.instance_arrangement in ['share']: vals = [] for i in range(rec.shared_instance_count): val = { "name": rec.id, "channel_id": rec.id, "instance_id": rec.instance_base and rec.instance_base.id, "service_name": f"{rec.code}", "service_url": f"{rec.service_scheme}://{rec.code}-{i}.{rec.instance_base.service_base_host}", "admin_account": f"{rec.user_id.email}", "admin_password": f"{random.randint(10000000,99999999)}", "type": "share", } vals.append(val) instance_obj.create(vals) def name_get(self): # Prefetch the fields used by the `name_get`, so `browse` doesn't fetch other fields self.browse(self.ids).read(['name', 'code']) return [(channel.id, '%s%s' % (channel.code and '[%s] ' % channel.code or '', channel.name)) for channel in self] @api.model_create_multi def create(self, vals_list): for vals in vals_list: if 'company_id' in vals: self = self.with_company(vals['company_id']) if vals.get('code', _("New")) == _("New"): seq_date = None vals['code'] = self.env['ir.sequence'].next_by_code('slide.channel', sequence_date=seq_date) or _("New") return super().create(vals_list) class ChannelInstance(models.Model): _name = "channel.instance" _inherit = ['mail.thread', 'mail.activity.mixin'] _description = "Channel Instance" sequence = fields.Integer('Sequence', default=10) uuid = fields.Char( 'UUID', required=True, copy=False, readonly=True, default=lambda self: uuid.uuid4(), tracking=True) code = fields.Char('Code', required=True, copy=False, readonly=True, default=lambda self: _('New'), tracking=True) channel_id = fields.Many2one('slide.channel', required=True, string="Channel") instance_id = fields.Many2one('ospp.instance', required=True, string="Instance") name = fields.Char('Name', required=True) service_name = fields.Char('Service Name', required=True) service_url = fields.Char('Service URL', required=True) user_scope = fields.Many2many('slide.channel.partner', string="User Scope") admin_account = fields.Char('Admin Account') admin_password = fields.Char('Admin Password') active = fields.Boolean('Active', default=True) type = fields.Selection([('share', 'Share'), ('exclude', 'Exclude')], string="Type", required=True, default='share') def name_get(self): # Prefetch the fields used by the `name_get`, so `browse` doesn't fetch other fields self.browse(self.ids).read(['name', 'code']) return [(channel.id, '%s%s' % (channel.code and '[%s] ' % channel.code or '', channel.name)) for channel in self] @api.model_create_multi def create(self, vals_list): for vals in vals_list: if 'company_id' in vals: self = self.with_company(vals['company_id']) if vals.get('code', _("New")) == _("New"): seq_date = None vals['code'] = self.env['ir.sequence'].next_by_code( 'channel.instance', sequence_date=seq_date) or _("New") return super().create(vals_list)