added and integrated background daemon and Dockerfile from my other project studywatch

This commit is contained in:
2026-08-16 23:09:28 +02:00
parent 8fcd8db07c
commit 88fac3289d
6 changed files with 80 additions and 4 deletions
+3
View File
@@ -20,3 +20,6 @@ CALDAV_PASSWORD=
# prefix to mark event participants in calendar event description like "@max mustermann\n"
CALDAV_PARTICIPANT_PREFIX=@
# delay between attempts to sync data from servers (int)
REFETCH_SECONDS=300
+14
View File
@@ -0,0 +1,14 @@
FROM python:3-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/* # install curl for healthcheck
COPY . .
CMD [ "python", "./app.py" ]
+5 -2
View File
@@ -5,6 +5,7 @@ logging.basicConfig(level=logging.INFO)
from flask import Flask, send_from_directory, jsonify
import sys, os
from src.fetch_job import BGFetchJob
from src.score import get_social_scores_dict
from src.person import Person
from src.addressbook import Addressbook
@@ -12,10 +13,12 @@ from src.addressbook import Addressbook
from src import config
app = Flask(__name__)
addrbook = Addressbook()
addrbook.update_cross_refs()
# addrbook.print_people()
#addrbook.print_events()
daemon = BGFetchJob()
daemon.run(addrbook)
# root
@app.route("/")
+24
View File
@@ -36,7 +36,31 @@ class Addressbook:
sys.exit(1)
logger.info(f"{len(self.events)} Events synced from calDAV server!")
def update(self):
logger = logging.getLogger(__name__)
try:
self.sync_with_carddav()
logger.info(f"{len(self.people)} Contacts synced from cardDAV server!")
except Exception:logger.exception("Failed to sync contacts from cardDAV server!")
try:
self.sync_with_caldav()
logger.info(f"{len(self.events)} Events synced from calDAV server!")
except Exception: logger.exception("Failed to sync events from calDAV server!")
self.update_cross_refs()
logger.info("Sync complete.")
def clear_cross_refs(self):
for person in self.people:
person.seen_at = []
for event in self.events:
event.participants = []
def update_cross_refs(self):
self.clear_cross_refs()
for event in self.events:
description = event.ical.get("description")
if description:
+4 -2
View File
@@ -25,11 +25,13 @@ try:
CALDAV_USER = _env("CALDAV_USER", str)
CALDAV_PASSWORD = _env("CALDAV_PASSWORD", str)
CALDAV_PARTICIPANT_PREFIX = _env("CALDAV_PARTICIPANT_PREFIX", str)
REFETCH_SECONDS = _env("REFETCH_SECONDS", int)
_logger.info("Config loaded!")
except Exception:
_logger.exception("Failed to load config from .env!")
sys.exit(1)
if FREQUENCY_TARGET_WEEKLY <= 0 or DIVERSITY_TARGET_MONTHLY <= 0:
raise ValueError("Floatingpoint options must be > 0.")
if FREQUENCY_TARGET_WEEKLY <= 0 or DIVERSITY_TARGET_MONTHLY <= 0 or REFETCH_SECONDS <= 0:
raise ValueError("Floatingpoint and integer options must be > 0.")
+30
View File
@@ -0,0 +1,30 @@
import time, logging, threading
from src import config
from src.addressbook import Addressbook
logger = logging.getLogger(__name__)
def background_fetch_job(addressbook):
logging.getLogger(__name__).info("Daemon up!")
while True:
time.sleep(config.REFETCH_SECONDS)
addressbook.update()
class BGFetchJob:
def __init__(self):
self.thread = None
def run(self, addressbook):
logger.info("Summoning fetch job daemon")
self.thread = threading.Thread(target=background_fetch_job, args=(addressbook,), daemon=True)
self.thread.start()
def is_alive(self):
if self.thread:
return self.thread.is_alive()
else:
return None