Move web application in a separate module

This commit is contained in:
2021-06-03 09:00:12 +02:00
parent 7a1d6c76cd
commit d11e6253b1
3 changed files with 91 additions and 83 deletions

View File

@@ -4,31 +4,13 @@ from argparse import ArgumentParser
import datetime as dt import datetime as dt
import bs4 import bs4
import locale
import requests
import os import os
import urllib.parse
from bottle import hook, request, route, run, static_file, view
from config import conf from config import conf
import models
from models import Song, AirCast, DoesNotExist 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)) 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/<filename>')
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 # Argument parsing
# use a decorator to simplify argparse usage, as suggested by # use a decorator to simplify argparse usage, as suggested by
@@ -171,7 +94,7 @@ def update(args):
@subcommand() @subcommand()
def serve(args): def serve(args):
run(host=conf['server'].get('host', 'localhost'), webapp.run(host=conf['server'].get('host', 'localhost'),
port=conf['server'].getint('port', 9980), port=conf['server'].getint('port', 9980),
debug=conf['server'].getboolean('debug', False), debug=conf['server'].getboolean('debug', False),
reloader=conf['server'].getboolean('reloader', False)) reloader=conf['server'].getboolean('reloader', False))

15
utils.py Normal file
View File

@@ -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__)

70
webapp.py Normal file
View File

@@ -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/<filename>')
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()