From 35d436b0ff5eb06d362c7fec3211683f8578fcf4 Mon Sep 17 00:00:00 2001 From: Oliver Yuan Date: Sun, 16 Apr 2023 10:53:43 +0800 Subject: [PATCH] [IMP] Improve ospp_base and ospp_slide modules --- addons/ospp_base/__manifest__.py | 5 +- addons/ospp_base/data/ir_sequence_data.xml | 20 ++++ addons/ospp_base/models/models.py | 72 ++++++++++--- addons/ospp_base/security/ir.model.access.csv | 5 +- addons/ospp_base/security/security_groups.xml | 49 +++++++++ addons/ospp_base/views/views.xml | 88 ++++++++++----- addons/ospp_slide/__manifest__.py | 5 +- addons/ospp_slide/data/ir_sequence_data.xml | 20 ++++ addons/ospp_slide/models/models.py | 53 ++++++---- .../ospp_slide/security/ir.model.access.csv | 5 +- .../ospp_slide/security/security_groups.xml | 49 +++++++++ addons/ospp_slide/views/views.xml | 100 ++++++++---------- 12 files changed, 354 insertions(+), 117 deletions(-) create mode 100644 addons/ospp_base/data/ir_sequence_data.xml create mode 100755 addons/ospp_base/security/security_groups.xml create mode 100644 addons/ospp_slide/data/ir_sequence_data.xml create mode 100755 addons/ospp_slide/security/security_groups.xml diff --git a/addons/ospp_base/__manifest__.py b/addons/ospp_base/__manifest__.py index b98f768..4641a9a 100644 --- a/addons/ospp_base/__manifest__.py +++ b/addons/ospp_base/__manifest__.py @@ -11,6 +11,7 @@ 'author': "Zhiguo Yuan", 'website': "https://www.newbizpaas.cn", + 'license': 'LGPL-3', # Categories can be used to filter modules in modules listing # Check https://github.com/odoo/odoo/blob/16.0/odoo/addons/base/data/ir_module_category_data.xml @@ -23,7 +24,9 @@ # always loaded 'data': [ - # 'security/ir.model.access.csv', + 'security/security_groups.xml', + 'security/ir.model.access.csv', + 'data/ir_sequence_data.xml', 'views/views.xml', 'views/templates.xml', ], diff --git a/addons/ospp_base/data/ir_sequence_data.xml b/addons/ospp_base/data/ir_sequence_data.xml new file mode 100644 index 0000000..045626e --- /dev/null +++ b/addons/ospp_base/data/ir_sequence_data.xml @@ -0,0 +1,20 @@ + + + + + OSPP Instance + ospp.instance + + 5 + + + + + Res Partner + res.partner + + 8 + + + + diff --git a/addons/ospp_base/models/models.py b/addons/ospp_base/models/models.py index 83fe09a..cbfeca2 100644 --- a/addons/ospp_base/models/models.py +++ b/addons/ospp_base/models/models.py @@ -1,22 +1,70 @@ # -*- coding: utf-8 -*- -from odoo import models, fields, api +import uuid +from odoo import models, fields, api, _ + + +class ResPartner(models.Model): + _inherit = 'res.partner' + + 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) + + 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 [(partner.id, '%s%s' % (partner.code and '[%s] ' % partner.code or '', partner.name)) + for partner in self] + + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + if vals.get('code', _("New")) == _("New"): + seq_date = None + vals['code'] = self.env['ir.sequence'].next_by_code('res.partner', sequence_date=seq_date) or _("New") + + return super().create(vals_list) class OSPPInstance(models.Model): _name = 'ospp.instance' + _inherit = ['mail.thread', 'mail.activity.mixin'] _description = 'OSPP Instance' - name = fields.Char("Name") - code = fields.Char("Code") - type = fields.Selection([('saas', 'SAAS'), ('paas', 'PAAS')], required=True, string="Type") - stack = fields.Selection([('docker', 'Docker'), ('k8s', 'K8S'), ('odoo', 'ODOO')], required=True, string="Stack") - management_api = fields.Char('Management Api', required=True) - management_key = fields.Char('Management Key') - management_secret = fields.Char('Management Secret') - service_base_host = fields.Char('Service Base Host') + sequence = fields.Integer('Sequence', default=10) + name = fields.Char("Name", tracking=True) + 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) + type = fields.Selection([('saas', 'SAAS'), ('paas', 'PAAS')], required=True, string="Type", tracking=True) + stack = fields.Selection( + [('docker', 'Docker'), ('k8s', 'K8S'), ('odoo', 'ODOO'), ('other', 'Other')], required=True, string="Stack", + tracking=True) + management_api = fields.Char('Management Api', required=True, tracking=True) + management_key = fields.Char('Management Key', tracking=True) + management_secret = fields.Char('Management Secret', tracking=True) + service_base_host = fields.Char('Service Base Host', tracking=True) service_scheme = fields.Selection( [('http', 'HTTP'), ('https', 'HTTPS'), ('ws', 'WS'), ('wss', 'WSS')], - required=True, string="Service Scheme") - dockerfile = fields.Text("Dockerfile") - active = fields.Boolean('Active', default=True) + required=True, string="Service Scheme", tracking=True) + dockerfile = fields.Text("Dockerfile", tracking=True) + active = fields.Boolean('Active', default=True, tracking=True) + + 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 [(instance.id, '%s%s' % (instance.code and '[%s] ' % instance.code or '', instance.name)) + for instance 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( + 'ospp.instance', sequence_date=seq_date) or _("New") + + return super().create(vals_list) diff --git a/addons/ospp_base/security/ir.model.access.csv b/addons/ospp_base/security/ir.model.access.csv index a598b32..acda2b4 100644 --- a/addons/ospp_base/security/ir.model.access.csv +++ b/addons/ospp_base/security/ir.model.access.csv @@ -1,2 +1,5 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_ospp_base_ospp_base,ospp_base.ospp_base,model_ospp_base_ospp_base,base.group_user,1,1,1,1 \ No newline at end of file +access_ospp_instance_group_model_ospp_instance_read,ospp_instance_group_model_ospp_instance_read,ospp_base.model_ospp_instance,group_model_ospp_instance_read,1,0,0,0 +access_ospp_instance_group_model_ospp_instance_write,ospp_instance_group_model_ospp_instance_write,ospp_base.model_ospp_instance,group_model_ospp_instance_write,1,1,0,0 +access_ospp_instance_group_model_ospp_instance_create,ospp_instance_group_model_ospp_instance_create,ospp_base.model_ospp_instance,group_model_ospp_instance_create,1,0,1,0 +access_ospp_instance_group_model_ospp_instance_delete,ospp_instance_group_model_ospp_instance_delete,ospp_base.model_ospp_instance,group_model_ospp_instance_delete,1,1,1,1 diff --git a/addons/ospp_base/security/security_groups.xml b/addons/ospp_base/security/security_groups.xml new file mode 100755 index 0000000..c38bd10 --- /dev/null +++ b/addons/ospp_base/security/security_groups.xml @@ -0,0 +1,49 @@ + + + + + 实例菜单 + 实例菜单 + 14 + + + + 实例模型 + 实例菜单 + 14 + + + + 实例按钮 + 实例按钮 + 14 + + + + ospp.instance read + + + + + + ospp.instance write + + + + + + + ospp.instance create + + + + + + + ospp.instance delete + + + + + + diff --git a/addons/ospp_base/views/views.xml b/addons/ospp_base/views/views.xml index 601d12c..0585955 100644 --- a/addons/ospp_base/views/views.xml +++ b/addons/ospp_base/views/views.xml @@ -1,28 +1,74 @@ - - + + OSPP Instance List View + ospp.instance + + - - + + + + ---> + + + OSPP Instance Form View + ospp.instance + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
- + - + - - +
\ No newline at end of file diff --git a/addons/ospp_slide/__manifest__.py b/addons/ospp_slide/__manifest__.py index e283853..11f9767 100644 --- a/addons/ospp_slide/__manifest__.py +++ b/addons/ospp_slide/__manifest__.py @@ -11,6 +11,7 @@ 'author': "Zhiguo Yuan", 'website': "https://www.newbizpaas.cn", + 'license': 'LGPL-3', # Categories can be used to filter modules in modules listing # Check https://github.com/odoo/odoo/blob/16.0/odoo/addons/base/data/ir_module_category_data.xml @@ -23,7 +24,9 @@ # always loaded 'data': [ - # 'security/ir.model.access.csv', + 'security/security_groups.xml', + 'security/ir.model.access.csv', + 'data/ir_sequence_data.xml', 'views/views.xml', 'views/templates.xml', ], diff --git a/addons/ospp_slide/data/ir_sequence_data.xml b/addons/ospp_slide/data/ir_sequence_data.xml new file mode 100644 index 0000000..0b12991 --- /dev/null +++ b/addons/ospp_slide/data/ir_sequence_data.xml @@ -0,0 +1,20 @@ + + + + + Slide Channel + slide.channel + + 5 + + + + + Channel Instance + channel.instance + + 5 + + + + diff --git a/addons/ospp_slide/models/models.py b/addons/ospp_slide/models/models.py index 01a1f55..c45f01c 100644 --- a/addons/ospp_slide/models/models.py +++ b/addons/ospp_slide/models/models.py @@ -1,16 +1,20 @@ # -*- coding: utf-8 -*- +import uuid from odoo import models, fields, api, _ class SlideChannel(models.Model): _inherit = 'slide.channel' - code = fields.Char('Code', required=True, copy=False, readonly=True, default=lambda self: _('New')) + 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')], - string="Instance Arrangement") - share_instance_count = fields.Integer('Shared Instance Count') + [('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") @@ -25,37 +29,46 @@ class SlideChannel(models.Model): for vals in vals_list: if 'company_id' in vals: self = self.with_company(vals['company_id']) - if vals.get('name', _("New")) == _("New"): + if vals.get('code', _("New")) == _("New"): seq_date = None - vals['name'] = self.env['ir.sequence'].next_by_code('slide.channel', sequence_date=seq_date) or _("New") + 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', 'image.mixin'] + _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) - code = fields.Char('Code', required=True, copy=False, readonly=True, default=lambda self: _('New')) 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") active = fields.Boolean('Active', default=True) -# class ospp_slide(models.Model): -# _name = 'ospp_slide.ospp_slide' -# _description = 'ospp_slide.ospp_slide' + 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) + -# name = fields.Char() -# value = fields.Integer() -# value2 = fields.Float(compute="_value_pc", store=True) -# description = fields.Text() -# -# @api.depends('value') -# def _value_pc(self): -# for record in self: -# record.value2 = float(record.value) / 100 diff --git a/addons/ospp_slide/security/ir.model.access.csv b/addons/ospp_slide/security/ir.model.access.csv index bb1a882..cf9d4a3 100644 --- a/addons/ospp_slide/security/ir.model.access.csv +++ b/addons/ospp_slide/security/ir.model.access.csv @@ -1,2 +1,5 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_ospp_slide_ospp_slide,ospp_slide.ospp_slide,model_ospp_slide_ospp_slide,base.group_user,1,1,1,1 \ No newline at end of file +access_channel_instance_group_model_channel_instance_read,channel_instance_group_model_channel_instance_read,ospp_slide.model_channel_instance,group_model_channel_instance_read,1,0,0,0 +access_channel_instance_group_model_channel_instance_write,channel_instance_group_model_channel_instance_write,ospp_slide.model_channel_instance,group_model_channel_instance_write,1,1,0,0 +access_channel_instance_group_model_channel_instance_create,channel_instance_group_model_channel_instance_create,ospp_slide.model_channel_instance,group_model_channel_instance_create,1,0,1,0 +access_channel_instance_group_model_channel_instance_delete,channel_instance_group_model_channel_instance_delete,ospp_slide.model_channel_instance,group_model_channel_instance_delete,1,1,1,1 diff --git a/addons/ospp_slide/security/security_groups.xml b/addons/ospp_slide/security/security_groups.xml new file mode 100755 index 0000000..fe8ad9a --- /dev/null +++ b/addons/ospp_slide/security/security_groups.xml @@ -0,0 +1,49 @@ + + + + + 课训菜单 + 课训菜单 + 14 + + + + 课训模型 + 课训菜单 + 14 + + + + 课训按钮 + 课训按钮 + 14 + + + + channel.instance read + + + + + + channel.instance write + + + + + + + channel.instance create + + + + + + + channel.instance delete + + + + + + diff --git a/addons/ospp_slide/views/views.xml b/addons/ospp_slide/views/views.xml index 499f5ad..28ae173 100644 --- a/addons/ospp_slide/views/views.xml +++ b/addons/ospp_slide/views/views.xml @@ -1,60 +1,50 @@ - - + + slide.channel.form.inherit + slide.channel + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+
+
+
---> - - - - - - - - - - - - -
\ No newline at end of file