119 lines
3.6 KiB
Python
119 lines
3.6 KiB
Python
"""
|
|
Vybere 2 puzzle každého typu z MySQL a vygeneruje PDF (jedno na typ).
|
|
Použití: python PuzzleSelection.py [YYYY-MM-DD]
|
|
Výchozí datum: dnes.
|
|
"""
|
|
|
|
import json
|
|
import sys
|
|
from datetime import date
|
|
from pathlib import Path
|
|
|
|
sys.stdout.reconfigure(encoding="utf-8")
|
|
|
|
BASE = Path(__file__).parent
|
|
sys.path.insert(0, str(BASE.parent / "Knihovny"))
|
|
sys.path.insert(0, str(BASE / "DailyCalcudoku"))
|
|
sys.path.insert(0, str(BASE / "DailyKakuro"))
|
|
sys.path.insert(0, str(BASE / "DailySudoku"))
|
|
sys.path.insert(0, str(BASE / "DailySuguru"))
|
|
sys.path.insert(0, str(BASE / "DailyStr8ts"))
|
|
sys.path.insert(0, str(BASE / "DailySudokuKiller"))
|
|
|
|
from mysql_db import connect_mysql
|
|
from vykresli_calcudoku import generate_pdf as gen_calcudoku
|
|
from vykresli_kakuro import generate_pdf as gen_kakuro
|
|
from vykresli_sudoku import generate_pdf as gen_sudoku
|
|
from vykresli_suguru import generate_pdf as gen_suguru
|
|
from vykresli_puzzle import generate_pdf as gen_str8ts
|
|
from vykresli_killer_sudoku import generate_pdf as gen_killer
|
|
|
|
PUZZLE_DATE = sys.argv[1] if len(sys.argv) > 1 else date.today().isoformat()
|
|
|
|
|
|
def query_by_date(cur, game_type):
|
|
cur.execute(
|
|
"SELECT game_type, difficulty, puzzle, solution, extra FROM puzzles "
|
|
"WHERE game_type=%s AND puzzle_date=%s "
|
|
"ORDER BY RAND() LIMIT 2",
|
|
[game_type, PUZZLE_DATE],
|
|
)
|
|
return cur.fetchall()
|
|
|
|
|
|
def query_killer(cur, game_type):
|
|
cur.execute(
|
|
"SELECT game_type, difficulty, puzzle, solution, extra, puzzle_date FROM puzzles "
|
|
"WHERE game_type=%s AND puzzle_date <= %s "
|
|
"ORDER BY RAND() LIMIT 2",
|
|
[game_type, PUZZLE_DATE],
|
|
)
|
|
return cur.fetchall()
|
|
|
|
|
|
def run(label, puzzles, gen_fn, filename):
|
|
if not puzzles:
|
|
print(f"{label}: žádná data pro {PUZZLE_DATE}")
|
|
return
|
|
out = BASE / filename
|
|
gen_fn(puzzles, out)
|
|
print(f"{label}: {out.name}")
|
|
|
|
|
|
def main():
|
|
conn = connect_mysql(database="puzzle")
|
|
cur = conn.cursor()
|
|
|
|
# Calcudoku
|
|
rows = query_by_date(cur, "calcudoku")
|
|
run("calcudoku", [
|
|
{"difficulty": r[1], "cages_str": r[2], "solution_str": r[3],
|
|
"grid_size": json.loads(r[4])["grid_size"], "puzzle_date": PUZZLE_DATE}
|
|
for r in rows
|
|
], gen_calcudoku, f"calcudoku_{PUZZLE_DATE}.pdf")
|
|
|
|
# Kakuro
|
|
rows = query_by_date(cur, "kakuro")
|
|
run("kakuro", [
|
|
{"difficulty": r[1], "puzzle_str": r[2], "puzzle_date": PUZZLE_DATE}
|
|
for r in rows
|
|
], gen_kakuro, f"kakuro_{PUZZLE_DATE}.pdf")
|
|
|
|
# Sudoku
|
|
rows = query_by_date(cur, "sudoku")
|
|
run("sudoku", [
|
|
{"difficulty": r[1], "puzzle": r[2], "solution": r[3], "puzzle_date": PUZZLE_DATE}
|
|
for r in rows
|
|
], gen_sudoku, f"sudoku_{PUZZLE_DATE}.pdf")
|
|
|
|
# Suguru
|
|
rows = query_by_date(cur, "suguru")
|
|
run("suguru", [
|
|
{"difficulty": r[1], "puzzle_str": r[2], "solution_str": r[3],
|
|
"grid_size": json.loads(r[4])["grid_size"], "puzzle_date": PUZZLE_DATE}
|
|
for r in rows
|
|
], gen_suguru, f"suguru_{PUZZLE_DATE}.pdf")
|
|
|
|
# Str8ts
|
|
rows = query_by_date(cur, "str8ts")
|
|
run("str8ts", [
|
|
{"difficulty": r[1], "puzzle": r[2], "solution": r[3],
|
|
"bw": json.loads(r[4])["bw"], "puzzle_date": PUZZLE_DATE}
|
|
for r in rows
|
|
], gen_str8ts, f"str8ts_{PUZZLE_DATE}.pdf")
|
|
|
|
# Killer Sudoku — 2 nejnovější
|
|
rows = query_killer(cur, "killer_sudoku")
|
|
run("killer_sudoku", [
|
|
{"game_type": r[0], "difficulty": r[1], "puzzle_str": r[2],
|
|
"solution_str": r[3], "puzzle_date": str(r[5])}
|
|
for r in rows
|
|
], gen_killer, f"killer_sudoku_{PUZZLE_DATE}.pdf")
|
|
|
|
cur.close()
|
|
conn.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|