""" Paramecio2fm is a series of wrappers for Flask, mako and others and construct a simple headless cms. Copyright (C) 2023 Antonio de la Rosa Caballero This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . """ from flask import Flask, session, url_for, request, send_file, abort from settings import config from importlib import import_module import os import sys import inspect from paramecio2.libraries.datetime import set_timezone try: import ujson as json except: import json swagger_app=False if hasattr(config, 'swagger_app'): swagger_app=config.swagger_app def start_app(): set_timezone() app=Flask(__name__, static_url_path=config.static_url_path, static_folder=config.static_folder) app.secret_key=config.secret_key try: app.json.sort_keys=False except: app.config['JSON_SORT_KEYS']=False application_root='/' if hasattr(config, 'application_root'): #print(config.application_root) application_root=config.application_root app.config.update( APPLICATION_ROOT=application_root ) #app.config['APPLICATION_ROOT']=application_root if hasattr(config, 'json_sort_keys'): app.config.update( JSON_SORT_KEYS=config.json_sort_keys ) if hasattr(config, 'server_name'): app.config.update( SERVER_NAME=config.server_name ) workdir=os.getcwd() arr_module_path={} # Load blueprints from json file (for installed modules using paramecio2 utilities) if os.path.isfile('./settings/modules.json'): with open('./settings/modules.json') as f: json_apps=json.loads(f.read()) config.apps=json_apps | config.apps for key_app, added_app in config.apps.items(): controller_path=import_module(added_app[0]) controller_base=os.path.dirname(controller_path.__file__) dir_controllers=os.listdir(controller_base) app_name=getattr(controller_path, added_app[1]) #print(os.path.dirname(sys.modules[added_app[0]].__file__)) #print(key_app) arr_module_path[key_app]=os.path.dirname(sys.modules[added_app[0]].__file__) for controller in dir_controllers: if controller.find('.py')!=-1 and not controller.startswith('__'): controller_py=controller.replace('.py', '') module_app=added_app[0]+'.'+controller_py a=import_module(module_app) #arr_module_path[key_app]=os.path.dirname(sys.modules[module_app].__file__) if config.application_root=='/': app.register_blueprint(app_name, url_prefix=added_app[2]) else: app.register_blueprint(app_name, url_prefix=config.application_root+added_app[2][1:]) """ module_app=config.apps[added_app][0] a=import_module(module_app) #print(added_app, file=sys.stdout) app_name=getattr(a, config.apps[added_app][1]) app.register_blueprint(app_name, url_prefix=config.apps[added_app][2]) arr_module_path[added_app]=os.path.dirname(sys.modules[module_app].__file__) """ #Add media files support. Only for development. @app.route(config.application_root+'mediafrom//') def send_media_file(module, media_file): file_path=workdir+'/themes/'+config.theme+'/media/'+module+'/'+media_file if not os.path.isfile(file_path): #file_path=workdir+'/modules/'+module+'/media/'+media_file file_path=arr_module_path[module]+'/media/'+media_file if not os.path.isfile(file_path): abort(404) return send_file(file_path) if swagger_app: from flasgger import Swagger swagger=Swagger(app) return app