diff --git a/fedireads/templates/followers.html b/fedireads/templates/followers.html
new file mode 100644
index 00000000..7690af8a
--- /dev/null
+++ b/fedireads/templates/followers.html
@@ -0,0 +1,26 @@
+{% extends 'layout.html' %}
+{% load fr_display %}
+{% block content %}
+{% include 'user_header.html' with user=user %}
+
+
+
Followers
+ {% for followers in followers %}
+
+
+ {% include 'snippets/avatar.html' with user=followers %}
+
+
+ {% include 'snippets/username.html' with user=followers show_full=True %}
+
+
+ {% include 'snippets/follow_button.html' with user=followers %}
+
+
+ {% endfor %}
+ {% if not followers.count %}
+
{{ user|username }} has no followers
+ {% endif %}
+
+
+{% endblock %}
diff --git a/fedireads/templates/following.html b/fedireads/templates/following.html
new file mode 100644
index 00000000..3bf62bf6
--- /dev/null
+++ b/fedireads/templates/following.html
@@ -0,0 +1,26 @@
+{% extends 'layout.html' %}
+{% load fr_display %}
+{% block content %}
+{% include 'user_header.html' %}
+
+
+
Following
+ {% for follower in user.following.all %}
+
+
+ {% include 'snippets/avatar.html' with user=follower %}
+
+
+ {% include 'snippets/username.html' with user=follower show_full=True %}
+
+
+ {% include 'snippets/follow_button.html' with user=follower %}
+
+
+ {% endfor %}
+ {% if not following.count %}
+
No one is following {{ user|username }}
+ {% endif %}
+
+
+{% endblock %}
diff --git a/fedireads/templates/snippets/follow_button.html b/fedireads/templates/snippets/follow_button.html
index f62edbbe..b80bc026 100644
--- a/fedireads/templates/snippets/follow_button.html
+++ b/fedireads/templates/snippets/follow_button.html
@@ -7,12 +7,12 @@ Follow request already sent.
-
-
-
-
- {% include 'snippets/avatar.html' with user=user large=True %}
-
-
-
-
{% if user.name %}{{ user.name }}{% else %}{{ user.localname }}{% endif %}
-
{{ user.username }}
-
Joined {{ user.created_date | naturaltime }}
-
-
- {% if user.summary %}
-
{{ user.summary | safe }}
- {% endif %}
-
- {% if not is_self %}
- {% include 'snippets/follow_button.html' with user=user %}
- {% endif %}
-
- {% if is_self and user.follower_requests.all %}
-
-
Follow Requests
- {% for requester in user.follower_requests.all %}
-
-
- {% include 'snippets/username.html' with user=requester show_full=True %}
-
- {% include 'snippets/follow_request_buttons.html' with user=requester %}
-
- {% endfor %}
-
- {% endif %}
-
-
+{% include 'user_header.html' with user=user %}
{% include 'snippets/covers_shelf.html' with shelves=shelves user=user %}
@@ -58,6 +13,11 @@
{% include 'snippets/status.html' with status=activity %}
{% endfor %}
+ {% if not activities %}
+
+
+
+
+
+ {% include 'snippets/avatar.html' with user=user large=True %}
+
+
+
+
+ {% if user.summary %}
+
{{ user.summary | safe }}
+ {% endif %}
+
+ {% if not is_self %}
+ {% include 'snippets/follow_button.html' with user=user %}
+ {% endif %}
+
+ {% if is_self and user.follower_requests.all %}
+
+
Follow Requests
+ {% for requester in user.follower_requests.all %}
+
+
+ {% include 'snippets/username.html' with user=requester show_full=True %}
+
+ {% include 'snippets/follow_request_buttons.html' with user=requester %}
+
+ {% endfor %}
+
+ {% endif %}
+
+
diff --git a/fedireads/views.py b/fedireads/views.py
index 4a87c0f6..ef09b0d9 100644
--- a/fedireads/views.py
+++ b/fedireads/views.py
@@ -3,7 +3,6 @@ from django.contrib.auth.decorators import login_required
from django.db.models import Avg, Q
from django.http import HttpResponseBadRequest, HttpResponseNotFound, \
JsonResponse
-from django.shortcuts import redirect
from django.template.response import TemplateResponse
from django.views.decorators.csrf import csrf_exempt
@@ -120,7 +119,7 @@ def notifications_page(request):
return TemplateResponse(request, 'notifications.html', data)
@csrf_exempt
-def user_page(request, username):
+def user_page(request, username, subpage=None):
''' profile page for a user '''
try:
user = get_user_from_username(username)
@@ -135,19 +134,25 @@ def user_page(request, username):
# TODO: change display with privacy and authentication considerations
shelves = get_user_shelf_preview(user)
- activities = models.Status.objects.filter(
- user=user,
- ).order_by(
- '-created_date',
- ).select_subclasses()[:10]
-
data = {
'user': user,
'shelves': shelves,
'is_self': request.user.id == user.id,
- 'activities': activities,
}
- return TemplateResponse(request, 'user.html', data)
+ if subpage == 'followers':
+ data['followers'] = user.followers.all()
+ return TemplateResponse(request, 'followers.html', data)
+ elif subpage == 'following':
+ data['following'] = user.following.all()
+ return TemplateResponse(request, 'following.html', data)
+ else:
+ activities = models.Status.objects.filter(
+ user=user,
+ ).order_by(
+ '-created_date',
+ ).select_subclasses().all()[:10]
+ data['activities'] = activities
+ return TemplateResponse(request, 'user.html', data)
@csrf_exempt
@@ -167,7 +172,7 @@ def followers_page(request, username):
page = request.GET.get('page')
return JsonResponse(activitypub.get_followers(user, page, followers))
- return redirect('/user/' + username)
+ return user_page(request, username, subpage='followers')
@csrf_exempt
@@ -187,7 +192,7 @@ def following_page(request, username):
page = request.GET.get('page')
return JsonResponse(activitypub.get_following(user, page, following))
- return redirect('/user/' + username)
+ return user_page(request, username, subpage='following')
@csrf_exempt
@@ -386,10 +391,15 @@ def get_user_shelf_preview(user, shelf_proportions=None):
break
if count > shelf_max or count < 0:
count = shelf_max
- shelf = models.Shelf.objects.get(
- user=user,
- identifier=identifier,
- )
+
+ try:
+ shelf = models.Shelf.objects.get(
+ user=user,
+ identifier=identifier,
+ )
+ except models.Shelf.DoesNotExist:
+ continue
+
if not shelf.books.count():
continue
books = models.ShelfBook.objects.filter(