183 lines
5.5 KiB
Python
183 lines
5.5 KiB
Python
"""
|
|
Core Module for Web Base Data Generation
|
|
"""
|
|
|
|
import sys, os, json
|
|
|
|
from vtkmodules.web import iteritems
|
|
|
|
|
|
class DataHandler(object):
|
|
def __init__(self, basePath):
|
|
self.__root = basePath
|
|
self.types = ["tonic-query-data-model"]
|
|
self.metadata = {}
|
|
self.data = {}
|
|
self.arguments = {}
|
|
self.current = {}
|
|
self.sections = {}
|
|
self.basePattern = None
|
|
self.priority = []
|
|
self.argOrder = []
|
|
self.realValues = {}
|
|
self.can_write = True
|
|
|
|
def getBasePath(self):
|
|
return self.__root
|
|
|
|
def updateBasePattern(self):
|
|
self.priority.sort(key=lambda item: item[1])
|
|
self.basePattern = ""
|
|
patternSeparator = ""
|
|
currentPriority = -1
|
|
|
|
for item in self.priority:
|
|
if currentPriority != -1:
|
|
if currentPriority == item[1]:
|
|
patternSeparator = "_"
|
|
else:
|
|
patternSeparator = "/"
|
|
currentPriority = item[1]
|
|
self.basePattern = "{%s}%s%s" % (
|
|
item[0],
|
|
patternSeparator,
|
|
self.basePattern,
|
|
)
|
|
|
|
def registerArgument(self, **kwargs):
|
|
"""
|
|
We expect the following set of arguments
|
|
- priority
|
|
- name
|
|
- label (optional)
|
|
- values
|
|
- uiType
|
|
- defaultIdx
|
|
"""
|
|
newArgument = {}
|
|
argName = kwargs["name"]
|
|
self.argOrder.append(argName)
|
|
for key, value in iteritems(kwargs):
|
|
if key == "priority":
|
|
self.priority.append([argName, value])
|
|
elif key == "values":
|
|
self.realValues[argName] = value
|
|
newArgument[key] = ["{value}".format(value=x) for x in value]
|
|
else:
|
|
newArgument[key] = value
|
|
|
|
self.arguments[argName] = newArgument
|
|
|
|
def updatePriority(self, argumentName, newPriority):
|
|
for item in self.priority:
|
|
if item[0] == argumentName:
|
|
item[1] = newPriority
|
|
|
|
def setArguments(self, **kwargs):
|
|
"""
|
|
Update the arguments index
|
|
"""
|
|
for key, value in iteritems(kwargs):
|
|
self.current[key] = value
|
|
|
|
def removeData(self, name):
|
|
del self.data[name]
|
|
|
|
def registerData(self, **kwargs):
|
|
"""
|
|
name, type, mimeType, fileName, dependencies
|
|
"""
|
|
newData = {"metadata": {}}
|
|
argName = kwargs["name"]
|
|
for key, value in iteritems(kwargs):
|
|
if key == "fileName":
|
|
if "rootFile" in kwargs and kwargs["rootFile"]:
|
|
newData["pattern"] = "{pattern}/%s" % value
|
|
else:
|
|
newData["pattern"] = "{pattern}%s" % value
|
|
else:
|
|
newData[key] = value
|
|
|
|
self.data[argName] = newData
|
|
|
|
def addDataMetaData(self, name, key, value):
|
|
self.data[name]["metadata"][key] = value
|
|
|
|
def getDataAbsoluteFilePath(self, name, createDirectories=True):
|
|
dataPattern = self.data[name]["pattern"]
|
|
if "{pattern}" in dataPattern:
|
|
if len(self.basePattern) == 0:
|
|
dataPattern = dataPattern.replace(
|
|
"{pattern}/", self.basePattern
|
|
).replace("{pattern}", self.basePattern)
|
|
self.data[name]["pattern"] = dataPattern
|
|
else:
|
|
dataPattern = dataPattern.replace("{pattern}", self.basePattern)
|
|
self.data[name]["pattern"] = dataPattern
|
|
|
|
keyValuePair = {}
|
|
for key, value in iteritems(self.current):
|
|
keyValuePair[key] = self.arguments[key]["values"][value]
|
|
|
|
fullpath = os.path.join(self.__root, dataPattern.format(**keyValuePair))
|
|
|
|
if createDirectories and self.can_write:
|
|
if not os.path.exists(os.path.dirname(fullpath)):
|
|
os.makedirs(os.path.dirname(fullpath))
|
|
|
|
return fullpath
|
|
|
|
def addTypes(self, *args):
|
|
for arg in args:
|
|
self.types.append(arg)
|
|
|
|
def addMetaData(self, key, value):
|
|
self.metadata[key] = value
|
|
|
|
def addSection(self, key, value):
|
|
self.sections[key] = value
|
|
|
|
def computeDataPatterns(self):
|
|
if self.basePattern == None:
|
|
self.updateBasePattern()
|
|
|
|
for name in self.data:
|
|
dataPattern = self.data[name]["pattern"]
|
|
if "{pattern}" in dataPattern:
|
|
dataPattern = dataPattern.replace("{pattern}", self.basePattern)
|
|
self.data[name]["pattern"] = dataPattern
|
|
|
|
def __getattr__(self, name):
|
|
if self.basePattern == None:
|
|
self.updateBasePattern()
|
|
|
|
for i in range(len(self.arguments[name]["values"])):
|
|
self.current[name] = i
|
|
yield self.realValues[name][i]
|
|
|
|
def writeDataDescriptor(self):
|
|
if not self.can_write:
|
|
return
|
|
|
|
self.computeDataPatterns()
|
|
|
|
jsonData = {
|
|
"arguments_order": self.argOrder,
|
|
"type": self.types,
|
|
"arguments": self.arguments,
|
|
"metadata": self.metadata,
|
|
"data": [],
|
|
}
|
|
|
|
# Add sections
|
|
for key, value in iteritems(self.sections):
|
|
jsonData[key] = value
|
|
|
|
# Add data
|
|
for key, value in iteritems(self.data):
|
|
jsonData["data"].append(value)
|
|
|
|
filePathToWrite = os.path.join(self.__root, "index.json")
|
|
with open(filePathToWrite, "w") as fileToWrite:
|
|
fileToWrite.write(json.dumps(jsonData))
|