Compare commits

..

No commits in common. "2db844c4b4b91ea8a2ac23e02d9390dfc01bc86c" and "0f45b7f73cbbb919cfa76f5a5ee57af9461896c5" have entirely different histories.

3 changed files with 22 additions and 53 deletions

41
app.py
View file

@ -5,7 +5,6 @@ Modularized version with Blueprints
import logging
import os
import socket
from flask import Flask
from flask_wtf.csrf import CSRFProtect
from models import db
@ -100,38 +99,12 @@ def create_app(config: dict | None = None) -> Flask:
app = create_app()
def get_lan_ip() -> str:
"""Ermittelt die LAN-IP-Adresse dieses Rechners (Best-Effort).
Öffnet einen UDP-Socket zu einer externen Adresse, um das ausgehende
Interface zu bestimmen es werden dabei keine Daten gesendet.
Fällt bei Fehlern auf 127.0.0.1 zurück.
"""
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
s.connect(('8.8.8.8', 80))
return s.getsockname()[0]
except OSError:
return '127.0.0.1'
finally:
s.close()
if __name__ == '__main__':
DEBUG = True
PORT = 5000
logger.info("=" * 50)
logger.info("Tipptrainer gestartet")
logger.info(f"Version: {app.config['APP_VERSION']}")
logger.info(f"Lektionen geladen: {len(app.config['LESSONS'])}")
logger.info("Debug-Info verfügbar unter: http://127.0.0.1:5000/debug")
logger.info("=" * 50)
# Banner genau einmal ausgeben: ohne Reloader sofort, mit Reloader nur
# im Worker-Prozess (WERKZEUG_RUN_MAIN), nicht im Supervisor.
if not DEBUG or os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
lan_ip = get_lan_ip()
logger.info("=" * 50)
logger.info("Tipptrainer gestartet")
logger.info(f"Version: {app.config['APP_VERSION']}")
logger.info(f"Lektionen geladen: {len(app.config['LESSONS'])}")
logger.info(f"Tipp-Training lokal: http://127.0.0.1:{PORT}")
logger.info(f"Tipp-Training im LAN: http://{lan_ip}:{PORT}")
logger.info(f"Debug-Info: http://127.0.0.1:{PORT}/debug")
logger.info("=" * 50)
app.run(debug=DEBUG, host='0.0.0.0', port=PORT)
app.run(debug=True, host='0.0.0.0', port=5000)

View file

@ -5,7 +5,7 @@ import unittest
import os
os.environ['FLASK_TESTING'] = 'true' # Set before importing app
from app import create_app, db
from app import app, db
from models import Progress, LessonProgress
from services.progress_service import ProgressService
@ -15,11 +15,10 @@ class TestProgressServiceIntegration(unittest.TestCase):
def setUp(self):
"""Setup: Test-App und In-Memory-Datenbank"""
self.app = create_app({
'TESTING': True,
'SQLALCHEMY_DATABASE_URI': 'sqlite:///:memory:',
'WTF_CSRF_ENABLED': False,
})
app.config['TESTING'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'
app.config['WTF_CSRF_ENABLED'] = False
self.app = app
self.app_context = self.app.app_context()
self.app_context.push()
db.create_all()
@ -260,12 +259,10 @@ class TestResolveCurrentLessonIndex(unittest.TestCase):
"""Tests für die zentrale Lektions-Auflösung (Resume + Validierung)."""
def setUp(self):
self.app = create_app({
'TESTING': True,
'SQLALCHEMY_DATABASE_URI': 'sqlite:///:memory:',
'WTF_CSRF_ENABLED': False,
})
self.app_context = self.app.app_context()
app.config['TESTING'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'
app.config['WTF_CSRF_ENABLED'] = False
self.app_context = app.app_context()
self.app_context.push()
db.create_all()

View file

@ -6,7 +6,7 @@ import os
os.environ['FLASK_TESTING'] = 'true' # Set before importing app
from datetime import timedelta, date
from app import create_app, db
from app import app, db
from models import LessonStatistic, DailyPractice
from services.statistics_service import StatisticsService
@ -16,11 +16,10 @@ class TestStatisticsServiceIntegration(unittest.TestCase):
def setUp(self):
"""Setup: Test-App und In-Memory-Datenbank"""
self.app = create_app({
'TESTING': True,
'SQLALCHEMY_DATABASE_URI': 'sqlite:///:memory:',
'WTF_CSRF_ENABLED': False,
})
app.config['TESTING'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'
app.config['WTF_CSRF_ENABLED'] = False
self.app = app
self.app_context = self.app.app_context()
self.app_context.push()
db.create_all()