From 7345705b08179ad6a3a02a6135af314b756ea48f Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 21 Aug 2021 20:21:39 -0700 Subject: [PATCH 01/13] Small efficiency improvement in list view --- bookwyrm/views/list.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/list.py b/bookwyrm/views/list.py index 6e872434..36175937 100644 --- a/bookwyrm/views/list.py +++ b/bookwyrm/views/list.py @@ -116,7 +116,7 @@ class List(View): if direction == "descending": directional_sort_by = "-" + directional_sort_by - items = book_list.listitem_set + items = book_list.listitem_set.prefetch_related("user", "book", "book__authors") if sort_by == "rating": items = items.annotate( average_rating=Avg( From eca0ff371cb1596bfa6cb491b253c8e9e693d5bc Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 23 Aug 2021 11:19:15 -0700 Subject: [PATCH 02/13] Adds saved lists many to many field --- bookwyrm/migrations/0085_user_saved_lists.py | 20 ++++++++++++++++++++ bookwyrm/models/user.py | 3 +++ 2 files changed, 23 insertions(+) create mode 100644 bookwyrm/migrations/0085_user_saved_lists.py diff --git a/bookwyrm/migrations/0085_user_saved_lists.py b/bookwyrm/migrations/0085_user_saved_lists.py new file mode 100644 index 00000000..d4d9278c --- /dev/null +++ b/bookwyrm/migrations/0085_user_saved_lists.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.4 on 2021-08-23 18:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0084_auto_20210817_1916"), + ] + + operations = [ + migrations.AddField( + model_name="user", + name="saved_lists", + field=models.ManyToManyField( + related_name="saved_lists", to="bookwyrm.List" + ), + ), + ] diff --git a/bookwyrm/models/user.py b/bookwyrm/models/user.py index e10bcd29..0ef23d3f 100644 --- a/bookwyrm/models/user.py +++ b/bookwyrm/models/user.py @@ -104,6 +104,9 @@ class User(OrderedCollectionPageMixin, AbstractUser): through_fields=("user_subject", "user_object"), related_name="blocked_by", ) + saved_lists = models.ManyToManyField( + "List", symmetrical=False, related_name="saved_lists" + ) favorites = models.ManyToManyField( "Status", symmetrical=False, From 457415f87488387009c1a1db98ec6b4c554c221f Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 23 Aug 2021 11:19:31 -0700 Subject: [PATCH 03/13] Adds bookmark icon --- bookwyrm/static/css/fonts/icomoon.eot | Bin 10112 -> 10012 bytes bookwyrm/static/css/fonts/icomoon.svg | 9 +- bookwyrm/static/css/fonts/icomoon.ttf | Bin 9948 -> 9848 bytes bookwyrm/static/css/fonts/icomoon.woff | Bin 10024 -> 9924 bytes bookwyrm/static/css/vendor/icons.css | 128 ++++++++++++------------- 5 files changed, 65 insertions(+), 72 deletions(-) diff --git a/bookwyrm/static/css/fonts/icomoon.eot b/bookwyrm/static/css/fonts/icomoon.eot index 566fb13df682e828cf27f9ccbc1bc52e48e065e2..2c801b2b6993e16343c4b9a3d0e8dd505819653f 100644 GIT binary patch delta 501 zcmZqhpX0|Wqt3ukF_G1r<^Q_}c@rJV>zNrC81?{hLUL|m!7JY7HVh1mGC+PwdSY<_ zkQM;)Cje=V^qk7Hm;22g0{Jr-7!>zpq$Z}w{wm00U{DSL%9~{X1vt1_Oo03zAYUaT zx1?f5JI6mDe*=)eA}2pNam~JkTYyp#Kz>+mVnqRiu^to9G8K>lg}lVv)R|tKzk&P< zKug*R@{3CtK+a=O18GoTU}io)Ifb#>6~q$)I*gftiGh(p;idFTg_mtFZ@uFB|M&lY zkb0mP!%JD9*mbBF!^ThnbVPofGR8~^cXN1t|dW@!mCT8Y#jK+#gGue6AgvG>!*?8D_CAj|l;gaBE6h0&91RLmK*CT~%x;9$DVzyMTGGTA~kU49w&6P_|& g0p2qH2L4w9QUY!QDFQ15?g6!dyrs2ypXwn-05_3-X#fBK delta 576 zcmbQ^*Wl0Epw7T>XCkXP%iK!Q7ZV-I>vy2r^EZ%h z0<@&9AiubTff*>npa#;Qz`)FWV{!^(HGcq*Cjf*XIYtJB$sZU+CEH$Jf5r9x@BjY{ zjQ<~tvxvpE^IIJfl4$Gn9t$nXap= zdwK$KCzSqo-rj!VL?C9Gk&z)G0mT1c3`T(s8w?D9cyhaBL;V5<1?B|i1O{%P%hZ5= zP!u#4G#3XFB5cg;K#EaRM9i8|P+3XMRM5oCSkXvKTv3UQS>YeUgTnj`D&~yZlS5Q0cz}`%fVc!iPrjm( qE - + - - - - + + + diff --git a/bookwyrm/static/css/fonts/icomoon.ttf b/bookwyrm/static/css/fonts/icomoon.ttf index 55df6418c496e1175501f1d825da253533fa970e..242ca7392024660f56d38ed4c663daf0daa2aeed 100644 GIT binary patch delta 504 zcmccP`@^T6fsuiMft#U$ftkU;KUm+0Ux=L9Ij)`mbE!+Z>ivS9QodEmHw0P{>QnO`Yk*`5VZ; z0JNm7AiuZ-=ujX~1F2VFU}io)@j$gRh$94a7c&DB&_4<ZXBL|$<|if()WoJ-NnwXi}F&Zl}&1C0c6BZK_X5(S!mEijGhf9KwjTa)q z%f=MWoX5<>p&%nT(A3CulAzZrNYUy&%@d|2`) zr%c|1cmL!0ZN4&avw*z7aMyF{Ul=|4hO#-M)?@*d3J#{*3=BX8C6lM9q{}bke!^46 hE5KXE-@yM$KuW+(AVpw>z&)TgkhiopOQ{}W1OT06P)D{L1Oc|&Sy{WNV z2}@0EWN{%KFm!YvZYCxUHK}PBOsa_(W8$D`q8vU9+~xh=@4fHK`|iHu8||Cx#E8gB zI*AmWU$`*oaG7mzUIXc+yjI*l{$M3y0q9&tTP=bm=%-*yCbzcoCbjqjdW$HeWS6xE zr@p+KBMR@KK9hxEv6`l#ze6k8e5t&%J9ZgYWYBJ|uyjSMZ@of*(jRy?ua%1w6EN(Y z2bw?B^2^VzkN$yR7z(Xw@L?X!~usLAk zeLP;N0K#@Q>+=D|@WP}3~}6~7d8PB~}2I6Nbw8N|jt@&V9$+FS44j7@~Ik>gOR>%i&ozQEi0F zHWX_>sn6A@k~#m}dT8_6>h^2)x?@i|Bi)i7OWRW0>B7Q^CImlO`Y|L_HPzkRS6;Gz D6GoSn diff --git a/bookwyrm/static/css/fonts/icomoon.woff b/bookwyrm/static/css/fonts/icomoon.woff index fa53e8cf907f2bb2da3fbf93124bd79a0d1639e8..67b0f0a693f8809a23ecb8560549312a767effa2 100644 GIT binary patch delta 556 zcmZ4Ccf?nu+~3WOfsp|S)Q&K4gXxONg6iTEwMFWglXDXb7#J8cfWjpp{EBzEO?qN6 zNbC-f&jG~(={c2YK(Qwb42pX|_~m}HhZ(7fDGUtC3xI0OKv?!yL0$$>5GZy7$X5Yj z4sI5cjNFn6px7TEe+3B7Xy^Eslb;M!=clp+C=dq1YxXVNlABlov{(hCPyvjMnPl=3 zb5j`@RAqpcw}J3XFV5cu`NcrTs)6)E)G-5D%*^K}^DtK1M*!JE3<3+UuJwHR?i4j z%FA?{IgddZXt9x)xE!OXpa>f~AEUC8nm!|hR@Y-R6*Mt3w_`L`WSYs&!zL^yCd|ge z&MU$7=MR?z9~&=3gqMveoH>t~i9+Sir!*m;sc@0pZI( zu5hO(7K6mD0QnqHERdd4nFbWQ!@!`V0>X#FLf>ViCZ;ej0J#hdW*{v6^o&ggP!K3) z0px=uR5-X!Z6G|;i}QCuesKxVMlN4kzyJROMSwb9G5|%cLq!<>KNe>Zn=j@srU2BzxcLm@N3l3&h6M}_%nCpg z*ctd4#DV6h^E1jb+A}gkX&9gBy1KfjClGf+>3`?#?I%tIVx}1x84?me{13)p6xguA zzyOFR>q|D&FJMq$PGC*|#)$xf8qj}=g2sa8;y^-#jhP)tF^Y2e8S*x@!Y&g@*Ahj3(?BC@%%Pl8Ms-10mHy>$KLq~ zjGlZ%*_=^(@*m|29-!m`AT9yXlWSDcHRo{O;*sE4#p}YmihqlMoPeJ|mB0*vJAy*M Y0B2y(W|9J@8wLg@P*U40uey{G0OE$6Qvd(} diff --git a/bookwyrm/static/css/vendor/icons.css b/bookwyrm/static/css/vendor/icons.css index c78af145..db783c24 100644 --- a/bookwyrm/static/css/vendor/icons.css +++ b/bookwyrm/static/css/vendor/icons.css @@ -1,156 +1,150 @@ - -/** @todo Replace icons with SVG symbols. - @see https://www.youtube.com/watch?v=9xXBYcWgCHA */ @font-face { - font-family: 'icomoon'; - src: url('../fonts/icomoon.eot?n5x55'); - src: url('../fonts/icomoon.eot?n5x55#iefix') format('embedded-opentype'), - url('../fonts/icomoon.ttf?n5x55') format('truetype'), - url('../fonts/icomoon.woff?n5x55') format('woff'), - url('../fonts/icomoon.svg?n5x55#icomoon') format('svg'); - font-weight: normal; - font-style: normal; - font-display: block; + font-family: 'icomoon'; + src: url('../fonts/icomoon.eot?19nagi'); + src: url('../fonts/icomoon.eot?19nagi#iefix') format('embedded-opentype'), + url('../fonts/icomoon.ttf?19nagi') format('truetype'), + url('../fonts/icomoon.woff?19nagi') format('woff'), + url('../fonts/icomoon.svg?19nagi#icomoon') format('svg'); + font-weight: normal; + font-style: normal; + font-display: block; } [class^="icon-"], [class*=" icon-"] { - /* use !important to prevent issues with browser extensions that change fonts */ - font-family: 'icomoon' !important; - speak: never; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'icomoon' !important; + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; - /* Better Font Rendering =========== */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } .icon-graphic-heart:before { - content: "\e91e"; + content: "\e91e"; } .icon-graphic-paperplane:before { - content: "\e91f"; + content: "\e91f"; } .icon-graphic-banknote:before { - content: "\e920"; -} -.icon-stars:before { - content: "\e91a"; + content: "\e920"; } .icon-warning:before { - content: "\e91b"; + content: "\e91b"; } .icon-book:before { - content: "\e900"; + content: "\e900"; } .icon-bookmark:before { - content: "\e91c"; + content: "\e91a"; } .icon-rss:before { - content: "\e91d"; + content: "\e91d"; } .icon-envelope:before { - content: "\e901"; + content: "\e901"; } .icon-arrow-right:before { - content: "\e902"; + content: "\e902"; } .icon-bell:before { - content: "\e903"; + content: "\e903"; } .icon-x:before { - content: "\e904"; + content: "\e904"; } .icon-quote-close:before { - content: "\e905"; + content: "\e905"; } .icon-quote-open:before { - content: "\e906"; + content: "\e906"; } .icon-image:before { - content: "\e907"; + content: "\e907"; } .icon-pencil:before { - content: "\e908"; + content: "\e908"; } .icon-list:before { - content: "\e909"; + content: "\e909"; } .icon-unlock:before { - content: "\e90a"; + content: "\e90a"; } .icon-unlisted:before { - content: "\e90a"; + content: "\e90a"; } .icon-globe:before { - content: "\e90b"; + content: "\e90b"; } .icon-public:before { - content: "\e90b"; + content: "\e90b"; } .icon-lock:before { - content: "\e90c"; + content: "\e90c"; } .icon-followers:before { - content: "\e90c"; + content: "\e90c"; } .icon-chain-broken:before { - content: "\e90d"; + content: "\e90d"; } .icon-chain:before { - content: "\e90e"; + content: "\e90e"; } .icon-comments:before { - content: "\e90f"; + content: "\e90f"; } .icon-comment:before { - content: "\e910"; + content: "\e910"; } .icon-boost:before { - content: "\e911"; + content: "\e911"; } .icon-arrow-left:before { - content: "\e912"; + content: "\e912"; } .icon-arrow-up:before { - content: "\e913"; + content: "\e913"; } .icon-arrow-down:before { - content: "\e914"; + content: "\e914"; } .icon-home:before { - content: "\e915"; + content: "\e915"; } .icon-local:before { - content: "\e916"; + content: "\e916"; } .icon-dots-three:before { - content: "\e917"; + content: "\e917"; } .icon-check:before { - content: "\e918"; + content: "\e918"; } .icon-dots-three-vertical:before { - content: "\e919"; + content: "\e919"; } .icon-search:before { - content: "\e986"; + content: "\e986"; } .icon-star-empty:before { - content: "\e9d7"; + content: "\e9d7"; } .icon-star-half:before { - content: "\e9d8"; + content: "\e9d8"; } .icon-star-full:before { - content: "\e9d9"; + content: "\e9d9"; } .icon-heart:before { - content: "\e9da"; + content: "\e9da"; } .icon-plus:before { - content: "\ea0a"; + content: "\ea0a"; } From 135fcbd26999eb002eff6de13938fe43f55597f2 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 23 Aug 2021 13:02:27 -0700 Subject: [PATCH 04/13] Adds button to template --- bookwyrm/templates/lists/bookmark_button.html | 39 +++++++++++++++++++ bookwyrm/templates/lists/list_layout.html | 11 +++--- bookwyrm/templates/snippets/fav_button.html | 20 ++++++++-- bookwyrm/templatetags/interaction.py | 5 +++ 4 files changed, 66 insertions(+), 9 deletions(-) create mode 100644 bookwyrm/templates/lists/bookmark_button.html diff --git a/bookwyrm/templates/lists/bookmark_button.html b/bookwyrm/templates/lists/bookmark_button.html new file mode 100644 index 00000000..8831d398 --- /dev/null +++ b/bookwyrm/templates/lists/bookmark_button.html @@ -0,0 +1,39 @@ +{% load i18n %} +{% load interaction %} + +{% if request.user.is_authenticated %} + +{% with request.user|bookmarked:list as bookmarked %} +
+ {% csrf_token %} + {% trans "Bookmark" as text %} + +
+ +
+ {% csrf_token %} + {% trans "Un-bookmark" as text %} + +
+{% endwith %} + +{% endif %} + diff --git a/bookwyrm/templates/lists/list_layout.html b/bookwyrm/templates/lists/list_layout.html index b24ce9e3..68abafc0 100644 --- a/bookwyrm/templates/lists/list_layout.html +++ b/bookwyrm/templates/lists/list_layout.html @@ -11,12 +11,13 @@ {% include 'lists/created_text.html' with list=list %}

- {% if request.user == list.user %} -
- {% trans "Edit List" as button_text %} - {% include 'snippets/toggle/open_button.html' with text=button_text icon_with_text="pencil" controls_text="edit_list" focus="edit_list_header" %} +
+ {% if request.user == list.user %} + {% trans "Edit List" as button_text %} + {% include 'snippets/toggle/open_button.html' with text=button_text icon_with_text="pencil" controls_text="edit_list" focus="edit_list_header" %} + {% endif %} + {% include "lists/bookmark_button.html" with list=list %}
- {% endif %}
diff --git a/bookwyrm/templates/snippets/fav_button.html b/bookwyrm/templates/snippets/fav_button.html index 0670b4c5..bf181b1f 100644 --- a/bookwyrm/templates/snippets/fav_button.html +++ b/bookwyrm/templates/snippets/fav_button.html @@ -4,15 +4,27 @@ {% with status.id|uuid as uuid %} {% with request.user|liked:status as liked %} -
+ {% csrf_token %}
-
+ + {% csrf_token %}
+{% if request.user.is_authenticated %} + +{% endif %} + {% if lists %}
{% include 'lists/list_items.html' with lists=lists %} diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 7facde3e..fa63e983 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -218,6 +218,9 @@ urlpatterns = [ # lists re_path(r"%s/lists/?$" % USER_PATH, views.UserLists.as_view(), name="user-lists"), re_path(r"^list/?$", views.Lists.as_view(), name="lists"), + re_path( + r"^list/bookmarks/?$", views.BookmarkedLists.as_view(), name="bookmarked-lists" + ), re_path(r"^list/(?P\d+)(.json)?/?$", views.List.as_view(), name="list"), re_path(r"^list/add-book/?$", views.list.add_book, name="list-add-book"), re_path( diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py index bb7f9d3e..b016b46c 100644 --- a/bookwyrm/views/__init__.py +++ b/bookwyrm/views/__init__.py @@ -25,7 +25,7 @@ from .invite import ManageInvites, Invite, InviteRequest from .invite import ManageInviteRequests, ignore_invite_request from .isbn import Isbn from .landing import About, Home, Landing -from .list import Lists, List, Curate, UserLists +from .list import Lists, BookmarkedLists, List, Curate, UserLists from .list import bookmark, unbookmark from .notifications import Notifications from .outbox import Outbox diff --git a/bookwyrm/views/list.py b/bookwyrm/views/list.py index 14966bc2..e95ecd57 100644 --- a/bookwyrm/views/list.py +++ b/bookwyrm/views/list.py @@ -63,6 +63,25 @@ class Lists(View): return redirect(book_list.local_path) +@method_decorator(login_required, name="dispatch") +class BookmarkedLists(View): + """bookmarked book list page""" + + def get(self, request): + """display book lists""" + # hide lists with no approved books + lists = request.user.saved_lists.order_by("-updated_date") + + paginated = Paginator(lists, 12) + data = { + "lists": paginated.get_page(request.GET.get("page")), + "list_form": forms.ListForm(), + "path": "/list", + } + return TemplateResponse(request, "lists/lists.html", data) + + +@method_decorator(login_required, name="dispatch") class UserLists(View): """a user's book list page""" From f187d7ec2d77b2da2b20f939f867845193c72482 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 23 Aug 2021 13:53:45 -0700 Subject: [PATCH 07/13] ignore vendor files in editorconfig --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index d102bc5a..b7128419 100644 --- a/.editorconfig +++ b/.editorconfig @@ -32,7 +32,7 @@ indent_size = 2 max_line_length = off # Computer generated files -[{package.json,*.lock,*.mo}] +[{vendor/*,package.json,*.lock,*.mo}] indent_size = unset indent_style = unset max_line_length = unset From fcd41aaf06b30c3db1cfc762d61c1bd58f914409 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 23 Aug 2021 13:59:23 -0700 Subject: [PATCH 08/13] Add specific vendor file --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index b7128419..f2e8a178 100644 --- a/.editorconfig +++ b/.editorconfig @@ -32,7 +32,7 @@ indent_size = 2 max_line_length = off # Computer generated files -[{vendor/*,package.json,*.lock,*.mo}] +[{icons.css,package.json,*.lock,*.mo}] indent_size = unset indent_style = unset max_line_length = unset From 47dbcc3af07e0e5d37d88c94d5802e4db687543b Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 23 Aug 2021 14:15:19 -0700 Subject: [PATCH 09/13] Adds views test --- bookwyrm/tests/views/test_list.py | 44 +++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/bookwyrm/tests/views/test_list.py b/bookwyrm/tests/views/test_list.py index 988d8d4a..f76b6ac9 100644 --- a/bookwyrm/tests/views/test_list.py +++ b/bookwyrm/tests/views/test_list.py @@ -91,6 +91,50 @@ class ListViews(TestCase): result.render() self.assertEqual(result.status_code, 200) + def test_bookmarked_lists_page(self): + """there are so many views, this just makes sure it LOADS""" + view = views.BookmarkedLists.as_view() + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + booklist = models.List.objects.create(name="Public list", user=self.local_user) + models.List.objects.create( + name="Private list", privacy="direct", user=self.local_user + ) + self.local_user.saved_lists.add(booklist) + request = self.factory.get("") + request.user = self.local_user + + result = view(request) + self.assertIsInstance(result, TemplateResponse) + result.render() + self.assertEqual(result.status_code, 200) + self.assertEqual(result.context_data["lists"].object_list, [booklist]) + + def test_bookmarked_lists_page_empty(self): + """there are so many views, this just makes sure it LOADS""" + view = views.BookmarkedLists.as_view() + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + models.List.objects.create(name="Public list", user=self.local_user) + models.List.objects.create( + name="Private list", privacy="direct", user=self.local_user + ) + request = self.factory.get("") + request.user = self.local_user + + result = view(request) + self.assertIsInstance(result, TemplateResponse) + result.render() + self.assertEqual(result.status_code, 200) + self.assertEqual(result.context_data["lists"].object_list, []) + + def test_bookmarked_lists_page_logged_out(self): + """logged out bookmarked lists""" + view = views.BookmarkedLists.as_view() + request = self.factory.get("") + request.user = self.anonymous_user + + result = view(request) + self.assertEqual(result.status_code, 301) + def test_lists_create(self): """create list view""" view = views.Lists.as_view() From b7fb55e6ad92fe1dfd44e1f39a54b587ecc76626 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 23 Aug 2021 14:53:48 -0700 Subject: [PATCH 10/13] Fixes test for login redirected view --- bookwyrm/tests/views/test_list.py | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/bookwyrm/tests/views/test_list.py b/bookwyrm/tests/views/test_list.py index f76b6ac9..e38f4eae 100644 --- a/bookwyrm/tests/views/test_list.py +++ b/bookwyrm/tests/views/test_list.py @@ -91,11 +91,13 @@ class ListViews(TestCase): result.render() self.assertEqual(result.status_code, 200) - def test_bookmarked_lists_page(self): + def test_saved_lists_page(self): """there are so many views, this just makes sure it LOADS""" - view = views.BookmarkedLists.as_view() + view = views.SavedLists.as_view() with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - booklist = models.List.objects.create(name="Public list", user=self.local_user) + booklist = models.List.objects.create( + name="Public list", user=self.local_user + ) models.List.objects.create( name="Private list", privacy="direct", user=self.local_user ) @@ -109,9 +111,9 @@ class ListViews(TestCase): self.assertEqual(result.status_code, 200) self.assertEqual(result.context_data["lists"].object_list, [booklist]) - def test_bookmarked_lists_page_empty(self): + def test_saved_lists_page_empty(self): """there are so many views, this just makes sure it LOADS""" - view = views.BookmarkedLists.as_view() + view = views.SavedLists.as_view() with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): models.List.objects.create(name="Public list", user=self.local_user) models.List.objects.create( @@ -126,9 +128,9 @@ class ListViews(TestCase): self.assertEqual(result.status_code, 200) self.assertEqual(result.context_data["lists"].object_list, []) - def test_bookmarked_lists_page_logged_out(self): - """logged out bookmarked lists""" - view = views.BookmarkedLists.as_view() + def test_saved_lists_page_logged_out(self): + """logged out saved lists""" + view = views.SavedLists.as_view() request = self.factory.get("") request.user = self.anonymous_user @@ -372,15 +374,9 @@ class ListViews(TestCase): def test_user_lists_page_logged_out(self): """there are so many views, this just makes sure it LOADS""" view = views.UserLists.as_view() - with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - models.List.objects.create(name="Public list", user=self.local_user) - models.List.objects.create( - name="Private list", privacy="direct", user=self.local_user - ) request = self.factory.get("") request.user = self.anonymous_user result = view(request, self.local_user.username) - self.assertIsInstance(result, TemplateResponse) result.render() - self.assertEqual(result.status_code, 200) + self.assertEqual(result.status_code, 302) From f267e53b56ebce5258f395d1edd5078c33f8696d Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 23 Aug 2021 15:07:38 -0700 Subject: [PATCH 11/13] let's call it save not bookmark --- bookwyrm/templates/lists/bookmark_button.html | 26 +++++++++---------- bookwyrm/templates/lists/lists.html | 6 ++--- bookwyrm/templatetags/interaction.py | 6 ++--- bookwyrm/urls.py | 10 +++---- bookwyrm/views/__init__.py | 4 +-- bookwyrm/views/list.py | 14 +++++----- 6 files changed, 31 insertions(+), 35 deletions(-) diff --git a/bookwyrm/templates/lists/bookmark_button.html b/bookwyrm/templates/lists/bookmark_button.html index c63a8e1e..f8f94763 100644 --- a/bookwyrm/templates/lists/bookmark_button.html +++ b/bookwyrm/templates/lists/bookmark_button.html @@ -3,32 +3,32 @@ {% if request.user.is_authenticated %} -{% with request.user|bookmarked:list as bookmarked %} +{% with request.user|saved:list as saved %} {% csrf_token %} - {% trans "Bookmark" as text %} -
{% csrf_token %} - {% trans "Un-bookmark" as text %} - diff --git a/bookwyrm/templates/lists/lists.html b/bookwyrm/templates/lists/lists.html index 376449f8..d909f5e8 100644 --- a/bookwyrm/templates/lists/lists.html +++ b/bookwyrm/templates/lists/lists.html @@ -31,12 +31,12 @@ diff --git a/bookwyrm/templatetags/interaction.py b/bookwyrm/templatetags/interaction.py index 8ad554e7..64c91f89 100644 --- a/bookwyrm/templatetags/interaction.py +++ b/bookwyrm/templatetags/interaction.py @@ -18,7 +18,7 @@ def get_user_boosted(user, status): return status.boosters.filter(user=user).exists() -@register.filter(name="bookmarked") -def get_user_bookmarked(user, book_list): - """did the user bookmark a list""" +@register.filter(name="saved") +def get_user_saved_lists(user, book_list): + """did the user save a list""" return user.saved_lists.filter(id=book_list.id).exists() diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index fa63e983..4494ba5a 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -218,9 +218,7 @@ urlpatterns = [ # lists re_path(r"%s/lists/?$" % USER_PATH, views.UserLists.as_view(), name="user-lists"), re_path(r"^list/?$", views.Lists.as_view(), name="lists"), - re_path( - r"^list/bookmarks/?$", views.BookmarkedLists.as_view(), name="bookmarked-lists" - ), + re_path(r"^list/saved/?$", views.SavedLists.as_view(), name="saved-lists"), re_path(r"^list/(?P\d+)(.json)?/?$", views.List.as_view(), name="list"), re_path(r"^list/add-book/?$", views.list.add_book, name="list-add-book"), re_path( @@ -236,10 +234,8 @@ urlpatterns = [ re_path( r"^list/(?P\d+)/curate/?$", views.Curate.as_view(), name="list-curate" ), - re_path(r"bookmark/(?P\d+)/?$", views.bookmark, name="list-bookmark"), - re_path( - r"^unbookmark/(?P\d+)/?$", views.unbookmark, name="list-unbookmark" - ), + re_path(r"^save-list/(?P\d+)/?$", views.saveList, name="list-save"), + re_path(r"^unsave-list/(?P\d+)/?$", views.unsaveList, name="list-unsave"), # User books re_path(r"%s/books/?$" % USER_PATH, views.Shelf.as_view(), name="user-shelves"), re_path( diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py index b016b46c..bee367f7 100644 --- a/bookwyrm/views/__init__.py +++ b/bookwyrm/views/__init__.py @@ -25,8 +25,8 @@ from .invite import ManageInvites, Invite, InviteRequest from .invite import ManageInviteRequests, ignore_invite_request from .isbn import Isbn from .landing import About, Home, Landing -from .list import Lists, BookmarkedLists, List, Curate, UserLists -from .list import bookmark, unbookmark +from .list import Lists, SavedLists, List, Curate, UserLists +from .list import saveList, unsaveList from .notifications import Notifications from .outbox import Outbox from .reading import edit_readthrough, create_readthrough diff --git a/bookwyrm/views/list.py b/bookwyrm/views/list.py index e95ecd57..aab7c251 100644 --- a/bookwyrm/views/list.py +++ b/bookwyrm/views/list.py @@ -64,8 +64,8 @@ class Lists(View): @method_decorator(login_required, name="dispatch") -class BookmarkedLists(View): - """bookmarked book list page""" +class SavedLists(View): + """saved book list page""" def get(self, request): """display book lists""" @@ -244,18 +244,18 @@ class Curate(View): @require_POST @login_required -def bookmark(request, list_id): - """bookmark a list""" - book_list = models.List.objects.get(id=list_id) +def saveList(request, list_id): + """save a list""" + book_list = get_object_or_404(models.List, id=list_id) request.user.saved_lists.add(book_list) return redirect("list", list_id) @require_POST @login_required -def unbookmark(request, list_id): +def unsaveList(request, list_id): """unsave a list""" - book_list = models.List.objects.get(id=list_id) + book_list = get_object_or_404(models.List, id=list_id) request.user.saved_lists.remove(book_list) return redirect("list", list_id) From c727d351ba596954e8050be53447691427ca54f3 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 23 Aug 2021 15:33:49 -0700 Subject: [PATCH 12/13] Fixes variable name --- bookwyrm/urls.py | 4 ++-- bookwyrm/views/__init__.py | 2 +- bookwyrm/views/list.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 4494ba5a..1dbd67a7 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -234,8 +234,8 @@ urlpatterns = [ re_path( r"^list/(?P\d+)/curate/?$", views.Curate.as_view(), name="list-curate" ), - re_path(r"^save-list/(?P\d+)/?$", views.saveList, name="list-save"), - re_path(r"^unsave-list/(?P\d+)/?$", views.unsaveList, name="list-unsave"), + re_path(r"^save-list/(?P\d+)/?$", views.save_list, name="list-save"), + re_path(r"^unsave-list/(?P\d+)/?$", views.unsave_list, name="list-unsave"), # User books re_path(r"%s/books/?$" % USER_PATH, views.Shelf.as_view(), name="user-shelves"), re_path( diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py index bee367f7..f4204925 100644 --- a/bookwyrm/views/__init__.py +++ b/bookwyrm/views/__init__.py @@ -26,7 +26,7 @@ from .invite import ManageInviteRequests, ignore_invite_request from .isbn import Isbn from .landing import About, Home, Landing from .list import Lists, SavedLists, List, Curate, UserLists -from .list import saveList, unsaveList +from .list import save_list, unsave_list from .notifications import Notifications from .outbox import Outbox from .reading import edit_readthrough, create_readthrough diff --git a/bookwyrm/views/list.py b/bookwyrm/views/list.py index aab7c251..e6ef52ba 100644 --- a/bookwyrm/views/list.py +++ b/bookwyrm/views/list.py @@ -244,7 +244,7 @@ class Curate(View): @require_POST @login_required -def saveList(request, list_id): +def save_list(request, list_id): """save a list""" book_list = get_object_or_404(models.List, id=list_id) request.user.saved_lists.add(book_list) @@ -253,7 +253,7 @@ def saveList(request, list_id): @require_POST @login_required -def unsaveList(request, list_id): +def unsave_list(request, list_id): """unsave a list""" book_list = get_object_or_404(models.List, id=list_id) request.user.saved_lists.remove(book_list) From 473ad5ffba28f39e66477fd2fef59637360f4484 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 23 Aug 2021 15:35:51 -0700 Subject: [PATCH 13/13] Fixes tests --- bookwyrm/tests/views/test_list.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bookwyrm/tests/views/test_list.py b/bookwyrm/tests/views/test_list.py index e38f4eae..d5e917c3 100644 --- a/bookwyrm/tests/views/test_list.py +++ b/bookwyrm/tests/views/test_list.py @@ -126,7 +126,7 @@ class ListViews(TestCase): self.assertIsInstance(result, TemplateResponse) result.render() self.assertEqual(result.status_code, 200) - self.assertEqual(result.context_data["lists"].object_list, []) + self.assertEqual(len(result.context_data["lists"].object_list), 0) def test_saved_lists_page_logged_out(self): """logged out saved lists""" @@ -135,7 +135,7 @@ class ListViews(TestCase): request.user = self.anonymous_user result = view(request) - self.assertEqual(result.status_code, 301) + self.assertEqual(result.status_code, 302) def test_lists_create(self): """create list view""" @@ -378,5 +378,4 @@ class ListViews(TestCase): request.user = self.anonymous_user result = view(request, self.local_user.username) - result.render() self.assertEqual(result.status_code, 302)