mirror of
https://github.com/sissbruecker/linkding.git
synced 2025-08-14 14:09:26 +02:00
Allow filtering feeds by bundle (#1152)
This commit is contained in:
@@ -8,6 +8,7 @@ from django.urls import reverse
|
|||||||
|
|
||||||
from bookmarks import queries
|
from bookmarks import queries
|
||||||
from bookmarks.models import Bookmark, BookmarkSearch, FeedToken, UserProfile
|
from bookmarks.models import Bookmark, BookmarkSearch, FeedToken, UserProfile
|
||||||
|
from bookmarks.views import access
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
@@ -30,10 +31,16 @@ def sanitize(text: str):
|
|||||||
class BaseBookmarksFeed(Feed):
|
class BaseBookmarksFeed(Feed):
|
||||||
def get_object(self, request, feed_key: str | None):
|
def get_object(self, request, feed_key: str | None):
|
||||||
feed_token = FeedToken.objects.get(key__exact=feed_key) if feed_key else None
|
feed_token = FeedToken.objects.get(key__exact=feed_key) if feed_key else None
|
||||||
|
bundle = None
|
||||||
|
bundle_id = request.GET.get("bundle")
|
||||||
|
if bundle_id:
|
||||||
|
bundle = access.bundle_read(request, bundle_id)
|
||||||
|
|
||||||
search = BookmarkSearch(
|
search = BookmarkSearch(
|
||||||
q=request.GET.get("q", ""),
|
q=request.GET.get("q", ""),
|
||||||
unread=request.GET.get("unread", ""),
|
unread=request.GET.get("unread", ""),
|
||||||
shared=request.GET.get("shared", ""),
|
shared=request.GET.get("shared", ""),
|
||||||
|
bundle=bundle,
|
||||||
)
|
)
|
||||||
query_set = self.get_query_set(feed_token, search)
|
query_set = self.get_query_set(feed_token, search)
|
||||||
return FeedContext(request, feed_token, query_set)
|
return FeedContext(request, feed_token, query_set)
|
||||||
|
@@ -357,3 +357,50 @@ class FeedsTestCase(TestCase, BookmarkFactoryMixin):
|
|||||||
|
|
||||||
def test_sanitize_with_none_text(self):
|
def test_sanitize_with_none_text(self):
|
||||||
self.assertEqual("", sanitize(None))
|
self.assertEqual("", sanitize(None))
|
||||||
|
|
||||||
|
def test_with_bundle(self):
|
||||||
|
tag1 = self.setup_tag()
|
||||||
|
visible_bookmarks = [
|
||||||
|
self.setup_bookmark(tags=[tag1]),
|
||||||
|
self.setup_bookmark(tags=[tag1]),
|
||||||
|
]
|
||||||
|
|
||||||
|
self.setup_bookmark(),
|
||||||
|
self.setup_bookmark(),
|
||||||
|
|
||||||
|
bundle = self.setup_bundle(all_tags=tag1.name)
|
||||||
|
|
||||||
|
response = self.client.get(
|
||||||
|
reverse("linkding:feeds.all", args=[self.token.key])
|
||||||
|
+ f"?bundle={bundle.id}"
|
||||||
|
)
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
self.assertFeedItems(response, visible_bookmarks)
|
||||||
|
|
||||||
|
def test_with_bundle_not_owned_by_user(self):
|
||||||
|
other_user = User.objects.create_user(
|
||||||
|
"otheruser", "otheruser@example.com", "password123"
|
||||||
|
)
|
||||||
|
other_bundle = self.setup_bundle(user=other_user, search="test")
|
||||||
|
|
||||||
|
response = self.client.get(
|
||||||
|
reverse("linkding:feeds.all", args=[self.token.key])
|
||||||
|
+ f"?bundle={other_bundle.id}"
|
||||||
|
)
|
||||||
|
self.assertEqual(response.status_code, 404)
|
||||||
|
|
||||||
|
def test_with_invalid_bundle_id(self):
|
||||||
|
self.setup_bookmark(title="test bookmark")
|
||||||
|
|
||||||
|
response = self.client.get(
|
||||||
|
reverse("linkding:feeds.all", args=[self.token.key]) + "?bundle=999999"
|
||||||
|
)
|
||||||
|
self.assertEqual(response.status_code, 404)
|
||||||
|
|
||||||
|
def test_with_non_numeric_bundle_id(self):
|
||||||
|
self.setup_bookmark(title="test bookmark")
|
||||||
|
|
||||||
|
response = self.client.get(
|
||||||
|
reverse("linkding:feeds.all", args=[self.token.key]) + "?bundle=invalid"
|
||||||
|
)
|
||||||
|
self.assertEqual(response.status_code, 404)
|
||||||
|
@@ -32,10 +32,14 @@ def bookmark_write(request: HttpRequest, bookmark_id: int | str):
|
|||||||
raise Http404("Bookmark does not exist")
|
raise Http404("Bookmark does not exist")
|
||||||
|
|
||||||
|
|
||||||
|
def bundle_read(request: HttpRequest, bundle_id: int | str):
|
||||||
|
return bundle_write(request, bundle_id)
|
||||||
|
|
||||||
|
|
||||||
def bundle_write(request: HttpRequest, bundle_id: int | str):
|
def bundle_write(request: HttpRequest, bundle_id: int | str):
|
||||||
try:
|
try:
|
||||||
return BookmarkBundle.objects.get(pk=bundle_id, owner=request.user)
|
return BookmarkBundle.objects.get(pk=bundle_id, owner=request.user)
|
||||||
except BookmarkBundle.DoesNotExist:
|
except (BookmarkBundle.DoesNotExist, ValueError):
|
||||||
raise Http404("Bundle does not exist")
|
raise Http404("Bundle does not exist")
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user