Simplify template, add previous/next hour links, use a single route

This commit is contained in:
2021-06-01 23:03:57 +02:00
parent 8c0478fafb
commit a2cc77954f
3 changed files with 72 additions and 51 deletions

View File

@@ -2,7 +2,7 @@
from argparse import ArgumentParser from argparse import ArgumentParser
from configparser import ConfigParser from configparser import ConfigParser
from datetime import datetime, timedelta import datetime as dt
import bs4 import bs4
import requests import requests
@@ -71,33 +71,36 @@ def get_last_ten():
soup = bs4.BeautifulSoup(response.content, 'html5lib') soup = bs4.BeautifulSoup(response.content, 'html5lib')
dates = soup.select('p.rldj-cell span.post-date') dates = soup.select('p.rldj-cell span.post-date')
for elem in dates: for elem in dates:
dt = datetime.fromisoformat(elem.text) song_dt = dt.datetime.fromisoformat(elem.text)
artist, title = [x.strip() for x in elem.previous.previous.split(' - ', 1)] artist, title = [x.strip() for x in elem.previous.previous.split(' - ', 1)]
song, _ = Song.get_or_create(artist=artist, title=title) song, _ = Song.get_or_create(artist=artist, title=title)
# get_or_create does not play nice with the unique constraint on the date # get_or_create does not play nice with the unique constraint on the date
# so we use a simple try/except instead # so we use a simple try/except instead
try: try:
aircast = AirCast.get(date=dt, song=song) aircast = AirCast.get(date=song_dt, song=song)
except DoesNotExist: except DoesNotExist:
aircast = AirCast.create(date=dt, song=song) aircast = AirCast.create(date=song_dt, song=song)
line_template = '{:<10} | {:<25} {:<40}' line_template = '{:<10} | {:<25} {:<40}'
print(line_template.format(str(dt), artist, title)) print(line_template.format(str(song_dt), artist, title))
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# Search song # Search song
def search_song(query): def search_songs_between(start_dt, end_dt):
query = AirCast\
.select()\
.order_by(AirCast.date)\
.where(AirCast.date.between(start_dt, end_dt))
return [x for x in query]
def search_song(day, hour):
# query must be a datetime # query must be a datetime
delta = timedelta(minutes=30) # we search the songs withing the hour specified
start_dt = dt.datetime.combine(day, dt.time(hour=hour))
query = AirCast.select().order_by(AirCast.date).where( delta = dt.timedelta(hours=1)
(AirCast.date > query - delta) & return search_songs_between(start_dt, start_dt + delta)
(AirCast.date < query + delta))
results = [x for x in query]
return results
def print_aircast(x): def print_aircast(x):
line_template = '{:<10} | {:<25} {:<40}' line_template = '{:<10} | {:<25} {:<40}'
@@ -110,22 +113,29 @@ def print_aircast(x):
# Very simple, just a page with an input for a date/time, a query button and a # Very simple, just a page with an input for a date/time, a query button and a
# list of results # list of results
@route('/', method='GET') @route('/', method=['GET', 'POST'])
@view('search_form')
def main_page():
now = datetime.now()
date = '{}'.format(now.date())
time = '{}:{}'.format(now.hour, now.minute)
return dict(title='', date=date, time=time)
@route('/', method='POST')
@view('search_results') @view('search_results')
def results_page(): def results_page():
date = request.forms.date try:
time = request.forms.time day = dt.date.fromisoformat(request.forms.date)
dt = datetime.fromisoformat('{} {}'.format(date, time)) except ValueError:
results = search_song(dt) day = dt.datetime.now().date()
return dict(results=[x for x in results], date=date, time=time)
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 = search_song(day, hour)
return dict(results=[x for x in results],
date=day,
time=time,
start_time=time,
end_time = '{:0>2}:00'.format(hour+1))
@hook('before_request') @hook('before_request')
def connect_to_db(): def connect_to_db():
@@ -171,7 +181,8 @@ def update(args):
def serve(args): def serve(args):
run(host=conf['server'].get('host', 'localhost'), 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))
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------

View File

@@ -1,15 +0,0 @@
<html>
<head>
<title>{{title or 'No title'}}</title>
</head>
<body>
<form action="/" method="post">
<label for="date">Date:</label>
<input name="date" type="date" value="{{date or ''}}"/>
<label for="time">Heure:</label>
<input name="time" type="time" value="{{time or ''}}"/>
<input value="Chercher" type="submit" />
</form>
{{!base}}
</body>
</html>

View File

@@ -1,7 +1,32 @@
% rebase('base.tpl', title='Radio Balises - Résultats') <html>
<h1>Liste des chansons</h1> <head>
<title>Radio Balises</title>
</head>
<body>
<form action="/" method="post" id="datetime_form">
<label for="date">Date:</label>
<input name="date" type="date" value="{{date}}" />
<label for="time">Heure:</label>
<input name="time" type="time" value="{{time}}" />
<input name="timedelta" id="timedelta" type="hidden" value="0" />
<input value="Chercher" type="submit" />
</form>
<h1>Chansons du {{date.strftime('%A %d %B %Y')}} entre {{start_time}} et {{end_time}}</h1>
<a href="#" id="go_sooner">[Plus tôt]</a>
<a href="#" id="go_later">[Plus tard]</a>
<ul> <ul>
% for x in results: % for x in results:
<li>[{{str(x.date)}}] {{x.song.artist}} - {{x.song.title}} <li>[{{str(x.date)}}] {{x.song.artist}} - {{x.song.title}}
% end % end
</ul> </ul>
<script>
move_in_time = (delta) => () => {
document.getElementById('timedelta').value = delta;
document.getElementById('datetime_form').submit();
}
document.getElementById('go_sooner').onclick = move_in_time(-1);
document.getElementById('go_later').onclick = move_in_time(1);
</script>
</body>
</html>