import click from app.settings import app_cfg from app.utils.file_utils import load_text, write_json, write_text from os.path import join @click.command('info') @click.option('-g', '--graph', 'opt_graph_path', required=True, help='Graph name') @click.option('-o', '--output', 'opt_output_dir', required=True, default=app_cfg.DIR_EXPORTS, help='Output dir') @click.pass_context def cli(ctx, opt_graph_path, opt_output_dir): """Export a graph""" # ------------------------------------------------ # imports from app.sql.common import db, Session, Graph, Page, Tile # ------------------------------------------------ # generate HTML for index and all pages session = Session() graph = session.query(Graph).filter(Graph.path == opt_graph_path).first() if graph is None: print(f"Not a graph: {opt_graph_path}") return print(f"Output site to {opt_output_dir}") site_data = { 'graph': sanitize_graph(graph.toSiteJSON()) } index_html = load_text(join(app_cfg.DIR_STATIC, 'site.html'), split=False) write_json(site_data, join(opt_output_dir, graph.path, 'index.json'), default=str) # write_index(graph, None, index_html, join(opt_output_dir, graph.path, 'index.html')) home_page = site_data['graph']['home_page'] write_text(f'', join(opt_output_dir, graph.path, 'index.html')) index_path = "" for page in graph.pages: page_path = f'{graph.path}/{page.path}' if page.id == graph.home_page_id: index_path = page_path print(f'/{page_path} [index]') else: print(f'/{page_path}') write_index(graph, page, index_html, join(opt_output_dir, graph.path, page.path, 'index.html')) # ------------------------------------------------ # generate javascript... # NODE_ENV=production webpack --config ./webpack.config.site.js -o ./data_store/exports/asdf/bundle.js def write_index(graph, page, index_html, fp_out): if page is None: page_title = graph.title else: page_title = page.title index_html = index_html.replace('BUNDLE_PATH', join('/', graph.path, 'bundle.js')) index_html = index_html.replace('PAGE_TITLE', page_title) write_text(index_html, fp_out) def sanitize_graph(graph): page_path_lookup = {} page_lookup = {} for page in graph['pages']: page_path_lookup[page['id']] = join('/', graph['path'], page['path']) for page in graph['pages']: sanitize_page(page) for tile in page['tiles']: if tile['target_page_id']: if tile['target_page_id'] == -1: tile['href'] = tile['external_link_url'] elif tile['target_page_id'] > 0: tile['href'] = page_path_lookup[tile['target_page_id']] sanitize_tile(tile) page_path = page_path_lookup[page['id']] page_lookup[page_path] = page graph['pages'] = page_lookup graph['home_page'] = page_path_lookup[graph['home_page_id']] return graph def sanitize_page(data): if 'created_at' in data: del data['created_at'] if 'updated_at' in data: del data['updated_at'] if 'graph_id' in data: del data['graph_id'] def sanitize_tile(data): if 'created_at' in data: del data['created_at'] if 'updated_at' in data: del data['updated_at'] if 'username' in data: del data['username'] if 'graph_id' in data: del data['graph_id'] if 'page_id' in data: del data['page_id'] if 'target_page_id' in data: del data['target_page_id']