mirror of
https://github.com/Southampton-RSG/breccia-mapper.git
synced 2026-03-03 03:17:07 +00:00
refactor: Use custom CSV export view
Remove dependency on djangorestframework-csv
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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 = [
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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
33
people/views/export.py
Normal 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
|
||||||
@@ -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)
|
|
||||||
|
|||||||
@@ -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)
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user