Alaguraj0361 0f462ad21a
Some checks failed
CI / Brand-leak check (push) Has been cancelled
CI / flake8 / pylint-odoo / manifest completeness (push) Has been cancelled
CI / Install all modules with --test-enable (push) Has been cancelled
add TNCSC deployment module, community add-ons, role guides, and website navigation overrides
2026-09-28 19:43:48 +05:30

86 lines
3.2 KiB
Python

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
vals = {
'name': f"School Fee - {self.name}",
'list_price': self.fee,
'type': 'service',
'sale_ok': True,
'purchase_ok': False,
}
if 'invoice_policy' in self.env['product.product']._fields:
vals['invoice_policy'] = 'order'
product = self.env['product.product'].create(vals)
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