hr_efficiency_field_visibility_wizard.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from odoo import models, fields, api, _
  2. from odoo.exceptions import UserError
  3. class HrEfficiencyFieldVisibilityWizard(models.TransientModel):
  4. _name = 'hr.efficiency.field.visibility.wizard'
  5. _description = 'Efficiency Field Visibility Wizard'
  6. _table = 'hr_efficiency_field_vis_wizard'
  7. # Dynamic fields for each indicator
  8. indicator_ids = fields.Many2many('hr.efficiency.indicator', 'hr_efficiency_field_vis_wizard_rel', 'wizard_id', 'indicator_id', string='Indicators to Show')
  9. @api.model
  10. def default_get(self, fields_list):
  11. """Get default values - show all active indicators"""
  12. res = super().default_get(fields_list)
  13. active_indicators = self.env['hr.efficiency.indicator'].search([('active', '=', True)])
  14. res['indicator_ids'] = [(6, 0, active_indicators.ids)]
  15. return res
  16. def action_apply_visibility(self):
  17. """Apply the selected field visibility"""
  18. # Get all active indicators
  19. all_indicators = self.env['hr.efficiency.indicator'].search([('active', '=', True)])
  20. # Get selected indicators
  21. selected_indicators = self.indicator_ids
  22. # Update the hr.efficiency model to only show selected indicators
  23. efficiency_model = self.env['hr.efficiency']
  24. # Clear all dynamic fields first
  25. for indicator in all_indicators:
  26. field_name = efficiency_model._get_indicator_field_name(indicator.name)
  27. if hasattr(efficiency_model, field_name):
  28. delattr(efficiency_model.__class__, field_name)
  29. # Create fields only for selected indicators
  30. for indicator in selected_indicators:
  31. field_name = efficiency_model._get_indicator_field_name(indicator.name)
  32. field = fields.Float(
  33. indicator.name + ' (%)',
  34. compute='_compute_indicators',
  35. store=True,
  36. help=f'Indicator: {indicator.description or indicator.name}'
  37. )
  38. setattr(efficiency_model.__class__, field_name, field)
  39. # Update views with dynamic fields
  40. efficiency_model._update_views_with_dynamic_fields()
  41. # Force recomputation
  42. records = efficiency_model.search([])
  43. if records:
  44. records._invalidate_cache()
  45. return {
  46. 'type': 'ir.actions.client',
  47. 'tag': 'display_notification',
  48. 'params': {
  49. 'title': _('Success'),
  50. 'message': _('Field visibility updated successfully.'),
  51. 'type': 'success',
  52. 'sticky': False,
  53. }
  54. }