From 45cc61374000325be35ee9d86199bf35f9a50f96 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Tue, 20 Nov 2018 08:18:08 +0200 Subject: [PATCH 01/45] [12.0][ADD] project_role: role-based project roster --- project_role/README.rst | 84 ++++ project_role/__init__.py | 3 + project_role/__manifest__.py | 28 ++ project_role/i18n/project_role.pot | 350 +++++++++++++++++ project_role/models/__init__.py | 5 + project_role/models/project_assignment.py | 71 ++++ project_role/models/project_project.py | 15 + project_role/models/project_role.py | 61 +++ project_role/readme/CONFIGURE.rst | 6 + project_role/readme/CONTRIBUTORS.rst | 1 + project_role/readme/DESCRIPTION.rst | 2 + project_role/security/ir.model.access.csv | 7 + project_role/security/project_role.xml | 9 + project_role/static/description/index.html | 429 +++++++++++++++++++++ project_role/tests/__init__.py | 3 + project_role/tests/test_project_role.py | 119 ++++++ project_role/views/project_assignment.xml | 125 ++++++ project_role/views/project_project.xml | 30 ++ project_role/views/project_role.xml | 45 +++ project_role/views/res_config_settings.xml | 39 ++ 20 files changed, 1432 insertions(+) create mode 100644 project_role/README.rst create mode 100644 project_role/__init__.py create mode 100644 project_role/__manifest__.py create mode 100644 project_role/i18n/project_role.pot create mode 100644 project_role/models/__init__.py create mode 100644 project_role/models/project_assignment.py create mode 100644 project_role/models/project_project.py create mode 100644 project_role/models/project_role.py create mode 100644 project_role/readme/CONFIGURE.rst create mode 100644 project_role/readme/CONTRIBUTORS.rst create mode 100644 project_role/readme/DESCRIPTION.rst create mode 100644 project_role/security/ir.model.access.csv create mode 100644 project_role/security/project_role.xml create mode 100644 project_role/static/description/index.html create mode 100644 project_role/tests/__init__.py create mode 100644 project_role/tests/test_project_role.py create mode 100644 project_role/views/project_assignment.xml create mode 100644 project_role/views/project_project.xml create mode 100644 project_role/views/project_role.xml create mode 100644 project_role/views/res_config_settings.xml diff --git a/project_role/README.rst b/project_role/README.rst new file mode 100644 index 0000000000..8ca0261a1a --- /dev/null +++ b/project_role/README.rst @@ -0,0 +1,84 @@ +============= +Project Roles +============= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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/12.0/project_role + :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_role + :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 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows maintaining project roster based on roles. List of roles is +configured at company level. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure the list of roles available go to +*Project > Configuration > Project Roles* +and create project roles according to your business processes. + +Project assignments can be configured from project editing screen via +*Assignments* page as well as via *Project > Assignments*. + +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 +~~~~~~~ + +* Brainbean Apps + +Contributors +~~~~~~~~~~~~ + +* Alexey Pelykh + +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_role/__init__.py b/project_role/__init__.py new file mode 100644 index 0000000000..4b76c7b2d5 --- /dev/null +++ b/project_role/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/project_role/__manifest__.py b/project_role/__manifest__.py new file mode 100644 index 0000000000..fda38825e2 --- /dev/null +++ b/project_role/__manifest__.py @@ -0,0 +1,28 @@ +# Copyright 2018 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +{ + 'name': 'Project Roles', + 'version': '12.0.1.0.0', + 'category': 'Project', + 'website': 'https://github.com/OCA/project', + 'author': + 'Brainbean Apps, ' + 'Odoo Community Association (OCA)', + 'license': 'AGPL-3', + 'installable': True, + 'application': False, + 'summary': 'Project role-based roster', + 'depends': [ + 'project', + 'mail', + ], + 'data': [ + 'security/ir.model.access.csv', + 'security/project_role.xml', + 'views/project_assignment.xml', + 'views/project_project.xml', + 'views/project_role.xml', + 'views/res_config_settings.xml', + ], +} diff --git a/project_role/i18n/project_role.pot b/project_role/i18n/project_role.pot new file mode 100644 index 0000000000..4638eb8936 --- /dev/null +++ b/project_role/i18n/project_role.pot @@ -0,0 +1,350 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_role +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.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_role +#: code:addons/project_role/models/project_assignment.py:55 +#, python-format +msgid "%s as %s on %s" +msgstr "" + +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Project Roles\n" +" " +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__activity_ids +msgid "Activities" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__activity_state +msgid "Activity State" +msgstr "" + +#. module: project_role +#: model:ir.ui.menu,name:project_role.menu_project_assignments +#: model_terms:ir.ui.view,arch_db:project_role.edit_project +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search_form +msgid "Assignments" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__company_id +#: model:ir.model.fields,field_description:project_role.field_project_role__company_id +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search_form +msgid "Company" +msgstr "" + +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Configure set of roles, available on projects." +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__create_uid +#: model:ir.model.fields,field_description:project_role.field_project_role__create_uid +msgid "Created by" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__create_date +#: model:ir.model.fields,field_description:project_role.field_project_role__create_date +msgid "Created on" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_role__description +msgid "Description" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__display_name +#: model:ir.model.fields,field_description:project_role.field_project_role__display_name +msgid "Display Name" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_channel_ids +msgid "Followers (Channels)" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search_form +msgid "Group By" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__id +#: model:ir.model.fields,field_description:project_role.field_project_role__id +msgid "ID" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,help:project_role.field_project_assignment__message_unread +msgid "If checked new messages require your attention." +msgstr "" + +#. module: project_role +#: model:ir.model.fields,help:project_role.field_project_assignment__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: project_role +#: model:ir.model.fields,help:project_role.field_project_assignment__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment____last_update +#: model:ir.model.fields,field_description:project_role.field_project_role____last_update +msgid "Last Modified on" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__write_uid +#: model:ir.model.fields,field_description:project_role.field_project_role__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__write_date +#: model:ir.model.fields,field_description:project_role.field_project_role__write_date +msgid "Last Updated on" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_main_attachment_id +msgid "Main Attachment" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_ids +msgid "Messages" +msgstr "" + +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search_form +msgid "My Assignments" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__name +#: model:ir.model.fields,field_description:project_role.field_project_role__name +msgid "Name" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_has_error_counter +msgid "Number of error" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,help:project_role.field_project_assignment__message_needaction_counter +msgid "Number of messages which requires an action" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,help:project_role.field_project_assignment__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,help:project_role.field_project_assignment__message_unread_counter +msgid "Number of unread messages" +msgstr "" + +#. module: project_role +#: selection:project.assignment,activity_state:0 +msgid "Overdue" +msgstr "" + +#. module: project_role +#: selection:project.assignment,activity_state:0 +msgid "Planned" +msgstr "" + +#. module: project_role +#: model:ir.model,name:project_role.model_project_project +#: model:ir.model.fields,field_description:project_role.field_project_assignment__project_id +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search_form +msgid "Project" +msgstr "" + +#. module: project_role +#: model:ir.model,name:project_role.model_project_assignment +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_view_form +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_view_pivot +msgid "Project Assignment" +msgstr "" + +#. module: project_role +#: model:ir.actions.act_window,name:project_role.project_assignment_view_action +#: model:ir.model.fields,field_description:project_role.field_project_project__assignment_ids +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_view_tree +msgid "Project Assignments" +msgstr "" + +#. module: project_role +#: model:ir.model,name:project_role.model_project_role +#: model_terms:ir.ui.view,arch_db:project_role.project_role_view_form +msgid "Project Role" +msgstr "" + +#. module: project_role +#: model:ir.actions.act_window,name:project_role.company_project_roles_action +#: model:ir.ui.menu,name:project_role.project_menu_config_roles +#: model_terms:ir.ui.view,arch_db:project_role.project_role_view_tree +msgid "Project Roles" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__role_id +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search_form +msgid "Role" +msgstr "" + +#. module: project_role +#: code:addons/project_role/models/project_role.py:52 +#, python-format +msgid "Role \"%s\" conflicts with another role due to same name." +msgstr "" + +#. module: project_role +#: sql_constraint:project.role:0 +msgid "Role with such name already exists in the company!" +msgstr "" + +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Roles & Assignments" +msgstr "" + +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Setup project roles" +msgstr "" + +#. module: project_role +#: sql_constraint:project.role:0 +msgid "Shared role with such name already exists!" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,help:project_role.field_project_assignment__activity_state +msgid "Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: project_role +#: selection:project.assignment,activity_state:0 +msgid "Today" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_unread +msgid "Unread Messages" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_unread_counter +msgid "Unread Messages Counter" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__user_id +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search_form +msgid "User" +msgstr "" + +#. module: project_role +#: code:addons/project_role/models/project_assignment.py:66 +#, python-format +msgid "User %s can not be assigned to role %s." +msgstr "" + +#. module: project_role +#: sql_constraint:project.assignment:0 +msgid "User may be assigned per role only once within a project!" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: project_role +#: model:ir.model.fields,help:project_role.field_project_assignment__website_message_ids +msgid "Website communication history" +msgstr "" + diff --git a/project_role/models/__init__.py b/project_role/models/__init__.py new file mode 100644 index 0000000000..e09b171cfb --- /dev/null +++ b/project_role/models/__init__.py @@ -0,0 +1,5 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import project_role +from . import project_assignment +from . import project_project diff --git a/project_role/models/project_assignment.py b/project_role/models/project_assignment.py new file mode 100644 index 0000000000..4b93d86606 --- /dev/null +++ b/project_role/models/project_assignment.py @@ -0,0 +1,71 @@ +# Copyright 2018 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError + + +class ProjectAssignment(models.Model): + _name = 'project.assignment' + _description = 'Project Assignment' + _inherit = ['mail.thread', 'mail.activity.mixin'] + + name = fields.Char( + compute='_compute_name', + store=True, + index=True, + ) + company_id = fields.Many2one( + comodel_name='res.company', + string='Company', + related='project_id.company_id', + store=True, + readonly=True, + ) + project_id = fields.Many2one( + comodel_name='project.project', + string='Project', + required=True, + track_visibility='onchange', + ) + role_id = fields.Many2one( + comodel_name='project.role', + string='Role', + required=True, + track_visibility='onchange', + ) + user_id = fields.Many2one( + comodel_name='res.users', + string='User', + required=True, + track_visibility='onchange', + ) + + _sql_constraints = [ + ( + 'project_role_user_uniq', + 'unique (project_id, role_id, user_id)', + 'User may be assigned per role only once within a project!' + ), + ] + + @api.depends('project_id.name', 'role_id.name', 'user_id.name') + def _compute_name(self): + for assignment in self: + assignment.name = _('%s as %s on %s') % ( + assignment.user_id.name, + assignment.role_id.name, + assignment.project_id.name, + ) + + @api.multi + @api.constrains('role_id', 'user_id') + def _check_assignable(self): + for assignment in self: + if not assignment.role_id.can_assign(assignment.user_id): + raise ValidationError(_( + 'User %s can not be assigned to role %s.' + ) % ( + assignment.user_id.name, + assignment.role_id.name, + )) diff --git a/project_role/models/project_project.py b/project_role/models/project_project.py new file mode 100644 index 0000000000..72f304d889 --- /dev/null +++ b/project_role/models/project_project.py @@ -0,0 +1,15 @@ +# Copyright 2018 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ProjectProject(models.Model): + _inherit = 'project.project' + + assignment_ids = fields.One2many( + string='Project Assignments', + comodel_name='project.assignment', + inverse_name='project_id', + track_visibility='onchange', + ) diff --git a/project_role/models/project_role.py b/project_role/models/project_role.py new file mode 100644 index 0000000000..f4dd81eea2 --- /dev/null +++ b/project_role/models/project_role.py @@ -0,0 +1,61 @@ +# Copyright 2018 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError +from odoo.tools.translate import html_translate + + +class ProjectRole(models.Model): + _name = 'project.role' + _description = 'Project Role' + + name = fields.Char( + 'Name', + translate=True, + required=True, + ) + description = fields.Html( + string='Description', + translate=html_translate, + ) + company_id = fields.Many2one( + comodel_name='res.company', + string='Company', + default=lambda self: self.env.user.company_id, + ) + + _sql_constraints = [ + ( + 'name_company_uniq', + 'UNIQUE (name, company_id)', + 'Role with such name already exists in the company!' + ), + ( + 'name_nocompany_uniq', + ( + 'EXCLUDE (name WITH =) WHERE (' + ' company_id IS NULL' + ')' + ), + 'Shared role with such name already exists!' + ), + ] + + @api.multi + @api.constrains('name') + def _check_name(self): + for role in self: + if self.search_count([ + ('company_id', '=' if role.company_id else '!=', False), + ('name', '=', role.name)]) > 0: + raise ValidationError(_( + 'Role "%s" conflicts with another role due to same name.' + ) % ( + role.name, + )) + + @api.model + def can_assign(self, user_id): + # Extension point to check if user can be assigned to this role + return True diff --git a/project_role/readme/CONFIGURE.rst b/project_role/readme/CONFIGURE.rst new file mode 100644 index 0000000000..452acced9a --- /dev/null +++ b/project_role/readme/CONFIGURE.rst @@ -0,0 +1,6 @@ +To configure the list of roles available go to +*Project > Configuration > Project Roles* +and create project roles according to your business processes. + +Project assignments can be configured from project editing screen via +*Assignments* page as well as via *Project > Assignments*. diff --git a/project_role/readme/CONTRIBUTORS.rst b/project_role/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..1c6a35a1e3 --- /dev/null +++ b/project_role/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Alexey Pelykh diff --git a/project_role/readme/DESCRIPTION.rst b/project_role/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..b725bd2231 --- /dev/null +++ b/project_role/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module allows maintaining project roster based on roles. List of roles is +configured at company level. diff --git a/project_role/security/ir.model.access.csv b/project_role/security/ir.model.access.csv new file mode 100644 index 0000000000..302b08f1b8 --- /dev/null +++ b/project_role/security/ir.model.access.csv @@ -0,0 +1,7 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_project_role_assignee,project.role,model_project_role,base.group_user,1,0,0,0 +access_project_role_user,project.role,model_project_role,project.group_project_user,1,0,0,0 +access_project_role_manager,project.role,model_project_role,project.group_project_manager,1,1,1,1 +access_project_assignment_assignee,project.assignment,model_project_assignment,base.group_user,1,0,0,0 +access_project_assignment_user,project.assignment,model_project_assignment,project.group_project_user,1,0,0,0 +access_project_assignment_manager,project.assignment,model_project_assignment,project.group_project_manager,1,1,1,1 diff --git a/project_role/security/project_role.xml b/project_role/security/project_role.xml new file mode 100644 index 0000000000..c7b4ed1960 --- /dev/null +++ b/project_role/security/project_role.xml @@ -0,0 +1,9 @@ + + + + Project Role multi-company + + + ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] + + diff --git a/project_role/static/description/index.html b/project_role/static/description/index.html new file mode 100644 index 0000000000..b7c39375cd --- /dev/null +++ b/project_role/static/description/index.html @@ -0,0 +1,429 @@ + + + + + + +Project Roles + + + +
+

Project Roles

+ + +

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

+

This module allows maintaining project roster based on roles. List of roles is +configured at company level.

+

Table of contents

+ +
+

Configuration

+

To configure the list of roles available go to +Project > Configuration > Project Roles +and create project roles according to your business processes.

+

Project assignments can be configured from project editing screen via +Assignments page as well as via Project > Assignments.

+
+
+

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

+
    +
  • Brainbean Apps
  • +
+
+ +
+

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_role/tests/__init__.py b/project_role/tests/__init__.py new file mode 100644 index 0000000000..5560a008be --- /dev/null +++ b/project_role/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import test_project_role diff --git a/project_role/tests/test_project_role.py b/project_role/tests/test_project_role.py new file mode 100644 index 0000000000..b04b05b41e --- /dev/null +++ b/project_role/tests/test_project_role.py @@ -0,0 +1,119 @@ +# Copyright 2018 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from psycopg2 import IntegrityError +from unittest import mock + +from odoo import fields +from odoo.exceptions import ValidationError +from odoo.tests import common +from odoo.tools.misc import mute_logger + +_module_ns = 'odoo.addons.project_role' +_project_role_class = _module_ns + '.models.project_role.ProjectRole' + + +class TestProjectRole(common.TransactionCase): + + def setUp(self): + super().setUp() + + self.now = fields.Datetime.now() + self.Company = self.env['res.company'] + self.SudoCompany = self.Company.sudo() + self.Project = self.env['project.project'] + self.SudoProject = self.Project.sudo() + self.Role = self.env['project.role'] + self.SudoRole = self.Role.sudo() + self.Assignment = self.env['project.assignment'] + self.SudoAssignment = self.Assignment.sudo() + + def test_1(self): + project = self.SudoProject.create({ + 'name': 'Project #1', + }) + role = self.SudoRole.create({ + 'name': 'Role #1', + }) + self.SudoAssignment.create({ + 'project_id': project.id, + 'role_id': role.id, + 'user_id': self.env.user.id, + }) + + def test_2(self): + project = self.SudoProject.create({ + 'name': 'Project #2', + }) + role = self.SudoRole.create({ + 'name': 'Role #2', + }) + self.SudoAssignment.create({ + 'project_id': project.id, + 'role_id': role.id, + 'user_id': self.env.user.id, + }) + + with self.assertRaises(IntegrityError), mute_logger('odoo.sql_db'): + self.SudoAssignment.create({ + 'project_id': project.id, + 'role_id': role.id, + 'user_id': self.env.user.id, + }) + + def test_3(self): + project = self.SudoProject.create({ + 'name': 'Project #3', + }) + role = self.SudoRole.create({ + 'name': 'Role #3', + }) + + with mock.patch( + _project_role_class + '.can_assign', + return_value=False, + ): + with self.assertRaises(ValidationError): + self.SudoAssignment.create({ + 'project_id': project.id, + 'role_id': role.id, + 'user_id': self.env.user.id, + }) + + def test_4(self): + company_1 = self.SudoCompany.create({ + 'name': 'Company #4-1', + }) + self.SudoRole.create({ + 'name': 'Role #4-1', + 'company_id': company_1.id, + }) + company_2 = self.SudoCompany.create({ + 'name': 'Company #4-2', + }) + self.SudoRole.create({ + 'name': 'Role #4-2', + 'company_id': company_2.id, + }) + + def test_5(self): + self.SudoRole.create({ + 'name': 'Role #5', + 'company_id': False, + }) + + with self.assertRaises(ValidationError): + self.SudoRole.create({ + 'name': 'Role #5', + }) + + def test_6(self): + self.SudoRole.create({ + 'name': 'Role #6', + }) + + with self.assertRaises(ValidationError): + self.SudoRole.create({ + 'name': 'Role #6', + 'company_id': False, + }) diff --git a/project_role/views/project_assignment.xml b/project_role/views/project_assignment.xml new file mode 100644 index 0000000000..ae4126085b --- /dev/null +++ b/project_role/views/project_assignment.xml @@ -0,0 +1,125 @@ + + + + + + project.assignment.view.tree + project.assignment + + + + + + + + + + + + project.assignment.view.form + project.assignment + +
+
+ + + + + + + +
+ + + +
+ + + + + + project.assignment.view.pivot + project.assignment + + + + + + + + + + + + project.assignment.view.kanban + project.assignment + + + + + + + + +
+
+
+ +
+
+
+ +
+
+ + + +
+
+ + + +
+
+
+
+
+
+
+
+
+ + + project.assignment.search.form + project.assignment + + + + + + + + + + + + + + + + + + + Project Assignments + project.assignment + kanban,tree,form,pivot,graph + + + + + + diff --git a/project_role/views/project_project.xml b/project_role/views/project_project.xml new file mode 100644 index 0000000000..081922a68f --- /dev/null +++ b/project_role/views/project_project.xml @@ -0,0 +1,30 @@ + + + + + + project.project.form + project.project + + + + + + + + + + + + + + + + + + + + diff --git a/project_role/views/project_role.xml b/project_role/views/project_role.xml new file mode 100644 index 0000000000..a0f4967334 --- /dev/null +++ b/project_role/views/project_role.xml @@ -0,0 +1,45 @@ + + + + + + project.role.view.tree + project.role + + + + + + + + + + + project.role.view.tree + project.role + +
+ + + + + +
+
+
+ + + Project Roles + project.role + form + tree,form + + + + +
diff --git a/project_role/views/res_config_settings.xml b/project_role/views/res_config_settings.xml new file mode 100644 index 0000000000..3014224229 --- /dev/null +++ b/project_role/views/res_config_settings.xml @@ -0,0 +1,39 @@ + + + + + + res.config.settings.view.form.project_role + res.config.settings + + + +
+

Roles & Assignments

+
+
+
+
+
+ Project Roles + +
+ Configure set of roles, available on projects. +
+
+
+
+
+
+
+
+
+
+
+
+ +
From e7607b46858a989da38ecc390422871fee78ed64 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 3 Apr 2019 03:14:46 +0000 Subject: [PATCH 02/45] [ADD] icon.png --- project_role/static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 project_role/static/description/icon.png diff --git a/project_role/static/description/icon.png b/project_role/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 From f7fe81bbe832a947e55898d8587335a150024db2 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Wed, 3 Apr 2019 11:48:34 +0300 Subject: [PATCH 03/45] [IMP] Don't allow create-and-edit on assignments --- project_role/__manifest__.py | 4 ++-- project_role/views/project_assignment.xml | 24 +++++++++++------------ project_role/views/project_role.xml | 12 ++++++------ 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/project_role/__manifest__.py b/project_role/__manifest__.py index fda38825e2..17c9b1c44c 100644 --- a/project_role/__manifest__.py +++ b/project_role/__manifest__.py @@ -1,9 +1,9 @@ -# Copyright 2018 Brainbean Apps (https://brainbeanapps.com) +# Copyright 2018-2019 Brainbean Apps (https://brainbeanapps.com) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { 'name': 'Project Roles', - 'version': '12.0.1.0.0', + 'version': '12.0.1.0.1', 'category': 'Project', 'website': 'https://github.com/OCA/project', 'author': diff --git a/project_role/views/project_assignment.xml b/project_role/views/project_assignment.xml index ae4126085b..31ec4b7c8e 100644 --- a/project_role/views/project_assignment.xml +++ b/project_role/views/project_assignment.xml @@ -1,19 +1,19 @@ + - project.assignment.view.tree project.assignment - - - - + + + + @@ -25,10 +25,10 @@
- - - - + + + +
diff --git a/project_role/views/project_role.xml b/project_role/views/project_role.xml index a0f4967334..22cce59f77 100644 --- a/project_role/views/project_role.xml +++ b/project_role/views/project_role.xml @@ -1,16 +1,16 @@ + - project.role.view.tree project.role - + @@ -23,7 +23,7 @@ - + From e96ce0c33869fa7d11858d848e9d4a3dfeabba26 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Mon, 8 Apr 2019 13:14:16 +0300 Subject: [PATCH 04/45] [IMP] Don't allow quick-create on assignments --- project_role/__manifest__.py | 2 +- project_role/views/project_assignment.xml | 16 ++++++++-------- project_role/views/project_role.xml | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/project_role/__manifest__.py b/project_role/__manifest__.py index 17c9b1c44c..699173fd47 100644 --- a/project_role/__manifest__.py +++ b/project_role/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'Project Roles', - 'version': '12.0.1.0.1', + 'version': '12.0.1.0.2', 'category': 'Project', 'website': 'https://github.com/OCA/project', 'author': diff --git a/project_role/views/project_assignment.xml b/project_role/views/project_assignment.xml index 31ec4b7c8e..ef86beb12e 100644 --- a/project_role/views/project_assignment.xml +++ b/project_role/views/project_assignment.xml @@ -10,10 +10,10 @@ project.assignment - - - - + + + + @@ -25,10 +25,10 @@
- - - - + + + +
diff --git a/project_role/views/project_role.xml b/project_role/views/project_role.xml index 22cce59f77..33d83498ee 100644 --- a/project_role/views/project_role.xml +++ b/project_role/views/project_role.xml @@ -10,7 +10,7 @@ project.role - + @@ -23,7 +23,7 @@ - + From a27be92ac8621254b0d49ed87030d22bb18f4d60 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Fri, 17 May 2019 09:51:05 +0300 Subject: [PATCH 05/45] [IMP] project_role: improve usability --- project_role/README.rst | 20 +++- project_role/__manifest__.py | 2 +- project_role/i18n/project_role.pot | 23 ++-- project_role/readme/CONFIGURE.rst | 20 +++- project_role/security/ir.model.access.csv | 2 +- project_role/security/project_role.xml | 4 + project_role/static/description/index.html | 22 +++- project_role/views/project_assignment.xml | 124 +++++++++++++++------ project_role/views/project_project.xml | 31 +++--- project_role/views/project_role.xml | 12 +- project_role/views/res_config_settings.xml | 8 +- 11 files changed, 178 insertions(+), 90 deletions(-) diff --git a/project_role/README.rst b/project_role/README.rst index 8ca0261a1a..05bc40a5b7 100644 --- a/project_role/README.rst +++ b/project_role/README.rst @@ -36,12 +36,22 @@ configured at company level. Configuration ============= -To configure the list of roles available go to -*Project > Configuration > Project Roles* -and create project roles according to your business processes. +To configure the list of roles avalable: -Project assignments can be configured from project editing screen via -*Assignments* page as well as via *Project > Assignments*. +#. Go to *Project > Configuration > Project Roles* +#. Add/remove roles according to your business processes + +To manage assignments on particular project: + +#. Go to *Project > Projects* +#. Open project of interest +#. Click on *Assignments* smart-button +#. Add/remove assignments as needed + +To manage assignments: + +#. Go to *Project > Assignments* +#. Add/remove assignments as needed Bug Tracker =========== diff --git a/project_role/__manifest__.py b/project_role/__manifest__.py index 699173fd47..462b43f12f 100644 --- a/project_role/__manifest__.py +++ b/project_role/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'Project Roles', - 'version': '12.0.1.0.2', + 'version': '12.0.1.1.0', 'category': 'Project', 'website': 'https://github.com/OCA/project', 'author': diff --git a/project_role/i18n/project_role.pot b/project_role/i18n/project_role.pot index 4638eb8936..68c88fac48 100644 --- a/project_role/i18n/project_role.pot +++ b/project_role/i18n/project_role.pot @@ -41,9 +41,10 @@ msgid "Activity State" msgstr "" #. module: project_role +#: model:ir.actions.act_window,name:project_role.project_assignment_view_project_action #: model:ir.ui.menu,name:project_role.menu_project_assignments #: model_terms:ir.ui.view,arch_db:project_role.edit_project -#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search_form +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search msgid "Assignments" msgstr "" @@ -55,7 +56,7 @@ msgstr "" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__company_id #: model:ir.model.fields,field_description:project_role.field_project_role__company_id -#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search_form +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search msgid "Company" msgstr "" @@ -103,7 +104,7 @@ msgid "Followers (Partners)" msgstr "" #. module: project_role -#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search_form +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search msgid "Group By" msgstr "" @@ -167,7 +168,7 @@ msgid "Messages" msgstr "" #. module: project_role -#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search_form +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search msgid "My Assignments" msgstr "" @@ -230,21 +231,21 @@ msgstr "" #. module: project_role #: model:ir.model,name:project_role.model_project_project #: model:ir.model.fields,field_description:project_role.field_project_assignment__project_id -#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search_form +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search msgid "Project" msgstr "" #. module: project_role #: model:ir.model,name:project_role.model_project_assignment -#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_view_form -#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_view_pivot +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_form +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_pivot msgid "Project Assignment" msgstr "" #. module: project_role -#: model:ir.actions.act_window,name:project_role.project_assignment_view_action +#: model:ir.actions.act_window,name:project_role.project_assignment_view_all_action #: model:ir.model.fields,field_description:project_role.field_project_project__assignment_ids -#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_view_tree +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_tree msgid "Project Assignments" msgstr "" @@ -268,7 +269,7 @@ msgstr "" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__role_id -#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search_form +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search msgid "Role" msgstr "" @@ -323,7 +324,7 @@ msgstr "" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__user_id -#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search_form +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search msgid "User" msgstr "" diff --git a/project_role/readme/CONFIGURE.rst b/project_role/readme/CONFIGURE.rst index 452acced9a..d8629e282f 100644 --- a/project_role/readme/CONFIGURE.rst +++ b/project_role/readme/CONFIGURE.rst @@ -1,6 +1,16 @@ -To configure the list of roles available go to -*Project > Configuration > Project Roles* -and create project roles according to your business processes. +To configure the list of roles avalable: -Project assignments can be configured from project editing screen via -*Assignments* page as well as via *Project > Assignments*. +#. Go to *Project > Configuration > Project Roles* +#. Add/remove roles according to your business processes + +To manage assignments on particular project: + +#. Go to *Project > Projects* +#. Open project of interest +#. Click on *Assignments* smart-button +#. Add/remove assignments as needed + +To manage assignments: + +#. Go to *Project > Assignments* +#. Add/remove assignments as needed diff --git a/project_role/security/ir.model.access.csv b/project_role/security/ir.model.access.csv index 302b08f1b8..bcffac1cd7 100644 --- a/project_role/security/ir.model.access.csv +++ b/project_role/security/ir.model.access.csv @@ -1,7 +1,7 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_project_role_assignee,project.role,model_project_role,base.group_user,1,0,0,0 access_project_role_user,project.role,model_project_role,project.group_project_user,1,0,0,0 -access_project_role_manager,project.role,model_project_role,project.group_project_manager,1,1,1,1 +access_project_role_manager,project.role,model_project_role,base.group_system,1,1,1,1 access_project_assignment_assignee,project.assignment,model_project_assignment,base.group_user,1,0,0,0 access_project_assignment_user,project.assignment,model_project_assignment,project.group_project_user,1,0,0,0 access_project_assignment_manager,project.assignment,model_project_assignment,project.group_project_manager,1,1,1,1 diff --git a/project_role/security/project_role.xml b/project_role/security/project_role.xml index c7b4ed1960..818a0bcaf7 100644 --- a/project_role/security/project_role.xml +++ b/project_role/security/project_role.xml @@ -1,4 +1,8 @@ + Project Role multi-company diff --git a/project_role/static/description/index.html b/project_role/static/description/index.html index b7c39375cd..b2f0fd839b 100644 --- a/project_role/static/description/index.html +++ b/project_role/static/description/index.html @@ -385,11 +385,23 @@

Project Roles

Configuration

-

To configure the list of roles available go to -Project > Configuration > Project Roles -and create project roles according to your business processes.

-

Project assignments can be configured from project editing screen via -Assignments page as well as via Project > Assignments.

+

To configure the list of roles avalable:

+
    +
  1. Go to Project > Configuration > Project Roles
  2. +
  3. Add/remove roles according to your business processes
  4. +
+

To manage assignments on particular project:

+
    +
  1. Go to Project > Projects
  2. +
  3. Open project of interest
  4. +
  5. Click on Assignments smart-button
  6. +
  7. Add/remove assignments as needed
  8. +
+

To manage assignments:

+
    +
  1. Go to Project > Assignments
  2. +
  3. Add/remove assignments as needed
  4. +

Bug Tracker

diff --git a/project_role/views/project_assignment.xml b/project_role/views/project_assignment.xml index ef86beb12e..9a7bd6425e 100644 --- a/project_role/views/project_assignment.xml +++ b/project_role/views/project_assignment.xml @@ -5,34 +5,41 @@ --> - - project.assignment.view.tree - project.assignment - - - - - - - - - - - - project.assignment.view.form + + project.assignment.form project.assignment
- - - - + + + +
- +
@@ -40,8 +47,37 @@ - - project.assignment.view.pivot + + project.assignment.tree + project.assignment + + + + + + + + + + + + project.assignment.pivot project.assignment @@ -53,8 +89,8 @@ - - project.assignment.view.kanban + + project.assignment.kanban project.assignment @@ -78,7 +114,7 @@
-
+
@@ -92,8 +128,8 @@ - - project.assignment.search.form + + project.assignment.search project.assignment @@ -103,23 +139,41 @@ - - - - + + + + - + Project Assignments project.assignment + tree,kanban,form,pivot,graph + form + + {'search_default_groupby_project': 1} + + + + Assignments + project.assignment kanban,tree,form,pivot,graph - + form + + {'default_project_id': active_id} + [('project_id','=',active_id)] - + diff --git a/project_role/views/project_project.xml b/project_role/views/project_project.xml index 081922a68f..601b2cf03f 100644 --- a/project_role/views/project_project.xml +++ b/project_role/views/project_project.xml @@ -1,29 +1,24 @@ + - project.project.form project.project - - - - - - - - - - - - - - + diff --git a/project_role/views/project_role.xml b/project_role/views/project_role.xml index 33d83498ee..409fa10b8b 100644 --- a/project_role/views/project_role.xml +++ b/project_role/views/project_role.xml @@ -10,7 +10,7 @@ project.role - + @@ -23,7 +23,7 @@ - + @@ -34,12 +34,14 @@ Project Roles project.role - form tree,form + tree - + parent="project.menu_project_config" + /> diff --git a/project_role/views/res_config_settings.xml b/project_role/views/res_config_settings.xml index 3014224229..2157de897e 100644 --- a/project_role/views/res_config_settings.xml +++ b/project_role/views/res_config_settings.xml @@ -1,9 +1,9 @@ + - res.config.settings.view.form.project_role From 0807517ce9bc4957efc8f9b1bbd79503e2b322b0 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Fri, 5 Jul 2019 09:09:28 +0300 Subject: [PATCH 06/45] [FIX] project_role: bad menu item --- project_role/__manifest__.py | 2 +- project_role/i18n/de.po | 367 +++++++++++++++++++++ project_role/static/description/index.html | 2 +- project_role/views/project_role.xml | 2 +- 4 files changed, 370 insertions(+), 3 deletions(-) create mode 100644 project_role/i18n/de.po diff --git a/project_role/__manifest__.py b/project_role/__manifest__.py index 462b43f12f..a107b345ad 100644 --- a/project_role/__manifest__.py +++ b/project_role/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'Project Roles', - 'version': '12.0.1.1.0', + 'version': '12.0.1.1.1', 'category': 'Project', 'website': 'https://github.com/OCA/project', 'author': diff --git a/project_role/i18n/de.po b/project_role/i18n/de.po new file mode 100644 index 0000000000..1d7fe09417 --- /dev/null +++ b/project_role/i18n/de.po @@ -0,0 +1,367 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * project_role +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-07-12 15:43+0000\n" +"Last-Translator: Maria Sparenberg \n" +"Language-Team: none\n" +"Language: de\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.7.1\n" + +#. module: project_role +#: code:addons/project_role/models/project_assignment.py:55 +#, python-format +msgid "%s as %s on %s" +msgstr "%s als %s für %s" + +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Project Roles\n" +" " +msgstr "" +"Projektrollen\n" +" " + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_needaction +msgid "Action Needed" +msgstr "Aktion benötigt" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__activity_ids +msgid "Activities" +msgstr "Aktivitäten" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__activity_state +msgid "Activity State" +msgstr "Aktivitätsstatus" + +#. module: project_role +#: model:ir.actions.act_window,name:project_role.project_assignment_view_project_action +#: model:ir.ui.menu,name:project_role.menu_project_assignments +#: model_terms:ir.ui.view,arch_db:project_role.edit_project +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search +msgid "Assignments" +msgstr "Rollenzuweisungen" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_attachment_count +msgid "Attachment Count" +msgstr "Anhangsanzahl" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__company_id +#: model:ir.model.fields,field_description:project_role.field_project_role__company_id +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search +msgid "Company" +msgstr "Unternehmen" + +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Configure set of roles, available on projects." +msgstr "Bitte Projektrollen für Projekte konfigurieren." + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__create_uid +#: model:ir.model.fields,field_description:project_role.field_project_role__create_uid +msgid "Created by" +msgstr "Erstellt von" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__create_date +#: model:ir.model.fields,field_description:project_role.field_project_role__create_date +msgid "Created on" +msgstr "Erstellt am" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_role__description +msgid "Description" +msgstr "Beschreibung" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__display_name +#: model:ir.model.fields,field_description:project_role.field_project_role__display_name +msgid "Display Name" +msgstr "Anzeigename" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_follower_ids +msgid "Followers" +msgstr "Abonnenten" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_channel_ids +msgid "Followers (Channels)" +msgstr "Abonnenten (Kanäle)" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_partner_ids +msgid "Followers (Partners)" +msgstr "Abonnenten (Partner)" + +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search +msgid "Group By" +msgstr "Gruppieren nach" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__id +#: model:ir.model.fields,field_description:project_role.field_project_role__id +msgid "ID" +msgstr "ID" + +#. module: project_role +#: model:ir.model.fields,help:project_role.field_project_assignment__message_unread +msgid "If checked new messages require your attention." +msgstr "Wenn es gesetzt ist, erfordern neue Nachrichten Ihre Aufmerksamkeit." + +#. module: project_role +#: model:ir.model.fields,help:project_role.field_project_assignment__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Wenn es gesetzt ist, erfordern neue Nachrichten Ihre Aufmerksamkeit." + +#. module: project_role +#: model:ir.model.fields,help:project_role.field_project_assignment__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" +"Wenn es gesetzt ist, gibt es einige Nachrichten mit einem Übertragungsfehler." + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_is_follower +msgid "Is Follower" +msgstr "Ist Abonnent" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment____last_update +#: model:ir.model.fields,field_description:project_role.field_project_role____last_update +msgid "Last Modified on" +msgstr "Zuletzt geändert am" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__write_uid +#: model:ir.model.fields,field_description:project_role.field_project_role__write_uid +msgid "Last Updated by" +msgstr "Zuletzt aktualisiert von" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__write_date +#: model:ir.model.fields,field_description:project_role.field_project_role__write_date +msgid "Last Updated on" +msgstr "Zuletzt aktualisiert am" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_main_attachment_id +msgid "Main Attachment" +msgstr "Haupt-Anhang" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_has_error +msgid "Message Delivery error" +msgstr "Nachrichten-Übertragungsfehler" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_ids +msgid "Messages" +msgstr "Nachrichten" + +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search +msgid "My Assignments" +msgstr "Meine Rollenzuweisungen" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__name +#: model:ir.model.fields,field_description:project_role.field_project_role__name +msgid "Name" +msgstr "Bezeichnung" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Frist für die nächste Aktivität" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__activity_summary +msgid "Next Activity Summary" +msgstr "Zusammenfassung der nächsten Aktivität" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__activity_type_id +msgid "Next Activity Type" +msgstr "Typ der nächsten Aktivität" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_needaction_counter +msgid "Number of Actions" +msgstr "Anzahl der Aktionen" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_has_error_counter +msgid "Number of error" +msgstr "Anzahl der Fehler" + +#. module: project_role +#: model:ir.model.fields,help:project_role.field_project_assignment__message_needaction_counter +msgid "Number of messages which requires an action" +msgstr "Dies ist die Anzahl von Nachrichten, die eine Aktion benötigen." + +#. module: project_role +#: model:ir.model.fields,help:project_role.field_project_assignment__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Dies ist die Anzahl von Nachrichten mit einem Übertragungsfehler." + +#. module: project_role +#: model:ir.model.fields,help:project_role.field_project_assignment__message_unread_counter +msgid "Number of unread messages" +msgstr "Dies ist die Anzahl von ungelesenen Nachrichten." + +#. module: project_role +#: selection:project.assignment,activity_state:0 +msgid "Overdue" +msgstr "Überfällig" + +#. module: project_role +#: selection:project.assignment,activity_state:0 +msgid "Planned" +msgstr "Geplant" + +#. module: project_role +#: model:ir.model,name:project_role.model_project_project +#: model:ir.model.fields,field_description:project_role.field_project_assignment__project_id +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search +msgid "Project" +msgstr "Projekt" + +#. module: project_role +#: model:ir.model,name:project_role.model_project_assignment +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_form +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_pivot +msgid "Project Assignment" +msgstr "Projekt-Rollenzuweisung" + +#. module: project_role +#: model:ir.actions.act_window,name:project_role.project_assignment_view_all_action +#: model:ir.model.fields,field_description:project_role.field_project_project__assignment_ids +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_tree +msgid "Project Assignments" +msgstr "Projekt-Rollenzuweisungen" + +#. module: project_role +#: model:ir.model,name:project_role.model_project_role +#: model_terms:ir.ui.view,arch_db:project_role.project_role_view_form +msgid "Project Role" +msgstr "Projektrolle" + +#. module: project_role +#: model:ir.actions.act_window,name:project_role.company_project_roles_action +#: model:ir.ui.menu,name:project_role.project_menu_config_roles +#: model_terms:ir.ui.view,arch_db:project_role.project_role_view_tree +msgid "Project Roles" +msgstr "Projektrollen" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__activity_user_id +msgid "Responsible User" +msgstr "Verantwortlicher Benutzer" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__role_id +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search +msgid "Role" +msgstr "Rolle" + +#. module: project_role +#: code:addons/project_role/models/project_role.py:52 +#, python-format +msgid "Role \"%s\" conflicts with another role due to same name." +msgstr "" +"Die Rolle \"%s\" steht im Konflikt mit einer anderen Rolle, die denselben " +"Namen hat." + +#. module: project_role +#: sql_constraint:project.role:0 +msgid "Role with such name already exists in the company!" +msgstr "Eine Rolle mit demselben Namen existiert in dem Unternehmen bereits!" + +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Roles & Assignments" +msgstr "Rollen und Zuweisungen" + +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Setup project roles" +msgstr "Projektrollen anlegen" + +#. module: project_role +#: sql_constraint:project.role:0 +msgid "Shared role with such name already exists!" +msgstr "Eine geteilte Rolle mit diesem Namen existiert bereits!" + +#. module: project_role +#: model:ir.model.fields,help:project_role.field_project_assignment__activity_state +msgid "Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"Der Status hängt von den Aktivitäten ab.\n" +"Überfällig: Das Fälligkeitsdatum der Aktivität ist überschritten.\n" +"Heute: Die Aktivität findet heute statt.\n" +"Geplant: Die Aktivitäten findet in der Zukunft statt." + +#. module: project_role +#: selection:project.assignment,activity_state:0 +msgid "Today" +msgstr "Heute" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_unread +msgid "Unread Messages" +msgstr "Ungelesene Nachrichten" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__message_unread_counter +msgid "Unread Messages Counter" +msgstr "Zähler für ungelesene Nachrichten" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__user_id +#: model_terms:ir.ui.view,arch_db:project_role.project_assignment_search +msgid "User" +msgstr "Benutzer" + +#. module: project_role +#: code:addons/project_role/models/project_assignment.py:66 +#, python-format +msgid "User %s can not be assigned to role %s." +msgstr "Der Benutzer %s kann der Rolle %s nicht zugewiesen werden." + +#. module: project_role +#: sql_constraint:project.assignment:0 +msgid "User may be assigned per role only once within a project!" +msgstr "" +"Der Benutzer sollte einer Rolle innerhalb eines Projekts nur einmal " +"zugewiesen sein!" + +#. module: project_role +#: model:ir.model.fields,field_description:project_role.field_project_assignment__website_message_ids +msgid "Website Messages" +msgstr "Website-Nachrichten" + +#. module: project_role +#: model:ir.model.fields,help:project_role.field_project_assignment__website_message_ids +msgid "Website communication history" +msgstr "Website-Kommunikationshistorie" diff --git a/project_role/static/description/index.html b/project_role/static/description/index.html index b2f0fd839b..4de5b530f1 100644 --- a/project_role/static/description/index.html +++ b/project_role/static/description/index.html @@ -3,7 +3,7 @@ - + Project Roles -
-

Project Roles

+
+ + +Odoo Community Association + +
+

Project Roles

-

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

+

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

This module allows maintaining project roster based on roles and assignments. List of roles is configured at company level, while assignments can be created on project, company, and cross-company @@ -388,7 +393,7 @@

Project Roles

-

Configuration

+

Configuration

To configure the list of roles avalable:

  1. Go to Project > Configuration > Project Roles
  2. @@ -412,7 +417,7 @@

    Configuration

    to False.

-

Bug Tracker

+

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 to smash it by providing a detailed and welcomed @@ -420,15 +425,15 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • CorporateHub
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -454,5 +459,6 @@

Maintainers

+
From 01ccd69cc93ae08c0b7bd897b6cd71cf19310259 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Thu, 26 Feb 2026 16:18:44 +0000 Subject: [PATCH 37/45] [UPD] Update project_role.pot --- project_role/i18n/project_role.pot | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/project_role/i18n/project_role.pot b/project_role/i18n/project_role.pot index 4acd75a778..bf178a8cd3 100644 --- a/project_role/i18n/project_role.pot +++ b/project_role/i18n/project_role.pot @@ -39,17 +39,7 @@ msgstr "" #. module: project_role #: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"" -msgstr "" - -#. module: project_role -#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"Project Roles\n" -" " +msgid "Project Roles" msgstr "" #. module: project_role @@ -398,6 +388,11 @@ msgstr "" msgid "User may be assigned per role only once!" msgstr "" +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Values set here are company-specific." +msgstr "" + #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__website_message_ids msgid "Website Messages" From 6ad6f19d94656386b6040e7a0ed9d5f423664a01 Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 26 Feb 2026 16:24:56 +0000 Subject: [PATCH 38/45] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: project-18.0/project-18.0-project_role Translate-URL: https://translation.odoo-community.org/projects/project-18-0/project-18-0-project_role/ --- project_role/i18n/de.po | 62 +++++++++++++++++++++----------------- project_role/i18n/es.po | 60 +++++++++++++++++++----------------- project_role/i18n/es_AR.po | 60 +++++++++++++++++++----------------- project_role/i18n/es_PA.po | 24 +++++---------- project_role/i18n/fr.po | 24 +++++---------- project_role/i18n/hr.po | 54 ++++++++++++++++++--------------- project_role/i18n/it.po | 59 ++++++++++++++++++++---------------- project_role/i18n/nl.po | 62 +++++++++++++++++++++----------------- project_role/i18n/pt_BR.po | 24 +++++---------- project_role/i18n/sl.po | 55 ++++++++++++++++++--------------- 10 files changed, 252 insertions(+), 232 deletions(-) diff --git a/project_role/i18n/de.po b/project_role/i18n/de.po index 4dca05c9e7..303dec4fc3 100644 --- a/project_role/i18n/de.po +++ b/project_role/i18n/de.po @@ -42,29 +42,8 @@ msgstr "%(parent)s / %(own)s" #. module: project_role #: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"" -msgstr "" -"" - -#. module: project_role -#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"Project Roles\n" -" " +msgid "Project Roles" msgstr "" -"Projektrollen\n" -" " #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__message_needaction @@ -89,11 +68,11 @@ msgstr "Archiviert" #. odoo-python #: code:addons/project_role/models/project_assignment.py:0 msgid "" -"Assignment %(ASSIGNMENT)s conflicts with another assignment: " -"%(OTHER_ASSIGNMENT)s" +"Assignment %(ASSIGNMENT)s conflicts with another assignment: %" +"(OTHER_ASSIGNMENT)s" msgstr "" -"Zuweisung %(ASSIGNMENT)s hat einen Konflikt mit einer anderen Zuweisung: " -"%(OTHER_ASSIGNMENT)s" +"Zuweisung %(ASSIGNMENT)s hat einen Konflikt mit einer anderen Zuweisung: %" +"(OTHER_ASSIGNMENT)s" #. module: project_role #: model:ir.actions.act_window,name:project_role.project_assignment_view_project_action @@ -401,8 +380,8 @@ msgstr "Benutzer" #: code:addons/project_role/models/project_assignment.py:0 msgid "User %(USER)s can not be assigned to role %(ROLE)s on %(PROJECT)s." msgstr "" -"Benutzer %(USER)s kann keiner Rolle zugeordnet werden: %(ROLE)s in " -"%(PROJECT)s." +"Benutzer %(USER)s kann keiner Rolle zugeordnet werden: %(ROLE)s in %" +"(PROJECT)s." #. module: project_role #. odoo-python @@ -429,6 +408,11 @@ msgstr "" msgid "User may be assigned per role only once!" msgstr "Der Benutzer sollte einer Rolle nur einmal zugewiesen sein!" +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Values set here are company-specific." +msgstr "" + #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__website_message_ids msgid "Website Messages" @@ -439,6 +423,28 @@ msgstr "Website-Nachrichten" msgid "Website communication history" msgstr "Website-Kommunikationshistorie" +#~ msgid "" +#~ "" +#~ msgstr "" +#~ "" + +#~ msgid "" +#~ "Project Roles\n" +#~ " " +#~ msgstr "" +#~ "Projektrollen\n" +#~ " " + #, fuzzy #~ msgid "SMS Delivery error" #~ msgstr "Nachrichten-Übertragungsfehler" diff --git a/project_role/i18n/es.po b/project_role/i18n/es.po index 60d041d136..516f0df241 100644 --- a/project_role/i18n/es.po +++ b/project_role/i18n/es.po @@ -42,30 +42,8 @@ msgstr "%(parent)s / %(own)s" #. module: project_role #: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"" -msgstr "" -"" - -#. module: project_role -#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"Project Roles\n" -" " +msgid "Project Roles" msgstr "" -"Roles del proyecto\n" -" " #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__message_needaction @@ -90,11 +68,11 @@ msgstr "Archivado" #. odoo-python #: code:addons/project_role/models/project_assignment.py:0 msgid "" -"Assignment %(ASSIGNMENT)s conflicts with another assignment: " -"%(OTHER_ASSIGNMENT)s" +"Assignment %(ASSIGNMENT)s conflicts with another assignment: %" +"(OTHER_ASSIGNMENT)s" msgstr "" -"La asignación %(ASSIGNMENT)s entra en conflicto con otra asignación: " -"%(OTHER_ASSIGNMENT)s" +"La asignación %(ASSIGNMENT)s entra en conflicto con otra asignación: %" +"(OTHER_ASSIGNMENT)s" #. module: project_role #: model:ir.actions.act_window,name:project_role.project_assignment_view_project_action @@ -422,6 +400,11 @@ msgstr "" msgid "User may be assigned per role only once!" msgstr "¡El usuario puede ser asignado por rol solo una vez!" +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Values set here are company-specific." +msgstr "" + #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__website_message_ids msgid "Website Messages" @@ -432,6 +415,29 @@ msgstr "Mensajes del Sitio Web" msgid "Website communication history" msgstr "Historial de comunicación del Sitio Web" +#~ msgid "" +#~ "" +#~ msgstr "" +#~ "" + +#~ msgid "" +#~ "Project Roles\n" +#~ " " +#~ msgstr "" +#~ "Roles del proyecto\n" +#~ " " + #~ msgid "SMS Delivery error" #~ msgstr "Error de Entrega SMS" diff --git a/project_role/i18n/es_AR.po b/project_role/i18n/es_AR.po index b6f31e5517..33762825ad 100644 --- a/project_role/i18n/es_AR.po +++ b/project_role/i18n/es_AR.po @@ -42,30 +42,8 @@ msgstr "%(parent)s / %(own)s" #. module: project_role #: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"" -msgstr "" -"" - -#. module: project_role -#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"Project Roles\n" -" " +msgid "Project Roles" msgstr "" -"Roles de Proyecto\n" -" " #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__message_needaction @@ -90,11 +68,11 @@ msgstr "Archivado" #. odoo-python #: code:addons/project_role/models/project_assignment.py:0 msgid "" -"Assignment %(ASSIGNMENT)s conflicts with another assignment: " -"%(OTHER_ASSIGNMENT)s" +"Assignment %(ASSIGNMENT)s conflicts with another assignment: %" +"(OTHER_ASSIGNMENT)s" msgstr "" -"La tarea %(ASSIGNMENT)s entra en conflicto con otra tarea: " -"%(OTHER_ASSIGNMENT)s" +"La tarea %(ASSIGNMENT)s entra en conflicto con otra tarea: %" +"(OTHER_ASSIGNMENT)s" #. module: project_role #: model:ir.actions.act_window,name:project_role.project_assignment_view_project_action @@ -422,6 +400,11 @@ msgstr "" msgid "User may be assigned per role only once!" msgstr "¡El usuario puede ser asignado por rol solo una vez!" +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Values set here are company-specific." +msgstr "" + #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__website_message_ids msgid "Website Messages" @@ -432,6 +415,29 @@ msgstr "Mensajes del Sitio Web" msgid "Website communication history" msgstr "Historial de comunicación del Sitio Web" +#~ msgid "" +#~ "" +#~ msgstr "" +#~ "" + +#~ msgid "" +#~ "Project Roles\n" +#~ " " +#~ msgstr "" +#~ "Roles de Proyecto\n" +#~ " " + #~ msgid "SMS Delivery error" #~ msgstr "Error de Entrega SMS" diff --git a/project_role/i18n/es_PA.po b/project_role/i18n/es_PA.po index 60a511f04e..69b331ab7e 100644 --- a/project_role/i18n/es_PA.po +++ b/project_role/i18n/es_PA.po @@ -40,20 +40,7 @@ msgstr "" #. module: project_role #: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"" -msgstr "" - -#. module: project_role -#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"Project Roles\n" -" " +msgid "Project Roles" msgstr "" #. module: project_role @@ -79,8 +66,8 @@ msgstr "" #. odoo-python #: code:addons/project_role/models/project_assignment.py:0 msgid "" -"Assignment %(ASSIGNMENT)s conflicts with another assignment: " -"%(OTHER_ASSIGNMENT)s" +"Assignment %(ASSIGNMENT)s conflicts with another assignment: %" +"(OTHER_ASSIGNMENT)s" msgstr "" #. module: project_role @@ -402,6 +389,11 @@ msgstr "" msgid "User may be assigned per role only once!" msgstr "" +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Values set here are company-specific." +msgstr "" + #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__website_message_ids msgid "Website Messages" diff --git a/project_role/i18n/fr.po b/project_role/i18n/fr.po index f20831d032..c6ab1618a8 100644 --- a/project_role/i18n/fr.po +++ b/project_role/i18n/fr.po @@ -42,20 +42,7 @@ msgstr "" #. module: project_role #: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"" -msgstr "" - -#. module: project_role -#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"Project Roles\n" -" " +msgid "Project Roles" msgstr "" #. module: project_role @@ -81,8 +68,8 @@ msgstr "Archivé" #. odoo-python #: code:addons/project_role/models/project_assignment.py:0 msgid "" -"Assignment %(ASSIGNMENT)s conflicts with another assignment: " -"%(OTHER_ASSIGNMENT)s" +"Assignment %(ASSIGNMENT)s conflicts with another assignment: %" +"(OTHER_ASSIGNMENT)s" msgstr "" #. module: project_role @@ -413,6 +400,11 @@ msgstr "" msgid "User may be assigned per role only once!" msgstr "Chaque rôle ne peut être attribué qu'une seule fois à un utilisateur !" +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Values set here are company-specific." +msgstr "" + #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__website_message_ids msgid "Website Messages" diff --git a/project_role/i18n/hr.po b/project_role/i18n/hr.po index d67024a515..5dbc749c53 100644 --- a/project_role/i18n/hr.po +++ b/project_role/i18n/hr.po @@ -43,29 +43,8 @@ msgstr "%(parent)s / %(own)s" #. module: project_role #: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"" -msgstr "" -"" - -#. module: project_role -#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"Project Roles\n" -" " +msgid "Project Roles" msgstr "" -"Uloge na projektima\n" -" " #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__message_needaction @@ -90,8 +69,8 @@ msgstr "Arhivirano" #. odoo-python #: code:addons/project_role/models/project_assignment.py:0 msgid "" -"Assignment %(ASSIGNMENT)s conflicts with another assignment: " -"%(OTHER_ASSIGNMENT)s" +"Assignment %(ASSIGNMENT)s conflicts with another assignment: %" +"(OTHER_ASSIGNMENT)s" msgstr "" "Uloga %(ASSIGNMENT)s je u sukobu sa drugom ulogom: %(OTHER_ASSIGNMENT)s" @@ -416,6 +395,11 @@ msgstr "Korisniku može biti dodijeljeno zaduženje samo unutar projekta!" msgid "User may be assigned per role only once!" msgstr "Korisniku zaduženje može biti dodijeljeno samo jednom!" +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Values set here are company-specific." +msgstr "" + #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__website_message_ids msgid "Website Messages" @@ -426,6 +410,28 @@ msgstr "Poruke sa webstranica" msgid "Website communication history" msgstr "Povijest komunikacije webstranica" +#~ msgid "" +#~ "" +#~ msgstr "" +#~ "" + +#~ msgid "" +#~ "Project Roles\n" +#~ " " +#~ msgstr "" +#~ "Uloge na projektima\n" +#~ " " + #~ msgid "SMS Delivery error" #~ msgstr "Greška isporuke SMSa" diff --git a/project_role/i18n/it.po b/project_role/i18n/it.po index 8df1cd0215..1a8032a2c1 100644 --- a/project_role/i18n/it.po +++ b/project_role/i18n/it.po @@ -42,29 +42,8 @@ msgstr "%(parent)s / %(own)s" #. module: project_role #: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"" -msgstr "" -"" - -#. module: project_role -#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"Project Roles\n" -" " +msgid "Project Roles" msgstr "" -"Ruoli progetto\n" -" " #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__message_needaction @@ -89,11 +68,11 @@ msgstr "In archivio" #. odoo-python #: code:addons/project_role/models/project_assignment.py:0 msgid "" -"Assignment %(ASSIGNMENT)s conflicts with another assignment: " -"%(OTHER_ASSIGNMENT)s" +"Assignment %(ASSIGNMENT)s conflicts with another assignment: %" +"(OTHER_ASSIGNMENT)s" msgstr "" -"L'incarico %(ASSIGNMENT)s è in conflitto con un altro incarico: " -"%(OTHER_ASSIGNMENT)s" +"L'incarico %(ASSIGNMENT)s è in conflitto con un altro incarico: %" +"(OTHER_ASSIGNMENT)s" #. module: project_role #: model:ir.actions.act_window,name:project_role.project_assignment_view_project_action @@ -421,6 +400,11 @@ msgstr "" msgid "User may be assigned per role only once!" msgstr "Un utente può essere assegnato ad un ruolo alla volta!" +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Values set here are company-specific." +msgstr "" + #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__website_message_ids msgid "Website Messages" @@ -431,6 +415,29 @@ msgstr "Messaggi sito web" msgid "Website communication history" msgstr "Storico comunicazioni sito web" +#~ msgid "" +#~ "" +#~ msgstr "" +#~ "" + +#~ msgid "" +#~ "Project Roles\n" +#~ " " +#~ msgstr "" +#~ "Ruoli progetto\n" +#~ " " + #~ msgid "SMS Delivery error" #~ msgstr "Errore consegna SMS" diff --git a/project_role/i18n/nl.po b/project_role/i18n/nl.po index 6380c6f050..5d4580804f 100644 --- a/project_role/i18n/nl.po +++ b/project_role/i18n/nl.po @@ -42,29 +42,8 @@ msgstr "" #. module: project_role #: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"" -msgstr "" -"" - -#. module: project_role -#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"Project Roles\n" -" " +msgid "Project Roles" msgstr "" -"Projectrollen\n" -" " #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__message_needaction @@ -89,11 +68,11 @@ msgstr "Gearchiveerd" #. odoo-python #: code:addons/project_role/models/project_assignment.py:0 msgid "" -"Assignment %(ASSIGNMENT)s conflicts with another assignment: " -"%(OTHER_ASSIGNMENT)s" +"Assignment %(ASSIGNMENT)s conflicts with another assignment: %" +"(OTHER_ASSIGNMENT)s" msgstr "" -"Opdracht %(ASSIGNMENT)s conflicteert met een andere opdracht: " -"%(OTHER_ASSIGNMENT)s" +"Opdracht %(ASSIGNMENT)s conflicteert met een andere opdracht: %" +"(OTHER_ASSIGNMENT)s" #. module: project_role #: model:ir.actions.act_window,name:project_role.project_assignment_view_project_action @@ -396,8 +375,8 @@ msgstr "Gebruiker" #: code:addons/project_role/models/project_assignment.py:0 msgid "User %(USER)s can not be assigned to role %(ROLE)s on %(PROJECT)s." msgstr "" -"Gebruiker %(USER)s kan niet worden toegewezen aan de rol %(ROLE)s op " -"%(PROJECT)s." +"Gebruiker %(USER)s kan niet worden toegewezen aan de rol %(ROLE)s op %" +"(PROJECT)s." #. module: project_role #. odoo-python @@ -424,6 +403,11 @@ msgstr "" msgid "User may be assigned per role only once!" msgstr "Gebruiker kan per rol slechts één keer worden toegewezen!" +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Values set here are company-specific." +msgstr "" + #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__website_message_ids msgid "Website Messages" @@ -434,6 +418,28 @@ msgstr "Websiteberichten" msgid "Website communication history" msgstr "Communicatiegeschiedenis van websites" +#~ msgid "" +#~ "" +#~ msgstr "" +#~ "" + +#~ msgid "" +#~ "Project Roles\n" +#~ " " +#~ msgstr "" +#~ "Projectrollen\n" +#~ " " + #~ msgid "SMS Delivery error" #~ msgstr "SMS-bezorgfout" diff --git a/project_role/i18n/pt_BR.po b/project_role/i18n/pt_BR.po index a96caf35f2..1ff7de61a1 100644 --- a/project_role/i18n/pt_BR.po +++ b/project_role/i18n/pt_BR.po @@ -40,20 +40,7 @@ msgstr "" #. module: project_role #: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"" -msgstr "" - -#. module: project_role -#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"Project Roles\n" -" " +msgid "Project Roles" msgstr "" #. module: project_role @@ -79,8 +66,8 @@ msgstr "" #. odoo-python #: code:addons/project_role/models/project_assignment.py:0 msgid "" -"Assignment %(ASSIGNMENT)s conflicts with another assignment: " -"%(OTHER_ASSIGNMENT)s" +"Assignment %(ASSIGNMENT)s conflicts with another assignment: %" +"(OTHER_ASSIGNMENT)s" msgstr "" #. module: project_role @@ -402,6 +389,11 @@ msgstr "" msgid "User may be assigned per role only once!" msgstr "" +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Values set here are company-specific." +msgstr "" + #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__website_message_ids msgid "Website Messages" diff --git a/project_role/i18n/sl.po b/project_role/i18n/sl.po index 55ed12fc8e..7b0efd988f 100644 --- a/project_role/i18n/sl.po +++ b/project_role/i18n/sl.po @@ -43,29 +43,8 @@ msgstr "%(parent)s / %(own)s" #. module: project_role #: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"" -msgstr "" -"" - -#. module: project_role -#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form -msgid "" -"Project Roles\n" -" " +msgid "Project Roles" msgstr "" -"Projektne vloge\n" -" " #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__message_needaction @@ -90,8 +69,8 @@ msgstr "Arhivirano" #. odoo-python #: code:addons/project_role/models/project_assignment.py:0 msgid "" -"Assignment %(ASSIGNMENT)s conflicts with another assignment: " -"%(OTHER_ASSIGNMENT)s" +"Assignment %(ASSIGNMENT)s conflicts with another assignment: %" +"(OTHER_ASSIGNMENT)s" msgstr "" #. module: project_role @@ -416,6 +395,11 @@ msgstr "Uporabniku se lahko dodeli določena vloga le enkrat v sklopu projekta!" msgid "User may be assigned per role only once!" msgstr "Uporabniku se lahko dodeli določeno vlogo le enkrat!" +#. module: project_role +#: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form +msgid "Values set here are company-specific." +msgstr "" + #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__website_message_ids msgid "Website Messages" @@ -426,6 +410,29 @@ msgstr "Sporočila spletne strani" msgid "Website communication history" msgstr "Kronologija komunikacij spletne strani" +#~ msgid "" +#~ "" +#~ msgstr "" +#~ "" + +#~ msgid "" +#~ "Project Roles\n" +#~ " " +#~ msgstr "" +#~ "Projektne vloge\n" +#~ " " + #, fuzzy #~ msgid "SMS Delivery error" #~ msgstr "Napaka ob dostavi sporočila" From ede3f6ba2374082617f25d3970b39770b2a01cf3 Mon Sep 17 00:00:00 2001 From: mymage Date: Mon, 2 Mar 2026 13:14:27 +0000 Subject: [PATCH 39/45] Translated using Weblate (Italian) Currently translated at 100.0% (71 of 71 strings) Translation: project-18.0/project-18.0-project_role Translate-URL: https://translation.odoo-community.org/projects/project-18-0/project-18-0-project_role/it/ --- project_role/i18n/it.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/project_role/i18n/it.po b/project_role/i18n/it.po index 1a8032a2c1..7b55070358 100644 --- a/project_role/i18n/it.po +++ b/project_role/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-02-10 10:06+0000\n" +"PO-Revision-Date: 2026-03-02 18:45+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.6.2\n" +"X-Generator: Weblate 5.15.2\n" #. module: project_role #. odoo-python @@ -43,7 +43,7 @@ msgstr "%(parent)s / %(own)s" #. module: project_role #: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form msgid "Project Roles" -msgstr "" +msgstr "Ruoli progetto" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__message_needaction @@ -403,7 +403,7 @@ msgstr "Un utente può essere assegnato ad un ruolo alla volta!" #. module: project_role #: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form msgid "Values set here are company-specific." -msgstr "" +msgstr "I valori impostati qui sono specifici per azienda." #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__website_message_ids From 7a6202ee9115283fbfb3955fca80889a536e0db8 Mon Sep 17 00:00:00 2001 From: Ed-Spain Date: Sat, 9 May 2026 09:15:58 +0000 Subject: [PATCH 40/45] Translated using Weblate (Spanish) Currently translated at 100.0% (71 of 71 strings) Translation: project-18.0/project-18.0-project_role Translate-URL: https://translation.odoo-community.org/projects/project-18-0/project-18-0-project_role/es/ --- project_role/i18n/es.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/project_role/i18n/es.po b/project_role/i18n/es.po index 516f0df241..80f2ee68bf 100644 --- a/project_role/i18n/es.po +++ b/project_role/i18n/es.po @@ -6,15 +6,15 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2023-09-20 20:21+0000\n" -"Last-Translator: Ivorra78 \n" +"PO-Revision-Date: 2026-05-09 09:30+0000\n" +"Last-Translator: Ed-Spain \n" "Language-Team: none\n" "Language: es\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 4.17\n" +"X-Generator: Weblate 5.15.2\n" #. module: project_role #. odoo-python @@ -43,7 +43,7 @@ msgstr "%(parent)s / %(own)s" #. module: project_role #: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form msgid "Project Roles" -msgstr "" +msgstr "Roles del proyecto" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__message_needaction @@ -330,7 +330,7 @@ msgstr "Proyectos que Heredan Asignaciones de la Compañía" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__rating_ids msgid "Ratings" -msgstr "" +msgstr "Calificaciones" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__role_id @@ -403,7 +403,7 @@ msgstr "¡El usuario puede ser asignado por rol solo una vez!" #. module: project_role #: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form msgid "Values set here are company-specific." -msgstr "" +msgstr "Los valores establecidos aquí son específicos de la empresa." #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__website_message_ids From 76e06ce2603326594a91ca18dec96959e0c8c915 Mon Sep 17 00:00:00 2001 From: Matjaz Mozetic Date: Sat, 6 Jun 2026 06:38:03 +0000 Subject: [PATCH 41/45] Translated using Weblate (Slovenian) Currently translated at 80.2% (57 of 71 strings) Translation: project-18.0/project-18.0-project_role Translate-URL: https://translation.odoo-community.org/projects/project-18-0/project-18-0-project_role/sl/ --- project_role/i18n/sl.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/project_role/i18n/sl.po b/project_role/i18n/sl.po index 7b0efd988f..878ea76b3a 100644 --- a/project_role/i18n/sl.po +++ b/project_role/i18n/sl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2023-04-12 13:35+0000\n" +"PO-Revision-Date: 2026-06-06 06:39+0000\n" "Last-Translator: Matjaz Mozetic \n" "Language-Team: none\n" "Language: sl\n" @@ -15,7 +15,7 @@ msgstr "" "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 4.14.1\n" +"X-Generator: Weblate 5.15.2\n" #. module: project_role #. odoo-python @@ -267,7 +267,7 @@ msgstr "" #. module: project_role #: model:ir.model.fields,help:project_role.field_project_assignment__message_has_error_counter msgid "Number of messages with delivery error" -msgstr "Število sporočil z napako ob dostavi" +msgstr "Število sporočil, ki niso bila pravilno dostavljena" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_role__parent_path From 50a0145d7840db92d3dc7f4f6bfbc14ea13f25a7 Mon Sep 17 00:00:00 2001 From: Matjaz Mozetic Date: Sun, 7 Jun 2026 16:53:18 +0000 Subject: [PATCH 42/45] Translated using Weblate (Slovenian) Currently translated at 80.2% (57 of 71 strings) Translation: project-18.0/project-18.0-project_role Translate-URL: https://translation.odoo-community.org/projects/project-18-0/project-18-0-project_role/sl/ --- project_role/i18n/sl.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/project_role/i18n/sl.po b/project_role/i18n/sl.po index 878ea76b3a..fbeaa9940f 100644 --- a/project_role/i18n/sl.po +++ b/project_role/i18n/sl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-06-06 06:39+0000\n" +"PO-Revision-Date: 2026-06-07 16:57+0000\n" "Last-Translator: Matjaz Mozetic \n" "Language-Team: none\n" "Language: sl\n" @@ -190,8 +190,8 @@ msgstr "Če označeno pomeni, da nova sporočila zahtevajo vašo pozornost." #: model:ir.model.fields,help:project_role.field_project_assignment__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." +"Kadar je označeno, pomeni, da je pri nekaterih sporočilih prišlo do napake " +"pri dostavi." #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_project__inherit_assignments From 686d50795bf2ef9815a5755c8b189804ee503818 Mon Sep 17 00:00:00 2001 From: Matjaz Mozetic Date: Tue, 9 Jun 2026 04:56:19 +0000 Subject: [PATCH 43/45] Translated using Weblate (Slovenian) Currently translated at 100.0% (71 of 71 strings) Translation: project-18.0/project-18.0-project_role Translate-URL: https://translation.odoo-community.org/projects/project-18-0/project-18-0-project_role/sl/ --- project_role/i18n/sl.po | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/project_role/i18n/sl.po b/project_role/i18n/sl.po index fbeaa9940f..ebd1482b40 100644 --- a/project_role/i18n/sl.po +++ b/project_role/i18n/sl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-06-07 16:57+0000\n" +"PO-Revision-Date: 2026-06-09 07:09+0000\n" "Last-Translator: Matjaz Mozetic \n" "Language-Team: none\n" "Language: sl\n" @@ -21,19 +21,19 @@ msgstr "" #. odoo-python #: code:addons/project_role/models/project_assignment.py:0 msgid "%(USER)s as %(ROLE)s" -msgstr "" +msgstr "%(USER)s kot %(ROLE)s" #. module: project_role #. odoo-python #: code:addons/project_role/models/project_assignment.py:0 msgid "%(USER)s as %(ROLE)s in %(PROJECT)s" -msgstr "" +msgstr "%(USER)s kot %(ROLE)s na %(PROJECT)s" #. module: project_role #. odoo-python #: code:addons/project_role/models/project_assignment.py:0 msgid "%(USER)s as %(ROLE)s on %(PROJECT)s" -msgstr "" +msgstr "%(USER)s kot %(ROLE)s na %(PROJECT)s" #. module: project_role #. odoo-python @@ -44,7 +44,7 @@ msgstr "%(parent)s / %(own)s" #. module: project_role #: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form msgid "Project Roles" -msgstr "" +msgstr "Projektne vloge" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__message_needaction @@ -71,7 +71,7 @@ msgstr "Arhivirano" msgid "" "Assignment %(ASSIGNMENT)s conflicts with another assignment: %" "(OTHER_ASSIGNMENT)s" -msgstr "" +msgstr "Zadolžitev %(ASSIGNMENT)s je v konfliktu z: %(OTHER_ASSIGNMENT)s" #. module: project_role #: model:ir.actions.act_window,name:project_role.project_assignment_view_project_action @@ -173,7 +173,7 @@ msgstr "Združi po" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__has_message msgid "Has Message" -msgstr "" +msgstr "Vsebuje sporočilo" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__id @@ -196,7 +196,7 @@ msgstr "" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_project__inherit_assignments msgid "Inherit Assignments" -msgstr "" +msgstr "Deduj zadolžitve" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__message_is_follower @@ -225,7 +225,7 @@ msgstr "Omeji projektne vloge na zadolžitve" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_project__limit_role_to_assignments msgid "Limit Role To Assignments" -msgstr "" +msgstr "Omeji vlogo na zadolžitve" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__message_has_error @@ -255,14 +255,13 @@ msgstr "Število ukrepov" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__message_has_error_counter -#, fuzzy msgid "Number of errors" msgstr "Število napak" #. module: project_role #: model:ir.model.fields,help:project_role.field_project_assignment__message_needaction_counter msgid "Number of messages requiring action" -msgstr "" +msgstr "Število sporočil, ki zahtevajo ukrepanje" #. module: project_role #: model:ir.model.fields,help:project_role.field_project_assignment__message_has_error_counter @@ -328,7 +327,7 @@ msgstr "Projekti dedujejo zadolžitve iz družbe" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__rating_ids msgid "Ratings" -msgstr "" +msgstr "Ocene" #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__role_id @@ -372,13 +371,13 @@ msgstr "Uporabnik" #. odoo-python #: code:addons/project_role/models/project_assignment.py:0 msgid "User %(USER)s can not be assigned to role %(ROLE)s on %(PROJECT)s." -msgstr "" +msgstr "Uporabniku %(USER)s ni mogoče dodeliti vloge %(ROLE)s na %(PROJECT)s." #. module: project_role #. odoo-python #: code:addons/project_role/models/project_assignment.py:0 msgid "User %(USER)s can not be assigned to role %(ROLE)s." -msgstr "" +msgstr "Uporabniku %(USER)s ni mogoče dodeliti vloge %(ROLE)s." #. module: project_role #: model:ir.model.constraint,message:project_role.constraint_project_assignment_company_role_user_uniq @@ -398,7 +397,7 @@ msgstr "Uporabniku se lahko dodeli določeno vlogo le enkrat!" #. module: project_role #: model_terms:ir.ui.view,arch_db:project_role.res_config_settings_view_form msgid "Values set here are company-specific." -msgstr "" +msgstr "Vrednosti, nastavljene tukaj, so specifične za družbo." #. module: project_role #: model:ir.model.fields,field_description:project_role.field_project_assignment__website_message_ids From 27f0d8f72355e720b8734177cc5272659b067bef Mon Sep 17 00:00:00 2001 From: angelmoya Date: Fri, 12 Jun 2026 19:16:00 +0200 Subject: [PATCH 44/45] [IMP] project_role: pre-commit auto fixes --- project_role/models/project_role.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_role/models/project_role.py b/project_role/models/project_role.py index ec954d3328..aa1658bc27 100644 --- a/project_role/models/project_role.py +++ b/project_role/models/project_role.py @@ -55,7 +55,7 @@ class ProjectRole(models.Model): ), ( "name_nocompany_uniq", - ("EXCLUDE (name WITH =) WHERE (" " company_id IS NULL" ")"), + ("EXCLUDE (name WITH =) WHERE ( company_id IS NULL)"), "Shared role with such name already exists!", ), ] From bcf284cca7e59cefe18e54dfcddb884d81a6a755 Mon Sep 17 00:00:00 2001 From: angelmoya Date: Fri, 12 Jun 2026 19:19:29 +0200 Subject: [PATCH 45/45] [MIG] project_role: Migration to 19.0 --- project_role/README.rst | 10 +- project_role/__manifest__.py | 2 +- project_role/models/project_assignment.py | 102 ++++++++++----------- project_role/models/project_project.py | 4 +- project_role/models/project_role.py | 43 ++++----- project_role/static/description/index.html | 6 +- project_role/tests/test_project_role.py | 19 ++-- project_role/views/project_assignment.xml | 2 +- 8 files changed, 91 insertions(+), 97 deletions(-) diff --git a/project_role/README.rst b/project_role/README.rst index 86b6ef9e22..790ccdb2fa 100644 --- a/project_role/README.rst +++ b/project_role/README.rst @@ -21,13 +21,13 @@ Project Roles :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/18.0/project_role + :target: https://github.com/OCA/project/tree/19.0/project_role :alt: OCA/project .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/project-18-0/project-18-0-project_role + :target: https://translation.odoo-community.org/projects/project-19-0/project-19-0-project_role :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/project&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/project&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -73,7 +73,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 to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -116,6 +116,6 @@ Current `maintainer `__: |maintainer-alexey-pelykh| -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_role/__manifest__.py b/project_role/__manifest__.py index c74b451d02..ce936c58a5 100644 --- a/project_role/__manifest__.py +++ b/project_role/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Project Roles", - "version": "18.0.1.0.1", + "version": "19.0.1.0.0", "category": "Project", "website": "https://github.com/OCA/project", "author": "CorporateHub, Odoo Community Association (OCA)", diff --git a/project_role/models/project_assignment.py b/project_role/models/project_assignment.py index 4f4b5c08e1..b5e89b3b24 100644 --- a/project_role/models/project_assignment.py +++ b/project_role/models/project_assignment.py @@ -1,7 +1,7 @@ # Copyright 2018-2019 Brainbean Apps (https://brainbeanapps.com) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import _, api, fields, models +from odoo import api, fields, models from odoo.exceptions import ValidationError @@ -42,33 +42,24 @@ class ProjectAssignment(models.Model): ondelete="restrict", ) - _sql_constraints = [ - ( - "project_role_user_uniq", - "UNIQUE (project_id, role_id, user_id)", - "User may be assigned per role only once within a project!", - ), + _project_role_user_uniq = models.Constraint( + "UNIQUE (project_id, role_id, user_id)", + "User may be assigned per role only once within a project!", + ) + _company_role_user_uniq = models.Constraint( ( - "company_role_user_uniq", - ( - "EXCLUDE (" - " company_id WITH =, role_id WITH =, user_id WITH =" - ") WHERE (" - " project_id IS NULL" - ")" - ), - "User may be assigned per role only once within a company!", + "EXCLUDE (company_id WITH =, role_id WITH =, user_id WITH =) " + "WHERE (project_id IS NULL)" ), + "User may be assigned per role only once within a company!", + ) + _nocompany_role_user_uniq = models.Constraint( ( - "nocompany_role_user_uniq", - ( - "EXCLUDE (role_id WITH =, user_id WITH =) WHERE (" - " project_id IS NULL AND company_id IS NULL" - ")" - ), - "User may be assigned per role only once!", + "EXCLUDE (role_id WITH =, user_id WITH =) " + "WHERE (project_id IS NULL AND company_id IS NULL)" ), - ] + "User may be assigned per role only once!", + ) @api.depends( "company_id.name", @@ -79,22 +70,25 @@ class ProjectAssignment(models.Model): def _compute_name(self): for assignment in self: if assignment.project_id: - assignment.name = _("%(USER)s as %(ROLE)s on %(PROJECT)s") % { - "USER": assignment.user_id.name, - "ROLE": assignment.role_id.name, - "PROJECT": assignment.project_id.name, - } + assignment.name = self.env._( + "%(USER)s as %(ROLE)s on %(PROJECT)s", + USER=assignment.user_id.name, + ROLE=assignment.role_id.name, + PROJECT=assignment.project_id.name, + ) elif assignment.company_id: - assignment.name = _("%(USER)s as %(ROLE)s in %(PROJECT)s") % { - "USER": assignment.user_id.name, - "ROLE": assignment.role_id.name, - "PROJECT": assignment.company_id.name, - } + assignment.name = self.env._( + "%(USER)s as %(ROLE)s in %(PROJECT)s", + USER=assignment.user_id.name, + ROLE=assignment.role_id.name, + PROJECT=assignment.company_id.name, + ) else: - assignment.name = _("%(USER)s as %(ROLE)s") % { - "USER": assignment.user_id.name, - "ROLE": assignment.role_id.name, - } + assignment.name = self.env._( + "%(USER)s as %(ROLE)s", + USER=assignment.user_id.name, + ROLE=assignment.role_id.name, + ) def _get_conflicting_domain(self): self.ensure_one() @@ -129,30 +123,28 @@ def _check(self): ) if conflicting_assignment: raise ValidationError( - _( + self.env._( "Assignment %(ASSIGNMENT)s conflicts with another assignment: " - "%(OTHER_ASSIGNMENT)s" + "%(OTHER_ASSIGNMENT)s", + ASSIGNMENT=assignment.name, + OTHER_ASSIGNMENT=conflicting_assignment.name, ) - % { - "ASSIGNMENT": assignment.name, - "OTHER_ASSIGNMENT": conflicting_assignment.name, - } ) if not assignment.role_id.can_assign( assignment.user_id, assignment.project_id ): if assignment.project_id: - error = _( + error = self.env._( "User %(USER)s can not be assigned to role %(ROLE)s on " - "%(PROJECT)s." - ) % { - "USER": assignment.user_id.name, - "ROLE": assignment.role_id.name, - "PROJECT": assignment.project_id.name, - } + "%(PROJECT)s.", + USER=assignment.user_id.name, + ROLE=assignment.role_id.name, + PROJECT=assignment.project_id.name, + ) else: - error = _("User %(USER)s can not be assigned to role %(ROLE)s.") % { - "USER": assignment.user_id.name, - "ROLE": assignment.role_id.name, - } + error = self.env._( + "User %(USER)s can not be assigned to role %(ROLE)s.", + USER=assignment.user_id.name, + ROLE=assignment.role_id.name, + ) raise ValidationError(error) diff --git a/project_role/models/project_project.py b/project_role/models/project_project.py index f9b81113c6..995af301fe 100644 --- a/project_role/models/project_project.py +++ b/project_role/models/project_project.py @@ -23,14 +23,14 @@ class ProjectProject(models.Model): @api.model def _default_inherit_assignments(self): company = self.env["res.company"].browse( - self._context.get("company_id", self.env.user.company_id.id) + self.env.context.get("company_id", self.env.user.company_id.id) ) return company.project_inherit_assignments @api.model def _default_limit_role_to_assignments(self): company = self.env["res.company"].browse( - self._context.get("company_id", self.env.user.company_id.id) + self.env.context.get("company_id", self.env.user.company_id.id) ) return company.project_limit_role_to_assignments diff --git a/project_role/models/project_role.py b/project_role/models/project_role.py index aa1658bc27..99d6fcdb2f 100644 --- a/project_role/models/project_role.py +++ b/project_role/models/project_role.py @@ -1,7 +1,7 @@ # Copyright 2018-2019 Brainbean Apps (https://brainbeanapps.com) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import _, api, fields, models +from odoo import api, fields, models from odoo.exceptions import ValidationError from odoo.tools.translate import html_translate @@ -47,18 +47,14 @@ class ProjectRole(models.Model): ondelete="cascade", ) - _sql_constraints = [ - ( - "name_company_uniq", - "UNIQUE (name, company_id)", - "Role with such name already exists in the company!", - ), - ( - "name_nocompany_uniq", - ("EXCLUDE (name WITH =) WHERE ( company_id IS NULL)"), - "Shared role with such name already exists!", - ), - ] + _name_company_uniq = models.Constraint( + "UNIQUE (name, company_id)", + "Role with such name already exists in the company!", + ) + _name_nocompany_uniq = models.Constraint( + "EXCLUDE (name WITH =) WHERE (company_id IS NULL)", + "Shared role with such name already exists!", + ) @api.constrains("name") def _check_name(self): @@ -71,18 +67,21 @@ def _check_name(self): limit=1, ): raise ValidationError( - _('Role "%s" conflicts with another role due to same name.') - % (role.name,) + self.env._( + 'Role "%s" conflicts with another role due to same name.', + role.name, + ) ) @api.depends("name", "parent_id.complete_name") def _compute_complete_name(self): for role in self: if role.parent_id: - role.complete_name = _("%(parent)s / %(own)s") % { - "parent": role.parent_id.complete_name, - "own": role.name, - } + role.complete_name = self.env._( + "%(parent)s / %(own)s", + parent=role.parent_id.complete_name, + own=role.name, + ) else: role.complete_name = role.name @@ -96,8 +95,10 @@ def _check_active(self): and not role.parent_id.active ): raise ValidationError( - _("Please activate first parent role %s") - % (role.parent_id.complete_name,) + self.env._( + "Please activate first parent role %s", + role.parent_id.complete_name, + ) ) def can_assign(self, user_id, project_id): diff --git a/project_role/static/description/index.html b/project_role/static/description/index.html index 20650eb994..6060f03632 100644 --- a/project_role/static/description/index.html +++ b/project_role/static/description/index.html @@ -374,7 +374,7 @@

Project Roles

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:abc926ba4a947d2a7227e4fd7e31b0f13ad319493f815e7d41af5053b1376817 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

+

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

This module allows maintaining project roster based on roles and assignments. List of roles is configured at company level, while assignments can be created on project, company, and cross-company @@ -421,7 +421,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 to smash it by providing a detailed and welcomed -feedback.

+feedback.

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

@@ -454,7 +454,7 @@

Maintainers

promote its widespread use.

Current maintainer:

alexey-pelykh

-

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_role/tests/test_project_role.py b/project_role/tests/test_project_role.py index cbab08f381..8a473aea2f 100644 --- a/project_role/tests/test_project_role.py +++ b/project_role/tests/test_project_role.py @@ -14,15 +14,16 @@ class TestProjectRole(common.TransactionCase): - def setUp(self): - super().setUp() - - self.ResUsers = self.env["res.users"] - self.Company = self.env["res.company"] - self.Project = self.env["project.project"] - self.Role = self.env["project.role"] - self.Assignment = self.env["project.assignment"] - self.company_id = self.env.user.company_id + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.ResUsers = cls.env["res.users"] + cls.Company = cls.env["res.company"] + cls.Project = cls.env["project.project"] + cls.Role = cls.env["project.role"] + cls.Assignment = cls.env["project.assignment"] + cls.company_id = cls.env.user.company_id def test_create_assignment(self): user = self.ResUsers.sudo().create( diff --git a/project_role/views/project_assignment.xml b/project_role/views/project_assignment.xml index d41900e993..18d84e3d62 100644 --- a/project_role/views/project_assignment.xml +++ b/project_role/views/project_assignment.xml @@ -143,7 +143,7 @@ string="Archived" domain="[('active','=',False)]" /> - +