odex25_standard/odex25_base/tour_genius/models/res_users.py

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