From a0093a8a2e63c42fa89e09c0d1061b8e4f41dda5 Mon Sep 17 00:00:00 2001 From: Joachim Date: Mon, 22 Nov 2021 00:25:47 +0100 Subject: [PATCH 01/13] Add status type filters --- bookwyrm/forms.py | 23 ++++++++++++ bookwyrm/models/user.py | 9 ++++- bookwyrm/templates/feed/feed.html | 21 +++++++++++ .../widgets/checkbox_select_horizontal.html | 11 ++++++ .../checkbox_select_horizontal_option.html | 4 +++ bookwyrm/views/feed.py | 35 +++++++++++++++++-- 6 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 bookwyrm/templates/widgets/checkbox_select_horizontal.html create mode 100644 bookwyrm/templates/widgets/checkbox_select_horizontal_option.html diff --git a/bookwyrm/forms.py b/bookwyrm/forms.py index 847ca05c0..fc8f018d0 100644 --- a/bookwyrm/forms.py +++ b/bookwyrm/forms.py @@ -174,6 +174,29 @@ class UserGroupForm(CustomForm): fields = ["groups"] +class CheckboxSelectMultipleHorizontal(widgets.CheckboxSelectMultiple): + template_name = "widgets/checkbox_select_horizontal.html" + option_template_name = "widgets/checkbox_select_horizontal_option.html" + + +class FeedStatusTypes(CustomForm): + class Meta: + model = models.User + fields = ["feed_status_types"] + help_texts = {f: None for f in fields} + labels = {"feed_status_types": ""} + widgets = { + "feed_status_types": CheckboxSelectMultipleHorizontal( + choices=[ + ("review", _("Reviews")), + ("comment", _("Comments")), + ("quotation", _("Quotations")), + ("everything", _("Everything else")), + ], + ), + } + + class CoverForm(CustomForm): class Meta: model = models.Book diff --git a/bookwyrm/models/user.py b/bookwyrm/models/user.py index d7945843f..7ca92e4f2 100644 --- a/bookwyrm/models/user.py +++ b/bookwyrm/models/user.py @@ -4,7 +4,7 @@ from urllib.parse import urlparse from django.apps import apps from django.contrib.auth.models import AbstractUser, Group -from django.contrib.postgres.fields import CICharField +from django.contrib.postgres.fields import ArrayField, CICharField from django.core.validators import MinValueValidator from django.dispatch import receiver from django.db import models, transaction @@ -128,6 +128,13 @@ class User(OrderedCollectionPageMixin, AbstractUser): show_suggested_users = models.BooleanField(default=True) discoverable = fields.BooleanField(default=False) + # feed options + feed_status_types = ArrayField( + models.CharField(max_length=10, blank=False), + size=8, + default=list(["review", "comment", "quotation", "everything"]), + ) + preferred_timezone = models.CharField( choices=[(str(tz), str(tz)) for tz in pytz.all_timezones], default=str(pytz.utc), diff --git a/bookwyrm/templates/feed/feed.html b/bookwyrm/templates/feed/feed.html index a6175199d..9783e2126 100644 --- a/bookwyrm/templates/feed/feed.html +++ b/bookwyrm/templates/feed/feed.html @@ -16,6 +16,27 @@ + +
+ + What to display? + {% if settings_saved %} + Saved! + {% endif %} + +
+ {% csrf_token %} +
+ {{ feed_status_types_form }} +
+
+ +
+
+
+ {# announcements and system messages #} {% if not activities.number > 1 %}
{% if request.user.show_goal and not goal and tab.key == 'home' %} diff --git a/bookwyrm/views/feed.py b/bookwyrm/views/feed.py index bd39b0834..7cf56d48f 100644 --- a/bookwyrm/views/feed.py +++ b/bookwyrm/views/feed.py @@ -59,6 +59,7 @@ class Feed(View): "streams": STREAMS, "goal_form": forms.GoalForm(), "feed_status_types_options": FeedFilterChoices, + "allowed_status_types": request.user.feed_status_types, "settings_saved": settings_saved, "path": f"/{tab['key']}", }, diff --git a/bookwyrm/views/updates.py b/bookwyrm/views/updates.py index 726145626..2bbc54776 100644 --- a/bookwyrm/views/updates.py +++ b/bookwyrm/views/updates.py @@ -22,4 +22,9 @@ def get_unread_status_count(request, stream="home"): stream = activitystreams.streams.get(stream) if not stream: return JsonResponse({}) - return JsonResponse({"count": stream.get_unread_count(request.user)}) + return JsonResponse( + { + "count": stream.get_unread_count(request.user), + "count_by_type": stream.get_unread_count_by_status_type(request.user), + } + ) From 8712b2fdab12dc4ab059575432d6fef62011485e Mon Sep 17 00:00:00 2001 From: Joachim Date: Wed, 24 Nov 2021 19:02:07 +0100 Subject: [PATCH 10/13] ESLint --- bookwyrm/static/js/bookwyrm.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js index b45578000..a5f7d7e96 100644 --- a/bookwyrm/static/js/bookwyrm.js +++ b/bookwyrm/static/js/bookwyrm.js @@ -127,6 +127,7 @@ let BookWyrm = new class { // This concerns 'review', 'quotation', 'comment' count = allowedStatusTypes.reduce(function(prev, currentKey) { const currentValue = count_by_type[currentKey] | 0; + return prev + currentValue; }, 0); @@ -143,6 +144,7 @@ let BookWyrm = new class { function(prev, currentKey) { const currentValue = count_by_everything_else[currentKey] | 0 + return prev + currentValue; }, count From 0001d6e92a2c4107188c5b7cdf618df35fcfc0ae Mon Sep 17 00:00:00 2001 From: Joachim Date: Wed, 24 Nov 2021 19:04:14 +0100 Subject: [PATCH 11/13] PyLint --- bookwyrm/models/user.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bookwyrm/models/user.py b/bookwyrm/models/user.py index f4183812b..4d98f5c57 100644 --- a/bookwyrm/models/user.py +++ b/bookwyrm/models/user.py @@ -37,6 +37,7 @@ FeedFilterChoices = [ def get_feed_filter_choices(): + """return a list of filter choice keys""" return [f[0] for f in FeedFilterChoices] From 5f81be74cb3beb0a8392d7f96e55b86d3ae7726f Mon Sep 17 00:00:00 2001 From: Joachim Date: Wed, 24 Nov 2021 20:52:30 +0100 Subject: [PATCH 12/13] Add test --- bookwyrm/tests/views/test_updates.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/bookwyrm/tests/views/test_updates.py b/bookwyrm/tests/views/test_updates.py index 27181fc95..d510fba63 100644 --- a/bookwyrm/tests/views/test_updates.py +++ b/bookwyrm/tests/views/test_updates.py @@ -50,10 +50,13 @@ class UpdateViews(TestCase): request = self.factory.get("") request.user = self.local_user - with patch("bookwyrm.activitystreams.ActivityStream.get_unread_count") as mock: - mock.return_value = 3 - result = views.get_unread_status_count(request, "home") + with patch("bookwyrm.activitystreams.ActivityStream.get_unread_count") as mock_count: + with patch("bookwyrm.activitystreams.ActivityStream.get_unread_count_by_status_type") as mock_count_by_status: + mock_count.return_value = 3 + mock_count_by_status.return_value = {"review": 5} + result = views.get_unread_status_count(request, "home") self.assertIsInstance(result, JsonResponse) data = json.loads(result.getvalue()) self.assertEqual(data["count"], 3) + self.assertEqual(data["count_by_type"]["review"], 5) From 7d24568dcda7cbec7af3647ab33b46e7b9fab457 Mon Sep 17 00:00:00 2001 From: Joachim Date: Wed, 24 Nov 2021 20:54:53 +0100 Subject: [PATCH 13/13] Update test_updates.py --- bookwyrm/tests/views/test_updates.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/bookwyrm/tests/views/test_updates.py b/bookwyrm/tests/views/test_updates.py index d510fba63..e7b466ccf 100644 --- a/bookwyrm/tests/views/test_updates.py +++ b/bookwyrm/tests/views/test_updates.py @@ -50,8 +50,12 @@ class UpdateViews(TestCase): request = self.factory.get("") request.user = self.local_user - with patch("bookwyrm.activitystreams.ActivityStream.get_unread_count") as mock_count: - with patch("bookwyrm.activitystreams.ActivityStream.get_unread_count_by_status_type") as mock_count_by_status: + with patch( + "bookwyrm.activitystreams.ActivityStream.get_unread_count" + ) as mock_count: + with patch( + "bookwyrm.activitystreams.ActivityStream.get_unread_count_by_status_type" + ) as mock_count_by_status: mock_count.return_value = 3 mock_count_by_status.return_value = {"review": 5} result = views.get_unread_status_count(request, "home")