Use HTTP post for csv export
Also fixes a missing translation string
This commit is contained in:
parent
bead43a20a
commit
42e29e40b3
5 changed files with 34 additions and 38 deletions
|
@ -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 %}
|
||||||
|
|
|
@ -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)
|
|
@ -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()),
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue