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