1
|
|
|
import os |
2
|
|
|
from flask import request, url_for |
3
|
|
|
|
4
|
|
|
from groundwork_web.patterns import GwWebPattern |
5
|
|
|
|
6
|
|
|
|
7
|
|
|
class GwWebManager(GwWebPattern): |
8
|
|
|
""" |
9
|
|
|
Provides functions and views to manage the application via a web interface. |
10
|
|
|
|
11
|
|
|
""" |
12
|
|
|
def __init__(self, *args, **kwargs): |
13
|
|
|
self.name = kwargs.get("name", self.__class__.__name__) |
14
|
|
|
self.needed_plugins = ["GwWeb"] |
15
|
|
|
super().__init__(*args, **kwargs) |
16
|
|
|
|
17
|
|
|
def activate(self): |
18
|
|
|
template_folder = os.path.join(os.path.abspath(os.path.dirname(__file__)), "templates") |
19
|
|
|
static_folder = os.path.join(os.path.abspath(os.path.dirname(__file__)), "static") |
20
|
|
|
self.web.contexts.register("webmanager", |
21
|
|
|
template_folder=template_folder, |
22
|
|
|
static_folder=static_folder, |
23
|
|
|
url_prefix="/webmanager", |
24
|
|
|
description="context for web manager urls") |
25
|
|
|
|
26
|
|
|
# Pure groundwork objects |
27
|
|
|
|
28
|
|
|
self.web.routes.register("/", ["GET"], self.__manager_view, context="webmanager", |
29
|
|
|
name="manager_view", description="Entry-Page for the webmanager") |
30
|
|
|
|
31
|
|
|
self.web.routes.register("/command", ["GET"], self.__command_view, context="webmanager", |
32
|
|
|
name="command_list", description="Lists all registered commands") |
33
|
|
|
|
34
|
|
|
self.web.routes.register("/plugin", ["GET"], self.__plugin_view, context="webmanager", |
35
|
|
|
name="plugin_list", description="Lists all registered plugins") |
36
|
|
|
|
37
|
|
|
self.web.routes.register("/plugin/class/<clazz>", ["GET", "POST"], self.__plugin_class_view, |
38
|
|
|
context="webmanager", |
39
|
|
|
name="plugin_class_details", description="Shows details of a plugin class") |
40
|
|
|
|
41
|
|
|
self.web.routes.register("/plugin/instance/<plugin_name>", ["GET", "POST"], self.__plugin_detail_view, |
42
|
|
|
context="webmanager", |
43
|
|
|
name="plugin_details", description="Shows details of a plugin instance") |
44
|
|
|
|
45
|
|
|
self.web.routes.register("/signal", ["GET"], self.__signal_view, context="webmanager", |
46
|
|
|
name="signal_list", description="Lists all registered signals") |
47
|
|
|
|
48
|
|
|
self.web.routes.register("/receiver", ["GET"], self.__receiver_view, context="webmanager", |
49
|
|
|
name="receiver_list", description="Lists all registered receivers") |
50
|
|
|
|
51
|
|
|
self.web.routes.register("/document", ["GET"], self.__document_view, context="webmanager", |
52
|
|
|
name="document_list", description="Lists all registered documents") |
53
|
|
|
|
54
|
|
|
# WEB objects |
55
|
|
|
|
56
|
|
|
self.web.routes.register("/route", ["GET"], self.__route_view, context="webmanager", |
57
|
|
|
name="route_list", description="Lists all registered routes") |
58
|
|
|
|
59
|
|
|
self.web.routes.register("/menu", ["GET"], self.__menu_view, context="webmanager", |
60
|
|
|
name="menu_list", description="Lists all registered menus") |
61
|
|
|
|
62
|
|
|
self.web.routes.register("/context", ["GET"], self.__context_view, context="webmanager", |
63
|
|
|
name="context_list", description="Lists all registered contexts") |
64
|
|
|
|
65
|
|
|
self.web.routes.register("/server", ["GET"], self.__server_view, context="webmanager", |
66
|
|
|
name="server_list", description="Lists all registered servers") |
67
|
|
|
|
68
|
|
|
with self.app.web.flask.app_context(): |
69
|
|
|
webmanager_menu = self.web.menus.register("WebManager", "/webmanager") |
70
|
|
|
webmanager_menu.register("Overview", "/webmanager") |
71
|
|
|
webmanager_menu.register("Commands", url_for("webmanager.__command_view")) |
72
|
|
|
webmanager_menu.register("Signals", url_for("webmanager.__signal_view")) |
73
|
|
|
webmanager_menu.register("Receivers", url_for("webmanager.__receiver_view")) |
74
|
|
|
webmanager_menu.register("Plugins", url_for("webmanager.__plugin_view")) |
75
|
|
|
webmanager_menu.register("Routes", url_for("webmanager.__route_view")) |
76
|
|
|
webmanager_menu.register("Menu entries", url_for("webmanager.__menu_view")) |
77
|
|
|
webmanager_menu.register("Contexts", url_for("webmanager.__context_view")) |
78
|
|
|
webmanager_menu.register("Servers", url_for("webmanager.__server_view")) |
79
|
|
|
webmanager_menu.register("Documents", url_for("webmanager.__document_view")) |
80
|
|
|
|
81
|
|
|
def deactivate(self): |
82
|
|
|
pass |
83
|
|
|
|
84
|
|
|
def __manager_view(self): |
85
|
|
|
return self.web.render("manager.html") |
86
|
|
|
|
87
|
|
|
def __command_view(self): |
88
|
|
|
return self.web.render("commands.html") |
89
|
|
|
|
90
|
|
|
def __document_view(self): |
91
|
|
|
return self.web.render("documents.html") |
92
|
|
|
|
93
|
|
|
def __signal_view(self): |
94
|
|
|
return self.web.render("signals.html") |
95
|
|
|
|
96
|
|
|
def __receiver_view(self): |
97
|
|
|
return self.web.render("receivers.html") |
98
|
|
|
|
99
|
|
|
def __plugin_view(self): |
100
|
|
|
return self.web.render("plugins.html") |
101
|
|
|
|
102
|
|
|
def __plugin_detail_view(self, plugin_name): |
103
|
|
|
plugin_instance = self.app.plugins.get(plugin_name) |
104
|
|
|
if plugin_instance is None: |
105
|
|
|
return "404" |
106
|
|
|
|
107
|
|
|
if request.method == "POST": |
108
|
|
|
if plugin_instance.active: |
109
|
|
|
plugin_instance.deactivate() |
110
|
|
|
else: |
111
|
|
|
plugin_instance.activate() |
112
|
|
|
|
113
|
|
|
return self.web.render("plugin_detail.html", plugin_instance=plugin_instance) |
114
|
|
|
|
115
|
|
|
def __plugin_class_view(self, clazz): |
116
|
|
|
clazz_obj = self.app.plugins.classes.get(clazz) |
117
|
|
|
if clazz_obj is None: |
118
|
|
|
return "404" |
119
|
|
|
|
120
|
|
|
if request.method == "POST": |
121
|
|
|
plugin_class = self.app.plugins.classes.get(clazz) |
122
|
|
|
name = request.form["name"] or clazz |
123
|
|
|
plugin_instance = self.app.plugins.initialise(plugin_class.clazz, name) |
124
|
|
|
|
125
|
|
|
return self.web.render("plugin_class_detail.html", clazz=clazz_obj) |
126
|
|
|
|
127
|
|
|
def __route_view(self): |
128
|
|
|
routes = self.app.web.routes.get() |
129
|
|
|
return self.web.render("routes.html", routes=routes) |
130
|
|
|
|
131
|
|
|
def __context_view(self): |
132
|
|
|
contexts = self.app.web.contexts.get() |
133
|
|
|
return self.web.render("contexts.html", contexts=contexts) |
134
|
|
|
|
135
|
|
|
def __provider_view(self): |
136
|
|
|
providers = self.app.web.providers.get() |
137
|
|
|
return self.web.render("providers.html", providers=providers) |
138
|
|
|
|
139
|
|
|
def __server_view(self): |
140
|
|
|
servers = self.app.web.servers.get() |
141
|
|
|
return self.web.render("servers.html", servers=servers) |
142
|
|
|
|
143
|
|
|
def __menu_view(self): |
144
|
|
|
clusters = self.app.web.menus.get_clusters() |
145
|
|
|
|
146
|
|
|
menus = {} |
147
|
|
|
for cluster in clusters: |
148
|
|
|
menus[cluster] = self.app.web.menus.get(cluster=cluster) |
149
|
|
|
|
150
|
|
|
return self.web.render("menus.html", menus=menus) |
151
|
|
|
|
152
|
|
|
|
153
|
|
|
|