summaryrefslogtreecommitdiff
path: root/cli/app/controllers/page_controller.py
blob: 587c61d49b3d658f78c7b72db5ac6a2d04640d7d (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
from flask import request, jsonify, redirect
from flask_classful import route
from werkzeug.datastructures import MultiDict

from app.sql.common import db, Session
from app.sql.models.graph import Graph
from app.sql.models.page import Page, PageForm
from app.sql.models.tile import Tile
from app.controllers.crud_controller import CrudView

class PageView(CrudView):
  model = Page
  form = PageForm

  def where(self, query, args):
    graph_id = args.get('graph_id', default=None)
    if graph_id is not None:
      query = query.filter(Page.graph_id == int(graph_id))
    return query

  def on_create(self, session, form, item):
    item.settings = form['settings']
    item.graph_id = int(form['graph_id'])

  def on_update(self, session, form, item):
    item.settings = form['settings']

  def on_destroy(self, session, item):
    session.query(Tile).filter(Tile.page_id == item.id).delete(synchronize_session=False)

  @route('/<int:page_id>/sort/', methods=['POST'])
  def set_sort_order(self, page_id):
    session = Session()
    page = session.query(Page).get(page_id)
    if not page:
      session.close()
      return jsonify({
        'status': 'error',
        'error': 'page not found'
      })

    for i, tile_id in enumerate(request.json):
      tile = session.query(Tile).get(tile_id)
      tile.sort_order = i
      session.add(tile)
    session.commit()

    result = {
      'status': 'ok',
      # 'res': page.toFullJSON() if hasattr(page, 'toFullJSON') else page.toJSON(),
    }
    session.close()
    return jsonify(result)

  @route('/name/<graph_path>/<page_path>', methods=['GET'])
  def get_name(self, graph_path: str, page_path: str):
    """
    Fetch a single {model}.
    """
    session = Session()
    graph = session.query(Graph).filter(Graph.path == graph_path).first()
    if not graph:
      session.close()
      return jsonify({
        'status': 'error',
        'error': 'graph not found'
      })

    page = session.query(Page).filter(Page.graph_id == graph.id, Page.path == page_path).first()
    if not page:
      session.close()
      return jsonify({
        'status': 'error',
        'error': 'page not found'
      })

    result = {
      'status': 'ok',
      'res': page.toFullJSON() if hasattr(page, 'toFullJSON') else page.toJSON(),
    }
    session.close()
    return jsonify(result)