Merge branch 'main' into dependabot/pip/aiohttp-3.10.2

This commit is contained in:
Mouse Reeve 2024-08-11 17:12:21 -07:00 committed by GitHub
commit 6ec3783736
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 100 additions and 19 deletions

View file

@ -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">

View file

@ -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">

View file

@ -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)

View file

@ -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()

View file

@ -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(

View file

@ -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:

View file

@ -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

View file

@ -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

View file

@ -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