summaryrefslogtreecommitdiffstats
path: root/activities/views/search.py
diff options
context:
space:
mode:
Diffstat (limited to 'activities/views/search.py')
-rw-r--r--activities/views/search.py43
1 files changed, 34 insertions, 9 deletions
diff --git a/activities/views/search.py b/activities/views/search.py
index b175052..4719f64 100644
--- a/activities/views/search.py
+++ b/activities/views/search.py
@@ -1,6 +1,9 @@
+from typing import Set
+
from django import forms
from django.views.generic import FormView
+from activities.models import Hashtag
from users.models import Domain, Identity
@@ -9,13 +12,13 @@ class Search(FormView):
template_name = "activities/search.html"
class form_class(forms.Form):
- query = forms.CharField(help_text="Search for a user by @username@domain")
-
- def form_valid(self, form):
- query = form.cleaned_data["query"].lstrip("@").lower()
- results = {"identities": set()}
- # Search identities
+ query = forms.CharField(
+ help_text="Search for a user by @username@domain or hashtag by #tagname"
+ )
+ def search_identities(self, query: str):
+ query = query.lstrip("@")
+ results: Set[Identity] = set()
if "@" in query:
username, domain = query.split("@", 1)
@@ -35,13 +38,35 @@ class Search(FormView):
)
identity = None
if identity:
- results["identities"].add(identity)
+ results.add(identity)
else:
for identity in Identity.objects.filter(username=query)[:20]:
- results["identities"].add(identity)
+ results.add(identity)
for identity in Identity.objects.filter(username__startswith=query)[:20]:
- results["identities"].add(identity)
+ results.add(identity)
+ return results
+
+ def search_hashtags(self, query: str):
+ results: Set[Hashtag] = set()
+
+ if "@" in query:
+ return results
+
+ query = query.lstrip("#")
+ for hashtag in Hashtag.objects.public().hashtag_or_alias(query)[:10]:
+ results.add(hashtag)
+ for hashtag in Hashtag.objects.public().filter(hashtag__startswith=query)[:10]:
+ results.add(hashtag)
+ return results
+
+ def form_valid(self, form):
+ query = form.cleaned_data["query"].lower()
+ results = {
+ "identities": self.search_identities(query),
+ "hashtags": self.search_hashtags(query),
+ }
+
# Render results
context = self.get_context_data(form=form)
context["results"] = results