Merge branch 'main' into book-series-v1

This commit is contained in:
Dustin Steiner 2023-01-31 10:06:07 +00:00
commit c2a81d88bb
No known key found for this signature in database
GPG key ID: 918D51522D8CB8F2
9 changed files with 53 additions and 19 deletions

View file

@ -215,10 +215,10 @@
{% endif %}
{% with work=book.parent_work %}
{% with work=book.parent_work editions_count=book.parent_work.editions.count %}
<p>
<a href="{{ work.local_path }}/editions" id="tour-other-editions-link">
{% blocktrans trimmed count counter=work.editions.count with count=work.editions.count|intcomma %}
{% blocktrans trimmed count counter=editions_count with count=editions_count|intcomma %}
{{ count }} edition
{% plural %}
{{ count }} editions

View file

@ -25,6 +25,7 @@
{% block body %}
<nav class="navbar" aria-label="main navigation">
<div class="container">
{% with notification_count=request.user.unread_notification_count has_unread_mentions=request.user.has_unread_mentions %}
<div class="navbar-brand">
<a class="navbar-item" href="/">
<img class="image logo" src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}" alt="{% blocktrans with site_name=site.name %}{{ site_name }} home page{% endblocktrans %}">
@ -67,9 +68,8 @@
>
<i class="icon-dots-three-vertical" aria-hidden="true"></i>
{% with request.user.unread_notification_count as notification_count %}
<strong
class="{% if not notification_count %}is-hidden {% elif request.user.has_unread_mentions %}is-danger {% else %}is-primary {% endif %} tag is-small px-1"
class="{% if not notification_count %}is-hidden {% elif has_unread_mentions %}is-danger {% else %}is-primary {% endif %} tag is-small px-1"
data-poll-wrapper
>
<span class="is-sr-only">{% trans "Notifications" %}</span>
@ -77,7 +77,6 @@
{{ notification_count }}
</strong>
</strong>
{% endwith %}
</button>
</div>
@ -108,14 +107,12 @@
<span class="is-sr-only">{% trans "Notifications" %}</span>
</span>
</span>
{% with request.user.unread_notification_count as notification_count %}
<span
class="{% if not notification_count %}is-hidden {% elif request.user.has_unread_mentions %}is-danger {% endif %}tag is-medium transition-x"
class="{% if not notification_count %}is-hidden {% elif has_unread_mentions %}is-danger {% endif %}tag is-medium transition-x"
data-poll-wrapper
>
<span data-poll="notifications">{{ notification_count }}</span>
</span>
{% endwith %}
</a>
</div>
{% else %}
@ -154,6 +151,7 @@
{% endif %}
</div>
</div>
{% endwith %}
</div>
</nav>

View file

@ -15,6 +15,12 @@
</p>
{% endif %}
{% if not user.is_active and user.deactivation_reason == "pending" %}
<form name="activate" method="post" action="{% url 'settings-activate-user' user.id %}" class="mr-1">
{% csrf_token %}
<button type="submit" class="button is-success is-light">{% trans "Activate user" %}</button>
</form>
{% endif %}
{% if user.is_active or user.deactivation_reason == "pending" %}
<form name="suspend" method="post" action="{% url 'settings-report-suspend' user.id %}" class="mr-1">
{% csrf_token %}

View file

@ -19,9 +19,9 @@ uuid: a unique identifier used to make html "id" attributes unique and clarify j
{# Supplemental fields #}
<div>
{% active_shelf book as active_shelf %}
{% if active_shelf.shelf.identifier == 'reading' and book.latest_readthrough %}
{% if active_shelf.shelf.identifier == 'reading' %}
{% with readthrough=book.latest_readthrough %}
{% if readthrough %}
<div class="field">
<input type="hidden" name="id" value="{{ readthrough.id }}"/>
<label class="label" for="progress_{{ uuid }}">{% trans "Progress:" %}</label>
@ -66,6 +66,7 @@ uuid: a unique identifier used to make html "id" attributes unique and clarify j
<p class="help">{% blocktrans with pages=book.pages %}of {{ pages }} pages{% endblocktrans %}</p>
{% endif %}
</div>
{% endif %}
{% endwith %}
{% endif %}
</div>

View file

@ -4,11 +4,11 @@
{# Three day cache #}
{% get_current_language as LANGUAGE_CODE %}
{% cache 259200 generated_note_header LANGUAGE_CODE status.id %}
{% if status.content == 'wants to read' %}
{% if status.content == 'wants to read' or status.content == '<p>wants to read</p>' %}
{% include 'snippets/status/headers/to_read.html' with book=status.mention_books.first %}
{% elif status.content == 'finished reading' %}
{% elif status.content == 'finished reading' or status.content == '<p>finished reading</p>' %}
{% include 'snippets/status/headers/read.html' with book=status.mention_books.first %}
{% elif status.content == 'started reading' %}
{% elif status.content == 'started reading' or status.content == '<p>started reading</p>' %}
{% include 'snippets/status/headers/reading.html' with book=status.mention_books.first %}
{% else %}
{{ status.content }}

View file

@ -145,6 +145,11 @@ urlpatterns = [
views.UserAdmin.as_view(),
name="settings-user",
),
re_path(
r"^settings/users/(?P<user>\d+)/activate/?$",
views.ActivateUserAdmin.as_view(),
name="settings-activate-user",
),
re_path(
r"^settings/federation/(?P<status>(federated|blocked))?/?$",
views.Federation.as_view(),

View file

@ -31,7 +31,7 @@ from .admin.reports import (
)
from .admin.site import Site, Registration, RegistrationLimited
from .admin.themes import Themes, delete_theme
from .admin.user_admin import UserAdmin, UserAdminList
from .admin.user_admin import UserAdmin, UserAdminList, ActivateUserAdmin
# user preferences
from .preferences.change_password import ChangePassword

View file

@ -1,7 +1,7 @@
""" manage user """
from django.contrib.auth.decorators import login_required, permission_required
from django.core.paginator import Paginator
from django.shortcuts import get_object_or_404
from django.shortcuts import get_object_or_404, redirect
from django.template.response import TemplateResponse
from django.utils.decorators import method_decorator
from django.views import View
@ -95,3 +95,19 @@ class UserAdmin(View):
form.save(request)
data = {"user": user, "group_form": form}
return TemplateResponse(request, "settings/users/user.html", data)
@method_decorator(login_required, name="dispatch")
@method_decorator(
permission_required("bookwyrm.moderate_user", raise_exception=True),
name="dispatch",
)
class ActivateUserAdmin(View):
"""activate a user manually"""
# pylint: disable=unused-argument
def post(self, request, user):
"""activate user"""
user = get_object_or_404(models.User, id=user)
user.reactivate()
return redirect("settings-user", user.id)

View file

@ -237,16 +237,24 @@ def feed_page_data(user):
def get_suggested_books(user, max_books=5):
"""helper to get a user's recent books"""
book_count = 0
preset_shelves = [("reading", max_books), ("read", 2), ("to-read", max_books)]
preset_shelves = {"reading": max_books, "read": 2, "to-read": max_books}
suggested_books = []
for (preset, shelf_max) in preset_shelves:
user_shelves = {
shelf.identifier: shelf
for shelf in user.shelf_set.filter(
identifier__in=preset_shelves.keys()
).exclude(books__isnull=True)
}
for preset, shelf_max in preset_shelves.items():
limit = (
shelf_max
if shelf_max < (max_books - book_count)
else max_books - book_count
)
shelf = user.shelf_set.get(identifier=preset)
if not shelf.books.exists():
shelf = user_shelves.get(preset, None)
if not shelf:
continue
shelf_preview = {