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.
{% csrf_token %} - +
{% else %}
{% csrf_token %} - +
{% endif %} diff --git a/fedireads/templates/user.html b/fedireads/templates/user.html index 8a6d64bd..ca67750a 100644 --- a/fedireads/templates/user.html +++ b/fedireads/templates/user.html @@ -1,52 +1,7 @@ {% extends 'layout.html' %} -{% load humanize %} {% block content %} -
-

User Profile - {% if is_self %} - edit - - Edit profile - - - {% endif %} -

- -
-
- {% 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 %} +
+

No activities yet! +

+ {% endif %} {% endblock %} diff --git a/fedireads/templates/user_header.html b/fedireads/templates/user_header.html new file mode 100644 index 00000000..96a22609 --- /dev/null +++ b/fedireads/templates/user_header.html @@ -0,0 +1,50 @@ +{% load humanize %} +{% load fr_display %} +
+

User Profile + {% if is_self %} + edit + + Edit profile + + + {% endif %} +

+ +
+
+ {% 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 }}

+

+ {{ user.followers.count }} follower{{ user.followers.count | pluralize }}, + {{ user.following.count }} following

+
+ + {% 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(