refactor: Use custom CSV export view

Remove dependency on djangorestframework-csv
This commit is contained in:
James Graham
2020-03-27 17:00:37 +00:00
parent 2cdc7675c7
commit da57108e3e
8 changed files with 50 additions and 53 deletions

View File

@@ -24,7 +24,7 @@
<td></td> <td></td>
<td> <td>
<a class="btn btn-info" <a class="btn btn-info"
href="{% url 'people:person.api.list' %}?format=csv">Export</a> href="{% url 'people:person.export' %}">Export</a>
</td> </td>
</tr> </tr>
@@ -33,7 +33,7 @@
<td></td> <td></td>
<td> <td>
<a class="btn btn-info" <a class="btn btn-info"
href="{% url 'people:relationship.api.list' %}?format=csv">Export</a> href="{% url 'people:relationship.export' %}">Export</a>
</td> </td>
</tr> </tr>
</tbody> </tbody>

View File

@@ -16,24 +16,21 @@ class PersonSerializer(serializers.ModelSerializer):
] ]
class MinimalPersonSerializer(serializers.ModelSerializer): class PersonExportSerializer(serializers.ModelSerializer):
"""
Serializer containing just the necessary fields to identify a :class:`Person`.
Used for nesting within other serializers.
"""
class Meta: class Meta:
model = models.Person model = models.Person
fields = [ fields = [
'pk', 'pk',
'name', 'name',
'core_member',
'gender',
'age_group',
'nationality',
'country_of_residence',
] ]
class RelationshipSerializer(serializers.ModelSerializer): class RelationshipSerializer(serializers.ModelSerializer):
source = MinimalPersonSerializer()
target = MinimalPersonSerializer()
class Meta: class Meta:
model = models.Relationship model = models.Relationship
fields = [ fields = [

View File

@@ -38,13 +38,13 @@ urlpatterns = [
views.relationship.RelationshipUpdateView.as_view(), views.relationship.RelationshipUpdateView.as_view(),
name='relationship.update'), name='relationship.update'),
path('api/people', path('people/export',
views.person.PersonApiView.as_view(), views.export.PersonExportView.as_view(),
name='person.api.list'), name='person.export'),
path('api/relationships', path('relationships/export',
views.relationship.RelationshipApiView.as_view(), views.export.RelationshipExportView.as_view(),
name='relationship.api.list'), name='relationship.export'),
path('network', path('network',
views.network.NetworkView.as_view(), views.network.NetworkView.as_view(),

View File

@@ -3,6 +3,7 @@ Views for displaying or manipulating models within the `people` app.
""" """
from . import ( from . import (
export,
network, network,
person, person,
relationship relationship

33
people/views/export.py Normal file
View File

@@ -0,0 +1,33 @@
import csv
import typing
from django.http import HttpResponse
from django.views.generic.list import BaseListView
from .. import models, serializers
class CsvExportView(BaseListView):
model = None
serializer_class = None
def render_to_response(self, context: typing.Dict) -> HttpResponse:
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = f'attachment; filename="{self.get_context_object_name(self.object_list)}.csv"'
serializer = self.serializer_class(self.get_queryset(), many=True)
writer = csv.DictWriter(response, fieldnames=self.serializer_class.Meta.fields)
writer.writeheader()
writer.writerows(serializer.data)
return response
class PersonExportView(CsvExportView):
model = models.Person
serializer_class = serializers.PersonExportSerializer
class RelationshipExportView(CsvExportView):
model = models.Relationship
serializer_class = serializers.RelationshipSerializer

View File

@@ -4,9 +4,7 @@ Views for displaying or manipulating instances of :class:`Person`.
from django.views.generic import CreateView, DetailView, ListView, UpdateView from django.views.generic import CreateView, DetailView, ListView, UpdateView
from rest_framework.views import APIView, Response from people import forms, models, permissions
from people import forms, models, permissions, serializers
class PersonCreateView(CreateView): class PersonCreateView(CreateView):
@@ -62,17 +60,3 @@ class PersonUpdateView(permissions.UserIsLinkedPersonMixin, UpdateView):
model = models.Person model = models.Person
template_name = 'people/person/update.html' template_name = 'people/person/update.html'
form_class = forms.PersonForm form_class = forms.PersonForm
class PersonApiView(APIView):
"""
List all :class:`Person` instances.
"""
def get(self, request, format=None):
"""
List all :class:`Person` instances.
"""
serializer = serializers.PersonSerializer(models.Person.objects.all(),
many=True)
return Response(serializer.data)

View File

@@ -6,9 +6,7 @@ from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from django.views.generic import CreateView, DetailView from django.views.generic import CreateView, DetailView
from rest_framework.views import APIView, Response from people import forms, models, permissions
from people import forms, models, permissions, serializers
class RelationshipDetailView(permissions.UserIsLinkedPersonMixin, DetailView): class RelationshipDetailView(permissions.UserIsLinkedPersonMixin, DetailView):
@@ -130,17 +128,3 @@ class RelationshipUpdateView(permissions.UserIsLinkedPersonMixin, CreateView):
answer_set.save() answer_set.save()
return response return response
class RelationshipApiView(APIView):
"""
List all :class:`Relationship` instances.
"""
def get(self, request, format=None):
"""
List all :class:`Relationship` instances.
"""
serializer = serializers.RelationshipSerializer(models.Relationship.objects.all(),
many=True)
return Response(serializer.data)

View File

@@ -12,7 +12,6 @@ django-picklefield==2.1.1
django-select2==7.2.0 django-select2==7.2.0
django-settings-export==1.2.1 django-settings-export==1.2.1
djangorestframework==3.11.0 djangorestframework==3.11.0
djangorestframework-csv==2.1.0
dodgy==0.2.1 dodgy==0.2.1
isort==4.3.21 isort==4.3.21
lazy-object-proxy==1.4.3 lazy-object-proxy==1.4.3
@@ -39,5 +38,4 @@ snowballstemmer==2.0.0
soupsieve==1.9.5 soupsieve==1.9.5
sqlparse==0.3.0 sqlparse==0.3.0
typed-ast==1.4.1 typed-ast==1.4.1
unicodecsv==0.14.1
wrapt==1.11.2 wrapt==1.11.2