forked from viur-framework/viur-vi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserversideaction.py
110 lines (98 loc) · 3.39 KB
/
serversideaction.py
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
# -*- coding: utf-8 -*-
from vi.config import conf
from vi.html5 import Button, window
from vi.safeeval import SafeEval
import logging
class ServerSideActionWdg(Button):
def __init__(self, module, handler, actionName, actionData):
super(ServerSideActionWdg, self).__init__(actionData["name"])
self.module = module
self.handler = handler
self.actionName = actionName
self.actionData = actionData
self["class"] = "bar-item btn btn--small %s" % actionData["icon"]
self["disabled"] = True
self.isDisabled = True
self.pendingFetches = []
self.selectionCheckerAst = None
self.additionalEvalData = actionData.get("additionalEvalData")
if "enabled" in actionData:
try:
self.selectionCheckerAst = SafeEval.parse(actionData["enabled"])
except:
pass
def switchDisabledState(self, disabled):
if not disabled:
if self.isDisabled:
self.isDisabled = False
self["disabled"] = False
else:
if not self.isDisabled:
self["disabled"] = True
self.isDisabled = True
def onAttach(self):
super(ServerSideActionWdg, self).onAttach()
self.parent().parent().selectionChangedEvent.register(self)
def onDetach(self):
self.parent().parent().selectionChangedEvent.unregister(self)
super(ServerSideActionWdg, self).onDetach()
def onSelectionChanged(self, table, selection):
if self.actionData["allowMultiSelection"] and len(selection) > 0 or len(selection) == 1:
if not self.pendingFetches:
if self.selectionCheckerAst:
valid = True
for sel in selection:
try:
if not SafeEval.evalAst(self.selectionCheckerAst,
{"skel": sel, "additionalEvalData": self.additionalEvalData}):
valid = False
break
except Exception as e:
logging.exception(e)
valid = False
break
self.switchDisabledState(not valid)
else:
self.switchDisabledState(False)
else:
self.switchDisabledState(True)
def onClick(self, sender=None):
selection = self.parent().parent().getCurrentSelection()
if self.actionData["allowMultiSelection"] and len(selection) > 0 or len(selection) == 1:
# if (len(selection) == 1 and not self.actionData["allowMultiSelection"]) or len(selection) > 0:
wasIdle = not self.pendingFetches
for item in selection:
if self.actionData["action"] == "open":
url = self.actionData["url"].replace("{{key}}", item["key"])
window.open(url, "_blank")
elif self.actionData["action"] == "fetch":
url = self.actionData["url"].replace("{{key}}", item["key"])
self.pendingFetches.append(url)
else:
raise NotImplementedError()
if wasIdle and self.pendingFetches:
self.addClass("is-loading")
self.fetchNext()
def fetchNext(self):
if not self.pendingFetches:
return
from vi.network import NetworkService # Circular import otherwise
url = self.pendingFetches.pop()
NetworkService.request(
None, url, secure=True,
successHandler=self.fetchSucceeded,
failureHandler=self.fetchFailed
)
def fetchSucceeded(self, req):
if self.pendingFetches:
self.fetchNext()
else:
conf["mainWindow"].log("success", "Done :)")
from vi.network import NetworkService # Circular import otherwise
self.removeClass("is-loading")
NetworkService.notifyChange(self.parent().parent().module)
def fetchFailed(self, req):
self.pendingFetches = []
conf["mainWindow"].log("failed", "Failed :(")
def resetLoadingState(self):
self.removeClass("is-loading")