Skip to content

Commit bc1cc8c

Browse files
Merge pull request #42 from vishalanandl177/staging
added export option in CSV
2 parents f515f54 + 4e8b4c1 commit bc1cc8c

File tree

4 files changed

+50
-7
lines changed

4 files changed

+50
-7
lines changed

README.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# DRF API Logger
2-
![version](https://img.shields.io/badge/version-1.0.10-blue.svg)
2+
![version](https://img.shields.io/badge/version-1.1.10-blue.svg)
33
[![Downloads](https://static.pepy.tech/personalized-badge/drf-api-logger?period=total&units=none&left_color=black&right_color=orange&left_text=Downloads%20Total)](http://pepy.tech/project/drf-api-logger)
44
[![Downloads](https://static.pepy.tech/personalized-badge/drf-api-logger?period=month&units=none&left_color=black&right_color=orange&left_text=Downloads%20Last%20Month)](https://pepy.tech/project/drf-api-logger)
55
[![Downloads](https://static.pepy.tech/personalized-badge/drf-api-logger?period=week&units=none&left_color=black&right_color=orange&left_text=Downloads%20Last%20Week)](https://pepy.tech/project/drf-api-logger)
@@ -191,9 +191,8 @@ DRF_API_LOGGER_METHODS = ['GET', 'POST', 'DELETE', 'PUT'] # Default to empty li
191191
```
192192

193193
### Want to see the API information in local timezone? (Optional)
194-
You can also identify slow APIs by specifying `DRF_API_LOGGER_TIMEDELTA` in settings.py.
195-
It is going to display the API request time after adding the timedelta specified in the settings.py file.
196-
It won't change the Database timezone.
194+
You can also change the timezone by specifying `DRF_API_LOGGER_TIMEDELTA` in settings.py.
195+
It won't change the Database timezone. It will still remain UTC or the timezone you have defined.
197196
```python
198197
DRF_API_LOGGER_TIMEDELTA = 330 # UTC + 330 Minutes = IST (5:Hours, 30:Minutes ahead from UTC)
199198
# Specify in minutes.

drf_api_logger/admin.py

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,32 @@
33
from django.conf import settings
44
from django.contrib import admin
55
from django.db.models import Count
6+
from django.http import HttpResponse
7+
68
from drf_api_logger.utils import database_log_enabled
79

810
if 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
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{% extends 'admin/change_form.html' %}
2+
3+
{% block submit_buttons_bottom %}
4+
{{ block.super }}
5+
<div class="submit-row">
6+
<a href="?export=true">Export CSV</a>
7+
</div>
8+
{% endblock %}

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def get_long_desc():
2121

2222
setuptools.setup(
2323
name="drf_api_logger",
24-
version="1.0.10",
24+
version="1.1.10",
2525
author="Vishal Anand",
2626
author_email="[email protected]",
2727
description="An API Logger for your Django Rest Framework project.",

0 commit comments

Comments
 (0)