mirror of
https://github.com/bookwyrm-social/bookwyrm.git
synced 2025-02-17 19:45:17 +00:00
Merge branch 'main' into dependabot/pip/aiohttp-3.10.2
This commit is contained in:
commit
6ec3783736
9 changed files with 100 additions and 19 deletions
|
@ -3,8 +3,10 @@
|
||||||
{% load utilities %}
|
{% load utilities %}
|
||||||
|
|
||||||
{% block heading %}
|
{% block heading %}
|
||||||
|
{% block title %}
|
||||||
{% blocktrans with username=user.localname sitename=site.name %}Follow {{ username }} on the fediverse{% endblocktrans %}
|
{% blocktrans with username=user.localname sitename=site.name %}Follow {{ username }} on the fediverse{% endblocktrans %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="block card">
|
<div class="block card">
|
||||||
|
|
|
@ -2,6 +2,10 @@
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load utilities %}
|
{% load utilities %}
|
||||||
|
|
||||||
|
{% block title %}
|
||||||
|
{% blocktrans with display_name=user.display_name %}You are now following {{ display_name }}!{% endblocktrans %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="block card">
|
<div class="block card">
|
||||||
<div class="card-content">
|
<div class="card-content">
|
||||||
|
|
|
@ -103,6 +103,20 @@ class Views(TestCase):
|
||||||
connector_results = response.context_data["remote_results"]
|
connector_results = response.context_data["remote_results"]
|
||||||
self.assertEqual(connector_results[0]["results"][0].title, "Mock Book")
|
self.assertEqual(connector_results[0]["results"][0].title, "Mock Book")
|
||||||
|
|
||||||
|
def test_search_books_extra_whitespace(self):
|
||||||
|
"""just the search page"""
|
||||||
|
view = views.Search.as_view()
|
||||||
|
request = self.factory.get("", {"q": " Test Book ", "remote": False})
|
||||||
|
request.user = self.local_user
|
||||||
|
with patch("bookwyrm.views.search.is_api_request") as is_api:
|
||||||
|
is_api.return_value = False
|
||||||
|
response = view(request)
|
||||||
|
self.assertIsInstance(response, TemplateResponse)
|
||||||
|
validate_html(response.render())
|
||||||
|
|
||||||
|
local_results = response.context_data["results"]
|
||||||
|
self.assertEqual(local_results[0].title, "Test Book")
|
||||||
|
|
||||||
def test_search_book_anonymous(self):
|
def test_search_book_anonymous(self):
|
||||||
"""Don't search remote for logged out user"""
|
"""Don't search remote for logged out user"""
|
||||||
view = views.Search.as_view()
|
view = views.Search.as_view()
|
||||||
|
@ -150,6 +164,17 @@ class Views(TestCase):
|
||||||
validate_html(response.render())
|
validate_html(response.render())
|
||||||
self.assertEqual(response.context_data["results"][0], self.local_user)
|
self.assertEqual(response.context_data["results"][0], self.local_user)
|
||||||
|
|
||||||
|
def test_search_users_extra_whitespace(self):
|
||||||
|
"""searches remote connectors"""
|
||||||
|
view = views.Search.as_view()
|
||||||
|
request = self.factory.get("", {"q": " mouse ", "type": "user"})
|
||||||
|
request.user = self.local_user
|
||||||
|
response = view(request)
|
||||||
|
|
||||||
|
self.assertIsInstance(response, TemplateResponse)
|
||||||
|
validate_html(response.render())
|
||||||
|
self.assertEqual(response.context_data["results"][0], self.local_user)
|
||||||
|
|
||||||
def test_search_users_logged_out(self):
|
def test_search_users_logged_out(self):
|
||||||
"""searches remote connectors"""
|
"""searches remote connectors"""
|
||||||
view = views.Search.as_view()
|
view = views.Search.as_view()
|
||||||
|
@ -181,3 +206,21 @@ class Views(TestCase):
|
||||||
self.assertIsInstance(response, TemplateResponse)
|
self.assertIsInstance(response, TemplateResponse)
|
||||||
validate_html(response.render())
|
validate_html(response.render())
|
||||||
self.assertEqual(response.context_data["results"][0], booklist)
|
self.assertEqual(response.context_data["results"][0], booklist)
|
||||||
|
|
||||||
|
def test_search_lists_extra_whitespace(self):
|
||||||
|
"""searches remote connectors"""
|
||||||
|
with (
|
||||||
|
patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"),
|
||||||
|
patch("bookwyrm.lists_stream.remove_list_task.delay"),
|
||||||
|
):
|
||||||
|
booklist = models.List.objects.create(
|
||||||
|
user=self.local_user, name="test list"
|
||||||
|
)
|
||||||
|
view = views.Search.as_view()
|
||||||
|
request = self.factory.get("", {"q": " test ", "type": "list"})
|
||||||
|
request.user = self.local_user
|
||||||
|
response = view(request)
|
||||||
|
|
||||||
|
self.assertIsInstance(response, TemplateResponse)
|
||||||
|
validate_html(response.render())
|
||||||
|
self.assertEqual(response.context_data["results"][0], booklist)
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
""" test for app action functionality """
|
""" test for app action functionality """
|
||||||
import json
|
import json
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
import dateutil
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied
|
||||||
from django.test import TestCase, TransactionTestCase
|
from django.test import TestCase, TransactionTestCase
|
||||||
from django.test.client import RequestFactory
|
from django.test.client import RequestFactory
|
||||||
|
from django.utils import timezone
|
||||||
|
|
||||||
from bookwyrm import forms, models, views
|
from bookwyrm import forms, models, views
|
||||||
from bookwyrm.views.status import find_mentions, find_or_create_hashtags
|
from bookwyrm.views.status import find_mentions, find_or_create_hashtags
|
||||||
|
@ -167,6 +169,37 @@ class StatusViews(TestCase):
|
||||||
self.assertEqual(status.rating, 4.0)
|
self.assertEqual(status.rating, 4.0)
|
||||||
self.assertIsNone(status.edited_date)
|
self.assertIsNone(status.edited_date)
|
||||||
|
|
||||||
|
def test_create_status_progress(self, *_):
|
||||||
|
"""create a status that updates a readthrough"""
|
||||||
|
start_date = timezone.make_aware(dateutil.parser.parse("2024-07-27"))
|
||||||
|
readthrough = models.ReadThrough.objects.create(
|
||||||
|
book=self.book, user=self.local_user, start_date=start_date
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(start_date, readthrough.start_date)
|
||||||
|
self.assertIsNone(readthrough.progress)
|
||||||
|
|
||||||
|
view = views.CreateStatus.as_view()
|
||||||
|
form = forms.CommentForm(
|
||||||
|
{
|
||||||
|
"progress": 1,
|
||||||
|
"progress_mode": "PG",
|
||||||
|
"content": "I started the book",
|
||||||
|
"id": readthrough.id,
|
||||||
|
"book": self.book.id,
|
||||||
|
"user": self.local_user.id,
|
||||||
|
"privacy": "public",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
request = self.factory.post("", form.data)
|
||||||
|
request.user = self.local_user
|
||||||
|
|
||||||
|
view(request, "comment")
|
||||||
|
readthrough.refresh_from_db()
|
||||||
|
|
||||||
|
self.assertEqual(1, readthrough.progress)
|
||||||
|
self.assertEqual(start_date, readthrough.start_date) # not overwritten
|
||||||
|
|
||||||
def test_create_status_wrong_user(self, *_):
|
def test_create_status_wrong_user(self, *_):
|
||||||
"""You can't compose statuses for someone else"""
|
"""You can't compose statuses for someone else"""
|
||||||
view = views.CreateStatus.as_view()
|
view = views.CreateStatus.as_view()
|
||||||
|
|
|
@ -53,7 +53,7 @@ class Search(View):
|
||||||
|
|
||||||
def api_book_search(request):
|
def api_book_search(request):
|
||||||
"""Return books via API response"""
|
"""Return books via API response"""
|
||||||
query = request.GET.get("q")
|
query = request.GET.get("q").strip()
|
||||||
query = isbn_check_and_format(query)
|
query = isbn_check_and_format(query)
|
||||||
min_confidence = request.GET.get("min_confidence", 0)
|
min_confidence = request.GET.get("min_confidence", 0)
|
||||||
# only return local book results via json so we don't cascade
|
# only return local book results via json so we don't cascade
|
||||||
|
@ -65,7 +65,7 @@ def api_book_search(request):
|
||||||
|
|
||||||
def book_search(request):
|
def book_search(request):
|
||||||
"""the real business is elsewhere"""
|
"""the real business is elsewhere"""
|
||||||
query = request.GET.get("q")
|
query = request.GET.get("q").strip()
|
||||||
# check if query is isbn
|
# check if query is isbn
|
||||||
query = isbn_check_and_format(query)
|
query = isbn_check_and_format(query)
|
||||||
min_confidence = request.GET.get("min_confidence", 0)
|
min_confidence = request.GET.get("min_confidence", 0)
|
||||||
|
@ -123,8 +123,7 @@ def author_search(request):
|
||||||
def user_search(request):
|
def user_search(request):
|
||||||
"""user search: search for a user"""
|
"""user search: search for a user"""
|
||||||
viewer = request.user
|
viewer = request.user
|
||||||
query = request.GET.get("q")
|
query = request.GET.get("q").strip()
|
||||||
query = query.strip()
|
|
||||||
data = {"type": "user", "query": query}
|
data = {"type": "user", "query": query}
|
||||||
|
|
||||||
# use webfinger for mastodon style account@domain.com username to load the user if
|
# use webfinger for mastodon style account@domain.com username to load the user if
|
||||||
|
@ -162,7 +161,7 @@ def user_search(request):
|
||||||
|
|
||||||
def list_search(request):
|
def list_search(request):
|
||||||
"""any relevent lists?"""
|
"""any relevent lists?"""
|
||||||
query = request.GET.get("q")
|
query = request.GET.get("q").strip()
|
||||||
data = {"query": query, "type": "list"}
|
data = {"query": query, "type": "list"}
|
||||||
results = (
|
results = (
|
||||||
models.List.privacy_filter(
|
models.List.privacy_filter(
|
||||||
|
|
|
@ -201,12 +201,11 @@ def edit_readthrough(request):
|
||||||
# TODO: remove this, it duplicates the code in the ReadThrough view
|
# TODO: remove this, it duplicates the code in the ReadThrough view
|
||||||
readthrough = get_object_or_404(models.ReadThrough, id=request.POST.get("id"))
|
readthrough = get_object_or_404(models.ReadThrough, id=request.POST.get("id"))
|
||||||
|
|
||||||
readthrough.start_date = load_date_in_user_tz_as_utc(
|
if start_date := request.POST.get("start_date"):
|
||||||
request.POST.get("start_date"), request.user
|
readthrough.start_date = load_date_in_user_tz_as_utc(start_date, request.user)
|
||||||
)
|
|
||||||
readthrough.finish_date = load_date_in_user_tz_as_utc(
|
if finish_date := request.POST.get("finish_date"):
|
||||||
request.POST.get("finish_date"), request.user
|
readthrough.finish_date = load_date_in_user_tz_as_utc(finish_date, request.user)
|
||||||
)
|
|
||||||
|
|
||||||
progress = request.POST.get("progress")
|
progress = request.POST.get("progress")
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -15,8 +15,12 @@ REDIS_BROKER_URL = env(
|
||||||
f"redis://:{REDIS_BROKER_PASSWORD}@{REDIS_BROKER_HOST}:{REDIS_BROKER_PORT}/{REDIS_BROKER_DB_INDEX}",
|
f"redis://:{REDIS_BROKER_PASSWORD}@{REDIS_BROKER_HOST}:{REDIS_BROKER_PORT}/{REDIS_BROKER_DB_INDEX}",
|
||||||
)
|
)
|
||||||
|
|
||||||
CELERY_BROKER_URL = REDIS_BROKER_URL.replace("unix:", "redis+socket:")
|
CELERY_BROKER_URL = env(
|
||||||
CELERY_RESULT_BACKEND = REDIS_BROKER_URL.replace("unix:", "redis+socket:")
|
"CELERY_BROKER_URL", REDIS_BROKER_URL.replace("unix:", "redis+socket:")
|
||||||
|
)
|
||||||
|
CELERY_RESULT_BACKEND = env(
|
||||||
|
"CELERY_RESULT_BACKEND", REDIS_BROKER_URL.replace("unix:", "redis+socket:")
|
||||||
|
)
|
||||||
|
|
||||||
CELERY_DEFAULT_QUEUE = "low_priority"
|
CELERY_DEFAULT_QUEUE = "low_priority"
|
||||||
CELERY_CREATE_MISSING_QUEUES = True
|
CELERY_CREATE_MISSING_QUEUES = True
|
||||||
|
|
|
@ -15,11 +15,8 @@ env =
|
||||||
ALLOWED_HOSTS = your.domain.here
|
ALLOWED_HOSTS = your.domain.here
|
||||||
BOOKWYRM_DATABASE_BACKEND = postgres
|
BOOKWYRM_DATABASE_BACKEND = postgres
|
||||||
MEDIA_ROOT = images/
|
MEDIA_ROOT = images/
|
||||||
CELERY_BROKER =
|
CELERY_BROKER_URL = memory://
|
||||||
REDIS_BROKER_PORT = 6379
|
CELERY_RESULT_BACKEND = cache+memory://
|
||||||
REDIS_BROKER_PASSWORD = beep
|
|
||||||
REDIS_ACTIVITY_PORT = 6379
|
|
||||||
REDIS_ACTIVITY_PASSWORD = beep
|
|
||||||
USE_DUMMY_CACHE = true
|
USE_DUMMY_CACHE = true
|
||||||
FLOWER_PORT = 8888
|
FLOWER_PORT = 8888
|
||||||
EMAIL_HOST = smtp.mailgun.org
|
EMAIL_HOST = smtp.mailgun.org
|
||||||
|
|
|
@ -4,7 +4,7 @@ boto3==1.34.74
|
||||||
bw-file-resubmit==0.6.0rc2
|
bw-file-resubmit==0.6.0rc2
|
||||||
celery==5.3.6
|
celery==5.3.6
|
||||||
colorthief==0.2.1
|
colorthief==0.2.1
|
||||||
Django==4.2.14
|
Django==4.2.15
|
||||||
django-celery-beat==2.6.0
|
django-celery-beat==2.6.0
|
||||||
django-compressor==4.4
|
django-compressor==4.4
|
||||||
django-csp==3.8
|
django-csp==3.8
|
||||||
|
|
Loading…
Reference in a new issue