in progress (broken orc)

dev-linux
robo-bo 2 years ago
parent 45b27ca1ca
commit dde4dc3bcf

@ -30,6 +30,7 @@ from . import __Orchestrator__
import copy import copy
import mimetypes import mimetypes
mimetypes.add_type("font/woff2",".woff2") mimetypes.add_type("font/woff2",".woff2")
mimetypes.add_type("text/javascript",".js")
gCacheDict = {} gCacheDict = {}
@ -288,18 +289,22 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
# Write content as utf-8 data # Write content as utf-8 data
inResponseDict["Body"] = gCacheDict[inURLItem["ResponseFilePath"]] inResponseDict["Body"] = gCacheDict[inURLItem["ResponseFilePath"]]
else: else:
if os.path.exists(inURLItem["ResponseFilePath"]) and os.path.isfile(inURLItem["ResponseFilePath"]):
lFileObject = open(CrossOS.PathStr(inURLItem["ResponseFilePath"]), "rb") lFileObject = open(CrossOS.PathStr(inURLItem["ResponseFilePath"]), "rb")
# Write content as utf-8 data # Write content as utf-8 data
gCacheDict[inURLItem["ResponseFilePath"]] = lFileObject.read() gCacheDict[inURLItem["ResponseFilePath"]] = lFileObject.read()
inResponseDict["Body"] = gCacheDict[inURLItem["ResponseFilePath"]] inResponseDict["Body"] = gCacheDict[inURLItem["ResponseFilePath"]]
# Закрыть файловый объект # Закрыть файловый объект
lFileObject.close() lFileObject.close()
else: inResponseDict["Headers"]["Content-type"]= "application/x-empty"; inResponseDict["StatusCode"] = 204 # NOCONTENT
else: else:
if os.path.exists(inURLItem["ResponseFilePath"]) and os.path.isfile(inURLItem["ResponseFilePath"]):
lFileObject = open(CrossOS.PathStr(inURLItem["ResponseFilePath"]), "rb") lFileObject = open(CrossOS.PathStr(inURLItem["ResponseFilePath"]), "rb")
# Write content as utf-8 data # Write content as utf-8 data
inResponseDict["Body"] = lFileObject.read() inResponseDict["Body"] = lFileObject.read()
# Закрыть файловый объект # Закрыть файловый объект
lFileObject.close() lFileObject.close()
else: inResponseDict["Headers"]["Content-type"]= "application/x-empty"; inResponseDict["StatusCode"] = 204 # NOCONTENT
# detect MIME type if none # detect MIME type if none
if inResponseDict["Headers"]["Content-type"] is None: if inResponseDict["Headers"]["Content-type"] is None:
inResponseDict["Headers"]["Content-type"]= mimetypes.guess_type(inURLItem["ResponseFilePath"])[0] inResponseDict["Headers"]["Content-type"]= mimetypes.guess_type(inURLItem["ResponseFilePath"])[0]
@ -320,7 +325,7 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
if inURLItem["URL"][-1]!="/": inURLItem["URL"]+= "/" # Fix for settings if inURLItem["URL"][-1]!="/": inURLItem["URL"]+= "/" # Fix for settings
lFilePathSecondPart = lRequestPath.replace(inURLItem["URL"],"") lFilePathSecondPart = lRequestPath.replace(inURLItem["URL"],"")
lFilePathSecondPart = lFilePathSecondPart.split("?")[0] lFilePathSecondPart = lFilePathSecondPart.split("?")[0]
lFilePath = os.path.join(CrossOS.PathStr(inURLItem["ResponseFolderPath"]),lFilePathSecondPart) lFilePath = CrossOS.PathStr(os.path.join(inURLItem["ResponseFolderPath"],lFilePathSecondPart))
#print(f"File full path {lFilePath}") #print(f"File full path {lFilePath}")
#Check if file exist #Check if file exist
if os.path.exists(lFilePath) and os.path.isfile(lFilePath): if os.path.exists(lFilePath) and os.path.isfile(lFilePath):
@ -345,6 +350,8 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
# detect MIME type if none # detect MIME type if none
if inResponseDict["Headers"]["Content-type"] is None: if inResponseDict["Headers"]["Content-type"] is None:
inResponseDict["Headers"]["Content-type"]= mimetypes.guess_type(lFilePath)[0] inResponseDict["Headers"]["Content-type"]= mimetypes.guess_type(lFilePath)[0]
else:
inResponseDict["Headers"]["Content-type"]= "application/x-empty"; inResponseDict["StatusCode"] = 204 # NOCONTENT
# If No content-type # If No content-type
if inResponseDict["Headers"]["Content-type"] is None: if inResponseDict["Headers"]["Content-type"] is None:
inResponseDict["Headers"]["Content-type"]= "application/octet-stream" inResponseDict["Headers"]["Content-type"]= "application/octet-stream"

@ -458,15 +458,14 @@ def pyOpenRPA_Agent_A2O(inRequest, inGSettings):
inGSettings["AgentDict"][lAgentDictItemKeyTurple]["ActivityList"] = lAgentDictActivityListNew inGSettings["AgentDict"][lAgentDictItemKeyTurple]["ActivityList"] = lAgentDictActivityListNew
from pyOpenRPA.Utils.Render import Render from pyOpenRPA.Utils.Render import Render
gPackageResourcePathStr = os.path.join(*(CrossOS.PathSplitList(__file__)[:-2])) lFileStr = CrossOS.PathJoinList(CrossOS.PathSplitList(__file__)[:-2] + ["Resources","Web","orpa","orc.xhtml"])
gRender = Render(inTemplatePathStr=os.path.join(gPackageResourcePathStr, "Resources","Web","orpa","orc.xhtml")) gRender = Render(inTemplatePathStr=lFileStr,inTemplateRefreshBool=True)
def pyOpenRPA_Index(): def pyOpenRPA_Index():
# Пример использования # Пример использования
global gRender global gRender
gRender.TemplatePathSet(inDataDict={"const":"value1"})
lStr = gRender.Generate() lStr = gRender.Generate()
__Orchestrator__.WebRequestResponseSend(inResponeStr=lStr,inContentTypeStr="html/text") __Orchestrator__.WebRequestResponseSend(inResponeStr=lStr,inContentTypeStr="text/html")
def SettingsUpdate(inGlobalConfiguration): def SettingsUpdate(inGlobalConfiguration):
import os import os
@ -486,8 +485,10 @@ def SettingsUpdate(inGlobalConfiguration):
# "ResponseDefRequestGlobal": None #Function with str result # "ResponseDefRequestGlobal": None #Function with str result
#} #}
#Orchestrator basic dependencies # Index page in server.py because of special settings #Orchestrator basic dependencies # Index page in server.py because of special settings
{"Method":"GET", "URL": gSettingsDict["ServerDict"]["URLIndexStr"],"MatchType": "EqualNoParam", "ResponseDef": pyOpenRPA_Index}, {"Method":"GET", "URL": gSettingsDict["ServerDict"]["URLIndexStr"],"MatchType": "EqualNoParam", "ResponseDefRequestGlobal": pyOpenRPA_Index},
{"Method":"GET", "URL": "/metadata.json", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\orpa\\metadata.json"), "ResponseContentType": "application/json"},
{"Method":"GET", "URL": "/Index.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\Index.js"), "ResponseContentType": "text/javascript"}, {"Method":"GET", "URL": "/Index.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "Web\\Index.js"), "ResponseContentType": "text/javascript"},
{"Method":"GET", "URL": "/orpa/Resources/", "MatchType": "BeginWith", "ResponseFolderPath": os.path.join(lOrchestratorFolder, "..\\Resources"),"UACBool":False, "UseCacheBool": True},
{"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/semantic.min.css", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\semantic.min.css"), "ResponseContentType": "text/css", "UACBool":False, "UseCacheBool": True}, {"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/semantic.min.css", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\semantic.min.css"), "ResponseContentType": "text/css", "UACBool":False, "UseCacheBool": True},
{"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/semantic.min.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\semantic.min.js"), "ResponseContentType": "application/javascript", "UACBool":False, "UseCacheBool": True}, {"Method":"GET", "URL": "/3rdParty/Semantic-UI-CSS-master/semantic.min.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\Semantic-UI-CSS-master\\semantic.min.js"), "ResponseContentType": "application/javascript", "UACBool":False, "UseCacheBool": True},
{"Method":"GET", "URL": "/3rdParty/jQuery/jquery-3.1.1.min.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\jQuery\\jquery-3.1.1.min.js"), "ResponseContentType": "application/javascript", "UACBool":False, "UseCacheBool": True}, {"Method":"GET", "URL": "/3rdParty/jQuery/jquery-3.1.1.min.js", "MatchType": "EqualCase", "ResponseFilePath": os.path.join(lOrchestratorFolder, "..\\Resources\\Web\\jQuery\\jquery-3.1.1.min.js"), "ResponseContentType": "application/javascript", "UACBool":False, "UseCacheBool": True},

@ -26,3 +26,12 @@
</div> </div>
</div> </div>
</div> </div>
<script src="/orpa/Resources/Web/orpa/styleset/visibility.js"></script>
<script src="/orpa/Resources/Web/orpa/styleset/sidebar.js"></script>
<script src="/orpa/Resources/Web/orpa/styleset/transition.js"></script>
<script src="/orpa/Resources/Web/orpa/styleset/docs.js"></script>
<script src="/orpa/Resources/Web/orpa/styleset/easing.min.js"></script>
<script src="/orpa/Resources/Web/orpa/styleset/highlight.min.js"></script>
<script src="/orpa/Resources/Web/orpa/styleset/less.min.js"></script>
<script src="/orpa/Resources/Web/orpa/styleset/home.js"></script>

@ -1,3 +1,22 @@
<link rel="stylesheet" type="text/css" href="/orpa/Resources/Web/Semantic-UI-CSS-master/components/reset.css">
<link rel="stylesheet" type="text/css" href="/orpa/Resources/Web/Semantic-UI-CSS-master/components/site.css">
<link rel="stylesheet" type="text/css" href="/orpa/Resources/Web/Semantic-UI-CSS-master/components/container.css">
<link rel="stylesheet" type="text/css" href="/orpa/Resources/Web/Semantic-UI-CSS-master/components/grid.css">
<link rel="stylesheet" type="text/css" href="/orpa/Resources/Web/Semantic-UI-CSS-master/components/header.css">
<link rel="stylesheet" type="text/css" href="/orpa/Resources/Web/Semantic-UI-CSS-master/components/image.css">
<link rel="stylesheet" type="text/css" href="/orpa/Resources/Web/Semantic-UI-CSS-master/components/menu.css">
<link rel="stylesheet" type="text/css" href="/orpa/Resources/Web/Semantic-UI-CSS-master/components/divider.css">
<link rel="stylesheet" type="text/css" href="/orpa/Resources/Web/Semantic-UI-CSS-master/components/dropdown.css">
<link rel="stylesheet" type="text/css" href="/orpa/Resources/Web/Semantic-UI-CSS-master/components/segment.css">
<link rel="stylesheet" type="text/css" href="/orpa/Resources/Web/Semantic-UI-CSS-master/components/button.css">
<link rel="stylesheet" type="text/css" href="/orpa/Resources/Web/Semantic-UI-CSS-master/components/list.css">
<link rel="stylesheet" type="text/css" href="/orpa/Resources/Web/Semantic-UI-CSS-master/components/icon.css">
<link rel="stylesheet" type="text/css" href="/orpa/Resources/Web/Semantic-UI-CSS-master/components/sidebar.css">
<link rel="stylesheet" type="text/css" href="/orpa/Resources/Web/Semantic-UI-CSS-master/components/transition.css">
<div class="ui text container tag-top"> <div class="ui text container tag-top">
<div class="ui middle aligned stackable grid container"> <div class="ui middle aligned stackable grid container">
<div class="row"> <div class="row">
@ -27,3 +46,4 @@
</div> </div>
</div> </div>
</div> </div>

@ -3,13 +3,13 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>pyOpenRPA Orchestrator</title> <title>pyOpenRPA Orchestrator</title>
<link rel="stylesheet" type="text/css" href="3rdParty/Semantic-UI-CSS-master/semantic.min.css"> <link rel="stylesheet" type="text/css" href="/orpa/Resources/Web/Semantic-UI-CSS-master/semantic.min.css">
<script <script
src="3rdParty/jQuery/jquery-3.1.1.min.js" src="/orpa/Resources/Web/jQuery/jquery-3.1.1.min.js"
crossorigin="anonymous"></script> crossorigin="anonymous"></script>
<script src="3rdParty/Semantic-UI-CSS-master/semantic.min.js"></script> <script src="/orpa/Resources/Web/Semantic-UI-CSS-master/semantic.min.js"></script>
<script src="3rdParty/Handlebars/handlebars-v4.1.2.js"></script> <script src="/orpa/Resources/Web/Handlebars/handlebars-v4.1.2.js"></script>
<script src = "Index.js"></script> <script src = "/orpa/Resources/Web/orpa/orc.js"></script>
<style type="text/css"> <style type="text/css">
body { body {
@ -69,6 +69,7 @@
<div class="openrpa-control-panel"></div> <div class="openrpa-control-panel"></div>
<script class="openrpa-hidden-control-panel" style="display:none" type="text/x-handlebars-template"> <script class="openrpa-hidden-control-panel" style="display:none" type="text/x-handlebars-template">
<div class="ui cards"> <div class="ui cards">
{% raw %}
{{#RenderRobotList}} {{#RenderRobotList}}
<div class="card"> <div class="card">
<div class="content"> <div class="content">
@ -108,6 +109,7 @@
</div> </div>
</div> </div>
{{/RenderRobotList}} {{/RenderRobotList}}
{% endraw %}
</div> </div>
</script> </script>
</div> </div>
@ -116,6 +118,7 @@
<div class="row"> <div class="row">
<script class="openrpa-hidden-monitor-table-general" style="display:none" type="text/x-handlebars-template"> <script class="openrpa-hidden-monitor-table-general" style="display:none" type="text/x-handlebars-template">
{% raw %}
<table class="ui celled table"> <table class="ui celled table">
<thead> <thead>
<tr> <tr>
@ -131,9 +134,11 @@
{{/ListenURLList}} {{/ListenURLList}}
</tbody> </tbody>
</table> </table>
{% endraw %}
</script> </script>
<script class="openrpa-handlebar-template-table-filter" style="display:none" type="text/x-handlebars-template"> <script class="openrpa-handlebar-template-table-filter" style="display:none" type="text/x-handlebars-template">
{% raw %}
{{#if Title}} {{#if Title}}
<h1>{{{Title}}}</h1> <h1>{{{Title}}}</h1>
{{/if}} {{/if}}
@ -163,8 +168,10 @@
{{/Rows}} {{/Rows}}
</tbody> </tbody>
</table> </table>
{% endraw %}
</script> </script>
<script class="openrpa-handlebar-template-list-filter" style="display:none" type="text/x-handlebars-template"> <script class="openrpa-handlebar-template-list-filter" style="display:none" type="text/x-handlebars-template">
{% raw %}
{{#if Title}} {{#if Title}}
<h1>{{{Title}}}</h1> <h1>{{{Title}}}</h1>
{{/if}} {{/if}}
@ -187,6 +194,7 @@
{{/List}} {{/List}}
</div> </div>
</div> </div>
{% endraw %}
</script> </script>
<div class="eight wide column openrpa-robotrdpactive-control-panel-general UACClient-pyOpenRPADict-RDPKeyDict" style="display:none;"> <div class="eight wide column openrpa-robotrdpactive-control-panel-general UACClient-pyOpenRPADict-RDPKeyDict" style="display:none;">
<h2 class="ui header openrpa-rdpactive-title"> <h2 class="ui header openrpa-rdpactive-title">
@ -198,6 +206,7 @@
<div class="openrpa-robotrdpactive-control-panel"></div> <div class="openrpa-robotrdpactive-control-panel"></div>
<script class="openrpa-hidden-robotrdpactive-control-panel" style="display:none" type="text/x-handlebars-template"> <script class="openrpa-hidden-robotrdpactive-control-panel" style="display:none" type="text/x-handlebars-template">
<div class="ui inverted segment" style="background: #368279"> <div class="ui inverted segment" style="background: #368279">
{% raw %}
<div class="ui inverted relaxed divided list"> <div class="ui inverted relaxed divided list">
{{#HandlebarsList}} {{#HandlebarsList}}
<div class="item"> <div class="item">
@ -225,6 +234,7 @@
</div> </div>
{{/HandlebarsList}} {{/HandlebarsList}}
</div> </div>
{% endraw %}
</div> </div>
</script> </script>
</div> </div>
@ -238,6 +248,7 @@
<div class="pyOpenRPA-Agent-List"></div> <div class="pyOpenRPA-Agent-List"></div>
<script class="pyOpenRPA-Agent-ListTemplate" style="display:none" type="text/x-handlebars-template"> <script class="pyOpenRPA-Agent-ListTemplate" style="display:none" type="text/x-handlebars-template">
<div class="ui inverted segment" style="background: #368279"> <div class="ui inverted segment" style="background: #368279">
{% raw %}
<div class="ui inverted relaxed divided list"> <div class="ui inverted relaxed divided list">
{{#HandlebarsList}} {{#HandlebarsList}}
<div class="item"> <div class="item">
@ -256,6 +267,7 @@
</div> </div>
{{/HandlebarsList}} {{/HandlebarsList}}
</div> </div>
{% endraw %}
</div> </div>
</script> </script>
</div> </div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

@ -52,3 +52,25 @@ def PathSplitList(inPathStr:str) -> list:
""" """
inPathStr = inPathStr.replace("\\","/") inPathStr = inPathStr.replace("\\","/")
return inPathStr.split("/") return inPathStr.split("/")
def PathJoinList(inList: list) ->str:
"""Слияние элементов списка в строку. Учитывает специфику формирования путей в разных ОС (Windows, Linux)
Для Windows ОС: path\\to\\file
Для Linux ОС: path/to/file
.. code-block:: python
from pyOpenRPA.Tools import CrossOS
lPathStr = CrossOS.PathJoinList(inList = ['path', 'to', 'file'] )
# WINDOWS: lPathStr == 'path\\to\\file'
# LINUX: lPathStr == 'path/to/file'
:param inList: Строка, которую обработать в зависимости от ОС, на которой происходит выполнение
:type inList: str
:return: Массив элементов пути. Пример: ['path', 'to', 'file']
:rtype: list
"""
if IS_LINUX_BOOL: return "/".join(inList)
elif IS_WINDOWS_BOOL: return "\\".join(inList)

@ -101,7 +101,7 @@ class Render():
self.mEnv = jinja2.Environment(loader=self.mLoader, trim_blocks=True) self.mEnv = jinja2.Environment(loader=self.mLoader, trim_blocks=True)
self.mTemplate = self.mEnv.get_template(lTemplateFileNameStr) self.mTemplate = self.mEnv.get_template(lTemplateFileNameStr)
except Exception as e: except Exception as e:
self._LogException(inStr = "ОШИБКА ПРИ УСТАНОВКЕ ШАБЛОНА JINJA2", inLogger = inLogger) self._LogException(inStr = "ОШИБКА ПРИ УСТАНОВКЕ ШАБЛОНА JINJA2", inLogger = inLogger, inException=e)
def Generate(self, inDataDict=None, inLogger = None) -> str: def Generate(self, inDataDict=None, inLogger = None) -> str:
"""L+,W+: Сформировать текст из шаблона Jinja2. Pass the context inDataDict """L+,W+: Сформировать текст из шаблона Jinja2. Pass the context inDataDict
@ -133,7 +133,7 @@ class Render():
self._LogException(inStr="ОШИБКА ПРИ ГЕНЕРАЦИИ ТЕКСТА ИЗ ШАБЛОНА JINJA2", inLogger=inLogger) self._LogException(inStr="ОШИБКА ПРИ ГЕНЕРАЦИИ ТЕКСТА ИЗ ШАБЛОНА JINJA2", inLogger=inLogger)
# LOGGING HANDLERS # LOGGING HANDLERS
def _LogException(self, inStr, inLogger = None): def _LogException(self, inStr, inLogger = None, inException = None):
if inLogger is not None: inLogger.exception(inStr) if inLogger is not None: inLogger.exception(inStr)
elif self.mLogger is not None: self.mLogger.exception(inStr) elif self.mLogger is not None: self.mLogger.exception(inStr)
else: print(inStr) else: raise inException
Loading…
Cancel
Save