summaryrefslogtreecommitdiff
path: root/cli/commands/site/export.py
blob: c8e687ab204768fdc07db5b5706234480155a138 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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'))

  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']