diff --git a/Orchestrator/Demo/HR_officer01/All_results.csv b/Orchestrator/Demo/HR_officer01/All_results.csv new file mode 100644 index 00000000..d3978ff9 --- /dev/null +++ b/Orchestrator/Demo/HR_officer01/All_results.csv @@ -0,0 +1,3 @@ +Ник;Полное имя;Логика;Язык;Время(мин);Решение +@floidd;Влад Клычков;5;9;0;Отказ +@floidd;Влад Клычков;8;8;0;Отказ diff --git a/Orchestrator/Demo/HR_officer01/HR_officer01.css b/Orchestrator/Demo/HR_officer01/HR_officer01.css new file mode 100644 index 00000000..76474990 --- /dev/null +++ b/Orchestrator/Demo/HR_officer01/HR_officer01.css @@ -0,0 +1,39 @@ +Button { + color: white; + background: rgb(82, 105, 95); + border-radius: 5px; + border-color: #FFFFFF #FFFFFF #FFFFFF; + border-width: 2px 2px; + padding: .5em 2em; + cursor: pointer; +} + +Button:hover { background: rgb(53, 167, 110); } + + +i#first { + position: absolute; + top: 280px; + left: 135px; +} + +i#second { + position: absolute; + top: 340px; + left: 135px; +} + + +h4 { + width: 100%; + text-align: center; + border-bottom: 5px solid rgb(82, 105, 95); + line-height: 0.1em; + margin: 10px 0 20px; +} + +h4 span { + background:#fff; + padding:0 7px; +} + diff --git a/Orchestrator/Demo/HR_officer01/HR_officer01.js b/Orchestrator/Demo/HR_officer01/HR_officer01.js new file mode 100644 index 00000000..12c5fbaa --- /dev/null +++ b/Orchestrator/Demo/HR_officer01/HR_officer01.js @@ -0,0 +1,74 @@ +$('.ui.selection.dropdown') + .dropdown("clear") + ; + + +var switchFlag = "1,"; +document.getElementById("Vacancy1Status").innerHTML = "Р РѕР±РѕС‚ РЅР° вакансию 1 оффлайн" +document.getElementById("Vacancy2Status").innerHTML = "Р РѕР±РѕС‚ РЅР° вакансию 2 оффлайн" + +var btn1 = document.createElement("Button") +btn1.innerHTML = "Старт" +btn1.onclick = function() { + if (switchFlag == "1,"){ + document.getElementById("Vacancy1Status").innerHTML = "Р РѕР±РѕС‚ РЅР° вакансию 1 онлайн" + } + else { + document.getElementById("Vacancy2Status").innerHTML = "Р РѕР±РѕС‚ РЅР° вакансию 2 онлайн" + } + +} +var btn2 = document.createElement("Button") +btn2.innerHTML = "Стоп" +btn2.onclick = function() { + if (switchFlag == "1,"){ + document.getElementById("Vacancy1Status").innerHTML = "Р РѕР±РѕС‚ РЅР° вакансию 1 оффлайн" + } + else { + document.getElementById("Vacancy2Status").innerHTML = "Р РѕР±РѕС‚ РЅР° вакансию 2 оффлайн" + } +} + + + + + + + + +function get_data(i) +{ + var link = document.createElement('a'); + if (i == 'question') { + link.setAttribute('href', '/HR_officer01/questions'); + link.setAttribute('download', 'Questions.csv'); + link.click(); + +} else if (i == "results") { + link.setAttribute('href', '/HR_officer01/results'); + link.setAttribute('download', 'All_results.csv'); + link.click(); +} else if (i == "logs"){ + link.setAttribute('href', '/HR_officer01/logs'); + link.setAttribute('download', 'log.txt'); + link.click(); + +} + return false; +} + + +function bot_change() { + switchFlag = $('.ui.selection.dropdown').dropdown("get value") + if ($('.ui.selection.dropdown').dropdown("get value") == "1,") { + document.getElementById("conteiner").appendChild(btn1) + document.getElementById("conteiner").appendChild(btn2) + } + else if ($('.ui.selection.dropdown').dropdown("get value") == "0,"){ + document.getElementById("conteiner").appendChild(btn1) + document.getElementById("conteiner").appendChild(btn2) + } + +} + + diff --git a/Orchestrator/Demo/HR_officer01/Questions.csv b/Orchestrator/Demo/HR_officer01/Questions.csv new file mode 100644 index 00000000..948392af --- /dev/null +++ b/Orchestrator/Demo/HR_officer01/Questions.csv @@ -0,0 +1,31 @@ +Вопрос;Ответ1 ;Ответ2;Ответ3;Ответ4;Правильный ответ +Шмурдик боится как мышей, так и тараканов;Шмурдик не боится тараканов;Шмурдик боится мышей;Шмурдик боится мышей больше, чем тараканов, но и тараканов боится тоже;;2 +Известно, что грымзик обязательно или полосат, или рогат, или то и другое вместе;Грымзик не может быть однотонным и безрогим одновременно;Грымзик не может быть безрогим;Грымзик не может быть полосатым и безрогим одновременно;;1 +Если запырку отравить, то она сразу начнет пускать пузыри;Если запырка пускает пузыри, то она была отравлена;Если запырку не отравить, то она не будет пускать пузыри;Если запырка не пускает пузыри, то она не отравлена;;3 +Все охлотушки умеют играть в шашки;Не бывает охлотушек, которые не умеют играть в шашки;Все, кто умеет играть в шашки, являются охлотушками;Не бывает охлотушек, которые умеют играть в шашки;;1 +Дубараторы бывают либо хорошими, либо плохими\. Неправда, что этот дубаратор не плохой;Этот дубаратор хороший;Этот дубаратор средненький;Этот дубаратор плохой;;3 +В природе обнаружено более десятка тиалей\. Все обнаруженные тиали сплошь красного цвета;По крайней мере некоторые из тиалей красного цвета;По крайней мере некоторые из тиалей зеленые;Некоторые тиали \(из тех, что уже обнаружены\) могут оказаться не красными;;1 +Существуют шакалы с больной мухропендией\. Мухропендия может быть, или больной, или здоровой;Не всякий шакал может похвастаться здоровой мухропендией;У некоторых шакалов мухропендия нездоровая;Существуют шакалы со здоровой мухропендией;;2 +Неправда, что наша тумельница большая и круглая;Наша тумельница маленькая и некруглая;Наша тумельница маленькая, или некруглая, или то и другое вместе;Наша тумельница маленькая, или некруглая, но не то и другое вместе;;2 +Джон всегда либо урдит, либо мурлит;Джон иногда урдит и мурлит;Джон иногда урдит, иногда мурлит, а иногда не мурлит;Джон никогда не занимается одновременно и урдением, и мурлением;;3 +Журналисты наврали, что бздыш болотный безграмотен и нахален;На самом деле бздыш болотный образован и тактичен;На самом деле бздыш болотный безграмотен, но не нахален;Те журналисты солгали;;3 +Если тряхнуть перпелькой, то немедленно начнется стрельба\. За последний час стрельбы не было;В течении последнего часа перпелькой не трясли;В течении последнего часа перпелькой трясли;А нечего было трясти чем попало;;1 +Огромный бутряк напугал деревенского старосту;Старосте приснился ночной кошмар;Староста попробовал некачественной выпивки;Староста был напуган;;3 +Если почесать угубку за ухом, он начнет довольно шипеть\. Если угубок довольно зашипит, то молоко поблизости скиснет;Если не чесать угубка за ухом, то молоко поблизости не скиснет;Если почесать угубка за ухом, молоко поблизости скиснет;Молоко вдалеке никогда не скисает от чесания угубков;;2 +Всех, кто громко обуривает, обязательно съедают\. Все ухмырки постоянно громко обуривают;Все, кто громко обуривает \- ухмырки;Всех ухмырков обязательно съедают;Некоторых ухмырков не съедают;;2 +В реках близ Тимуграда обитает и вобла, и щука;В реках близ Тимуграда не бывает воблы;В реках близ Тимуграда обитает щука;В реках близ Тимуграда обитает только вобла и щука;;2 +Выберите верное утверждение;Бизнес\-процесс ничем не отличается от алгоритма;Бизнес\-процесс является агрегацией алгоритмов;Алгоритм является агерацией бизнес\-процессов;;2 +Выберите верное утверждение;Задача и цель \- это синонимы;"Задача, чтобы задавать\; Цель, чтобы целиться";Цель \- это итоговая метрика, задача \- это действие, которое направлено на достижение цели;;3 +Как правильно произносится\?;пАйтон;пайтОн;питОн;пифОн;1 +Что является операндом в выражении\: x \= 6 \* 8 \/ y;x,y,6,8;\=,\*,\/;6,8,\*;6,8,y,\=;1 +Как определяется working directory при запуске процесса\?;По расположению запускаемого файла;По местонахождению папки с исходными кодами;По текущему установленному пути оболочки Shell\/cmd, из под которой происходит запуск;;3 +Список является массивом\?;Да;Нет;;;2 +Какое отличие между str и bytes\?;Отличий нет \- типы являются синонимами;Str является декодированным представлением bytes;Str является енкодированным представлением bytes;;2 +Какая операция в GIT отвечает за скачивание перечня ревизий с сервера\?;git push;git pull;git fetch;;3 +Какое отличие между многопроцессными и многопроцессорными вычислениями\?;Отличий нет;В многопроцессных вычислениях может использоваться только 1 процессор, а в многопроцессорных вычислениях всегда может использоваться от 2\-х и более процессоров;В многопроцессорных вычислениях может использоваться только 1 процессор, а в многопроцессных вычислениях может использоваться от 2\-х и более процессоров;;2 +Что является эквивалентом выражения\: \(X and Y\) or \(Z and Y\);not X and not Y and not Z;\(not X or not Y\) and \(not Z or not Y\);\(X and Y\) or \(X and Y\);not \(not X or not Y\) or not \(not Z or not Y\);4 +Какое число в десятичной системе счисления является образом числа 11 в пятиричной системе счисления\?;3;11;6;7;3 +Укажите корректное определение для SQL иснтрукции: SELECT \* FROM T1 INNER JOIN T2 ON T1\.ID \=\= T2\.T1\_ID;Выбрать все строки из таблицы T1;Выбрать все строки из таблицы T1, по связке с которыми имеется строка в T2;Выбрать все строки из таблицы T1 и показать строки из таблицы T2, если по ним имеется связь с T1;Выбрать все строки из таблицы T2 и показать строки из таблицы T1, если по ним имеется связь с T2;2 +Что делает команда SQL\: DELETE\?;Удаляет таблицу из БД;Чистит строки внутри таблицы;;;2 +Чем отличается относительный путь от абсолютного\?;Нет разницы \- оба пути указывают на один и тот же файл;Абсолютный путь в любом окружении будет указывать на один и тот же файл\. Относительный \- нет;Относительный путь в любом окружении будет указывать на один и тот же файл\. Абсолютный \- нет;;2 +Можно ли из ветки except повторно сгенерировать то же самое исключение exception \(тот же самый экземпляр\)\?;Нет \- исключение уже было сформировано, повторно его вызвать будет невозможно;Да \- исключение уже было сформировано, но его можно будет вызвать повторно;Наверное \- не понимаю как работает try \.\. Except;;2 diff --git a/Orchestrator/Demo/HR_officer01/config.py b/Orchestrator/Demo/HR_officer01/config.py new file mode 100644 index 00000000..c4670e38 --- /dev/null +++ b/Orchestrator/Demo/HR_officer01/config.py @@ -0,0 +1,171 @@ +splitter1 = 'Рабочий процесс' +splitter2 = 'Пример доступных данных' +splitter3 = 'Пример запуска роботов' +title = 'Р РѕР±РѕС‚-кадровик' + +introHeader = 'Применение:' +introText = 'Р РѕР±РѕС‚-кадровик помогает проводить отбор кандидатов' + +workflowHeader1 = 'Размещение вакансии' +workflowDescription1 = 'Выполняет человек' +workflowHint1 = 'Размещение вакансии РІ telegram/HH.ru' +workflowHeader2 = 'Тестирование' +workflowDescription2 = 'Выполняет СЂРѕР±РѕС‚' +workflowHint2 = 'Автоматическое тестирования кандидатов' +workflowHeader3 = 'Подведение итогов' +workflowDescription3 = 'Выполняет СЂРѕР±РѕС‚' +workflowHint3 = 'Автоматическое подведение итогов тестирования' +workflowHeader4 = 'Личное собеседование' +workflowDescription4 = 'Выполняет человек' +workflowHint4 = 'Собеседование СЃ лучшими кандидатами' +workflowHeader5 = 'Оформление будущего сотрудника' +workflowDescription5 = 'Выполняет человек' +workflowHint5 = 'Подписание трудового РґРѕРіРѕРІРѕСЂР°' + + +questionHeaderMsg = 'Р’РѕРїСЂРѕСЃС‹' +questionDescriptionMsg = 'РЎРїРёСЃРѕРє РІРѕРїСЂРѕСЃРѕРІ для первого этапа' +resultHeaderMsg = 'Результаты' +resultDescriptionMsg = 'РЎРІРѕРґРєР° РїРѕ всем рекрутам' +logHeaderMsg = 'Лог' +logDescriptionMsg = 'Лог Р·Р° текущие сутки' + +dropdownInit = 'Выберите робота...' +dropdownRobot1 = 'Р РѕР±РѕС‚ РЅР° вакансию 1' +dropdownRobot2 = 'Р РѕР±РѕС‚ РЅР° вакансию 2' + + + + + + + + +html = f''' + + + + + Test + + + + + + + +
+
+

{title}


+
+
{introHeader}
+

{introText}

+
+ +

{splitter1}

+ +
+
+ +
+
{workflowHeader1}
+
{workflowDescription1}
+
+
+
+ +
+
{workflowHeader2}
+
{workflowDescription2}
+
+
+
+ +
+
{workflowHeader3}
+
{workflowDescription3}
+
+
+
+ +
+
{workflowHeader4}
+
{workflowDescription4}
+
+
+
+ +
+
{workflowHeader5}
+
{workflowDescription5}
+
+
+
+ +

{splitter2}

+ +
+
+ +
+ {questionHeaderMsg} +
{questionDescriptionMsg}
+
+
+
+ +
+ {resultHeaderMsg} +
{resultDescriptionMsg}
+
+
+
+ +
+ {logHeaderMsg} +
{logDescriptionMsg}
+
+
+
+ +

{splitter3}

+ +
+
+ +
+
+
+ +
+
+
+ + + + +

+ + + +
+
+ + + + + + + +''' + +with open('index.html', 'w', encoding='UTF-8') as file: + file.write(html) diff --git a/Orchestrator/Demo/HR_officer01/index.html b/Orchestrator/Demo/HR_officer01/index.html new file mode 100644 index 00000000..23545cb0 --- /dev/null +++ b/Orchestrator/Demo/HR_officer01/index.html @@ -0,0 +1,125 @@ + + + + + + Test + + + + + + + +
+
+

Робот-кадровик


+
+
Применение:
+

Робот-кадровик помогает проводить отбор кандидатов

+
+ +

Рабочий процесс

+ +
+
+ +
+
Размещение вакансии
+
Выполняет человек
+
+
+
+ +
+
Тестирование
+
Выполняет робот
+
+
+
+ +
+
Подведение итогов
+
Выполняет робот
+
+
+
+ +
+
Личное собеседование
+
Выполняет человек
+
+
+
+ +
+
Оформление будущего сотрудника
+
Выполняет человек
+
+
+
+ +

Пример доступных данных

+ +
+
+ +
+ Р’РѕРїСЂРѕСЃС‹ +
Список вопросов для первого этапа
+
+
+
+ +
+ Результаты +
Сводка по всем рекрутам
+
+
+
+ +
+ Лог +
Лог за текущие сутки
+
+
+
+ +

Пример запуска роботов

+ +
+
+ +
+
+
+ +
+
+
+ + + + +

+ + + +
+
+ + + + + + + + \ No newline at end of file diff --git a/Orchestrator/Demo/HR_officer01/log.txt b/Orchestrator/Demo/HR_officer01/log.txt new file mode 100644 index 00000000..0cab33b3 --- /dev/null +++ b/Orchestrator/Demo/HR_officer01/log.txt @@ -0,0 +1 @@ +Это лог diff --git a/Orchestrator/Demo/Treasurer01/config.py b/Orchestrator/Demo/Treasurer01/config.py new file mode 100644 index 00000000..503b015f --- /dev/null +++ b/Orchestrator/Demo/Treasurer01/config.py @@ -0,0 +1,184 @@ +splitter1 = 'Рабочий процесс' +splitter2 = 'Окно настройки робота' + +title = 'Робот-казначей' + +introHeader = 'Применение:' +introText = 'Робот-казначей выполняет выгрузку банковских выписок' + +workflowHeader1 = 'Авторизация в клиент-банке' +workflowDescription1 = 'Выполняет робот' +workflowHint1 = 'Авторизация на сайте банка' +workflowHeader2 = 'Выгрузка выписок' +workflowDescription2 = 'Выполняет робот' +workflowHint2 = 'Скачивание выписок с сайта банка' +workflowHeader3 = 'Перенаправление выписок' +workflowDescription3 = 'Выполняет робот' +workflowHint3 = 'Например, размещение в сетевой папке' + +dropBankTitle = 'Выберите банк...' +dropBank1 = 'Сбербанк' +dropBank2 = 'ВТБ' +dropBank3= 'Альфа-банк' + +dropBankAccountTitle = 'Выберите счет' +dropBankAccount1 = 'Счет 1' +dropBankAccount2 = 'Счет 2' +dropBankAccount3 = 'Счет 3' +dropBankAccountAll = 'Все' + +checkboxPerTitle = 'Период:' +checkboxPer1 = 'За день' +checkboxPer2 = 'За месяц' + +checkboxFormTitle = '' +checkboxForm1 = 'PDF' +checkboxForm2 = '1C' +checkboxForm3 = 'WORD' +checkboxForm4 = 'EXCEL' + +emailTitle = 'Укажите почту (необязательно):' +emailWindow = 'example@gmail.ru' + +btnDownload = 'Скачать' +btnEmail = 'Отправить' + + +html = f''' + + + + + Treasurer + + + + + + +
+
+

{title}


+
+
{introHeader}
+

{introText}

+
+ +

{splitter1}

+ +
+
+ +
+
{workflowHeader1}
+
{workflowDescription1}
+
+
+
+ +
+
{workflowHeader2}
+
{workflowDescription2}
+
+
+
+ +
+
{workflowHeader3}
+
{workflowDescription3}
+
+
+
+ +

{splitter2}

+ +

+ +
+ +
+
+ +
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ +
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
{emailTitle}
+

+ +

+ + + + + +
+
+ + + + + + +''' + +with open('index.html', 'w', encoding='UTF-8') as file: + file.write(html) diff --git a/Orchestrator/Demo/Treasurer01/index.html b/Orchestrator/Demo/Treasurer01/index.html new file mode 100644 index 00000000..b7ee2afd --- /dev/null +++ b/Orchestrator/Demo/Treasurer01/index.html @@ -0,0 +1,135 @@ + + + + + + Treasurer + + + + + + +
+
+

Робот-казначей


+
+
Применение:
+

Робот-казначей выполняет выгрузку банковских выписок

+
+ +

Рабочий процесс

+ +
+
+ +
+
Авторизация в клиент-банке
+
Выполняет робот
+
+
+
+ +
+
Выгрузка выписок
+
Выполняет робот
+
+
+
+ +
+
Перенаправление выписок
+
Выполняет робот
+
+
+
+ +

Окно настройки робота

+ +

+ +
+ +
+
+ +
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ +
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
Укажите почту (необязательно):
+

+ +

+ + + + + +
+
+ + + + + + + \ No newline at end of file diff --git a/Orchestrator/Demo/Treasurer01/treasurer01.css b/Orchestrator/Demo/Treasurer01/treasurer01.css new file mode 100644 index 00000000..e69de29b diff --git a/Orchestrator/Demo/Treasurer01/treasurer01.js b/Orchestrator/Demo/Treasurer01/treasurer01.js new file mode 100644 index 00000000..90bbd012 --- /dev/null +++ b/Orchestrator/Demo/Treasurer01/treasurer01.js @@ -0,0 +1,7 @@ +$('.ui.dropdown') + .dropdown('clear') +; + +$('.ui.dropdown') + .dropdown('clear') +; \ No newline at end of file diff --git a/Orchestrator/config.py b/Orchestrator/config.py index 9f3557de..6f9ddc7c 100755 --- a/Orchestrator/config.py +++ b/Orchestrator/config.py @@ -17,6 +17,35 @@ import threading from fastapi import Depends from fastapi.responses import PlainTextResponse +from fastapi.responses import FileResponse + +# Подключени файлов связанных с роботом-кадровиком01 +@app.get(path="/HR_officer01/questions",tags=["HR_officer01"]) +def get_file(): + return FileResponse(CrossOS.PathStr("Demo\\HR_officer01\\Questions.csv")) + +@app.get(path="/HR_officer01/results",tags=["HR_officer01"]) +def get_file(): + return FileResponse(CrossOS.PathStr("Demo\\HR_officer01\\All_results.csv")) + +@app.get(path="/HR_officer01/logs",tags=["HR_officer01"]) +def get_file(): + return FileResponse(CrossOS.PathStr("Demo\\HR_officer01\\log.txt")) + +@app.get(path="/HR_officer01/scripts",tags=["HR_officer01"]) +def get_file(): + return FileResponse(CrossOS.PathStr("Demo\\HR_officer01\\HR_officer01.js")) + +@app.get(path="/HR_officer01/styles",tags=["HR_officer01"]) +def get_file(): + return FileResponse(CrossOS.PathStr("Demo\\HR_officer01\\HR_officer01.css")) + + +# Подключени файлов связанных с роботом-казначеем01 +@app.get(path="/Treasurer01/scripts",tags=["Treasurer01"]) +def get_file(): + return FileResponse("Demo\\Treasurer01\\Treasurer01.js") + # Пример создания функции на сервере (FASTAPI) /test/threads @app.get(path="/test/threads",tags=["Test"],response_class=PlainTextResponse) @@ -42,7 +71,7 @@ else: Orchestrator.UACUpdate(inGSettings=gSettings, inADLoginStr="ND", inADStr="", inADIsDefaultBool=True, inURLList=[], inRoleHierarchyAllowedDict=lUACClientDict) Orchestrator.UACUpdate(inGSettings=gSettings, inADLoginStr="rpa00", inADStr="", inADIsDefaultBool=True, inURLList=[], inRoleHierarchyAllowedDict=lUACClientDict) # TEST Add User IMaslov - Add Login IMaslov to superuser of the Orchestrator - Orchestrator.UACUpdate(inGSettings=gSettings, inADLoginStr="IMaslov", inADStr="", inADIsDefaultBool=True, inURLList=[]) + Orchestrator.UACUpdate(inGSettings=gSettings, inADLoginStr="VLADICK", inADStr="", inADIsDefaultBool=True, inURLList=[]) # TEST Add Supertoken for the all access between robots Orchestrator.UACSuperTokenUpdate(inGSettings=gSettings, inSuperTokenStr="1992-04-03-0643-ru-b4ff-openrpa52zzz") # Add first interface! @@ -54,6 +83,10 @@ else: Orchestrator.OrchestratorSessionRestore(inGSettings=gSettings) # Autoinit control panels starts with CP_ lPyModules = Orchestrator.OrchestratorPySearchInit(inGlobPatternStr="ControlPanel\\CP_*.py", inDefStr="SettingsUpdate", inDefArgNameGSettingsStr="inGSettings", inAsyncInitBool=True) + lCPManager = Orchestrator.Managers.ControlPanel(inControlPanelNameStr="HR_officer01ControlPanel", + inRefreshHTMLJinja2TemplatePathStr=CrossOS.PathStr("D:\\For work\\RPA\\OpenRPA\\Orchestrator\\Demo\\HR_officer01\\index.html"), inJinja2TemplateRefreshBool = True) + lCPManager = Orchestrator.Managers.ControlPanel(inControlPanelNameStr="Treasurer01ControlPanel", + inRefreshHTMLJinja2TemplatePathStr=CrossOS.PathStr("D:\\For work\\RPA\\OpenRPA\\Orchestrator\\Demo\\Treasurer01\\index.html"), inJinja2TemplateRefreshBool = True) # Call the orchestrator def Orchestrator.Orchestrator(inGSettings=gSettings, inDumpRestoreBool=False)