From 41ae2978c37beabe2b62eda58ac3f640744e66d4 Mon Sep 17 00:00:00 2001 From: egemenzeytinci Date: Sat, 12 Feb 2022 02:45:12 +0300 Subject: [PATCH] Add more filters --- .pylintrc | 1 + assets/js/movie.js | 13 +++++- elastic/model/basic.py | 1 + elastic/service/basic.py | 46 +++++++++++-------- server/__init__.py | 1 + template/movie.html | 77 ++++++++++++++------------------ util/ninja.py | 14 ++++++ validation/custom/field_array.py | 3 ++ validation/movie.py | 44 +++++++++++++----- web/movie.py | 2 + 10 files changed, 125 insertions(+), 77 deletions(-) diff --git a/.pylintrc b/.pylintrc index 7dd86fe..848b671 100644 --- a/.pylintrc +++ b/.pylintrc @@ -43,6 +43,7 @@ max-args=10 generated-members= # elasticsearch-dsl s.source, + s.sort, # sqlalchemy session.commit, session.query, diff --git a/assets/js/movie.js b/assets/js/movie.js index 19502e5..28c274a 100644 --- a/assets/js/movie.js +++ b/assets/js/movie.js @@ -20,13 +20,22 @@ const cy = document.querySelectorAll('input[name=year]:checked'); const years = [...cy].map(c => c.value); + // Checked score + const cs = document.querySelector('input[name=score]:checked'); + + // Checked number of votes + const cn = document.querySelector('input[name=num_votes]:checked'); + const xhr = new XMLHttpRequest(); var formData = new FormData(); // Form data for the request - formData.append('genres', genres); - formData.append('years', years); + if (genres.length > 0) formData.append('years', years); + if (years.length > 0) formData.append('years', years); + if (cs) formData.append('score', cs.value) + if (cn) formData.append('num_votes', cn.value) + formData.append('page', page); xhr.open('POST', '/movie/search', false); diff --git a/elastic/model/basic.py b/elastic/model/basic.py index 60d2241..5d4c0e1 100644 --- a/elastic/model/basic.py +++ b/elastic/model/basic.py @@ -10,6 +10,7 @@ class Basic(Document): start_year = Integer() average_rating = Float() num_votes = Integer() + score = Float() title_type = Keyword() class Index: diff --git a/elastic/service/basic.py b/elastic/service/basic.py index 31e018b..ccb7a9a 100644 --- a/elastic/service/basic.py +++ b/elastic/service/basic.py @@ -11,18 +11,6 @@ class ElasticBasicService: def __init__(self): self._name = 'basic' - self._year_map = { - '2020s': [2020, 2029], - '2010s': [2010, 2019], - '2000s': [2000, 2009], - '1990s': [1990, 1999], - '1980s': [1980, 1989], - '1970s': [1970, 1979], - '1960s': [1960, 1969], - '1950s': [1950, 1959], - 'b1950': [1800, 1949] - } - def _save(self, basics): """ Save data to basic index @@ -71,6 +59,7 @@ def save_all(self): b.genres = r.basic.genres b.start_year = r.basic.start_year b.average_rating = r.rating.average_rating + b.score = r.rating.average_rating * r.rating.num_votes b.num_votes = r.rating.num_votes b.title_type = r.basic.title_type @@ -80,7 +69,16 @@ def save_all(self): offset += limit - def search(self, genres, years, page=1, size=12, exact=True): + def search( + self, + genres, + years, + score, + num_votes, + page=1, + size=12, + exact=True + ): """ Search on basic index @@ -103,13 +101,11 @@ def search(self, genres, years, page=1, size=12, exact=True): ranges = [] + # filter by year for year in years: - lower, upper = self._year_map[year] - - # filter by year year_filter = { - 'gte': lower, - 'lte': upper + 'gte': int(year) - 9, + 'lte': int(year) } range_query = Q('range', start_year=year_filter) @@ -117,13 +113,25 @@ def search(self, genres, years, page=1, size=12, exact=True): ranges.append(range_query) filters = [ - Q('bool', should=ranges) + Q('bool', should=ranges), ] + # filter by imdb score + score_filter = Q('range', average_rating={'gte': float(score)}) + filters.append(score_filter) + + # filter by number of votes + vote_filter = Q('range', num_votes={'gte': num_votes}) + filters.append(vote_filter) + # search object by limit and offset from_ = (page - 1) * size + s = Search(using=es, index=self._name).extra(from_=from_, size=size) + # sort by score (num_votes * average_rating) descending + s = s.sort('-score') + # set query s.query = Q('bool', must=musts, filter=filters) diff --git a/server/__init__.py b/server/__init__.py index 337e173..dd11455 100644 --- a/server/__init__.py +++ b/server/__init__.py @@ -8,5 +8,6 @@ app.config['SECRET_KEY'] = config.app.secret_key # update jinja environments +app.jinja_env.globals['f_range'] = Ninja.float_range app.jinja_env.globals['f_minute'] = Ninja.format_minutes app.jinja_env.globals['unescape'] = Ninja.unescape diff --git a/template/movie.html b/template/movie.html index 05c9cf8..12013a3 100644 --- a/template/movie.html +++ b/template/movie.html @@ -23,50 +23,40 @@
Filter by genre
Filter by year
- - + {% for i in range(2029, 1939, -10) %} + {% set button_text = (i - 9) | string + 's' %} - - + {% if i == 1949 %} + {% set button_text = 'Before 1950' %} + {% endif %} - - - - - - - - - - - - - - - - - - - - + + + {% endfor %} +
+
+
+
Filter by IMDB score
+
+ {% for i in f_range(5, 9.5, 0.5) %} + + + {% endfor %} +
+
+
+
Filter by number of votes
+
+ {% for i in range(5000, 30000, 5000) %} + + + {% endfor %}