2026-09-28 11:03:02 +05:30

154 lines
5.3 KiB
Python

from odoo import api, fields, models
class DanceEvent(models.Model):
_name = "dance.event"
_description = "Dance Event"
_order = "date desc, name"
name = fields.Char(string="Event Name", required=True)
event_type = fields.Selection(
[
("annual_day", "Annual Day"),
("competition", "Competition"),
("workshop", "Workshop"),
("audition", "Audition"),
("recital", "Recital"),
("other", "Other"),
],
string="Type",
default="annual_day",
required=True,
)
date = fields.Date(required=True)
venue = fields.Char()
state = fields.Selection(
[
("draft", "Draft"),
("planning", "Planning"),
("rehearsal", "Rehearsal"),
("done", "Done"),
("cancelled", "Cancelled"),
],
default="draft",
required=True,
)
batch_ids = fields.Many2many(
"dance.batch",
"dance_event_batch_rel",
"event_id",
"batch_id",
string="Participating Batches",
)
student_ids = fields.Many2many(
"res.partner",
compute="_compute_student_ids",
string="Participating Students",
)
performance_ids = fields.One2many(
"dance.event.performance",
"event_id",
string="Performances",
)
rehearsal_ids = fields.One2many("dance.rehearsal", "event_id", string="Rehearsals")
performance_count = fields.Integer(compute="_compute_counts")
rehearsal_count = fields.Integer(compute="_compute_counts")
participant_count = fields.Integer(compute="_compute_student_ids")
notes = fields.Text()
@api.depends("batch_ids.enrollment_ids.status", "batch_ids.enrollment_ids.student_id")
def _compute_student_ids(self):
for event in self:
students = event.batch_ids.enrollment_ids.filtered(
lambda enrollment: enrollment.status == "active"
).mapped("student_id")
event.student_ids = students
event.participant_count = len(students)
@api.depends("performance_ids", "rehearsal_ids")
def _compute_counts(self):
for event in self:
event.performance_count = len(event.performance_ids)
event.rehearsal_count = len(event.rehearsal_ids)
def action_start_planning(self):
self.write({"state": "planning"})
return True
def action_start_rehearsals(self):
self.write({"state": "rehearsal"})
return True
def action_done(self):
self.write({"state": "done"})
return True
def action_cancel(self):
self.write({"state": "cancelled"})
return True
def action_create_performance_lines(self):
for event in self:
existing_student_ids = set(event.performance_ids.mapped("student_id").ids)
vals_list = []
for student in event.student_ids:
if student.id in existing_student_ids:
continue
vals_list.append(
{
"event_id": event.id,
"student_id": student.id,
"role": "group",
}
)
if vals_list:
self.env["dance.event.performance"].create(vals_list)
return True
def action_send_event_notification(self):
for event in self:
event._create_whatsapp_logs(
"event_notification",
event.performance_ids.mapped("student_id") or event.student_ids,
)
return True
def _create_whatsapp_logs(self, trigger, students, rehearsal=False, message=False):
template = self.env["dance.whatsapp.template"].search(
[("trigger", "=", trigger), ("active", "=", True)],
limit=1,
)
logs = []
for student in students:
guardians = student.guardian_ids | student.guardian_id
for guardian in guardians:
phone = guardian.mobile or guardian.phone or student.guardian_phone
if not phone:
continue
values = {
"event": self.name,
"student": student.display_name,
"date": self.date or "",
"venue": self.venue or "",
"rehearsal": rehearsal.name if rehearsal else "",
"rehearsal_date": rehearsal.date if rehearsal else "",
"rehearsal_time": rehearsal.display_time if rehearsal else "",
"room": rehearsal.room if rehearsal else "",
}
body = message or (template.render_message(values) if template else self.name)
logs.append(
{
"template_id": template.id if template else False,
"trigger": trigger,
"student_id": student.id,
"guardian_id": guardian.id,
"phone": phone,
"message": body,
"event_id": self.id,
"rehearsal_id": rehearsal.id if rehearsal else False,
}
)
if logs:
self.env["dance.whatsapp.log"].create(logs)
return len(logs)