From d11e6253b1809e94070c0e8e1d0ea6f01f017570 Mon Sep 17 00:00:00 2001 From: Benjamin Sigonneau Date: Thu, 3 Jun 2021 09:00:12 +0200 Subject: [PATCH] Move web application in a separate module --- balises.py | 89 ++++-------------------------------------------------- utils.py | 15 +++++++++ webapp.py | 70 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 83 deletions(-) create mode 100644 utils.py create mode 100644 webapp.py diff --git a/balises.py b/balises.py index 2f778dd..7624446 100755 --- a/balises.py +++ b/balises.py @@ -4,31 +4,13 @@ from argparse import ArgumentParser import datetime as dt import bs4 -import locale -import requests import os -import urllib.parse - -from bottle import hook, request, route, run, static_file, view from config import conf -import models from models import Song, AirCast, DoesNotExist +from utils import http_get +import webapp -project_dir = os.path.dirname(__file__) - -# ---------------------------------------------------------------------- -# Util functions - -def http_get(url): - response = requests.get(url); - if response.status_code == 200: - pass - else: - print('Uh, oh, unable to fetch', url) - print('Http status code:', response.status_code) - raise Error('Download error') - return response # ---------------------------------------------------------------------- @@ -77,65 +59,6 @@ def print_aircast(x): print(line_template.format(str(x.date), x.song.artist, x.song.title)) -# ---------------------------------------------------------------------- -# Web application -# -# Very simple, just a page with an input for a date/time, a query button and a -# list of results - -@route('/', method=['GET', 'POST']) -@view('search_results') -def results_page(): - try: - day = dt.date.fromisoformat(request.forms.date) - except ValueError: - day = dt.datetime.now().date() - - try: - hour = int(request.forms.time.split(':')[0]) - except ValueError: - hour = dt.datetime.now().hour - - delta = int(request.forms.timedelta or 0) - hour = hour + delta - time = '{:0>2}:00'.format(hour) - results = [ - { 'date': x.date, - 'song': x.song, - 'youtube_url': 'https://www.youtube.com/results?search_query=' + - urllib.parse.quote_plus(x.song.artist + ' ' + x.song.title) - } - for x in search_song(day, hour) - ] - return dict(results=results, - date=day, - time=time, - start_time=time, - end_time = '{:0>2}:00'.format(hour+1)) - -@route('/static/') -def serve_static_file(filename): - static_root = os.path.join(project_dir, 'static') - return static_file(filename, root=static_root) - -@hook('before_request') -def set_locale(): - """Set the locale for all categories to the first lang in Accept-Language - header. Default to fr_FR.UTF-8 - """ - accept_language = request.get_header('Accept-Language', 'fr-FR') - first_lang = accept_language.split(';')[0].split(',')[0] - lang = first_lang.translate(str.maketrans('-', '_')) + '.UTF-8' - locale.setlocale(locale.LC_ALL, lang) - -@hook('before_request') -def connect_to_db(): - models.db.connect() - -@hook('after_request') -def close_db_connection(): - models.db.close() - # ---------------------------------------------------------------------- # Argument parsing # use a decorator to simplify argparse usage, as suggested by @@ -171,10 +94,10 @@ def update(args): @subcommand() def serve(args): - run(host=conf['server'].get('host', 'localhost'), - port=conf['server'].getint('port', 9980), - debug=conf['server'].getboolean('debug', False), - reloader=conf['server'].getboolean('reloader', False)) + webapp.run(host=conf['server'].get('host', 'localhost'), + port=conf['server'].getint('port', 9980), + debug=conf['server'].getboolean('debug', False), + reloader=conf['server'].getboolean('reloader', False)) # ---------------------------------------------------------------------- diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..31a2675 --- /dev/null +++ b/utils.py @@ -0,0 +1,15 @@ +import requests +import os + +def http_get(url): + response = requests.get(url); + if response.status_code == 200: + pass + else: + print('Uh, oh, unable to fetch', url) + print('Http status code:', response.status_code) + raise Error('Download error') + return response + +def project_dir(): + return os.path.dirname(__file__) diff --git a/webapp.py b/webapp.py new file mode 100644 index 0000000..5a17686 --- /dev/null +++ b/webapp.py @@ -0,0 +1,70 @@ +from bottle import hook, request, route, run, static_file, view +import models +from models import Song, AirCast +from balises import search_song +from utils import project_dir + +import datetime as dt +import locale +import os +import urllib.parse + + +# ---------------------------------------------------------------------- +# Web application +# +# Very simple, just a page with an input for a date/time, a query button and a +# list of results + +@route('/', method=['GET', 'POST']) +@view('search_results') +def results_page(): + try: + day = dt.date.fromisoformat(request.forms.date) + except ValueError: + day = dt.datetime.now().date() + + try: + hour = int(request.forms.time.split(':')[0]) + except ValueError: + hour = dt.datetime.now().hour + + delta = int(request.forms.timedelta or 0) + hour = hour + delta + time = '{:0>2}:00'.format(hour) + results = [ + { 'date': x.date, + 'song': x.song, + 'youtube_url': 'https://www.youtube.com/results?search_query=' + + urllib.parse.quote_plus(x.song.artist + ' ' + x.song.title) + } + for x in search_song(day, hour) + ] + return dict(results=results, + date=day, + time=time, + start_time=time, + end_time = '{:0>2}:00'.format(hour+1)) + +@route('/static/') +def serve_static_file(filename): + static_root = os.path.join(project_dir(), 'static') + return static_file(filename, root=static_root) + +@hook('before_request') +def set_locale(): + """Set the locale for all categories to the first lang in Accept-Language + header. Default to fr_FR.UTF-8 + """ + accept_language = request.get_header('Accept-Language', 'fr-FR') + first_lang = accept_language.split(';')[0].split(',')[0] + lang = first_lang.translate(str.maketrans('-', '_')) + '.UTF-8' + locale.setlocale(locale.LC_ALL, lang) + +@hook('before_request') +def connect_to_db(): + models.db.connect() + +@hook('after_request') +def close_db_connection(): + models.db.close()