blob: e1788586be85dc551206a741aa3d379ea1c40432 (
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
"""
Rhizi REST web API:
- make use of rz_kernel for core logic execution
- make use of rz_api_common for common API logic
"""
from flask import Flask
from flask import escape
from flask import jsonify
from flask import make_response
from flask import redirect
from flask import render_template
from flask import request
from flask import send_from_directory
from flask import session
from flask import url_for
from flask import current_app
import flask
import logging
import traceback
from model.graph import Attr_Diff
from model.graph import Topo_Diff
from rz_api_common import sanitize_input__attr_diff, map_rzdoc_name_to_rzdoc_id
from rz_api_common import sanitize_input__topo_diff
from rz_api_common import validate_obj__attr_diff
from rz_req_handling import common_resp_handle
from db_op import DBO_rz_clone
from neo4j_cypher import QT_Node_Filter__Doc_ID_Label
log = logging.getLogger('rhizi')
db_ctl = None # injected: DB controller
def __context__common(rzdoc_id=None):
class Req_Context():
"""
Request context:
- user_name
- rzdoc
"""
def __init__(self):
self.user_name = None
self.rzdoc = None
"""
build a common rquest context to pass along with a kernel diff commit:
- set user_name
"""
ret = Req_Context()
if session.has_key('username'):
ret.user_name = session['username']
ret['rzdoc_id'] = rzdoc_id
return ret
def sanitize_input(req):
@common_rest_req_exception_handler
def diff_commit__topo():
"""
REST API wrapper around diff_commit__topo():
- extract topo_diff from request
- handle success/error outcomes
"""
def sanitize_input(req):
rzdoc_name = request.get_json().get('rzdoc_name')
topo_diff_dict = request.get_json()['topo_diff']
topo_diff = Topo_Diff.from_json_dict(topo_diff_dict)
sanitize_input__topo_diff(topo_diff)
return rzdoc_name, topo_diff
rzdoc_name, topo_diff = sanitize_input(request)
ctx = __context__common(rzdoc_name)
kernel = flask.current_app.kernel
_, commit_ret = kernel.diff_commit__topo(topo_diff, ctx)
return common_resp_handle__success(data=commit_ret)
@common_rest_req_exception_handler
def diff_commit__attr():
"""
commit a graph attribute diff
"""
def sanitize_input(req):
rzdoc_name = request.get_json().get('rzdoc_name')
attr_diff_dict = request.get_json()['attr_diff']
attr_diff = Attr_Diff.from_json_dict(attr_diff_dict)
sanitize_input__attr_diff(attr_diff)
return rzdoc_name, attr_diff;
rzdoc_name, attr_diff = sanitize_input(request)
validate_obj__attr_diff(attr_diff)
ctx = __context__common(rzdoc_name)
kernel = flask.current_app.kernel
_, commit_ret = kernel.diff_commit__attr(attr_diff, ctx)
return common_resp_handle__success(data=commit_ret)
def diff_commit__vis():
pass
@common_rest_req_exception_handler
def rzdoc_clone():
def sanitize_input(req):
rzdoc_name = req.get_json().get('rzdoc_name')
return rzdoc_name
rzdoc_name = sanitize_input(request)
if None == rzdoc_name: # load welcome doc by default
rzdoc_name = current_app.rz_config.rzdoc__mainpage_name
kernel = flask.current_app.kernel
ctx = __context__common(rzdoc_name)
topo_diff = kernel.rzdoc__clone(ctx.rzdoc, ctx)
topo_diff_json = topo_diff.to_json_dict() # serialize Topo_Diff before including in response
return common_resp_handle__success(data=topo_diff_json)
@common_rest_req_exception_handler
def rzdoc__create(rzdoc_name):
"""
create RZ doc
"""
s_rzdoc_name = sanitize_input__rzdoc_name(rzdoc_name)
kernel = flask.current_app.kernel
ctx = __context__common(rzdoc_name=None) # avoid rzdoc cache lookup exception
kernel.rzdoc__create(s_rzdoc_name, ctx)
return make_response__json(status=HTTP_STATUS__201_CREATED)
|