summaryrefslogtreecommitdiff
path: root/cli/app
diff options
context:
space:
mode:
authorJules Laplace <julescarbon@gmail.com>2021-03-17 18:11:26 +0100
committerJules Laplace <julescarbon@gmail.com>2021-03-17 18:11:26 +0100
commitd165a0727e42349d935ab3ee287242f1e5029742 (patch)
treeb4fa68209127efdd4eb46c82eaef280535692611 /cli/app
parent92566ba17f5e921d5bff1f3fb4e4b0d92ca4fd39 (diff)
frontend. export/view button. interactivity sanity check
Diffstat (limited to 'cli/app')
-rw-r--r--cli/app/controllers/graph_controller.py11
-rw-r--r--cli/app/server/demo.py48
-rw-r--r--cli/app/server/web.py2
-rw-r--r--cli/app/settings/app_cfg.py7
-rw-r--r--cli/app/site/export.py23
5 files changed, 82 insertions, 9 deletions
diff --git a/cli/app/controllers/graph_controller.py b/cli/app/controllers/graph_controller.py
index 7efda73..fcca50a 100644
--- a/cli/app/controllers/graph_controller.py
+++ b/cli/app/controllers/graph_controller.py
@@ -7,6 +7,7 @@ from app.sql.models.graph import Graph, GraphForm
from app.sql.models.page import Page
from app.sql.models.tile import Tile
from app.controllers.crud_controller import CrudView
+from app.site.export import export_site
class GraphView(CrudView):
model = Graph
@@ -20,7 +21,7 @@ class GraphView(CrudView):
@route('/name/<graph_path>', methods=['GET'])
def get_name(self, graph_path: str):
"""
- Fetch a single {model}.
+ Fetch a single graph.
"""
session = Session()
item = session.query(self.model).filter(self.model.path == graph_path).first()
@@ -36,3 +37,11 @@ class GraphView(CrudView):
}
session.close()
return jsonify(result)
+
+ @route('/export/<graph_path>', methods=['GET'])
+ def export(self, graph_path: str):
+ export_site(opt_graph_path=graph_path)
+ result = {
+ 'status': 'ok',
+ }
+ return jsonify(result)
diff --git a/cli/app/server/demo.py b/cli/app/server/demo.py
new file mode 100644
index 0000000..847f95b
--- /dev/null
+++ b/cli/app/server/demo.py
@@ -0,0 +1,48 @@
+import os
+import logging
+import logging.handlers
+
+logger = logging.getLogger("")
+logger.setLevel(logging.DEBUG)
+handler = logging.handlers.RotatingFileHandler("flask.log",
+ maxBytes=3000000, backupCount=2)
+formatter = logging.Formatter(
+ '[%(asctime)s] {%(filename)s:%(lineno)d} %(levelname)s - %(message)s')
+handler.setFormatter(formatter)
+logger.addHandler(handler)
+logging.getLogger().addHandler(logging.StreamHandler())
+
+from flask import Flask, send_from_directory, request
+
+from app.settings import app_cfg
+
+def create_demo_app(script_info=None):
+ """
+ functional pattern for creating the flask app
+ """
+ logging.debug("Starting Swimmer demo server...")
+ app = Flask(__name__, static_folder=app_cfg.DIR_EXPORTS, static_url_path='/')
+ app.config['SERVER_NAME'] = app_cfg.DEMO_SERVER_NAME
+ app.url_map.strict_slashes = False
+
+ @app.errorhandler(404)
+ def not_found(error):
+ path, fn = os.path.split(request.path)
+ path = path[1:]
+ dir_path = os.path.join(app_cfg.DIR_EXPORTS, path)
+ if os.path.isfile(os.path.join(dir_path, fn)):
+ return send_from_directory(dir_path, fn)
+ if os.path.isfile(os.path.join(dir_path, fn, 'index.html')):
+ return send_from_directory(os.path.join(dir_path, fn), 'index.html')
+ return "404", 404
+
+ @app.route('/')
+ def serve_index():
+ return "Swimmer demo", 200
+
+ @app.route('/favicon.ico')
+ def favicon():
+ return send_from_directory(os.path.join(app_cfg.DIR_STATIC, 'img'),
+ 'favicon.ico', mimetype='image/vnd.microsoft.icon')
+
+ return app
diff --git a/cli/app/server/web.py b/cli/app/server/web.py
index 1a3b064..5eb172c 100644
--- a/cli/app/server/web.py
+++ b/cli/app/server/web.py
@@ -52,7 +52,7 @@ def create_app(script_info=None):
@app.route('/favicon.ico')
def favicon():
return send_from_directory(os.path.join(app.root_path, 'static/img/'),
- 'favicon.ico',mimetype='image/vnd.microsoft.icon')
+ 'favicon.ico', mimetype='image/vnd.microsoft.icon')
@app.shell_context_processor
def shell_context():
diff --git a/cli/app/settings/app_cfg.py b/cli/app/settings/app_cfg.py
index af6cf89..4aa4bee 100644
--- a/cli/app/settings/app_cfg.py
+++ b/cli/app/settings/app_cfg.py
@@ -15,9 +15,10 @@ codecs.register(lambda name: codecs.lookup('utf8') if name == 'utf8mb4' else Non
LOG = logging.getLogger('swimmer')
# -----------------------------------------------------------------------------
-# .env config for keys
+# .env config
# -----------------------------------------------------------------------------
# Project directory
+
SELF_CWD = os.path.dirname(os.path.realpath(__file__)) # this file
DIR_PROJECT_ROOT = str(Path(SELF_CWD).parent.parent.parent)
@@ -31,14 +32,13 @@ load_dotenv(dotenv_path=fp_env)
# -----------------------------------------------------------------------------
CLICK_GROUPS = {
- # 'process': 'commands/process',
'site': 'commands/site',
'admin': 'commands/admin',
'db': '',
'flask': '',
+ 'demo': '',
}
-
# -----------------------------------------------------------------------------
# File I/O
# -----------------------------------------------------------------------------
@@ -86,6 +86,7 @@ except Exception as e:
# -----------------------------------------------------------------------------
SERVER_NAME = os.getenv('SERVER_NAME') or '0.0.0.0:5000'
+DEMO_SERVER_NAME = os.getenv('DEMO_SERVER_NAME') or '0.0.0.0:3000'
HTTP_EXTERNAL_HOST = os.getenv('HTTP_EXTERNAL_HOST') or f"http://{SERVER_NAME}"
# -----------------------------------------------------------------------------
diff --git a/cli/app/site/export.py b/cli/app/site/export.py
index d513286..c301a60 100644
--- a/cli/app/site/export.py
+++ b/cli/app/site/export.py
@@ -8,7 +8,7 @@ import os
from app.sql.common import db, Session, Graph, Page, Tile
from distutils.dir_util import copy_tree
-def export_site(ctx, opt_graph_path, opt_output_dir):
+def export_site(opt_graph_path, opt_output_dir=app_cfg.DIR_EXPORTS, opt_build_js=False):
"""Export a graph"""
# ------------------------------------------------
@@ -42,6 +42,7 @@ def export_site(ctx, opt_graph_path, opt_output_dir):
home_page = site_data['graph']['home_page']
if home_page is None:
print("Homepage not set! Shift-click a page on the graph to make it the homepage.")
+ session.close()
return
write_text(f'<meta http-equiv="refresh" content="0; url={home_page}">', join(graph_dir, 'index.html'))
@@ -55,8 +56,10 @@ def export_site(ctx, opt_graph_path, opt_output_dir):
print(f'/{page_path}')
write_index(graph, page, index_html, join(graph_dir, page.path, 'index.html'))
- build_javascript(graph_dir)
+ if opt_build_js or not os.path.exists(f"{graph_dir}/bundle.js"):
+ build_javascript(graph_dir)
+ session.close()
print("Site export complete!")
print(f"Graph exported to: {graph_dir}")
@@ -86,22 +89,34 @@ def sanitize_graph(graph):
page_path_lookup[page['id']] = page_path
for page in graph['pages']:
sanitize_page(page)
- if page['id'] == 12:
- print(page)
for tile in page['tiles']:
if tile['target_page_id']:
if tile['target_page_id'] == -1:
tile['href'] = tile['settings']['external_link_url']
elif tile['target_page_id'] > 0:
tile['href'] = page_path_lookup[tile['target_page_id']]
+ if 'url' in tile['settings'] and tile['settings']['url'].startswith('/static'):
+ tile['settings']['url'] = '/' + graph['path'] + tile['settings']['url']
sanitize_tile(tile)
page_path = page_path_lookup[page['id']]
page_lookup[page_path] = page
+ for upload in graph['uploads']:
+ sanitize_upload(upload)
+ if upload['url'].startswith('/static'):
+ upload['url'] = '/' + graph['path'] + upload['url']
# print(page_lookup['/asdf/testttt'])
graph['pages'] = page_lookup
graph['home_page'] = page_path_lookup[graph['home_page_id']]
return graph
+def sanitize_upload(data):
+ if 'created_at' in data:
+ del data['created_at']
+ if 'username' in data:
+ del data['username']
+ if 'graph_id' in data:
+ del data['graph_id']
+
def sanitize_page(data):
if 'created_at' in data:
del data['created_at']