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
« prev ^ index » next coverage.py v7.10.4, created at 2025-08-20 00:55 +0200
1"""
2assets.py
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.
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"""
14import os
15from flask import url_for, send_from_directory
16from .paths import ROOT_DIR, STATIC_PATH
19def _static_exists(filename: str) -> bool:
20 return os.path.exists(os.path.join(STATIC_PATH, filename))
23def _root_exists(filename: str) -> bool:
24 return os.path.exists(os.path.join(ROOT_DIR, filename))
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 ''
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'
43def tab_icon_camera() -> str:
44 return _url_for_static_or_asset('cameraicon.webp') or brand_icon_url()
47def tab_icon_gallery() -> str:
48 return _url_for_static_or_asset('galleryicon.png') or brand_icon_url()
51def tab_icon_map() -> str:
52 return _url_for_static_or_asset('mapicon.png') or brand_icon_url()
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)
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 }