from flask import Flask, redirect, flash, session, g, request, get_flashed_messages, Markup from wtforms import Form, BooleanField, StringField, PasswordField, validators, SubmitField, IntegerField, DateTimeField from wtforms.validators import ValidationError from flask_wtf import FlaskForm from flask_bootstrap import Bootstrap import time from datetime import datetime from sqlalchemy import exc, update import werkzeug.exceptions import wtforms from wtforms.fields import EmailField from wtforms.widgets import NumberInput from typing import Optional, Any, List import hra.config as config import hra.web.html as html import hra.db as db from hra.web import app import hra.web.jinja_mac as jinja_mac from hra.util import hash_passwd from hra.web.pages import BasePage wlogic_by_mode = {} def add_wlogic(cls): wlogic_by_mode[cls.__name__.lower()] = cls def get_wlogic(game): if game.game_mode in wlogic_by_mode: cls = wlogic_by_mode[game.game_mode] else: cls = WLogic return cls(game) class WLogic: def __init__(self, game): self.game = game self.logic = game.get_logic() @add_wlogic class Occupy(WLogic): def view(self, state: db.State, team: Optional[db.Team], teams: List[db.Team]): s = state.get_state() if team is not None: s = self.logic.personalize_state(s, team.team_id, state.round) b = BasePage() b.h2(f"Hra {self.game.print()} kolo {state.round}") b.p().b(_class=f"game_team_{team.team_id}")(f"Pohled týmu {team.print()}") with b.table(_class="game_table"): for i, row in enumerate(s["map"]): with b.tr(): for j, x in enumerate(row): occupied_by_team = x["occupied_by_team"] home_for_team = x["home_for_team"] members = x["members"] with b.td(): classes = [] with b.a(href=f"#cell_{i}_{j}"): if x["protected_for_team"] is not None: classes.append("game_protected") if x["hill"]: classes.append("game_hill") b(Markup(" ")) else: if home_for_team is not None: classes.append(f'game_home') if occupied_by_team is not None: classes.append(f'game_occupied') classes.append(f'game_occupied_by_{occupied_by_team}') if len(members): b(len(members)) else: b(Markup(" ")) b(_class=" ".join(classes)) for i, row in enumerate(s["map"]): for j, x in enumerate(row): occupied_by_team = x["occupied_by_team"] protected_for_team = x["protected_for_team"] home_for_team = x["home_for_team"] members = x["members"] with b.div(id=f"cell_{i}_{j}", _class="game_tab"): b.h4(f"Políčko {i} {j}") if x["hill"]: b.p().b("Pohoří") else: if occupied_by_team is not None: b.p(_class=f"game_team_{occupied_by_team}").b(f"Obsazeno týmem: {teams[occupied_by_team].print()}") if protected_for_team is not None: b.p(_class=f"game_team_{protected_for_team}").b(f"Ochranné území týmu: {teams[protected_for_team].print()}") if home_for_team is not None: b.p(_class=f"game_team_{home_for_team}").b(f"Domov týmu: {teams[home_for_team].print()}") b.p().b(f"Počet osob: {len(members)}") with b.ul(): for m in members: b.li(_class=f"game_team_{home_for_team}")(f"Voják {m['id']} týmu {teams[m['team']].print()}") b.wrap( limited_size=False, sticky_head=False, head=lambda x:x.link(rel="stylesheet", href=app.url_for('static', filename='occupy.css'), type='text/css', media="all") ) return b.print_file()