57 lines
2.6 KiB
Python

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