1
0
Fork 0

Use HTTP post for csv export

Also fixes a missing translation string
This commit is contained in:
Mouse Reeve 2022-07-11 07:49:52 -07:00
parent bead43a20a
commit 42e29e40b3
5 changed files with 34 additions and 38 deletions

View file

@ -13,10 +13,13 @@
{% trans "Your export will include all the books on your shelves, books you have reviewed, and books with reading activity." %} {% trans "Your export will include all the books on your shelves, books you have reviewed, and books with reading activity." %}
</p> </p>
<p> <p>
<a href="{% url 'prefs-export-file' %}" class="button"> <form name="export" method="POST" href="{% url 'prefs-export' %}">
<span class="icon icon-download" aria-hidden="true"></span> {% csrf_token %}
<span>Download file</span> <button type="submit" class="button">
</a> <span class="icon icon-download" aria-hidden="true"></span>
<span>{% trans "Download file" %}</span>
</button>
</form>
</p> </p>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -54,7 +54,7 @@ class ExportViews(TestCase):
user=self.local_user, user=self.local_user,
book=self.book, book=self.book,
) )
request = self.factory.get("") request = self.factory.post("")
request.user = self.local_user request.user = self.local_user
export = views.export_user_book_data(request) export = views.export_user_book_data(request)
self.assertIsInstance(export, StreamingHttpResponse) self.assertIsInstance(export, StreamingHttpResponse)

View file

@ -482,11 +482,6 @@ urlpatterns = [
name="prefs-password", name="prefs-password",
), ),
re_path(r"^preferences/export/?$", views.Export.as_view(), name="prefs-export"), 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/delete/?$", views.DeleteUser.as_view(), name="prefs-delete"),
re_path(r"^preferences/block/?$", views.Block.as_view(), name="prefs-block"), re_path(r"^preferences/block/?$", views.Block.as_view(), name="prefs-block"),
re_path(r"^block/(?P<user_id>\d+)/?$", views.Block.as_view()), re_path(r"^block/(?P<user_id>\d+)/?$", views.Block.as_view()),

View file

@ -28,7 +28,7 @@ from .admin.user_admin import UserAdmin, UserAdminList
# user preferences # user preferences
from .preferences.change_password import ChangePassword from .preferences.change_password import ChangePassword
from .preferences.edit_user import EditUser 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.delete_user import DeleteUser
from .preferences.block import Block, unblock from .preferences.block import Block, unblock

View file

@ -7,7 +7,6 @@ from django.http import StreamingHttpResponse
from django.template.response import TemplateResponse from django.template.response import TemplateResponse
from django.views import View from django.views import View
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.views.decorators.http import require_GET
from bookwyrm import models from bookwyrm import models
@ -20,35 +19,34 @@ class Export(View):
"""Request csv file""" """Request csv file"""
return TemplateResponse(request, "preferences/export.html") return TemplateResponse(request, "preferences/export.html")
def post(self, request):
@login_required """Streaming the csv file of a user's book data"""
@require_GET data = (
def export_user_book_data(request): models.Edition.viewer_aware_objects(request.user)
"""Streaming the csv file of a user's book data""" .filter(
data = ( Q(shelves__user=request.user)
models.Edition.viewer_aware_objects(request.user) | Q(readthrough__user=request.user)
.filter( | Q(review__user=request.user)
Q(shelves__user=request.user) | Q(comment__user=request.user)
| Q(readthrough__user=request.user) | Q(quotation__user=request.user)
| Q(review__user=request.user) )
| Q(comment__user=request.user) .distinct()
| Q(quotation__user=request.user)
) )
.distinct()
)
generator = csv_row_generator(data, request.user) generator = csv_row_generator(data, request.user)
pseudo_buffer = Echo() pseudo_buffer = Echo()
writer = csv.writer(pseudo_buffer) writer = csv.writer(pseudo_buffer)
# for testing, if you want to see the results in the browser: # for testing, if you want to see the results in the browser:
# from django.http import JsonResponse # from django.http import JsonResponse
# return JsonResponse(list(generator), safe=False) # return JsonResponse(list(generator), safe=False)
return StreamingHttpResponse( return StreamingHttpResponse(
(writer.writerow(row) for row in generator), (writer.writerow(row) for row in generator),
content_type="text/csv", content_type="text/csv",
headers={"Content-Disposition": 'attachment; filename="bookwyrm-export.csv"'}, headers={
) "Content-Disposition": 'attachment; filename="bookwyrm-export.csv"'
},
)
def csv_row_generator(books, user): def csv_row_generator(books, user):