Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/tox.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
- name: Install Poetry
uses: snok/install-poetry@v1
with:
version: 1.4.2
version: 2.0.1
- name: Install test dependencies.
run: pip install tox>=4.0.16 tox-gh
- name: Setup test suite
Expand Down
30 changes: 25 additions & 5 deletions jasmin_services/admin/grant.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
import operator
from urllib.parse import urlparse

import django.db.models.fields.related
import django.db.models.fields.reverse_related
from django.contrib import admin
from django.contrib.contenttypes.models import ContentType
from django.shortcuts import redirect, render
Expand Down Expand Up @@ -85,9 +83,7 @@ def send_expiry_notifications(self, request, queryset):
send_expiry_notifications.short_description = "Send expiry notifications"

def revoke_grants(self, request, queryset):
"""
Admin action that revokes the selected grants.
"""
"""Admin action that revokes the selected grants."""
selected = queryset.values_list("pk", flat=True)
selected_ids = "_".join(str(pk) for pk in selected)

Expand Down Expand Up @@ -222,6 +218,30 @@ def get_metadata_form_initial_data(self, request, obj):
return {d.key: d.value for d in metadata.all()}
return super().get_metadata_form_initial_data(request, obj)

def get_search_results(self, request, queryset, search_term):
"""Override search to include metadata values."""
# Get the standard search results first
queryset, use_distinct = super().get_search_results(request, queryset, search_term)

if search_term:
grant_content_type = ContentType.objects.get_for_model(Grant)
metadata_objects = Metadatum.objects.filter(content_type=grant_content_type)

matching_ids = []
for metadata in metadata_objects:
# Convert pickled value to string and search
value_str = str(metadata.value) if metadata.value is not None else ""
if search_term.lower() in value_str.lower():
matching_ids.append(metadata.object_id)

if matching_ids:
# Combine with existing queryset
metadata_queryset = self.model.objects.filter(pk__in=matching_ids)
queryset = queryset | metadata_queryset
use_distinct = True

return queryset, use_distinct

def get_urls(self):
return [
re_path(
Expand Down
28 changes: 27 additions & 1 deletion jasmin_services/admin/request.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
from django.contrib import admin
from django.contrib.admin.utils import quote
from django.contrib.contenttypes.models import ContentType
from django.urls import reverse
from django.utils.safestring import mark_safe

from jasmin_metadata.admin import HasMetadataModelAdmin
from jasmin_metadata.models import Metadatum

from ..actions import remind_pending
from ..forms import AdminRequestForm
from ..models import RequestState, Role
from ..models import Request, RequestState, Role

# Load the admin for behaviours which are turned on.
from . import behaviour # unimport:skip
Expand Down Expand Up @@ -119,3 +121,27 @@ def get_changeform_initial_data(self, request):
initial = super().get_changeform_initial_data(request)
initial["requested_by"] = request.user.username
return initial

def get_search_results(self, request, queryset, search_term):
"""Override search to include metadata values."""
# Get the standard search results first
queryset, use_distinct = super().get_search_results(request, queryset, search_term)

if search_term:
request_content_type = ContentType.objects.get_for_model(Request)
metadata_objects = Metadatum.objects.filter(content_type=request_content_type)

matching_ids = []
for metadata in metadata_objects:
# Convert pickled value to string and search
value_str = str(metadata.value) if metadata.value is not None else ""
if search_term.lower() in value_str.lower():
matching_ids.append(metadata.object_id)

if matching_ids:
# Combine with existing queryset
metadata_queryset = self.model.objects.filter(pk__in=matching_ids)
queryset = queryset | metadata_queryset
use_distinct = True

return queryset, use_distinct
Loading