forked from Ravise/misc-scripts
85 lines
2.0 KiB
Python
85 lines
2.0 KiB
Python
import collections
|
|
import csv
|
|
import dataclasses
|
|
import datetime
|
|
import pathlib
|
|
import sys
|
|
from html_minifier.minify import Minifier
|
|
from bs4 import BeautifulSoup as bs
|
|
import jinja2
|
|
|
|
LOW = 13
|
|
HIGH = 15
|
|
|
|
|
|
@dataclasses.dataclass
|
|
class Postbox:
|
|
owner: str | None
|
|
x: int
|
|
y: int
|
|
z: int
|
|
|
|
def to_dict(self):
|
|
return vars(self)
|
|
|
|
|
|
def main():
|
|
env = jinja2.Environment(loader=jinja2.PackageLoader("post_office_jinja"))
|
|
|
|
postboxes = get_postboxes("data.csv")
|
|
postbox_map = collections.defaultdict(lambda: collections.defaultdict(dict))
|
|
for box in postboxes:
|
|
postbox_map[box.x][box.y][box.z] = box
|
|
|
|
minx, maxx, minz, maxz = get_limits(postboxes)
|
|
|
|
entries = []
|
|
|
|
for z in range(minz, maxz + 1):
|
|
superrow = []
|
|
for y in (HIGH, LOW):
|
|
row = []
|
|
for x in range(minx, maxx + 1):
|
|
try:
|
|
pb: Postbox = postbox_map[x][y][z]
|
|
row.append(pb)
|
|
except KeyError:
|
|
row.append(Postbox(None, x, y, z))
|
|
superrow.append(row)
|
|
entries.append(superrow)
|
|
|
|
tpl = env.get_template("postbox.j2.html")
|
|
dat = tpl.render(postboxes=entries, today=datetime.date.today().isoformat())
|
|
|
|
minifier = Minifier(dat)
|
|
dat = minifier.minify()
|
|
|
|
soup = bs(dat, features="html.parser")
|
|
dat = soup.prettify()
|
|
|
|
with open("out.html", "wt", encoding="utf-8") as fw:
|
|
fw.write(dat)
|
|
|
|
|
|
def get_postboxes(fname):
|
|
postboxes = []
|
|
|
|
with open(fname, "rt", newline="") as fr:
|
|
for line in csv.reader(fr):
|
|
x, y, z, owner = line
|
|
pb = Postbox(owner, int(x), int(y), int(z))
|
|
postboxes.append(pb)
|
|
|
|
return postboxes
|
|
|
|
|
|
def get_limits(postboxes):
|
|
minz, maxz = min([pb.z for pb in postboxes]), max([pb.z for pb in postboxes])
|
|
minx, maxx = min([pb.x for pb in postboxes]), max([pb.x for pb in postboxes])
|
|
|
|
return minx, maxx, minz, maxz
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|