From 2dd16be1e81277a853285f187179ceb4036fcbca Mon Sep 17 00:00:00 2001 From: SilvioC2C Date: Thu, 11 Jul 2024 12:26:59 +0200 Subject: [PATCH] [WIP][MIG] connector_jira_tempo: Migration to 17.0 --- connector_jira_tempo/__init__.py | 2 + connector_jira_tempo/__manifest__.py | 6 +- connector_jira_tempo/components/__init__.py | 4 ++ .../jira_analytic_line_mapper.py} | 7 +-- .../components/jira_worklog_adapter.py | 32 ++++++++++ connector_jira_tempo/data/cron.xml | 4 +- .../models/account_analytic_line.py | 21 +++++++ .../models/account_analytic_line/__init__.py | 4 -- .../models/account_analytic_line/common.py | 62 ------------------- .../common.py => jira_backend.py} | 26 ++++---- .../models/jira_backend/__init__.py | 1 - connector_jira_tempo/reports/__init__.py | 1 + .../reports/timesheet_analysis_report.py | 24 +++++++ ...tic_line.xml => account_analytic_line.xml} | 13 ++-- ...jira_backend_view.xml => jira_backend.xml} | 0 15 files changed, 111 insertions(+), 96 deletions(-) create mode 100644 connector_jira_tempo/components/__init__.py rename connector_jira_tempo/{models/account_analytic_line/importer.py => components/jira_analytic_line_mapper.py} (75%) create mode 100644 connector_jira_tempo/components/jira_worklog_adapter.py create mode 100644 connector_jira_tempo/models/account_analytic_line.py delete mode 100644 connector_jira_tempo/models/account_analytic_line/__init__.py delete mode 100644 connector_jira_tempo/models/account_analytic_line/common.py rename connector_jira_tempo/models/{jira_backend/common.py => jira_backend.py} (90%) delete mode 100644 connector_jira_tempo/models/jira_backend/__init__.py create mode 100644 connector_jira_tempo/reports/__init__.py create mode 100644 connector_jira_tempo/reports/timesheet_analysis_report.py rename connector_jira_tempo/views/{timesheet_account_analytic_line.xml => account_analytic_line.xml} (79%) rename connector_jira_tempo/views/{jira_backend_view.xml => jira_backend.xml} (100%) diff --git a/connector_jira_tempo/__init__.py b/connector_jira_tempo/__init__.py index 4b76c7b2d..17a161617 100644 --- a/connector_jira_tempo/__init__.py +++ b/connector_jira_tempo/__init__.py @@ -1,3 +1,5 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from . import components from . import models +from . import reports diff --git a/connector_jira_tempo/__manifest__.py b/connector_jira_tempo/__manifest__.py index df6f6ee2b..79d89e3da 100644 --- a/connector_jira_tempo/__manifest__.py +++ b/connector_jira_tempo/__manifest__.py @@ -2,7 +2,7 @@ { "name": "JIRA Connector Tempo", - "version": "15.0.1.0.0", + "version": "17.0.1.0.0", "author": "Camptocamp, Odoo Community Association (OCA)", "license": "AGPL-3", "category": "Connector", @@ -10,8 +10,8 @@ "website": "https://github.com/OCA/connector-jira", "data": [ "data/cron.xml", - "views/jira_backend_view.xml", - "views/timesheet_account_analytic_line.xml", + "views/account_analytic_line.xml", + "views/jira_backend.xml", ], "installable": True, } diff --git a/connector_jira_tempo/components/__init__.py b/connector_jira_tempo/components/__init__.py new file mode 100644 index 000000000..ef6b869e9 --- /dev/null +++ b/connector_jira_tempo/components/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import jira_analytic_line_mapper +from . import jira_worklog_adapter diff --git a/connector_jira_tempo/models/account_analytic_line/importer.py b/connector_jira_tempo/components/jira_analytic_line_mapper.py similarity index 75% rename from connector_jira_tempo/models/account_analytic_line/importer.py rename to connector_jira_tempo/components/jira_analytic_line_mapper.py index 8d96bf6d5..b021ff85a 100644 --- a/connector_jira_tempo/models/account_analytic_line/importer.py +++ b/connector_jira_tempo/components/jira_analytic_line_mapper.py @@ -6,13 +6,10 @@ from odoo.addons.connector.components.mapper import mapping -class AnalyticLineMapper(Component): +class JiraAnalyticLineMapper(Component): _inherit = "jira.analytic.line.mapper" @mapping def tempo_timesheets_approval(self, record): approval = record.get("_tempo_timesheets_approval", {"status": {"key": "OPEN"}}) - values = { - "jira_tempo_status": approval["status"]["key"].lower(), - } - return values + return {"jira_tempo_status": approval["status"]["key"].lower()} diff --git a/connector_jira_tempo/components/jira_worklog_adapter.py b/connector_jira_tempo/components/jira_worklog_adapter.py new file mode 100644 index 000000000..8d30e3704 --- /dev/null +++ b/connector_jira_tempo/components/jira_worklog_adapter.py @@ -0,0 +1,32 @@ +# Copyright 2019 Camptocamp SA +# Copyright 2019 Brainbean Apps (https://brainbeanapps.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +import datetime +import json + +from odoo.addons.component.core import Component + + +class JiraWorklogAdapter(Component): + _inherit = "jira.worklog.adapter" + + def read(self, issue_id, worklog_id): + worklog = super().read(issue_id, worklog_id) + if self.env.context.get("jira_worklog_no_tempo_timesheets_approval_data"): + return worklog + with self.handle_404(): + approval = self.tempo_timesheets_approval_read(worklog) + worklog["_tempo_timesheets_approval"] = approval + return worklog + + def tempo_timesheets_approval_read(self, worklog): + backend = self._tempo_timesheets_get_webservice() + account_id = worklog["author"]["accountId"] + period_start = datetime.date.today().isoformat() + endpoint = f"timesheet-approvals/user/{account_id}?from={period_start}" + return json.loads(backend.call("get", url_params={"endpoint": endpoint})) + + def tempo_timesheets_approval_read_status_by_team(self, team_id, period_start): + backend = self._tempo_timesheets_get_webservice() + endpoint = f"timesheet-approvals/team/{team_id}?from={period_start}" + return json.loads(backend.call("get", url_params={"endpoint": endpoint})) diff --git a/connector_jira_tempo/data/cron.xml b/connector_jira_tempo/data/cron.xml index 42670e3e1..9e13cd419 100644 --- a/connector_jira_tempo/data/cron.xml +++ b/connector_jira_tempo/data/cron.xml @@ -10,11 +10,11 @@ model.search([])._scheduler_sync_tempo_timesheets_approval_status() - + 1 days -1 - + diff --git a/connector_jira_tempo/models/account_analytic_line.py b/connector_jira_tempo/models/account_analytic_line.py new file mode 100644 index 000000000..96d214b8e --- /dev/null +++ b/connector_jira_tempo/models/account_analytic_line.py @@ -0,0 +1,21 @@ +# Copyright 2019 Camptocamp SA +# 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 AccountAnalyticLine(models.Model): + _inherit = "account.analytic.line" + + jira_tempo_status = fields.Selection( + selection=[ + ("approved", "Approved"), + ("in_review", "In Review"), + # no longer used on cloud version + ("waiting_for_approval", "Waiting for approval"), + # no longer used on cloud version + ("ready_to_submit", "Ready to submit"), + ("open", "Open"), + ] + ) diff --git a/connector_jira_tempo/models/account_analytic_line/__init__.py b/connector_jira_tempo/models/account_analytic_line/__init__.py deleted file mode 100644 index ea8197b11..000000000 --- a/connector_jira_tempo/models/account_analytic_line/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -from . import common -from . import importer diff --git a/connector_jira_tempo/models/account_analytic_line/common.py b/connector_jira_tempo/models/account_analytic_line/common.py deleted file mode 100644 index b3c17dda2..000000000 --- a/connector_jira_tempo/models/account_analytic_line/common.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright 2019 Camptocamp SA -# Copyright 2019 Brainbean Apps (https://brainbeanapps.com) -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -import datetime -import json - -from odoo import fields, models - -from odoo.addons.component.core import Component - - -class AccountAnalyticLine(models.Model): - _inherit = "account.analytic.line" - - jira_tempo_status = fields.Selection( - selection=[ - ("approved", "Approved"), - ("in_review", "In Review"), - ( - "waiting_for_approval", - "Waiting for approval", - ), # no longer used on cloud version - ("ready_to_submit", "Ready to submit"), # no longer used on cloud version - ("open", "Open"), - ] - ) - - -class WorklogAdapter(Component): - _inherit = "jira.worklog.adapter" - - def read(self, issue_id, worklog_id): - worklog = super().read(issue_id, worklog_id) - if self.env.context.get("jira_worklog_no_tempo_timesheets_approval_data"): - return worklog - with self.handle_404(): - worklog["_tempo_timesheets_approval"] = self.tempo_timesheets_approval_read( - worklog - ) - return worklog - - def tempo_timesheets_approval_read(self, worklog): - backend = self._tempo_timesheets_get_webservice() - account_id = worklog["author"]["accountId"] - period_start = datetime.date.today().isoformat() - response = backend.call( - "get", - url_params={ - "endpoint": f"timesheet-approvals/user/{account_id}?from={period_start}" - }, - ) - return json.loads(response) - - def tempo_timesheets_approval_read_status_by_team(self, team_id, period_start): # noqa - backend = self._tempo_timesheets_get_webservice() - response = backend.call( - "get", - url_params={ - "endpoint": f"timesheet-approvals/team/{team_id}?from={period_start}" - }, - ) - return json.loads(response) diff --git a/connector_jira_tempo/models/jira_backend/common.py b/connector_jira_tempo/models/jira_backend.py similarity index 90% rename from connector_jira_tempo/models/jira_backend/common.py rename to connector_jira_tempo/models/jira_backend.py index 53fd37ea8..879ecebff 100644 --- a/connector_jira_tempo/models/jira_backend/common.py +++ b/connector_jira_tempo/models/jira_backend.py @@ -13,8 +13,7 @@ def get_past_week_1st_day(): today = datetime.today() - date = today - timedelta(days=today.weekday() % 7) - timedelta(weeks=1) - return date.strftime("%Y-%m-%d") + return (today - timedelta(weeks=1, days=today.weekday() % 7)).strftime("%Y-%m-%d") class JiraBackend(models.Model): @@ -47,7 +46,7 @@ def _scheduler_sync_tempo_timesheets_approval_status(self, period_start=None): if period_start is None: # NOTE: it seems that the preciseness of this date # is not really important. - # If you don't pass the very begin date of the period + # If you don't pass the very beginning date of the period # but a date in the middle, the api will give you back # the right period range matching that date. # Still, we want to put clear that we want to retrieve @@ -62,8 +61,7 @@ def _sync_tempo_timesheets_approval_status(self, period_start): with self.work_on("jira.account.analytic.line") as work: importer = work.component(usage="backend.adapter") response = importer.tempo_timesheets_approval_read_status_by_team( - team_id, - period_start, + team_id, period_start ) user_binder = importer.binder_for("jira.res.users") mapping = defaultdict(list) @@ -76,18 +74,22 @@ def _sync_tempo_timesheets_approval_status(self, period_start): except ValueError: _logger.error("User %s not found", user_data) continue - status = result["status"]["key"].lower() - mapping[(date_from, date_to, status)].append(user.id) + mapping[(date_from, date_to, result["status"]["key"].lower())] += [user.id] for (date_from, date_to, state), user_ids in mapping.items(): self._update_ts_line_status(date_from, date_to, state, user_ids) def _update_ts_line_status(self, date_from, date_to, state, user_ids): lines = self._get_ts_lines(date_from, date_to, user_ids) - lines.mapped("jira_bind_ids").write({"jira_tempo_status": state}) + lines.jira_bind_ids.write({"jira_tempo_status": state}) self._validate_ts(date_from, date_to, state, user_ids) + def _get_ts_lines(self, date_from, date_to, user_ids): + ts_line_model = self.env["account.analytic.line"] + domain = self._get_ts_lines_domain(date_from, date_to, user_ids) + return ts_line_model.search(domain) + def _get_ts_lines_domain(self, date_from, date_to, user_ids): - domain = [ + return [ # TODO: any better filter here? # `is_timesheet` is not available since we don't use ts_grid # But `is_timesheet` is a computed field with value: @@ -97,12 +99,6 @@ def _get_ts_lines_domain(self, date_from, date_to, user_ids): ("date", "<=", date_to), ("user_id", "in", user_ids), ] - return domain - - def _get_ts_lines(self, date_from, date_to, user_ids): - ts_line_model = self.env["account.analytic.line"] - domain = self._get_ts_lines_domain(date_from, date_to, user_ids) - return ts_line_model.search(domain) def _validate_ts(self, date_from, date_to, state, user_ids): # hook here and do what you want depending on the state diff --git a/connector_jira_tempo/models/jira_backend/__init__.py b/connector_jira_tempo/models/jira_backend/__init__.py deleted file mode 100644 index e4193cf05..000000000 --- a/connector_jira_tempo/models/jira_backend/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import common diff --git a/connector_jira_tempo/reports/__init__.py b/connector_jira_tempo/reports/__init__.py new file mode 100644 index 000000000..2e30f148d --- /dev/null +++ b/connector_jira_tempo/reports/__init__.py @@ -0,0 +1 @@ +from . import timesheet_analysis_report diff --git a/connector_jira_tempo/reports/timesheet_analysis_report.py b/connector_jira_tempo/reports/timesheet_analysis_report.py new file mode 100644 index 000000000..02120c8d3 --- /dev/null +++ b/connector_jira_tempo/reports/timesheet_analysis_report.py @@ -0,0 +1,24 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models + + +class TimesheetsAnalysisReport(models.Model): + _inherit = "timesheets.analysis.report" + + jira_tempo_status = fields.Selection( + selection=[ + ("approved", "Approved"), + ("in_review", "In Review"), + # no longer used on cloud version + ("waiting_for_approval", "Waiting for approval"), + # no longer used on cloud version + ("ready_to_submit", "Ready to submit"), + ("open", "Open"), + ], + readonly=True, + ) + + @api.model + def _select(self): + return super()._select() + ", A.jira_tempo_status AS jira_tempo_status" diff --git a/connector_jira_tempo/views/timesheet_account_analytic_line.xml b/connector_jira_tempo/views/account_analytic_line.xml similarity index 79% rename from connector_jira_tempo/views/timesheet_account_analytic_line.xml rename to connector_jira_tempo/views/account_analytic_line.xml index 997041e1e..45c945402 100644 --- a/connector_jira_tempo/views/timesheet_account_analytic_line.xml +++ b/connector_jira_tempo/views/account_analytic_line.xml @@ -9,7 +9,7 @@ - + @@ -23,7 +23,7 @@ - jira_tempo_status=='open' + jira_tempo_status == 'open' @@ -36,8 +36,13 @@ - - + + diff --git a/connector_jira_tempo/views/jira_backend_view.xml b/connector_jira_tempo/views/jira_backend.xml similarity index 100% rename from connector_jira_tempo/views/jira_backend_view.xml rename to connector_jira_tempo/views/jira_backend.xml