From 07f4300176f9f1edb9597dc0e75c6cdf21f67143 Mon Sep 17 00:00:00 2001 From: Dustin Steiner Date: Fri, 27 Jan 2023 15:43:34 +0000 Subject: [PATCH 01/12] feat: button in admin view to manually activate pending user --- .../settings/users/user_moderation_actions.html | 6 ++++++ bookwyrm/urls.py | 5 +++++ bookwyrm/utils/regex.py | 2 +- bookwyrm/views/__init__.py | 2 +- bookwyrm/views/admin/user_admin.py | 16 +++++++++++++++- 5 files changed, 28 insertions(+), 3 deletions(-) diff --git a/bookwyrm/templates/settings/users/user_moderation_actions.html b/bookwyrm/templates/settings/users/user_moderation_actions.html index 72202f379..9fda8c847 100644 --- a/bookwyrm/templates/settings/users/user_moderation_actions.html +++ b/bookwyrm/templates/settings/users/user_moderation_actions.html @@ -15,6 +15,12 @@

{% endif %} + {% if not user.is_active and user.deactivation_reason == "pending" %} +
+ {% csrf_token %} + +
+ {% endif %} {% if user.is_active or user.deactivation_reason == "pending" %}
{% csrf_token %} diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 73bdd3755..cd07cbf00 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -145,6 +145,11 @@ urlpatterns = [ views.UserAdmin.as_view(), name="settings-user", ), + re_path( + r"^settings/users/(?P\d+)/activate/?$", + views.ActivateUserAdmin.as_view(), + name="settings-activate-user", + ), re_path( r"^settings/federation/(?P(federated|blocked))?/?$", views.Federation.as_view(), diff --git a/bookwyrm/utils/regex.py b/bookwyrm/utils/regex.py index c8a475a3d..b2c8a5ba3 100644 --- a/bookwyrm/utils/regex.py +++ b/bookwyrm/utils/regex.py @@ -1,6 +1,6 @@ """ defining regexes for regularly used concepts """ -DOMAIN = r"[\w_\-\.]+\.[a-z\-]{2,}" +DOMAIN = r"(?:localhost:[0-9]{4,}|[\w_\-\.]+\.[a-z\-]{2,})" LOCALNAME = r"@?[a-zA-Z_\-\.0-9]+" STRICT_LOCALNAME = r"@[a-zA-Z_\-\.0-9]+" USERNAME = rf"{LOCALNAME}(@{DOMAIN})?" diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py index 353275c46..cb4d79abd 100644 --- a/bookwyrm/views/__init__.py +++ b/bookwyrm/views/__init__.py @@ -31,7 +31,7 @@ from .admin.reports import ( ) from .admin.site import Site, Registration, RegistrationLimited from .admin.themes import Themes, delete_theme -from .admin.user_admin import UserAdmin, UserAdminList +from .admin.user_admin import UserAdmin, UserAdminList, ActivateUserAdmin # user preferences from .preferences.change_password import ChangePassword diff --git a/bookwyrm/views/admin/user_admin.py b/bookwyrm/views/admin/user_admin.py index 4611a388c..bc04e833f 100644 --- a/bookwyrm/views/admin/user_admin.py +++ b/bookwyrm/views/admin/user_admin.py @@ -1,7 +1,7 @@ """ manage user """ from django.contrib.auth.decorators import login_required, permission_required from django.core.paginator import Paginator -from django.shortcuts import get_object_or_404 +from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse from django.utils.decorators import method_decorator from django.views import View @@ -95,3 +95,17 @@ class UserAdmin(View): form.save(request) data = {"user": user, "group_form": form} return TemplateResponse(request, "settings/users/user.html", data) + +@method_decorator(login_required, name="dispatch") +@method_decorator( + permission_required("bookwyrm.moderate_user", raise_exception=True), + name="dispatch", +) +class ActivateUserAdmin(View): + """activate a user manually""" + + def post(self, request, user): + """activate user""" + user = get_object_or_404(models.User, id=user) + user.reactivate() + return redirect("settings-user", user.id) From 3d29524e29f85d099fc078bb701c79b8069825a0 Mon Sep 17 00:00:00 2001 From: Dustin Steiner Date: Fri, 27 Jan 2023 15:45:43 +0000 Subject: [PATCH 02/12] chore: reverse support for localhost domain --- bookwyrm/utils/regex.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/utils/regex.py b/bookwyrm/utils/regex.py index b2c8a5ba3..c8a475a3d 100644 --- a/bookwyrm/utils/regex.py +++ b/bookwyrm/utils/regex.py @@ -1,6 +1,6 @@ """ defining regexes for regularly used concepts """ -DOMAIN = r"(?:localhost:[0-9]{4,}|[\w_\-\.]+\.[a-z\-]{2,})" +DOMAIN = r"[\w_\-\.]+\.[a-z\-]{2,}" LOCALNAME = r"@?[a-zA-Z_\-\.0-9]+" STRICT_LOCALNAME = r"@[a-zA-Z_\-\.0-9]+" USERNAME = rf"{LOCALNAME}(@{DOMAIN})?" From 54aea0654af7a81162b3cc6631b4011fc23e6e00 Mon Sep 17 00:00:00 2001 From: Dustin Steiner Date: Fri, 27 Jan 2023 15:47:22 +0000 Subject: [PATCH 03/12] style: run linter --- bookwyrm/views/admin/user_admin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bookwyrm/views/admin/user_admin.py b/bookwyrm/views/admin/user_admin.py index bc04e833f..77177e6f1 100644 --- a/bookwyrm/views/admin/user_admin.py +++ b/bookwyrm/views/admin/user_admin.py @@ -96,6 +96,7 @@ class UserAdmin(View): data = {"user": user, "group_form": form} return TemplateResponse(request, "settings/users/user.html", data) + @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.moderate_user", raise_exception=True), From 46bfc184f56d46a98544c2731c33e701627d1bcb Mon Sep 17 00:00:00 2001 From: Christof Dorner Date: Fri, 27 Jan 2023 17:49:48 +0100 Subject: [PATCH 04/12] Improve feed header for federated generated notes This works for wants/started/finished reading generated notes, but not yet for "set a goal". --- .../templates/snippets/status/headers/generatednote.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bookwyrm/templates/snippets/status/headers/generatednote.html b/bookwyrm/templates/snippets/status/headers/generatednote.html index 6a34dcd11..398dc09db 100644 --- a/bookwyrm/templates/snippets/status/headers/generatednote.html +++ b/bookwyrm/templates/snippets/status/headers/generatednote.html @@ -4,11 +4,11 @@ {# Three day cache #} {% get_current_language as LANGUAGE_CODE %} {% cache 259200 generated_note_header LANGUAGE_CODE status.id %} -{% if status.content == 'wants to read' %} +{% if status.content == 'wants to read' or status.content == '

wants to read

' %} {% include 'snippets/status/headers/to_read.html' with book=status.mention_books.first %} -{% elif status.content == 'finished reading' %} +{% elif status.content == 'finished reading' or status.content == '

finished reading

' %} {% include 'snippets/status/headers/read.html' with book=status.mention_books.first %} -{% elif status.content == 'started reading' %} +{% elif status.content == 'started reading' or status.content == '

started reading

' %} {% include 'snippets/status/headers/reading.html' with book=status.mention_books.first %} {% else %} {{ status.content }} From 3fdbfe405bf8bc930d0766b4de3b2c6a984adcef Mon Sep 17 00:00:00 2001 From: Dustin Steiner Date: Sat, 28 Jan 2023 08:31:16 +0000 Subject: [PATCH 05/12] fix: rename activate user form name --- bookwyrm/templates/settings/users/user_moderation_actions.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/templates/settings/users/user_moderation_actions.html b/bookwyrm/templates/settings/users/user_moderation_actions.html index 9fda8c847..5bd007e0d 100644 --- a/bookwyrm/templates/settings/users/user_moderation_actions.html +++ b/bookwyrm/templates/settings/users/user_moderation_actions.html @@ -16,7 +16,7 @@ {% endif %} {% if not user.is_active and user.deactivation_reason == "pending" %} - + {% csrf_token %} From 952dd0dcdf43a552e4cc39ad280203c48b668e62 Mon Sep 17 00:00:00 2001 From: Dustin Steiner Date: Sat, 28 Jan 2023 08:31:41 +0000 Subject: [PATCH 06/12] style: fix unused parameter linter error --- bookwyrm/views/admin/user_admin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bookwyrm/views/admin/user_admin.py b/bookwyrm/views/admin/user_admin.py index 77177e6f1..c793d3bff 100644 --- a/bookwyrm/views/admin/user_admin.py +++ b/bookwyrm/views/admin/user_admin.py @@ -105,6 +105,7 @@ class UserAdmin(View): class ActivateUserAdmin(View): """activate a user manually""" + # pylint: disable=unused-argument def post(self, request, user): """activate user""" user = get_object_or_404(models.User, id=user) From 3c52426a1ca0067e3bfbf61c4f8c5a6290b6e369 Mon Sep 17 00:00:00 2001 From: 0x29a Date: Sun, 29 Jan 2023 16:16:31 +0100 Subject: [PATCH 07/12] Optimize `get_suggested_books` --- bookwyrm/views/feed.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/bookwyrm/views/feed.py b/bookwyrm/views/feed.py index 6d7aeb239..17218b93e 100644 --- a/bookwyrm/views/feed.py +++ b/bookwyrm/views/feed.py @@ -237,16 +237,24 @@ def feed_page_data(user): def get_suggested_books(user, max_books=5): """helper to get a user's recent books""" book_count = 0 - preset_shelves = [("reading", max_books), ("read", 2), ("to-read", max_books)] + preset_shelves = {"reading": max_books, "read": 2, "to-read": max_books} suggested_books = [] - for (preset, shelf_max) in preset_shelves: + + user_shelves = { + shelf.identifier: shelf + for shelf in user.shelf_set.filter( + identifier__in=preset_shelves.keys() + ).exclude(books__isnull=True) + } + + for preset, shelf_max in preset_shelves.items(): limit = ( shelf_max if shelf_max < (max_books - book_count) else max_books - book_count ) - shelf = user.shelf_set.get(identifier=preset) - if not shelf.books.exists(): + shelf = user_shelves.get(preset, None) + if not shelf: continue shelf_preview = { From 6ea251379075260d731e80de0e8876cc8831c660 Mon Sep 17 00:00:00 2001 From: 0x29a Date: Sun, 29 Jan 2023 16:25:29 +0100 Subject: [PATCH 08/12] Remove duplicated notifications request from layout.html --- bookwyrm/templates/layout.html | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/bookwyrm/templates/layout.html b/bookwyrm/templates/layout.html index e838ead12..a8d06ee8d 100644 --- a/bookwyrm/templates/layout.html +++ b/bookwyrm/templates/layout.html @@ -25,6 +25,7 @@ {% block body %} From 6e1418c5d4d2f6c2b8f47a9fc2f36ebb489d3248 Mon Sep 17 00:00:00 2001 From: 0x29a Date: Sun, 29 Jan 2023 16:30:09 +0100 Subject: [PATCH 09/12] Remove duplicated mentions request from layout.html --- bookwyrm/templates/layout.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bookwyrm/templates/layout.html b/bookwyrm/templates/layout.html index a8d06ee8d..1227e39c4 100644 --- a/bookwyrm/templates/layout.html +++ b/bookwyrm/templates/layout.html @@ -25,7 +25,7 @@ {% block body %}