Skip to content

Commit

Permalink
Merge pull request #2216 from bookwyrm-social/export-post
Browse files Browse the repository at this point in the history
Use HTTP post for CSV export
  • Loading branch information
mouse-reeve committed Jul 11, 2022
2 parents 137311e + 9104d1f commit f1ae645
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 39 deletions.
11 changes: 7 additions & 4 deletions bookwyrm/templates/preferences/export.html
Expand Up @@ -13,10 +13,13 @@
{% trans "Your export will include all the books on your shelves, books you have reviewed, and books with reading activity." %}
</p>
<p>
<a href="{% url 'prefs-export-file' %}" class="button">
<span class="icon icon-download" aria-hidden="true"></span>
<span>Download file</span>
</a>
<form name="export" method="POST" href="{% url 'prefs-export' %}">
{% csrf_token %}
<button type="submit" class="button">
<span class="icon icon-download" aria-hidden="true"></span>
<span>{% trans "Download file" %}</span>
</button>
</form>
</p>
</div>
{% endblock %}
Expand Up @@ -54,9 +54,9 @@ def test_export_file(self, *_):
user=self.local_user,
book=self.book,
)
request = self.factory.get("")
request = self.factory.post("")
request.user = self.local_user
export = views.export_user_book_data(request)
export = views.Export.as_view()(request)
self.assertIsInstance(export, StreamingHttpResponse)
self.assertEqual(export.status_code, 200)
result = list(export.streaming_content)
Expand Down
5 changes: 0 additions & 5 deletions bookwyrm/urls.py
Expand Up @@ -482,11 +482,6 @@
name="prefs-password",
),
re_path(r"^preferences/export/?$", views.Export.as_view(), name="prefs-export"),
re_path(
r"^preferences/export/file/?$",
views.export_user_book_data,
name="prefs-export-file",
),
re_path(r"^preferences/delete/?$", views.DeleteUser.as_view(), name="prefs-delete"),
re_path(r"^preferences/block/?$", views.Block.as_view(), name="prefs-block"),
re_path(r"^block/(?P<user_id>\d+)/?$", views.Block.as_view()),
Expand Down
2 changes: 1 addition & 1 deletion bookwyrm/views/__init__.py
Expand Up @@ -28,7 +28,7 @@
# user preferences
from .preferences.change_password import ChangePassword
from .preferences.edit_user import EditUser
from .preferences.export import Export, export_user_book_data
from .preferences.export import Export
from .preferences.delete_user import DeleteUser
from .preferences.block import Block, unblock

Expand Down
52 changes: 25 additions & 27 deletions bookwyrm/views/preferences/export.py
Expand Up @@ -7,7 +7,6 @@
from django.template.response import TemplateResponse
from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.http import require_GET

from bookwyrm import models

Expand All @@ -20,35 +19,34 @@ def get(self, request):
"""Request csv file"""
return TemplateResponse(request, "preferences/export.html")


@login_required
@require_GET
def export_user_book_data(request):
"""Streaming the csv file of a user's book data"""
data = (
models.Edition.viewer_aware_objects(request.user)
.filter(
Q(shelves__user=request.user)
| Q(readthrough__user=request.user)
| Q(review__user=request.user)
| Q(comment__user=request.user)
| Q(quotation__user=request.user)
def post(self, request):
"""Streaming the csv file of a user's book data"""
data = (
models.Edition.viewer_aware_objects(request.user)
.filter(
Q(shelves__user=request.user)
| Q(readthrough__user=request.user)
| Q(review__user=request.user)
| Q(comment__user=request.user)
| Q(quotation__user=request.user)
)
.distinct()
)
.distinct()
)

generator = csv_row_generator(data, request.user)
generator = csv_row_generator(data, request.user)

pseudo_buffer = Echo()
writer = csv.writer(pseudo_buffer)
# for testing, if you want to see the results in the browser:
# from django.http import JsonResponse
# return JsonResponse(list(generator), safe=False)
return StreamingHttpResponse(
(writer.writerow(row) for row in generator),
content_type="text/csv",
headers={"Content-Disposition": 'attachment; filename="bookwyrm-export.csv"'},
)
pseudo_buffer = Echo()
writer = csv.writer(pseudo_buffer)
# for testing, if you want to see the results in the browser:
# from django.http import JsonResponse
# return JsonResponse(list(generator), safe=False)
return StreamingHttpResponse(
(writer.writerow(row) for row in generator),
content_type="text/csv",
headers={
"Content-Disposition": 'attachment; filename="bookwyrm-export.csv"'
},
)


def csv_row_generator(books, user):
Expand Down

0 comments on commit f1ae645

Please sign in to comment.