From 4f89314fc964571a29177a9a57ee66e1077d7215 Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Tue, 12 Nov 2019 20:31:57 +0000 Subject: [PATCH 01/17] [ADD] hr_timesheet_sheet: policies --- .../README.rst | 73 +++ .../__init__.py | 3 + .../__manifest__.py | 21 + ...timesheet_sheet_policy_project_manager.pot | 85 ++++ .../models/__init__.py | 5 + .../models/account_analytic_line.py | 17 + .../models/hr_timesheet_sheet.py | 128 ++++++ .../models/res_company.py | 14 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 1 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 419 ++++++++++++++++++ .../tests/__init__.py | 3 + ..._timesheet_sheet_policy_project_manager.py | 217 +++++++++ .../views/hr_timesheet_sheet.xml | 42 ++ 15 files changed, 1029 insertions(+) create mode 100644 hr_timesheet_sheet_policy_project_manager/README.rst create mode 100644 hr_timesheet_sheet_policy_project_manager/__init__.py create mode 100644 hr_timesheet_sheet_policy_project_manager/__manifest__.py create mode 100644 hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot create mode 100644 hr_timesheet_sheet_policy_project_manager/models/__init__.py create mode 100644 hr_timesheet_sheet_policy_project_manager/models/account_analytic_line.py create mode 100644 hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py create mode 100644 hr_timesheet_sheet_policy_project_manager/models/res_company.py create mode 100644 hr_timesheet_sheet_policy_project_manager/readme/CONTRIBUTORS.rst create mode 100644 hr_timesheet_sheet_policy_project_manager/readme/DESCRIPTION.rst create mode 100644 hr_timesheet_sheet_policy_project_manager/static/description/icon.png create mode 100644 hr_timesheet_sheet_policy_project_manager/static/description/index.html create mode 100644 hr_timesheet_sheet_policy_project_manager/tests/__init__.py create mode 100644 hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py create mode 100644 hr_timesheet_sheet_policy_project_manager/views/hr_timesheet_sheet.xml diff --git a/hr_timesheet_sheet_policy_project_manager/README.rst b/hr_timesheet_sheet_policy_project_manager/README.rst new file mode 100644 index 0000000000..9f05a83ac3 --- /dev/null +++ b/hr_timesheet_sheet_policy_project_manager/README.rst @@ -0,0 +1,73 @@ +========================================== +HR Timesheet Sheet: Project Manager Policy +========================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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%2Ftimesheet-lightgray.png?logo=github + :target: https://github.com/OCA/timesheet/tree/12.0/hr_timesheet_sheet_policy_project_manager + :alt: OCA/timesheet +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/timesheet-12-0/timesheet-12-0-hr_timesheet_sheet_policy_project_manager + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/117/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows setting Department Manager as Reviewer on Timesheet Sheets. + +**Table of contents** + +.. contents:: + :local: + +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/timesheet `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/hr_timesheet_sheet_policy_project_manager/__init__.py b/hr_timesheet_sheet_policy_project_manager/__init__.py new file mode 100644 index 0000000000..31660d6a96 --- /dev/null +++ b/hr_timesheet_sheet_policy_project_manager/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models diff --git a/hr_timesheet_sheet_policy_project_manager/__manifest__.py b/hr_timesheet_sheet_policy_project_manager/__manifest__.py new file mode 100644 index 0000000000..78a4c5337b --- /dev/null +++ b/hr_timesheet_sheet_policy_project_manager/__manifest__.py @@ -0,0 +1,21 @@ +# Copyright 2019 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + 'name': 'HR Timesheet Sheet: Project Manager Policy', + 'version': '12.0.1.0.0', + 'author': + 'Brainbean Apps, ' + 'Odoo Community Association (OCA)', + 'website': 'https://github.com/OCA/timesheet/', + 'license': 'AGPL-3', + 'category': 'Human Resources', + 'summary': 'Allows setting Project Manager as Reviewer', + 'depends': [ + 'hr_timesheet_sheet', + ], + 'data': [ + 'views/hr_timesheet_sheet.xml', + ], + 'installable': True, +} diff --git a/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot b/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot new file mode 100644 index 0000000000..58b6829004 --- /dev/null +++ b/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot @@ -0,0 +1,85 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_timesheet_sheet_policy_project_manager +# +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: hr_timesheet_sheet_policy_project_manager +#: model:ir.model,name:hr_timesheet_sheet_policy_project_manager.model_account_analytic_line +msgid "Analytic Line" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: selection:res.company,timesheet_sheet_review_policy:0 +msgid "By Department Manager" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: selection:res.company,timesheet_sheet_review_policy:0 +msgid "By Direct Manager" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: selection:res.company,timesheet_sheet_review_policy:0 +msgid "By HR Manager/Officer" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: selection:res.company,timesheet_sheet_review_policy:0 +msgid "By Project Manager" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model,name:hr_timesheet_sheet_policy_project_manager.model_res_company +msgid "Companies" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model.fields,help:hr_timesheet_sheet_policy_project_manager.field_res_company__timesheet_sheet_review_policy +msgid "How Timesheet Sheets review is performed." +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:98 +#, python-format +msgid "Only a Project Manager can review the sheet." +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_hr_timesheet_sheet__project_id +#: model_terms:ir.ui.view,arch_db:hr_timesheet_sheet_policy_project_manager.view_hr_timesheet_sheet_filter +msgid "Project" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:116 +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:125 +#, python-format +msgid "Review policy \"By Project Manager\" requires Project to be set" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:61 +#, python-format +msgid "The Company in the Timesheet Sheet and in the Project must be the same." +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model,name:hr_timesheet_sheet_policy_project_manager.model_hr_timesheet_sheet +msgid "Timesheet Sheet" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company__timesheet_sheet_review_policy +msgid "Timesheet Sheet Review Policy" +msgstr "" + diff --git a/hr_timesheet_sheet_policy_project_manager/models/__init__.py b/hr_timesheet_sheet_policy_project_manager/models/__init__.py new file mode 100644 index 0000000000..e9063b6e39 --- /dev/null +++ b/hr_timesheet_sheet_policy_project_manager/models/__init__.py @@ -0,0 +1,5 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import account_analytic_line +from . import hr_timesheet_sheet +from . import res_company diff --git a/hr_timesheet_sheet_policy_project_manager/models/account_analytic_line.py b/hr_timesheet_sheet_policy_project_manager/models/account_analytic_line.py new file mode 100644 index 0000000000..c134c216ca --- /dev/null +++ b/hr_timesheet_sheet_policy_project_manager/models/account_analytic_line.py @@ -0,0 +1,17 @@ +# Copyright 2019 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import api, models + + +class AccountAnalyticLine(models.Model): + _inherit = 'account.analytic.line' + + @api.multi + def _get_sheet_domain(self): + domain = super()._get_sheet_domain() + if self.company_id.timesheet_sheet_review_policy == 'project_manager': + domain += [ + ('project_id', '=', self.project_id.id), + ] + return domain diff --git a/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py b/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py new file mode 100644 index 0000000000..84d2557aef --- /dev/null +++ b/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py @@ -0,0 +1,128 @@ +# Copyright 2019 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError, UserError + + +class HrTimesheetSheet(models.Model): + _inherit = 'hr_timesheet.sheet' + + project_id = fields.Many2one( + string='Project', + comodel_name='project.project', + readonly=True, + states={'new': [('readonly', False)]}, + ) + + @api.multi + @api.depends('project_id.user_id') + def _compute_project_manager_as_reviewer(self): + self._compute_possible_reviewer_ids() + + @api.depends('project_id') + def _compute_complete_name_project_id(self): + self._compute_complete_name() + + @api.multi + def _get_complete_name_components(self): + self.ensure_one() + result = super()._get_complete_name_components() + if self.review_policy == 'project_manager': + result += [self.project_id.name_get()[0][1]] + return result + + @api.multi + def _get_overlapping_sheet_domain(self): + domain = super()._get_overlapping_sheet_domain() + if self.review_policy == 'project_manager': + domain += [ + ('project_id', '=', self.project_id.id), + ] + return domain + + @api.constrains( + 'date_start', + 'date_end', + 'company_id', + 'employee_id', + 'review_policy', + 'project_id', + ) + def _check_overlapping_sheets_project_id(self): + self._check_overlapping_sheets() + + @api.multi + @api.constrains('company_id', 'project_id') + def _check_company_id_project_id(self): + for rec in self.sudo(): + if rec.company_id and rec.project_id.company_id and \ + rec.company_id != rec.project_id.company_id: + raise ValidationError(_( + 'The Company in the Timesheet Sheet and in the Project ' + 'must be the same.' + )) + + @api.multi + def _get_possible_reviewers(self): + self.ensure_one() + if self.review_policy == 'project_manager': + return self.project_id.user_id + return super()._get_possible_reviewers() + + @api.multi + def _get_timesheet_sheet_lines_domain(self): + domain = super()._get_timesheet_sheet_lines_domain() + if self.review_policy == 'project_manager': + domain += [ + ('project_id', '=', self.project_id.id), + ] + else: + domain += [ + ('project_id', '!=', False), + ] + return domain + + @api.onchange('project_id') + def _onchange_project_id(self): + self.add_line_project_id = self.project_id + self._compute_timesheet_ids() + return self.onchange_add_project_id() + + @api.multi + def _check_can_review(self): + super()._check_can_review() + if self.filtered( + lambda sheet: not sheet.can_review and + sheet.review_policy == 'project_manager'): + raise UserError(_( + 'Only a Project Manager can review the sheet.' + )) + + @api.multi + def reset_add_line(self): + super().reset_add_line() + self.write({ + 'add_line_project_id': self.project_id.id, + }) + + @api.model + def create(self, vals): + review_policy = vals.get( + 'review_policy', + self.default_get(['review_policy'])['review_policy'] + ) + if review_policy == 'project_manager' and not vals.get('project_id'): + raise UserError(_( + 'Review policy "By Project Manager" requires Project to be set' + )) + return super().create(vals) + + @api.multi + def write(self, vals): + if self.filtered(lambda x: x.review_policy == 'project_manager') \ + and 'project_id' in vals and not vals.get('project_id'): + raise UserError(_( + 'Review policy "By Project Manager" requires Project to be set' + )) + return super().write(vals) diff --git a/hr_timesheet_sheet_policy_project_manager/models/res_company.py b/hr_timesheet_sheet_policy_project_manager/models/res_company.py new file mode 100644 index 0000000000..84833be766 --- /dev/null +++ b/hr_timesheet_sheet_policy_project_manager/models/res_company.py @@ -0,0 +1,14 @@ +# Copyright 2019 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = 'res.company' + + timesheet_sheet_review_policy = fields.Selection( + selection_add=[ + ('project_manager', 'By Project Manager'), + ], + ) diff --git a/hr_timesheet_sheet_policy_project_manager/readme/CONTRIBUTORS.rst b/hr_timesheet_sheet_policy_project_manager/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..1c6a35a1e3 --- /dev/null +++ b/hr_timesheet_sheet_policy_project_manager/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Alexey Pelykh diff --git a/hr_timesheet_sheet_policy_project_manager/readme/DESCRIPTION.rst b/hr_timesheet_sheet_policy_project_manager/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..baa48d5312 --- /dev/null +++ b/hr_timesheet_sheet_policy_project_manager/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module allows setting Department Manager as Reviewer on Timesheet Sheets. diff --git a/hr_timesheet_sheet_policy_project_manager/static/description/icon.png b/hr_timesheet_sheet_policy_project_manager/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/hr_timesheet_sheet_policy_project_manager/static/description/index.html b/hr_timesheet_sheet_policy_project_manager/static/description/index.html new file mode 100644 index 0000000000..d58bc8b05b --- /dev/null +++ b/hr_timesheet_sheet_policy_project_manager/static/description/index.html @@ -0,0 +1,419 @@ + + + + + + +HR Timesheet Sheet: Project Manager Policy + + + +
+

HR Timesheet Sheet: Project Manager Policy

+ + +

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

+

This module allows setting Department Manager as Reviewer on Timesheet Sheets.

+

Table of contents

+ +
+

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/timesheet project on GitHub.

+

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

+
+
+
+ + diff --git a/hr_timesheet_sheet_policy_project_manager/tests/__init__.py b/hr_timesheet_sheet_policy_project_manager/tests/__init__.py new file mode 100644 index 0000000000..6bba9925fa --- /dev/null +++ b/hr_timesheet_sheet_policy_project_manager/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_hr_timesheet_sheet_policy_project_manager diff --git a/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py b/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py new file mode 100644 index 0000000000..7c7590e765 --- /dev/null +++ b/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py @@ -0,0 +1,217 @@ +# Copyright 2019 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.exceptions import UserError, ValidationError +from odoo.tests import common + + +class TestHrTimesheetSheetPolicyProjectManager(common.TransactionCase): + + def setUp(self): + super().setUp() + + self.ResUsers = self.env['res.users'] + self.ResCompany = self.env['res.company'] + self.HrEmployee = self.env['hr.employee'] + self.HrDepartment = self.env['hr.department'] + self.ProjectProject = self.env['project.project'] + self.AccountAnalyticLine = self.env['account.analytic.line'] + self.HrTimesheetSheet = self.env['hr_timesheet.sheet'] + self.group_hr_user = self.env.ref('hr.group_hr_user') + self.group_multi_company = self.env.ref('base.group_multi_company') + self.group_hr_timesheet_user = self.env.ref( + 'hr_timesheet.group_hr_timesheet_user' + ) + self.group_project_user = self.env.ref('project.group_project_user') + self.company = self.ResCompany.create({ + 'name': 'Company', + }) + self.env.user.company_ids += self.company + self.employee_user = self.ResUsers.with_context({ + 'no_reset_password': True, + }).create({ + 'name': 'Employee User', + 'login': 'employee_user', + 'email': 'employee_user@example.com', + 'groups_id': [(6, 0, [ + self.group_hr_user.id, + self.group_hr_timesheet_user.id, + self.group_project_user.id, + self.group_multi_company.id, + ])], + 'company_id': self.company.id, + 'company_ids': [(4, self.company.id)], + }) + self.project_manager_user_1 = self.ResUsers.with_context({ + 'no_reset_password': True, + }).create({ + 'name': 'Project Manager User 1', + 'login': 'project_manager_user_1', + 'email': 'project_manager_user_1@example.com', + 'groups_id': [(6, 0, [ + self.group_hr_timesheet_user.id, + self.group_project_user.id, + self.group_multi_company.id, + ])], + 'company_id': self.company.id, + 'company_ids': [(4, self.company.id)], + }) + self.project_manager_user_2 = self.ResUsers.with_context({ + 'no_reset_password': True, + }).create({ + 'name': 'Project Manager User 2', + 'login': 'project_manager_user_2', + 'email': 'project_manager_user_2@example.com', + 'groups_id': [(6, 0, [ + self.group_hr_timesheet_user.id, + self.group_project_user.id, + self.group_multi_company.id, + ])], + 'company_id': self.company.id, + 'company_ids': [(4, self.company.id)], + }) + self.employee = self.HrEmployee.create({ + 'name': 'Employee', + 'user_id': self.employee_user.id, + 'company_id': self.company.id, + }) + self.project_manager_1 = self.HrEmployee.create({ + 'name': 'Project Manager 1', + 'user_id': self.project_manager_user_1.id, + 'company_id': self.company.id, + }) + self.project_manager_2 = self.HrEmployee.create({ + 'name': 'Project Manager 2', + 'user_id': self.project_manager_user_2.id, + 'company_id': self.company.id, + }) + self.project_1 = self.ProjectProject.create({ + 'name': 'Project 1', + 'company_id': self.company.id, + 'allow_timesheets': True, + 'user_id': self.project_manager_user_1.id, + }) + self.project_2 = self.ProjectProject.create({ + 'name': 'Project 2', + 'company_id': self.company.id, + 'allow_timesheets': True, + 'user_id': self.project_manager_user_2.id, + }) + + def test_review_policy_capture(self): + self.company.timesheet_sheet_review_policy = 'project_manager' + sheet = self.HrTimesheetSheet.sudo(self.employee_user).create({ + 'company_id': self.company.id, + 'project_id': self.project_1.id, + }) + self.assertEqual(sheet.review_policy, 'project_manager') + self.company.timesheet_sheet_review_policy = 'hr' + self.assertEqual(sheet.review_policy, 'project_manager') + sheet.unlink() + + def test_project_manager_review_policy(self): + self.company.timesheet_sheet_review_policy = 'project_manager' + + timesheet_0 = self.AccountAnalyticLine.sudo( + self.employee_user + ).create({ + 'name': 'test', + 'project_id': self.project_2.id, + 'employee_id': self.employee.id, + }) + timesheet_1 = self.AccountAnalyticLine.sudo( + self.employee_user + ).create({ + 'name': 'test', + 'project_id': self.project_1.id, + 'employee_id': self.employee.id, + }) + + with self.assertRaises(UserError): + self.HrTimesheetSheet.sudo(self.employee_user).create({ + 'company_id': self.employee_user.company_id.id, + }) + sheet = self.HrTimesheetSheet.sudo(self.employee_user).create({ + 'company_id': self.employee_user.company_id.id, + 'project_id': self.project_1.id, + }) + with self.assertRaises(UserError): + sheet.project_id = False + self.company.timesheet_sheet_review_policy = 'hr' + + sheet._compute_complete_name() + + sheet._onchange_project_id() + sheet._onchange_scope() + sheet._onchange_timesheets() + self.assertEqual(len(sheet.timesheet_ids), 1) + self.assertEqual(len(sheet.line_ids), 7) + + with self.assertRaises(UserError): + sheet.sudo(self.project_manager_user_2).action_timesheet_done() + + with self.assertRaises(UserError): + sheet.sudo(self.project_manager_user_2).action_timesheet_draft() + + sheet.action_timesheet_confirm() + self.assertFalse(sheet.sudo(self.employee_user).can_review) + self.assertEqual( + self.HrTimesheetSheet.sudo(self.employee_user).search_count( + [('can_review', '=', True)] + ), + 0 + ) + with self.assertRaises(UserError): + sheet.sudo(self.employee_user).action_timesheet_done() + sheet.sudo(self.project_manager_user_1).action_timesheet_done() + sheet.sudo(self.project_manager_user_1).action_timesheet_draft() + sheet.unlink() + + timesheet_0.unlink() + timesheet_1.unlink() + + def test_project_manager_review_policy_project_required(self): + sheet = self.HrTimesheetSheet.sudo(self.employee_user).new({ + 'employee_id': self.employee.id, + 'company_id': self.company.id, + 'date_start': self.HrTimesheetSheet._default_date_start(), + 'date_end': self.HrTimesheetSheet._default_date_end(), + 'review_policy': 'project_manager', + 'state': 'new', + }) + values = sheet._convert_to_write(sheet._cache) + with self.assertRaises(UserError): + self.HrTimesheetSheet.sudo(self.employee_user).create(values) + sheet.project_id = self.project_1 + values.update(sheet._convert_to_write(sheet._cache)) + sheet = self.HrTimesheetSheet.sudo(self.employee_user).create(values) + with self.assertRaises(UserError): + sheet.project_id = False + sheet.unlink() + + def test_project_manager_review_policy_overlapping(self): + self.company.timesheet_sheet_review_policy = 'project_manager' + + sheet1 = self.HrTimesheetSheet.sudo(self.employee_user).create({ + 'company_id': self.company.id, + 'project_id': self.project_1.id, + }) + with self.assertRaises(ValidationError): + sheet2 = self.HrTimesheetSheet.sudo(self.employee_user).create({ + 'company_id': self.company.id, + 'project_id': self.project_1.id, + }) + + sheet2 = self.HrTimesheetSheet.sudo(self.employee_user).create({ + 'company_id': self.company.id, + 'project_id': self.project_2.id, + }) + with self.assertRaises(ValidationError): + sheet2.write({ + 'project_id': self.project_1.id, + }) + + self.company.timesheet_sheet_review_policy = 'hr' + + sheet1.unlink() + sheet2.unlink() diff --git a/hr_timesheet_sheet_policy_project_manager/views/hr_timesheet_sheet.xml b/hr_timesheet_sheet_policy_project_manager/views/hr_timesheet_sheet.xml new file mode 100644 index 0000000000..593d36accb --- /dev/null +++ b/hr_timesheet_sheet_policy_project_manager/views/hr_timesheet_sheet.xml @@ -0,0 +1,42 @@ + + + + + + hr_timesheet.sheet.form + hr_timesheet.sheet + + + + + + + {'invisible': [('review_policy', '=', 'project_manager')]} + + + {'column_invisible': [('parent.review_policy', '=', 'project_manager')]} + + + {'invisible': [('parent.review_policy', '=', 'project_manager')]} + + + + + + hr_timesheet.sheet.filter + hr_timesheet.sheet + + + + + + + + + + + + From d6b2dd892ae75704f3fcd00ab15987191fba941b Mon Sep 17 00:00:00 2001 From: Andrea Date: Mon, 23 Dec 2019 16:25:07 +0100 Subject: [PATCH 02/17] [FIX] hr_timesheet_sheet_policy*: admin always reviewer --- hr_timesheet_sheet_policy_project_manager/__manifest__.py | 2 +- .../i18n/hr_timesheet_sheet_policy_project_manager.pot | 6 +++--- .../models/hr_timesheet_sheet.py | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/hr_timesheet_sheet_policy_project_manager/__manifest__.py b/hr_timesheet_sheet_policy_project_manager/__manifest__.py index 78a4c5337b..d57abebcc8 100644 --- a/hr_timesheet_sheet_policy_project_manager/__manifest__.py +++ b/hr_timesheet_sheet_policy_project_manager/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'HR Timesheet Sheet: Project Manager Policy', - 'version': '12.0.1.0.0', + 'version': '12.0.1.1.0', 'author': 'Brainbean Apps, ' 'Odoo Community Association (OCA)', diff --git a/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot b/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot index 58b6829004..2ab047e06d 100644 --- a/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot +++ b/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot @@ -49,7 +49,7 @@ msgid "How Timesheet Sheets review is performed." msgstr "" #. module: hr_timesheet_sheet_policy_project_manager -#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:98 +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:99 #, python-format msgid "Only a Project Manager can review the sheet." msgstr "" @@ -61,8 +61,8 @@ msgid "Project" msgstr "" #. module: hr_timesheet_sheet_policy_project_manager -#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:116 -#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:125 +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:117 +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:126 #, python-format msgid "Review policy \"By Project Manager\" requires Project to be set" msgstr "" diff --git a/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py b/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py index 84d2557aef..2fc7bd849d 100644 --- a/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py +++ b/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py @@ -66,9 +66,10 @@ def _check_company_id_project_id(self): @api.multi def _get_possible_reviewers(self): self.ensure_one() + res = super()._get_possible_reviewers() if self.review_policy == 'project_manager': - return self.project_id.user_id - return super()._get_possible_reviewers() + res |= self.project_id.user_id + return res @api.multi def _get_timesheet_sheet_lines_domain(self): From 6b423088fff812fb50d0f3aa9d3255bd1e6bac03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20P=C3=A9rez=20Ruth?= Date: Sun, 8 Mar 2020 12:20:21 +0000 Subject: [PATCH 03/17] Added translation using Weblate (Spanish) --- .../i18n/es.po | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 hr_timesheet_sheet_policy_project_manager/i18n/es.po diff --git a/hr_timesheet_sheet_policy_project_manager/i18n/es.po b/hr_timesheet_sheet_policy_project_manager/i18n/es.po new file mode 100644 index 0000000000..8cd4d47685 --- /dev/null +++ b/hr_timesheet_sheet_policy_project_manager/i18n/es.po @@ -0,0 +1,85 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_timesheet_sheet_policy_project_manager +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\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" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model,name:hr_timesheet_sheet_policy_project_manager.model_account_analytic_line +msgid "Analytic Line" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: selection:res.company,timesheet_sheet_review_policy:0 +msgid "By Department Manager" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: selection:res.company,timesheet_sheet_review_policy:0 +msgid "By Direct Manager" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: selection:res.company,timesheet_sheet_review_policy:0 +msgid "By HR Manager/Officer" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: selection:res.company,timesheet_sheet_review_policy:0 +msgid "By Project Manager" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model,name:hr_timesheet_sheet_policy_project_manager.model_res_company +msgid "Companies" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model.fields,help:hr_timesheet_sheet_policy_project_manager.field_res_company__timesheet_sheet_review_policy +msgid "How Timesheet Sheets review is performed." +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:99 +#, python-format +msgid "Only a Project Manager can review the sheet." +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_hr_timesheet_sheet__project_id +#: model_terms:ir.ui.view,arch_db:hr_timesheet_sheet_policy_project_manager.view_hr_timesheet_sheet_filter +msgid "Project" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:117 +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:126 +#, python-format +msgid "Review policy \"By Project Manager\" requires Project to be set" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:61 +#, python-format +msgid "The Company in the Timesheet Sheet and in the Project must be the same." +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model,name:hr_timesheet_sheet_policy_project_manager.model_hr_timesheet_sheet +msgid "Timesheet Sheet" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company__timesheet_sheet_review_policy +msgid "Timesheet Sheet Review Policy" +msgstr "" From 3d3a7f980b19bdc97775af8c93ab3feb6583f8d3 Mon Sep 17 00:00:00 2001 From: Josep M Date: Mon, 18 May 2020 18:11:46 +0000 Subject: [PATCH 04/17] Translated using Weblate (Spanish) Currently translated at 7.7% (1 of 13 strings) Translation: timesheet-12.0/timesheet-12.0-hr_timesheet_sheet_policy_project_manager Translate-URL: https://translation.odoo-community.org/projects/timesheet-12-0/timesheet-12-0-hr_timesheet_sheet_policy_project_manager/es/ Translated using Weblate (Spanish) Currently translated at 100.0% (13 of 13 strings) Translation: timesheet-12.0/timesheet-12.0-hr_timesheet_sheet_policy_project_manager Translate-URL: https://translation.odoo-community.org/projects/timesheet-12-0/timesheet-12-0-hr_timesheet_sheet_policy_project_manager/es/ Translated using Weblate (Spanish) Currently translated at 100.0% (13 of 13 strings) Translation: timesheet-12.0/timesheet-12.0-hr_timesheet_sheet_policy_project_manager Translate-URL: https://translation.odoo-community.org/projects/timesheet-12-0/timesheet-12-0-hr_timesheet_sheet_policy_project_manager/es/ --- .../i18n/es.po | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/hr_timesheet_sheet_policy_project_manager/i18n/es.po b/hr_timesheet_sheet_policy_project_manager/i18n/es.po index 8cd4d47685..e8881ca1c9 100644 --- a/hr_timesheet_sheet_policy_project_manager/i18n/es.po +++ b/hr_timesheet_sheet_policy_project_manager/i18n/es.po @@ -6,60 +6,62 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2020-05-18 20:19+0000\n" +"Last-Translator: Josep M \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 3.10\n" #. module: hr_timesheet_sheet_policy_project_manager #: model:ir.model,name:hr_timesheet_sheet_policy_project_manager.model_account_analytic_line msgid "Analytic Line" -msgstr "" +msgstr "Línea analítica" #. module: hr_timesheet_sheet_policy_project_manager #: selection:res.company,timesheet_sheet_review_policy:0 msgid "By Department Manager" -msgstr "" +msgstr "Por el responsable del departamento" #. module: hr_timesheet_sheet_policy_project_manager #: selection:res.company,timesheet_sheet_review_policy:0 msgid "By Direct Manager" -msgstr "" +msgstr "Por responsable directo" #. module: hr_timesheet_sheet_policy_project_manager #: selection:res.company,timesheet_sheet_review_policy:0 msgid "By HR Manager/Officer" -msgstr "" +msgstr "Por Reponsable de RRHH" #. module: hr_timesheet_sheet_policy_project_manager #: selection:res.company,timesheet_sheet_review_policy:0 msgid "By Project Manager" -msgstr "" +msgstr "Por responsable de proyecto" #. module: hr_timesheet_sheet_policy_project_manager #: model:ir.model,name:hr_timesheet_sheet_policy_project_manager.model_res_company msgid "Companies" -msgstr "" +msgstr "Compañías" #. module: hr_timesheet_sheet_policy_project_manager #: model:ir.model.fields,help:hr_timesheet_sheet_policy_project_manager.field_res_company__timesheet_sheet_review_policy msgid "How Timesheet Sheets review is performed." -msgstr "" +msgstr "Cómo ser realiza la revisión de Partes de horas." #. module: hr_timesheet_sheet_policy_project_manager #: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:99 #, python-format msgid "Only a Project Manager can review the sheet." -msgstr "" +msgstr "Solo un responsable de proyecto puede revisar el parte." #. module: hr_timesheet_sheet_policy_project_manager #: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_hr_timesheet_sheet__project_id #: model_terms:ir.ui.view,arch_db:hr_timesheet_sheet_policy_project_manager.view_hr_timesheet_sheet_filter msgid "Project" -msgstr "" +msgstr "Proyecto" #. module: hr_timesheet_sheet_policy_project_manager #: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:117 @@ -67,19 +69,21 @@ msgstr "" #, python-format msgid "Review policy \"By Project Manager\" requires Project to be set" msgstr "" +"La política de revisión \"Por Project Manager\" requiere que se configure en " +"el proyecto" #. module: hr_timesheet_sheet_policy_project_manager #: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:61 #, python-format msgid "The Company in the Timesheet Sheet and in the Project must be the same." -msgstr "" +msgstr "La empresa en el parte de horas y en el proyecto deben ser la misma." #. module: hr_timesheet_sheet_policy_project_manager #: model:ir.model,name:hr_timesheet_sheet_policy_project_manager.model_hr_timesheet_sheet msgid "Timesheet Sheet" -msgstr "" +msgstr "Parte de horas" #. module: hr_timesheet_sheet_policy_project_manager #: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company__timesheet_sheet_review_policy msgid "Timesheet Sheet Review Policy" -msgstr "" +msgstr "Política de revisión de Parte de horas" From d2818f49df946feab7b0ee58656dd066f5214e63 Mon Sep 17 00:00:00 2001 From: David James Date: Tue, 28 Jul 2020 17:41:43 +1000 Subject: [PATCH 05/17] [IMP] hr_timesheet_sheet_policy_project_manager: black, isort, prettier --- .../__manifest__.py | 26 +- .../models/account_analytic_line.py | 8 +- .../models/hr_timesheet_sheet.py | 106 +++--- .../models/res_company.py | 6 +- ..._timesheet_sheet_policy_project_manager.py | 319 ++++++++++-------- .../views/hr_timesheet_sheet.xml | 53 ++- 6 files changed, 279 insertions(+), 239 deletions(-) diff --git a/hr_timesheet_sheet_policy_project_manager/__manifest__.py b/hr_timesheet_sheet_policy_project_manager/__manifest__.py index d57abebcc8..fdd51fd216 100644 --- a/hr_timesheet_sheet_policy_project_manager/__manifest__.py +++ b/hr_timesheet_sheet_policy_project_manager/__manifest__.py @@ -2,20 +2,14 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { - 'name': 'HR Timesheet Sheet: Project Manager Policy', - 'version': '12.0.1.1.0', - 'author': - 'Brainbean Apps, ' - 'Odoo Community Association (OCA)', - 'website': 'https://github.com/OCA/timesheet/', - 'license': 'AGPL-3', - 'category': 'Human Resources', - 'summary': 'Allows setting Project Manager as Reviewer', - 'depends': [ - 'hr_timesheet_sheet', - ], - 'data': [ - 'views/hr_timesheet_sheet.xml', - ], - 'installable': True, + "name": "HR Timesheet Sheet: Project Manager Policy", + "version": "12.0.1.1.0", + "author": "Brainbean Apps, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/timesheet/", + "license": "AGPL-3", + "category": "Human Resources", + "summary": "Allows setting Project Manager as Reviewer", + "depends": ["hr_timesheet_sheet"], + "data": ["views/hr_timesheet_sheet.xml"], + "installable": True, } diff --git a/hr_timesheet_sheet_policy_project_manager/models/account_analytic_line.py b/hr_timesheet_sheet_policy_project_manager/models/account_analytic_line.py index c134c216ca..86c22b403f 100644 --- a/hr_timesheet_sheet_policy_project_manager/models/account_analytic_line.py +++ b/hr_timesheet_sheet_policy_project_manager/models/account_analytic_line.py @@ -5,13 +5,11 @@ class AccountAnalyticLine(models.Model): - _inherit = 'account.analytic.line' + _inherit = "account.analytic.line" @api.multi def _get_sheet_domain(self): domain = super()._get_sheet_domain() - if self.company_id.timesheet_sheet_review_policy == 'project_manager': - domain += [ - ('project_id', '=', self.project_id.id), - ] + if self.company_id.timesheet_sheet_review_policy == "project_manager": + domain += [("project_id", "=", self.project_id.id)] return domain diff --git a/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py b/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py index 2fc7bd849d..2d823f91f3 100644 --- a/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py +++ b/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py @@ -1,26 +1,26 @@ # Copyright 2019 Brainbean Apps (https://brainbeanapps.com) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import api, fields, models, _ -from odoo.exceptions import ValidationError, UserError +from odoo import _, api, fields, models +from odoo.exceptions import UserError, ValidationError class HrTimesheetSheet(models.Model): - _inherit = 'hr_timesheet.sheet' + _inherit = "hr_timesheet.sheet" project_id = fields.Many2one( - string='Project', - comodel_name='project.project', + string="Project", + comodel_name="project.project", readonly=True, - states={'new': [('readonly', False)]}, + states={"new": [("readonly", False)]}, ) @api.multi - @api.depends('project_id.user_id') + @api.depends("project_id.user_id") def _compute_project_manager_as_reviewer(self): self._compute_possible_reviewer_ids() - @api.depends('project_id') + @api.depends("project_id") def _compute_complete_name_project_id(self): self._compute_complete_name() @@ -28,63 +28,62 @@ def _compute_complete_name_project_id(self): def _get_complete_name_components(self): self.ensure_one() result = super()._get_complete_name_components() - if self.review_policy == 'project_manager': + if self.review_policy == "project_manager": result += [self.project_id.name_get()[0][1]] return result @api.multi def _get_overlapping_sheet_domain(self): domain = super()._get_overlapping_sheet_domain() - if self.review_policy == 'project_manager': - domain += [ - ('project_id', '=', self.project_id.id), - ] + if self.review_policy == "project_manager": + domain += [("project_id", "=", self.project_id.id)] return domain @api.constrains( - 'date_start', - 'date_end', - 'company_id', - 'employee_id', - 'review_policy', - 'project_id', + "date_start", + "date_end", + "company_id", + "employee_id", + "review_policy", + "project_id", ) def _check_overlapping_sheets_project_id(self): self._check_overlapping_sheets() @api.multi - @api.constrains('company_id', 'project_id') + @api.constrains("company_id", "project_id") def _check_company_id_project_id(self): for rec in self.sudo(): - if rec.company_id and rec.project_id.company_id and \ - rec.company_id != rec.project_id.company_id: - raise ValidationError(_( - 'The Company in the Timesheet Sheet and in the Project ' - 'must be the same.' - )) + if ( + rec.company_id + and rec.project_id.company_id + and rec.company_id != rec.project_id.company_id + ): + raise ValidationError( + _( + "The Company in the Timesheet Sheet and in the Project " + "must be the same." + ) + ) @api.multi def _get_possible_reviewers(self): self.ensure_one() res = super()._get_possible_reviewers() - if self.review_policy == 'project_manager': + if self.review_policy == "project_manager": res |= self.project_id.user_id return res @api.multi def _get_timesheet_sheet_lines_domain(self): domain = super()._get_timesheet_sheet_lines_domain() - if self.review_policy == 'project_manager': - domain += [ - ('project_id', '=', self.project_id.id), - ] + if self.review_policy == "project_manager": + domain += [("project_id", "=", self.project_id.id)] else: - domain += [ - ('project_id', '!=', False), - ] + domain += [("project_id", "!=", False)] return domain - @api.onchange('project_id') + @api.onchange("project_id") def _onchange_project_id(self): self.add_line_project_id = self.project_id self._compute_timesheet_ids() @@ -94,36 +93,35 @@ def _onchange_project_id(self): def _check_can_review(self): super()._check_can_review() if self.filtered( - lambda sheet: not sheet.can_review and - sheet.review_policy == 'project_manager'): - raise UserError(_( - 'Only a Project Manager can review the sheet.' - )) + lambda sheet: not sheet.can_review + and sheet.review_policy == "project_manager" + ): + raise UserError(_("Only a Project Manager can review the sheet.")) @api.multi def reset_add_line(self): super().reset_add_line() - self.write({ - 'add_line_project_id': self.project_id.id, - }) + self.write({"add_line_project_id": self.project_id.id}) @api.model def create(self, vals): review_policy = vals.get( - 'review_policy', - self.default_get(['review_policy'])['review_policy'] + "review_policy", self.default_get(["review_policy"])["review_policy"] ) - if review_policy == 'project_manager' and not vals.get('project_id'): - raise UserError(_( - 'Review policy "By Project Manager" requires Project to be set' - )) + if review_policy == "project_manager" and not vals.get("project_id"): + raise UserError( + _('Review policy "By Project Manager" requires Project to be set') + ) return super().create(vals) @api.multi def write(self, vals): - if self.filtered(lambda x: x.review_policy == 'project_manager') \ - and 'project_id' in vals and not vals.get('project_id'): - raise UserError(_( - 'Review policy "By Project Manager" requires Project to be set' - )) + if ( + self.filtered(lambda x: x.review_policy == "project_manager") + and "project_id" in vals + and not vals.get("project_id") + ): + raise UserError( + _('Review policy "By Project Manager" requires Project to be set') + ) return super().write(vals) diff --git a/hr_timesheet_sheet_policy_project_manager/models/res_company.py b/hr_timesheet_sheet_policy_project_manager/models/res_company.py index 84833be766..2324127066 100644 --- a/hr_timesheet_sheet_policy_project_manager/models/res_company.py +++ b/hr_timesheet_sheet_policy_project_manager/models/res_company.py @@ -5,10 +5,8 @@ class ResCompany(models.Model): - _inherit = 'res.company' + _inherit = "res.company" timesheet_sheet_review_policy = fields.Selection( - selection_add=[ - ('project_manager', 'By Project Manager'), - ], + selection_add=[("project_manager", "By Project Manager")] ) diff --git a/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py b/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py index 7c7590e765..63e1571ee7 100644 --- a/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py +++ b/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py @@ -6,138 +6,170 @@ class TestHrTimesheetSheetPolicyProjectManager(common.TransactionCase): - def setUp(self): super().setUp() - self.ResUsers = self.env['res.users'] - self.ResCompany = self.env['res.company'] - self.HrEmployee = self.env['hr.employee'] - self.HrDepartment = self.env['hr.department'] - self.ProjectProject = self.env['project.project'] - self.AccountAnalyticLine = self.env['account.analytic.line'] - self.HrTimesheetSheet = self.env['hr_timesheet.sheet'] - self.group_hr_user = self.env.ref('hr.group_hr_user') - self.group_multi_company = self.env.ref('base.group_multi_company') + self.ResUsers = self.env["res.users"] + self.ResCompany = self.env["res.company"] + self.HrEmployee = self.env["hr.employee"] + self.HrDepartment = self.env["hr.department"] + self.ProjectProject = self.env["project.project"] + self.AccountAnalyticLine = self.env["account.analytic.line"] + self.HrTimesheetSheet = self.env["hr_timesheet.sheet"] + self.group_hr_user = self.env.ref("hr.group_hr_user") + self.group_multi_company = self.env.ref("base.group_multi_company") self.group_hr_timesheet_user = self.env.ref( - 'hr_timesheet.group_hr_timesheet_user' + "hr_timesheet.group_hr_timesheet_user" ) - self.group_project_user = self.env.ref('project.group_project_user') - self.company = self.ResCompany.create({ - 'name': 'Company', - }) + self.group_project_user = self.env.ref("project.group_project_user") + self.company = self.ResCompany.create({"name": "Company"}) self.env.user.company_ids += self.company - self.employee_user = self.ResUsers.with_context({ - 'no_reset_password': True, - }).create({ - 'name': 'Employee User', - 'login': 'employee_user', - 'email': 'employee_user@example.com', - 'groups_id': [(6, 0, [ - self.group_hr_user.id, - self.group_hr_timesheet_user.id, - self.group_project_user.id, - self.group_multi_company.id, - ])], - 'company_id': self.company.id, - 'company_ids': [(4, self.company.id)], - }) - self.project_manager_user_1 = self.ResUsers.with_context({ - 'no_reset_password': True, - }).create({ - 'name': 'Project Manager User 1', - 'login': 'project_manager_user_1', - 'email': 'project_manager_user_1@example.com', - 'groups_id': [(6, 0, [ - self.group_hr_timesheet_user.id, - self.group_project_user.id, - self.group_multi_company.id, - ])], - 'company_id': self.company.id, - 'company_ids': [(4, self.company.id)], - }) - self.project_manager_user_2 = self.ResUsers.with_context({ - 'no_reset_password': True, - }).create({ - 'name': 'Project Manager User 2', - 'login': 'project_manager_user_2', - 'email': 'project_manager_user_2@example.com', - 'groups_id': [(6, 0, [ - self.group_hr_timesheet_user.id, - self.group_project_user.id, - self.group_multi_company.id, - ])], - 'company_id': self.company.id, - 'company_ids': [(4, self.company.id)], - }) - self.employee = self.HrEmployee.create({ - 'name': 'Employee', - 'user_id': self.employee_user.id, - 'company_id': self.company.id, - }) - self.project_manager_1 = self.HrEmployee.create({ - 'name': 'Project Manager 1', - 'user_id': self.project_manager_user_1.id, - 'company_id': self.company.id, - }) - self.project_manager_2 = self.HrEmployee.create({ - 'name': 'Project Manager 2', - 'user_id': self.project_manager_user_2.id, - 'company_id': self.company.id, - }) - self.project_1 = self.ProjectProject.create({ - 'name': 'Project 1', - 'company_id': self.company.id, - 'allow_timesheets': True, - 'user_id': self.project_manager_user_1.id, - }) - self.project_2 = self.ProjectProject.create({ - 'name': 'Project 2', - 'company_id': self.company.id, - 'allow_timesheets': True, - 'user_id': self.project_manager_user_2.id, - }) + self.employee_user = self.ResUsers.with_context( + {"no_reset_password": True} + ).create( + { + "name": "Employee User", + "login": "employee_user", + "email": "employee_user@example.com", + "groups_id": [ + ( + 6, + 0, + [ + self.group_hr_user.id, + self.group_hr_timesheet_user.id, + self.group_project_user.id, + self.group_multi_company.id, + ], + ) + ], + "company_id": self.company.id, + "company_ids": [(4, self.company.id)], + } + ) + self.project_manager_user_1 = self.ResUsers.with_context( + {"no_reset_password": True} + ).create( + { + "name": "Project Manager User 1", + "login": "project_manager_user_1", + "email": "project_manager_user_1@example.com", + "groups_id": [ + ( + 6, + 0, + [ + self.group_hr_timesheet_user.id, + self.group_project_user.id, + self.group_multi_company.id, + ], + ) + ], + "company_id": self.company.id, + "company_ids": [(4, self.company.id)], + } + ) + self.project_manager_user_2 = self.ResUsers.with_context( + {"no_reset_password": True} + ).create( + { + "name": "Project Manager User 2", + "login": "project_manager_user_2", + "email": "project_manager_user_2@example.com", + "groups_id": [ + ( + 6, + 0, + [ + self.group_hr_timesheet_user.id, + self.group_project_user.id, + self.group_multi_company.id, + ], + ) + ], + "company_id": self.company.id, + "company_ids": [(4, self.company.id)], + } + ) + self.employee = self.HrEmployee.create( + { + "name": "Employee", + "user_id": self.employee_user.id, + "company_id": self.company.id, + } + ) + self.project_manager_1 = self.HrEmployee.create( + { + "name": "Project Manager 1", + "user_id": self.project_manager_user_1.id, + "company_id": self.company.id, + } + ) + self.project_manager_2 = self.HrEmployee.create( + { + "name": "Project Manager 2", + "user_id": self.project_manager_user_2.id, + "company_id": self.company.id, + } + ) + self.project_1 = self.ProjectProject.create( + { + "name": "Project 1", + "company_id": self.company.id, + "allow_timesheets": True, + "user_id": self.project_manager_user_1.id, + } + ) + self.project_2 = self.ProjectProject.create( + { + "name": "Project 2", + "company_id": self.company.id, + "allow_timesheets": True, + "user_id": self.project_manager_user_2.id, + } + ) def test_review_policy_capture(self): - self.company.timesheet_sheet_review_policy = 'project_manager' - sheet = self.HrTimesheetSheet.sudo(self.employee_user).create({ - 'company_id': self.company.id, - 'project_id': self.project_1.id, - }) - self.assertEqual(sheet.review_policy, 'project_manager') - self.company.timesheet_sheet_review_policy = 'hr' - self.assertEqual(sheet.review_policy, 'project_manager') + self.company.timesheet_sheet_review_policy = "project_manager" + sheet = self.HrTimesheetSheet.sudo(self.employee_user).create( + {"company_id": self.company.id, "project_id": self.project_1.id} + ) + self.assertEqual(sheet.review_policy, "project_manager") + self.company.timesheet_sheet_review_policy = "hr" + self.assertEqual(sheet.review_policy, "project_manager") sheet.unlink() def test_project_manager_review_policy(self): - self.company.timesheet_sheet_review_policy = 'project_manager' - - timesheet_0 = self.AccountAnalyticLine.sudo( - self.employee_user - ).create({ - 'name': 'test', - 'project_id': self.project_2.id, - 'employee_id': self.employee.id, - }) - timesheet_1 = self.AccountAnalyticLine.sudo( - self.employee_user - ).create({ - 'name': 'test', - 'project_id': self.project_1.id, - 'employee_id': self.employee.id, - }) + self.company.timesheet_sheet_review_policy = "project_manager" + + timesheet_0 = self.AccountAnalyticLine.sudo(self.employee_user).create( + { + "name": "test", + "project_id": self.project_2.id, + "employee_id": self.employee.id, + } + ) + timesheet_1 = self.AccountAnalyticLine.sudo(self.employee_user).create( + { + "name": "test", + "project_id": self.project_1.id, + "employee_id": self.employee.id, + } + ) with self.assertRaises(UserError): - self.HrTimesheetSheet.sudo(self.employee_user).create({ - 'company_id': self.employee_user.company_id.id, - }) - sheet = self.HrTimesheetSheet.sudo(self.employee_user).create({ - 'company_id': self.employee_user.company_id.id, - 'project_id': self.project_1.id, - }) + self.HrTimesheetSheet.sudo(self.employee_user).create( + {"company_id": self.employee_user.company_id.id} + ) + sheet = self.HrTimesheetSheet.sudo(self.employee_user).create( + { + "company_id": self.employee_user.company_id.id, + "project_id": self.project_1.id, + } + ) with self.assertRaises(UserError): sheet.project_id = False - self.company.timesheet_sheet_review_policy = 'hr' + self.company.timesheet_sheet_review_policy = "hr" sheet._compute_complete_name() @@ -157,9 +189,9 @@ def test_project_manager_review_policy(self): self.assertFalse(sheet.sudo(self.employee_user).can_review) self.assertEqual( self.HrTimesheetSheet.sudo(self.employee_user).search_count( - [('can_review', '=', True)] + [("can_review", "=", True)] ), - 0 + 0, ) with self.assertRaises(UserError): sheet.sudo(self.employee_user).action_timesheet_done() @@ -171,14 +203,16 @@ def test_project_manager_review_policy(self): timesheet_1.unlink() def test_project_manager_review_policy_project_required(self): - sheet = self.HrTimesheetSheet.sudo(self.employee_user).new({ - 'employee_id': self.employee.id, - 'company_id': self.company.id, - 'date_start': self.HrTimesheetSheet._default_date_start(), - 'date_end': self.HrTimesheetSheet._default_date_end(), - 'review_policy': 'project_manager', - 'state': 'new', - }) + sheet = self.HrTimesheetSheet.sudo(self.employee_user).new( + { + "employee_id": self.employee.id, + "company_id": self.company.id, + "date_start": self.HrTimesheetSheet._default_date_start(), + "date_end": self.HrTimesheetSheet._default_date_end(), + "review_policy": "project_manager", + "state": "new", + } + ) values = sheet._convert_to_write(sheet._cache) with self.assertRaises(UserError): self.HrTimesheetSheet.sudo(self.employee_user).create(values) @@ -190,28 +224,23 @@ def test_project_manager_review_policy_project_required(self): sheet.unlink() def test_project_manager_review_policy_overlapping(self): - self.company.timesheet_sheet_review_policy = 'project_manager' + self.company.timesheet_sheet_review_policy = "project_manager" - sheet1 = self.HrTimesheetSheet.sudo(self.employee_user).create({ - 'company_id': self.company.id, - 'project_id': self.project_1.id, - }) + sheet1 = self.HrTimesheetSheet.sudo(self.employee_user).create( + {"company_id": self.company.id, "project_id": self.project_1.id} + ) with self.assertRaises(ValidationError): - sheet2 = self.HrTimesheetSheet.sudo(self.employee_user).create({ - 'company_id': self.company.id, - 'project_id': self.project_1.id, - }) - - sheet2 = self.HrTimesheetSheet.sudo(self.employee_user).create({ - 'company_id': self.company.id, - 'project_id': self.project_2.id, - }) + sheet2 = self.HrTimesheetSheet.sudo(self.employee_user).create( + {"company_id": self.company.id, "project_id": self.project_1.id} + ) + + sheet2 = self.HrTimesheetSheet.sudo(self.employee_user).create( + {"company_id": self.company.id, "project_id": self.project_2.id} + ) with self.assertRaises(ValidationError): - sheet2.write({ - 'project_id': self.project_1.id, - }) + sheet2.write({"project_id": self.project_1.id}) - self.company.timesheet_sheet_review_policy = 'hr' + self.company.timesheet_sheet_review_policy = "hr" sheet1.unlink() sheet2.unlink() diff --git a/hr_timesheet_sheet_policy_project_manager/views/hr_timesheet_sheet.xml b/hr_timesheet_sheet_policy_project_manager/views/hr_timesheet_sheet.xml index 593d36accb..1ead297e5a 100644 --- a/hr_timesheet_sheet_policy_project_manager/views/hr_timesheet_sheet.xml +++ b/hr_timesheet_sheet_policy_project_manager/views/hr_timesheet_sheet.xml @@ -1,42 +1,65 @@ - + - hr_timesheet.sheet.form hr_timesheet.sheet - + - - + + - {'invisible': [('review_policy', '=', 'project_manager')]} + {'invisible': [('review_policy', '=', 'project_manager')]} - - {'column_invisible': [('parent.review_policy', '=', 'project_manager')]} + + {'column_invisible': [('parent.review_policy', '=', 'project_manager')]} - - {'invisible': [('parent.review_policy', '=', 'project_manager')]} + + {'invisible': [('parent.review_policy', '=', 'project_manager')]} - hr_timesheet.sheet.filter hr_timesheet.sheet - + - + - + - From 826bbb4a90a33bddcc03e4d7984053f38d21bdde Mon Sep 17 00:00:00 2001 From: David James Date: Tue, 28 Jul 2020 20:50:01 +1000 Subject: [PATCH 06/17] [MIG] hr_timesheet_sheet_policy_project_manager: Migration to 13.0 --- .../README.rst | 10 +++--- .../__manifest__.py | 2 +- .../i18n/es.po | 35 ++++++++---------- ...timesheet_sheet_policy_project_manager.pot | 35 ++++++------------ .../models/account_analytic_line.py | 3 +- .../models/hr_timesheet_sheet.py | 9 ----- .../static/description/index.html | 6 ++-- ..._timesheet_sheet_policy_project_manager.py | 36 +++++++++---------- 8 files changed, 52 insertions(+), 84 deletions(-) diff --git a/hr_timesheet_sheet_policy_project_manager/README.rst b/hr_timesheet_sheet_policy_project_manager/README.rst index 9f05a83ac3..ad9b0558b9 100644 --- a/hr_timesheet_sheet_policy_project_manager/README.rst +++ b/hr_timesheet_sheet_policy_project_manager/README.rst @@ -14,13 +14,13 @@ HR Timesheet Sheet: Project Manager Policy :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ftimesheet-lightgray.png?logo=github - :target: https://github.com/OCA/timesheet/tree/12.0/hr_timesheet_sheet_policy_project_manager + :target: https://github.com/OCA/timesheet/tree/13.0/hr_timesheet_sheet_policy_project_manager :alt: OCA/timesheet .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/timesheet-12-0/timesheet-12-0-hr_timesheet_sheet_policy_project_manager + :target: https://translation.odoo-community.org/projects/timesheet-13-0/timesheet-13-0-hr_timesheet_sheet_policy_project_manager :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/117/12.0 + :target: https://runbot.odoo-community.org/runbot/117/13.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -38,7 +38,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -68,6 +68,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/timesheet `_ project on GitHub. +This module is part of the `OCA/timesheet `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/hr_timesheet_sheet_policy_project_manager/__manifest__.py b/hr_timesheet_sheet_policy_project_manager/__manifest__.py index fdd51fd216..cd5df8b723 100644 --- a/hr_timesheet_sheet_policy_project_manager/__manifest__.py +++ b/hr_timesheet_sheet_policy_project_manager/__manifest__.py @@ -3,7 +3,7 @@ { "name": "HR Timesheet Sheet: Project Manager Policy", - "version": "12.0.1.1.0", + "version": "13.0.1.0.0", "author": "Brainbean Apps, Odoo Community Association (OCA)", "website": "https://github.com/OCA/timesheet/", "license": "AGPL-3", diff --git a/hr_timesheet_sheet_policy_project_manager/i18n/es.po b/hr_timesheet_sheet_policy_project_manager/i18n/es.po index e8881ca1c9..9a00938a1d 100644 --- a/hr_timesheet_sheet_policy_project_manager/i18n/es.po +++ b/hr_timesheet_sheet_policy_project_manager/i18n/es.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * hr_timesheet_sheet_policy_project_manager +# * hr_timesheet_sheet_policy_project_manager # msgid "" msgstr "" @@ -22,22 +22,7 @@ msgid "Analytic Line" msgstr "Línea analítica" #. module: hr_timesheet_sheet_policy_project_manager -#: selection:res.company,timesheet_sheet_review_policy:0 -msgid "By Department Manager" -msgstr "Por el responsable del departamento" - -#. module: hr_timesheet_sheet_policy_project_manager -#: selection:res.company,timesheet_sheet_review_policy:0 -msgid "By Direct Manager" -msgstr "Por responsable directo" - -#. module: hr_timesheet_sheet_policy_project_manager -#: selection:res.company,timesheet_sheet_review_policy:0 -msgid "By HR Manager/Officer" -msgstr "Por Reponsable de RRHH" - -#. module: hr_timesheet_sheet_policy_project_manager -#: selection:res.company,timesheet_sheet_review_policy:0 +#: model:ir.model.fields.selection,name:hr_timesheet_sheet_policy_project_manager.selection__res_company__timesheet_sheet_review_policy__project_manager msgid "By Project Manager" msgstr "Por responsable de proyecto" @@ -52,7 +37,7 @@ msgid "How Timesheet Sheets review is performed." msgstr "Cómo ser realiza la revisión de Partes de horas." #. module: hr_timesheet_sheet_policy_project_manager -#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:99 +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 #, python-format msgid "Only a Project Manager can review the sheet." msgstr "Solo un responsable de proyecto puede revisar el parte." @@ -64,8 +49,7 @@ msgid "Project" msgstr "Proyecto" #. module: hr_timesheet_sheet_policy_project_manager -#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:117 -#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:126 +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 #, python-format msgid "Review policy \"By Project Manager\" requires Project to be set" msgstr "" @@ -73,7 +57,7 @@ msgstr "" "el proyecto" #. module: hr_timesheet_sheet_policy_project_manager -#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:61 +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 #, python-format msgid "The Company in the Timesheet Sheet and in the Project must be the same." msgstr "La empresa en el parte de horas y en el proyecto deben ser la misma." @@ -87,3 +71,12 @@ msgstr "Parte de horas" #: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company__timesheet_sheet_review_policy msgid "Timesheet Sheet Review Policy" msgstr "Política de revisión de Parte de horas" + +#~ msgid "By Department Manager" +#~ msgstr "Por el responsable del departamento" + +#~ msgid "By Direct Manager" +#~ msgstr "Por responsable directo" + +#~ msgid "By HR Manager/Officer" +#~ msgstr "Por Reponsable de RRHH" diff --git a/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot b/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot index 2ab047e06d..49684c3a9f 100644 --- a/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot +++ b/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot @@ -1,12 +1,12 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * hr_timesheet_sheet_policy_project_manager +# * hr_timesheet_sheet_policy_project_manager # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 12.0\n" +"Project-Id-Version: Odoo Server 13.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: <>\n" +"Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,22 +19,7 @@ msgid "Analytic Line" msgstr "" #. module: hr_timesheet_sheet_policy_project_manager -#: selection:res.company,timesheet_sheet_review_policy:0 -msgid "By Department Manager" -msgstr "" - -#. module: hr_timesheet_sheet_policy_project_manager -#: selection:res.company,timesheet_sheet_review_policy:0 -msgid "By Direct Manager" -msgstr "" - -#. module: hr_timesheet_sheet_policy_project_manager -#: selection:res.company,timesheet_sheet_review_policy:0 -msgid "By HR Manager/Officer" -msgstr "" - -#. module: hr_timesheet_sheet_policy_project_manager -#: selection:res.company,timesheet_sheet_review_policy:0 +#: model:ir.model.fields.selection,name:hr_timesheet_sheet_policy_project_manager.selection__res_company__timesheet_sheet_review_policy__project_manager msgid "By Project Manager" msgstr "" @@ -49,7 +34,7 @@ msgid "How Timesheet Sheets review is performed." msgstr "" #. module: hr_timesheet_sheet_policy_project_manager -#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:99 +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 #, python-format msgid "Only a Project Manager can review the sheet." msgstr "" @@ -61,16 +46,17 @@ msgid "Project" msgstr "" #. module: hr_timesheet_sheet_policy_project_manager -#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:117 -#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:126 +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 #, python-format msgid "Review policy \"By Project Manager\" requires Project to be set" msgstr "" #. module: hr_timesheet_sheet_policy_project_manager -#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:61 +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 #, python-format -msgid "The Company in the Timesheet Sheet and in the Project must be the same." +msgid "" +"The Company in the Timesheet Sheet and in the Project must be the same." msgstr "" #. module: hr_timesheet_sheet_policy_project_manager @@ -82,4 +68,3 @@ msgstr "" #: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company__timesheet_sheet_review_policy msgid "Timesheet Sheet Review Policy" msgstr "" - diff --git a/hr_timesheet_sheet_policy_project_manager/models/account_analytic_line.py b/hr_timesheet_sheet_policy_project_manager/models/account_analytic_line.py index 86c22b403f..6125a9ca81 100644 --- a/hr_timesheet_sheet_policy_project_manager/models/account_analytic_line.py +++ b/hr_timesheet_sheet_policy_project_manager/models/account_analytic_line.py @@ -1,13 +1,12 @@ # Copyright 2019 Brainbean Apps (https://brainbeanapps.com) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import api, models +from odoo import models class AccountAnalyticLine(models.Model): _inherit = "account.analytic.line" - @api.multi def _get_sheet_domain(self): domain = super()._get_sheet_domain() if self.company_id.timesheet_sheet_review_policy == "project_manager": diff --git a/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py b/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py index 2d823f91f3..6ce6e2b91b 100644 --- a/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py +++ b/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py @@ -15,7 +15,6 @@ class HrTimesheetSheet(models.Model): states={"new": [("readonly", False)]}, ) - @api.multi @api.depends("project_id.user_id") def _compute_project_manager_as_reviewer(self): self._compute_possible_reviewer_ids() @@ -24,7 +23,6 @@ def _compute_project_manager_as_reviewer(self): def _compute_complete_name_project_id(self): self._compute_complete_name() - @api.multi def _get_complete_name_components(self): self.ensure_one() result = super()._get_complete_name_components() @@ -32,7 +30,6 @@ def _get_complete_name_components(self): result += [self.project_id.name_get()[0][1]] return result - @api.multi def _get_overlapping_sheet_domain(self): domain = super()._get_overlapping_sheet_domain() if self.review_policy == "project_manager": @@ -50,7 +47,6 @@ def _get_overlapping_sheet_domain(self): def _check_overlapping_sheets_project_id(self): self._check_overlapping_sheets() - @api.multi @api.constrains("company_id", "project_id") def _check_company_id_project_id(self): for rec in self.sudo(): @@ -66,7 +62,6 @@ def _check_company_id_project_id(self): ) ) - @api.multi def _get_possible_reviewers(self): self.ensure_one() res = super()._get_possible_reviewers() @@ -74,7 +69,6 @@ def _get_possible_reviewers(self): res |= self.project_id.user_id return res - @api.multi def _get_timesheet_sheet_lines_domain(self): domain = super()._get_timesheet_sheet_lines_domain() if self.review_policy == "project_manager": @@ -89,7 +83,6 @@ def _onchange_project_id(self): self._compute_timesheet_ids() return self.onchange_add_project_id() - @api.multi def _check_can_review(self): super()._check_can_review() if self.filtered( @@ -98,7 +91,6 @@ def _check_can_review(self): ): raise UserError(_("Only a Project Manager can review the sheet.")) - @api.multi def reset_add_line(self): super().reset_add_line() self.write({"add_line_project_id": self.project_id.id}) @@ -114,7 +106,6 @@ def create(self, vals): ) return super().create(vals) - @api.multi def write(self, vals): if ( self.filtered(lambda x: x.review_policy == "project_manager") diff --git a/hr_timesheet_sheet_policy_project_manager/static/description/index.html b/hr_timesheet_sheet_policy_project_manager/static/description/index.html index d58bc8b05b..470247593d 100644 --- a/hr_timesheet_sheet_policy_project_manager/static/description/index.html +++ b/hr_timesheet_sheet_policy_project_manager/static/description/index.html @@ -367,7 +367,7 @@

HR Timesheet Sheet: Project Manager Policy

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

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

+

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

This module allows setting Department Manager as Reviewer on Timesheet Sheets.

Table of contents

@@ -386,7 +386,7 @@

Bug Tracker

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

+feedback.

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

@@ -410,7 +410,7 @@

Maintainers

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

-

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

+

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

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

diff --git a/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py b/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py index 63e1571ee7..584344bcbc 100644 --- a/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py +++ b/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py @@ -131,7 +131,7 @@ def setUp(self): def test_review_policy_capture(self): self.company.timesheet_sheet_review_policy = "project_manager" - sheet = self.HrTimesheetSheet.sudo(self.employee_user).create( + sheet = self.HrTimesheetSheet.with_user(self.employee_user).create( {"company_id": self.company.id, "project_id": self.project_1.id} ) self.assertEqual(sheet.review_policy, "project_manager") @@ -142,14 +142,14 @@ def test_review_policy_capture(self): def test_project_manager_review_policy(self): self.company.timesheet_sheet_review_policy = "project_manager" - timesheet_0 = self.AccountAnalyticLine.sudo(self.employee_user).create( + timesheet_0 = self.AccountAnalyticLine.with_user(self.employee_user).create( { "name": "test", "project_id": self.project_2.id, "employee_id": self.employee.id, } ) - timesheet_1 = self.AccountAnalyticLine.sudo(self.employee_user).create( + timesheet_1 = self.AccountAnalyticLine.with_user(self.employee_user).create( { "name": "test", "project_id": self.project_1.id, @@ -158,10 +158,10 @@ def test_project_manager_review_policy(self): ) with self.assertRaises(UserError): - self.HrTimesheetSheet.sudo(self.employee_user).create( + self.HrTimesheetSheet.with_user(self.employee_user).create( {"company_id": self.employee_user.company_id.id} ) - sheet = self.HrTimesheetSheet.sudo(self.employee_user).create( + sheet = self.HrTimesheetSheet.with_user(self.employee_user).create( { "company_id": self.employee_user.company_id.id, "project_id": self.project_1.id, @@ -180,30 +180,30 @@ def test_project_manager_review_policy(self): self.assertEqual(len(sheet.line_ids), 7) with self.assertRaises(UserError): - sheet.sudo(self.project_manager_user_2).action_timesheet_done() + sheet.with_user(self.project_manager_user_2).action_timesheet_done() with self.assertRaises(UserError): - sheet.sudo(self.project_manager_user_2).action_timesheet_draft() + sheet.with_user(self.project_manager_user_2).action_timesheet_draft() sheet.action_timesheet_confirm() - self.assertFalse(sheet.sudo(self.employee_user).can_review) + self.assertFalse(sheet.with_user(self.employee_user).can_review) self.assertEqual( - self.HrTimesheetSheet.sudo(self.employee_user).search_count( + self.HrTimesheetSheet.with_user(self.employee_user).search_count( [("can_review", "=", True)] ), 0, ) with self.assertRaises(UserError): - sheet.sudo(self.employee_user).action_timesheet_done() - sheet.sudo(self.project_manager_user_1).action_timesheet_done() - sheet.sudo(self.project_manager_user_1).action_timesheet_draft() + sheet.with_user(self.employee_user).action_timesheet_done() + sheet.with_user(self.project_manager_user_1).action_timesheet_done() + sheet.with_user(self.project_manager_user_1).action_timesheet_draft() sheet.unlink() timesheet_0.unlink() timesheet_1.unlink() def test_project_manager_review_policy_project_required(self): - sheet = self.HrTimesheetSheet.sudo(self.employee_user).new( + sheet = self.HrTimesheetSheet.with_user(self.employee_user).new( { "employee_id": self.employee.id, "company_id": self.company.id, @@ -215,10 +215,10 @@ def test_project_manager_review_policy_project_required(self): ) values = sheet._convert_to_write(sheet._cache) with self.assertRaises(UserError): - self.HrTimesheetSheet.sudo(self.employee_user).create(values) + self.HrTimesheetSheet.with_user(self.employee_user).create(values) sheet.project_id = self.project_1 values.update(sheet._convert_to_write(sheet._cache)) - sheet = self.HrTimesheetSheet.sudo(self.employee_user).create(values) + sheet = self.HrTimesheetSheet.with_user(self.employee_user).create(values) with self.assertRaises(UserError): sheet.project_id = False sheet.unlink() @@ -226,15 +226,15 @@ def test_project_manager_review_policy_project_required(self): def test_project_manager_review_policy_overlapping(self): self.company.timesheet_sheet_review_policy = "project_manager" - sheet1 = self.HrTimesheetSheet.sudo(self.employee_user).create( + sheet1 = self.HrTimesheetSheet.with_user(self.employee_user).create( {"company_id": self.company.id, "project_id": self.project_1.id} ) with self.assertRaises(ValidationError): - sheet2 = self.HrTimesheetSheet.sudo(self.employee_user).create( + sheet2 = self.HrTimesheetSheet.with_user(self.employee_user).create( {"company_id": self.company.id, "project_id": self.project_1.id} ) - sheet2 = self.HrTimesheetSheet.sudo(self.employee_user).create( + sheet2 = self.HrTimesheetSheet.with_user(self.employee_user).create( {"company_id": self.company.id, "project_id": self.project_2.id} ) with self.assertRaises(ValidationError): From d1379298504633148211e53a705bd95b64ebac4e Mon Sep 17 00:00:00 2001 From: Alexey Pelykh Date: Sun, 8 Nov 2020 08:11:32 +0200 Subject: [PATCH 07/17] [UPD] Brainbean Apps => CorporateHub --- hr_timesheet_sheet_policy_project_manager/README.rst | 6 ++++-- hr_timesheet_sheet_policy_project_manager/__manifest__.py | 3 ++- .../readme/CONTRIBUTORS.rst | 4 +++- .../static/description/index.html | 7 +++++-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/hr_timesheet_sheet_policy_project_manager/README.rst b/hr_timesheet_sheet_policy_project_manager/README.rst index ad9b0558b9..0df7badc66 100644 --- a/hr_timesheet_sheet_policy_project_manager/README.rst +++ b/hr_timesheet_sheet_policy_project_manager/README.rst @@ -48,12 +48,14 @@ Credits Authors ~~~~~~~ -* Brainbean Apps +* CorporateHub Contributors ~~~~~~~~~~~~ -* Alexey Pelykh +* `CorporateHub `__ + + * Alexey Pelykh Maintainers ~~~~~~~~~~~ diff --git a/hr_timesheet_sheet_policy_project_manager/__manifest__.py b/hr_timesheet_sheet_policy_project_manager/__manifest__.py index cd5df8b723..dc8fa96214 100644 --- a/hr_timesheet_sheet_policy_project_manager/__manifest__.py +++ b/hr_timesheet_sheet_policy_project_manager/__manifest__.py @@ -1,10 +1,11 @@ # Copyright 2019 Brainbean Apps (https://brainbeanapps.com) +# Copyright 2020 CorporateHub (https://corporatehub.eu) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "HR Timesheet Sheet: Project Manager Policy", "version": "13.0.1.0.0", - "author": "Brainbean Apps, Odoo Community Association (OCA)", + "author": "CorporateHub, Odoo Community Association (OCA)", "website": "https://github.com/OCA/timesheet/", "license": "AGPL-3", "category": "Human Resources", diff --git a/hr_timesheet_sheet_policy_project_manager/readme/CONTRIBUTORS.rst b/hr_timesheet_sheet_policy_project_manager/readme/CONTRIBUTORS.rst index 1c6a35a1e3..724bc1d03a 100644 --- a/hr_timesheet_sheet_policy_project_manager/readme/CONTRIBUTORS.rst +++ b/hr_timesheet_sheet_policy_project_manager/readme/CONTRIBUTORS.rst @@ -1 +1,3 @@ -* Alexey Pelykh +* `CorporateHub `__ + + * Alexey Pelykh diff --git a/hr_timesheet_sheet_policy_project_manager/static/description/index.html b/hr_timesheet_sheet_policy_project_manager/static/description/index.html index 470247593d..134f9b89fb 100644 --- a/hr_timesheet_sheet_policy_project_manager/static/description/index.html +++ b/hr_timesheet_sheet_policy_project_manager/static/description/index.html @@ -394,13 +394,16 @@

Credits

Authors

    -
  • Brainbean Apps
  • +
  • CorporateHub
From 87c23dbbf6f309df3bc937b349f0791bb0996dab Mon Sep 17 00:00:00 2001 From: fshah Date: Wed, 10 Mar 2021 11:38:10 +0530 Subject: [PATCH 08/17] [IMP] hr_timesheet_sheet_policy_project_manager: Black, isort, prettier. --- hr_timesheet_sheet_policy_project_manager/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hr_timesheet_sheet_policy_project_manager/__manifest__.py b/hr_timesheet_sheet_policy_project_manager/__manifest__.py index dc8fa96214..89c734a4ae 100644 --- a/hr_timesheet_sheet_policy_project_manager/__manifest__.py +++ b/hr_timesheet_sheet_policy_project_manager/__manifest__.py @@ -6,7 +6,7 @@ "name": "HR Timesheet Sheet: Project Manager Policy", "version": "13.0.1.0.0", "author": "CorporateHub, Odoo Community Association (OCA)", - "website": "https://github.com/OCA/timesheet/", + "website": "https://github.com/OCA/timesheet", "license": "AGPL-3", "category": "Human Resources", "summary": "Allows setting Project Manager as Reviewer", From 32c8995d503d82a56eeae511c36689254bfdbf1f Mon Sep 17 00:00:00 2001 From: fshah Date: Wed, 10 Mar 2021 12:29:12 +0530 Subject: [PATCH 09/17] [MIG] Migrate module "hr_timesheet_sheet_policy_project_manager" to v14. --- .../README.rst | 10 ++++---- .../__manifest__.py | 2 +- ...timesheet_sheet_policy_project_manager.pot | 23 ++++++++++++++++++- .../static/description/index.html | 6 ++--- ..._timesheet_sheet_policy_project_manager.py | 6 ++++- 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/hr_timesheet_sheet_policy_project_manager/README.rst b/hr_timesheet_sheet_policy_project_manager/README.rst index 0df7badc66..8a7d20c269 100644 --- a/hr_timesheet_sheet_policy_project_manager/README.rst +++ b/hr_timesheet_sheet_policy_project_manager/README.rst @@ -14,13 +14,13 @@ HR Timesheet Sheet: Project Manager Policy :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ftimesheet-lightgray.png?logo=github - :target: https://github.com/OCA/timesheet/tree/13.0/hr_timesheet_sheet_policy_project_manager + :target: https://github.com/OCA/timesheet/tree/14.0/hr_timesheet_sheet_policy_project_manager :alt: OCA/timesheet .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/timesheet-13-0/timesheet-13-0-hr_timesheet_sheet_policy_project_manager + :target: https://translation.odoo-community.org/projects/timesheet-14-0/timesheet-14-0-hr_timesheet_sheet_policy_project_manager :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/117/13.0 + :target: https://runbot.odoo-community.org/runbot/117/14.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -38,7 +38,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -70,6 +70,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/timesheet `_ project on GitHub. +This module is part of the `OCA/timesheet `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/hr_timesheet_sheet_policy_project_manager/__manifest__.py b/hr_timesheet_sheet_policy_project_manager/__manifest__.py index 89c734a4ae..7e8ba46c8b 100644 --- a/hr_timesheet_sheet_policy_project_manager/__manifest__.py +++ b/hr_timesheet_sheet_policy_project_manager/__manifest__.py @@ -4,7 +4,7 @@ { "name": "HR Timesheet Sheet: Project Manager Policy", - "version": "13.0.1.0.0", + "version": "14.0.1.0.0", "author": "CorporateHub, Odoo Community Association (OCA)", "website": "https://github.com/OCA/timesheet", "license": "AGPL-3", diff --git a/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot b/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot index 49684c3a9f..35d985bb68 100644 --- a/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot +++ b/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 13.0\n" +"Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -28,11 +28,32 @@ msgstr "" msgid "Companies" msgstr "" +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_account_analytic_line__display_name +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_hr_timesheet_sheet__display_name +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company__display_name +msgid "Display Name" +msgstr "" + #. module: hr_timesheet_sheet_policy_project_manager #: model:ir.model.fields,help:hr_timesheet_sheet_policy_project_manager.field_res_company__timesheet_sheet_review_policy msgid "How Timesheet Sheets review is performed." msgstr "" +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_account_analytic_line__id +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_hr_timesheet_sheet__id +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company__id +msgid "ID" +msgstr "" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_account_analytic_line____last_update +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_hr_timesheet_sheet____last_update +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company____last_update +msgid "Last Modified on" +msgstr "" + #. module: hr_timesheet_sheet_policy_project_manager #: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 #, python-format diff --git a/hr_timesheet_sheet_policy_project_manager/static/description/index.html b/hr_timesheet_sheet_policy_project_manager/static/description/index.html index 134f9b89fb..e3b52f8837 100644 --- a/hr_timesheet_sheet_policy_project_manager/static/description/index.html +++ b/hr_timesheet_sheet_policy_project_manager/static/description/index.html @@ -367,7 +367,7 @@

HR Timesheet Sheet: Project Manager Policy

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

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

+

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

This module allows setting Department Manager as Reviewer on Timesheet Sheets.

Table of contents

@@ -386,7 +386,7 @@

Bug Tracker

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

+feedback.

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

@@ -413,7 +413,7 @@

Maintainers

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

-

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

+

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

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

diff --git a/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py b/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py index 584344bcbc..e2fd805407 100644 --- a/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py +++ b/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py @@ -21,6 +21,9 @@ def setUp(self): self.group_hr_timesheet_user = self.env.ref( "hr_timesheet.group_hr_timesheet_user" ) + self.group_hr_timesheet_approver = self.env.ref( + "hr_timesheet.group_hr_timesheet_approver" + ) self.group_project_user = self.env.ref("project.group_project_user") self.company = self.ResCompany.create({"name": "Company"}) self.env.user.company_ids += self.company @@ -59,7 +62,7 @@ def setUp(self): 6, 0, [ - self.group_hr_timesheet_user.id, + self.group_hr_timesheet_approver.id, self.group_project_user.id, self.group_multi_company.id, ], @@ -195,6 +198,7 @@ def test_project_manager_review_policy(self): ) with self.assertRaises(UserError): sheet.with_user(self.employee_user).action_timesheet_done() + sheet.with_user(self.project_manager_user_1).action_timesheet_done() sheet.with_user(self.project_manager_user_1).action_timesheet_draft() sheet.unlink() From 9c61789ca500b39615b9aa3893244547d75e8b9d Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 10 Jan 2023 20:52:24 +0000 Subject: [PATCH 10/17] Added translation using Weblate (Italian) --- .../i18n/it.po | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 hr_timesheet_sheet_policy_project_manager/i18n/it.po diff --git a/hr_timesheet_sheet_policy_project_manager/i18n/it.po b/hr_timesheet_sheet_policy_project_manager/i18n/it.po new file mode 100644 index 0000000000..60dc4bc2f0 --- /dev/null +++ b/hr_timesheet_sheet_policy_project_manager/i18n/it.po @@ -0,0 +1,96 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_timesheet_sheet_policy_project_manager +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-01-12 09:44+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.14.1\n" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model,name:hr_timesheet_sheet_policy_project_manager.model_account_analytic_line +msgid "Analytic Line" +msgstr "Riga analitica" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model.fields.selection,name:hr_timesheet_sheet_policy_project_manager.selection__res_company__timesheet_sheet_review_policy__project_manager +msgid "By Project Manager" +msgstr "Da responsabile progetto" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model,name:hr_timesheet_sheet_policy_project_manager.model_res_company +msgid "Companies" +msgstr "Aziende" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_account_analytic_line__display_name +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_hr_timesheet_sheet__display_name +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model.fields,help:hr_timesheet_sheet_policy_project_manager.field_res_company__timesheet_sheet_review_policy +msgid "How Timesheet Sheets review is performed." +msgstr "Come è realizzata la revisione delle schede foglio ore." + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_account_analytic_line__id +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_hr_timesheet_sheet__id +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company__id +msgid "ID" +msgstr "ID" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_account_analytic_line____last_update +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_hr_timesheet_sheet____last_update +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: hr_timesheet_sheet_policy_project_manager +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 +#, python-format +msgid "Only a Project Manager can review the sheet." +msgstr "Solo un responsabile progetto può revisionare la scheda." + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_hr_timesheet_sheet__project_id +#: model_terms:ir.ui.view,arch_db:hr_timesheet_sheet_policy_project_manager.view_hr_timesheet_sheet_filter +msgid "Project" +msgstr "Progetto" + +#. module: hr_timesheet_sheet_policy_project_manager +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 +#, python-format +msgid "Review policy \"By Project Manager\" requires Project to be set" +msgstr "" +"La politica di revisione \"Da responsabile progetto\" richiede " +"l'impostazione del progetto" + +#. module: hr_timesheet_sheet_policy_project_manager +#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 +#, python-format +msgid "" +"The Company in the Timesheet Sheet and in the Project must be the same." +msgstr "L'azienda nella scheda foglio ore e nel progetto deve essere la stessa." + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model,name:hr_timesheet_sheet_policy_project_manager.model_hr_timesheet_sheet +msgid "Timesheet Sheet" +msgstr "Scheda foglio ore" + +#. module: hr_timesheet_sheet_policy_project_manager +#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company__timesheet_sheet_review_policy +msgid "Timesheet Sheet Review Policy" +msgstr "Politica revisione scheda foglio ore" From 7bca1718535077b9d8bd81ca7dca7e9ffd3d85be Mon Sep 17 00:00:00 2001 From: "Yadier A. De Quesada" Date: Wed, 9 Aug 2023 09:27:24 +0200 Subject: [PATCH 11/17] [MIG] hr_timesheet_sheet_policy_project_manager: Migration to 16.0 [UPD] Update hr_timesheet_sheet_policy_project_manager.pot [UPD] README.rst Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: timesheet-16.0/timesheet-16.0-hr_timesheet_sheet_policy_project_manager Translate-URL: https://translation.odoo-community.org/projects/timesheet-16-0/timesheet-16-0-hr_timesheet_sheet_policy_project_manager/ [UPD] README.rst --- .../README.rst | 23 ++++++----- .../__manifest__.py | 2 +- .../i18n/es.po | 3 ++ ...timesheet_sheet_policy_project_manager.pot | 27 ++----------- .../i18n/it.po | 40 +++++++------------ .../models/hr_timesheet_sheet.py | 40 +++++++------------ .../static/description/index.html | 38 +++++++++--------- ..._timesheet_sheet_policy_project_manager.py | 8 ++-- 8 files changed, 73 insertions(+), 108 deletions(-) diff --git a/hr_timesheet_sheet_policy_project_manager/README.rst b/hr_timesheet_sheet_policy_project_manager/README.rst index 8a7d20c269..6e547c67af 100644 --- a/hr_timesheet_sheet_policy_project_manager/README.rst +++ b/hr_timesheet_sheet_policy_project_manager/README.rst @@ -2,10 +2,13 @@ HR Timesheet Sheet: Project Manager Policy ========================================== -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:c2f87ff32a1de807b17d99544907a2a2ba5e31135fd89a8335114916d1ae68d9 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -14,16 +17,16 @@ HR Timesheet Sheet: Project Manager Policy :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ftimesheet-lightgray.png?logo=github - :target: https://github.com/OCA/timesheet/tree/14.0/hr_timesheet_sheet_policy_project_manager + :target: https://github.com/OCA/timesheet/tree/16.0/hr_timesheet_sheet_policy_project_manager :alt: OCA/timesheet .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/timesheet-14-0/timesheet-14-0-hr_timesheet_sheet_policy_project_manager + :target: https://translation.odoo-community.org/projects/timesheet-16-0/timesheet-16-0-hr_timesheet_sheet_policy_project_manager :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/117/14.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/timesheet&target_branch=16.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module allows setting Department Manager as Reviewer on Timesheet Sheets. @@ -37,8 +40,8 @@ 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 `_. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -70,6 +73,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/timesheet `_ project on GitHub. +This module is part of the `OCA/timesheet `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/hr_timesheet_sheet_policy_project_manager/__manifest__.py b/hr_timesheet_sheet_policy_project_manager/__manifest__.py index 7e8ba46c8b..ab98035257 100644 --- a/hr_timesheet_sheet_policy_project_manager/__manifest__.py +++ b/hr_timesheet_sheet_policy_project_manager/__manifest__.py @@ -4,7 +4,7 @@ { "name": "HR Timesheet Sheet: Project Manager Policy", - "version": "14.0.1.0.0", + "version": "16.0.1.0.0", "author": "CorporateHub, Odoo Community Association (OCA)", "website": "https://github.com/OCA/timesheet", "license": "AGPL-3", diff --git a/hr_timesheet_sheet_policy_project_manager/i18n/es.po b/hr_timesheet_sheet_policy_project_manager/i18n/es.po index 9a00938a1d..1913fae219 100644 --- a/hr_timesheet_sheet_policy_project_manager/i18n/es.po +++ b/hr_timesheet_sheet_policy_project_manager/i18n/es.po @@ -37,6 +37,7 @@ msgid "How Timesheet Sheets review is performed." msgstr "Cómo ser realiza la revisión de Partes de horas." #. module: hr_timesheet_sheet_policy_project_manager +#. odoo-python #: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 #, python-format msgid "Only a Project Manager can review the sheet." @@ -49,6 +50,7 @@ msgid "Project" msgstr "Proyecto" #. module: hr_timesheet_sheet_policy_project_manager +#. odoo-python #: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 #, python-format msgid "Review policy \"By Project Manager\" requires Project to be set" @@ -57,6 +59,7 @@ msgstr "" "el proyecto" #. module: hr_timesheet_sheet_policy_project_manager +#. odoo-python #: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 #, python-format msgid "The Company in the Timesheet Sheet and in the Project must be the same." diff --git a/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot b/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot index 35d985bb68..d03465a5da 100644 --- a/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot +++ b/hr_timesheet_sheet_policy_project_manager/i18n/hr_timesheet_sheet_policy_project_manager.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 14.0\n" +"Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -28,33 +28,13 @@ msgstr "" msgid "Companies" msgstr "" -#. module: hr_timesheet_sheet_policy_project_manager -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_account_analytic_line__display_name -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_hr_timesheet_sheet__display_name -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company__display_name -msgid "Display Name" -msgstr "" - #. module: hr_timesheet_sheet_policy_project_manager #: model:ir.model.fields,help:hr_timesheet_sheet_policy_project_manager.field_res_company__timesheet_sheet_review_policy msgid "How Timesheet Sheets review is performed." msgstr "" #. module: hr_timesheet_sheet_policy_project_manager -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_account_analytic_line__id -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_hr_timesheet_sheet__id -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company__id -msgid "ID" -msgstr "" - -#. module: hr_timesheet_sheet_policy_project_manager -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_account_analytic_line____last_update -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_hr_timesheet_sheet____last_update -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company____last_update -msgid "Last Modified on" -msgstr "" - -#. module: hr_timesheet_sheet_policy_project_manager +#. odoo-python #: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 #, python-format msgid "Only a Project Manager can review the sheet." @@ -67,13 +47,14 @@ msgid "Project" msgstr "" #. module: hr_timesheet_sheet_policy_project_manager -#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 +#. odoo-python #: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 #, python-format msgid "Review policy \"By Project Manager\" requires Project to be set" msgstr "" #. module: hr_timesheet_sheet_policy_project_manager +#. odoo-python #: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 #, python-format msgid "" diff --git a/hr_timesheet_sheet_policy_project_manager/i18n/it.po b/hr_timesheet_sheet_policy_project_manager/i18n/it.po index 60dc4bc2f0..b46c4094db 100644 --- a/hr_timesheet_sheet_policy_project_manager/i18n/it.po +++ b/hr_timesheet_sheet_policy_project_manager/i18n/it.po @@ -31,33 +31,13 @@ msgstr "Da responsabile progetto" msgid "Companies" msgstr "Aziende" -#. module: hr_timesheet_sheet_policy_project_manager -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_account_analytic_line__display_name -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_hr_timesheet_sheet__display_name -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company__display_name -msgid "Display Name" -msgstr "Nome visualizzato" - #. module: hr_timesheet_sheet_policy_project_manager #: model:ir.model.fields,help:hr_timesheet_sheet_policy_project_manager.field_res_company__timesheet_sheet_review_policy msgid "How Timesheet Sheets review is performed." msgstr "Come è realizzata la revisione delle schede foglio ore." #. module: hr_timesheet_sheet_policy_project_manager -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_account_analytic_line__id -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_hr_timesheet_sheet__id -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company__id -msgid "ID" -msgstr "ID" - -#. module: hr_timesheet_sheet_policy_project_manager -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_account_analytic_line____last_update -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_hr_timesheet_sheet____last_update -#: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company____last_update -msgid "Last Modified on" -msgstr "Ultima modifica il" - -#. module: hr_timesheet_sheet_policy_project_manager +#. odoo-python #: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 #, python-format msgid "Only a Project Manager can review the sheet." @@ -70,7 +50,7 @@ msgid "Project" msgstr "Progetto" #. module: hr_timesheet_sheet_policy_project_manager -#: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 +#. odoo-python #: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 #, python-format msgid "Review policy \"By Project Manager\" requires Project to be set" @@ -79,11 +59,12 @@ msgstr "" "l'impostazione del progetto" #. module: hr_timesheet_sheet_policy_project_manager +#. odoo-python #: code:addons/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py:0 #, python-format -msgid "" -"The Company in the Timesheet Sheet and in the Project must be the same." -msgstr "L'azienda nella scheda foglio ore e nel progetto deve essere la stessa." +msgid "The Company in the Timesheet Sheet and in the Project must be the same." +msgstr "" +"L'azienda nella scheda foglio ore e nel progetto deve essere la stessa." #. module: hr_timesheet_sheet_policy_project_manager #: model:ir.model,name:hr_timesheet_sheet_policy_project_manager.model_hr_timesheet_sheet @@ -94,3 +75,12 @@ msgstr "Scheda foglio ore" #: model:ir.model.fields,field_description:hr_timesheet_sheet_policy_project_manager.field_res_company__timesheet_sheet_review_policy msgid "Timesheet Sheet Review Policy" msgstr "Politica revisione scheda foglio ore" + +#~ msgid "Display Name" +#~ msgstr "Nome visualizzato" + +#~ msgid "ID" +#~ msgstr "ID" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima modifica il" diff --git a/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py b/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py index 6ce6e2b91b..d69f281fcd 100644 --- a/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py +++ b/hr_timesheet_sheet_policy_project_manager/models/hr_timesheet_sheet.py @@ -11,6 +11,7 @@ class HrTimesheetSheet(models.Model): project_id = fields.Many2one( string="Project", comodel_name="project.project", + domain="[('company_id', '=', company_id)]", readonly=True, states={"new": [("readonly", False)]}, ) @@ -26,13 +27,13 @@ def _compute_complete_name_project_id(self): def _get_complete_name_components(self): self.ensure_one() result = super()._get_complete_name_components() - if self.review_policy == "project_manager": + if self.review_policy == "project_manager" and self.project_id: result += [self.project_id.name_get()[0][1]] return result def _get_overlapping_sheet_domain(self): domain = super()._get_overlapping_sheet_domain() - if self.review_policy == "project_manager": + if self.review_policy == "project_manager" and self.project_id: domain += [("project_id", "=", self.project_id.id)] return domain @@ -81,38 +82,25 @@ def _get_timesheet_sheet_lines_domain(self): def _onchange_project_id(self): self.add_line_project_id = self.project_id self._compute_timesheet_ids() - return self.onchange_add_project_id() def _check_can_review(self): - super()._check_can_review() + res = super()._check_can_review() if self.filtered( lambda sheet: not sheet.can_review and sheet.review_policy == "project_manager" ): raise UserError(_("Only a Project Manager can review the sheet.")) + return res def reset_add_line(self): - super().reset_add_line() + res = super().reset_add_line() self.write({"add_line_project_id": self.project_id.id}) + return res - @api.model - def create(self, vals): - review_policy = vals.get( - "review_policy", self.default_get(["review_policy"])["review_policy"] - ) - if review_policy == "project_manager" and not vals.get("project_id"): - raise UserError( - _('Review policy "By Project Manager" requires Project to be set') - ) - return super().create(vals) - - def write(self, vals): - if ( - self.filtered(lambda x: x.review_policy == "project_manager") - and "project_id" in vals - and not vals.get("project_id") - ): - raise UserError( - _('Review policy "By Project Manager" requires Project to be set') - ) - return super().write(vals) + @api.constrains("review_policy", "project_id") + def _check_review_policy(self): + for rec in self: + if rec.review_policy == "project_manager" and not rec.project_id: + raise UserError( + _('Review policy "By Project Manager" requires Project to be set') + ) diff --git a/hr_timesheet_sheet_policy_project_manager/static/description/index.html b/hr_timesheet_sheet_policy_project_manager/static/description/index.html index e3b52f8837..e88d885ec3 100644 --- a/hr_timesheet_sheet_policy_project_manager/static/description/index.html +++ b/hr_timesheet_sheet_policy_project_manager/static/description/index.html @@ -1,20 +1,20 @@ - + - + HR Timesheet Sheet: Project Manager Policy -
-

HR Timesheet Sheet: Project Manager Policy

+
+ + +Odoo Community Association + +
+

HR Timesheet Sheet: Project Manager Policy

-

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

+

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

This module allows setting Department Manager as Reviewer on Timesheet Sheets.

Table of contents

+
+

Configuration

+

Go to Timesheets > Configuration > Timesheet Options > Timesheet Sheet +Review Policy and select the option “By Project Manager”.

+
+
+

Usage

+
    +
  • The “Project” field is added to the Timesheet Sheets.
  • +
  • The records that will be created in the sheets will be filtered by the +defined project.
  • +
  • The possible reviewers will also be the Project Managers of the +corresponding project.
  • +
+
-

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 @@ -393,15 +415,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 @@ -423,5 +445,6 @@

Maintainers

+
diff --git a/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py b/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py index 9bf05dafc3..11ee910e25 100644 --- a/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py +++ b/hr_timesheet_sheet_policy_project_manager/tests/test_hr_timesheet_sheet_policy_project_manager.py @@ -1,248 +1,129 @@ # Copyright 2019 Brainbean Apps (https://brainbeanapps.com) +# Copyright 2025 Tecnativa - Víctor Martínez # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo.exceptions import UserError, ValidationError -from odoo.tests import common +from odoo.tests.common import users +from odoo.tools import mute_logger +from odoo.addons.hr_timesheet_sheet.tests.test_hr_timesheet_sheet import ( + TestHrTimesheetSheetCommon, +) -class TestHrTimesheetSheetPolicyProjectManager(common.TransactionCase): - def setUp(self): - super().setUp() - self.ResUsers = self.env["res.users"] - self.ResCompany = self.env["res.company"] - self.HrEmployee = self.env["hr.employee"] - self.HrDepartment = self.env["hr.department"] - self.ProjectProject = self.env["project.project"] - self.AccountAnalyticLine = self.env["account.analytic.line"] - self.HrTimesheetSheet = self.env["hr_timesheet.sheet"] - self.group_hr_user = self.env.ref("hr.group_hr_user") - self.group_multi_company = self.env.ref("base.group_multi_company") - self.group_hr_timesheet_user = self.env.ref( - "hr_timesheet.group_hr_timesheet_user" - ) - self.group_hr_timesheet_approver = self.env.ref( - "hr_timesheet.group_hr_timesheet_approver" - ) - self.group_project_user = self.env.ref("project.group_project_user") - self.company = self.ResCompany.create({"name": "Company"}) - self.env.user.company_ids += self.company - self.employee_user = self.ResUsers.with_context(no_reset_password=True).create( - { - "name": "Employee User", - "login": "employee_user", - "email": "employee_user@example.com", - "groups_id": [ - ( - 6, - 0, - [ - self.group_hr_user.id, - self.group_hr_timesheet_user.id, - self.group_project_user.id, - self.group_multi_company.id, - ], - ) - ], - "company_id": self.company.id, - "company_ids": [(4, self.company.id)], - } - ) - self.project_manager_user_1 = self.ResUsers.with_context( - no_reset_password=True - ).create( - { - "name": "Project Manager User 1", - "login": "project_manager_user_1", - "email": "project_manager_user_1@example.com", - "groups_id": [ - ( - 6, - 0, - [ - self.group_hr_timesheet_approver.id, - self.group_project_user.id, - self.group_multi_company.id, - ], - ) - ], - "company_id": self.company.id, - "company_ids": [(4, self.company.id)], - } - ) - self.project_manager_user_2 = self.ResUsers.with_context( - no_reset_password=True - ).create( - { - "name": "Project Manager User 2", - "login": "project_manager_user_2", - "email": "project_manager_user_2@example.com", - "groups_id": [ - ( - 6, - 0, - [ - self.group_hr_timesheet_user.id, - self.group_project_user.id, - self.group_multi_company.id, - ], - ) - ], - "company_id": self.company.id, - "company_ids": [(4, self.company.id)], - } - ) - self.employee = self.HrEmployee.create( - { - "name": "Employee", - "user_id": self.employee_user.id, - "company_id": self.company.id, - } - ) - self.project_manager_1 = self.HrEmployee.create( - { - "name": "Project Manager 1", - "user_id": self.project_manager_user_1.id, - "company_id": self.company.id, - } - ) - self.project_manager_2 = self.HrEmployee.create( - { - "name": "Project Manager 2", - "user_id": self.project_manager_user_2.id, - "company_id": self.company.id, - } - ) - self.project_1 = self.ProjectProject.create( - { - "name": "Project 1", - "company_id": self.company.id, - "allow_timesheets": True, - "user_id": self.project_manager_user_1.id, - } - ) - self.project_2 = self.ProjectProject.create( - { - "name": "Project 2", - "company_id": self.company.id, - "allow_timesheets": True, - "user_id": self.project_manager_user_2.id, - } - ) +class TestHrTimesheetSheetPolicyProjectManager(TestHrTimesheetSheetCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.project_manager_user_1 = cls.user_3 + cls.project_manager_user_2 = cls.user_4 + @mute_logger("odoo.models.unlink") + @users("test_user") def test_review_policy_capture(self): self.company.timesheet_sheet_review_policy = "project_manager" - sheet = self.HrTimesheetSheet.with_user(self.employee_user).create( - {"company_id": self.company.id, "project_id": self.project_1.id} - ) + sheet_model = self.sheet_model.with_user(self.env.user) + sheet = sheet_model.create({"project_id": self.project_1.id}) self.assertEqual(sheet.review_policy, "project_manager") self.company.timesheet_sheet_review_policy = "hr" self.assertEqual(sheet.review_policy, "project_manager") sheet.unlink() + self.assertFalse(sheet.exists()) + @mute_logger("odoo.models.unlink") def test_project_manager_review_policy(self): self.company.timesheet_sheet_review_policy = "project_manager" - - timesheet_0 = self.AccountAnalyticLine.with_user(self.employee_user).create( + timesheet_0 = self.aal_model.with_user(self.user).create( { "name": "test", "project_id": self.project_2.id, "employee_id": self.employee.id, } ) - timesheet_1 = self.AccountAnalyticLine.with_user(self.employee_user).create( + timesheet_1 = self.aal_model.with_user(self.user).create( { "name": "test", "project_id": self.project_1.id, "employee_id": self.employee.id, } ) - with self.assertRaises(UserError): - self.HrTimesheetSheet.with_user(self.employee_user).create( - {"company_id": self.employee_user.company_id.id} + self.sheet_model.with_user(self.user).create( + {"company_id": self.employee.company_id.id} ) - sheet = self.HrTimesheetSheet.with_user(self.employee_user).create( + sheet = self.sheet_model.with_user(self.user).create( { - "company_id": self.employee_user.company_id.id, + "company_id": self.employee.company_id.id, "project_id": self.project_1.id, } ) with self.assertRaises(UserError): sheet.project_id = False self.company.timesheet_sheet_review_policy = "hr" - - sheet._compute_complete_name() - sheet._onchange_project_id() sheet._onchange_scope() sheet._onchange_timesheets() self.assertEqual(len(sheet.timesheet_ids), 1) self.assertEqual(len(sheet.line_ids), 7) - with self.assertRaises(UserError): sheet.with_user(self.project_manager_user_2).action_timesheet_done() - with self.assertRaises(UserError): sheet.with_user(self.project_manager_user_2).action_timesheet_draft() - sheet.action_timesheet_confirm() - self.assertFalse(sheet.with_user(self.employee_user).can_review) + self.assertFalse(sheet.with_user(self.user).can_review) self.assertEqual( - self.HrTimesheetSheet.with_user(self.employee_user).search_count( + self.sheet_model.with_user(self.user).search_count( [("can_review", "=", True)] ), 0, ) with self.assertRaises(UserError): - sheet.with_user(self.employee_user).action_timesheet_done() - + sheet.with_user(self.user).action_timesheet_done() sheet.with_user(self.project_manager_user_1).action_timesheet_done() sheet.with_user(self.project_manager_user_1).action_timesheet_draft() sheet.unlink() - + self.assertFalse(sheet.exists()) timesheet_0.unlink() + self.assertFalse(timesheet_0.exists()) timesheet_1.unlink() + self.assertFalse(timesheet_1.exists()) + @mute_logger("odoo.models.unlink") + @users("test_user") def test_project_manager_review_policy_project_required(self): - sheet = self.HrTimesheetSheet.with_user(self.employee_user).new( + sheet_model = self.sheet_model.with_user(self.env.user) + sheet = sheet_model.new( { - "employee_id": self.employee.id, - "company_id": self.company.id, - "date_start": self.HrTimesheetSheet._default_date_start(), - "date_end": self.HrTimesheetSheet._default_date_end(), + "date_start": self.sheet_model._default_date_start(), + "date_end": self.sheet_model._default_date_end(), "review_policy": "project_manager", "state": "new", } ) values = sheet._convert_to_write(sheet._cache) with self.assertRaises(UserError): - self.HrTimesheetSheet.with_user(self.employee_user).create(values) + sheet_model.create(values) sheet.project_id = self.project_1 values.update(sheet._convert_to_write(sheet._cache)) - sheet = self.HrTimesheetSheet.with_user(self.employee_user).create(values) + sheet = sheet_model.create(values) with self.assertRaises(UserError): sheet.project_id = False sheet.unlink() + self.assertFalse(sheet.exists()) + @mute_logger("odoo.models.unlink") + @users("test_user") def test_project_manager_review_policy_overlapping(self): self.company.timesheet_sheet_review_policy = "project_manager" - - sheet1 = self.HrTimesheetSheet.with_user(self.employee_user).create( - {"company_id": self.company.id, "project_id": self.project_1.id} - ) + sheet_model = self.sheet_model.with_user(self.env.user) + sheet1 = sheet_model.create({"project_id": self.project_1.id}) with self.assertRaises(ValidationError): - sheet2 = self.HrTimesheetSheet.with_user(self.employee_user).create( - {"company_id": self.company.id, "project_id": self.project_1.id} - ) - - sheet2 = self.HrTimesheetSheet.with_user(self.employee_user).create( - {"company_id": self.company.id, "project_id": self.project_2.id} - ) + sheet2 = sheet_model.create({"project_id": self.project_1.id}) + sheet2 = sheet_model.create({"project_id": self.project_2.id}) with self.assertRaises(ValidationError): sheet2.write({"project_id": self.project_1.id}) - self.company.timesheet_sheet_review_policy = "hr" - sheet1.unlink() + self.assertFalse(sheet1.exists()) sheet2.unlink() + self.assertFalse(sheet2.exists()) diff --git a/hr_timesheet_sheet_policy_project_manager/views/hr_timesheet_sheet.xml b/hr_timesheet_sheet_policy_project_manager/views/hr_timesheet_sheet.xml index 1ead297e5a..701a345e8f 100644 --- a/hr_timesheet_sheet_policy_project_manager/views/hr_timesheet_sheet.xml +++ b/hr_timesheet_sheet_policy_project_manager/views/hr_timesheet_sheet.xml @@ -15,29 +15,31 @@ > - {'invisible': [('review_policy', '=', 'project_manager')]} + review_policy=='project_manager' + parent.state!='new' {'column_invisible': [('parent.review_policy', '=', 'project_manager')]} + name="column_invisible" + >parent.review_policy=='project_manager' + parent.state!='new' {'invisible': [('parent.review_policy', '=', 'project_manager')]} + name="invisible" + >parent.review_policy=='project_manager' From 68792358a6de7143fcbb8b6927b8e5e7cbfa08ba Mon Sep 17 00:00:00 2001 From: Bhavesh Heliconia Date: Wed, 20 May 2026 16:50:13 +0530 Subject: [PATCH 16/17] [MIG] hr_timesheet_sheet_policy_project_manager: Migration to 19.0 --- hr_timesheet_sheet_policy_project_manager/README.rst | 10 +++++----- .../__manifest__.py | 2 +- .../static/description/index.html | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hr_timesheet_sheet_policy_project_manager/README.rst b/hr_timesheet_sheet_policy_project_manager/README.rst index 0deeee737a..2ca7014ce8 100644 --- a/hr_timesheet_sheet_policy_project_manager/README.rst +++ b/hr_timesheet_sheet_policy_project_manager/README.rst @@ -21,13 +21,13 @@ HR Timesheet Sheet: Project Manager Policy :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ftimesheet-lightgray.png?logo=github - :target: https://github.com/OCA/timesheet/tree/18.0/hr_timesheet_sheet_policy_project_manager + :target: https://github.com/OCA/timesheet/tree/19.0/hr_timesheet_sheet_policy_project_manager :alt: OCA/timesheet .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/timesheet-18-0/timesheet-18-0-hr_timesheet_sheet_policy_project_manager + :target: https://translation.odoo-community.org/projects/timesheet-19-0/timesheet-19-0-hr_timesheet_sheet_policy_project_manager :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/timesheet&target_branch=18.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/timesheet&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -61,7 +61,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. @@ -93,6 +93,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/timesheet `_ project on GitHub. +This module is part of the `OCA/timesheet `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/hr_timesheet_sheet_policy_project_manager/__manifest__.py b/hr_timesheet_sheet_policy_project_manager/__manifest__.py index 020f1b45db..5e9c723cac 100644 --- a/hr_timesheet_sheet_policy_project_manager/__manifest__.py +++ b/hr_timesheet_sheet_policy_project_manager/__manifest__.py @@ -4,7 +4,7 @@ { "name": "HR Timesheet Sheet: Project Manager Policy", - "version": "18.0.1.0.0", + "version": "19.0.1.0.0", "author": "CorporateHub, Odoo Community Association (OCA)", "website": "https://github.com/OCA/timesheet", "license": "AGPL-3", diff --git a/hr_timesheet_sheet_policy_project_manager/static/description/index.html b/hr_timesheet_sheet_policy_project_manager/static/description/index.html index adb3763ff8..cf460aa5df 100644 --- a/hr_timesheet_sheet_policy_project_manager/static/description/index.html +++ b/hr_timesheet_sheet_policy_project_manager/static/description/index.html @@ -374,7 +374,7 @@

HR Timesheet Sheet: Project Manager Policy

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:f3f1a519f6fc46cf06ceeee534d2b605f7bb3f712a85978b423f5938bfb26112 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

+

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

This module allows setting Department Manager as Reviewer on Timesheet Sheets.

Table of contents

@@ -411,7 +411,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.

@@ -440,7 +440,7 @@

Maintainers

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

-

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

+

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

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

From 604294d035276e0c6ab88bfb4f20f7a0aee9c0a2 Mon Sep 17 00:00:00 2001 From: Bhavesh Heliconia Date: Wed, 20 May 2026 16:53:29 +0530 Subject: [PATCH 17/17] [DON'T MERGE] test-requirements.txt --- test-requirements.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 test-requirements.txt diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 0000000000..2ceaf84957 --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1,2 @@ +odoo-addon-hr_timesheet_sheet @ git+https://github.com/OCA/timesheet.git@refs/pull/841/head#subdirectory=hr_timesheet_sheet +odoo-addon-web_widget_x2many_2d_matrix @ git+https://github.com/OCA/web.git@refs/pull/3310/head#subdirectory=web_widget_x2many_2d_matrix