11# Django
2+ from django .conf import settings
23from django .contrib import admin , messages
3- from django .db .models import JSONField
4+ from django .db .models import JSONField , Q
45from django .forms import widgets
56from django .http import HttpResponse
67from django .http .response import HttpResponseRedirect
@@ -124,11 +125,27 @@ class AddOnRunAdmin(admin.ModelAdmin):
124125 actions = ["export_runs_as_csv" ]
125126 readonly_fields = [f .name for f in AddOnRun ._meta .fields ]
126127
128+ def get_search_results (self , request , queryset , search_term ):
129+ """Avoid collation issue when searching add-on runs"""
130+ if search_term :
131+ queryset = queryset .filter (
132+ Q (addon__name__icontains = search_term )
133+ | Q (user__email__icontains = search_term )
134+ | Q (status__icontains = search_term )
135+ )
136+ use_distinct = False
137+ else :
138+ use_distinct = False
139+ return queryset , use_distinct
140+
127141 def export_runs_as_csv (self , request , queryset ):
128142 """Export selected Add-On Runs to CSV."""
129143 field_names = [
130144 "addon_id" ,
145+ "addon_name" ,
131146 "user_id" ,
147+ "user_name" ,
148+ "user_email" ,
132149 "run_id" ,
133150 "status" ,
134151 "rating" ,
@@ -143,11 +160,28 @@ def export_runs_as_csv(self, request, queryset):
143160 writer = csv .writer (response )
144161 writer .writerow (field_names )
145162
146- for run in queryset :
163+ limited_queryset = queryset .select_related ("addon" , "user" ).only (
164+ "addon_id" ,
165+ "user_id" ,
166+ "run_id" ,
167+ "status" ,
168+ "rating" ,
169+ "credits_spent" ,
170+ "created_at" ,
171+ "updated_at" ,
172+ "addon__name" ,
173+ "user__name" ,
174+ "user__email" ,
175+ )
176+
177+ for run in limited_queryset .iterator (chunk_size = settings .CSV_EXPORT_CHUNK_SIZE ):
147178 writer .writerow (
148179 [
149180 run .addon_id ,
181+ run .addon .name ,
150182 run .user_id ,
183+ run .user .name ,
184+ run .user .email ,
151185 run .run_id ,
152186 run .status ,
153187 run .rating ,
0 commit comments