33from django .conf import settings
44from django .contrib import admin
55from django .db .models import Count
6+ from django .http import HttpResponse
7+
68from drf_api_logger .utils import database_log_enabled
79
810if database_log_enabled ():
911 from drf_api_logger .models import APILogsModel
1012 from django .utils .translation import gettext_lazy as _
13+ import csv
14+
15+
16+ class ExportCsvMixin :
17+ def export_as_csv (self , request , queryset ):
18+ meta = self .model ._meta
19+ field_names = [field .name for field in meta .fields ]
20+
21+ response = HttpResponse (content_type = 'text/csv' )
22+ response ['Content-Disposition' ] = 'attachment; filename={}.csv' .format (meta )
23+ writer = csv .writer (response )
24+
25+ writer .writerow (field_names )
26+ for obj in queryset :
27+ row = writer .writerow ([getattr (obj , field ) for field in field_names ])
28+
29+ return response
30+
31+ export_as_csv .short_description = "Export Selected"
1132
1233 class SlowAPIsFilter (admin .SimpleListFilter ):
1334 title = _ ('API Performance' )
@@ -54,7 +75,9 @@ def queryset(self, request, queryset):
5475
5576 return queryset
5677
57- class APILogsAdmin (admin .ModelAdmin ):
78+ class APILogsAdmin (admin .ModelAdmin , ExportCsvMixin ):
79+
80+ actions = ["export_as_csv" ]
5881
5982 def __init__ (self , model , admin_site ):
6083 super ().__init__ (model , admin_site )
@@ -83,6 +106,7 @@ def added_on_time(self, obj):
83106 exclude = ('added_on' ,)
84107
85108 change_list_template = 'charts_change_list.html'
109+ change_form_template = 'change_form.html'
86110 date_hierarchy = 'added_on'
87111
88112 def changelist_view (self , request , extra_context = None ):
@@ -108,7 +132,19 @@ def changelist_view(self, request, extra_context=None):
108132 return response
109133
110134 def get_queryset (self , request ):
111- return super (APILogsAdmin , self ).get_queryset (request )
135+ drf_api_logger_default_database = 'default'
136+ if hasattr (settings , 'DRF_API_LOGGER_DEFAULT_DATABASE' ):
137+ drf_api_logger_default_database = settings .DRF_API_LOGGER_DEFAULT_DATABASE
138+ return super (APILogsAdmin , self ).get_queryset (request ).using (drf_api_logger_default_database )
139+
140+ def changeform_view (self , request , object_id = None , form_url = '' , extra_context = None ):
141+ if request .GET .get ('export' , False ):
142+ drf_api_logger_default_database = 'default'
143+ if hasattr (settings , 'DRF_API_LOGGER_DEFAULT_DATABASE' ):
144+ drf_api_logger_default_database = settings .DRF_API_LOGGER_DEFAULT_DATABASE
145+ export_queryset = self .get_queryset (request ).filter (pk = object_id ).using (drf_api_logger_default_database )
146+ return self .export_as_csv (request , export_queryset )
147+ return super (APILogsAdmin , self ).changeform_view (request , object_id , form_url , extra_context )
112148
113149 def has_add_permission (self , request , obj = None ):
114150 return False
0 commit comments