mirror of
https://github.com/bringout/oca-technical.git
synced 2026-04-18 17:12:00 +02:00
Initial commit: OCA Technical packages (595 packages)
This commit is contained in:
commit
2cc02aac6e
24950 changed files with 2318079 additions and 0 deletions
|
|
@ -0,0 +1,6 @@
|
|||
from . import mgmtsystem_evaluation_template
|
||||
from . import mgmtsystem_evaluation
|
||||
from . import mgmtsystem_evaluation_abstract
|
||||
from . import res_partner
|
||||
from . import mgmtsystem_evaluation_result
|
||||
from . import ir_model
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
# Copyright 2023 CreuBlanca
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class IrModel(models.Model):
|
||||
_inherit = "ir.model"
|
||||
|
||||
is_mgmtsystem_evaluation = fields.Boolean(
|
||||
string="Management System Evaluation",
|
||||
default=False,
|
||||
help="Whether this model supports evaluations.",
|
||||
)
|
||||
|
||||
def _reflect_model_params(self, model):
|
||||
vals = super()._reflect_model_params(model)
|
||||
vals["is_mgmtsystem_evaluation"] = (
|
||||
issubclass(type(model), self.pool["mgmtsystem.evaluation.abstract"])
|
||||
and not model._abstract
|
||||
)
|
||||
return vals
|
||||
|
|
@ -0,0 +1,230 @@
|
|||
# Copyright 2023 CreuBlanca
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class MgmtsystemEvaluation(models.Model):
|
||||
_name = "mgmtsystem.evaluation"
|
||||
_inherit = [
|
||||
"mail.thread",
|
||||
"mail.activity.mixin",
|
||||
]
|
||||
_description = "Evaluation"
|
||||
|
||||
name = fields.Char(
|
||||
compute="_compute_name",
|
||||
store=True,
|
||||
readonly=True,
|
||||
states={"draft": [("readonly", False)]},
|
||||
)
|
||||
model = fields.Char(
|
||||
index=True,
|
||||
compute="_compute_template_fields",
|
||||
store=True,
|
||||
readonly=False,
|
||||
string="Model technical name",
|
||||
)
|
||||
model_id = fields.Many2one(
|
||||
"ir.model",
|
||||
compute="_compute_template_fields",
|
||||
store=True,
|
||||
readonly=False,
|
||||
)
|
||||
res_id = fields.Many2oneReference(index=True, model_field="model")
|
||||
user_id = fields.Many2one("res.users", readonly=True, copy=False)
|
||||
result_id = fields.Many2one(
|
||||
"mgmtsystem.evaluation.result",
|
||||
readonly=True,
|
||||
states={"progress": [("readonly", False)]},
|
||||
)
|
||||
result_ids = fields.Many2many(
|
||||
related="template_id.result_ids", string="Possible results"
|
||||
)
|
||||
resource = fields.Reference(
|
||||
selection=lambda r: r._get_ref_selection(),
|
||||
inverse="_inverse_resource",
|
||||
compute="_compute_resource",
|
||||
readonly=True,
|
||||
states={"draft": [("readonly", False)]},
|
||||
required=True,
|
||||
)
|
||||
template_id = fields.Many2one(
|
||||
"mgmtsystem.evaluation.template",
|
||||
required=True,
|
||||
ondelete="cascade",
|
||||
readonly=True,
|
||||
states={"draft": [("readonly", False)]},
|
||||
)
|
||||
state = fields.Selection(
|
||||
[
|
||||
("draft", "Draft"),
|
||||
("progress", "In progress"),
|
||||
("done", "Done"),
|
||||
("cancel", "Cancelled"),
|
||||
],
|
||||
tracking=True,
|
||||
default="draft",
|
||||
required=True,
|
||||
)
|
||||
date = fields.Date(string="Evaluation date", readonly=True)
|
||||
manager_ids = fields.Many2many(
|
||||
"res.users",
|
||||
required=True,
|
||||
readonly=True,
|
||||
states={"draft": [("readonly", False)]},
|
||||
)
|
||||
active = fields.Boolean(default=True)
|
||||
feedback = fields.Html(
|
||||
readonly=False,
|
||||
states={"done": [("readonly", True)]},
|
||||
compute="_compute_template_fields",
|
||||
store=True,
|
||||
)
|
||||
note = fields.Html(
|
||||
readonly=False,
|
||||
states={"done": [("readonly", True)]},
|
||||
compute="_compute_template_fields",
|
||||
store=True,
|
||||
)
|
||||
passed = fields.Boolean(readonly=True)
|
||||
is_user = fields.Boolean(compute="_compute_filter_views")
|
||||
is_manager = fields.Boolean(compute="_compute_filter_views")
|
||||
next_evaluation_date = fields.Date(readonly=True)
|
||||
next_evaluation_generated = fields.Boolean(readonly=True)
|
||||
|
||||
@api.depends_context("uid")
|
||||
@api.depends("user_id", "manager_ids")
|
||||
def _compute_filter_views(self):
|
||||
for record in self:
|
||||
record.is_user = record._get_is_user()
|
||||
record.is_manager = record._get_is_manager()
|
||||
|
||||
def _get_is_manager(self):
|
||||
return self.env.user in self.manager_ids or (
|
||||
self.template_id.group_id
|
||||
and self.env.user in self.template_id.group_id.users
|
||||
)
|
||||
|
||||
def _get_is_user(self):
|
||||
return self.env.user == self.user_id
|
||||
|
||||
@api.model
|
||||
def _get_ref_selection(self):
|
||||
models = (
|
||||
self.env["ir.model"]
|
||||
.sudo()
|
||||
.search([("is_mgmtsystem_evaluation", "=", True)])
|
||||
)
|
||||
return [(model.model, model.name) for model in models]
|
||||
|
||||
@api.depends("template_id", "res_id", "model")
|
||||
def _compute_resource(self):
|
||||
for record in self:
|
||||
if record.model:
|
||||
record.resource = "{},{}".format(record.model, record.res_id)
|
||||
else:
|
||||
record.resource = False
|
||||
|
||||
def _inverse_resource(self):
|
||||
for record in self:
|
||||
record.res_id = record.resource
|
||||
|
||||
@api.depends("template_id")
|
||||
def _compute_template_fields(self):
|
||||
for record in self:
|
||||
template = record.template_id
|
||||
if template and (not record.model or template.model != record.model):
|
||||
record.res_id = False
|
||||
record.model = template.model
|
||||
record.model_id = template.model_id
|
||||
if not record.feedback:
|
||||
record.feedback = template.feedback
|
||||
if not record.note:
|
||||
record.note = template.note
|
||||
|
||||
@api.depends("template_id")
|
||||
def _compute_name(self):
|
||||
for record in self:
|
||||
record.name = record.template_id.name
|
||||
|
||||
def draft2progress(self):
|
||||
self.ensure_one()
|
||||
self.write(self._draft2progress_vals())
|
||||
if self.template_id.user_activity_type_id and self.user_id:
|
||||
self.activity_schedule(
|
||||
activity_type_id=self.template_id.user_activity_type_id.id,
|
||||
user_id=self.user_id.id,
|
||||
)
|
||||
if self.template_id.manager_activity_type_id:
|
||||
for manager in self.manager_ids:
|
||||
self.activity_schedule(
|
||||
activity_type_id=self.template_id.manager_activity_type_id.id,
|
||||
user_id=manager.id,
|
||||
)
|
||||
|
||||
def _draft2progress_vals(self):
|
||||
return {
|
||||
"state": "progress",
|
||||
"user_id": self.resource._get_mgmtsystem_evaluation_user().id,
|
||||
}
|
||||
|
||||
def progress2done(self):
|
||||
for record in self:
|
||||
record.write(record._progress2done_vals())
|
||||
|
||||
def _progress2done_vals(self):
|
||||
next_date = False
|
||||
if self.template_id.recurrence_type and self.template_id.recurrence_period:
|
||||
next_date = fields.Date.today() + self.template_id._get_recurrence_type()[
|
||||
self.template_id.recurrence_type
|
||||
][1](self.template_id.recurrence_period)
|
||||
return {
|
||||
"state": "done",
|
||||
"date": fields.Date.today(),
|
||||
"passed": self.result_id.passed,
|
||||
"next_evaluation_date": next_date,
|
||||
"next_evaluation_generated": not next_date,
|
||||
}
|
||||
|
||||
def cancel(self):
|
||||
self.write(self._cancel_vals())
|
||||
|
||||
def _cancel_vals(self):
|
||||
return {"state": "cancel", "next_evaluation_date": False}
|
||||
|
||||
def back_to_draft(self):
|
||||
self.write(self._back_to_draft_vals())
|
||||
|
||||
def _back_to_draft_vals(self):
|
||||
return {"state": "draft", "next_evaluation_date": False, "user_id": False}
|
||||
|
||||
def _generate_new_evaluation(self):
|
||||
if not self.template_id.active:
|
||||
return
|
||||
resource = self.resource
|
||||
if "active" in resource._fields and not resource.active:
|
||||
return
|
||||
return self.create(self._generate_new_evaluation_vals())
|
||||
|
||||
def _generate_new_evaluation_vals(self):
|
||||
return {
|
||||
"model": self.model,
|
||||
"res_id": self.res_id,
|
||||
"template_id": self.template_id.id,
|
||||
"user_id": self.user_id.id,
|
||||
"manager_ids": [(6, 0, self.manager_ids.ids)],
|
||||
"feedback": self.template_id.feedback,
|
||||
"note": self.template_id.note,
|
||||
}
|
||||
|
||||
def _cron_new_evaluation(self):
|
||||
for evaluation in self.search(
|
||||
[
|
||||
("next_evaluation_date", "<=", fields.Date.today()),
|
||||
("next_evaluation_generated", "=", False),
|
||||
("state", "=", "done"),
|
||||
]
|
||||
):
|
||||
evaluation._generate_new_evaluation()
|
||||
evaluation.next_evaluation_generated = True
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
# Copyright 2023 CreuBlanca
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class MgmtsystemEvaluationAbstract(models.AbstractModel):
|
||||
_name = "mgmtsystem.evaluation.abstract"
|
||||
_description = "Abstract model to inherit by objects that can be evaluated"
|
||||
|
||||
mgmtsystem_evaluation_ids = fields.One2many(
|
||||
"mgmtsystem.evaluation",
|
||||
inverse_name="res_id",
|
||||
domain=lambda r: [("model", "=", r._name)],
|
||||
)
|
||||
mgmtsystem_evaluation_count = fields.Integer(
|
||||
compute="_compute_mgmtsystem_evaluation_count"
|
||||
)
|
||||
|
||||
@api.depends("mgmtsystem_evaluation_ids")
|
||||
def _compute_mgmtsystem_evaluation_count(self):
|
||||
for record in self:
|
||||
record.mgmtsystem_evaluation_count = len(record.mgmtsystem_evaluation_ids)
|
||||
|
||||
def _get_mgmtsystem_evaluation_user(self):
|
||||
return self.env["res.user"]
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
# Copyright 2023 CreuBlanca
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class MgmtsystemEvaluationResult(models.Model):
|
||||
_name = "mgmtsystem.evaluation.result"
|
||||
_description = "Evaluation Result"
|
||||
|
||||
name = fields.Char()
|
||||
template_ids = fields.Many2many("mgmtsystem.evaluation.template")
|
||||
sequence = fields.Integer()
|
||||
active = fields.Boolean(default=True)
|
||||
passed = fields.Boolean()
|
||||
|
|
@ -0,0 +1,68 @@
|
|||
# Copyright 2023 CreuBlanca
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
from odoo import api, fields, models
|
||||
|
||||
|
||||
class MgmtsytemEvaluationTemplate(models.Model):
|
||||
_name = "mgmtsystem.evaluation.template"
|
||||
_description = "Evaluation Template"
|
||||
|
||||
name = fields.Char(required=True)
|
||||
model_id = fields.Many2one(
|
||||
"ir.model",
|
||||
domain=[("is_mgmtsystem_evaluation", "=", True)],
|
||||
required=True,
|
||||
ondelete="cascade",
|
||||
)
|
||||
active = fields.Boolean(default=True)
|
||||
model = fields.Char(
|
||||
store=True, related="model_id.model", string="Model technical name"
|
||||
)
|
||||
result_ids = fields.Many2many("mgmtsystem.evaluation.result")
|
||||
feedback = fields.Html()
|
||||
user_activity_type_id = fields.Many2one(
|
||||
"mail.activity.type",
|
||||
string="Activity for user",
|
||||
domain=lambda self: [
|
||||
"|",
|
||||
("res_model", "=", False),
|
||||
("res_model", "=", "mgmtsystem.evaluation"),
|
||||
],
|
||||
ondelete="set null",
|
||||
help="""Automatically schedule this activity to the user
|
||||
(if exists) once the evaluation is started""",
|
||||
)
|
||||
manager_activity_type_id = fields.Many2one(
|
||||
"mail.activity.type",
|
||||
string="Activity for manager",
|
||||
domain=lambda self: [
|
||||
"|",
|
||||
("res_model", "=", False),
|
||||
("res_model", "=", "mgmtsystem.evaluation"),
|
||||
],
|
||||
ondelete="set null",
|
||||
help="""Automatically schedule this activity to the Manager
|
||||
once the evaluation is started""",
|
||||
)
|
||||
note = fields.Html()
|
||||
group_id = fields.Many2one("res.groups")
|
||||
recurrence_type = fields.Selection(
|
||||
lambda self: [
|
||||
(key, value[0]) for key, value in self._get_recurrence_type().items()
|
||||
]
|
||||
)
|
||||
recurrence_period = fields.Integer()
|
||||
|
||||
@api.model
|
||||
def _get_recurrence_type(self):
|
||||
return {
|
||||
"daily": ("Daily", lambda r: relativedelta(days=r)),
|
||||
"weekly": ("Weekly", lambda r: relativedelta(weeks=r)),
|
||||
"monthly": ("Monthly", lambda r: relativedelta(months=r)),
|
||||
"quarterly": ("Quarterly", lambda r: relativedelta(months=3 * r)),
|
||||
"semesterly": ("Semesterly", lambda r: relativedelta(months=6 * r)),
|
||||
"yearly": ("Yearly", lambda r: relativedelta(years=r)),
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
# Copyright 2023 CreuBlanca
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import models
|
||||
|
||||
|
||||
class ResPartner(models.Model):
|
||||
_name = "res.partner"
|
||||
_inherit = ["res.partner", "mgmtsystem.evaluation.abstract"]
|
||||
|
||||
def _get_mgmtsystem_evaluation_user(self):
|
||||
return self.user_ids[:1]
|
||||
Loading…
Add table
Add a link
Reference in a new issue