diff --git a/Makefile b/Makefile index d82d6c3..e5355da 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ export YEAR .PHONY: $(DATA_DIR)/results.xlsx $(DATA_DIR)/results.tsv -all: all-data copy-raw-data copy-massaged-data static charts profiling +all: all-data copy-raw-data massage charts profiling $(OUT_DIR): mkdir -p $(OUT_DIR) @@ -19,11 +19,8 @@ copy-raw-data: all-data $(OUT_DIR) cp $(DATA_DIR)/results.xlsx $(OUT_DIR)/raw.xlsx cp $(DATA_DIR)/results.tsv $(OUT_DIR)/raw.tsv -copy-massaged-data: all-data - python -m pulkka.copy_massaged_data - -static: all-data - python -m pulkka.massage_templates +massage: all-data + python -m pulkka.massage_outputs charts: all-data python -m pulkka.generate_charts diff --git a/pulkka/copy_massaged_data.py b/pulkka/copy_massaged_data.py deleted file mode 100644 index d2b3ca9..0000000 --- a/pulkka/copy_massaged_data.py +++ /dev/null @@ -1,19 +0,0 @@ -from pulkka.config import OUT_DIR -from pulkka.data_ingest import read_data - - -def main(): - df = read_data() - df.to_html(OUT_DIR / "data.html", index=False, na_rep="") - df.to_csv(OUT_DIR / "data.csv", index=False) - df.to_excel(OUT_DIR / "data.xlsx", index=False) - df.to_json( - OUT_DIR / "data.json", - orient="records", - date_format="iso", - force_ascii=False, - ) - - -if __name__ == "__main__": - main() diff --git a/pulkka/massage_outputs.py b/pulkka/massage_outputs.py new file mode 100644 index 0000000..37d17cc --- /dev/null +++ b/pulkka/massage_outputs.py @@ -0,0 +1,65 @@ +import datetime +import glob +import io +import os + +import jinja2 +import numpy +import pandas + +from pulkka.config import OUT_DIR, YEAR +from pulkka.data_ingest import read_data + +TEMPLATE_DIR = os.path.realpath("./template") + + +def write_massaged_files(env, df): + with open(OUT_DIR / 'data.html', 'w') as f: + with io.StringIO() as s: + df.to_html(s, index=False, na_rep="", border=0) + table_html = s.getvalue() + f.write(env.get_template('_table.html').render(table_html=table_html, body_class="table-body")) + df.to_csv(OUT_DIR / "data.csv", index=False) + df.to_excel(OUT_DIR / "data.xlsx", index=False) + df.to_json( + OUT_DIR / "data.json", + orient="records", + date_format="iso", + force_ascii=False, + ) + print("Wrote data files") + + +def render_statics(env): + for filename in glob.glob(os.path.join(TEMPLATE_DIR, "*.html")): + basename = os.path.relpath(filename, TEMPLATE_DIR) + if basename.startswith("_"): + continue + out_filename = OUT_DIR / basename + with open(filename, "r") as inf: + tpl: jinja2.Template = env.from_string(inf.read()) + content = tpl.render(body_class="static-body") + with open(out_filename, "w") as outf: + outf.write(content) + print(filename, "=>", out_filename) + + +def main(): + df = read_data() + env = jinja2.Environment( + autoescape=True, + loader=jinja2.FileSystemLoader(TEMPLATE_DIR), + ) + env.globals.update({ + "date": datetime.datetime.utcnow(), + "pd": pandas, + "np": numpy, + "df": df, + "year": YEAR, + }) + render_statics(env) + write_massaged_files(env, df) + + +if __name__ == "__main__": + main() diff --git a/pulkka/massage_templates.py b/pulkka/massage_templates.py deleted file mode 100644 index 9c61dc8..0000000 --- a/pulkka/massage_templates.py +++ /dev/null @@ -1,35 +0,0 @@ -import datetime -import glob -import os - -import jinja2 -import numpy -import pandas - -from pulkka.config import OUT_DIR, YEAR -from pulkka.data_ingest import read_data - - -def main(): - env = jinja2.Environment( - autoescape=True, - ) - data = { - "date": datetime.datetime.utcnow(), - "pd": pandas, - "np": numpy, - "df": read_data(), - "year": YEAR, - } - for filename in glob.glob("template/*"): - out_filename = OUT_DIR / os.path.relpath(filename, "template") - with open(filename, "r") as inf: - tpl: jinja2.Template = env.from_string(inf.read()) - content = tpl.render(data) - with open(out_filename, "w") as outf: - outf.write(content) - print(filename, "=>", out_filename) - - -if __name__ == "__main__": - main() diff --git a/template/_base.html b/template/_base.html new file mode 100644 index 0000000..10e997d --- /dev/null +++ b/template/_base.html @@ -0,0 +1,15 @@ + + + + + + + + {% block title %}Koodiklinikan palkkakysely, {{year}}{% endblock %} + + +{% block body %}{% endblock %} +{% block footer %}{% endblock %} + + diff --git a/template/_table.html b/template/_table.html new file mode 100644 index 0000000..877654d --- /dev/null +++ b/template/_table.html @@ -0,0 +1,5 @@ +{% extends "_base.html" %} +{% block title %}Koodiklinikan palkkakysely, {{ year }}{% endblock %} +{% block body %} + {{ table_html|safe }} +{% endblock %} diff --git a/template/index.html b/template/index.html index 65cfc93..c1fb5e6 100644 --- a/template/index.html +++ b/template/index.html @@ -1,44 +1,37 @@ - - - - - - - - Koodiklinikan palkkakysely, {{year}} - - -

Koodiklinikan palkkakysely, {{year}}

-

Tunnusluvut

- -

Työkalut

- -

Data

- - - - +{% extends "_base.html" %} +{% block title %}Koodiklinikan palkkakysely, {{ year }}{% endblock %} +{% block body %} +

Koodiklinikan palkkakysely, {{ year }}

+

Tunnusluvut

+ +

Työkalut

+ +

Data

+ +{% endblock %} +{% block footer %} + +{% endblock %} diff --git a/template/style.css b/template/style.css index 78f7862..a5ee92c 100644 --- a/template/style.css +++ b/template/style.css @@ -1,10 +1,27 @@ body { - max-width: 650px; - margin: 40px auto; padding: 0 10px; font: 18px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; } +body.static-body { + max-width: 650px; + margin: 40px auto; +} + +body.table-body { + font-size: 14px; + line-height: 1.3; +} + +body.table-body table { + border-collapse: collapse; +} + +body.table-body td, body.table-body th { + padding: 0.3em; + border: 1px solid #999; +} + h1, h2, h3 { line-height: 1.2 }