from odoo import models, fields, api, _ from odoo.exceptions import UserError class HrEfficiencyFieldVisibilityWizard(models.TransientModel): _name = 'hr.efficiency.field.visibility.wizard' _description = 'Efficiency Field Visibility Wizard' _table = 'hr_efficiency_field_vis_wizard' # Dynamic fields for each indicator indicator_ids = fields.Many2many('hr.efficiency.indicator', 'hr_efficiency_field_vis_wizard_rel', 'wizard_id', 'indicator_id', string='Indicators to Show') @api.model def default_get(self, fields_list): """Get default values - show all active indicators""" res = super().default_get(fields_list) active_indicators = self.env['hr.efficiency.indicator'].search([('active', '=', True)]) res['indicator_ids'] = [(6, 0, active_indicators.ids)] return res def action_apply_visibility(self): """Apply the selected field visibility""" # Get all active indicators all_indicators = self.env['hr.efficiency.indicator'].search([('active', '=', True)]) # Get selected indicators selected_indicators = self.indicator_ids # Update the hr.efficiency model to only show selected indicators efficiency_model = self.env['hr.efficiency'] # Clear all dynamic fields first for indicator in all_indicators: field_name = efficiency_model._get_indicator_field_name(indicator.name) if hasattr(efficiency_model, field_name): delattr(efficiency_model.__class__, field_name) # Create fields only for selected indicators for indicator in selected_indicators: field_name = efficiency_model._get_indicator_field_name(indicator.name) field = fields.Float( indicator.name + ' (%)', compute='_compute_indicators', store=True, help=f'Indicator: {indicator.description or indicator.name}' ) setattr(efficiency_model.__class__, field_name, field) # Update views with dynamic fields efficiency_model._update_views_with_dynamic_fields() # Force recomputation records = efficiency_model.search([]) if records: records._invalidate_cache() return { 'type': 'ir.actions.client', 'tag': 'display_notification', 'params': { 'title': _('Success'), 'message': _('Field visibility updated successfully.'), 'type': 'success', 'sticky': False, } }