Browse Source

First (almost) working version.

master
parent
commit
d5c042a9a9
  1. 2
      .gitignore
  2. 145
      app.py
  3. 82
      config.toml
  4. 30
      poznamky
  5. 29
      static/style.css
  6. 39
      templates/form.html
  7. 18
      templates/tablo.html

2
.gitignore

@ -114,3 +114,5 @@ dmypy.json
# Pyre type checker
.pyre/
# Vim swap file
.*.sw[mnop]

145
app.py

@ -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"])

82
config.toml

@ -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

30
poznamky

@ -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

29
static/style.css

@ -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;
}

39
templates/form.html

@ -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>

18
templates/tablo.html

@ -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…
Cancel
Save