Coverage for app_modules/assets.py: 74%

35 statements  

« prev     ^ index     » next       coverage.py v7.10.4, created at 2025-08-20 00:55 +0200

1""" 

2assets.py 

3 

4Purpose: 

5 Manage icon/asset URL helpers and the `/assets` route that serves a limited 

6 allowlist of root-level files for backward compatibility. Also injects icon 

7 URLs into templates via a context processor. 

8 

9Exports: 

10 - register_assets(app): registers the /assets route and icon context processor 

11 - brand_icon_url(), tab icon helpers, and internal existence checks 

12""" 

13 

14import os 

15from flask import url_for, send_from_directory 

16from .paths import ROOT_DIR, STATIC_PATH 

17 

18 

19def _static_exists(filename: str) -> bool: 

20 return os.path.exists(os.path.join(STATIC_PATH, filename)) 

21 

22 

23def _root_exists(filename: str) -> bool: 

24 return os.path.exists(os.path.join(ROOT_DIR, filename)) 

25 

26 

27def _url_for_static_or_asset(filename: str) -> str: 

28 if _static_exists(filename): 

29 return url_for('static', filename=filename) 

30 if _root_exists(filename): 

31 return url_for('assets', filename=filename) 

32 return '' 

33 

34 

35def brand_icon_url() -> str: 

36 for name in ['webicon180x180.png', 'logocebav2.webp', 'logoceba.webp']: 

37 url = _url_for_static_or_asset(name) 

38 if url: 

39 return url 

40 return _url_for_static_or_asset('jelen.png') or '/favicon.ico' 

41 

42 

43def tab_icon_camera() -> str: 

44 return _url_for_static_or_asset('cameraicon.webp') or brand_icon_url() 

45 

46 

47def tab_icon_gallery() -> str: 

48 return _url_for_static_or_asset('galleryicon.png') or brand_icon_url() 

49 

50 

51def tab_icon_map() -> str: 

52 return _url_for_static_or_asset('mapicon.png') or brand_icon_url() 

53 

54 

55def register_assets(app): 

56 @app.route('/assets/<path:filename>') 

57 def assets(filename: str): 

58 allowed = { 

59 'logoceba.webp', 'logocebav2.webp', 

60 'galleryicon.png', 'mapicon.png', 'cameraicon.webp', 

61 'webicon180x180.png', 'webicon32x32.png', 'webicon16x16.png', 

62 'camera_render.png', 'camera_render1.png' 

63 } 

64 if filename not in allowed: 

65 return '', 404 

66 return send_from_directory(ROOT_DIR, filename) 

67 

68 @app.context_processor 

69 def inject_icons(): 

70 return { 

71 'ICON_BRAND': brand_icon_url(), 

72 'ICON_CAM': tab_icon_camera(), 

73 'ICON_GALLERY': tab_icon_gallery(), 

74 'ICON_MAP': tab_icon_map(), 

75 } 

76 

77