gn_odoo/gn_career/models/gn_career.py
Florian du Garage Num d93c76d937 add filters on tasks
2024-03-09 00:26:30 +01:00

93 lines
4.4 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models, api
from odoo.exceptions import ValidationError
import logging
_logger = logging.getLogger(__name__)
class GnCareer(models.Model):
_name = "gn_career.career"
_description = "Analyse du poste"
_order = 'start_date'
name = fields.Char("Nom", compute='_compute_name')
start_date = fields.Date('From', required=True, default=lambda self: fields.Date.today())
contract_id = fields.Many2one('hr.contract', string="Contrat ou Avenant associé")
employee_id = fields.Many2one(string="Employee", related='contract_id.employee_id', readonly=True, store=True)
status = fields.Selection([
('draft', 'Brouillon'),
('wait_manager_approval', "En attente de validation du manager"),
('wait_director_approval', "En attente de validation par la direction"),
('wait_employee_approval', "En attente de signature par le salarié"),
('ready', 'Prête'),
('active', 'Active'),
], string="Statut", default='draft')
mission_ids = fields.Many2many('gn_career.mission', 'career_ids', compute='_compute_mission_ids', string="Missions effectuées", store=True)
mission_detail_ids = fields.One2many('gn_career.mission.detail', 'career_id', string="Détail de la mission")
total_percentage = fields.Float(compute='_compute_total_percentage', string="Total Percentage")
@api.depends('mission_detail_ids.percentage')
def _compute_total_percentage(self):
for record in self:
record.total_percentage = sum(mission.percentage for mission in record.mission_detail_ids)
@api.constrains('mission_detail_ids', 'total_percentage')
def _check_total_percentage(self):
for record in self:
if record.total_percentage != 100:
raise ValidationError("Le pourcentage total des missions au sein de la fiche de poste doit atteindre 100%. Veuillez ajuster la répartition de la mission.")
@api.depends('mission_detail_ids.mission_id')
def _compute_mission_ids(self):
for record in self:
mission_ids_set = set()
for mission_detail in record.mission_detail_ids:
mission_ids_set.add(mission_detail.mission_id.id)
record.mission_ids = [(6, 0, list(mission_ids_set))]
@api.depends('start_date')
def _compute_name(self):
for record in self:
if record.start_date:
# Use an f-string for formatting
record.name = f"Fiche de poste du {record.start_date}"
else:
# Provide a default or handle the case where start_date isn't set
record.name = "Fiche de poste sans date"
class GnCareerMissionDetail(models.Model):
_name = 'gn_career.mission.detail'
_description = "Détails d'une mission pour une fiche de poste"
name = fields.Char(related='mission_id.name')
career_id = fields.Many2one('gn_career.career', string="Fiche de poste")
mission_id = fields.Many2one('gn_career.mission', string="Mission")
percentage = fields.Integer("Temps occupé par la mission en %", default="100")
task_ids = fields.Many2many('gn_career.task', 'mission_detail', string="Tâches incluses dans la mission")
related_mission_task_ids = fields.Many2many('gn_career.task', compute='_compute_related_mission_task_ids')
task_ids_display = fields.Many2many('gn_career.task', compute='_compute_task_ids_display')
employee_id = fields.Many2one(string="Employee", related='career_id.contract_id.employee_id', readonly=True, store=True)
# A special field used to update task_ids domain in mission.detail form
@api.depends('mission_id.task_ids')
def _compute_related_mission_task_ids(self):
for record in self:
if record.mission_id:
record.related_mission_task_ids = record.mission_id.task_ids
else:
record.related_mission_task_ids = False
#A special field used for many2many tag in task form display
@api.depends('task_ids')
def _compute_task_ids_display(self):
current_task_id = self._context.get('exclude_task_id')
for record in self:
if current_task_id:
record.task_ids_display = record.task_ids.filtered(lambda t: t.id != current_task_id)
else:
record.task_ids_display = record.task_ids