from odoo import api, fields, models class McApplicant(models.Model): _name = "mc.applicant" _inherit = ["mail.thread"] _description = "Applicant" _order = "create_date desc" _rec_name = "name" name = fields.Char(string="Applicant Name", required=True, tracking=True) dob = fields.Date(string="Date of Birth") program_id = fields.Many2one( "mc.program", string="Grade Applied For", required=True, tracking=True, ) guardian_name = fields.Char(string="Guardian Name", required=True) guardian_relationship = fields.Selection( [ ("father", "Father"), ("mother", "Mother"), ("legal_guardian", "Legal Guardian"), ("other", "Other"), ], string="Guardian Relationship", default="legal_guardian", ) guardian_phone = fields.Char(string="Guardian Phone") guardian_email = fields.Char(string="Guardian Email", required=True) application_no = fields.Char(string="Application No.", copy=False, tracking=True) state = fields.Selection( [ ("applied", "Applied"), ("document_verification", "Document Verification"), ("interview", "Interview"), ("offered", "Offered"), ("accepted", "Accepted"), ("enrolled", "Enrolled"), ("rejected", "Rejected"), ], string="Stage", default="applied", required=True, tracking=True, group_expand="_read_group_state", ) student_id = fields.Many2one( "mc.student", string="Student", readonly=True, copy=False, help="Set once this applicant has been converted. The application number persists onto the student record.", ) company_id = fields.Many2one( "res.company", string="Company", required=True, default=lambda self: self.env.company, ) _application_no_uniq = models.Constraint( "unique(application_no)", "An applicant with this application number already exists.", ) @api.model def _read_group_state(self, states, domain): # Keeps every kanban column visible even when empty, so the pipeline # always reads as a pipeline rather than losing stages that have # nothing in them right now. return [key for key, _label in self._fields["state"].selection] @api.model_create_multi def create(self, vals_list): for vals in vals_list: if not vals.get("application_no"): vals["application_no"] = self.env["ir.sequence"].next_by_code( "mc.applicant.application_no" ) return super().create(vals_list) def action_set_document_verification(self): self.write({"state": "document_verification"}) def action_set_interview(self): self.write({"state": "interview"}) def action_set_offered(self): self.write({"state": "offered"}) def action_set_accepted(self): self.write({"state": "accepted"}) def action_reject(self): self.write({"state": "rejected"}) def action_open_convert_wizard(self): self.ensure_one() return { "type": "ir.actions.act_window", "res_model": "mc.applicant.convert.wizard", "view_mode": "form", "target": "new", "context": { "default_applicant_id": self.id, "default_program_id": self.program_id.id, }, }