From 81ce4ea02b76af4dcc859739985a41ff8c073b6e Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 5 Jul 2023 15:11:40 +0200 Subject: [PATCH] [IMP] rewrite /forwardport/outstanding - add support for authorship (not just approval) - make display counts directly - fix `state` filter: postgres can't do negative index lookups - add indexes for author and reviewed_by as we look them up - ensure we handle the entire source filtering via a single subquery Closes #778 --- forwardport/controllers.py | 79 +++++++++++ forwardport/data/views.xml | 152 +++++++++++++-------- forwardport/models/project.py | 25 ---- runbot_merge/models/pull_requests.py | 4 +- runbot_merge/static/scss/runbot_merge.scss | 11 ++ 5 files changed, 185 insertions(+), 86 deletions(-) diff --git a/forwardport/controllers.py b/forwardport/controllers.py index af464dcb..620eab96 100644 --- a/forwardport/controllers.py +++ b/forwardport/controllers.py @@ -1,7 +1,14 @@ +import collections +import datetime import pathlib +import werkzeug.urls + +from odoo.http import route, request +from odoo.osv import expression from odoo.addons.runbot_merge.controllers.dashboard import MergebotDashboard +DEFAULT_DELTA = datetime.timedelta(days=7) class Dashboard(MergebotDashboard): def _entries(self): changelog = pathlib.Path(__file__).parent / 'changelog' @@ -13,3 +20,75 @@ class Dashboard(MergebotDashboard): for d in changelog.iterdir() ] + + @route('/forwardport/outstanding', type='http', methods=['GET'], auth="user", website=True, sitemap=False) + def outstanding(self, partner=0, authors=True, reviewers=True, group=0): + Partners = request.env['res.partner'] + PullRequests = request.env['runbot_merge.pull_requests'] + partner = Partners.browse(int(partner)) + group = Partners.browse(int(group)) + authors = int(authors) + reviewers = int(reviewers) + link = lambda **kw: '?' + werkzeug.urls.url_encode({'partner': partner.id or 0, 'authors': authors, 'reviewers': reviewers, **kw, }) + groups = Partners.search([('is_company', '=', True), ('child_ids', '!=', False)]) + if not (authors or reviewers): + return request.render('forwardport.outstanding', { + 'authors': 0, + 'reviewers': 0, + 'single': partner, + 'culprits': partner, + 'groups': groups, + 'current_group': group, + 'outstanding': [], + 'outstanding_per_author': {partner: 0}, + 'outstanding_per_reviewer': {partner: 0}, + 'link': link, + }) + + source_filter = [('merge_date', '<', datetime.datetime.now() - DEFAULT_DELTA)] + partner_filter = [] + if partner or group: + if partner: + suffix = '' + arg = partner.id + else: + suffix = '.commercial_partner_id' + arg = group.id + + if authors: + partner_filter.append([(f'author{suffix}', '=', arg)]) + if reviewers: + partner_filter.append([(f'reviewed_by{suffix}', '=', arg)]) + + source_filter.extend(expression.OR(partner_filter)) + + outstanding = PullRequests.search([ + ('state', 'in', ['opened', 'validated', 'approved', 'ready', 'error']), + ('source_id', 'in', PullRequests._search(source_filter)), + ]) + outstanding_per_author = collections.Counter() + outstanding_per_reviewer = collections.Counter() + outstandings = [] + for source in outstanding.mapped('source_id').sorted('merge_date'): + outstandings.append({ + 'source': source, + 'prs': source.forwardport_ids.filtered(lambda p: p.state not in ['merged', 'closed']), + }) + if authors: + outstanding_per_author[source.author] += 1 + if reviewers and source: + outstanding_per_reviewer[source.reviewed_by] += 1 + + culprits = Partners.browse(p.id for p, _ in (outstanding_per_reviewer + outstanding_per_author).most_common()) + return request.render('forwardport.outstanding', { + 'authors': authors, + 'reviewers': reviewers, + 'single': partner, + 'culprits': culprits, + 'groups': groups, + 'current_group': group, + 'outstanding_per_author': outstanding_per_author, + 'outstanding_per_reviewer': outstanding_per_reviewer, + 'outstanding': outstandings, + 'link': link, + }) diff --git a/forwardport/data/views.xml b/forwardport/data/views.xml index c25bb311..1b6069c2 100644 --- a/forwardport/data/views.xml +++ b/forwardport/data/views.xml @@ -30,67 +30,101 @@ bg-warning - - Outstanding forward ports - qweb - /forwardport/outstanding - - True - forwardport.outstanding_fp - - - - -
- -

List of pull requests with outstanding forward ports

- -
-

- merged by -

-
- - -
- - by - merged - - by - -
-
- Outstanding forward-ports: -
    -
  • - - () - targeting -
  • -
-
+