OSPPCloudEnterprise3/addons/ospp_slide/models/models.py

179 lines
9.3 KiB
Python

# -*- 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")
shared_instance_demo_data = fields.Boolean('Shared Instance Demo Data', default=True)
excluded_instance_demo_data = fields.Boolean('Excluded Instance Demo Data', default=False)
# @api.depends('slide_partner_ids')
def action_generate_instance(self):
instance_obj = self.env['channel.instance'].sudo()
partner_obj = self.env['slide.channel.partner'].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!"))
partner_ids = partner_obj.search([('channel_id', '=', rec.id)])
if not rec.instance_ids:
if rec.instance_arrangement in ['share', 'both']:
vals = []
for i in range(rec.shared_instance_count):
service_name = f"{rec.code}{i}"
val = {
"name": service_name,
"channel_id": rec.id,
"instance_id": rec.instance_base and rec.instance_base.id,
"service_name": service_name,
"service_url": f"{rec.instance_base.service_scheme}://{service_name}.{rec.instance_base.service_base_host}",
"admin_account": f"{rec.user_id.email}",
"admin_password": f"{random.randint(10000000,99999999)}",
"user_scope": [(6, 0, partner_ids.ids)],
"type": "share",
"demo_data": rec.shared_instance_demo_data
}
vals.append(val)
instance_obj.create(vals)
if rec.instance_arrangement in ['exclude', 'both']:
vals = []
for partner_id in partner_ids:
service_name = f"{rec.code}{partner_id.partner_id.code}"
val = {
"name": service_name,
"channel_id": rec.id,
"instance_id": rec.instance_base and rec.instance_base.id,
"service_name": service_name,
"service_url": f"{rec.instance_base.service_scheme}://{service_name}.{rec.instance_base.service_base_host}",
"admin_account": f"{partner_id.partner_email}",
"admin_password": f"{random.randint(10000000,99999999)}",
"user_scope": [(6, 0, partner_id.ids)],
"type": "exclude",
"demo_data": rec.excluded_instance_demo_data
}
vals.append(val)
instance_obj.create(vals)
else:
if rec.instance_arrangement in ['share', 'both']:
vals = []
for i in range(rec.shared_instance_count):
service_name = f"{rec.code}{i}"
instance_id = instance_obj.search([('name', '=', service_name), ('channel_id', '=', rec.id)])
if not instance_id:
val = {
"name": service_name,
"channel_id": rec.id,
"instance_id": rec.instance_base and rec.instance_base.id,
"service_name": service_name,
"service_url": f"{rec.instance_base.service_scheme}://{service_name}.{rec.instance_base.service_base_host}",
"admin_account": f"{rec.user_id.email}",
"admin_password": f"{random.randint(10000000,99999999)}",
"user_scope": [(6, 0, partner_ids.ids)],
"type": "share",
"demo_data": rec.shared_instance_demo_data
}
vals.append(val)
if vals:
instance_obj.create(vals)
if rec.instance_arrangement in ['exclude', 'both']:
vals = []
for partner_id in partner_ids:
service_name = f"{rec.code}{partner_id.partner_id.code}"
instance_id = instance_obj.search([('name', '=', service_name), ('channel_id', '=', rec.id)])
if not instance_id:
val = {
"name": service_name,
"channel_id": rec.id,
"instance_id": rec.instance_base and rec.instance_base.id,
"service_name": service_name,
"service_url": f"{rec.instance_base.service_scheme}://{service_name}.{rec.instance_base.service_base_host}",
"admin_account": f"{partner_id.partner_email}",
"admin_password": f"{random.randint(10000000,99999999)}",
"user_scope": [(6, 0, partner_id.ids)],
"type": "exclude",
"demo_data": rec.excluded_instance_demo_data
}
vals.append(val)
if vals:
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')
instance_created = fields.Boolean('Instance Created', default=False)
message = fields.Text('Message')
demo_data = fields.Boolean('Demo Data', default=True)
is_notified = fields.Boolean('Is Notified', default=False)
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)