Merge pull request #1984 from bookwyrm-social/hide-follows

Option for users to hide their followers/following lists
This commit is contained in:
Mouse Reeve 2022-02-28 13:13:40 -08:00 committed by GitHub
commit 142ecdf6aa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 53 additions and 12 deletions

View file

@ -39,4 +39,5 @@ class Person(ActivityObject):
bookwyrmUser: bool = False bookwyrmUser: bool = False
manuallyApprovesFollowers: str = False manuallyApprovesFollowers: str = False
discoverable: str = False discoverable: str = False
hideFollows: str = False
type: str = "Person" type: str = "Person"

View file

@ -153,6 +153,7 @@ class EditUserForm(CustomForm):
"manually_approves_followers", "manually_approves_followers",
"default_post_privacy", "default_post_privacy",
"discoverable", "discoverable",
"hide_follows",
"preferred_timezone", "preferred_timezone",
"preferred_language", "preferred_language",
] ]

View file

@ -0,0 +1,19 @@
# Generated by Django 3.2.12 on 2022-02-28 19:44
import bookwyrm.models.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("bookwyrm", "0141_alter_report_status"),
]
operations = [
migrations.AddField(
model_name="user",
name="hide_follows",
field=bookwyrm.models.fields.BooleanField(default=False),
),
]

View file

@ -136,6 +136,7 @@ class User(OrderedCollectionPageMixin, AbstractUser):
updated_date = models.DateTimeField(auto_now=True) updated_date = models.DateTimeField(auto_now=True)
last_active_date = models.DateTimeField(default=timezone.now) last_active_date = models.DateTimeField(default=timezone.now)
manually_approves_followers = fields.BooleanField(default=False) manually_approves_followers = fields.BooleanField(default=False)
hide_follows = fields.BooleanField(default=False)
# options to turn features on and off # options to turn features on and off
show_goal = models.BooleanField(default=True) show_goal = models.BooleanField(default=True)

View file

@ -33,7 +33,7 @@
</div> </div>
<footer class="card-footer"> <footer class="card-footer">
{% if user != request.user %} {% if user != request.user %}
{% if user.mutuals %} {% if user.mutuals and not user.hide_follows %}
<div class="card-footer-item"> <div class="card-footer-item">
<div class="has-text-centered"> <div class="has-text-centered">
<p class="title is-6 mb-0">{{ user.mutuals }}</p> <p class="title is-6 mb-0">{{ user.mutuals }}</p>

View file

@ -15,7 +15,7 @@
<span title="@{{ user|username }}" class="is-block pb-3">@{{ user|username|truncatechars:8 }}</span> <span title="@{{ user|username }}" class="is-block pb-3">@{{ user|username|truncatechars:8 }}</span>
</a> </a>
{% include 'snippets/add_to_group_button.html' with user=user group=group %} {% include 'snippets/add_to_group_button.html' with user=user group=group %}
{% if user.mutuals %} {% if user.mutuals and not user.hide_follows %}
<p class="help"> <p class="help">
{% blocktrans trimmed with mutuals=user.mutuals|intcomma count counter=user.mutuals %} {% blocktrans trimmed with mutuals=user.mutuals|intcomma count counter=user.mutuals %}
{{ mutuals }} follower you follow {{ mutuals }} follower you follow

View file

@ -111,6 +111,12 @@
{% trans "Manually approve followers" %} {% trans "Manually approve followers" %}
</label> </label>
</div> </div>
<div class="field">
<label class="checkbox label" for="id_hide_follows">
{{ form.hide_follows }}
{% trans "Hide followers and following on profile" %}
</label>
</div>
<div class="field"> <div class="field">
<label class="label" for="id_default_post_privacy"> <label class="label" for="id_default_post_privacy">
{% trans "Default post privacy:" %} {% trans "Default post privacy:" %}

View file

@ -11,7 +11,7 @@
<span title="@{{ user|username }}" class="is-block pb-3">@{{ user|username|truncatechars:8 }}</span> <span title="@{{ user|username }}" class="is-block pb-3">@{{ user|username|truncatechars:8 }}</span>
</a> </a>
{% include 'snippets/follow_button.html' with user=user minimal=True %} {% include 'snippets/follow_button.html' with user=user minimal=True %}
{% if user.mutuals %} {% if user.mutuals and not user.hide_follows %}
<p class="help"> <p class="help">
{% blocktrans trimmed with mutuals=user.mutuals|intcomma count counter=user.mutuals %} {% blocktrans trimmed with mutuals=user.mutuals|intcomma count counter=user.mutuals %}
{{ mutuals }} follower you follow {{ mutuals }} follower you follow

View file

@ -28,16 +28,22 @@
{% elif request.user.is_authenticated %} {% elif request.user.is_authenticated %}
{% mutuals_count user as mutuals %} {% if user.hide_follows %}
<a href="{% url 'user-followers' user|username %}"> {% if request.user in user.following.all %}
{% if mutuals %} {% trans "Follows you" %}
{% blocktrans with mutuals_display=mutuals|intcomma count counter=mutuals %}{{ mutuals_display }} follower you follow{% plural %}{{ mutuals_display }} followers you follow{% endblocktrans %}
{% elif request.user in user.following.all %}
{% trans "Follows you" %}
{% else %}
{% trans "No followers you follow" %}
{% endif %} {% endif %}
</a> {% else %}
{% mutuals_count user as mutuals %}
<a href="{% url 'user-followers' user|username %}">
{% if mutuals %}
{% blocktrans with mutuals_display=mutuals|intcomma count counter=mutuals %}{{ mutuals_display }} follower you follow{% plural %}{{ mutuals_display }} followers you follow{% endblocktrans %}
{% elif request.user in user.following.all %}
{% trans "Follows you" %}
{% else %}
{% trans "No followers you follow" %}
{% endif %}
</a>
{% endif %}
{% endif %} {% endif %}
</p> </p>

View file

@ -1,5 +1,6 @@
""" non-interactive pages """ """ non-interactive pages """
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied
from django.core.paginator import Paginator from django.core.paginator import Paginator
from django.db.models import Q, Count from django.db.models import Q, Count
from django.http import Http404 from django.http import Http404
@ -105,6 +106,9 @@ class Followers(View):
if is_api_request(request): if is_api_request(request):
return ActivitypubResponse(user.to_followers_activity(**request.GET)) return ActivitypubResponse(user.to_followers_activity(**request.GET))
if user.hide_follows:
raise PermissionDenied()
followers = annotate_if_follows(request.user, user.followers) followers = annotate_if_follows(request.user, user.followers)
paginated = Paginator(followers.all(), PAGE_LENGTH) paginated = Paginator(followers.all(), PAGE_LENGTH)
data = { data = {
@ -125,6 +129,9 @@ class Following(View):
if is_api_request(request): if is_api_request(request):
return ActivitypubResponse(user.to_following_activity(**request.GET)) return ActivitypubResponse(user.to_following_activity(**request.GET))
if user.hide_follows:
raise PermissionDenied()
following = annotate_if_follows(request.user, user.following) following = annotate_if_follows(request.user, user.following)
paginated = Paginator(following.all(), PAGE_LENGTH) paginated = Paginator(following.all(), PAGE_LENGTH)
data = { data = {