from odoo import models, fields class EncoachNotification(models.Model): _name = 'encoach.notification' _description = 'Notification' _order = 'create_date desc' user_id = fields.Many2one('res.users', required=True, ondelete='cascade', index=True) title = fields.Char(required=True) message = fields.Text() type = fields.Selection([ ('info', 'Info'), ('warning', 'Warning'), ('success', 'Success'), ('error', 'Error'), ], default='info') is_read = fields.Boolean(default=False) read_at = fields.Datetime() reference_model = fields.Char() reference_id = fields.Integer() class EncoachNotificationRule(models.Model): _name = 'encoach.notification.rule' _description = 'Notification Rule' name = fields.Char(required=True) event_type = fields.Char(required=True, help='e.g. deadline, chapter_unlock, ' 'result_release, assignment, exam') template = fields.Text() is_active = fields.Boolean(default=True) recipients = fields.Selection([ ('all', 'All Users'), ('students', 'Students Only'), ('teachers', 'Teachers Only'), ('admins', 'Admins Only'), ], default='all') channels = fields.Char(help='Legacy: comma-separated email,push,in_app. ' 'New code should use `channel` instead.') # New fields aligned with the admin Configuration UI (NotificationRules page) days_before = fields.Integer(default=1, help='Lead time in days before the event fires.') frequency = fields.Selection([ ('once', 'Once'), ('daily', 'Daily'), ('custom', 'Custom schedule'), ], default='once') channel = fields.Selection([ ('in_app', 'In-App'), ('email', 'Email'), ('both', 'Both'), ], default='in_app') entity_id = fields.Many2one('encoach.entity', ondelete='set null') class EncoachNotificationPreference(models.Model): _name = 'encoach.notification.preference' _description = 'Notification Preference' _rec_name = 'user_id' user_id = fields.Many2one('res.users', required=True, ondelete='cascade', index=True) email_enabled = fields.Boolean(default=True) push_enabled = fields.Boolean(default=True) in_app_enabled = fields.Boolean(default=True) digest_frequency = fields.Selection([ ('realtime', 'Real-time'), ('daily', 'Daily'), ('weekly', 'Weekly'), ], default='realtime')