Added date filter in search options and github banner on homepage

This commit is contained in:
Simon 2018-06-27 10:05:33 -04:00
parent b570e81bec
commit 6a3d540de2
7 changed files with 69 additions and 8 deletions

11
app.py
View File

@ -240,6 +240,11 @@ def search():
size_max = request.args.get("size_max") if "size_max" in request.args else "size_max"
size_max = int(size_max) if size_max.isdigit() else 0
date_min = request.args.get("date_min") if "date_min" in request.args else "date_min"
date_min = int(date_min) if date_min.isdigit() else 0
date_max = request.args.get("date_max") if "date_max" in request.args else "date_max"
date_max = int(date_max) if date_max.isdigit() else 0
match_all = "all" in request.args
field_name = "field_name" in request.args
@ -260,7 +265,8 @@ def search():
if len(q) >= 3:
try:
hits = searchEngine.search(q, page, per_page, sort_order, extensions, size_min, size_max, match_all, fields)
hits = searchEngine.search(q, page, per_page, sort_order,
extensions, size_min, size_max, match_all, fields, date_min, date_max)
hits = db.join_website_on_search_result(hits)
except InvalidQueryException as e:
flash("<strong>Invalid query:</strong> " + str(e), "warning")
@ -277,7 +283,8 @@ def search():
extensions=",".join(extensions),
size_min=size_min, size_max=size_max,
match_all=match_all,
field_trigram=field_trigram, field_path=field_path, field_name=field_name)
field_trigram=field_trigram, field_path=field_path, field_name=field_name,
date_min=date_min, date_max=date_max)
@app.route("/contribute")

View File

@ -16,7 +16,7 @@ class SearchEngine:
def import_json(self, in_str: str, website_id: int):
raise NotImplementedError
def search(self, query, page, per_page, sort_order, extension, size_min, size_max, match_all, fields) -> {}:
def search(self, query, page, per_page, sort_order, extension, size_min, size_max, match_all, fields, date_min, date_max) -> {}:
raise NotImplementedError
def reset(self):
@ -142,7 +142,7 @@ class ElasticSearchEngine(SearchEngine):
action_string = '{"index":{}}\n'
return "\n".join("".join([action_string, ujson.dumps(doc)]) for doc in docs)
def search(self, query, page, per_page, sort_order, extensions, size_min, size_max, match_all, fields) -> {}:
def search(self, query, page, per_page, sort_order, extensions, size_min, size_max, match_all, fields, date_min, date_max) -> {}:
filters = []
if extensions:
@ -159,6 +159,17 @@ class ElasticSearchEngine(SearchEngine):
filters.append(new_filter)
if date_min > 0 or date_max:
date_filer = dict()
new_filter = {"range": {"mtime": date_filer}}
if date_min > 0:
date_filer["gte"] = date_min
if date_max:
date_filer["lte"] = date_max
filters.append(new_filter)
sort_by = ElasticSearchEngine.SORT_ORDERS.get(sort_order, [])
page = self.es.search(body={

View File

@ -215,4 +215,17 @@ a:hover {
.irs {
margin-bottom: 1em;
}
.github-banner {
position: absolute;
top: 0;
right: 0;
border: 0;
}
@media (max-width: 990px) {
.github-banner {
display: none;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

View File

@ -35,4 +35,8 @@
</div>
</div>
<a href="https://github.com/simon987">
<img class="github-banner" src="/static/img/forkme_right_white_ffffff.png" alt="Fork me on GitHub">
</a>
{% endblock body %}

View File

@ -18,7 +18,7 @@
<link href="/static/css/bootstrap.min.css" rel="stylesheet" type="text/css">
<link href="/static/css/ion.rangeSlider.css" rel="stylesheet" type="text/css">
<link href="/static/css/ion.rangeSlider.skinFlat.css" rel="stylesheet" type="text/css">
<link href="/static/css/main.css" rel="stylesheet" type="text/css">
<link href="/static/css/main.css?v=1" rel="stylesheet" type="text/css">
</head>
<body>

View File

@ -29,6 +29,11 @@
<input title="File size" id="sizeSlider">
<input type="hidden" name="size_min" id="sizeMin" value="{{ size_min }}">
<input type="hidden" name="size_max" id="sizeMax" value="{{ size_max }}">
{# Date #}
<div class="text-muted" style="text-align: center">File date</div>
<input title="File date" id="dateSlider">
<input type="hidden" name="date_min" id="dateMin" value="{{ date_min }}">
<input type="hidden" name="date_max" id="dateMax" value="{{ date_max }}">
<div class="form-row">
{# File extension #}
@ -151,11 +156,11 @@
</table>
</div>
{% if results["hits"]["total"] > (p + 1) * per_page %}
<a href="/search?q={{ q }}&p={{ p + 1 }}&sort_order={{ sort_order }}&per_page={{ per_page }}&ext={{ extensions }}&size_min={{ size_min }}&size_max={{ size_max }}{{ "&field_path=on" if field_path else "" }}{{ "&field_name=on" if field_name else "" }}{{ "&field_trigram" if field_trigram else "" }}"
<a href="/search?q={{ q }}&p={{ p + 1 }}&sort_order={{ sort_order }}&per_page={{ per_page }}&ext={{ extensions }}&size_min={{ size_min }}&size_max={{ size_max }}{{ "&field_path" if field_path else "" }}{{ "&field_name" if field_name else "" }}{{ "&field_trigram" if field_trigram else "" }}&date_min={{ date_min }}&date_max={{ date_max }}"
class="btn btn-primary" style="float: right">Next</a>
{% endif %}
{% if p > 0 %}
<a href="/search?q={{ q }}&p={{ p - 1 }}&sort_order={{ sort_order }}&per_page={{ per_page }}&ext={{ extensions }}&size_min={{ size_min }}&size_max={{ size_max }}{{ "&field_path=on" if field_path else "" }}{{ "&field_name=on" if field_name else "" }}{{ "&field_trigram" if field_trigram else "" }}"
<a href="/search?q={{ q }}&p={{ p - 1 }}&sort_order={{ sort_order }}&per_page={{ per_page }}&ext={{ extensions }}&size_min={{ size_min }}&size_max={{ size_max }}{{ "&field_path" if field_path else "" }}{{ "&field_name" if field_name else "" }}{{ "&field_trigram" if field_trigram else "" }}&date_min={{ date_min }}&date_max={{ date_max }}"
class="btn btn-primary">Previous</a>
{% endif %}
@ -178,7 +183,7 @@
});
//Size slider
var slider = $("#sizeSlider").ionRangeSlider({
$("#sizeSlider").ionRangeSlider({
type: "double",
grid: false,
force_edges: true,
@ -210,6 +215,27 @@
document.getElementById("sizeMax").value = size_max;
}
});
//Date slider
$("#dateSlider").ionRangeSlider({
type: "double",
grid: false,
force_edges: true,
min: 0,
max: Math.floor(Date.now()/1000),
from: {{ date_min if date_min else 0 }},
to: {{ date_max if date_max else "self.max"}},
min_interval: 3600 * 24 * 7,
step: 3600 * 24,
drag_interval: true,
prettify: function (num) {
let date = (new Date(num*1000));
return date.getUTCFullYear() + "-" + ("0" + (date.getUTCMonth()+1)).slice(-2) + "-" + ("0" + date.getUTCDate()).slice(-2)
},
onFinish: function (e) {
document.getElementById("dateMin").value = e.from;
document.getElementById("dateMax").value = e.to >= e.max ? null : e.to;
}
});
</script>
</div>