initializing
This commit is contained in:
35
layout.css
Normal file
35
layout.css
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
background-color: #185886;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
th, td {
|
||||||
|
text-align: center;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
font-size: 10pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Ubuntu';
|
||||||
|
font-size: 10pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr:nth-child(2n) {
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.abbreviations {
|
||||||
|
margin-top: 5px;
|
||||||
|
margin-right: 5px;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.colwidth {
|
||||||
|
width: 80px;
|
||||||
|
}
|
52
sched.py
Normal file
52
sched.py
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
from vatsched import *
|
||||||
|
|
||||||
|
|
||||||
|
stations = [
|
||||||
|
"EDWW_CTR",
|
||||||
|
"EDWW_A_CTR",
|
||||||
|
"EDWW_B_CTR",
|
||||||
|
"--",
|
||||||
|
"EDUU_O_CTR",
|
||||||
|
"EDUU_E_CTR",
|
||||||
|
"--",
|
||||||
|
"EDBB_S_APP",
|
||||||
|
"EDBB_U_APP",
|
||||||
|
"EDBB_S_DEP",
|
||||||
|
"EDBB_N_APP",
|
||||||
|
"--",
|
||||||
|
"EDDB_N_TWR",
|
||||||
|
"EDDB_S_TWR",
|
||||||
|
"EDDB_A_GND",
|
||||||
|
"EDDB_E_GND",
|
||||||
|
"EDDB_N_GND",
|
||||||
|
"EDDB_S_GND",
|
||||||
|
"EDDB_DEL",
|
||||||
|
"--",
|
||||||
|
"EDMM_CTR",
|
||||||
|
"EDMM_M_CTR",
|
||||||
|
"EDMM_G_CTR",
|
||||||
|
"--",
|
||||||
|
"EDDP_S_APP",
|
||||||
|
"EDDP_F_APP",
|
||||||
|
"EDDP_N_APP",
|
||||||
|
"--",
|
||||||
|
"EDDP_N_TWR",
|
||||||
|
"EDDP_S_TWR",
|
||||||
|
"EDDP_GND",
|
||||||
|
"EDDP_DEL",
|
||||||
|
"--",
|
||||||
|
"EDDC_APP",
|
||||||
|
"EDDC_TWR",
|
||||||
|
"EDDC_GND",
|
||||||
|
"EDDC_A_GND",
|
||||||
|
"--",
|
||||||
|
"EDDE_TWR",
|
||||||
|
"EDDE_GND",
|
||||||
|
"EDDE_A_GND"
|
||||||
|
]
|
||||||
|
|
||||||
|
displaydates = EveryXWeeksFromStartdate("26.02.2021", 4, 2)
|
||||||
|
#displaydates = EveryWeekday(1,2) # MONDAY = 0
|
||||||
|
#displaydates = WholeWeek()
|
||||||
|
|
||||||
|
createImage(displaydates, stations, 'test.jpg')
|
96
vatsched.py
Normal file
96
vatsched.py
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
import imgkit, requests
|
||||||
|
from dateutil.parser import parse
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
|
abbreviations = {}
|
||||||
|
|
||||||
|
def EveryXWeeksFromStartdate(startdate, x, numberofdates = 1):
|
||||||
|
startdate = parse(startdate)
|
||||||
|
days = []
|
||||||
|
while (len(days) < numberofdates):
|
||||||
|
startdate += timedelta(days=x*7)
|
||||||
|
if(datetime.today() <= startdate):
|
||||||
|
days.append(startdate)
|
||||||
|
return days
|
||||||
|
|
||||||
|
def EveryWeekday(weekday, numberofdates=1):
|
||||||
|
startdate = datetime.today() + timedelta((weekday - datetime.today().weekday()) % 7)
|
||||||
|
days = []
|
||||||
|
while(len(days) < numberofdates):
|
||||||
|
days.append(startdate)
|
||||||
|
startdate += timedelta(7)
|
||||||
|
return days
|
||||||
|
|
||||||
|
def WholeWeek(shift = 0):
|
||||||
|
days=[]
|
||||||
|
startdate = datetime.today() + timedelta(shift)
|
||||||
|
for i in range(0,7):
|
||||||
|
days.append(startdate + timedelta(i))
|
||||||
|
return days
|
||||||
|
|
||||||
|
|
||||||
|
def getDatePositionData(station, date, bookings):
|
||||||
|
global abbreviations
|
||||||
|
text = []
|
||||||
|
for booking in bookings[station]:
|
||||||
|
if date.date() == booking['starts_at'].date():
|
||||||
|
abbr = booking['firstname'][:2] + booking['lastname'].split(" ")[-1][:2]
|
||||||
|
abbreviations[abbr] = booking['firstname'] + " " + booking['lastname']
|
||||||
|
text.append(abbr + " " + booking['starts_at'].strftime("%H") + "-" + booking['ends_at'].strftime("%H"))
|
||||||
|
if len(text) < 1:
|
||||||
|
text.append("--")
|
||||||
|
return "<br>".join(text)
|
||||||
|
|
||||||
|
def maketable(stations, displaydates, bookings):
|
||||||
|
global abbreviations
|
||||||
|
text = "<table><tr><th>Stationen</th>"
|
||||||
|
|
||||||
|
for date in displaydates:
|
||||||
|
text += "<th class="">%s</th>" % (date.strftime("%a %d.%m."))
|
||||||
|
|
||||||
|
text += "</tr>"
|
||||||
|
text += "<tr><td colspan='%d'></td></tr>" % (len(displaydates) + 1)
|
||||||
|
|
||||||
|
for station in stations:
|
||||||
|
if station == "--":
|
||||||
|
text += "<tr><td colspan='%d' style='border-bottom: 0'></td></tr>" % (len(displaydates) + 1)
|
||||||
|
text += "<tr><td colspan='%d' style='border-top: 0'></td></tr>" % (len(displaydates) + 1)
|
||||||
|
continue
|
||||||
|
datestext = ""
|
||||||
|
for date in displaydates:
|
||||||
|
datestext += "<td>%s</td>" % (getDatePositionData(station, date, bookings))
|
||||||
|
text += "<tr><td style='text-align: left'>%s</td>%s</tr>" % (station, datestext)
|
||||||
|
|
||||||
|
text += "</table> <div class='abbreviations'>"
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
for key in sorted(abbreviations.keys()):
|
||||||
|
text += "<div class='abbrv'><span>%s:</span> %s</div>" % (key, abbreviations[key])
|
||||||
|
i += 1
|
||||||
|
if i > 4:
|
||||||
|
text += "</div><div class='abbreviations'>"
|
||||||
|
i = 0
|
||||||
|
return text + "</div>"
|
||||||
|
|
||||||
|
|
||||||
|
def createImage(displaydates, stations, filename):
|
||||||
|
rawdata = fetchData(displaydates[0], displaydates[-1])
|
||||||
|
relbookings = {}
|
||||||
|
for station in stations:
|
||||||
|
relbookings[station] = []
|
||||||
|
|
||||||
|
for datum in rawdata:
|
||||||
|
if datum['station']['ident'] in stations:
|
||||||
|
relbookings[datum['station']['ident']].append({'starts_at': parse(datum['starts_at']), 'ends_at': parse(datum['ends_at']), 'lastname': datum['controller']['lastname'], 'firstname': datum['controller']['firstname']})
|
||||||
|
|
||||||
|
text = maketable(stations, displaydates, relbookings)
|
||||||
|
css = 'layout.css'
|
||||||
|
config = imgkit.config(wkhtmltoimage='C:/Program Files/wkhtmltopdf/bin/wkhtmltoimage.exe')
|
||||||
|
options = {'width': (100 + 75 * len(displaydates)), 'disable-smart-width': ''}
|
||||||
|
imgkit.from_string(text, filename, css=css, config=config, options=options)
|
||||||
|
return
|
||||||
|
|
||||||
|
def fetchData(startdate = datetime.today(), enddate = (datetime.today() + timedelta(1))):
|
||||||
|
url = 'https://vatsim-germany.org/api/booking/atc/daterange/%s/%s' % (startdate.strftime("%d.%m.%Y"), enddate.strftime("%d.%m.%Y"))
|
||||||
|
r = requests.get(url=url,headers={'X-Requested-With': 'XMLHttpRequest'})
|
||||||
|
return r.json()
|
Reference in New Issue
Block a user