Tomas "Jethro" Pokorny
5 years ago
7 changed files with 345 additions and 0 deletions
@ -0,0 +1,145 @@ |
|||||
|
#!/usr/bin/python3 |
||||
|
|
||||
|
from flask import Flask,render_template,session,request,redirect,abort |
||||
|
import json |
||||
|
import sys |
||||
|
import logging |
||||
|
import datetime |
||||
|
import toml |
||||
|
|
||||
|
SECRET_KEY = '!Êrû÷FwÙxIER' |
||||
|
CONFIG_FILE = 'config.toml' |
||||
|
|
||||
|
|
||||
|
|
||||
|
app = Flask(__name__) |
||||
|
app.secret_key = SECRET_KEY |
||||
|
app.logger.setLevel(logging.DEBUG) |
||||
|
SERVER_NAME = '127.0.0.1' |
||||
|
|
||||
|
config = {} |
||||
|
with open(CONFIG_FILE) as f: |
||||
|
config = toml.load(f) |
||||
|
print(config) |
||||
|
if not config["orgs"]: |
||||
|
app.logger.error("Orgs part of config file missing") |
||||
|
sys.exit(1) |
||||
|
if not config["teams"]: |
||||
|
app.logger.error("Teams part of config file missing") |
||||
|
sys.exit(1) |
||||
|
if not config["times"]: |
||||
|
app.logger.error("Times part of config file missing") |
||||
|
sys.exit(1) |
||||
|
|
||||
|
order = [{"id":i,"value":str(i+1)+"."} for i in range(len(config["teams"]))] |
||||
|
order.append({"id":"t", "value":"Třezalka"}) |
||||
|
order.append({"id":"n", "value":"Neběžel"}) |
||||
|
|
||||
|
around = 0 |
||||
|
|
||||
|
def check_form(form,config): |
||||
|
errors = [] |
||||
|
for t in config["teams"]: |
||||
|
if "poradi1_"+str(t['id']) not in form: |
||||
|
errors.append("Tým "+t['name']+" nemá vyplněné pořadí u 1. člověka") |
||||
|
if "poradi2_"+str(t['id']) not in form: |
||||
|
errors.append("Tým "+t['name']+" nemá vyplněné pořadí u 2. člověka") |
||||
|
|
||||
|
return errors |
||||
|
|
||||
|
def team_points(per1,order1,per2,order2,config): |
||||
|
# FIXME hardcoded interactions |
||||
|
if (per1 == 'Kodein' and per2 == 'Paralen') or \ |
||||
|
(per1 == 'Penicilin' and per2 == 'Strepsils'): |
||||
|
# FIXME co třezalka? |
||||
|
order1 = min(order1,order2) |
||||
|
order2 = min(order1,order2) |
||||
|
|
||||
|
pts = 0 |
||||
|
# Pokud neběžel první, neběžel ani druhý |
||||
|
if order1 == 'n': |
||||
|
return config['no_pts'] |
||||
|
|
||||
|
# První měl třezalku |
||||
|
if order1 == 't': |
||||
|
pts += config['base_pts'] |
||||
|
|
||||
|
# První běžel normálně |
||||
|
else: |
||||
|
org = get_org_by_id(per1,config) |
||||
|
pts +=config['base_pts']*config['order_coeff'][int(order1)]*org['coeff'] |
||||
|
# Druhý neběžěl, body za oba jsou body prvního, můžeme vrátit |
||||
|
if order2 == 'n': |
||||
|
return pts |
||||
|
|
||||
|
# Druhý měl třezalku |
||||
|
if order2 == 't': |
||||
|
pts += config['base_pts'] |
||||
|
|
||||
|
# Druhý běžel normálně |
||||
|
else: |
||||
|
org = get_org_by_id(per2,config) |
||||
|
pts += config['base_pts']*config['order_coeff'][int(order2)]*org['coeff'] |
||||
|
return pts |
||||
|
|
||||
|
def get_person(form,tid,pid,config): |
||||
|
for org in config["orgs"]: |
||||
|
if form["clovek{}_{}_{}".format(pid,tid,org["id"])] == "true": |
||||
|
return org["id"] |
||||
|
return None |
||||
|
|
||||
|
def get_team_by_id(aid,config): |
||||
|
for t in config["teams"]: |
||||
|
if t["id"] == aid: |
||||
|
return t |
||||
|
|
||||
|
def get_org_by_id(aid,config): |
||||
|
for o in config["orgs"]: |
||||
|
if o["id"] == aid: |
||||
|
return o |
||||
|
|
||||
|
@app.route('/') |
||||
|
def hello_world(): |
||||
|
return 'Hello, World!' |
||||
|
|
||||
|
@app.route('/form',methods=['GET','POST']) |
||||
|
def form_page(): |
||||
|
if request.method == 'GET': |
||||
|
return render_template("form.html", |
||||
|
round = config["times"][around], |
||||
|
people = config["orgs"], |
||||
|
order = order, |
||||
|
teams = config["teams"], |
||||
|
) |
||||
|
|
||||
|
if request.method == 'POST': |
||||
|
print(request.form) |
||||
|
errors = check_form(request.form,config) |
||||
|
if errors: |
||||
|
return render_template("form.html", |
||||
|
round = config["times"][around], |
||||
|
people = config["orgs"], |
||||
|
order = order, |
||||
|
teams = config["teams"], |
||||
|
errors = errors |
||||
|
) |
||||
|
for team in config["teams"]: |
||||
|
order1 = request.form['poradi1_'+str(team['id'])] |
||||
|
order2 = request.form['poradi2_'+str(team['id'])] |
||||
|
per1 = request.form['clovek1_'+str(team['id'])] |
||||
|
per2 = request.form.get('clovek2_'+str(team['id']),None) |
||||
|
team["points"] += team_points(per1,order1,per2,order2,config) |
||||
|
return render_template("form.html", |
||||
|
round = config["times"][around], |
||||
|
people = config["orgs"], |
||||
|
order = order, |
||||
|
teams = config["teams"], |
||||
|
errors = [] |
||||
|
) |
||||
|
|
||||
|
|
||||
|
|
||||
|
@app.route('/tablo') |
||||
|
def tablo(): |
||||
|
return render_template("tablo.html",teams=config["teams"]) |
||||
|
|
@ -0,0 +1,82 @@ |
|||||
|
# Označení kol |
||||
|
times = [ |
||||
|
"pondělí ráno", |
||||
|
"pondělí v poledne", |
||||
|
"pondělí večer", |
||||
|
"úterý ráno", |
||||
|
"úterý v poledne", |
||||
|
"úterý večer", |
||||
|
"středa ráno", |
||||
|
"středa v poledne", |
||||
|
"středa večer", |
||||
|
"čtvrtek ráno", |
||||
|
"čtvrtek v poledne", |
||||
|
"čtvrtek večer", |
||||
|
"pátek ráno", |
||||
|
"pátek v poledne", |
||||
|
"pátek večer", |
||||
|
] |
||||
|
|
||||
|
order_coeff = [ |
||||
|
1.5, 1.4, 1.3, 1.2, 1.1 |
||||
|
] |
||||
|
start_pts = 100 |
||||
|
base_pts = 20 |
||||
|
no_pts = -20 |
||||
|
|
||||
|
# Přiřazení léků k orgům |
||||
|
[[orgs]] |
||||
|
value = "Borek" |
||||
|
id = "Paralen" |
||||
|
coeff = 3 |
||||
|
[[orgs]] |
||||
|
value = "Jane" |
||||
|
id = "Penicilin" |
||||
|
coeff = 4 |
||||
|
[[orgs]] |
||||
|
value = "Kristý" |
||||
|
id = "Olynth" |
||||
|
coeff = 2 |
||||
|
[[orgs]] |
||||
|
value = "Matej" |
||||
|
id = "ACC" |
||||
|
coeff = 2.5 |
||||
|
[[orgs]] |
||||
|
value = "Karel" |
||||
|
id = "Strepsils" |
||||
|
coeff = 2 |
||||
|
[[orgs]] |
||||
|
value = "Lída" |
||||
|
id = "Coldrex" |
||||
|
coeff = 3.5 |
||||
|
[[orgs]] |
||||
|
value = "Béďa" |
||||
|
id = "Kodein" |
||||
|
coeff = 3 |
||||
|
[[orgs]] |
||||
|
value = "Účastník" |
||||
|
id = "Doktor" |
||||
|
coeff = 1 |
||||
|
|
||||
|
|
||||
|
# Jména týmů |
||||
|
[[teams]] |
||||
|
name = "Doktoři" |
||||
|
id = 1 |
||||
|
points = 100 |
||||
|
|
||||
|
[[teams]] |
||||
|
name = "Lékaři" |
||||
|
id = 2 |
||||
|
points = 100 |
||||
|
|
||||
|
[[teams]] |
||||
|
name = "Medici" |
||||
|
id = 3 |
||||
|
points = 100 |
||||
|
|
||||
|
[[teams]] |
||||
|
name = "Hrobaři" |
||||
|
id = 4 |
||||
|
points = 100 |
||||
|
|
@ -0,0 +1,30 @@ |
|||||
|
1. notebook |
||||
|
----------- |
||||
|
- 4 lifebary |
||||
|
- výchozí rozsah 0--1000 |
||||
|
- nemusí se přeškálovávat, pokud přešvihnou 1000, ale musí tam být číslo |
||||
|
- číslo nemusí být celé, zobrazení zaokrouhlit na 1 desetinné místo |
||||
|
- černé tečky za záchranky |
||||
|
- počitadlo kol |
||||
|
- pondělí -- pátek; ráno, poledne, večer |
||||
|
|
||||
|
2.notebook |
||||
|
---------- |
||||
|
- 4 týmy |
||||
|
- 7 orgů + účastník |
||||
|
- je potřeba, aby bylo možné zadat pořadí doběhnutí (1. -- 4. + třezalka + neběžel) a orga resp. účastníka |
||||
|
- to celé 2x pro tým, protože až 2 léky na tým a běh |
||||
|
- pokud třezalka, pak koeficient 1 |
||||
|
- pokud neběžel, pak záporné body |
||||
|
- za jeden tým může běžet 0 -- 2 lidí |
||||
|
- nikdy neběží lék a lékař |
||||
|
- týmy navzájem neinteragují není potřeba při výpočtu bodů jednoho týmu zkoumat výsledky jiného týmu |
||||
|
- pokud zdraví účastníků klesne pod 100, můžou si zavolat záchranku, která jím vrátí zdraví na 100 |
||||
|
- lze jen jednou za hru |
||||
|
- projeví se jen na zadávací stránce, aby nešlo zvolit 2x |
||||
|
- pokud zdraví účastníků <= 0, tak se záchranka volá automaticky, opět srovná na 100 bodů |
||||
|
- projeví se na bodovací stránce černým puntíkem |
||||
|
- počitadlo kol |
||||
|
- úterý poledne: -30 zdraví |
||||
|
- pátek ráno a oběd: -100 zdraví |
||||
|
- tlačítko zpět o kolo |
@ -0,0 +1,29 @@ |
|||||
|
#content { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
display: flex; |
||||
|
flex-direction: row; |
||||
|
justify-content: space-around; |
||||
|
align-items: flex-end; |
||||
|
|
||||
|
} |
||||
|
.team { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
justify-content: flex-end; |
||||
|
align-items: center; |
||||
|
|
||||
|
} |
||||
|
.points { |
||||
|
font-size: 32pt; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.bar { |
||||
|
float: left; |
||||
|
width: 100px; |
||||
|
margin: 5px; |
||||
|
border: 1px solid rgba(0, 0, 0, .2); |
||||
|
background-color: blue; |
||||
|
} |
||||
|
|
@ -0,0 +1,39 @@ |
|||||
|
<html> |
||||
|
<head> |
||||
|
</head> |
||||
|
<body> |
||||
|
<h1>Zadávání pořadí - {{round}}</h1> |
||||
|
<form method="post" action=""> |
||||
|
<h2> Problémy </h2> |
||||
|
<ul> |
||||
|
{% for e in errors %} |
||||
|
<li>{{e}}</li> |
||||
|
{% endfor %} |
||||
|
</ul> |
||||
|
{% for team in teams %} |
||||
|
<h2>Tým {{team.name}}</h2> |
||||
|
<h3>Člověk 1:</h3> |
||||
|
{% for c in people %} |
||||
|
<input type="radio" name="clovek1_{{team.id}}" id="clovek1_{{team.id}}_{{c.id}}" value="{{c.id}}"> |
||||
|
<label for="clovek1_{{team.id}}_{{c.id}}">{{c.value}}</label> |
||||
|
{% endfor %} |
||||
|
<h3>Pořadí</h3> |
||||
|
{% for p in order %} |
||||
|
<input type="radio" name="poradi1_{{team.id}}" id="p1_{{team.id}}_{{p.id}}" value="{{p.id}}"> |
||||
|
<label for="p1_{{team.id}}_{{p.id}}">{{p.value}}</label> |
||||
|
{% endfor %} |
||||
|
<h3>Člověk 2:</h3> |
||||
|
{% for c in people %} |
||||
|
<input type="radio" name="clovek2_{{team.id}}" id="clovek2_{{team.id}}_{{c.id}}" value="{{c.id}}"> |
||||
|
<label for="clovek2_{{team.id}}_{{c.id}}">{{c.value}}</label> |
||||
|
{% endfor %} |
||||
|
<h3>Pořadí</h3> |
||||
|
{% for p in order %} |
||||
|
<input type="radio" name="poradi2_{{team.id}}" id="p2_{{team.id}}_{{p.id}}" value="{{p.id}}"> |
||||
|
<label for="p2_{{team.id}}_{{p.id}}">{{p.value}}</label> |
||||
|
{% endfor %} |
||||
|
{% endfor %} |
||||
|
|
||||
|
<input type="submit" value="Odeslat"> |
||||
|
</form> |
||||
|
</body> |
@ -0,0 +1,18 @@ |
|||||
|
<html> |
||||
|
<head> |
||||
|
<link rel="stylesheet" href="/static/style.css"> |
||||
|
<title>Zdraví pacientů</title> |
||||
|
</head> |
||||
|
<body> |
||||
|
<div id="content"> |
||||
|
{% for t in teams %} |
||||
|
<div class="team"> |
||||
|
<div class="bar" id="bar_{{t.id}}" style="height:{{t.points}}"> |
||||
|
</div> |
||||
|
<div class="points"> |
||||
|
{{t.points}} |
||||
|
</div> |
||||
|
</div> |
||||
|
{% endfor %} |
||||
|
</div> |
||||
|
</body> |
Loading…
Reference in new issue