From 9b0d84bc2f419f9239fda887a2332e3101aab221 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Tue, 20 Nov 2018 08:18:08 +0200 Subject: [PATCH 01/27] [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 fcefb98521619d429f412c67827f459e7487a50d Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 3 Apr 2019 03:14:46 +0000 Subject: [PATCH 02/27] [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 6acbb0c2acd125862e86084c78ed77b6a3e2e129 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Wed, 3 Apr 2019 11:48:34 +0300 Subject: [PATCH 03/27] [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 5d3b5e1e7e9481934cee6862d40ecfc6fd178959 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Mon, 8 Apr 2019 13:14:16 +0300 Subject: [PATCH 04/27] [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 f77383fd814706eef7a040346a8d7a7ea546fcbc Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Fri, 17 May 2019 09:51:05 +0300 Subject: [PATCH 05/27] [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 0a05ef61cd005b55f16800bde0327228f00e0f25 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Fri, 5 Jul 2019 09:09:28 +0300 Subject: [PATCH 06/27] [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