from odoo import api, fields, models, _ from odoo.exceptions import ValidationError class EducationLibraryMember(models.Model): _name = 'education.library.member' _description = 'Library Member' _rec_name = 'member_number' member_number = fields.Char(string='Member Number', required=True, copy=False) member_type = fields.Selection([ ('student', 'Student'), ('faculty', 'Faculty'), ('staff', 'Staff') ], string='Member Type', required=True, default='student') student_id = fields.Many2one('education.student', string='Student') user_id = fields.Many2one('res.users', string='Related User') library_id = fields.Many2one('education.library', string='Library', required=True) membership_start = fields.Date(string='Membership Start Date', default=fields.Date.context_today) membership_end = fields.Date(string='Membership End Date') issue_limit = fields.Integer(string='Issue Limit', compute='_compute_issue_limit', store=True, readonly=False) active = fields.Boolean(default=True) issue_ids = fields.One2many('education.library.issue', 'member_id', string='Issues') _member_number_unique = models.Constraint('unique(member_number)', 'Member Number must be unique!') @api.constrains('student_id', 'member_type', 'active') def _check_student_member(self): for record in self: if record.member_type == 'student' and not record.student_id: raise ValidationError(_('Student member must reference a student record.')) if record.student_id and record.active: existing = self.search([('student_id', '=', record.student_id.id), ('id', '!=', record.id), ('active', '=', True)]) if existing: raise ValidationError(_('A student can only have one active membership.')) @api.depends('member_type') def _compute_issue_limit(self): # We fetch default limit from settings student_limit = int(self.env['ir.config_parameter'].sudo().get_param('education_library.student_issue_limit', 3)) faculty_limit = int(self.env['ir.config_parameter'].sudo().get_param('education_library.faculty_issue_limit', 5)) for record in self: if not record.issue_limit: if record.member_type == 'student': record.issue_limit = student_limit else: record.issue_limit = faculty_limit @api.onchange('student_id') def _onchange_student_id(self): if self.student_id and self.student_id.portal_user_id: self.user_id = self.student_id.portal_user_id.id