User page redesign
This commit is contained in:
parent
c41b53bdbe
commit
7e73bae07d
|
@ -0,0 +1,26 @@
|
||||||
|
{% extends 'layout.html' %}
|
||||||
|
{% load fr_display %}
|
||||||
|
{% block content %}
|
||||||
|
{% include 'user_header.html' with user=user %}
|
||||||
|
|
||||||
|
<div class="content-container">
|
||||||
|
<h2>Followers</h2>
|
||||||
|
{% for followers in followers %}
|
||||||
|
<div class="row shrink">
|
||||||
|
<div>
|
||||||
|
{% include 'snippets/avatar.html' with user=followers %}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{% include 'snippets/username.html' with user=followers show_full=True %}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{% include 'snippets/follow_button.html' with user=followers %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% if not followers.count %}
|
||||||
|
<div>{{ user|username }} has no followers</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,26 @@
|
||||||
|
{% extends 'layout.html' %}
|
||||||
|
{% load fr_display %}
|
||||||
|
{% block content %}
|
||||||
|
{% include 'user_header.html' %}
|
||||||
|
|
||||||
|
<div class="content-container">
|
||||||
|
<h2>Following</h2>
|
||||||
|
{% for follower in user.following.all %}
|
||||||
|
<div class="row shrink">
|
||||||
|
<div>
|
||||||
|
{% include 'snippets/avatar.html' with user=follower %}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{% include 'snippets/username.html' with user=follower show_full=True %}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{% include 'snippets/follow_button.html' with user=follower %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% if not following.count %}
|
||||||
|
<div>No one is following {{ user|username }}</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
|
@ -7,12 +7,12 @@ Follow request already sent.
|
||||||
<form action="/follow/" method="post">
|
<form action="/follow/" method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<input type="hidden" name="user" value="{{ user.username }}"></input>
|
<input type="hidden" name="user" value="{{ user.username }}"></input>
|
||||||
<input type="submit" value="Follow"></input>
|
<button type="submit">Follow</button>
|
||||||
</form>
|
</form>
|
||||||
{% else %}
|
{% else %}
|
||||||
<form action="/unfollow/" method="post">
|
<form action="/unfollow/" method="post">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<input type="hidden" name="user" value="{{ user.username }}"></input>
|
<input type="hidden" name="user" value="{{ user.username }}"></input>
|
||||||
<input type="submit" value="Unfollow"></input>
|
<button type="submit">Unfollow</button>
|
||||||
</form>
|
</form>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -1,52 +1,7 @@
|
||||||
{% extends 'layout.html' %}
|
{% extends 'layout.html' %}
|
||||||
{% load humanize %}
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="content-container user-profile">
|
|
||||||
<h2>User Profile
|
|
||||||
{% if is_self %}
|
|
||||||
<a href="/user-edit/">edit
|
|
||||||
<span class="icon icon-pencil">
|
|
||||||
<span class="hidden-text">Edit profile</span>
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
{% endif %}
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="pic-container">
|
|
||||||
{% include 'snippets/avatar.html' with user=user large=True %}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<p>{% if user.name %}{{ user.name }}{% else %}{{ user.localname }}{% endif %}</p>
|
|
||||||
<p>{{ user.username }}</p>
|
|
||||||
<p>Joined {{ user.created_date | naturaltime }}</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% if user.summary %}
|
|
||||||
<blockquote><span class="icon icon-quote-open"></span>{{ user.summary | safe }}</blockquote>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% if not is_self %}
|
|
||||||
{% include 'snippets/follow_button.html' with user=user %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if is_self and user.follower_requests.all %}
|
|
||||||
<div class="follow-requests">
|
|
||||||
<h2>Follow Requests</h2>
|
|
||||||
{% for requester in user.follower_requests.all %}
|
|
||||||
<div class="row shrink">
|
|
||||||
<p>
|
|
||||||
{% include 'snippets/username.html' with user=requester show_full=True %}
|
|
||||||
</p>
|
|
||||||
{% include 'snippets/follow_request_buttons.html' with user=requester %}
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
{% include 'user_header.html' with user=user %}
|
||||||
<div class="all-shelves content-container">
|
<div class="all-shelves content-container">
|
||||||
{% include 'snippets/covers_shelf.html' with shelves=shelves user=user %}
|
{% include 'snippets/covers_shelf.html' with shelves=shelves user=user %}
|
||||||
</div>
|
</div>
|
||||||
|
@ -58,6 +13,11 @@
|
||||||
{% include 'snippets/status.html' with status=activity %}
|
{% include 'snippets/status.html' with status=activity %}
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
{% if not activities %}
|
||||||
|
<div class="content-container">
|
||||||
|
<p>No activities yet!</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
{% load humanize %}
|
||||||
|
{% load fr_display %}
|
||||||
|
<div class="content-container user-profile">
|
||||||
|
<h2>User Profile
|
||||||
|
{% if is_self %}
|
||||||
|
<a href="/user-edit/">edit
|
||||||
|
<span class="icon icon-pencil">
|
||||||
|
<span class="hidden-text">Edit profile</span>
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="pic-container">
|
||||||
|
{% include 'snippets/avatar.html' with user=user large=True %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<p>{% if user.name %}{{ user.name }}{% else %}{{ user.localname }}{% endif %}</p>
|
||||||
|
<p>{{ user.username }}</p>
|
||||||
|
<p>Joined {{ user.created_date | naturaltime }}</p>
|
||||||
|
<p>
|
||||||
|
<a href="/user/{{ user|username }}/followers">{{ user.followers.count }} follower{{ user.followers.count | pluralize }}</a>,
|
||||||
|
<a href="/user/{{ user|username }}/following">{{ user.following.count }} following</a></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if user.summary %}
|
||||||
|
<blockquote><span class="icon icon-quote-open"></span>{{ user.summary | safe }}</blockquote>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% if not is_self %}
|
||||||
|
{% include 'snippets/follow_button.html' with user=user %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if is_self and user.follower_requests.all %}
|
||||||
|
<div class="follow-requests">
|
||||||
|
<h2>Follow Requests</h2>
|
||||||
|
{% for requester in user.follower_requests.all %}
|
||||||
|
<div class="row shrink">
|
||||||
|
<p>
|
||||||
|
{% include 'snippets/username.html' with user=requester show_full=True %}
|
||||||
|
</p>
|
||||||
|
{% include 'snippets/follow_request_buttons.html' with user=requester %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
|
@ -3,7 +3,6 @@ from django.contrib.auth.decorators import login_required
|
||||||
from django.db.models import Avg, Q
|
from django.db.models import Avg, Q
|
||||||
from django.http import HttpResponseBadRequest, HttpResponseNotFound, \
|
from django.http import HttpResponseBadRequest, HttpResponseNotFound, \
|
||||||
JsonResponse
|
JsonResponse
|
||||||
from django.shortcuts import redirect
|
|
||||||
from django.template.response import TemplateResponse
|
from django.template.response import TemplateResponse
|
||||||
from django.views.decorators.csrf import csrf_exempt
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
|
|
||||||
|
@ -120,7 +119,7 @@ def notifications_page(request):
|
||||||
return TemplateResponse(request, 'notifications.html', data)
|
return TemplateResponse(request, 'notifications.html', data)
|
||||||
|
|
||||||
@csrf_exempt
|
@csrf_exempt
|
||||||
def user_page(request, username):
|
def user_page(request, username, subpage=None):
|
||||||
''' profile page for a user '''
|
''' profile page for a user '''
|
||||||
try:
|
try:
|
||||||
user = get_user_from_username(username)
|
user = get_user_from_username(username)
|
||||||
|
@ -135,19 +134,25 @@ def user_page(request, username):
|
||||||
# TODO: change display with privacy and authentication considerations
|
# TODO: change display with privacy and authentication considerations
|
||||||
shelves = get_user_shelf_preview(user)
|
shelves = get_user_shelf_preview(user)
|
||||||
|
|
||||||
activities = models.Status.objects.filter(
|
|
||||||
user=user,
|
|
||||||
).order_by(
|
|
||||||
'-created_date',
|
|
||||||
).select_subclasses()[:10]
|
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
'user': user,
|
'user': user,
|
||||||
'shelves': shelves,
|
'shelves': shelves,
|
||||||
'is_self': request.user.id == user.id,
|
'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
|
@csrf_exempt
|
||||||
|
@ -167,7 +172,7 @@ def followers_page(request, username):
|
||||||
page = request.GET.get('page')
|
page = request.GET.get('page')
|
||||||
return JsonResponse(activitypub.get_followers(user, page, followers))
|
return JsonResponse(activitypub.get_followers(user, page, followers))
|
||||||
|
|
||||||
return redirect('/user/' + username)
|
return user_page(request, username, subpage='followers')
|
||||||
|
|
||||||
|
|
||||||
@csrf_exempt
|
@csrf_exempt
|
||||||
|
@ -187,7 +192,7 @@ def following_page(request, username):
|
||||||
page = request.GET.get('page')
|
page = request.GET.get('page')
|
||||||
return JsonResponse(activitypub.get_following(user, page, following))
|
return JsonResponse(activitypub.get_following(user, page, following))
|
||||||
|
|
||||||
return redirect('/user/' + username)
|
return user_page(request, username, subpage='following')
|
||||||
|
|
||||||
|
|
||||||
@csrf_exempt
|
@csrf_exempt
|
||||||
|
@ -386,10 +391,15 @@ def get_user_shelf_preview(user, shelf_proportions=None):
|
||||||
break
|
break
|
||||||
if count > shelf_max or count < 0:
|
if count > shelf_max or count < 0:
|
||||||
count = shelf_max
|
count = shelf_max
|
||||||
shelf = models.Shelf.objects.get(
|
|
||||||
user=user,
|
try:
|
||||||
identifier=identifier,
|
shelf = models.Shelf.objects.get(
|
||||||
)
|
user=user,
|
||||||
|
identifier=identifier,
|
||||||
|
)
|
||||||
|
except models.Shelf.DoesNotExist:
|
||||||
|
continue
|
||||||
|
|
||||||
if not shelf.books.count():
|
if not shelf.books.count():
|
||||||
continue
|
continue
|
||||||
books = models.ShelfBook.objects.filter(
|
books = models.ShelfBook.objects.filter(
|
||||||
|
|
Loading…
Reference in New Issue