-
Notifications
You must be signed in to change notification settings - Fork 0
/
night_summary.py
105 lines (75 loc) · 2.65 KB
/
night_summary.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import markdown
import jinja2
from weasyprint import HTML, CSS
from argparse import ArgumentParser
from sqlalchemy import create_engine
import yaml
import pandas as pd
from plots import plot_run_timeline, plot_qla
from datetime import datetime, timedelta
from qla import get_qla_data
import os
def connect_to_database(user, password, host, database):
spec = 'mysql+pymysql://{user}:{password}@{host}/{database}'
return create_engine(spec.format(
user=user,
password=password,
host=host,
database=database
))
def read_run(night, db):
query = (
' SELECT fNight,fRunID,fSourceName,fOnTime,fRunTypeName,fRunStart,fRunStop'
' FROM RunInfo'
' LEFT JOIN Source'
' ON RunInfo.fSourceKEY = Source.fSourceKEY'
' LEFT JOIN RunType'
' ON RunInfo.fRunTypeKEY = RunType.fRunTypeKEY'
' WHERE fNight = {}'.format(night)
)
runs = pd.read_sql(query, db, parse_dates=['fRunStart', 'fRunStop'])
return runs
def load_template(filename):
with open(filename) as f:
return jinja2.Template(f.read())
def html2pdf(html, outputfile, stylesheets=None):
document = HTML(string=html)
with open(outputfile, 'wb') as f:
document.write_pdf(f, stylesheets=stylesheets)
parser = ArgumentParser()
parser.add_argument('--night', '-n', dest='night', default=None)
parser.add_argument('--config', '-c', dest='config', default='config.yaml')
parser.add_argument('--outputfile', '-o', dest='outputfile', default=None)
def build_summary(outputfile, template_file, db, night=None, stylesheets=None):
if night is None:
night = (datetime.today() - timedelta(days=2)).strftime('%Y%m%d')
template = load_template(template_file)
runs = read_run(night, db)
qla_data = get_qla_data(night, db)
os.makedirs('build', exist_ok=True)
plot_run_timeline(runs, 'build/runs.svg')
plot_qla(qla_data, 'build/qla.svg')
md = template.render(
night=night,
run_plot='build/runs.svg',
qla_plot='build/qla.svg',
)
html = markdown.markdown(md, extensions=['markdown.extensions.tables'])
document = HTML(string=html, base_url='.')
outputfile = outputfile or 'fact_summary_{}.pdf'.format(night)
document.write_pdf(outputfile, stylesheets=stylesheets)
def main():
args = parser.parse_args()
with open(args.config) as f:
config = yaml.safe_load(f)
db = connect_to_database(**config)
style = CSS('style.css')
build_summary(
args.outputfile,
template_file='template.md',
night=args.night,
db=db,
stylesheets=[style],
)
if __name__ == '__main__':
main()