From da84cc816b73f880dc31f234e8a7f7e19baefdaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Jos=C3=A9=20Scarafia?= Date: Fri, 3 Nov 2023 15:58:04 -0300 Subject: [PATCH 1/3] [ADD] okr: add module for okr management --- okr/__init__.py | 1 + okr/__manifest__.py | 17 +++++++++++++++ okr/models/__init__.py | 2 ++ okr/models/okr_key_result.py | 14 +++++++++++++ okr/models/okr_objective.py | 19 +++++++++++++++++ okr/security/ir.model.access.csv | 3 +++ okr/views/okr_key_result_views.xml | 32 +++++++++++++++++++++++++++++ okr/views/okr_objective_views.xml | 33 ++++++++++++++++++++++++++++++ 8 files changed, 121 insertions(+) create mode 100644 okr/__init__.py create mode 100644 okr/__manifest__.py create mode 100644 okr/models/__init__.py create mode 100644 okr/models/okr_key_result.py create mode 100644 okr/models/okr_objective.py create mode 100644 okr/security/ir.model.access.csv create mode 100644 okr/views/okr_key_result_views.xml create mode 100644 okr/views/okr_objective_views.xml diff --git a/okr/__init__.py b/okr/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/okr/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/okr/__manifest__.py b/okr/__manifest__.py new file mode 100644 index 00000000..7d9596df --- /dev/null +++ b/okr/__manifest__.py @@ -0,0 +1,17 @@ +{ + 'name': 'OKR', + 'version': "16.0.1.0.0", + 'author': 'ADHOC SA', + 'website': 'www.adhoc.com.ar', + 'license': 'AGPL-3', + 'depends': [ + 'hr', + ], + 'data': [ + 'views/okr_objective_views.xml', + 'security/ir.model.access.csv', + ], + 'demo': [ + ], + 'installable': True, +} diff --git a/okr/models/__init__.py b/okr/models/__init__.py new file mode 100644 index 00000000..9a9ae6d9 --- /dev/null +++ b/okr/models/__init__.py @@ -0,0 +1,2 @@ +from . import okr_key_result +from . import okr_objective diff --git a/okr/models/okr_key_result.py b/okr/models/okr_key_result.py new file mode 100644 index 00000000..69f15e67 --- /dev/null +++ b/okr/models/okr_key_result.py @@ -0,0 +1,14 @@ +from odoo import models, fields + + +class OkrObjective(models.Model): + _name = 'okr.key_result' + _description = 'OKR Key Result' + + name = fields.Char(required=True) + description = fields.Html() + objective_id = fields.Many2one('okr.objective', required=True, ondelete='cascade') + user_id = fields.Many2one('res.users', string='Responsible') + weight = fields.Integer(required=True) + target = fields.Integer(required=True) + progress = fields.Integer() diff --git a/okr/models/okr_objective.py b/okr/models/okr_objective.py new file mode 100644 index 00000000..5b53d2b9 --- /dev/null +++ b/okr/models/okr_objective.py @@ -0,0 +1,19 @@ +from odoo import models, fields + + +class OkrObjective(models.Model): + _name = 'okr.objective' + _description = 'OKR Objectives' + + name = fields.Char(required=True) + description = fields.Char(required=True) + notes = fields.Html() + department_id = fields.Many2one('hr.department', required=True,) + user_id = fields.Many2one('res.users', string='Responsible') + key_result_ids = fields.One2many('okr.key_result', 'objective_id', string='Responsible') + type = fields.Selection([('commitment', 'Commitment'), ('inspirational', 'Inspirational')], required=True) + progress = fields.Integer(compute='_compute_progress') + + def _compute_progress(self): + # TODO impleemntar + self.progress = 0.0 diff --git a/okr/security/ir.model.access.csv b/okr/security/ir.model.access.csv new file mode 100644 index 00000000..9418055c --- /dev/null +++ b/okr/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +okr.access_okr_key_result,access_okr_key_result,okr.model_okr_key_result,base.group_user,1,1,1,1 +okr.access_okr_objective,access_okr_objective,okr.model_okr_objective,base.group_user,1,1,1,1 diff --git a/okr/views/okr_key_result_views.xml b/okr/views/okr_key_result_views.xml new file mode 100644 index 00000000..a3c45e34 --- /dev/null +++ b/okr/views/okr_key_result_views.xml @@ -0,0 +1,32 @@ + + + + okr.key_result.tree + okr.key_result + + + + + + + + + okr.key_result.form + okr.key_result + +
+ + +
+
+ + + OKR Key Results + okr.key_result + current + tree,form + + + + +
diff --git a/okr/views/okr_objective_views.xml b/okr/views/okr_objective_views.xml new file mode 100644 index 00000000..f17db5cf --- /dev/null +++ b/okr/views/okr_objective_views.xml @@ -0,0 +1,33 @@ + + + + okr.objective.tree + okr.objective + + + + + + + + + okr.objective.form + okr.objective + +
+ + +
+
+ + + OKR Objectives + okr.objective + current + tree,form + + + + + +
From b4a64618aa4d8cfbcfb83b7bbf1e5ef78c180999 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Jos=C3=A9=20Scarafia?= Date: Thu, 11 Jan 2024 10:53:41 -0300 Subject: [PATCH 2/3] [MIG] okr: Migration to 17.0 --- okr/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/okr/__manifest__.py b/okr/__manifest__.py index 7d9596df..7cf6b41f 100644 --- a/okr/__manifest__.py +++ b/okr/__manifest__.py @@ -1,6 +1,6 @@ { 'name': 'OKR', - 'version': "16.0.1.0.0", + 'version': "17.0.1.0.0", 'author': 'ADHOC SA', 'website': 'www.adhoc.com.ar', 'license': 'AGPL-3', From b0cdaeeda000f545f32aaec5bc6d85588f7d424b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Jos=C3=A9=20Scarafia?= Date: Thu, 22 Feb 2024 10:55:47 -0300 Subject: [PATCH 3/3] [WIP] --- okr/__manifest__.py | 3 + okr/demo/okr.objective.csv | 9 +++ okr/demo/okr_objective_demo.xml | 79 +++++++++++++++++++++++++ okr/models/okr_key_result.py | 17 ++++-- okr/models/okr_objective.py | 25 +++++--- okr/security/ir.model.access.csv | 5 +- okr/security/security.xml | 75 ++++++++++++++++++++++++ okr/views/okr_key_result_views.xml | 59 ++++++++++++++++++- okr/views/okr_objective_views.xml | 94 +++++++++++++++++++++++++++++- 9 files changed, 348 insertions(+), 18 deletions(-) create mode 100644 okr/demo/okr.objective.csv create mode 100644 okr/demo/okr_objective_demo.xml create mode 100644 okr/security/security.xml diff --git a/okr/__manifest__.py b/okr/__manifest__.py index 7cf6b41f..f7931356 100644 --- a/okr/__manifest__.py +++ b/okr/__manifest__.py @@ -9,9 +9,12 @@ ], 'data': [ 'views/okr_objective_views.xml', + 'views/okr_key_result_views.xml', + 'security/security.xml', 'security/ir.model.access.csv', ], 'demo': [ + 'demo/okr_objective_demo.xml', ], 'installable': True, } diff --git a/okr/demo/okr.objective.csv b/okr/demo/okr.objective.csv new file mode 100644 index 00000000..f7e86b9a --- /dev/null +++ b/okr/demo/okr.objective.csv @@ -0,0 +1,9 @@ +id,name,department_id,description,from_date,to_date,type,user_id +okr_objective_q1_sustentabilidad_crecer,Crecer,Management / Administration,Lograr escalabilidad en los procesos masivos,2024-01-01,2024-02-29,Commitment,Mitchell Admin +okr_objective_q1_sustentabilidad_admin,Sustentabilidad,Management / Administration,Ser robustos en los procesos actuales en búsqueda de la seguridad de los mismos,2024-01-01,2024-02-29,Commitment,Mitchell Admin +okr_objective_q1_sustentabilidad_valor,Agregar valor al cliente,Management / Research & Development / R&D USA,Agregar valor a traves de mayor agilidad y mejor comunicacion,2024-01-01,2024-02-29,Commitment,Mitchell Admin +okr_objective_q1_sustentabilidad_rd,Sustentabilidad,Management / Research & Development / R&D USA,"Actualizar clientes a full, lanzar la 17 y trabajar en cultura de seguridad",2024-01-01,2024-02-29,Commitment,Mitchell Admin +okr_objective_q1_valor,Agregar valor al cliente,,Agregar valor a traves de mayor agilidad y mejor comunicacion,2024-01-01,2024-02-29,Commitment,Mitchell Admin +okr_objective_q1_crecer,Crecer,,"Crecer internacionalmente, consolidando Uruguay",2024-01-01,2024-02-29,Commitment,Mitchell Admin +okr_objective_year_crecer,Crecer,,Crecer en toda la organizacion poniendo foco en lo internacional,2024-01-01,eval(time.strftime('%Y-12-31')),Inspirational,Mitchell Admin +okr_objective_year_valor,Valor al cliente,,Aportar mas valor al cliente de manera cada vez mas tecnologica y sistematica,2024-01-01,eval(time.strftime('%Y-12-31')),Commitment,Mitchell Admin diff --git a/okr/demo/okr_objective_demo.xml b/okr/demo/okr_objective_demo.xml new file mode 100644 index 00000000..39690ab6 --- /dev/null +++ b/okr/demo/okr_objective_demo.xml @@ -0,0 +1,79 @@ + + + + Crecer + Crecer en toda la organizacion poniendo foco en lo internacional + commitment + + + + + + + Valor al Cliente + Aportar mas valor al cliente de manera cada vez mas tecnologica y sistematica + inspirational + + + + + + + Crecer internacionalmente, consolidando Uruguay + Crecer en toda la organizacion poniendo foco en lo internacional + commitment + + + + + + + Agregar valor al cliente,,Agregar valor a traves de mayor agilidad y mejor comunicacion + Aportar mas valor al cliente de manera cada vez mas tecnologica y sistematica + inspirational + + + + + + + Crecer + Lograr escalabilidad en los procesos masivos + commitment + + + + + + + + Sustentabilidad + Ser robustos en los procesos actuales en búsqueda de la seguridad de los mismos + inspirational + + + + + + + + Agregar valor al cliente + Agregar valor a traves de mayor agilidad y mejor comunicacion + commitment + + + + + + + + Sustentabilidad + Actualizar clientes a full, lanzar la 17 y trabajar en cultura de seguridad + inspirational + + + + + + + diff --git a/okr/models/okr_key_result.py b/okr/models/okr_key_result.py index 69f15e67..27490499 100644 --- a/okr/models/okr_key_result.py +++ b/okr/models/okr_key_result.py @@ -1,14 +1,23 @@ -from odoo import models, fields +from odoo import models, fields, api -class OkrObjective(models.Model): +class OkrKeyResult(models.Model): _name = 'okr.key_result' _description = 'OKR Key Result' + _inherit = ['mail.thread', 'mail.activity.mixin'] name = fields.Char(required=True) description = fields.Html() objective_id = fields.Many2one('okr.objective', required=True, ondelete='cascade') - user_id = fields.Many2one('res.users', string='Responsible') + department_ids = fields.Many2many('hr.department', string='Interdependencies') + user_id = fields.Many2one('res.users', string='Responsible', required=True) weight = fields.Integer(required=True) target = fields.Integer(required=True) - progress = fields.Integer() + result = fields.Integer() + progress = fields.Integer(compute='_compute_progress', store=True) + company_id = fields.Many2one(related='objective_id.company_id', store=True) + + @api.depends('result', 'target') + def _compute_progress(self): + for rec in self: + rec.progress = rec.result / rec.target * 100 if rec.target else 100 diff --git a/okr/models/okr_objective.py b/okr/models/okr_objective.py index 5b53d2b9..c3552295 100644 --- a/okr/models/okr_objective.py +++ b/okr/models/okr_objective.py @@ -1,19 +1,30 @@ -from odoo import models, fields +from odoo import models, fields, api class OkrObjective(models.Model): _name = 'okr.objective' _description = 'OKR Objectives' + _inherit = ['mail.thread', 'mail.activity.mixin'] + _check_company_auto = True + _check_company_domain = models.check_company_domain_parent_of + # _parent_store = True + _order = 'from_date, department_id, to_date, name' name = fields.Char(required=True) description = fields.Char(required=True) notes = fields.Html() - department_id = fields.Many2one('hr.department', required=True,) - user_id = fields.Many2one('res.users', string='Responsible') - key_result_ids = fields.One2many('okr.key_result', 'objective_id', string='Responsible') + from_date = fields.Date(required=True) + to_date = fields.Date(required=True) + # parent_path = fields.Char(index=True, unaccent=False) + # parent_id = fields.Many2one('okr.objective', index=True, ondelete='cascade', check_company=True) + department_id = fields.Many2one('hr.department',) + user_id = fields.Many2one('res.users', string='Responsible', required=True) + key_result_ids = fields.One2many('okr.key_result', 'objective_id', string='Key Results') type = fields.Selection([('commitment', 'Commitment'), ('inspirational', 'Inspirational')], required=True) - progress = fields.Integer(compute='_compute_progress') + progress = fields.Integer(compute='_compute_progress', store=True) + company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env.company) + @api.depends('key_result_ids.progress', 'key_result_ids.weight') def _compute_progress(self): - # TODO impleemntar - self.progress = 0.0 + for rec in self: + rec.progress = sum(x.progress * x.weight/100 for x in rec.key_result_ids) diff --git a/okr/security/ir.model.access.csv b/okr/security/ir.model.access.csv index 9418055c..e658d037 100644 --- a/okr/security/ir.model.access.csv +++ b/okr/security/ir.model.access.csv @@ -1,3 +1,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -okr.access_okr_key_result,access_okr_key_result,okr.model_okr_key_result,base.group_user,1,1,1,1 -okr.access_okr_objective,access_okr_objective,okr.model_okr_objective,base.group_user,1,1,1,1 +access_okr_key_result_user,access_okr_key_result_user,model_okr_key_result,group_okr_user,1,1,1,1 +access_okr_objective_user,access_okr_objective_user,model_okr_objective,group_okr_user,1,1,0,0 +access_okr_objective_manager,access_okr_objective_manager,model_okr_objective,group_okr_manager,1,1,1,1 diff --git a/okr/security/security.xml b/okr/security/security.xml new file mode 100644 index 00000000..0c6f34ed --- /dev/null +++ b/okr/security/security.xml @@ -0,0 +1,75 @@ + + + + + + OKR + + + User + + + + + Manager + + + + + + + + + + OKR objective company rule + + ['|', ('company_id', '=', False), ('company_id', 'in', company_ids)] + + + + OKR Key Result company rule + + ['|', ('company_id', '=', False), ('company_id', 'in', company_ids)] + + + + OKR Key Result user rule by objective + + + [('objective_id.user_id', '=', user.id)] + + + + OKR Key Result user rule + + [('user_id', '=', user.id)] + + + + + + + OKR Key Result manager rule + + + [(1, '=', 1)] + + + + OKR Objective user rule + + + [('user_id', '=', user.id)] + + + + + + OKR Objective manager rule + + + [(1, '=', 1)] + + + + diff --git a/okr/views/okr_key_result_views.xml b/okr/views/okr_key_result_views.xml index a3c45e34..668de8f7 100644 --- a/okr/views/okr_key_result_views.xml +++ b/okr/views/okr_key_result_views.xml @@ -6,6 +6,14 @@ + + + + + + + + @@ -15,11 +23,58 @@ okr.key_result
- + + + + + + + + + + + + + + + + + +
+ + + +
+ + okr.key_result.search + okr.key_result + + + + + + + + + + + + + + + + + + + OKR Key Results okr.key_result @@ -27,6 +82,6 @@ tree,form - + diff --git a/okr/views/okr_objective_views.xml b/okr/views/okr_objective_views.xml index f17db5cf..72edc3a1 100644 --- a/okr/views/okr_objective_views.xml +++ b/okr/views/okr_objective_views.xml @@ -5,7 +5,15 @@ okr.objective + + + + + + + + @@ -15,19 +23,99 @@ okr.objective
- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + okr.objective.search + okr.objective + + + + + + + + + + + + + + + + + + + + + + + + + OKR Objectives okr.objective current tree,form + {'search_default_current': 1, 'search_default_of_departments': 1} - - + + +