# -*- coding: utf-8 -*- from datetime import timedelta from odoo import api, fields, models, _ from odoo.exceptions import UserError, ValidationError class ProjectPhaseType(models.Model): _name = "project.phase.type" _description = 'Phase Type' name = fields.Char(string="Name") company_id = fields.Many2one('res.company', string="Company", default=lambda self: self.env.user.company_id) class ProjectPhase(models.Model): _name = 'project.phase' _description = 'Phase' _inherit = ['mail.thread', 'mail.activity.mixin'] _order = 'project_id,start_date' name = fields.Char(string='Phase Name', compute='_compute_name', store=True) phase_id = fields.Many2one('project.phase.type', string="Phase") sequence = fields.Integer(string='Sequence') project_id = fields.Many2one('project.project', string='Project',ondelete="restrict", default=lambda self: self.env.context.get('default_project_id')) start_date = fields.Date(string='Start Date', copy=True) end_date = fields.Date(string='End Date', copy=True) estimated_hours = fields.Float("Allocated By",copy=False) company_id = fields.Many2one('res.company', related="project_id.company_id", string='Company') task_count = fields.Integer(compute="get_task", string='Tasks') task_ids = fields.One2many("project.task",'phase_id',string='Tasks') weight = fields.Float(string="Weight") progress = fields.Float(compute="get_progress", store=True, string="Progress") notes = fields.Text(string='Notes',copy=False) state = fields.Selection([ ('draft', 'Draft'), ('open', 'Running'), ('close', 'Closed')], string='Status', copy=False, default='draft', required=True, readonly=True, tracking=True) # phase_id = fields.Many2one('project.phase', string="Stage") allowed_internal_user_ids = fields.Many2many('res.users', 'project_phase_allowed_internal_users_rel', string="Allowed Internal Users", default=lambda self: self.env.user, domain=[('share', '=', False)]) allowed_portal_user_ids = fields.Many2many('res.users', 'project_phase_allowed_portal_users_rel', string="Allowed Portal Users", domain=[('share', '=', True)]) # allowed_user_ids = fields.Many2many('res.users', compute='_compute_allowed_users', inverse='_inverse_allowed_user') # @api.depends('allowed_internal_user_ids', 'allowed_portal_user_ids') # def _compute_allowed_users(self): # for project in self: # users = project.allowed_internal_user_ids | project.allowed_portal_user_ids # project.allowed_user_ids = users # def _inverse_allowed_user(self): # for project in self: # allowed_users = project.allowed_user_ids # project.allowed_portal_user_ids = allowed_users.filtered('share') # project.allowed_internal_user_ids = allowed_users - project.allowed_portal_user_ids def write(self, values): if 'start_date' in values or 'end_date' in values: #send notification to pm to edit ivoice date if self.project_id.user_id: users = [self.project_id.user_id] notification_ids = [(0, 0, { 'res_partner_id': user.partner_id.id, 'notification_type': 'inbox' } ) for user in users if user.partner_id] if notification_ids: self.env['mail.message'].create({ 'message_type': "notification", 'body': _( "The Stage %s Dates for project %s Edit ,edit invoice dates accordingly") % (self.display_name,self.project_id.display_name), 'subject': _("Stage Dates has been updated"), 'partner_ids': [(4, user.partner_id.id) for user in users if users], 'model': self._name, 'res_id': self.id, 'notification_ids': notification_ids, 'author_id': self.env.user.partner_id and self.env.user.partner_id.id }) if self._context.get('open_from',False): if self._context.get('open_from',False) == 'vo': vo_id = self._context.get('vo_id',[]) vo = self.env['project.variation.order'].browse(vo_id) message = str('from ' + (vo and vo.name or "VO")) if self._context.get('edit_reasone',False): message = message + _(" For Reasone: %s"%(self._context.get('edit_reasone'," "))) else: message = _("From Project For Reasone: %s"%(self._context.get('edit_reasone'," "))) body = _("
Project Phase updated %s