Coverage for src / local_deep_research / web / utils / route_decorators.py: 100%

21 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-14 23:55 +0000

1"""Route decorators for common patterns in Flask route handlers.""" 

2 

3import functools 

4 

5from flask import jsonify, session 

6from loguru import logger 

7 

8from ...database.session_context import get_user_db_session 

9from ...settings import SettingsManager 

10 

11 

12def with_user_session(include_settings_manager=True): 

13 """Decorator that provides db_session and optionally SettingsManager. 

14 

15 Extracts username from session["username"], opens a database session, 

16 and optionally creates a SettingsManager. Injects them as keyword arguments. 

17 

18 Requires @login_required to be applied first (outermost) to guarantee 

19 session["username"] exists. Database session errors are caught and 

20 returned as 500 JSON responses. 

21 

22 Args: 

23 include_settings_manager: If True (default), also inject 'settings_manager'. 

24 

25 Usage: 

26 @with_user_session() 

27 def my_route(db_session, settings_manager): 

28 ... 

29 

30 @with_user_session(include_settings_manager=False) 

31 def my_route(db_session): 

32 ... 

33 """ 

34 

35 def decorator(func): 

36 @functools.wraps(func) 

37 def wrapper(*args, **kwargs): 

38 username = session["username"] 

39 try: 

40 with get_user_db_session(username) as db_session: 

41 kwargs["db_session"] = db_session 

42 if include_settings_manager: 

43 kwargs["settings_manager"] = SettingsManager( 

44 db_session, owns_session=False 

45 ) 

46 return func(*args, **kwargs) 

47 except Exception: 

48 logger.exception("Database session error in {}", func.__name__) 

49 return jsonify({"error": "Database session unavailable"}), 500 

50 

51 return wrapper 

52 

53 return decorator