from odoo import api, fields, models WEEKDAYS = [ ('mon', 'Monday'), ('tue', 'Tuesday'), ('wed', 'Wednesday'), ('thu', 'Thursday'), ('fri', 'Friday'), ('sat', 'Saturday'), ('sun', 'Sunday'), ] class CommunitySchoolClass(models.Model): _name = 'community.school.class' _description = 'School Class' _order = 'id desc' name = fields.Char(compute='_compute_name', store=True) level_id = fields.Many2one('community.school.level', required=True) term_id = fields.Many2one('community.school.term', required=True) teacher_id = fields.Many2one('res.partner', domain=[('is_teacher', '=', True)]) max_students = fields.Integer(default=20) fee = fields.Monetary(currency_field='currency_id') currency_id = fields.Many2one('res.currency', default=lambda self: self.env.company.currency_id) fee_product_id = fields.Many2one('product.product', readonly=True, copy=False) enrolled_count = fields.Integer(compute='_compute_enrolled_count', store=True) weekday = fields.Selection(WEEKDAYS) start_time = fields.Float() end_time = fields.Float() location = fields.Char() slide_channel_id = fields.Many2one('slide.channel', readonly=True, copy=False) enrollment_ids = fields.One2many('community.school.enrollment', 'class_id') state = fields.Selection( [('draft', 'Draft'), ('open', 'Open'), ('closed', 'Closed')], default='draft', required=True, ) @api.depends('level_id.name', 'term_id.name') def _compute_name(self): for record in self: record.name = f"{record.level_id.name or '?'} - {record.term_id.name or '?'}" @api.depends('enrollment_ids.state') def _compute_enrolled_count(self): if not self: return counts = dict(self.env['community.school.enrollment']._read_group( [('class_id', 'in', self.ids), ('state', '=', 'enrolled')], groupby=['class_id'], aggregates=['__count'], )) for record in self: record.enrolled_count = counts.get(record, 0) def _get_or_create_slide_channel(self): self.ensure_one() if self.slide_channel_id: return self.slide_channel_id channel = self.env['slide.channel'].create({ 'name': self.name, 'channel_type': 'training', 'visibility': 'members', 'enroll': 'invite', }) self.slide_channel_id = channel.id return channel def _get_or_create_fee_product(self): self.ensure_one() if self.fee_product_id: return self.fee_product_id product = self.env['product.product'].create({ 'name': f"School Fee - {self.name}", 'list_price': self.fee, 'type': 'service', 'sale_ok': True, 'purchase_ok': False, 'invoice_policy': 'order', }) self.fee_product_id = product.id return product @api.model_create_multi def create(self, vals_list): classes = super().create(vals_list) for record in classes: record._get_or_create_slide_channel() return classes