palvelu.py

Sat, 10 Jun 2017 16:36:36 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Sat, 10 Jun 2017 16:36:36 +0300
changeset 6
88cfb916c852
parent 5
a65b680f1774
permissions
-rwxr-xr-x

Plöö

#!/usr/bin/env python3
from flask import Flask, render_template, abort
from datetime import datetime, date, time, timedelta
from misc import *
import locale
from bussireitti import supista_reitti
from configparser import ConfigParser

app = Flask(__name__)
locale.setlocale(locale.LC_ALL, locale.getdefaultlocale())

kielet = ['fi', 'sv', 'en', 'ru']
kieli_ini = {}
for kieli in kielet:
	ini = ConfigParser()
	ini.read(kieli + '.ini')
	kieli_ini[kieli] = ini

def käännä(nimi, osio):
	kieli = sivun_kieli()
	try:
		return kieli_ini[kieli][osio][nimi]
	except KeyError:
		return nimi

def sivun_kieli():
	from flask import request
	if request.args.get('sv') is not None:
		return 'sv'
	elif request.args.get('en') is not None:
		return 'en'
	elif request.args.get('ru') is not None:
		return 'ru'
	elif request.args.get('kääntämätön') is None:
		return 'fi'
	else:
		return None

@app.route('/pysäkki/<tunniste>')
def pysäkkiaikataulu(tunniste):
	from bussit import pysäkit
	from math import ceil
	aikataulu = []
	try:
		pysäkki = pysäkit[tunniste]
	except KeyError:
		abort(404)
	for (aika, pysähdys) in pysäkki.aikataulu(100):
		kyltti = supista_reitti(pysähdys.ajo.suppea_reitti(pysähdys))
		kyltti = [käännä(paikka, 'paikat') for paikka in kyltti]
		kylttiesitys = ' - '.join(kyltti)
		if len(kylttiesitys) > 25:
			k = ceil(len(kyltti) / 2)
			kylttiesitys = ' - '.join(kyltti[:k]) + '\n' + ' - '.join(kyltti[k:])
		aikataulu.append({
			'aika': muotoile_aika(aika),
			'linja': pysähdys.ajo.linja.viite,
			'kyltti': kylttiesitys,
			'ajovuoro': pysähdys.ajo.nimi,
			'yö': yö(aika),
		})
	return render_template(
		'pysäkki.html',
		aikataulu = aikataulu,
		viite = tunniste,
		nimi = käännä(pysäkki.nimi, 'pysäkit'),
		linkki_karttaan = pysäkki.linkki_karttaan,
		alue = pysäkki.alue,
		sijainti = pysäkki.sijainti,
	)

@app.route('/ajovuoro/<numero>')
def ajoreitti(numero):
	from flask import request
	from bussit import ajot
	try:
		ajovuoro = ajot[numero]
	except KeyError:
		abort(404)
	suppea = request.args.get('suppea') is not None
	reitti = []
	suppea_reitti = []
	käydyt_alueet = set()
	for pysähdys in ajovuoro.reitti:
		aika = datetime.combine(tänään(), time()) + pysähdys.saapumisaika
		muotoiltu_aika = muotoile_aika(aika)
		reitti.append({
			'aika': muotoiltu_aika,
			'tunniste': pysähdys.pysäkki.tunniste,
			'alue': käännä(pysähdys.pysäkki.alue or '', 'paikat'),
			'nimi': käännä(pysähdys.pysäkki.nimi, 'pysäkit'),
		})
		alue = pysähdys.pysäkki.alue
		if alue:
			if alue not in käydyt_alueet:
				suppea_reitti.append({
					'aika': muotoiltu_aika,
					'alue': alue,
				})
				käydyt_alueet.add(alue)
	kyltti = supista_reitti([k['alue'] for k in suppea_reitti], kokonainen = True)
	sivu = suppea and 'ajovuoro-suppea.html' or 'ajovuoro.html'
	return render_template(sivu, reitti = reitti, suppea_reitti = suppea_reitti,
						numero = numero, linja = ajovuoro.linja.viite,
						selite = ' - '.join(käännä(paikka, 'paikat') for paikka in kyltti),
						yö = yö(datetime.combine(tänään(), time()) + ajovuoro.reitti[-1].saapumisaika),
						)

if __name__ == '__main__':
	from argparse import ArgumentParser
	parser = ArgumentParser()
	parser.add_argument('-p', '--port', type = int, default = 5000)
	args = parser.parse_args()
	app.run(debug = True, port = args.port)

mercurial