frontend.py 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import os
  2. from pyramid.renderers import render_to_response
  3. from pyramid.config import Configurator
  4. from tracim_backend.extensions import APP_LIST
  5. from tracim_backend.exceptions import PageNotFound
  6. from tracim_backend.lib.core.application import ApplicationApi
  7. from tracim_backend.lib.utils.utils import Color
  8. from tracim_backend.views import BASE_API_V2
  9. from tracim_backend.lib.utils.request import TracimRequest
  10. from tracim_backend.views.controllers import Controller
  11. import spectra
  12. INDEX_PAGE_NAME = 'index.mak'
  13. APP_FRONTEND_PATH = 'app/{minislug}.app.js'
  14. class FrontendController(Controller):
  15. def __init__(self, dist_folder_path: str):
  16. self.dist_folder_path = dist_folder_path
  17. def _get_index_file_path(self):
  18. index_file_path = os.path.join(self.dist_folder_path, INDEX_PAGE_NAME)
  19. if not os.path.exists(index_file_path):
  20. raise FileNotFoundError()
  21. return index_file_path
  22. def not_found_view(self, context, request: TracimRequest):
  23. if request.path.startswith(BASE_API_V2):
  24. raise PageNotFound('{} is not a valid path'.format(request.path)) from context # nopep8
  25. return self.index(context, request)
  26. def index(self, context, request: TracimRequest):
  27. app_config = request.registry.settings['CFG']
  28. # TODO - G.M - 2018-08-07 - Refactor autogen valid app list for frontend
  29. frontend_apps = []
  30. app_api = ApplicationApi(
  31. app_list=APP_LIST,
  32. )
  33. applications = app_api.get_all()
  34. for app in applications:
  35. app_frontend_path = APP_FRONTEND_PATH.replace('{minislug}',
  36. app.minislug) # nopep8
  37. app_path = os.path.join(self.dist_folder_path,
  38. app_frontend_path) # nopep8
  39. if os.path.exists(app_path):
  40. frontend_apps.append(app)
  41. return render_to_response(
  42. self._get_index_file_path(),
  43. {
  44. 'colors': {
  45. 'primary': Color(app_config.APPS_COLORS['primary']),
  46. },
  47. 'applications': frontend_apps,
  48. }
  49. )
  50. def bind(self, configurator: Configurator) -> None:
  51. configurator.add_notfound_view(self.not_found_view)
  52. # index.html for /index.html and /
  53. configurator.add_route('root', '/', request_method='GET')
  54. configurator.add_view(self.index, route_name='root')
  55. configurator.add_route('index', INDEX_PAGE_NAME, request_method='GET')
  56. configurator.add_view(self.index, route_name='index')
  57. for dirname in os.listdir(self.dist_folder_path):
  58. configurator.add_static_view(
  59. name=dirname,
  60. path=os.path.join(self.dist_folder_path, dirname)
  61. )