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)