|
|
@ -0,0 +1,127 @@
|
|
|
|
|
|
|
|
from pyOpenRPA import Orchestrator
|
|
|
|
|
|
|
|
from . import CrossOS
|
|
|
|
|
|
|
|
import jinja2
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
|
|
|
from inspect import signature # For detect count of def args
|
|
|
|
|
|
|
|
import operator
|
|
|
|
|
|
|
|
import math
|
|
|
|
|
|
|
|
import copy
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Template():
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
Шаблон генерации строки. Использует Jinja2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from pyOpenRPA.Tools import Template
|
|
|
|
|
|
|
|
# ПРИМЕР:
|
|
|
|
|
|
|
|
lTemplate = Template.Template(
|
|
|
|
|
|
|
|
inPathStr="ControlPanel\\test.html",
|
|
|
|
|
|
|
|
inRefreshBool = True)
|
|
|
|
|
|
|
|
lStr = lTemplate.GenerateStr() # Сформировать текст по шаблону
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Контектст, который формируется по умолчанию:
|
|
|
|
|
|
|
|
ControlPanelInstance: self,
|
|
|
|
|
|
|
|
OrchestratorModule: Orchestrator,
|
|
|
|
|
|
|
|
EnumerateDef: enumerate,
|
|
|
|
|
|
|
|
OperatorModule: operator,
|
|
|
|
|
|
|
|
MathModule: math
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Вы можете дополнить стандартный словарь контекста с помощью функции ContextDictSet()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.. code-block:: html
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Hello my control panel!
|
|
|
|
|
|
|
|
You can use any def from Orchestrator module here in Jinja2 HTML template:
|
|
|
|
|
|
|
|
Example: OrchestratorModule.OSCMD(inCMDStr="notepad")
|
|
|
|
|
|
|
|
{{MathModule.pi}}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
# Jinja2 consolidated
|
|
|
|
|
|
|
|
mJinja2TemplateRefreshBool = None
|
|
|
|
|
|
|
|
mJinja2ContextDict = None
|
|
|
|
|
|
|
|
mJinja2TemplatePathStr = None
|
|
|
|
|
|
|
|
mJinja2TemplateFileNameStr = None
|
|
|
|
|
|
|
|
mJinja2Loader = None
|
|
|
|
|
|
|
|
mJinja2Env = None
|
|
|
|
|
|
|
|
mJinja2Template = None
|
|
|
|
|
|
|
|
mLogger = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self, inPathStr = None, inRefreshBool = False, inLogger = None):
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
Конструктор шаблона для генерации
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
:param inPathStr: Путь к шаблону. Поддерживает специфику разлных ОС. 'path/to/file' и 'path\\to\\file'
|
|
|
|
|
|
|
|
:param inRefreshBool: True - читать шаблон из файловой системы при каждом обращении на формирование строки (GenerateStr)
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
self.PathSet(inPathStr = inPathStr)
|
|
|
|
|
|
|
|
self.mJinja2TemplateRefreshBool = inRefreshBool
|
|
|
|
|
|
|
|
self.mLogger = inLogger
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def ContextDictSet(self, inContextDict):
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
Установить дополнительный контекст для генерации строки.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
:param inContextDict: Дополнительный контекст, который будет использоваться при формировании строки
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
self.mJinja2ContextDict = inContextDict
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def PathSet(self, inPathStr):
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
Установить путь к шаблону для генерации (движок Jinja2)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
:param inPathStr: Путь к шаблону для генерации
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
if inPathStr is not None:
|
|
|
|
|
|
|
|
lSystemLoaderPathStr = "/".join(CrossOS.PathSplitList(inPathStr=inPathStr)[0:-1])
|
|
|
|
|
|
|
|
lTemplateFileNameStr = CrossOS.PathSplitList(inPathStr=inPathStr)[-1]
|
|
|
|
|
|
|
|
self.mJinja2TemplateFileNameStr = lTemplateFileNameStr
|
|
|
|
|
|
|
|
self.mJinja2Loader = jinja2.FileSystemLoader(lSystemLoaderPathStr)
|
|
|
|
|
|
|
|
self.mJinja2Env = jinja2.Environment(loader=self.mJinja2Loader, trim_blocks=True)
|
|
|
|
|
|
|
|
self.mJinja2Template = self.mJinja2Env.get_template(lTemplateFileNameStr)
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
|
|
if self.mLogger: self.mLogger.exception("EXCEPTION WHEN INIT JINJA2")
|
|
|
|
|
|
|
|
raise e
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def GenerateStr(self, inContextDict=None):
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
Сформировать строку с помощью шаблонизатора Jinja2. Передать контекст для формирования inContextDict.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
По умолчанию доступны следующие атрибуты контекста:
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"TemplateInstance":self,
|
|
|
|
|
|
|
|
"OrchestratorModule":Orchestrator,
|
|
|
|
|
|
|
|
"EnumerateDef": enumerate,
|
|
|
|
|
|
|
|
"OperatorModule": operator,
|
|
|
|
|
|
|
|
"MathModule": math
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
:param inContextDict: Дополнительный контекст для генерации строки.
|
|
|
|
|
|
|
|
:return: Сформированная строка
|
|
|
|
|
|
|
|
:rtype: str
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
if inContextDict is None: inContextDict = {}
|
|
|
|
|
|
|
|
if self.mJinja2TemplateRefreshBool == True:
|
|
|
|
|
|
|
|
self.mJinja2Template = self.mJinja2Env.get_template(self.mJinja2TemplateFileNameStr)
|
|
|
|
|
|
|
|
lContextDict = self.ContextGenerateDict()
|
|
|
|
|
|
|
|
lContextDict.update(inContextDict)
|
|
|
|
|
|
|
|
lStr = self.mJinja2Template.render(**lContextDict) # Render the template into str
|
|
|
|
|
|
|
|
return lStr
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def ContextGenerateDict(self):
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
Техническая функция. Сформировать преднастроенный словарь контекста для дальнейшего дообогащения
|
|
|
|
|
|
|
|
:return:
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
lData = {
|
|
|
|
|
|
|
|
"TemplateInstance":self,
|
|
|
|
|
|
|
|
"OrchestratorModule":Orchestrator,
|
|
|
|
|
|
|
|
"EnumerateDef": enumerate,
|
|
|
|
|
|
|
|
"OperatorModule": operator,
|
|
|
|
|
|
|
|
"MathModule": math
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
# Checkj Jinja2ContextDict
|
|
|
|
|
|
|
|
if self.mJinja2ContextDict is not None:
|
|
|
|
|
|
|
|
lData.update(self.mJinja2ContextDict)
|
|
|
|
|
|
|
|
return lData
|