Initial commit: OCA Technical packages (595 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:03 +02:00
commit 2cc02aac6e
24950 changed files with 2318079 additions and 0 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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"]

View file

@ -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()

View file

@ -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)),
}

View file

@ -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]