init
This commit is contained in:
@@ -0,0 +1,182 @@
|
||||
"""
|
||||
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))
|
||||
Reference in New Issue
Block a user