From d1a750eb0470fd0044d3779598cd129285cc4812 Mon Sep 17 00:00:00 2001 From: tarteo Date: Fri, 26 Apr 2019 14:35:16 +0200 Subject: [PATCH 01/21] [ADD] project_risk [FIX] Lint [ADD] Tests [IMP] Small improvements [IMP] Clearer roadmap --- project_risk/README.rst | 102 ++++ project_risk/__init__.py | 1 + project_risk/__manifest__.py | 26 + .../data/project_risk_category_data.xml | 21 + .../project_risk_response_category_data.xml | 29 ++ project_risk/i18n/project_risk.pot | 326 +++++++++++++ project_risk/menuitems.xml | 17 + project_risk/models/__init__.py | 5 + project_risk/models/project_project.py | 35 ++ project_risk/models/project_risk.py | 143 ++++++ project_risk/models/project_risk_category.py | 10 + project_risk/models/project_risk_response.py | 16 + .../models/project_risk_response_category.py | 10 + project_risk/readme/CONFIGURE.rst | 2 + project_risk/readme/CONTRIBUTORS.rst | 1 + project_risk/readme/DESCRIPTION.rst | 3 + project_risk/readme/ROADMAP.rst | 1 + project_risk/readme/USAGE.rst | 12 + project_risk/security/ir_model_access.xml | 90 ++++ project_risk/static/description/icon.png | Bin 0 -> 9455 bytes project_risk/static/description/index.html | 456 ++++++++++++++++++ project_risk/static/description/matrix.png | Bin 0 -> 32554 bytes project_risk/tests/__init__.py | 1 + project_risk/tests/test_project_risk.py | 36 ++ project_risk/views/project_project_view.xml | 33 ++ .../views/project_risk_category_view.xml | 33 ++ .../project_risk_response_category_view.xml | 33 ++ project_risk/views/project_risk_view.xml | 103 ++++ 28 files changed, 1545 insertions(+) create mode 100644 project_risk/README.rst create mode 100644 project_risk/__init__.py create mode 100644 project_risk/__manifest__.py create mode 100644 project_risk/data/project_risk_category_data.xml create mode 100644 project_risk/data/project_risk_response_category_data.xml create mode 100644 project_risk/i18n/project_risk.pot create mode 100644 project_risk/menuitems.xml create mode 100644 project_risk/models/__init__.py create mode 100644 project_risk/models/project_project.py create mode 100644 project_risk/models/project_risk.py create mode 100644 project_risk/models/project_risk_category.py create mode 100644 project_risk/models/project_risk_response.py create mode 100644 project_risk/models/project_risk_response_category.py create mode 100644 project_risk/readme/CONFIGURE.rst create mode 100644 project_risk/readme/CONTRIBUTORS.rst create mode 100644 project_risk/readme/DESCRIPTION.rst create mode 100644 project_risk/readme/ROADMAP.rst create mode 100644 project_risk/readme/USAGE.rst create mode 100644 project_risk/security/ir_model_access.xml create mode 100644 project_risk/static/description/icon.png create mode 100644 project_risk/static/description/index.html create mode 100644 project_risk/static/description/matrix.png create mode 100644 project_risk/tests/__init__.py create mode 100644 project_risk/tests/test_project_risk.py create mode 100644 project_risk/views/project_project_view.xml create mode 100644 project_risk/views/project_risk_category_view.xml create mode 100644 project_risk/views/project_risk_response_category_view.xml create mode 100644 project_risk/views/project_risk_view.xml diff --git a/project_risk/README.rst b/project_risk/README.rst new file mode 100644 index 0000000000..4b2b4ea636 --- /dev/null +++ b/project_risk/README.rst @@ -0,0 +1,102 @@ +============ +Project Risk +============ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fproject-lightgray.png?logo=github + :target: https://github.com/OCA/project/tree/11.0/project_risk + :alt: OCA/project +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/project-11-0/project-11-0-project_risk + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/140/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +With this module you can manage your projects risk using the MOR method. + +https://www.axelos.com/best-practice-solutions/mor/what-is-mor + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +This module provides a number of default risk categories, but you can add more at *Project > Configuration > Risk Categories*. +For risk response categories you need to go to *Project > Configuration > Risk Response Categories*. + +Usage +===== + +To define risks for your projects: + +#. Go to *Project > Search > Risks*; +#. create a new risk; +#. the rating is automatically calculated based on this risk matrix: + .. image:: https://raw.githubusercontent.com/OCA/project/11.0/project_risk/static/description/matrix.png + :alt: Risk matrix +#. set the state to 'Active' if the risk is in effect; +#. set the state to 'Closed' if the risk is processed or e.g. completely avoided. + +The list of risks is by default ordered by rating and proximity. +Risks with a rating higher than rating 'Medium-High' become red. + +Known issues / Roadmap +====================== + +* Create a task based on a risk response: it would be nice if a task can automatically be created based on the risk response information. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Onestein + +Contributors +~~~~~~~~~~~~ + +* Dennis Sluijk + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/project `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/project_risk/__init__.py b/project_risk/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/project_risk/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/project_risk/__manifest__.py b/project_risk/__manifest__.py new file mode 100644 index 0000000000..820dc2a15c --- /dev/null +++ b/project_risk/__manifest__.py @@ -0,0 +1,26 @@ +{ + 'name': 'Project Risk', + 'summary': 'MOR risk management method', + 'author': 'Onestein, Odoo Community Association (OCA)', + 'license': 'AGPL-3', + 'website': 'https://github.com/OCA/project', + 'category': 'Project Management', + 'version': '11.0.1.0.0', + 'depends': [ + 'project' + ], + 'data': [ + 'security/ir_model_access.xml', + + 'data/project_risk_response_category_data.xml', + 'data/project_risk_category_data.xml', + + 'views/project_risk_response_category_view.xml', + 'views/project_risk_category_view.xml', + 'views/project_risk_view.xml', + 'views/project_project_view.xml', + + 'menuitems.xml', + ], + 'installable': True, +} diff --git a/project_risk/data/project_risk_category_data.xml b/project_risk/data/project_risk_category_data.xml new file mode 100644 index 0000000000..b62d8fafcc --- /dev/null +++ b/project_risk/data/project_risk_category_data.xml @@ -0,0 +1,21 @@ + + + + + + Quality + + + + Network + + + + Legal + + + + Supplier + + diff --git a/project_risk/data/project_risk_response_category_data.xml b/project_risk/data/project_risk_response_category_data.xml new file mode 100644 index 0000000000..a91cf4a092 --- /dev/null +++ b/project_risk/data/project_risk_response_category_data.xml @@ -0,0 +1,29 @@ + + + + + + Avoid + + + + Reduce + + + + Fall back + + + + Transfer + + + + Accept + + + + Share + + diff --git a/project_risk/i18n/project_risk.pot b/project_risk/i18n/project_risk.pot new file mode 100644 index 0000000000..64fef7b754 --- /dev/null +++ b/project_risk/i18n/project_risk.pot @@ -0,0 +1,326 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_risk +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_actionee_id +msgid "Actionee" +msgstr "" + +#. module: project_risk +#: model:ir.ui.view,arch_db:project_risk.project_risk_search_view +#: selection:project.risk,state:0 +msgid "Active" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_project_risk_category_id +msgid "Category" +msgstr "" + +#. module: project_risk +#: selection:project.risk,state:0 +msgid "Closed" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category_create_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_create_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category_create_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_create_uid +msgid "Created by" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category_create_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_create_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category_create_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_create_date +msgid "Created on" +msgstr "" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "Critical" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_description +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_description +#: model:ir.ui.view,arch_db:project_risk.project_risk_form_view +msgid "Description" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category_display_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_display_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category_display_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_display_name +msgid "Display Name" +msgstr "" + +#. module: project_risk +#: selection:project.risk,state:0 +msgid "Draft" +msgstr "" + +#. module: project_risk +#: selection:project.risk,impact:0 +msgid "Extreme" +msgstr "" + +#. module: project_risk +#: model:ir.ui.view,arch_db:project_risk.project_risk_search_view +msgid "Group By..." +msgstr "" + +#. module: project_risk +#: selection:project.risk,proximity:0 +#: selection:project.risk,rating:0 +msgid "High" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category_id +#: model:ir.model.fields,field_description:project_risk.field_project_risk_id +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category_id +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_id +msgid "ID" +msgstr "" + +#. module: project_risk +#: selection:project.risk,proximity:0 +msgid "Imminent" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_impact +msgid "Impact" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk___last_update +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category___last_update +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response___last_update +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category___last_update +msgid "Last Modified on" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category_write_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category_write_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_write_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_write_uid +msgid "Last Updated by" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category_write_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category_write_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_write_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_write_date +msgid "Last Updated on" +msgstr "" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Likely" +msgstr "" + +#. module: project_risk +#: selection:project.risk,proximity:0 +#: selection:project.risk,rating:0 +msgid "Low" +msgstr "" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "Low-Medium" +msgstr "" + +#. module: project_risk +#: selection:project.risk,proximity:0 +#: selection:project.risk,rating:0 +msgid "Medium" +msgstr "" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "Medium-High" +msgstr "" + +#. module: project_risk +#: selection:project.risk,impact:0 +msgid "Minor" +msgstr "" + +#. module: project_risk +#: selection:project.risk,impact:0 +msgid "Moderate" +msgstr "" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "N/A" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category_name +msgid "Name" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_owner_id +msgid "Owner" +msgstr "" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Possible" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_probability +msgid "Probability" +msgstr "" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_project +#: model:ir.model.fields,field_description:project_risk.field_project_risk_project_id +#: model:ir.ui.view,arch_db:project_risk.project_risk_search_view +msgid "Project" +msgstr "" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_project_project_risk_ids +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_project_risk_id +msgid "Project Risk" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_project_project_risk_count +msgid "Project Risk Count" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_proximity +msgid "Proximity" +msgstr "" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Rare" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_rating +msgid "Rating" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_project_risk_response_ids +#: model:ir.ui.view,arch_db:project_risk.project_risk_form_view +msgid "Response" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_project_risk_response_category_id +msgid "Response Category" +msgstr "" + +#. module: project_risk +#: model:ir.actions.act_window,name:project_risk.project_risk_category_action +#: model:ir.ui.menu,name:project_risk.project_risk_category_menu +msgid "Risk Categories" +msgstr "" + +#. module: project_risk +#: model:ir.actions.act_window,name:project_risk.project_risk_response_category_action +#: model:ir.ui.menu,name:project_risk.project_risk_response_category_menu +msgid "Risk Response Categories" +msgstr "" + +#. module: project_risk +#: model:ir.actions.act_window,name:project_risk.project_risk_action +#: model:ir.ui.menu,name:project_risk.project_risk_menu +#: model:ir.ui.view,arch_db:project_risk.edit_project +#: model:ir.ui.view,arch_db:project_risk.project_completion_kanban +msgid "Risks" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_sequence +msgid "Sequence" +msgstr "" + +#. module: project_risk +#: selection:project.risk,impact:0 +msgid "Significant" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_state +msgid "State" +msgstr "" + +#. module: project_risk +#: selection:project.risk,impact:0 +#: selection:project.risk,rating:0 +msgid "Trivial" +msgstr "" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Unlikely" +msgstr "" + +#. module: project_risk +#: selection:project.risk,proximity:0 +#: selection:project.risk,rating:0 +msgid "Very High" +msgstr "" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "Very Low" +msgstr "" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Very likely" +msgstr "" + +#. module: project_risk +#: selection:project.risk,proximity:0 +msgid "Very low" +msgstr "" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk_category +msgid "project.risk.category" +msgstr "" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk_response +msgid "project.risk.response" +msgstr "" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk_response_category +msgid "project.risk.response.category" +msgstr "" + diff --git a/project_risk/menuitems.xml b/project_risk/menuitems.xml new file mode 100644 index 0000000000..c721e194c3 --- /dev/null +++ b/project_risk/menuitems.xml @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/project_risk/models/__init__.py b/project_risk/models/__init__.py new file mode 100644 index 0000000000..df86268a5d --- /dev/null +++ b/project_risk/models/__init__.py @@ -0,0 +1,5 @@ +from . import project_risk_category +from . import project_risk_response_category +from . import project_risk_response +from . import project_risk +from . import project_project diff --git a/project_risk/models/project_project.py b/project_risk/models/project_project.py new file mode 100644 index 0000000000..6f0bb87449 --- /dev/null +++ b/project_risk/models/project_project.py @@ -0,0 +1,35 @@ +# Copyright 2019 Onestein +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, fields, api + + +class Project(models.Model): + _inherit = 'project.project' + + project_risk_ids = fields.One2many( + comodel_name='project.risk', + inverse_name='project_id' + ) + + project_risk_count = fields.Integer( + compute='_compute_risk_count' + ) + + @api.multi + def _compute_risk_count(self): + for project in self: + project.project_risk_count = len(project.project_risk_ids) + + @api.multi + def view_risk(self): + self.ensure_one() + action = self.env.ref('project_risk.project_risk_action') + action = action.read()[0] + action['context'] = { + 'default_project_id': self.id + } + action['domain'] = [ + ('project_id', '=', self.id) + ] + return action diff --git a/project_risk/models/project_risk.py b/project_risk/models/project_risk.py new file mode 100644 index 0000000000..397d20bc29 --- /dev/null +++ b/project_risk/models/project_risk.py @@ -0,0 +1,143 @@ +# Copyright 2019 Onestein +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, fields, api + +PROBABILITY = { + 1: 'Rare', + 2: 'Unlikely', + 3: 'Possible', + 4: 'Likely', + 5: 'Very likely' +} + +IMPACT = { + 1: 'Trivial', + 2: 'Minor', + 3: 'Moderate', + 4: 'Significant', + 5: 'Extreme' +} + +RATING = { + 1: 'N/A', + 2: 'Trivial', + 3: 'Very Low', + 4: 'Low', + 5: 'Low-Medium', + 6: 'Medium', + 7: 'Medium-High', + 8: 'High', + 9: 'Very High', + 10: 'Critical' +} + +PROXIMITY = { + 1: 'Very low', + 2: 'Low', + 3: 'Medium', + 4: 'High', + 5: 'Very High', + 6: 'Imminent' +} + + +class ProjectRisk(models.Model): + _inherit = ['mail.thread'] + _name = 'project.risk' + _description = 'Project Risk' + + project_id = fields.Many2one( + comodel_name='project.project', + required=True + ) + + project_risk_category_id = fields.Many2one( + string='Category', + comodel_name='project.risk.category', + required=True, + ) + + name = fields.Char( + required=1 + ) + + description = fields.Html() + + probability = fields.Selection( + required=True, + selection=list(PROBABILITY.items()), + track_visibility='onchange' + ) + + impact = fields.Selection( + required=True, + selection=list(IMPACT.items()) + ) + + rating = fields.Selection( + compute='_compute_rating', + store=True, + selection=list(RATING.items()) + ) + + proximity = fields.Selection( + selection=list(PROXIMITY.items()), + track_visibility='onchange' + ) + + project_risk_response_category_id = fields.Many2one( + comodel_name='project.risk.response.category', + string='Response Category' + ) + + state = fields.Selection( + selection=[ + ('draft', 'Draft'), + ('active', 'Active'), + ('closed', 'Closed') + ], + default='draft', + track_visibility='onchange' + ) + + owner_id = fields.Many2one( + string='Owner', + comodel_name='res.users', + track_visibility='onchange' + ) + + actionee_id = fields.Many2one( + string='Actionee', + comodel_name='res.users', + track_visibility='onchange' + ) + + project_risk_response_ids = fields.One2many( + string='Response', + comodel_name='project.risk.response', + inverse_name='project_risk_id' + ) + + @api.multi + @api.depends('probability', 'impact') + def _compute_rating(self): + for risk in self: + risk.rating = risk.probability + risk.impact + + @api.multi + def write(self, vals): + res = super(ProjectRisk, self).write(vals) + if vals.get("actionee_id"): + self.message_subscribe_users(user_ids=[vals.get("actionee_id")]) + if vals.get("owner_id"): + self.message_subscribe_users(user_ids=[vals.get("owner_id")]) + return res + + @api.model + def create(self, vals): + res = super(ProjectRisk, self).create(vals) + res.message_subscribe_users(user_ids=[ + res.owner_id.id, res.actionee_id.id + ]) + return res diff --git a/project_risk/models/project_risk_category.py b/project_risk/models/project_risk_category.py new file mode 100644 index 0000000000..2ce4734b12 --- /dev/null +++ b/project_risk/models/project_risk_category.py @@ -0,0 +1,10 @@ +# Copyright 2019 Onestein +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, fields + + +class ProjectRiskCategory(models.Model): + _name = 'project.risk.category' + + name = fields.Char(required=True) diff --git a/project_risk/models/project_risk_response.py b/project_risk/models/project_risk_response.py new file mode 100644 index 0000000000..3ad4279a87 --- /dev/null +++ b/project_risk/models/project_risk_response.py @@ -0,0 +1,16 @@ +# Copyright 2019 Onestein +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, fields + + +class ProjectRiskResponse(models.Model): + _name = 'project.risk.response' + + project_risk_id = fields.Many2one( + comodel_name='project.risk.response' + ) + + sequence = fields.Integer() + + description = fields.Char() diff --git a/project_risk/models/project_risk_response_category.py b/project_risk/models/project_risk_response_category.py new file mode 100644 index 0000000000..6ad15c2c4e --- /dev/null +++ b/project_risk/models/project_risk_response_category.py @@ -0,0 +1,10 @@ +# Copyright 2019 Onestein +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models, fields + + +class ProjectRiskResponseCategory(models.Model): + _name = 'project.risk.response.category' + + name = fields.Char(required=True) diff --git a/project_risk/readme/CONFIGURE.rst b/project_risk/readme/CONFIGURE.rst new file mode 100644 index 0000000000..55e2f913a6 --- /dev/null +++ b/project_risk/readme/CONFIGURE.rst @@ -0,0 +1,2 @@ +This module provides a number of default risk categories, but you can add more at *Project > Configuration > Risk Categories*. +For risk response categories you need to go to *Project > Configuration > Risk Response Categories*. diff --git a/project_risk/readme/CONTRIBUTORS.rst b/project_risk/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..47b6403d06 --- /dev/null +++ b/project_risk/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Dennis Sluijk diff --git a/project_risk/readme/DESCRIPTION.rst b/project_risk/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..5118b7c99d --- /dev/null +++ b/project_risk/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +With this module you can manage your projects risk using the MOR method. + +https://www.axelos.com/best-practice-solutions/mor/what-is-mor diff --git a/project_risk/readme/ROADMAP.rst b/project_risk/readme/ROADMAP.rst new file mode 100644 index 0000000000..ad9ba73ee4 --- /dev/null +++ b/project_risk/readme/ROADMAP.rst @@ -0,0 +1 @@ +* Create a task based on a risk response: it would be nice if a task can automatically be created based on the risk response information. diff --git a/project_risk/readme/USAGE.rst b/project_risk/readme/USAGE.rst new file mode 100644 index 0000000000..de7514a1de --- /dev/null +++ b/project_risk/readme/USAGE.rst @@ -0,0 +1,12 @@ +To define risks for your projects: + +#. Go to *Project > Search > Risks*; +#. create a new risk; +#. the rating is automatically calculated based on this risk matrix: + .. image:: ../static/description/matrix.png + :alt: Risk matrix +#. set the state to 'Active' if the risk is in effect; +#. set the state to 'Closed' if the risk is processed or e.g. completely avoided. + +The list of risks is by default ordered by rating and proximity. +Risks with a rating higher than rating 'Medium-High' become red. diff --git a/project_risk/security/ir_model_access.xml b/project_risk/security/ir_model_access.xml new file mode 100644 index 0000000000..cb6869a9d5 --- /dev/null +++ b/project_risk/security/ir_model_access.xml @@ -0,0 +1,90 @@ + + + + + + + + project_risk_user_access + + + + + + + + + + project_risk_manager_access + + + + + + + + + + + project_risk_category_user_access + + + + + + + + + + project_risk_category_manager_access + + + + + + + + + + + project_risk_response_user_access + + + + + + + + + + project_risk_response_manager_access + + + + + + + + + + + project_risk_response_category_user_access + + + + + + + + + + project_risk_response_category_manager_access + + + + + + + + diff --git a/project_risk/static/description/icon.png b/project_risk/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/project_risk/static/description/index.html b/project_risk/static/description/index.html new file mode 100644 index 0000000000..1b32792552 --- /dev/null +++ b/project_risk/static/description/index.html @@ -0,0 +1,456 @@ + + + + + + +Project Risk + + + +
+

Project Risk

+ + +

Beta License: AGPL-3 OCA/project Translate me on Weblate Try me on Runbot

+

With this module you can manage your projects risk using the MOR method.

+

https://www.axelos.com/best-practice-solutions/mor/what-is-mor

+

Table of contents

+ +
+

Configuration

+

This module provides a number of default risk categories, but you can add more at Project > Configuration > Risk Categories. +For risk response categories you need to go to Project > Configuration > Risk Response Categories.

+
+
+

Usage

+

To define risks for your projects:

+
    +
  1. Go to Project > Search > Risks;

    +
  2. +
  3. create a new risk;

    +
  4. +
  5. +
    the rating is automatically calculated based on this risk matrix:
    +
    Risk matrix +
    +
    +
  6. +
  7. set the state to ‘Active’ if the risk is in effect;

    +
  8. +
  9. set the state to ‘Closed’ if the risk is processed or e.g. completely avoided.

    +
  10. +
+

The list of risks is by default ordered by rating and proximity. +Risks with a rating higher than rating ‘Medium-High’ become red.

+
+
+

Known issues / Roadmap

+
    +
  • Create a task based on a risk response: it would be nice if a task can automatically be created based on the risk response information.
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Onestein
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/project project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/project_risk/static/description/matrix.png b/project_risk/static/description/matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..51c6da6f0c9141ad237bb4d45ca3a08833da820e GIT binary patch literal 32554 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 literal 0 HcmV?d00001 diff --git a/project_risk/tests/__init__.py b/project_risk/tests/__init__.py new file mode 100644 index 0000000000..58b7fde314 --- /dev/null +++ b/project_risk/tests/__init__.py @@ -0,0 +1 @@ +from . import test_project_risk diff --git a/project_risk/tests/test_project_risk.py b/project_risk/tests/test_project_risk.py new file mode 100644 index 0000000000..271d4c8ab3 --- /dev/null +++ b/project_risk/tests/test_project_risk.py @@ -0,0 +1,36 @@ +from odoo.tests.common import TransactionCase + + +class TestProjectRisk(TransactionCase): + def setUp(self): + super().setUp() + self.project = self.env.ref('project.project_project_5') + self.risk_category = self.env.ref( + 'project_risk.project_risk_category_quality' + ) + self.risk = self.env['project.risk'].create({ + 'name': 'Risk X', + 'project_id': self.project.id, + 'project_risk_category_id': self.risk_category.id, + 'probability': 2, + 'impact': 2 + }) + + def test_project(self): + self.assertEqual(self.project.project_risk_count, 1) + action = self.project.view_risk() + self.assertEqual( + action['context']['default_project_id'], + self.project.id + ) + self.assertListEqual( + action['domain'], + [('project_id', '=', self.project.id)] + ) + + def test_risk(self): + self.risk.write({ + 'actionee_id': self.env.user.id, + 'owner_id': self.env.user.id + }) + self.assertEqual(self.risk.rating, 4) diff --git a/project_risk/views/project_project_view.xml b/project_risk/views/project_project_view.xml new file mode 100644 index 0000000000..004ade430a --- /dev/null +++ b/project_risk/views/project_project_view.xml @@ -0,0 +1,33 @@ + + + + + + edit.project + project.project + + + + + + + + + + project.completion.kanban + project.project + + + + + + + + diff --git a/project_risk/views/project_risk_category_view.xml b/project_risk/views/project_risk_category_view.xml new file mode 100644 index 0000000000..1b4cdabe7c --- /dev/null +++ b/project_risk/views/project_risk_category_view.xml @@ -0,0 +1,33 @@ + + + + + + project.risk.category + +
+ + + + + +
+
+
+ + + project.risk.category + + + + + + + + + Risk Categories + project.risk.category + form + +
diff --git a/project_risk/views/project_risk_response_category_view.xml b/project_risk/views/project_risk_response_category_view.xml new file mode 100644 index 0000000000..f4acef14f6 --- /dev/null +++ b/project_risk/views/project_risk_response_category_view.xml @@ -0,0 +1,33 @@ + + + + + + project.risk.response.category + +
+ + + + + +
+
+
+ + + project.risk.response.category + + + + + + + + + Risk Response Categories + project.risk.response.category + form + +
diff --git a/project_risk/views/project_risk_view.xml b/project_risk/views/project_risk_view.xml new file mode 100644 index 0000000000..8125e7b8e1 --- /dev/null +++ b/project_risk/views/project_risk_view.xml @@ -0,0 +1,103 @@ + + + + + + project.risk + +
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+ +
+
+ + + project.risk + + + + + + + + + + + + + project.risk + + + + + + + + + + + + + + + + Risks + project.risk + form + +
From 53e1da745c83a65fd845a4306998a2418f40e6dd Mon Sep 17 00:00:00 2001 From: Manuel Calero Date: Tue, 25 Feb 2020 16:41:19 +0100 Subject: [PATCH 02/21] [MIG] project_risk: Migration to 12.0 --- project_risk/README.rst | 13 +- project_risk/__manifest__.py | 7 +- project_risk/i18n/es.po | 448 ++++++++++++++++++ project_risk/i18n/project_risk.pot | 235 ++++++--- project_risk/models/project_project.py | 5 +- project_risk/models/project_risk.py | 19 +- project_risk/models/project_risk_category.py | 1 + project_risk/models/project_risk_response.py | 1 + .../models/project_risk_response_category.py | 1 + project_risk/readme/CONTRIBUTORS.rst | 1 + project_risk/static/description/index.html | 9 +- project_risk/tests/test_project_risk.py | 11 +- project_risk/{ => views}/menuitems.xml | 0 13 files changed, 648 insertions(+), 103 deletions(-) create mode 100644 project_risk/i18n/es.po rename project_risk/{ => views}/menuitems.xml (100%) diff --git a/project_risk/README.rst b/project_risk/README.rst index 4b2b4ea636..2acd41f020 100644 --- a/project_risk/README.rst +++ b/project_risk/README.rst @@ -14,13 +14,13 @@ Project Risk :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fproject-lightgray.png?logo=github - :target: https://github.com/OCA/project/tree/11.0/project_risk + :target: https://github.com/OCA/project/tree/12.0/project_risk :alt: OCA/project .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/project-11-0/project-11-0-project_risk + :target: https://translation.odoo-community.org/projects/project-12-0/project-12-0-project_risk :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/140/11.0 + :target: https://runbot.odoo-community.org/runbot/140/12.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -48,7 +48,7 @@ To define risks for your projects: #. Go to *Project > Search > Risks*; #. create a new risk; #. the rating is automatically calculated based on this risk matrix: - .. image:: https://raw.githubusercontent.com/OCA/project/11.0/project_risk/static/description/matrix.png + .. image:: https://raw.githubusercontent.com/OCA/project/12.0/project_risk/static/description/matrix.png :alt: Risk matrix #. set the state to 'Active' if the risk is in effect; #. set the state to 'Closed' if the risk is processed or e.g. completely avoided. @@ -67,7 +67,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -83,6 +83,7 @@ Contributors ~~~~~~~~~~~~ * Dennis Sluijk +* Manuel Calero - Tecnativa Maintainers ~~~~~~~~~~~ @@ -97,6 +98,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/project `_ project on GitHub. +This module is part of the `OCA/project `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/project_risk/__manifest__.py b/project_risk/__manifest__.py index 820dc2a15c..c289faf02a 100644 --- a/project_risk/__manifest__.py +++ b/project_risk/__manifest__.py @@ -5,22 +5,19 @@ 'license': 'AGPL-3', 'website': 'https://github.com/OCA/project', 'category': 'Project Management', - 'version': '11.0.1.0.0', + 'version': '12.0.1.0.0', 'depends': [ 'project' ], 'data': [ 'security/ir_model_access.xml', - 'data/project_risk_response_category_data.xml', 'data/project_risk_category_data.xml', - 'views/project_risk_response_category_view.xml', 'views/project_risk_category_view.xml', 'views/project_risk_view.xml', 'views/project_project_view.xml', - - 'menuitems.xml', + 'views/menuitems.xml', ], 'installable': True, } diff --git a/project_risk/i18n/es.po b/project_risk/i18n/es.po new file mode 100644 index 0000000000..8c5ce59a1d --- /dev/null +++ b/project_risk/i18n/es.po @@ -0,0 +1,448 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_risk +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"X-Generator: Poedit 2.2.4\n" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_needaction +#, fuzzy +msgid "Action Needed" +msgstr "Actionee" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__actionee_id +msgid "Actionee" +msgstr "Actionee" + +#. module: project_risk +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_search_view +#: selection:project.risk,state:0 +msgid "Active" +msgstr "Activo" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__project_risk_category_id +msgid "Category" +msgstr "Categoria" + +#. module: project_risk +#: selection:project.risk,state:0 +msgid "Closed" +msgstr "Cerrado" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__create_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__create_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__create_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__create_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__create_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__create_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "Critical" +msgstr "Critico" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__description +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__description +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_form_view +msgid "Description" +msgstr "Descripción" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__display_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__display_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__display_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__display_name +msgid "Display Name" +msgstr "Nombre a mostar" + +#. module: project_risk +#: selection:project.risk,state:0 +msgid "Draft" +msgstr "Borrador" + +#. module: project_risk +#: selection:project.risk,impact:0 +msgid "Extreme" +msgstr "Extremo" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_channel_ids +msgid "Followers (Channels)" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: project_risk +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_search_view +msgid "Group By..." +msgstr "Agrupado por..." + +#. module: project_risk +#: selection:project.risk,proximity:0 selection:project.risk,rating:0 +msgid "High" +msgstr "Alto" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__id +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__id +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__id +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__id +msgid "ID" +msgstr "ID" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_unread +msgid "If checked new messages require your attention." +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: project_risk +#: selection:project.risk,proximity:0 +msgid "Imminent" +msgstr "Inminente" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__impact +msgid "Impact" +msgstr "Impacto" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk____last_update +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category____last_update +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response____last_update +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category____last_update +msgid "Last Modified on" +msgstr "Última modificación en " + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__write_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__write_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__write_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__write_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__write_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__write_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Likely" +msgstr "Como" + +#. module: project_risk +#: selection:project.risk,proximity:0 selection:project.risk,rating:0 +msgid "Low" +msgstr "Bajo" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "Low-Medium" +msgstr "Bajo-Medio" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_main_attachment_id +msgid "Main Attachment" +msgstr "" + +#. module: project_risk +#: selection:project.risk,proximity:0 selection:project.risk,rating:0 +msgid "Medium" +msgstr "Medio" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "Medium-High" +msgstr "Medio-Alto" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_ids +msgid "Messages" +msgstr "" + +#. module: project_risk +#: selection:project.risk,impact:0 +msgid "Minor" +msgstr "Menor" + +#. module: project_risk +#: selection:project.risk,impact:0 +msgid "Moderate" +msgstr "Moderado" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "N/A" +msgstr "N/A" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__name +msgid "Name" +msgstr "Nombre" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_has_error_counter +msgid "Number of error" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_needaction_counter +msgid "Number of messages which requires an action" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_unread_counter +msgid "Number of unread messages" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__owner_id +msgid "Owner" +msgstr "Propietario" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Possible" +msgstr "Posible" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__probability +msgid "Probability" +msgstr "Probabilidad" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__project_id +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_search_view +msgid "Project" +msgstr "Proyecto" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_project__project_risk_ids +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__project_risk_id +msgid "Project Risk" +msgstr "" +"12/5000\n" +"Riesgo del proyecto" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_project__project_risk_count +msgid "Project Risk Count" +msgstr "Cuenta de riesgo del proyecto" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk_category +#, fuzzy +msgid "Project Risks Categories" +msgstr "Categoría de riesgo" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk_response +#, fuzzy +msgid "Project Risks Responses" +msgstr "Cuenta de riesgo del proyecto" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk_response_category +#, fuzzy +msgid "Project Risks Responses Categories" +msgstr "Categorías de respuesta al riesgo" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__proximity +msgid "Proximity" +msgstr "Proximidad" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Rare" +msgstr "Raro" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__rating +msgid "Rating" +msgstr "Clasificación" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__project_risk_response_ids +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_form_view +msgid "Response" +msgstr "Respuesta" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__project_risk_response_category_id +msgid "Response Category" +msgstr "Categoría de respuesta" + +#. module: project_risk +#: model:ir.actions.act_window,name:project_risk.project_risk_category_action +#: model:ir.ui.menu,name:project_risk.project_risk_category_menu +msgid "Risk Categories" +msgstr "Categoría de riesgo" + +#. module: project_risk +#: model:ir.actions.act_window,name:project_risk.project_risk_response_category_action +#: model:ir.ui.menu,name:project_risk.project_risk_response_category_menu +msgid "Risk Response Categories" +msgstr "Categorías de respuesta al riesgo" + +#. module: project_risk +#: model:ir.actions.act_window,name:project_risk.project_risk_action +#: model:ir.ui.menu,name:project_risk.project_risk_menu +#: model_terms:ir.ui.view,arch_db:project_risk.edit_project +#: model_terms:ir.ui.view,arch_db:project_risk.project_completion_kanban +msgid "Risks" +msgstr "Riesgos" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: project_risk +#: selection:project.risk,impact:0 +msgid "Significant" +msgstr "Significativo" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__state +msgid "State" +msgstr "Estado" + +#. module: project_risk +#: selection:project.risk,impact:0 selection:project.risk,rating:0 +msgid "Trivial" +msgstr "Trivial" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Unlikely" +msgstr "Improbable" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_unread +msgid "Unread Messages" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_unread_counter +msgid "Unread Messages Counter" +msgstr "" + +#. module: project_risk +#: selection:project.risk,proximity:0 selection:project.risk,rating:0 +msgid "Very High" +msgstr "Muy Alta" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "Very Low" +msgstr "Muy Baja" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Very likely" +msgstr "Muy probable" + +#. module: project_risk +#: selection:project.risk,proximity:0 +msgid "Very low" +msgstr "Muy baja" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_project +msgid "WBS element" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__website_message_ids +msgid "Website communication history" +msgstr "" + +#~ msgid "project.risk.category" +#~ msgstr "project.risk.category" + +#~ msgid "project.risk.response" +#~ msgstr "project.risk.response" + +#~ msgid "project.risk.response.category" +#~ msgstr "project.risk.response.category" diff --git a/project_risk/i18n/project_risk.pot b/project_risk/i18n/project_risk.pot index 64fef7b754..defda3e5b2 100644 --- a/project_risk/i18n/project_risk.pot +++ b/project_risk/i18n/project_risk.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 11.0\n" +"Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: <>\n" "Language-Team: \n" @@ -14,18 +14,28 @@ msgstr "" "Plural-Forms: \n" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_actionee_id +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__actionee_id msgid "Actionee" msgstr "" #. module: project_risk -#: model:ir.ui.view,arch_db:project_risk.project_risk_search_view +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_search_view #: selection:project.risk,state:0 msgid "Active" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_project_risk_category_id +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__project_risk_category_id msgid "Category" msgstr "" @@ -35,18 +45,18 @@ msgid "Closed" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_category_create_uid -#: model:ir.model.fields,field_description:project_risk.field_project_risk_create_uid -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category_create_uid -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_create_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk__create_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__create_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__create_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__create_uid msgid "Created by" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_category_create_date -#: model:ir.model.fields,field_description:project_risk.field_project_risk_create_date -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category_create_date -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_create_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk__create_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__create_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__create_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__create_date msgid "Created on" msgstr "" @@ -56,17 +66,17 @@ msgid "Critical" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_description -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_description -#: model:ir.ui.view,arch_db:project_risk.project_risk_form_view +#: model:ir.model.fields,field_description:project_risk.field_project_risk__description +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__description +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_form_view msgid "Description" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_category_display_name -#: model:ir.model.fields,field_description:project_risk.field_project_risk_display_name -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category_display_name -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_display_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk__display_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__display_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__display_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__display_name msgid "Display Name" msgstr "" @@ -81,7 +91,22 @@ msgid "Extreme" msgstr "" #. module: project_risk -#: model:ir.ui.view,arch_db:project_risk.project_risk_search_view +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_channel_ids +msgid "Followers (Channels)" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: project_risk +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_search_view msgid "Group By..." msgstr "" @@ -92,44 +117,64 @@ msgid "High" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_category_id -#: model:ir.model.fields,field_description:project_risk.field_project_risk_id -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category_id -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_id +#: model:ir.model.fields,field_description:project_risk.field_project_risk__id +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__id +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__id +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__id msgid "ID" msgstr "" +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_unread +msgid "If checked new messages require your attention." +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + #. module: project_risk #: selection:project.risk,proximity:0 msgid "Imminent" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_impact +#: model:ir.model.fields,field_description:project_risk.field_project_risk__impact msgid "Impact" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk___last_update -#: model:ir.model.fields,field_description:project_risk.field_project_risk_category___last_update -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response___last_update -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category___last_update +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk____last_update +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category____last_update +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response____last_update +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category____last_update msgid "Last Modified on" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_category_write_uid -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category_write_uid -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_write_uid -#: model:ir.model.fields,field_description:project_risk.field_project_risk_write_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk__write_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__write_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__write_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__write_uid msgid "Last Updated by" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_category_write_date -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category_write_date -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_write_date -#: model:ir.model.fields,field_description:project_risk.field_project_risk_write_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk__write_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__write_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__write_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__write_date msgid "Last Updated on" msgstr "" @@ -149,6 +194,11 @@ msgstr "" msgid "Low-Medium" msgstr "" +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_main_attachment_id +msgid "Main Attachment" +msgstr "" + #. module: project_risk #: selection:project.risk,proximity:0 #: selection:project.risk,rating:0 @@ -160,6 +210,16 @@ msgstr "" msgid "Medium-High" msgstr "" +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_ids +msgid "Messages" +msgstr "" + #. module: project_risk #: selection:project.risk,impact:0 msgid "Minor" @@ -176,14 +236,39 @@ msgid "N/A" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_category_name -#: model:ir.model.fields,field_description:project_risk.field_project_risk_name -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk__name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__name msgid "Name" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_owner_id +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_has_error_counter +msgid "Number of error" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_needaction_counter +msgid "Number of messages which requires an action" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_unread_counter +msgid "Number of unread messages" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__owner_id msgid "Owner" msgstr "" @@ -193,31 +278,45 @@ msgid "Possible" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_probability +#: model:ir.model.fields,field_description:project_risk.field_project_risk__probability msgid "Probability" msgstr "" #. module: project_risk -#: model:ir.model,name:project_risk.model_project_project -#: model:ir.model.fields,field_description:project_risk.field_project_risk_project_id -#: model:ir.ui.view,arch_db:project_risk.project_risk_search_view +#: model:ir.model.fields,field_description:project_risk.field_project_risk__project_id +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_search_view msgid "Project" msgstr "" #. module: project_risk #: model:ir.model,name:project_risk.model_project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_project_project_risk_ids -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_project_risk_id +#: model:ir.model.fields,field_description:project_risk.field_project_project__project_risk_ids +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__project_risk_id msgid "Project Risk" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_project_project_risk_count +#: model:ir.model.fields,field_description:project_risk.field_project_project__project_risk_count msgid "Project Risk Count" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_proximity +#: model:ir.model,name:project_risk.model_project_risk_category +msgid "Project Risks Categories" +msgstr "" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk_response +msgid "Project Risks Responses" +msgstr "" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk_response_category +msgid "Project Risks Responses Categories" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__proximity msgid "Proximity" msgstr "" @@ -227,18 +326,18 @@ msgid "Rare" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_rating +#: model:ir.model.fields,field_description:project_risk.field_project_risk__rating msgid "Rating" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_project_risk_response_ids -#: model:ir.ui.view,arch_db:project_risk.project_risk_form_view +#: model:ir.model.fields,field_description:project_risk.field_project_risk__project_risk_response_ids +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_form_view msgid "Response" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_project_risk_response_category_id +#: model:ir.model.fields,field_description:project_risk.field_project_risk__project_risk_response_category_id msgid "Response Category" msgstr "" @@ -257,13 +356,13 @@ msgstr "" #. module: project_risk #: model:ir.actions.act_window,name:project_risk.project_risk_action #: model:ir.ui.menu,name:project_risk.project_risk_menu -#: model:ir.ui.view,arch_db:project_risk.edit_project -#: model:ir.ui.view,arch_db:project_risk.project_completion_kanban +#: model_terms:ir.ui.view,arch_db:project_risk.edit_project +#: model_terms:ir.ui.view,arch_db:project_risk.project_completion_kanban msgid "Risks" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_sequence +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__sequence msgid "Sequence" msgstr "" @@ -273,7 +372,7 @@ msgid "Significant" msgstr "" #. module: project_risk -#: model:ir.model.fields,field_description:project_risk.field_project_risk_state +#: model:ir.model.fields,field_description:project_risk.field_project_risk__state msgid "State" msgstr "" @@ -288,6 +387,16 @@ msgstr "" msgid "Unlikely" msgstr "" +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_unread +msgid "Unread Messages" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_unread_counter +msgid "Unread Messages Counter" +msgstr "" + #. module: project_risk #: selection:project.risk,proximity:0 #: selection:project.risk,rating:0 @@ -310,17 +419,17 @@ msgid "Very low" msgstr "" #. module: project_risk -#: model:ir.model,name:project_risk.model_project_risk_category -msgid "project.risk.category" +#: model:ir.model,name:project_risk.model_project_project +msgid "WBS element" msgstr "" #. module: project_risk -#: model:ir.model,name:project_risk.model_project_risk_response -msgid "project.risk.response" +#: model:ir.model.fields,field_description:project_risk.field_project_risk__website_message_ids +msgid "Website Messages" msgstr "" #. module: project_risk -#: model:ir.model,name:project_risk.model_project_risk_response_category -msgid "project.risk.response.category" +#: model:ir.model.fields,help:project_risk.field_project_risk__website_message_ids +msgid "Website communication history" msgstr "" diff --git a/project_risk/models/project_project.py b/project_risk/models/project_project.py index 6f0bb87449..7b77eb1ba2 100644 --- a/project_risk/models/project_project.py +++ b/project_risk/models/project_project.py @@ -1,7 +1,8 @@ # Copyright 2019 Onestein +# Copyright 2020 Manuel Calero - Tecnativa # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import models, fields, api +from odoo import models, fields class Project(models.Model): @@ -16,12 +17,10 @@ class Project(models.Model): compute='_compute_risk_count' ) - @api.multi def _compute_risk_count(self): for project in self: project.project_risk_count = len(project.project_risk_ids) - @api.multi def view_risk(self): self.ensure_one() action = self.env.ref('project_risk.project_risk_action') diff --git a/project_risk/models/project_risk.py b/project_risk/models/project_risk.py index 397d20bc29..a526ce32a7 100644 --- a/project_risk/models/project_risk.py +++ b/project_risk/models/project_risk.py @@ -1,4 +1,5 @@ # Copyright 2019 Onestein +# Copyright 2020 Manuel Calero - Tecnativa # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). from odoo import models, fields, api @@ -119,25 +120,7 @@ class ProjectRisk(models.Model): inverse_name='project_risk_id' ) - @api.multi @api.depends('probability', 'impact') def _compute_rating(self): for risk in self: risk.rating = risk.probability + risk.impact - - @api.multi - def write(self, vals): - res = super(ProjectRisk, self).write(vals) - if vals.get("actionee_id"): - self.message_subscribe_users(user_ids=[vals.get("actionee_id")]) - if vals.get("owner_id"): - self.message_subscribe_users(user_ids=[vals.get("owner_id")]) - return res - - @api.model - def create(self, vals): - res = super(ProjectRisk, self).create(vals) - res.message_subscribe_users(user_ids=[ - res.owner_id.id, res.actionee_id.id - ]) - return res diff --git a/project_risk/models/project_risk_category.py b/project_risk/models/project_risk_category.py index 2ce4734b12..512d536bba 100644 --- a/project_risk/models/project_risk_category.py +++ b/project_risk/models/project_risk_category.py @@ -6,5 +6,6 @@ class ProjectRiskCategory(models.Model): _name = 'project.risk.category' + _description = 'Project Risks Categories' name = fields.Char(required=True) diff --git a/project_risk/models/project_risk_response.py b/project_risk/models/project_risk_response.py index 3ad4279a87..083e9be3e0 100644 --- a/project_risk/models/project_risk_response.py +++ b/project_risk/models/project_risk_response.py @@ -6,6 +6,7 @@ class ProjectRiskResponse(models.Model): _name = 'project.risk.response' + _description = 'Project Risks Responses' project_risk_id = fields.Many2one( comodel_name='project.risk.response' diff --git a/project_risk/models/project_risk_response_category.py b/project_risk/models/project_risk_response_category.py index 6ad15c2c4e..2a1639e3d2 100644 --- a/project_risk/models/project_risk_response_category.py +++ b/project_risk/models/project_risk_response_category.py @@ -6,5 +6,6 @@ class ProjectRiskResponseCategory(models.Model): _name = 'project.risk.response.category' + _description = 'Project Risks Responses Categories' name = fields.Char(required=True) diff --git a/project_risk/readme/CONTRIBUTORS.rst b/project_risk/readme/CONTRIBUTORS.rst index 47b6403d06..cd2521a728 100644 --- a/project_risk/readme/CONTRIBUTORS.rst +++ b/project_risk/readme/CONTRIBUTORS.rst @@ -1 +1,2 @@ * Dennis Sluijk +* Manuel Calero - Tecnativa diff --git a/project_risk/static/description/index.html b/project_risk/static/description/index.html index 1b32792552..e5fdda41ec 100644 --- a/project_risk/static/description/index.html +++ b/project_risk/static/description/index.html @@ -367,7 +367,7 @@

Project Risk

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/project Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 OCA/project Translate me on Weblate Try me on Runbot

With this module you can manage your projects risk using the MOR method.

https://www.axelos.com/best-practice-solutions/mor/what-is-mor

Table of contents

@@ -400,7 +400,7 @@

Usage

  • the rating is automatically calculated based on this risk matrix:
    -
    Risk matrix +
    Risk matrix
  • @@ -423,7 +423,7 @@

    Bug Tracker

    Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

    +feedback.

    Do not contact contributors directly about support or help with technical issues.

    @@ -438,6 +438,7 @@

    Authors

    Contributors

    @@ -447,7 +448,7 @@

    Maintainers

    OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

    -

    This module is part of the OCA/project project on GitHub.

    +

    This module is part of the OCA/project project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    diff --git a/project_risk/tests/test_project_risk.py b/project_risk/tests/test_project_risk.py index 271d4c8ab3..1ff8279253 100644 --- a/project_risk/tests/test_project_risk.py +++ b/project_risk/tests/test_project_risk.py @@ -4,10 +4,13 @@ class TestProjectRisk(TransactionCase): def setUp(self): super().setUp() - self.project = self.env.ref('project.project_project_5') - self.risk_category = self.env.ref( - 'project_risk.project_risk_category_quality' - ) + self.project = self.env['project.project'].create({ + 'name': "Research & Development", + "privacy_visibility": "followers", + }) + self.risk_category = self.env["project.risk.category"].create({ + "name": "Quality" + }) self.risk = self.env['project.risk'].create({ 'name': 'Risk X', 'project_id': self.project.id, diff --git a/project_risk/menuitems.xml b/project_risk/views/menuitems.xml similarity index 100% rename from project_risk/menuitems.xml rename to project_risk/views/menuitems.xml From de2d054effd09c252b42a209edd835a14a9df9b2 Mon Sep 17 00:00:00 2001 From: Matjaz Mozetic Date: Tue, 24 Mar 2020 11:13:23 +0000 Subject: [PATCH 03/21] Added translation using Weblate (Slovenian) --- project_risk/i18n/sl.po | 440 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 440 insertions(+) create mode 100644 project_risk/i18n/sl.po diff --git a/project_risk/i18n/sl.po b/project_risk/i18n/sl.po new file mode 100644 index 0000000000..9424476cdf --- /dev/null +++ b/project_risk/i18n/sl.po @@ -0,0 +1,440 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_risk +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-05-17 11:19+0000\n" +"Last-Translator: Matjaz Mozetic \n" +"Language-Team: none\n" +"Language: sl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " +"n%100==4 ? 2 : 3;\n" +"X-Generator: Weblate 3.10\n" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_needaction +msgid "Action Needed" +msgstr "Potrebno je ukrepanje" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__actionee_id +msgid "Actionee" +msgstr "Zadolženi" + +#. module: project_risk +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_search_view +#: selection:project.risk,state:0 +msgid "Active" +msgstr "Aktivno" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_attachment_count +msgid "Attachment Count" +msgstr "Št. priponk" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__project_risk_category_id +msgid "Category" +msgstr "Kategorija" + +#. module: project_risk +#: selection:project.risk,state:0 +msgid "Closed" +msgstr "Zaključeno" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__create_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__create_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__create_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__create_uid +msgid "Created by" +msgstr "Ustvaril" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__create_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__create_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__create_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__create_date +msgid "Created on" +msgstr "Ustvarjeno" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "Critical" +msgstr "Kritično" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__description +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__description +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_form_view +msgid "Description" +msgstr "Opis" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__display_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__display_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__display_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__display_name +msgid "Display Name" +msgstr "Prikazani naziv" + +#. module: project_risk +#: selection:project.risk,state:0 +msgid "Draft" +msgstr "Osnutek" + +#. module: project_risk +#: selection:project.risk,impact:0 +msgid "Extreme" +msgstr "Ekstremno" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_follower_ids +msgid "Followers" +msgstr "Sledilci" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_channel_ids +msgid "Followers (Channels)" +msgstr "Sledilci (kanali)" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_partner_ids +msgid "Followers (Partners)" +msgstr "Sledilci (partnerji)" + +#. module: project_risk +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_search_view +msgid "Group By..." +msgstr "Združi po..." + +#. module: project_risk +#: selection:project.risk,proximity:0 +#: selection:project.risk,rating:0 +msgid "High" +msgstr "Visoka" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__id +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__id +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__id +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__id +msgid "ID" +msgstr "ID" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_unread +msgid "If checked new messages require your attention." +msgstr "Če označeno pomeni, da nova sporočila zahtevajo vašo pozornost." + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Če označeno pomeni, da nova sporočila zahtevajo vašo pozornost." + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" +"Če označeno pomeni, da je pri nekaterih sporočilih prišlo do napake pri " +"dostavi." + +#. module: project_risk +#: selection:project.risk,proximity:0 +msgid "Imminent" +msgstr "Neizogibno" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__impact +msgid "Impact" +msgstr "Vpliv" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_is_follower +msgid "Is Follower" +msgstr "Je sledilec" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk____last_update +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category____last_update +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response____last_update +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category____last_update +msgid "Last Modified on" +msgstr "Zadnjič spremenjeno" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__write_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__write_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__write_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__write_uid +msgid "Last Updated by" +msgstr "Zadnji posodobil" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__write_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__write_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__write_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__write_date +msgid "Last Updated on" +msgstr "Zadnjič posodobljeno" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Likely" +msgstr "Verjetno" + +#. module: project_risk +#: selection:project.risk,proximity:0 +#: selection:project.risk,rating:0 +msgid "Low" +msgstr "Nizka" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "Low-Medium" +msgstr "Nizko-srednje" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_main_attachment_id +msgid "Main Attachment" +msgstr "Glavna priponka" + +#. module: project_risk +#: selection:project.risk,proximity:0 +#: selection:project.risk,rating:0 +msgid "Medium" +msgstr "Srednje" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "Medium-High" +msgstr "Srednje-visoko" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_has_error +msgid "Message Delivery error" +msgstr "Napaka ob dostavi sporočila" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_ids +msgid "Messages" +msgstr "Sporočila" + +#. module: project_risk +#: selection:project.risk,impact:0 +msgid "Minor" +msgstr "Majhno" + +#. module: project_risk +#: selection:project.risk,impact:0 +msgid "Moderate" +msgstr "Zmerno" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "N/A" +msgstr "N/A" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__name +msgid "Name" +msgstr "Naziv" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_needaction_counter +msgid "Number of Actions" +msgstr "Število ukrepov" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_has_error_counter +msgid "Number of error" +msgstr "Število napak" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_needaction_counter +msgid "Number of messages which requires an action" +msgstr "Število sporočil, ki potrebujejo ukrepanje" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Število sporočil z napako ob dostavi" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_unread_counter +msgid "Number of unread messages" +msgstr "Število neprebranih sporočil" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__owner_id +msgid "Owner" +msgstr "Lastnik" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Possible" +msgstr "Mogoče" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__probability +msgid "Probability" +msgstr "Verjetnost" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__project_id +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_search_view +msgid "Project" +msgstr "Projekt" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_project__project_risk_ids +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__project_risk_id +msgid "Project Risk" +msgstr "Projektno tveganje" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_project__project_risk_count +msgid "Project Risk Count" +msgstr "Število proj. tveganj" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk_category +msgid "Project Risks Categories" +msgstr "Kategorije proj. tveganj" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk_response +msgid "Project Risks Responses" +msgstr "Odzivi na proj. tveganja" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk_response_category +msgid "Project Risks Responses Categories" +msgstr "Kategorije odzivov na proj. tveganja" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__proximity +msgid "Proximity" +msgstr "Bližina" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Rare" +msgstr "Redko" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__rating +msgid "Rating" +msgstr "Ocena" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__project_risk_response_ids +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_form_view +msgid "Response" +msgstr "Odziv" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__project_risk_response_category_id +msgid "Response Category" +msgstr "Kategorija odziva" + +#. module: project_risk +#: model:ir.actions.act_window,name:project_risk.project_risk_category_action +#: model:ir.ui.menu,name:project_risk.project_risk_category_menu +msgid "Risk Categories" +msgstr "Kategorije tveganj" + +#. module: project_risk +#: model:ir.actions.act_window,name:project_risk.project_risk_response_category_action +#: model:ir.ui.menu,name:project_risk.project_risk_response_category_menu +msgid "Risk Response Categories" +msgstr "Kategorije odzivov na tveganje" + +#. module: project_risk +#: model:ir.actions.act_window,name:project_risk.project_risk_action +#: model:ir.ui.menu,name:project_risk.project_risk_menu +#: model_terms:ir.ui.view,arch_db:project_risk.edit_project +#: model_terms:ir.ui.view,arch_db:project_risk.project_completion_kanban +msgid "Risks" +msgstr "Tveganja" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__sequence +msgid "Sequence" +msgstr "Zaporedje" + +#. module: project_risk +#: selection:project.risk,impact:0 +msgid "Significant" +msgstr "Znatno" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__state +msgid "State" +msgstr "Stanje" + +#. module: project_risk +#: selection:project.risk,impact:0 +#: selection:project.risk,rating:0 +msgid "Trivial" +msgstr "Trivialno" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Unlikely" +msgstr "Malo verjetno" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_unread +msgid "Unread Messages" +msgstr "Neprebrana sporočila" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_unread_counter +msgid "Unread Messages Counter" +msgstr "Št. neprebranih sporočil" + +#. module: project_risk +#: selection:project.risk,proximity:0 +#: selection:project.risk,rating:0 +msgid "Very High" +msgstr "Zelo visoka" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "Very Low" +msgstr "Zelo nizko" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Very likely" +msgstr "Precej verjetno" + +#. module: project_risk +#: selection:project.risk,proximity:0 +msgid "Very low" +msgstr "Zelo nizko" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_project +msgid "WBS element" +msgstr "Projektni člen" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__website_message_ids +msgid "Website Messages" +msgstr "Spletna sporočila" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__website_message_ids +msgid "Website communication history" +msgstr "Spletna kronologija komunikacij" From d3d9754f3198bf299a7b6840e9ecd61692f5742b Mon Sep 17 00:00:00 2001 From: Sergio Zanchetta Date: Sat, 30 May 2020 12:06:10 +0000 Subject: [PATCH 04/21] Added translation using Weblate (Italian) --- project_risk/i18n/it.po | 437 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 437 insertions(+) create mode 100644 project_risk/i18n/it.po diff --git a/project_risk/i18n/it.po b/project_risk/i18n/it.po new file mode 100644 index 0000000000..d100998c61 --- /dev/null +++ b/project_risk/i18n/it.po @@ -0,0 +1,437 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_risk +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-06-01 00:19+0000\n" +"Last-Translator: Sergio Zanchetta \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.10\n" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_needaction +msgid "Action Needed" +msgstr "Azione richiesta" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__actionee_id +msgid "Actionee" +msgstr "Esecutore" + +#. module: project_risk +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_search_view +#: selection:project.risk,state:0 +msgid "Active" +msgstr "Attivo" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_attachment_count +msgid "Attachment Count" +msgstr "Numero allegati" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__project_risk_category_id +msgid "Category" +msgstr "Categoria" + +#. module: project_risk +#: selection:project.risk,state:0 +msgid "Closed" +msgstr "Chiuso" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__create_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__create_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__create_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__create_uid +msgid "Created by" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__create_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__create_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__create_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__create_date +msgid "Created on" +msgstr "" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "Critical" +msgstr "Critica" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__description +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__description +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_form_view +msgid "Description" +msgstr "Descrizione" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__display_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__display_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__display_name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: project_risk +#: selection:project.risk,state:0 +msgid "Draft" +msgstr "Bozza" + +#. module: project_risk +#: selection:project.risk,impact:0 +msgid "Extreme" +msgstr "Estremo" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_channel_ids +msgid "Followers (Channels)" +msgstr "Chi sta seguendo (canali)" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_partner_ids +msgid "Followers (Partners)" +msgstr "Chi sta seguendo (partner)" + +#. module: project_risk +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_search_view +msgid "Group By..." +msgstr "Raggruppa per..." + +#. module: project_risk +#: selection:project.risk,proximity:0 +#: selection:project.risk,rating:0 +msgid "High" +msgstr "Alta" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__id +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__id +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__id +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__id +msgid "ID" +msgstr "ID" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_unread +msgid "If checked new messages require your attention." +msgstr "Se selezionato, nuovi messaggi richiedono attenzione." + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Se selezionato, nuovi messaggi richiedono attenzione." + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Se selezionato, alcuni messaggi presentano un errore di consegna." + +#. module: project_risk +#: selection:project.risk,proximity:0 +msgid "Imminent" +msgstr "Imminente" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__impact +msgid "Impact" +msgstr "Impatto" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_is_follower +msgid "Is Follower" +msgstr "Sta seguendo" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk____last_update +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category____last_update +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response____last_update +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__write_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__write_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__write_uid +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__write_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__write_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__write_date +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Likely" +msgstr "Probabile" + +#. module: project_risk +#: selection:project.risk,proximity:0 +#: selection:project.risk,rating:0 +msgid "Low" +msgstr "Bassa" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "Low-Medium" +msgstr "Medio-bassa" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_main_attachment_id +msgid "Main Attachment" +msgstr "Allegato principale" + +#. module: project_risk +#: selection:project.risk,proximity:0 +#: selection:project.risk,rating:0 +msgid "Medium" +msgstr "Media" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "Medium-High" +msgstr "Medio-alta" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_has_error +msgid "Message Delivery error" +msgstr "Errore di consegna messaggio" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_ids +msgid "Messages" +msgstr "Messaggi" + +#. module: project_risk +#: selection:project.risk,impact:0 +msgid "Minor" +msgstr "Minore" + +#. module: project_risk +#: selection:project.risk,impact:0 +msgid "Moderate" +msgstr "Moderato" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "N/A" +msgstr "N/D" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_category__name +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response_category__name +msgid "Name" +msgstr "Nome" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_needaction_counter +msgid "Number of Actions" +msgstr "Numero di azioni" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_has_error_counter +msgid "Number of error" +msgstr "Numero di errori" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_needaction_counter +msgid "Number of messages which requires an action" +msgstr "Numero di messaggi che richiedono un'azione" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Numero di messaggi con errore di consegna" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__message_unread_counter +msgid "Number of unread messages" +msgstr "Numero di messaggi non letti" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__owner_id +msgid "Owner" +msgstr "Proprietario" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Possible" +msgstr "Possibile" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__probability +msgid "Probability" +msgstr "Probabilità" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__project_id +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_search_view +msgid "Project" +msgstr "Project" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_project__project_risk_ids +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__project_risk_id +msgid "Project Risk" +msgstr "Rischio di progetto" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_project__project_risk_count +msgid "Project Risk Count" +msgstr "Numero rischi di progetto" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk_category +msgid "Project Risks Categories" +msgstr "Categorie rischi di progetto" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk_response +msgid "Project Risks Responses" +msgstr "" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_risk_response_category +msgid "Project Risks Responses Categories" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__proximity +msgid "Proximity" +msgstr "Prossimità" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Rare" +msgstr "Raro" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__rating +msgid "Rating" +msgstr "Valutazione" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__project_risk_response_ids +#: model_terms:ir.ui.view,arch_db:project_risk.project_risk_form_view +msgid "Response" +msgstr "" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__project_risk_response_category_id +msgid "Response Category" +msgstr "" + +#. module: project_risk +#: model:ir.actions.act_window,name:project_risk.project_risk_category_action +#: model:ir.ui.menu,name:project_risk.project_risk_category_menu +msgid "Risk Categories" +msgstr "Categorie di rischio" + +#. module: project_risk +#: model:ir.actions.act_window,name:project_risk.project_risk_response_category_action +#: model:ir.ui.menu,name:project_risk.project_risk_response_category_menu +msgid "Risk Response Categories" +msgstr "" + +#. module: project_risk +#: model:ir.actions.act_window,name:project_risk.project_risk_action +#: model:ir.ui.menu,name:project_risk.project_risk_menu +#: model_terms:ir.ui.view,arch_db:project_risk.edit_project +#: model_terms:ir.ui.view,arch_db:project_risk.project_completion_kanban +msgid "Risks" +msgstr "Rischi" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk_response__sequence +msgid "Sequence" +msgstr "Sequenza" + +#. module: project_risk +#: selection:project.risk,impact:0 +msgid "Significant" +msgstr "Significativo" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__state +msgid "State" +msgstr "Stato" + +#. module: project_risk +#: selection:project.risk,impact:0 +#: selection:project.risk,rating:0 +msgid "Trivial" +msgstr "Irrilevante" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Unlikely" +msgstr "Improbabile" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_unread +msgid "Unread Messages" +msgstr "Messaggi non letti" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__message_unread_counter +msgid "Unread Messages Counter" +msgstr "Numero messaggi non letti" + +#. module: project_risk +#: selection:project.risk,proximity:0 +#: selection:project.risk,rating:0 +msgid "Very High" +msgstr "Molto alta" + +#. module: project_risk +#: selection:project.risk,rating:0 +msgid "Very Low" +msgstr "Molto bassa" + +#. module: project_risk +#: selection:project.risk,probability:0 +msgid "Very likely" +msgstr "Molto probabile" + +#. module: project_risk +#: selection:project.risk,proximity:0 +msgid "Very low" +msgstr "Molto bassa" + +#. module: project_risk +#: model:ir.model,name:project_risk.model_project_project +msgid "WBS element" +msgstr "Elemento WBS" + +#. module: project_risk +#: model:ir.model.fields,field_description:project_risk.field_project_risk__website_message_ids +msgid "Website Messages" +msgstr "Messaggi sito web" + +#. module: project_risk +#: model:ir.model.fields,help:project_risk.field_project_risk__website_message_ids +msgid "Website communication history" +msgstr "Cronologia comunicazioni sito web" From 3bea20d2f028107cc81f08fd5e818d3bcc08ae63 Mon Sep 17 00:00:00 2001 From: Ernesto Tejeda Date: Thu, 18 Mar 2021 19:30:25 -0400 Subject: [PATCH 05/21] [IMP] project_risk: black, isort, prettier --- project_risk/__manifest__.py | 38 +++--- .../data/project_risk_category_data.xml | 6 +- .../project_risk_response_category_data.xml | 38 ++++-- project_risk/models/project_project.py | 21 ++-- project_risk/models/project_risk.py | 116 ++++++------------ project_risk/models/project_risk_category.py | 6 +- project_risk/models/project_risk_response.py | 10 +- .../models/project_risk_response_category.py | 6 +- project_risk/security/ir_model_access.xml | 107 ++++++++-------- project_risk/tests/test_project_risk.py | 44 +++---- project_risk/views/menuitems.xml | 23 ++-- project_risk/views/project_project_view.xml | 20 +-- .../views/project_risk_category_view.xml | 9 +- .../project_risk_response_category_view.xml | 9 +- project_risk/views/project_risk_view.xml | 92 ++++++++------ 15 files changed, 252 insertions(+), 293 deletions(-) diff --git a/project_risk/__manifest__.py b/project_risk/__manifest__.py index c289faf02a..fedc62c7dc 100644 --- a/project_risk/__manifest__.py +++ b/project_risk/__manifest__.py @@ -1,23 +1,21 @@ { - 'name': 'Project Risk', - 'summary': 'MOR risk management method', - 'author': 'Onestein, Odoo Community Association (OCA)', - 'license': 'AGPL-3', - 'website': 'https://github.com/OCA/project', - 'category': 'Project Management', - 'version': '12.0.1.0.0', - 'depends': [ - 'project' + "name": "Project Risk", + "summary": "MOR risk management method", + "author": "Onestein, Odoo Community Association (OCA)", + "license": "AGPL-3", + "website": "https://github.com/OCA/project", + "category": "Project Management", + "version": "12.0.1.0.0", + "depends": ["project"], + "data": [ + "security/ir_model_access.xml", + "data/project_risk_response_category_data.xml", + "data/project_risk_category_data.xml", + "views/project_risk_response_category_view.xml", + "views/project_risk_category_view.xml", + "views/project_risk_view.xml", + "views/project_project_view.xml", + "views/menuitems.xml", ], - 'data': [ - 'security/ir_model_access.xml', - 'data/project_risk_response_category_data.xml', - 'data/project_risk_category_data.xml', - 'views/project_risk_response_category_view.xml', - 'views/project_risk_category_view.xml', - 'views/project_risk_view.xml', - 'views/project_project_view.xml', - 'views/menuitems.xml', - ], - 'installable': True, + "installable": True, } diff --git a/project_risk/data/project_risk_category_data.xml b/project_risk/data/project_risk_category_data.xml index b62d8fafcc..76abce7fe3 100644 --- a/project_risk/data/project_risk_category_data.xml +++ b/project_risk/data/project_risk_category_data.xml @@ -1,20 +1,16 @@ - + - Quality - Network - Legal - Supplier diff --git a/project_risk/data/project_risk_response_category_data.xml b/project_risk/data/project_risk_response_category_data.xml index a91cf4a092..028aca4534 100644 --- a/project_risk/data/project_risk_response_category_data.xml +++ b/project_risk/data/project_risk_response_category_data.xml @@ -1,29 +1,41 @@ - + - - + Avoid - - + Reduce - - + Fall back - - + Transfer - - + Accept - - + Share diff --git a/project_risk/models/project_project.py b/project_risk/models/project_project.py index 7b77eb1ba2..5950bf017f 100644 --- a/project_risk/models/project_project.py +++ b/project_risk/models/project_project.py @@ -2,20 +2,17 @@ # Copyright 2020 Manuel Calero - Tecnativa # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import models, fields +from odoo import fields, models class Project(models.Model): - _inherit = 'project.project' + _inherit = "project.project" project_risk_ids = fields.One2many( - comodel_name='project.risk', - inverse_name='project_id' + comodel_name="project.risk", inverse_name="project_id" ) - project_risk_count = fields.Integer( - compute='_compute_risk_count' - ) + project_risk_count = fields.Integer(compute="_compute_risk_count") def _compute_risk_count(self): for project in self: @@ -23,12 +20,8 @@ def _compute_risk_count(self): def view_risk(self): self.ensure_one() - action = self.env.ref('project_risk.project_risk_action') + action = self.env.ref("project_risk.project_risk_action") action = action.read()[0] - action['context'] = { - 'default_project_id': self.id - } - action['domain'] = [ - ('project_id', '=', self.id) - ] + action["context"] = {"default_project_id": self.id} + action["domain"] = [("project_id", "=", self.id)] return action diff --git a/project_risk/models/project_risk.py b/project_risk/models/project_risk.py index a526ce32a7..e0adcd8056 100644 --- a/project_risk/models/project_risk.py +++ b/project_risk/models/project_risk.py @@ -2,125 +2,89 @@ # Copyright 2020 Manuel Calero - Tecnativa # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import models, fields, api - -PROBABILITY = { - 1: 'Rare', - 2: 'Unlikely', - 3: 'Possible', - 4: 'Likely', - 5: 'Very likely' -} +from odoo import api, fields, models -IMPACT = { - 1: 'Trivial', - 2: 'Minor', - 3: 'Moderate', - 4: 'Significant', - 5: 'Extreme' -} +PROBABILITY = {1: "Rare", 2: "Unlikely", 3: "Possible", 4: "Likely", 5: "Very likely"} + +IMPACT = {1: "Trivial", 2: "Minor", 3: "Moderate", 4: "Significant", 5: "Extreme"} RATING = { - 1: 'N/A', - 2: 'Trivial', - 3: 'Very Low', - 4: 'Low', - 5: 'Low-Medium', - 6: 'Medium', - 7: 'Medium-High', - 8: 'High', - 9: 'Very High', - 10: 'Critical' + 1: "N/A", + 2: "Trivial", + 3: "Very Low", + 4: "Low", + 5: "Low-Medium", + 6: "Medium", + 7: "Medium-High", + 8: "High", + 9: "Very High", + 10: "Critical", } PROXIMITY = { - 1: 'Very low', - 2: 'Low', - 3: 'Medium', - 4: 'High', - 5: 'Very High', - 6: 'Imminent' + 1: "Very low", + 2: "Low", + 3: "Medium", + 4: "High", + 5: "Very High", + 6: "Imminent", } class ProjectRisk(models.Model): - _inherit = ['mail.thread'] - _name = 'project.risk' - _description = 'Project Risk' + _inherit = ["mail.thread"] + _name = "project.risk" + _description = "Project Risk" - project_id = fields.Many2one( - comodel_name='project.project', - required=True - ) + project_id = fields.Many2one(comodel_name="project.project", required=True) project_risk_category_id = fields.Many2one( - string='Category', - comodel_name='project.risk.category', - required=True, + string="Category", comodel_name="project.risk.category", required=True, ) - name = fields.Char( - required=1 - ) + name = fields.Char(required=1) description = fields.Html() probability = fields.Selection( - required=True, - selection=list(PROBABILITY.items()), - track_visibility='onchange' + required=True, selection=list(PROBABILITY.items()), track_visibility="onchange" ) - impact = fields.Selection( - required=True, - selection=list(IMPACT.items()) - ) + impact = fields.Selection(required=True, selection=list(IMPACT.items())) rating = fields.Selection( - compute='_compute_rating', - store=True, - selection=list(RATING.items()) + compute="_compute_rating", store=True, selection=list(RATING.items()) ) proximity = fields.Selection( - selection=list(PROXIMITY.items()), - track_visibility='onchange' + selection=list(PROXIMITY.items()), track_visibility="onchange" ) project_risk_response_category_id = fields.Many2one( - comodel_name='project.risk.response.category', - string='Response Category' + comodel_name="project.risk.response.category", string="Response Category" ) state = fields.Selection( - selection=[ - ('draft', 'Draft'), - ('active', 'Active'), - ('closed', 'Closed') - ], - default='draft', - track_visibility='onchange' + selection=[("draft", "Draft"), ("active", "Active"), ("closed", "Closed")], + default="draft", + track_visibility="onchange", ) owner_id = fields.Many2one( - string='Owner', - comodel_name='res.users', - track_visibility='onchange' + string="Owner", comodel_name="res.users", track_visibility="onchange" ) actionee_id = fields.Many2one( - string='Actionee', - comodel_name='res.users', - track_visibility='onchange' + string="Actionee", comodel_name="res.users", track_visibility="onchange" ) project_risk_response_ids = fields.One2many( - string='Response', - comodel_name='project.risk.response', - inverse_name='project_risk_id' + string="Response", + comodel_name="project.risk.response", + inverse_name="project_risk_id", ) - @api.depends('probability', 'impact') + @api.depends("probability", "impact") def _compute_rating(self): for risk in self: risk.rating = risk.probability + risk.impact diff --git a/project_risk/models/project_risk_category.py b/project_risk/models/project_risk_category.py index 512d536bba..e161019f19 100644 --- a/project_risk/models/project_risk_category.py +++ b/project_risk/models/project_risk_category.py @@ -1,11 +1,11 @@ # Copyright 2019 Onestein # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import models, fields +from odoo import fields, models class ProjectRiskCategory(models.Model): - _name = 'project.risk.category' - _description = 'Project Risks Categories' + _name = "project.risk.category" + _description = "Project Risks Categories" name = fields.Char(required=True) diff --git a/project_risk/models/project_risk_response.py b/project_risk/models/project_risk_response.py index 083e9be3e0..adf3494e3d 100644 --- a/project_risk/models/project_risk_response.py +++ b/project_risk/models/project_risk_response.py @@ -1,16 +1,14 @@ # Copyright 2019 Onestein # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import models, fields +from odoo import fields, models class ProjectRiskResponse(models.Model): - _name = 'project.risk.response' - _description = 'Project Risks Responses' + _name = "project.risk.response" + _description = "Project Risks Responses" - project_risk_id = fields.Many2one( - comodel_name='project.risk.response' - ) + project_risk_id = fields.Many2one(comodel_name="project.risk.response") sequence = fields.Integer() diff --git a/project_risk/models/project_risk_response_category.py b/project_risk/models/project_risk_response_category.py index 2a1639e3d2..11cb82487b 100644 --- a/project_risk/models/project_risk_response_category.py +++ b/project_risk/models/project_risk_response_category.py @@ -1,11 +1,11 @@ # Copyright 2019 Onestein # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import models, fields +from odoo import fields, models class ProjectRiskResponseCategory(models.Model): - _name = 'project.risk.response.category' - _description = 'Project Risks Responses Categories' + _name = "project.risk.response.category" + _description = "Project Risks Responses Categories" name = fields.Char(required=True) diff --git a/project_risk/security/ir_model_access.xml b/project_risk/security/ir_model_access.xml index cb6869a9d5..7acc6258af 100644 --- a/project_risk/security/ir_model_access.xml +++ b/project_risk/security/ir_model_access.xml @@ -1,90 +1,81 @@ - + - - project_risk_user_access - - - - - - + + + + + + - project_risk_manager_access - - - - - - + + + + + + - project_risk_category_user_access - - - - - - + + + + + + - project_risk_category_manager_access - - - - - - + + + + + + - project_risk_response_user_access - - - - - - + + + + + + - project_risk_response_manager_access - - - - - - + + + + + + - project_risk_response_category_user_access - - - - - - + + + + + + - project_risk_response_category_manager_access - - - - - - + + + + + + diff --git a/project_risk/tests/test_project_risk.py b/project_risk/tests/test_project_risk.py index 1ff8279253..fd455e0b0b 100644 --- a/project_risk/tests/test_project_risk.py +++ b/project_risk/tests/test_project_risk.py @@ -4,36 +4,28 @@ class TestProjectRisk(TransactionCase): def setUp(self): super().setUp() - self.project = self.env['project.project'].create({ - 'name': "Research & Development", - "privacy_visibility": "followers", - }) - self.risk_category = self.env["project.risk.category"].create({ - "name": "Quality" - }) - self.risk = self.env['project.risk'].create({ - 'name': 'Risk X', - 'project_id': self.project.id, - 'project_risk_category_id': self.risk_category.id, - 'probability': 2, - 'impact': 2 - }) + self.project = self.env["project.project"].create( + {"name": "Research & Development", "privacy_visibility": "followers",} + ) + self.risk_category = self.env["project.risk.category"].create( + {"name": "Quality"} + ) + self.risk = self.env["project.risk"].create( + { + "name": "Risk X", + "project_id": self.project.id, + "project_risk_category_id": self.risk_category.id, + "probability": 2, + "impact": 2, + } + ) def test_project(self): self.assertEqual(self.project.project_risk_count, 1) action = self.project.view_risk() - self.assertEqual( - action['context']['default_project_id'], - self.project.id - ) - self.assertListEqual( - action['domain'], - [('project_id', '=', self.project.id)] - ) + self.assertEqual(action["context"]["default_project_id"], self.project.id) + self.assertListEqual(action["domain"], [("project_id", "=", self.project.id)]) def test_risk(self): - self.risk.write({ - 'actionee_id': self.env.user.id, - 'owner_id': self.env.user.id - }) + self.risk.write({"actionee_id": self.env.user.id, "owner_id": self.env.user.id}) self.assertEqual(self.risk.rating, 4) diff --git a/project_risk/views/menuitems.xml b/project_risk/views/menuitems.xml index c721e194c3..78dabc2777 100644 --- a/project_risk/views/menuitems.xml +++ b/project_risk/views/menuitems.xml @@ -1,17 +1,20 @@ - + - - - - + - - + + action="project_risk_response_category_action" + /> diff --git a/project_risk/views/project_project_view.xml b/project_risk/views/project_project_view.xml index 004ade430a..5679698055 100644 --- a/project_risk/views/project_project_view.xml +++ b/project_risk/views/project_project_view.xml @@ -1,27 +1,33 @@ - + - edit.project project.project - + - - project.completion.kanban project.project - + - +
    Risks diff --git a/project_risk/views/project_risk_category_view.xml b/project_risk/views/project_risk_category_view.xml index 1b4cdabe7c..e5a0157e72 100644 --- a/project_risk/views/project_risk_category_view.xml +++ b/project_risk/views/project_risk_category_view.xml @@ -1,7 +1,6 @@ - + - project.risk.category @@ -9,22 +8,20 @@
    - +
    - project.risk.category - + - Risk Categories project.risk.category diff --git a/project_risk/views/project_risk_response_category_view.xml b/project_risk/views/project_risk_response_category_view.xml index f4acef14f6..4d93a4ac4e 100644 --- a/project_risk/views/project_risk_response_category_view.xml +++ b/project_risk/views/project_risk_response_category_view.xml @@ -1,7 +1,6 @@ - + - project.risk.response.category @@ -9,22 +8,20 @@
    - +
    - project.risk.response.category - + - Risk Response Categories project.risk.response.category diff --git a/project_risk/views/project_risk_view.xml b/project_risk/views/project_risk_view.xml index 8125e7b8e1..af10dc5c24 100644 --- a/project_risk/views/project_risk_view.xml +++ b/project_risk/views/project_risk_view.xml @@ -1,52 +1,60 @@ - + - project.risk
    - +
    -
    - - - - + + + + - - - - + + + + - + - - + - + - + @@ -54,47 +62,51 @@
    - - + +
    - project.risk - - - - - - + + + + + + - project.risk - - - - - + + + + + - + - Risks project.risk From c58daac186e31402cabeb4820b10bde003027028 Mon Sep 17 00:00:00 2001 From: Ernesto Tejeda Date: Thu, 18 Mar 2021 19:34:56 -0400 Subject: [PATCH 06/21] [MIG] project_risk: Migration to 13.0 --- project_risk/README.rst | 19 ++-- project_risk/__manifest__.py | 2 +- project_risk/models/project_risk.py | 86 +++++++++++-------- project_risk/models/project_risk_response.py | 2 +- project_risk/readme/CONTRIBUTORS.rst | 5 +- project_risk/readme/USAGE.rst | 2 +- project_risk/static/description/index.html | 16 ++-- project_risk/tests/test_project_risk.py | 8 +- project_risk/views/menuitems.xml | 3 +- .../views/project_risk_category_view.xml | 1 - .../project_risk_response_category_view.xml | 1 - project_risk/views/project_risk_view.xml | 69 ++++++++++++++- 12 files changed, 150 insertions(+), 64 deletions(-) diff --git a/project_risk/README.rst b/project_risk/README.rst index 2acd41f020..6564d16cce 100644 --- a/project_risk/README.rst +++ b/project_risk/README.rst @@ -14,13 +14,13 @@ Project Risk :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fproject-lightgray.png?logo=github - :target: https://github.com/OCA/project/tree/12.0/project_risk + :target: https://github.com/OCA/project/tree/13.0/project_risk :alt: OCA/project .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/project-12-0/project-12-0-project_risk + :target: https://translation.odoo-community.org/projects/project-13-0/project-13-0-project_risk :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/140/12.0 + :target: https://runbot.odoo-community.org/runbot/140/13.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -45,10 +45,10 @@ Usage To define risks for your projects: -#. Go to *Project > Search > Risks*; +#. Go to *Project > Risks*; #. create a new risk; #. the rating is automatically calculated based on this risk matrix: - .. image:: https://raw.githubusercontent.com/OCA/project/12.0/project_risk/static/description/matrix.png + .. image:: https://raw.githubusercontent.com/OCA/project/13.0/project_risk/static/description/matrix.png :alt: Risk matrix #. set the state to 'Active' if the risk is in effect; #. set the state to 'Closed' if the risk is processed or e.g. completely avoided. @@ -67,7 +67,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -83,7 +83,10 @@ Contributors ~~~~~~~~~~~~ * Dennis Sluijk -* Manuel Calero - Tecnativa +* `Tecnativa `_: + + * Manuel Calero + * Ernesto Tejeda Maintainers ~~~~~~~~~~~ @@ -98,6 +101,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/project `_ project on GitHub. +This module is part of the `OCA/project `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/project_risk/__manifest__.py b/project_risk/__manifest__.py index fedc62c7dc..bde896b711 100644 --- a/project_risk/__manifest__.py +++ b/project_risk/__manifest__.py @@ -5,7 +5,7 @@ "license": "AGPL-3", "website": "https://github.com/OCA/project", "category": "Project Management", - "version": "12.0.1.0.0", + "version": "13.0.1.0.0", "depends": ["project"], "data": [ "security/ir_model_access.xml", diff --git a/project_risk/models/project_risk.py b/project_risk/models/project_risk.py index e0adcd8056..b60eed452b 100644 --- a/project_risk/models/project_risk.py +++ b/project_risk/models/project_risk.py @@ -4,32 +4,6 @@ from odoo import api, fields, models -PROBABILITY = {1: "Rare", 2: "Unlikely", 3: "Possible", 4: "Likely", 5: "Very likely"} - -IMPACT = {1: "Trivial", 2: "Minor", 3: "Moderate", 4: "Significant", 5: "Extreme"} - -RATING = { - 1: "N/A", - 2: "Trivial", - 3: "Very Low", - 4: "Low", - 5: "Low-Medium", - 6: "Medium", - 7: "Medium-High", - 8: "High", - 9: "Very High", - 10: "Critical", -} - -PROXIMITY = { - 1: "Very low", - 2: "Low", - 3: "Medium", - 4: "High", - 5: "Very High", - 6: "Imminent", -} - class ProjectRisk(models.Model): _inherit = ["mail.thread"] @@ -47,35 +21,71 @@ class ProjectRisk(models.Model): description = fields.Html() probability = fields.Selection( - required=True, selection=list(PROBABILITY.items()), track_visibility="onchange" + required=True, + selection=[ + ("1", "Rare"), + ("2", "Unlikely"), + ("3", "Possible"), + ("4", "Likely"), + ("5", "Very likely"), + ], + tracking=True, ) - impact = fields.Selection(required=True, selection=list(IMPACT.items())) + impact = fields.Selection( + required=True, + selection=[ + ("1", "Trivial"), + ("2", "Minor"), + ("3", "Moderate"), + ("4", "Significant"), + ("5", "Extreme"), + ], + ) rating = fields.Selection( - compute="_compute_rating", store=True, selection=list(RATING.items()) + compute="_compute_rating", + store=True, + selection=[ + ("1", "N/A"), + ("2", "Trivial"), + ("3", "Very Low"), + ("4", "Low"), + ("5", "Low-Medium"), + ("6", "Medium"), + ("7", "Medium-High"), + ("8", "High"), + ("9", "Very High"), + ("10", "Critical"), + ], ) proximity = fields.Selection( - selection=list(PROXIMITY.items()), track_visibility="onchange" + selection=[ + ("1", "Very low"), + ("2", "Low"), + ("3", "Medium"), + ("4", "High"), + ("5", "Very High"), + ("6", "Imminent"), + ], + tracking=True, ) project_risk_response_category_id = fields.Many2one( - comodel_name="project.risk.response.category", string="Response Category" + comodel_name="project.risk.response.category", string="Response Category", ) state = fields.Selection( selection=[("draft", "Draft"), ("active", "Active"), ("closed", "Closed")], default="draft", - track_visibility="onchange", + tracking=True, ) - owner_id = fields.Many2one( - string="Owner", comodel_name="res.users", track_visibility="onchange" - ) + owner_id = fields.Many2one(string="Owner", comodel_name="res.users", tracking=True) actionee_id = fields.Many2one( - string="Actionee", comodel_name="res.users", track_visibility="onchange" + string="Actionee", comodel_name="res.users", tracking=True, ) project_risk_response_ids = fields.One2many( @@ -87,4 +97,6 @@ class ProjectRisk(models.Model): @api.depends("probability", "impact") def _compute_rating(self): for risk in self: - risk.rating = risk.probability + risk.impact + risk.rating = False + if risk.probability and risk.impact: + risk.rating = str(int(risk.probability) + int(risk.impact)) diff --git a/project_risk/models/project_risk_response.py b/project_risk/models/project_risk_response.py index adf3494e3d..77171e7058 100644 --- a/project_risk/models/project_risk_response.py +++ b/project_risk/models/project_risk_response.py @@ -8,7 +8,7 @@ class ProjectRiskResponse(models.Model): _name = "project.risk.response" _description = "Project Risks Responses" - project_risk_id = fields.Many2one(comodel_name="project.risk.response") + project_risk_id = fields.Many2one(comodel_name="project.risk") sequence = fields.Integer() diff --git a/project_risk/readme/CONTRIBUTORS.rst b/project_risk/readme/CONTRIBUTORS.rst index cd2521a728..8c7922c9b1 100644 --- a/project_risk/readme/CONTRIBUTORS.rst +++ b/project_risk/readme/CONTRIBUTORS.rst @@ -1,2 +1,5 @@ * Dennis Sluijk -* Manuel Calero - Tecnativa +* `Tecnativa `_: + + * Manuel Calero + * Ernesto Tejeda diff --git a/project_risk/readme/USAGE.rst b/project_risk/readme/USAGE.rst index de7514a1de..58c423ed8b 100644 --- a/project_risk/readme/USAGE.rst +++ b/project_risk/readme/USAGE.rst @@ -1,6 +1,6 @@ To define risks for your projects: -#. Go to *Project > Search > Risks*; +#. Go to *Project > Risks*; #. create a new risk; #. the rating is automatically calculated based on this risk matrix: .. image:: ../static/description/matrix.png diff --git a/project_risk/static/description/index.html b/project_risk/static/description/index.html index e5fdda41ec..6bddecbeab 100644 --- a/project_risk/static/description/index.html +++ b/project_risk/static/description/index.html @@ -367,7 +367,7 @@

    Project Risk

    !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

    Beta License: AGPL-3 OCA/project Translate me on Weblate Try me on Runbot

    +

    Beta License: AGPL-3 OCA/project Translate me on Weblate Try me on Runbot

    With this module you can manage your projects risk using the MOR method.

    https://www.axelos.com/best-practice-solutions/mor/what-is-mor

    Table of contents

    @@ -394,13 +394,13 @@

    Configuration

    Usage

    To define risks for your projects:

      -
    1. Go to Project > Search > Risks;

      +
    2. Go to Project > Risks;

    3. create a new risk;

    4. the rating is automatically calculated based on this risk matrix:
      -
      Risk matrix +
      Risk matrix
    5. @@ -423,7 +423,7 @@

      Bug Tracker

      Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

      +feedback.

      Do not contact contributors directly about support or help with technical issues.

    @@ -438,7 +438,11 @@

    Authors

    Contributors

    @@ -448,7 +452,7 @@

    Maintainers

    OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

    -

    This module is part of the OCA/project project on GitHub.

    +

    This module is part of the OCA/project project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    diff --git a/project_risk/tests/test_project_risk.py b/project_risk/tests/test_project_risk.py index fd455e0b0b..d277cb3697 100644 --- a/project_risk/tests/test_project_risk.py +++ b/project_risk/tests/test_project_risk.py @@ -5,7 +5,7 @@ class TestProjectRisk(TransactionCase): def setUp(self): super().setUp() self.project = self.env["project.project"].create( - {"name": "Research & Development", "privacy_visibility": "followers",} + {"name": "Research & Development", "privacy_visibility": "followers"} ) self.risk_category = self.env["project.risk.category"].create( {"name": "Quality"} @@ -15,8 +15,8 @@ def setUp(self): "name": "Risk X", "project_id": self.project.id, "project_risk_category_id": self.risk_category.id, - "probability": 2, - "impact": 2, + "probability": "2", + "impact": "2", } ) @@ -28,4 +28,4 @@ def test_project(self): def test_risk(self): self.risk.write({"actionee_id": self.env.user.id, "owner_id": self.env.user.id}) - self.assertEqual(self.risk.rating, 4) + self.assertEqual(self.risk.rating, "4") diff --git a/project_risk/views/menuitems.xml b/project_risk/views/menuitems.xml index 78dabc2777..c78b5dff1d 100644 --- a/project_risk/views/menuitems.xml +++ b/project_risk/views/menuitems.xml @@ -4,7 +4,8 @@ Risk Categories project.risk.category - form
    diff --git a/project_risk/views/project_risk_response_category_view.xml b/project_risk/views/project_risk_response_category_view.xml index 4d93a4ac4e..3b3c930d44 100644 --- a/project_risk/views/project_risk_response_category_view.xml +++ b/project_risk/views/project_risk_response_category_view.xml @@ -25,6 +25,5 @@ Risk Response Categories project.risk.response.category - form
    diff --git a/project_risk/views/project_risk_view.xml b/project_risk/views/project_risk_view.xml index af10dc5c24..b29a30d76b 100644 --- a/project_risk/views/project_risk_view.xml +++ b/project_risk/views/project_risk_view.xml @@ -11,10 +11,76 @@ name="state" widget="statusbar" statusbar_visible="draft,active,closed" - clickable="True" + options="{'clickable': '1'}" /> + + + + + + + + + + +