Sélectionner une révision Git
biocenys_project.py 7,25 Kio
# Copyright 2021 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import fields, models, api
class BiocenysProject(models.Model):
_name = 'biocenys.project'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = 'Projet Biocenys'
# ------------------------------------------------------
# Default functions
# ------------------------------------------------------
def _get_default_favorite_user_ids(self):
return [(6, 0, [self.env.uid])]
# ------------------------------------------------------
# Fields declaration
# ------------------------------------------------------
name = fields.Char(
string='Numéro de projet',
required=True)
partner_id = fields.Many2one(
comodel_name='res.partner',
string='Client',
domain="[('is_company', '=', True)]",
required=False)
partner_ids = fields.One2many(
comodel_name='biocenys.project.partners',
inverse_name='biocenys_project_id',
string='Partner_ids',
required=False)
crm_lead_ids = fields.One2many(
comodel_name='crm.lead',
inverse_name='biocenys_project_id',
string='Opportunités')
sale_order_ids = fields.One2many(
comodel_name='sale.order',
inverse_name='biocenys_project_id',
string='Devis / Commandes')
sale_order_line_ids = fields.One2many(
comodel_name='sale.order.line',
inverse_name='biocenys_project_id',
string='Lignes de commandes')
invoice_ids = fields.One2many(
comodel_name='account.invoice',
inverse_name='biocenys_project_id',
string='Factures')
active = fields.Boolean(default=True)
favorite_user_ids = fields.Many2many(
comodel_name='res.users',
relation='biocenys_project_favorite_user_rel',
column1='biocenys_project_id',
column2='user_id',
default=_get_default_favorite_user_ids,
string='Members')
is_favorite = fields.Boolean(
compute='_compute_is_favorite',
inverse='_inverse_is_favorite',
string='Projet favori')
opportunity_count = fields.Integer(
string='Nombre d\'opportunités',
compute='_compute_opportunity_count',
store=True)
sale_count = fields.Integer(
string='Nombre de ventes',
compute='_compute_sale_count',
store=True)
sale_ol_count = fields.Integer(
string='Nombre de lignes de commandes',
compute='_compute_sale_ol_count',
store=True)
invoice_count = fields.Integer(
string='Nombre de factures',
compute='_compute_invoice_count',
store=True)
# ------------------------------------------------------
# Computed fields / Search Fields
# ------------------------------------------------------
def _compute_is_favorite(self):
"""
Copy from project.project
"""
for project in self:
project.is_favorite = self.env.user in project.favorite_user_ids
def _inverse_is_favorite(self):
"""
Copy from project.project
"""
favorite_projects = not_fav_projects = \
self.env['biocenys.project'].sudo()
for project in self:
if self.env.user in project.favorite_user_ids:
favorite_projects |= project
else:
not_fav_projects |= project
not_fav_projects.write({'favorite_user_ids': [(4, self.env.uid)]})
favorite_projects.write({'favorite_user_ids': [(3, self.env.uid)]})
@api.multi
@api.depends('crm_lead_ids')
def _compute_opportunity_count(self):
for r in self:
r.opportunity_count = len(r.crm_lead_ids)
@api.multi
@api.depends('sale_order_ids')
def _compute_sale_count(self):
for r in self:
r.sale_count = len(r.sale_order_ids)
@api.multi
@api.depends('sale_order_line_ids', 'sale_order_line_ids.state')
def _compute_sale_ol_count(self):
for r in self:
r.sale_ol_count = len(r.sale_order_line_ids.filtered(
lambda sol: sol.state == 'sale'))
@api.multi
@api.depends('invoice_ids')
def _compute_invoice_count(self):
for r in self:
r.invoice_count = len(r.invoice_ids)
# ------------------------------------------------------
# Actions
# ------------------------------------------------------
def action_create_opportunity(self):
return {
'type': 'ir.actions.act_window',
'views': [[self.env.ref('crm.crm_case_form_view_oppor').id,
"form"]],
'view_mode': 'form',
'res_model': 'crm.lead',
'target': 'current',
'context': {
'default_partner_id': self.partner_id.id,
'default_biocenys_project_id': self.id,
},
}
def action_show_opportunities(self):
return {
'type': 'ir.actions.act_window',
'name': 'Opportunités',
'views': [
[self.env.ref('crm.crm_case_kanban_view_leads').id, "kanban"],
[self.env.ref('crm.crm_case_tree_view_oppor').id, "tree"],
[False, "form"]
],
'view_mode': 'kanban',
'res_model': 'crm.lead',
'target': 'current',
'context': {'search_default_biocenys_project_id': self.id}
}
def action_show_sales(self):
return {
'type': 'ir.actions.act_window',
'name': 'Devis / Commandes',
'views': [
[self.env.ref('sale.view_quotation_tree').id, "tree"],
[False, "form"]
],
'view_mode': 'tree',
'res_model': 'sale.order',
'target': 'current',
'context': {'search_default_biocenys_project_id': self.id}
}
def action_show_sales_ol(self):
tree_view_id = self.env.ref(
'biocenys_project.biocenys_sale_order_line_tree_inherited').id
graph_view_id = self.env.ref(
'biocenys_project.biocenys_sale_order_line_graph_view').id
pivot_view_id = self.env.ref(
'biocenys_project.biocenys_sale_order_line_pivot_view').id
return {
'type': 'ir.actions.act_window',
'name': 'Lignes de commandes',
'views': [
[tree_view_id, "tree"],
[False, "form"],
[graph_view_id, "graph"],
[pivot_view_id, "pivot"]
],
'view_mode': 'tree',
'res_model': 'sale.order.line',
'target': 'current',
'context': {
'search_default_biocenys_project_id': self.id
}
}
def action_show_invoices(self):
return {
'type': 'ir.actions.act_window',
'name': 'Factures',
'views': [
[self.env.ref('account.invoice_tree_with_onboarding').id,
"tree"],
[False, "form"]
],
'view_mode': 'tree',
'res_model': 'account.invoice',
'target': 'current',
'context': {'search_default_biocenys_project_id': self.id}
}