Compare commits

..

7 Commits

Author SHA1 Message Date
e4bd1bbc40 change the scheduler interval stuff 2026-03-20 16:08:32 +01:00
1fa8b21882 make flask run in seperate threads 2026-03-20 16:04:18 +01:00
61f6070729 Update main.py 2026-03-20 15:58:17 +01:00
Valentijn
5f841ddbf9 forgot to add env file to compose 2026-03-20 14:40:05 +01:00
Valentijn
11a91eb213 oops forgot that 2026-03-20 14:38:40 +01:00
Valentijn
8d80985d79 indentation issues 2026-03-20 14:36:02 +01:00
Valentijn
069a2d2c63 added compose 2026-03-20 14:33:48 +01:00
3 changed files with 103 additions and 4 deletions

82
API.py
View File

@@ -78,4 +78,84 @@ class Webserver:
def run(self):
print(f"🚀 Starting server on {self.ip}:{self.port}")
self.app.run(host=self.ip, port=self.port)
from flask import Flask, Response
from icalendar import Calendar, Event
from datetime import datetime
import pytz
import uuid
class Webserver:
def __init__(self, ip, port, db_instance):
self.ip = ip
self.port = port
self.db = db_instance
self.app = Flask(__name__)
self.tz = pytz.timezone("Europe/Amsterdam")
self._register_routes()
def _register_routes(self):
self.app.add_url_rule("/", "index", lambda: "Calendar server running ✅")
self.app.add_url_rule("/calendar.ics", "calendar", self._calendar_endpoint)
def _fetch_shifts(self):
con = self.db._get_connection()
cur = con.cursor()
cur.execute("""
SELECT shift_start, shift_end, department, description
FROM shifts
ORDER BY shift_start ASC
""")
rows = cur.fetchall()
con.close()
shifts = []
for row in rows:
start_str, end_str, department, description = row
# Convert string → datetime
start = self._parse_datetime(start_str)
end = self._parse_datetime(end_str)
shifts.append({
"start": start,
"end": end,
"description": f"{description} ",
"department": f"{department} "
})
return shifts
def _parse_datetime(self, dt_str):
dt = datetime.fromisoformat(dt_str)
if dt.tzinfo is None:
dt = self.tz.localize(dt)
return dt
def _calendar_endpoint(self):
cal = Calendar()
cal.add('prodid', '-//Shift Calendar//example//')
cal.add('version', '2.0')
shifts = self._fetch_shifts()
for shift in shifts:
event = Event()
event.add('uid', str(uuid.uuid4()))
event.add('dtstart', shift["start"])
event.add('dtend', shift["end"])
event.add('summary', shift["department"])
event.add('description', shift["description"])
event.add('dtstamp', datetime.now(tz=self.tz))
cal.add_component(event)
return Response(cal.to_ical(), mimetype="text/calendar")
def run(self):
print(f"🚀 Starting server on {self.ip}:{self.port}")
self.app.run(host=self.ip, port=self.port, threaded=True)

17
docker-compose.yml Normal file
View File

@@ -0,0 +1,17 @@
services:
app:
build: .
container_name: pmt
ports:
- "8080:8080"
restart: unless-stopped
networks:
- proxy-network
volumes:
- "./data:/app/data"
env_file:
- .env
networks:
proxy-network:
external: true

View File

@@ -40,12 +40,14 @@ def main():
# Every hour at minute 0
scheduler = BackgroundScheduler()
scheduler = BackgroundScheduler(timezone="Europe/Amsterdam")
scheduler.add_job(
lambda: update_shifts(pmt, db),
trigger='cron',
minute=0
trigger="interval",
hours=1,
next_run_time=datetime.now()
)
scheduler.start()
webserver.run()