diff --git a/devel/tests/test_reports.py b/devel/tests/test_reports.py index bd64027e..fefd8582 100644 --- a/devel/tests/test_reports.py +++ b/devel/tests/test_reports.py @@ -58,3 +58,18 @@ def test_reports_mismatched_signature(self): def test_reports_signature_time(self): response = self.client.get('/devel/reports/signature-time', follow=True) self.assertEqual(response.status_code, 200) + + def test_reports_pkgbases(self): + response = self.client.get('/devel/reports/old/pkgbases/') + self.assertEqual(response.status_code, 200) + self.assertEqual(response['Content-Type'], 'text/plain') + + def test_reports_pkgbases_with_username(self): + response = self.client.get( + f'/devel/reports/uncompressed-man/{self.user.username}/pkgbases/') + self.assertEqual(response.status_code, 200) + self.assertEqual(response['Content-Type'], 'text/plain') + + def test_reports_pkgbases_invalid_report(self): + response = self.client.get('/devel/reports/nonexistent/pkgbases/') + self.assertEqual(response.status_code, 404) diff --git a/devel/urls.py b/devel/urls.py index aea48404..e5f490a0 100644 --- a/devel/urls.py +++ b/devel/urls.py @@ -12,6 +12,9 @@ path('stats/', views.stats, name='devel-stats'), path('newuser/', views.new_user_form), path('profile/', views.change_profile), + re_path(r'^reports/(?P.*)/(?P.*)/pkgbases/$', + views.report_pkgbases), + re_path(r'^reports/(?P.*)/pkgbases/$', views.report_pkgbases), re_path(r'^reports/(?P.*)/(?P.*)/$', views.report), re_path(r'^reports/(?P.*)/$', views.report), ] diff --git a/devel/views.py b/devel/views.py index f0d639ee..17e41b84 100644 --- a/devel/views.py +++ b/devel/views.py @@ -265,6 +265,22 @@ def change_profile(request): 'profile_form': profile_form}) +@login_required +def report_pkgbases(request, report_name: str, username: str | None = None) -> HttpResponse: + report = {report.slug: report for report in available_reports()}.get(report_name, None) + if report is None: + raise Http404 + + packages = Package.objects.normal() + if report.slug in ('uncompressed-man', 'uncompressed-info'): + packages = report.packages(packages, username) + else: + packages = report.packages(packages) + + pkgbases = sorted({pkg.pkgbase for pkg in packages}) + return HttpResponse('\n'.join(pkgbases), content_type='text/plain') + + @login_required def report(request, report_name, username=None): available = {report.slug: report for report in available_reports()}