70 lines
2.5 KiB
Python
70 lines
2.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from odoo import models, fields, api
|
|
|
|
|
|
class ResUsers(models.Model):
|
|
"""
|
|
Extension of res.users to add accessible modules helper.
|
|
"""
|
|
_inherit = 'res.users'
|
|
|
|
def _get_accessible_modules(self):
|
|
"""
|
|
Get list of module names this user can access.
|
|
Called from record rules for dynamic domain filtering.
|
|
|
|
:return: list of module technical names
|
|
"""
|
|
self.ensure_one()
|
|
return self.env['genius.module.access.mixin']._get_user_accessible_modules(self)
|
|
|
|
# Training progress summary
|
|
# NOTE: These are non-stored computed fields that query genius.progress
|
|
# on every access. They have no dependencies because they read from
|
|
# a different model (genius.progress), not fields on res.users.
|
|
genius_completed_topics = fields.Integer(
|
|
string='Completed Topics',
|
|
compute='_compute_genius_stats',
|
|
help='Number of training topics completed by this user'
|
|
)
|
|
genius_in_progress_topics = fields.Integer(
|
|
string='In Progress Topics',
|
|
compute='_compute_genius_stats',
|
|
help='Number of training topics currently in progress'
|
|
)
|
|
genius_total_time_hours = fields.Float(
|
|
string='Total Training Time (Hours)',
|
|
compute='_compute_genius_stats',
|
|
help='Total time spent on training'
|
|
)
|
|
|
|
@api.depends() # No dependencies: always recomputes when accessed (non-stored)
|
|
def _compute_genius_stats(self):
|
|
"""
|
|
Compute training statistics for users.
|
|
|
|
Note: Uses @api.depends() with no arguments because these stats
|
|
depend on genius.progress records, not res.users fields. Since the
|
|
fields are non-stored, they recompute fresh on every read.
|
|
"""
|
|
Progress = self.env['genius.progress'].sudo()
|
|
for user in self:
|
|
completed = Progress.search_count([
|
|
('user_id', '=', user.id),
|
|
('state', 'in', ('done', 'verified')),
|
|
])
|
|
in_progress = Progress.search_count([
|
|
('user_id', '=', user.id),
|
|
('state', '=', 'in_progress'),
|
|
])
|
|
total_time = sum(Progress.search([
|
|
('user_id', '=', user.id),
|
|
]).mapped('time_spent_minutes'))
|
|
|
|
user.genius_completed_topics = completed
|
|
user.genius_in_progress_topics = in_progress
|
|
user.genius_total_time_hours = total_time / 60.0 if total_time else 0.0
|
|
|
|
|