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..6f82bb4f 100644
--- a/devel/views.py
+++ b/devel/views.py
@@ -265,6 +265,27 @@ def change_profile(request):
'profile_form': profile_form})
+def get_report_packages(report, username):
+ packages = Package.objects.normal()
+ if report.slug in ('uncompressed-man', 'uncompressed-info'):
+ packages = report.packages(packages, username)
+ else:
+ packages = report.packages(packages)
+
+ return packages
+
+
+@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 = get_report_packages(report, username)
+ 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()}
@@ -283,11 +304,7 @@ def report(request, report_name, username=None):
maints = User.objects.filter(id__in=PackageRelation.objects.filter(
type=PackageRelation.MAINTAINER).values('user'))
- if report.slug == 'uncompressed-man' or report.slug == 'uncompressed-info':
- packages = report.packages(packages, username)
- else:
- packages = report.packages(packages)
-
+ packages = get_report_packages(report, username)
arches = {pkg.arch for pkg in packages}
repos = {pkg.repo for pkg in packages}
context = {
diff --git a/templates/devel/packages.html b/templates/devel/packages.html
index 728f2b43..e353daeb 100644
--- a/templates/devel/packages.html
+++ b/templates/devel/packages.html
@@ -13,6 +13,9 @@ {{ title }}{% if maintainer %},
{% if maintainer %}This report only includes packages maintained by
{{ maintainer.get_full_name }} ({{ maintainer.username }}).{% endif %}
+
+ Link to list of pkgbases values
+
Filter Packages