linkding/bookmarks/queries.py

127 lines
3.5 KiB
Python
Raw Normal View History

from typing import Optional
2019-06-29 10:53:37 +00:00
from django.contrib.auth.models import User
from django.db.models import Q, QuerySet
2019-06-29 10:53:37 +00:00
2019-06-30 19:15:02 +00:00
from bookmarks.models import Bookmark, Tag
from bookmarks.utils import unique
2019-06-29 10:53:37 +00:00
def query_bookmarks(user: User, query_string: str) -> QuerySet:
return _base_bookmarks_query(user, query_string) \
.filter(is_archived=False)
def query_archived_bookmarks(user: User, query_string: str) -> QuerySet:
return _base_bookmarks_query(user, query_string) \
.filter(is_archived=True)
def query_shared_bookmarks(user: Optional[User], query_string: str) -> QuerySet:
return _base_bookmarks_query(user, query_string) \
.filter(shared=True) \
.filter(owner__profile__enable_sharing=True)
def _base_bookmarks_query(user: Optional[User], query_string: str) -> QuerySet:
query_set = Bookmark.objects
2019-06-29 10:53:37 +00:00
# Filter for user
if user:
query_set = query_set.filter(owner=user)
2019-06-29 10:53:37 +00:00
2019-06-30 17:54:33 +00:00
# Split query into search terms and tags
query = parse_query_string(query_string)
2019-06-30 17:54:33 +00:00
# Filter for search terms and tags
2019-06-30 19:15:02 +00:00
for term in query['search_terms']:
2019-06-30 17:54:33 +00:00
query_set = query_set.filter(
Q(title__contains=term)
| Q(description__contains=term)
| Q(website_title__contains=term)
| Q(website_description__contains=term)
2020-12-28 05:46:43 +00:00
| Q(url__contains=term)
2019-06-30 17:54:33 +00:00
)
2019-06-30 19:15:02 +00:00
for tag_name in query['tag_names']:
2019-06-29 10:53:37 +00:00
query_set = query_set.filter(
tags__name__iexact=tag_name
2019-06-29 10:53:37 +00:00
)
# Untagged bookmarks
if query['untagged']:
query_set = query_set.filter(
tags=None
)
# Unread bookmarks
if query['unread']:
query_set = query_set.filter(
unread=True
)
# Sort by date added
query_set = query_set.order_by('-date_added')
2019-06-29 10:53:37 +00:00
return query_set
2019-06-30 19:15:02 +00:00
def query_bookmark_tags(user: User, query_string: str) -> QuerySet:
bookmarks_query = query_bookmarks(user, query_string)
query_set = Tag.objects.filter(bookmark__in=bookmarks_query)
return query_set.distinct()
2019-06-30 19:15:02 +00:00
def query_archived_bookmark_tags(user: User, query_string: str) -> QuerySet:
bookmarks_query = query_archived_bookmarks(user, query_string)
2019-06-30 19:15:02 +00:00
query_set = Tag.objects.filter(bookmark__in=bookmarks_query)
2019-06-30 19:15:02 +00:00
return query_set.distinct()
def query_shared_bookmark_tags(user: Optional[User], query_string: str) -> QuerySet:
bookmarks_query = query_shared_bookmarks(user, query_string)
query_set = Tag.objects.filter(bookmark__in=bookmarks_query)
return query_set.distinct()
def query_shared_bookmark_users(query_string: str) -> QuerySet:
bookmarks_query = query_shared_bookmarks(None, query_string)
query_set = User.objects.filter(bookmark__in=bookmarks_query)
return query_set.distinct()
2019-12-27 11:32:44 +00:00
def get_user_tags(user: User):
return Tag.objects.filter(owner=user).all()
def parse_query_string(query_string):
2019-06-30 19:15:02 +00:00
# Sanitize query params
if not query_string:
query_string = ''
# Split query into search terms and tags
keywords = query_string.strip().split(' ')
keywords = [word for word in keywords if word]
search_terms = [word for word in keywords if word[0] != '#' and word[0] != '!']
2019-06-30 19:15:02 +00:00
tag_names = [word[1:] for word in keywords if word[0] == '#']
tag_names = unique(tag_names, str.lower)
2019-06-30 19:15:02 +00:00
# Special search commands
untagged = '!untagged' in keywords
unread = '!unread' in keywords
2019-06-30 19:15:02 +00:00
return {
'search_terms': search_terms,
'tag_names': tag_names,
'untagged': untagged,
'unread': unread,
2019-06-30 19:15:02 +00:00
}