154 lines
5.3 KiB
Python
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)
|