from flask import Flask, abort, request, render_template, url_for import datetime as dt import math import MySQLdb import MySQLdb.cursors import re app = Flask(__name__) PAGE_SIZE=20 MIN_MONTHS_FOR_LISTINGS=3 def read_db(start=0, limit=PAGE_SIZE, listing=None, event=None, person=None, licence=None, search=dict(), year=None): db = MySQLdb.connect(user='aac', passwd='saOAcCWHg4LaoSSA', db='AAC', use_unicode=True, charset="utf8", cursorclass=MySQLdb.cursors.DictCursor) c = db.cursor() count = 0 select = '*' where = 'WHERE club LIKE "AAC"' group = '' order = 'date DESC, event, position' close = '' if event: if isinstance(event, str): event = db.escape_string(event).decode() where += ' AND event LIKE "{}"'.format(event.lower()) if person: if isinstance(person, str): person = db.escape_string(person).decode() where += ' AND CONCAT_WS(" ", name, surname) LIKE "{}"'.format(person.lower()) if licence: if isinstance(licence, str): licence = db.escape_string(licence).decode() where += ' AND licence LIKE "{}"'.format(licence.lower()) if year: if not isinstance(year, (int, float)): year = int(db.escape_string(year).decode()) firstdate = dt.datetime.min lastdate = dt.datetime.max firstdate = firstdate.replace(year=int(year)) lastdate = lastdate.replace(year=int(year)) where += ' AND date > "{}" AND date < "{}"'.format(firstdate, lastdate) for column in search.keys(): if isinstance(column, str): column = db.escape_string(column).decode() if isinstance(search[column], str): query = db.escape_string(search[column]).decode() if not query: next if column in ( 'licence', 'event', ): where += ' AND {} LIKE "%{}%"'.format(column, query.lower()) elif column in ( 'name', ): where += ' AND ( CONCAT_WS(" ", name, surname) LIKE "%{}%" )'.format(query.lower()) elif column in ( 'position', ): where += ' AND {} LIKE "{}"'.format(column, query) elif column == 'after': try: after = dt.datetime.strptime(query, '%Y-%m-%d') date = dt.datetime.min date = date.replace(year=after.year, month=after.month, day=after.day) where += ' AND date > "{}"'.format(date) except: pass elif column == 'before': try: before = dt.datetime.strptime(query, '%Y-%m-%d') date = dt.datetime.max date = date.replace(year=before.year, month=before.month, day=before.day) where += ' AND date < "{}"'.format(date) except: pass else: pass if listing: if listing == 'races': select = 'event, date' group = 'GROUP BY event' elif listing == 'runners': select = 'CONCAT_WS(" ", name, surname) person, FORMAT(SUM(distance),0) total' where += ' AND CONCAT_WS(" ", name, surname) NOT LIKE "%NO RETURN%"' where += ' AND CONCAT_WS(" ", name, surname) NOT LIKE "%BLANK CARD%"' group = 'GROUP BY CONCAT_WS(" ", name, surname)' order = 'SUM(distance) DESC, surname' elif listing == 'rankings': select = 'CONCAT_WS(" ", name, surname) person, SUM(position) positions, COUNT(event) races, SUM(position)/COUNT(event) podiums, FORMAT(SUM(position)/COUNT(event),1) score' group = 'GROUP BY CONCAT_WS(" ", name, surname)' order = 'podiums, races DESC' elif listing == 'licence': select = 'licence, date, CONCAT_WS(" ", name, surname) person' group = 'GROUP BY licence' order = 'surname, date DESC' sql = 'SELECT {} FROM `results` {} {} ORDER BY {} LIMIT {},{} {};'.format(select, where, group, order, start, limit, close) app.logger.debug(sql) c.execute(sql) queryresults = c.fetchall() select = 'COUNT(*)' if listing: if listing == 'races': select = 'COUNT(*) FROM ( SELECT COUNT(event)' close = ') races' elif listing == 'runners': select = 'COUNT(*) FROM ( SELECT COUNT(name)' group = 'GROUP BY CONCAT_WS(" ", name, surname)' close = ') runners' elif listing == 'rankings': select = 'COUNT(*) FROM ( SELECT COUNT(name)' group = 'GROUP BY CONCAT_WS(" ", name, surname)' close = ') rankings' elif listing == 'licence': pass sql = 'SELECT {} FROM `results` {} {} {};'.format(select, where, group, close) #app.logger.debug(sql) c.execute(sql) countresult = c.fetchone() for x in countresult.keys(): count = countresult[x] #app.logger.debug(count) return { 'count': int(count), 'rows': queryresults } def now(): return dt.datetime.now() @app.template_filter('pace') def pace(time): return (dt.datetime(1,1,1) + time).strftime('%M:%S') @app.template_filter('year') def year(time): return time.strftime('%Y') @app.template_filter('cleandate') def clean_date(time): if time.month == 1 and time.day == 1: return time.strftime('%Y') return time.strftime('%Y-%m-%d') @app.template_filter('ordinal') def ordinal(n): if not isinstance(n, int) or n < 1: return return "%d%s" % (n,"tsnrhtdd"[(math.floor(n/10)%10!=1)*(n%10<4)*n%10::4]) @app.route('/') @app.route('/list') @app.route('/list/