diff --git a/server.py b/server.py index 40bb33189d7f1d127df5a6617ed5e15b2d23a5fe..68334c663abab83ae0cb5656ee7b7fbfe3f7a7e6 100755 --- a/server.py +++ b/server.py @@ -54,6 +54,23 @@ def query(operation, *params): cur.execute(operation, params) return cur.fetchall() +def searchquery(text, columns, match, tables, suffix, *suffixparams): + params = [] + subexprs = [] + words = text.split(' ') + prio = len(words)+1 + for word in words: + if word == '' or word.isspace(): + continue + matchexpr = ' OR '.join(['%s LIKE ?'%column for column in match]) + subexprs.append('SELECT %s, %s AS _prio FROM %s WHERE %s'%(columns, str(prio), tables, matchexpr)) + params += ['%'+word+'%']*len(match) + prio -= 1 + if subexprs == []: + return [] + expr = 'SELECT *,SUM(_prio) AS _score FROM (%s) AS _tmp %s'%(' UNION '.join(subexprs), suffix) + return query(expr, *params, *suffixparams) + @app.route('/') def index(): return render_template('index.html', latestvideos=query(''' @@ -83,7 +100,20 @@ def play(): lecture=query('SELECT * FROM lectures WHERE id = ?', id)[0], videos=query('SELECT * FROM videos WHERE lecture_id = ?', id)) else: - return redirect(url_for(index)) + return redirect(url_for('index')) + +@app.route('/search') +def search(): + if 'q' not in request.args: + return redirect(url_for('index')) + q = request.args['q'] + courses = searchquery(q, '*', ['title', 'short', 'organizer', 'subject', 'description'], + 'courses', 'WHERE (? OR (visible AND listed)) GROUP BY id ORDER BY _score DESC, semester DESC LIMIT 20', False) + lectures = searchquery(q, 'lectures.*, courses.visible AS coursevisible, courses.listed, courses.short, courses.downloadable, courses.title AS coursetitle', + ['lectures.title', 'lectures.comment', 'lectures.speaker', 'courses.short'], + 'lectures LEFT JOIN courses on (courses.id = lectures.course_id)', + 'WHERE (? OR (coursevisible AND listed AND visible)) GROUP BY id ORDER BY _score DESC, time DESC LIMIT 30', False) + return render_template('search.html', searchtext=request.args['q'], courses=courses, lectures=lectures) if __name__ == '__main__': app.run() diff --git a/templates/base.html b/templates/base.html index 6c1e6ad471a85797ead38ded8d87d08f4394df7d..82c8ed807b7706fb2816180f1a07d8000ab99967 100644 --- a/templates/base.html +++ b/templates/base.html @@ -57,12 +57,14 @@ {% endfor %} </ul> </div> - <div class="col-xs-5"> - <span class=""><input class="form-control" type="text" placeholder="Search"> - </div> - <div class="col-md-1"> - <span class=""><button class="btn btn-default" type="submit">Submit</button> - </div> + <form action="search"> + <div class="col-xs-5"> + <span class=""><input class="form-control" type="text" name="q" placeholder="Search" value="{{ searchtext }}"> + </div> + <div class="col-md-1"> + <span class=""><button class="btn btn-default" type="submit">Submit</button> + </div> + </form> </div> <div class="row"> <div class="col-md-12"> diff --git a/templates/search.html b/templates/search.html new file mode 100644 index 0000000000000000000000000000000000000000..e40067819e0e5fc82b090ed91be292e2fe47b726 --- /dev/null +++ b/templates/search.html @@ -0,0 +1,38 @@ +{% from 'macros.html' import preview %} +{% extends "base.html" %} +{% block content %} +<div class="container"> + <div class="panel panel-default"> + <div class="panel-heading"> + <h1>Veranstaltungen</h1> + </div> + <div class="panel-body"> + {% if courses == [] %} + Nichts gefunden! + {% else %} + <ul class="list-group courselist"> + {% for course in courses %} + <li class="list-group-item">{{ course['title'] }}</li> + {% endfor %} + </ul> + {% endif %} + </div> + </div> + <div class="panel panel-default"> + <div class="panel-heading"> + <h1>Videos</h1> + </div> + <div class="panel-body"> + {% if lectures == [] %} + Nichts gefunden! + {% else %} + <ul class="list-group videopreview"> + {% for lecture in lectures %} + {{ preview(lecture) }} + {% endfor %} + </ul> + {% endif %} + </div> + </div> +</div> +{% endblock %}