From b9fde85b499d8eccafe45b767abdfe63e714188f Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 17 Jan 2022 08:14:13 -0800 Subject: [PATCH 01/12] Sort domains in admin view --- bookwyrm/views/admin/link_domains.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bookwyrm/views/admin/link_domains.py b/bookwyrm/views/admin/link_domains.py index 564ea896..5f9ec6c0 100644 --- a/bookwyrm/views/admin/link_domains.py +++ b/bookwyrm/views/admin/link_domains.py @@ -20,9 +20,9 @@ class LinkDomain(View): def get(self, request, status="pending"): """view pending domains""" data = { - "domains": models.LinkDomain.objects.filter(status=status).prefetch_related( - "links" - ), + "domains": models.LinkDomain.objects.filter(status=status) + .prefetch_related("links") + .order_by("-created_date"), "counts": { "pending": models.LinkDomain.objects.filter(status="pending").count(), "approved": models.LinkDomain.objects.filter(status="approved").count(), From e12372250a3e1489fde6968771ebdb386e5eb4a6 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 17 Jan 2022 08:17:36 -0800 Subject: [PATCH 02/12] Mobile-friendly edit button on link domains --- bookwyrm/templates/settings/link_domains/link_domains.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/templates/settings/link_domains/link_domains.html b/bookwyrm/templates/settings/link_domains/link_domains.html index 3f2d6097..81235b33 100644 --- a/bookwyrm/templates/settings/link_domains/link_domains.html +++ b/bookwyrm/templates/settings/link_domains/link_domains.html @@ -42,7 +42,7 @@
From da6e43a7eb0382ef29e253798cdf69d177b20c33 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 17 Jan 2022 08:22:55 -0800 Subject: [PATCH 03/12] Avoid two character wide urls on mobile --- bookwyrm/static/css/bookwyrm.css | 1 + 1 file changed, 1 insertion(+) diff --git a/bookwyrm/static/css/bookwyrm.css b/bookwyrm/static/css/bookwyrm.css index 18c13671..f05ea3c9 100644 --- a/bookwyrm/static/css/bookwyrm.css +++ b/bookwyrm/static/css/bookwyrm.css @@ -722,6 +722,7 @@ ol.ordered-list li::before { .overflow-wrap-anywhere { overflow-wrap: anywhere; + min-width: 10em; } /* Threads From d4cfe5b8f012c5949cf7dbb53e43de88938cf1d7 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 17 Jan 2022 08:44:30 -0800 Subject: [PATCH 04/12] Fixes embedded links modal --- bookwyrm/templates/book/file_links/links.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/templates/book/file_links/links.html b/bookwyrm/templates/book/file_links/links.html index 10a6da2f..7c676099 100644 --- a/bookwyrm/templates/book/file_links/links.html +++ b/bookwyrm/templates/book/file_links/links.html @@ -46,7 +46,7 @@ {% trans "Edit links" %} -{% include 'book/file_links/add_link_modal.html' with book=book id="add-links" %} {% endif %} +{% include 'book/file_links/add_link_modal.html' with book=book id="add-links" %} {% endif %} From 942092d6b142218776c1c75b426ee4fa76d174ae Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 17 Jan 2022 08:54:52 -0800 Subject: [PATCH 05/12] Show link status more prominently on edit page --- .../templates/book/file_links/edit_links.html | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/bookwyrm/templates/book/file_links/edit_links.html b/bookwyrm/templates/book/file_links/edit_links.html index c56f97a6..5ba45700 100644 --- a/bookwyrm/templates/book/file_links/edit_links.html +++ b/bookwyrm/templates/book/file_links/edit_links.html @@ -33,6 +33,7 @@ {% trans "Added by" %} {% trans "Filetype" %} {% trans "Domain" %} + {% trans "Status" %} {% trans "Actions" %} {% for link in book.file_links.all %} @@ -47,11 +48,23 @@ {{ link.filelink.filetype }} - {{ link.domain.name }} ({{ link.domain.get_status_display }}) + {{ link.domain.name }}

{% trans "Report spam" %}

+ + {% with status=link.domain.status %} + + + + {{ link.domain.get_status_display }} + + + {% endwith %} +
{% csrf_token %} From 7b1693a4359c605713f7c0c33968fc508d151b6f Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 17 Jan 2022 09:03:53 -0800 Subject: [PATCH 06/12] Larger file type field --- .../migrations/0129_auto_20220117_1703.py | 24 +++++++++++++++++++ bookwyrm/models/link.py | 3 ++- bookwyrm/static/js/autocomplete.js | 17 +++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 bookwyrm/migrations/0129_auto_20220117_1703.py diff --git a/bookwyrm/migrations/0129_auto_20220117_1703.py b/bookwyrm/migrations/0129_auto_20220117_1703.py new file mode 100644 index 00000000..f193ca95 --- /dev/null +++ b/bookwyrm/migrations/0129_auto_20220117_1703.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.10 on 2022-01-17 17:03 + +import bookwyrm.models.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('bookwyrm', '0128_merge_0126_auto_20220112_2315_0127_auto_20220110_2211'), + ] + + operations = [ + migrations.AddField( + model_name='filelink', + name='is_purchase', + field=bookwyrm.models.fields.BooleanField(blank=True, null=True), + ), + migrations.AlterField( + model_name='filelink', + name='filetype', + field=bookwyrm.models.fields.CharField(max_length=50), + ), + ] diff --git a/bookwyrm/models/link.py b/bookwyrm/models/link.py index be7c104f..c4ec1e5e 100644 --- a/bookwyrm/models/link.py +++ b/bookwyrm/models/link.py @@ -53,7 +53,8 @@ class FileLink(Link): book = models.ForeignKey( "Book", on_delete=models.CASCADE, related_name="file_links", null=True ) - filetype = fields.CharField(max_length=5, activitypub_field="mediaType") + filetype = fields.CharField(max_length=50, activitypub_field="mediaType") + is_purchase = fields.BooleanField(null=True, blank=True) StatusChoices = [ diff --git a/bookwyrm/static/js/autocomplete.js b/bookwyrm/static/js/autocomplete.js index 89610083..1ae8c71a 100644 --- a/bookwyrm/static/js/autocomplete.js +++ b/bookwyrm/static/js/autocomplete.js @@ -160,6 +160,23 @@ const tries = { }, }, }, + r: { + i: { + n: { + t: { + " ": { + b: { + o: { + o: { + k: "Print book", + }, + }, + }, + }, + }, + }, + }, + }, }, }, }; From 39814a21f2418a0cd96adced9ebb755a5487e94e Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 17 Jan 2022 09:21:58 -0800 Subject: [PATCH 07/12] Set book availability --- bookwyrm/forms.py | 2 +- .../migrations/0129_auto_20220117_1703.py | 24 -------------- .../migrations/0129_auto_20220117_1716.py | 32 +++++++++++++++++++ bookwyrm/models/link.py | 11 ++++++- .../book/file_links/add_link_modal.html | 8 +++++ 5 files changed, 51 insertions(+), 26 deletions(-) delete mode 100644 bookwyrm/migrations/0129_auto_20220117_1703.py create mode 100644 bookwyrm/migrations/0129_auto_20220117_1716.py diff --git a/bookwyrm/forms.py b/bookwyrm/forms.py index 5af7c455..5ab90895 100644 --- a/bookwyrm/forms.py +++ b/bookwyrm/forms.py @@ -225,7 +225,7 @@ class LinkDomainForm(CustomForm): class FileLinkForm(CustomForm): class Meta: model = models.FileLink - fields = ["url", "filetype", "book", "added_by"] + fields = ["url", "filetype", "availability", "book", "added_by"] class EditionForm(CustomForm): diff --git a/bookwyrm/migrations/0129_auto_20220117_1703.py b/bookwyrm/migrations/0129_auto_20220117_1703.py deleted file mode 100644 index f193ca95..00000000 --- a/bookwyrm/migrations/0129_auto_20220117_1703.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 3.2.10 on 2022-01-17 17:03 - -import bookwyrm.models.fields -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('bookwyrm', '0128_merge_0126_auto_20220112_2315_0127_auto_20220110_2211'), - ] - - operations = [ - migrations.AddField( - model_name='filelink', - name='is_purchase', - field=bookwyrm.models.fields.BooleanField(blank=True, null=True), - ), - migrations.AlterField( - model_name='filelink', - name='filetype', - field=bookwyrm.models.fields.CharField(max_length=50), - ), - ] diff --git a/bookwyrm/migrations/0129_auto_20220117_1716.py b/bookwyrm/migrations/0129_auto_20220117_1716.py new file mode 100644 index 00000000..6b05fd27 --- /dev/null +++ b/bookwyrm/migrations/0129_auto_20220117_1716.py @@ -0,0 +1,32 @@ +# Generated by Django 3.2.10 on 2022-01-17 17:16 + +import bookwyrm.models.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0128_merge_0126_auto_20220112_2315_0127_auto_20220110_2211"), + ] + + operations = [ + migrations.AddField( + model_name="filelink", + name="availability", + field=bookwyrm.models.fields.CharField( + choices=[ + ("free", "Free"), + ("purchase", "Purchasable"), + ("loan", "Available for loan"), + ], + default="free", + max_length=100, + ), + ), + migrations.AlterField( + model_name="filelink", + name="filetype", + field=bookwyrm.models.fields.CharField(max_length=50), + ), + ] diff --git a/bookwyrm/models/link.py b/bookwyrm/models/link.py index c4ec1e5e..0e4148dd 100644 --- a/bookwyrm/models/link.py +++ b/bookwyrm/models/link.py @@ -47,6 +47,13 @@ class Link(ActivitypubMixin, BookWyrmModel): return super().save(*args, **kwargs) +AvailabilityChoices = [ + ("free", _("Free")), + ("purchase", _("Purchasable")), + ("loan", _("Available for loan")), +] + + class FileLink(Link): """a link to a file""" @@ -54,7 +61,9 @@ class FileLink(Link): "Book", on_delete=models.CASCADE, related_name="file_links", null=True ) filetype = fields.CharField(max_length=50, activitypub_field="mediaType") - is_purchase = fields.BooleanField(null=True, blank=True) + availability = fields.CharField( + max_length=100, choices=AvailabilityChoices, default="free" + ) StatusChoices = [ diff --git a/bookwyrm/templates/book/file_links/add_link_modal.html b/bookwyrm/templates/book/file_links/add_link_modal.html index dfc222ee..114293a4 100644 --- a/bookwyrm/templates/book/file_links/add_link_modal.html +++ b/bookwyrm/templates/book/file_links/add_link_modal.html @@ -43,6 +43,14 @@ {% include 'snippets/form_errors.html' with errors_list=file_link_form.filetype.errors id="desc_filetype" %} +
+ +
+ {{ file_link_form.availability }} +
+
{% endblock %} From 1595bac9b58259a41896fe629efdfd2e0000668c Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 17 Jan 2022 09:26:00 -0800 Subject: [PATCH 08/12] Show availability in links panel --- bookwyrm/templates/book/file_links/links.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bookwyrm/templates/book/file_links/links.html b/bookwyrm/templates/book/file_links/links.html index 7c676099..25e0ba89 100644 --- a/bookwyrm/templates/book/file_links/links.html +++ b/bookwyrm/templates/book/file_links/links.html @@ -30,6 +30,12 @@
  • {{ link.name }} ({{ link.filetype }}) + + {% if link.availability != "free" %} +

    + {{ link.get_availability_display }} +

    + {% endif %}
  • {% endfor %} From cfcacb4797978961f7cc46547b5b3b93ef9d7ef7 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 17 Jan 2022 09:57:47 -0800 Subject: [PATCH 09/12] Edit book availability --- .../templates/book/file_links/edit_links.html | 25 +++++++++++++-- bookwyrm/urls.py | 7 ++++- bookwyrm/views/__init__.py | 2 +- bookwyrm/views/books/links.py | 31 ++++++++++++++++--- 4 files changed, 55 insertions(+), 10 deletions(-) diff --git a/bookwyrm/templates/book/file_links/edit_links.html b/bookwyrm/templates/book/file_links/edit_links.html index 5ba45700..8dad6c40 100644 --- a/bookwyrm/templates/book/file_links/edit_links.html +++ b/bookwyrm/templates/book/file_links/edit_links.html @@ -34,9 +34,9 @@ {% trans "Filetype" %} {% trans "Domain" %} {% trans "Status" %} - {% trans "Actions" %} + {% trans "Actions" %} - {% for link in book.file_links.all %} + {% for link in links %} {{ link.url }} @@ -66,7 +66,26 @@ {% endwith %} - + + {% csrf_token %} + + + + +
    +
    +
    + {{ link.form.availability }} +
    +
    +
    + +
    +
    + + + +
    {% csrf_token %}
    diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 99060149..7cdfd92a 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -473,10 +473,15 @@ urlpatterns = [ rf"{BOOK_PATH}/filelink/?$", views.BookFileLinks.as_view(), name="file-link" ), re_path( - rf"{BOOK_PATH}/filelink/(?P\d+)/delete/?$", + rf"{BOOK_PATH}/filelink/(?P\d+)/?$", views.BookFileLinks.as_view(), name="file-link", ), + re_path( + rf"{BOOK_PATH}/filelink/(?P\d+)/delete/?$", + views.delete_link, + name="file-link-delete", + ), re_path( rf"{BOOK_PATH}/filelink/add/?$", views.AddFileLink.as_view(), diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py index 2ec501de..3f57c274 100644 --- a/bookwyrm/views/__init__.py +++ b/bookwyrm/views/__init__.py @@ -37,7 +37,7 @@ from .books.books import ( from .books.books import update_book_from_remote from .books.edit_book import EditBook, ConfirmEditBook from .books.editions import Editions, switch_edition -from .books.links import BookFileLinks, AddFileLink +from .books.links import BookFileLinks, AddFileLink, delete_link # landing from .landing.about import about, privacy, conduct diff --git a/bookwyrm/views/books/links.py b/bookwyrm/views/books/links.py index 989ca9c4..51621023 100644 --- a/bookwyrm/views/books/links.py +++ b/bookwyrm/views/books/links.py @@ -5,28 +5,49 @@ from django.shortcuts import get_object_or_404, redirect 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_POST from bookwyrm import forms, models # pylint: disable=no-self-use +@method_decorator(login_required, name="dispatch") +@method_decorator( + permission_required("bookwyrm.edit_book", raise_exception=True), name="dispatch" +) class BookFileLinks(View): """View all links""" def get(self, request, book_id): """view links""" book = get_object_or_404(models.Edition, id=book_id) - return TemplateResponse( - request, "book/file_links/edit_links.html", {"book": book} - ) + links = book.file_links.order_by("domain__status", "created_date") + annotated_links = [] + for link in links.all(): + link.form = forms.FileLinkForm(instance=link) + annotated_links.append(link) + + data = {"book": book, "links": annotated_links} + return TemplateResponse(request, "book/file_links/edit_links.html", data) def post(self, request, book_id, link_id): - """delete link""" + """Edit a link""" link = get_object_or_404(models.FileLink, id=link_id, book=book_id) - link.delete() + form = forms.FileLinkForm(request.POST, instance=link) + form.save() return self.get(request, book_id) +@require_POST +@login_required +# pylint: disable=unused-argument +def delete_link(request, book_id, link_id): + """delete link""" + link = get_object_or_404(models.FileLink, id=link_id, book=book_id) + link.delete() + return redirect("file-link", book_id) + + @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.edit_book", raise_exception=True), name="dispatch" From 2f924faa051ad6857632f5e4c8eace2cd00d780e Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 17 Jan 2022 10:29:48 -0800 Subject: [PATCH 10/12] Adds tests --- bookwyrm/tests/views/books/test_links.py | 57 ++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/bookwyrm/tests/views/books/test_links.py b/bookwyrm/tests/views/books/test_links.py index 9e051926..2aee5aed 100644 --- a/bookwyrm/tests/views/books/test_links.py +++ b/bookwyrm/tests/views/books/test_links.py @@ -67,6 +67,7 @@ class LinkViews(TestCase): form.data["filetype"] = "HTML" form.data["book"] = self.book.id form.data["added_by"] = self.local_user.id + form.data["availability"] = "loan" request = self.factory.post("", form.data) request.user = self.local_user @@ -87,3 +88,59 @@ class LinkViews(TestCase): self.book.refresh_from_db() self.assertEqual(self.book.file_links.first(), link) + + def test_book_links(self): + """there are so many views, this just makes sure it LOADS""" + view = views.BookFileLinks.as_view() + models.FileLink.objects.create( + book=self.book, + added_by=self.local_user, + url="https://www.hello.com", + ) + request = self.factory.get("") + request.user = self.local_user + result = view(request, self.book.id) + self.assertEqual(result.status_code, 200) + validate_html(result.render()) + + def test_book_links_post(self): + """there are so many views, this just makes sure it LOADS""" + link = models.FileLink.objects.create( + book=self.book, + added_by=self.local_user, + url="https://www.hello.com", + ) + view = views.BookFileLinks.as_view() + form = forms.FileLinkForm() + form.data["url"] = link.url + form.data["filetype"] = "HTML" + form.data["book"] = self.book.id + form.data["added_by"] = self.local_user.id + form.data["availability"] = "loan" + + request = self.factory.post("", form.data) + request.user = self.local_user + view(request, self.book.id, link.id) + + link.refresh_from_db() + self.assertEqual(link.filetype, "HTML") + self.assertEqual(link.availability, "loan") + + def test_delete_link(self): + """remove a link""" + link = models.FileLink.objects.create( + book=self.book, + added_by=self.local_user, + url="https://www.hello.com", + ) + form = forms.FileLinkForm() + form.data["url"] = "https://www.example.com" + form.data["filetype"] = "HTML" + form.data["book"] = self.book.id + form.data["added_by"] = self.local_user.id + form.data["availability"] = "loan" + + request = self.factory.post("", form.data) + request.user = self.local_user + views.delete_link(request, self.book.id, link.id) + self.assertFalse(models.FileLink.objects.exists()) From a23e49c9f3ec841cacb1b06e5ef8fc589e8526ac Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 17 Jan 2022 10:48:42 -0800 Subject: [PATCH 11/12] Fixes filetype field length --- bookwyrm/templates/book/file_links/add_link_modal.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/templates/book/file_links/add_link_modal.html b/bookwyrm/templates/book/file_links/add_link_modal.html index 114293a4..0002b82b 100644 --- a/bookwyrm/templates/book/file_links/add_link_modal.html +++ b/bookwyrm/templates/book/file_links/add_link_modal.html @@ -30,7 +30,7 @@ Date: Mon, 17 Jan 2022 10:52:16 -0800 Subject: [PATCH 12/12] Case insensitive suggestions --- bookwyrm/settings.py | 2 +- bookwyrm/static/js/autocomplete.js | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index 06fc6a37..1d1ea154 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -14,7 +14,7 @@ VERSION = "0.2.0" PAGE_LENGTH = env("PAGE_LENGTH", 15) DEFAULT_LANGUAGE = env("DEFAULT_LANGUAGE", "English") -JS_CACHE = "a47cc2ca" +JS_CACHE = "76c5ff1f" # email EMAIL_BACKEND = env("EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend") diff --git a/bookwyrm/static/js/autocomplete.js b/bookwyrm/static/js/autocomplete.js index 1ae8c71a..84474e43 100644 --- a/bookwyrm/static/js/autocomplete.js +++ b/bookwyrm/static/js/autocomplete.js @@ -42,6 +42,8 @@ function getSuggestions(input, trie) { // Follow the trie through the provided input + input = input.toLowerCase(); + input.split("").forEach((letter) => { if (!trie) { return;