From d2414434fb5d73dfff792ec93d1b075c207c9b1e Mon Sep 17 00:00:00 2001 From: simon Date: Mon, 15 Nov 2021 13:08:32 +0700 Subject: [PATCH] implement playlist earch form --- tubearchivist/home/forms.py | 9 +++ .../home/templates/home/playlist.html | 4 +- tubearchivist/home/views.py | 70 ++++++++++++++++--- 3 files changed, 71 insertions(+), 12 deletions(-) diff --git a/tubearchivist/home/forms.py b/tubearchivist/home/forms.py index 83492f37..c6b4d0ac 100644 --- a/tubearchivist/home/forms.py +++ b/tubearchivist/home/forms.py @@ -86,6 +86,15 @@ class ChannelSearchForm(forms.Form): ) +class PlaylistSearchForm(forms.Form): + """search for playlists""" + + searchInput = forms.CharField( + label="", + widget=forms.TextInput(attrs={"autocomplete": "off"}), + ) + + class AddToQueueForm(forms.Form): """text area form to add to downloads""" diff --git a/tubearchivist/home/templates/home/playlist.html b/tubearchivist/home/templates/home/playlist.html index 26450d3e..fbffba4e 100644 --- a/tubearchivist/home/templates/home/playlist.html +++ b/tubearchivist/home/templates/home/playlist.html @@ -25,11 +25,9 @@ search-icon

Search your Playlists

- diff --git a/tubearchivist/home/views.py b/tubearchivist/home/views.py index 7adf9c75..b2e0ad36 100644 --- a/tubearchivist/home/views.py +++ b/tubearchivist/home/views.py @@ -20,6 +20,7 @@ from home.forms import ( ApplicationSettingsForm, ChannelSearchForm, CustomAuthForm, + PlaylistSearchForm, SubscribeToChannelForm, UserSettingsForm, VideoSearchForm, @@ -717,23 +718,28 @@ class PlaylistView(View): """handle http get requests""" user_id = request.user.id view_config = self.read_config(user_id=user_id) + + # handle search + search_get = request.GET.get("search", False) + if search_get: + search_encoded = urllib.parse.quote(search_get) + else: + search_encoded = False + # define page size page_get = int(request.GET.get("page", 0)) - pagination_handler = Pagination(page_get, user_id) + pagination_handler = Pagination( + page_get, user_id, search_get=search_encoded + ) url = view_config["es_url"] + "/ta_playlist/_search" - data = { - "size": pagination_handler.pagination["page_size"], - "from": pagination_handler.pagination["page_from"], - "query": { - "term": {"playlist_entries.downloaded": {"value": True}} - }, - "sort": [{"playlist_name.keyword": {"order": "asc"}}], - } + data = self.build_data(pagination_handler, search_get) search = SearchHandler(url, data) playlist_hits = search.get_data() pagination_handler.validate(search.max_hits) + search_form = PlaylistSearchForm() context = { + "search_form": search_form, "title": "Playlists", "colors": view_config["colors"], "pagination": pagination_handler.pagination, @@ -742,6 +748,40 @@ class PlaylistView(View): } return render(request, "home/playlist.html", context) + @staticmethod + def build_data(pagination_handler, search_get): + """build data object for query""" + data = { + "size": pagination_handler.pagination["page_size"], + "from": pagination_handler.pagination["page_from"], + "query": { + "term": {"playlist_entries.downloaded": {"value": True}} + }, + "sort": [{"playlist_name.keyword": {"order": "asc"}}], + } + if search_get: + data["query"] = { + "bool": { + "should": [ + { + "multi_match": { + "query": search_get, + "fields": [ + "playlist_channel_id", + "playlist_channel", + "playlist_name", + ], + } + } + ], + "filter": [ + {"term": {"playlist_entries.downloaded": True}} + ], + "minimum_should_match": 1, + } + } + return data + @staticmethod def read_config(user_id): """read config file""" @@ -758,6 +798,18 @@ class PlaylistView(View): } return view_config + @staticmethod + def post(request): + """handle post from search form""" + search_form = PlaylistSearchForm(data=request.POST) + if search_form.is_valid(): + search_query = request.POST.get("searchInput") + print(search_query) + search_url = "/playlist/?" + urlencode({"search": search_query}) + return redirect(search_url, permanent=True) + + return redirect("playlist") + class VideoView(View): """resolves to /video//