254 Commits
v0.2 ... v0.16

Author SHA1 Message Date
84bdd7dfa6 refact gitignore 2025-12-09 10:51:56 +03:00
6a48bf4cb2 refact 2025-12-09 10:09:25 +03:00
05fce073f1 refact1 2025-12-05 12:20:47 +03:00
57673d0ee4 rename0 2025-12-05 11:48:24 +03:00
63cd6a71d1 refact 2025-12-05 10:29:08 +03:00
11c8e21729 Naming 2025-12-02 18:13:51 +03:00
75ffb5ceca смена пароля админа + иконка в exe 2025-12-02 15:10:23 +03:00
2e807112f0 refact 2025-12-01 15:27:09 +03:00
0b7f772b21 signal_hasError 2025-12-01 14:50:15 +03:00
c97c86ac55 Оповещения о непрочитанных сообщениях 2025-12-01 14:29:26 +03:00
834e192479 Merge branch 'work31' into DEV 2025-12-01 10:12:04 +03:00
d2384d3758 refact 2025-12-01 00:55:22 +03:00
df1ada6945 refact 2025-11-30 23:12:00 +03:00
54f1744e7f errorCheck переделал 2025-11-30 22:54:09 +03:00
d30e6b4927 WidgetTools::closeAllChildWidgets 2025-11-30 21:29:32 +03:00
d129fbded0 notifyController убрал 2025-11-30 19:28:08 +03:00
fb493aca9f SpecMsgBox в процессе исправления 2025-11-28 21:01:33 +03:00
semenov
44e7c4781a Merge branch 'DEV' of https://gitea.msk.dinamika-avia.ru/Constanta-Design/RRJServer into DEV
# Conflicts:
#	ServerLMS/Systems/processingsystem.cpp
2025-11-28 16:54:22 +03:00
semenov
567eb282d7 docs: add tasks 2025-11-28 16:52:13 +03:00
8ad6d06f18 closeChildDlg 2025-11-28 12:32:53 +03:00
612fcc8aa7 refact 2025-11-28 11:28:39 +03:00
c61066cfd1 Refact 2025-11-27 18:06:13 +03:00
6f44b6125e Server. Перекомпоновка интерфейса 2025-11-27 17:35:56 +03:00
ace95db3df Переводы ошибок 2025-11-27 17:05:26 +03:00
bf87a2c982 GUI.Тип ошибки авторизации 2025-11-27 16:54:40 +03:00
00c9ec8893 refact0 2025-11-27 15:02:04 +03:00
4def07ff68 GUI. Закрытие диалогов при расконнекте с Сервером 2025-11-27 14:46:18 +03:00
b0f02e742a Отработка BUSSY 2025-11-27 13:25:30 +03:00
f0e04954ed refact1 2025-11-27 11:45:14 +03:00
711963c9be refact0 2025-11-27 11:24:06 +03:00
3e50bfe2e2 Схлопывание диалогов при выключении Сервера 2025-11-27 10:43:12 +03:00
f75ff9660f refact1 2025-11-26 18:09:41 +03:00
23d432170d refact0 2025-11-26 17:47:56 +03:00
1c151d4aff VersionSelectWidget refact 2025-11-26 17:28:22 +03:00
44b6299e59 notifyController -> specialWB 2025-11-26 11:19:11 +03:00
f6e96e002c refact 2025-11-25 18:32:46 +03:00
e3dcd8c54b Merge branch 'work29' into DEV 2025-11-25 17:51:36 +03:00
173c369cc5 NewVersionWidget -> Dialog 2025-11-25 17:51:12 +03:00
c627bc73d9 Server. тображение текущей версии. 2025-11-25 15:54:25 +03:00
e24c57c395 refact0 2025-11-25 12:46:58 +03:00
9a4a082ffc GUI. fix. Обнуление диалогов при разлогинивании. 2025-11-25 11:07:35 +03:00
f2d7557f19 Авто подключение работает 2025-11-24 18:19:28 +03:00
4bdfb8163a GUI. автоматические 10 попыток подкл к Серверу 2025-11-24 16:27:13 +03:00
76a5f08481 Списки subProc невыделяемые 2025-11-24 15:28:35 +03:00
semenov
f43abdc46d feat: load version 2025-11-24 12:56:34 +03:00
1842c9381f Schem update 2025-11-24 12:38:44 +03:00
4f6958ef81 Update style css 2025-11-24 12:38:19 +03:00
770a705281 Server. Начальная загрузка. Крутилка. 2025-11-24 10:30:20 +03:00
b6c0f6aa57 Крутилка при запуске Сервера 2025-11-23 00:11:47 +03:00
72d107308c Доделал списки подпроцедур 2025-11-22 23:40:24 +03:00
394eee5a16 Объединенные ячейки списка 2025-11-22 22:08:03 +03:00
5bb9816593 ПП отображаются в виде выпадающего списка (назн-е) 2025-11-21 14:05:02 +03:00
semenov
73fd93a834 feat: link busy state with lock icon 2025-11-21 10:16:06 +03:00
72438e8257 refact 2025-11-20 16:00:10 +03:00
27b4edef6d Доукомплектация папки 2025-11-20 15:45:48 +03:00
bbef1f73b4 Merge branch 'work28' into DEV 2025-11-20 15:30:43 +03:00
15eade2363 Correct SQL Delete Trainee query 2025-11-20 15:29:51 +03:00
semenov
b16fd1f53d Merge branch 'scenario-updater' into DEV 2025-11-20 13:10:56 +03:00
08664989b9 refact 2025-11-20 13:09:40 +03:00
semenov
7e27584c5a bugfix: segregate send and delete list to client 2025-11-20 13:04:36 +03:00
semenov
bd0bed926c ref: segregate client hashes 2025-11-20 12:14:50 +03:00
176ced7045 Server. Фильтрация subProc на совпадения 2025-11-19 17:33:50 +03:00
74594de4ad Недоступные к назначение заблочены 2025-11-19 15:36:58 +03:00
069aa80826 GUI. subProc отобр. выпад-м списком в ранее назн. 2025-11-19 15:01:23 +03:00
semenov
560b7ff4cb feat: add update scenario 2025-11-19 14:03:24 +03:00
ee97f83856 subproc выгр. из БД и отпр. клиентам в списках AMM 2025-11-19 12:57:46 +03:00
74bdac7540 subproc удаляются из БД 2025-11-19 11:51:30 +03:00
10a30af698 subprocs сохраняются в БД 2025-11-19 11:22:08 +03:00
9bff7c3050 Сервер. Список ПП парсится, но не сохр. в БД 2025-11-18 17:53:23 +03:00
31e01ff8e5 refact. SubProc превр. в класс. fix bug canplay 2025-11-18 17:23:37 +03:00
b333ec8ec1 Передача списка subProc в Сервер 2025-11-18 14:52:39 +03:00
4f14cddbed передается список ПП в sendQueryToDB для отправки 2025-11-18 12:58:13 +03:00
168ded7b1e подпроцедуры можно выбирать (чекбоксом) 2025-11-17 17:06:48 +03:00
bd0f52c613 Списки отображаются в виде дерева 2025-11-17 16:10:31 +03:00
semenov
c0d6571f2c ref: asset updater scheme 2025-11-17 14:32:04 +03:00
d280472e1f Небольшой рефакт 2025-11-17 13:47:26 +03:00
546edf1b52 Списки отображаются (пока только DMCode) 2025-11-17 13:32:14 +03:00
200f919afe Построение списка ПП в ГУИ в процессе 2025-11-17 13:16:14 +03:00
0c7d84ec84 в GUI приходит ответ с перечнем ПП от Сервера 2025-11-17 10:22:02 +03:00
aa4972c3a5 GUI. Отправка запроса на список ПП в Сервер 2025-11-13 17:16:38 +03:00
208fa638ef GUI. Заготовка под список подпроцедур 2 2025-11-13 16:36:38 +03:00
47d9c182a5 GUI. Заготовка под список подпроцедур 2025-11-13 16:11:54 +03:00
a6bee48b77 Построение списков подпроцедур в Сервере работает 2025-11-13 14:34:39 +03:00
4bfd4dad82 Формируются списки подпроцедур 1 ур в сервере 2025-11-12 17:47:53 +03:00
98821a7533 Индикация и возм обновл docs из ГУИ 2025-11-12 15:22:15 +03:00
650b0525a3 DocsUpdater в отдельный поток 2025-11-12 10:55:31 +03:00
81d7e5e6d6 DocsUpdater рабочая версия 2025-11-11 18:00:06 +03:00
9df00eda9e refact 2025-11-11 15:12:54 +03:00
404fb0bf49 loadXMLtoDOM, saveDOMtoXML перенес в Tools 2025-11-11 15:11:24 +03:00
9b87bcc490 DocsUpdater 1rev 2025-11-11 14:55:37 +03:00
ff8767d1b3 Начал реал-ть список подпроцедур ViewerTasksCommon 2025-11-07 21:05:56 +03:00
364d3f44a9 Refact 2025-11-07 10:57:02 +03:00
e79186cb4f Refact 2025-11-07 01:31:19 +03:00
fd8fcd5c1d refact struct projects 2025-11-06 23:56:52 +03:00
c021421118 Отложенная инициализация в Сервере (старт виджета) 2025-11-06 21:49:15 +03:00
2d3d4f82dd Прокинул сигнал ошибки SQL на виджет 2025-11-06 20:55:16 +03:00
da7363dfb5 Переименовал Диалог Авторизации 2025-11-06 17:19:43 +03:00
2d1e17627b Рефакт Администрирование БД 3 2025-11-06 16:46:41 +03:00
2d91b18bfb Рефакт Администрирование БД 2 2025-11-05 23:50:10 +03:00
99d9c6d1e3 Рефакт Администрирование БД 1 2025-11-05 16:17:26 +03:00
84ea6ca512 Рефакт Администрирование БД 2025-11-05 12:36:11 +03:00
e9363c388b refact 0 2025-11-01 13:19:52 +03:00
0d1d851e3f Создание БД из кода. Требуется рефакт. 2025-10-30 14:56:58 +03:00
c11871e8f4 Рефакт интерфейса 2025-10-28 16:43:18 +03:00
39c11897f8 Рефакт 2025-10-27 18:46:50 +03:00
ce65daea2e TrayServerLMS рабочая версия 2025-10-27 16:20:34 +03:00
d4fd29f373 Сервер. Settings DB 2025-10-24 16:34:53 +03:00
5287d5f13d Сервер рефакт 2025-10-21 14:40:35 +03:00
f2df91e97e Сервер сменил иконку 2025-10-21 12:48:39 +03:00
ff6f70c967 Перевод Сервера работает 2025-10-21 12:42:12 +03:00
b9a39287cf Settings 2 2025-10-21 11:48:30 +03:00
068a4ee14a Settings 1 2025-10-20 18:47:13 +03:00
294a7e4a7d TrayServerLMS переименовал 2025-10-20 17:07:26 +03:00
93343a56e5 Server Interface Refact 2025-10-20 15:24:04 +03:00
86ee77e8cb Gui без консоли 2025-10-20 14:35:45 +03:00
ad8a544e45 Рефакт 2025-10-20 13:33:10 +03:00
f4ffc7c393 Server в Трее 1 2025-10-20 12:44:37 +03:00
edadfdf323 Рефакт 2025-10-17 17:36:33 +03:00
5c147be57a Refact 1 2025-10-17 16:24:50 +03:00
2d8c13fd1a Refact connectortoserver 2025-10-17 16:12:33 +03:00
e2a2d8142c Refact common 2025-10-17 15:08:09 +03:00
d643205323 DialogEditTrainee (adminMode) 2025-10-17 11:12:57 +03:00
b539f9fd2b Изменение пароля 2025-10-16 18:56:09 +03:00
241382d305 Хэширование пароля 2025-10-16 17:11:58 +03:00
8e931f229b Рефакт интерфейс 2025-10-15 18:04:10 +03:00
2cf219ce94 Отправка сообщений по Enter 2025-10-15 16:48:23 +03:00
79c5354f58 Рефакт интерфейс 2025-10-15 11:16:10 +03:00
e5f4c0bd00 В списке задач не выбирается первая по умолчанию 2025-10-15 10:27:31 +03:00
936ee45fd6 Валидация логинов 2025-10-15 10:13:01 +03:00
6af6ca1ab3 Не слетает выбранная задача при обновлении дерева 2025-10-14 11:52:03 +03:00
5d5267f859 Кнопка для Персональной карточки 2025-10-07 19:17:47 +03:00
f6c4da675d Перевод 2025-10-07 18:10:39 +03:00
fc42dc0723 Добавил параметры БД в Сервер 2025-10-07 17:41:49 +03:00
b1baafe6a1 refact 2025-10-03 14:45:03 +03:00
17f6119954 Блокировка доработал 2025-10-03 10:51:17 +03:00
a70c8b5be1 Блокировка Авторизации при Редактировании в ГУИ 2025-10-02 18:36:41 +03:00
05d4e02d02 Добавил наименование задачи и DMcode в проверку 2025-10-01 17:23:50 +03:00
e108b79d09 ширина скрола для task 25 2025-10-01 16:37:59 +03:00
191b817c21 Заблочил сортировку деревьев по колонкам 2025-10-01 16:31:59 +03:00
81dca6e106 Obsidian update 2025-10-01 15:32:27 +03:00
9a2d816d0a refact DBLMS 2025-09-30 17:47:25 +03:00
dd4d58a393 Ширина скрола 20 2025-09-30 17:09:53 +03:00
2c35b7bd06 Транзакция корректно закрывается (commit) 2025-09-26 11:53:42 +03:00
7c70fc90d6 Оптимизировал дерево в Задачах (размеры колонок) 2025-09-25 17:56:46 +03:00
b055ff4ed4 Перевод 2025-09-25 12:03:14 +03:00
6a20421948 Merge branch 'work21' into DEV 2025-09-25 11:50:48 +03:00
semenov
edc278dcd1 feat: add information 2025-09-25 11:47:42 +03:00
152942018a Оптимизировал CommonView 2025-09-25 11:46:30 +03:00
semenov
722889789e feat: fast hash checker 2025-09-23 09:23:26 +03:00
semenov
b695522a68 ref: delete duplicate meth 2025-09-22 11:53:54 +03:00
semenov
205f60fd7d Merge branch 'test-size-of-message' into DEV 2025-09-19 11:40:43 +03:00
semenov
b00c5b8264 fix: fast connection 2025-09-19 11:39:54 +03:00
d93e5e49c9 Рефакт 2025-09-19 10:42:51 +03:00
4eabd95506 obsidian1 2025-09-19 10:24:39 +03:00
194ccc33a4 obsidian 2025-09-19 09:59:30 +03:00
f2c6280bf3 Перевод 2025-09-18 18:26:55 +03:00
semenov
662ae41f68 Merge branch 'new-init-behaviour' into DEV
# Conflicts:
#	InstructorsAndTrainees/connectorToServer/Core/sendsystem.cpp
#	InstructorsAndTrainees/connectorToServer/connectortoserver.cpp
2025-09-18 14:29:26 +03:00
semenov
441be217d9 fix: GUI double send getOfflineMessage 2025-09-18 13:27:23 +03:00
8bb54cb56c Вывел все окна в свои диалоги 2025-09-18 13:26:22 +03:00
semenov
ced8a5cc64 fix: first initialize 2025-09-18 12:55:26 +03:00
a2cd5280bd вынес DialogChekerTask 2025-09-18 12:17:28 +03:00
semenov
a2375700b1 fix: big xml code 2025-09-18 12:02:21 +03:00
af243cc4d8 переименовал CheckerTask 2025-09-18 11:26:03 +03:00
9f4120c2d1 решение проблемы закрфтия вложенных окон при П.С. 2025-09-18 11:03:58 +03:00
6aab774795 refact2 2025-09-17 22:23:38 +03:00
973ca4a31d refact1 2025-09-17 18:12:14 +03:00
8cf98ea2d9 refact0 2025-09-17 17:42:34 +03:00
bd1bcd4e71 bugFixing 7 2025-09-16 17:09:34 +03:00
ac66951d76 bugFixing 6 2025-09-16 16:23:43 +03:00
cf92ae0483 bugFixing 5 2025-09-16 15:52:24 +03:00
cba4008a06 bugFixing 4 2025-09-16 15:17:02 +03:00
b6fb178827 bugFixing 3 2025-09-16 14:26:39 +03:00
eaf5f0673a bugFixing 2 2025-09-16 12:50:58 +03:00
b026bbe0d4 bugFixing 1 2025-09-16 11:28:57 +03:00
31cf125c2f bugFixing 0 2025-09-16 11:03:10 +03:00
0e81d14566 SpecialMessageBox 2025-09-15 18:20:39 +03:00
bffbd0fe81 Коррекция pushButton 2025-09-15 13:31:49 +03:00
8c3e636d27 Авторизация Кнопка Login in 2025-09-15 12:45:53 +03:00
762437a908 Убрал кнопки Справка из диалогов ГУИ 2025-09-15 11:54:51 +03:00
908430fd24 Пофиксил Варнинг на имя слотов on_TreeWidget... 2025-09-15 11:00:12 +03:00
8533ff4c34 Рефакт 2025-09-12 17:11:53 +03:00
7022db1e5c Мессенджер готов. Почти. 2025-09-12 16:43:15 +03:00
535c025276 Fix bag 2025-09-12 15:08:34 +03:00
e12ca8b62e Рефакт 2025-09-12 14:49:02 +03:00
2a8947f378 Правильные аватары для Юзеров (удаленных) в чате 2025-09-12 12:51:21 +03:00
96d63effa5 Иконка Юзера в шапке чата 2025-09-12 12:33:58 +03:00
8bb2aef5cc Messenger убрал табы 2025-09-12 12:09:30 +03:00
ba6e0178ec Refact 0 2025-09-12 11:46:01 +03:00
df4f4cf659 Рефакт прочистка 2025-09-12 11:30:56 +03:00
9f907f8649 Refact style 2025-09-12 10:40:25 +03:00
3009a90b76 Copy Style 2025-09-12 09:23:28 +03:00
f49da62379 Мессенджер рефакт еще 2025-09-11 18:09:46 +03:00
d6795e4723 Рефакт Месссенджера закончил :) 2025-09-11 16:37:49 +03:00
f53256f5b1 Рефакт а1 2025-09-11 15:23:26 +03:00
874ca7e806 Рефакт 2025-09-11 15:05:11 +03:00
a5431175d9 Рефакт Message Item 2025-09-11 14:48:38 +03:00
2066925844 рЕФАКТ 2025-09-11 14:33:10 +03:00
6bcf8a60ba Рефакт 2025-09-11 12:55:28 +03:00
d65776ff98 Рефакт стиль 2025-09-11 09:39:25 +03:00
33f67c14f1 Рефакт 2025-09-10 18:17:47 +03:00
747734a763 Мессенджер: время 2025-09-10 15:23:10 +03:00
c57b94786f Выбор Обучаемых/Инструкторов исправил 2025-09-10 12:27:35 +03:00
b6892ae43b Перегруппировал AMM FIM 2025-09-10 11:29:59 +03:00
1e68e2b47e Рефакт1 Интерфейса 2025-09-10 11:14:57 +03:00
6e75e403fa Белые табы 2025-09-09 18:43:44 +03:00
1e4e7fdcaa Выбирается либо Обучаемый либо Инструктор 2025-09-09 18:24:21 +03:00
43a3bc793c on_treeWidget_itemClicked 2025-09-09 17:57:14 +03:00
0728582be0 Из ГУИ чат с инструкторами 2025-09-09 17:25:26 +03:00
15325eb43a Подготовка мессенджера под юзеров 2025-09-09 16:58:18 +03:00
e2f7ca88c1 Рефакт7 Мессенджера 2025-09-09 15:52:47 +03:00
deb7938ff8 Рефакт6 Мессенджера 2025-09-09 14:45:50 +03:00
588f921a73 Рефакт5 Мессенджера 2025-09-09 13:28:23 +03:00
bb4cb9cfa3 Рефакт4 Мессенджера 2025-09-09 12:53:29 +03:00
b0c02e208f Рефакт3 Мессенджера 2025-09-09 12:32:43 +03:00
1f5fce7ca0 Рефакт2 Мессенджера 2025-09-09 12:09:33 +03:00
24344ccbd5 Рефакт1 Мессенджера 2025-09-09 11:52:41 +03:00
0274898db4 Вернул большие иконки для не частых картинок 2025-09-09 11:02:42 +03:00
ecbf185896 Убрал вкладочность из Мессенджера 2025-09-09 10:49:03 +03:00
80200d7054 Рефакт 2025-09-08 18:42:59 +03:00
120cf894ed Переверстал Главный виджет 2025-09-08 17:11:47 +03:00
86b268f13f Step 1 refact Control 2025-09-08 16:45:05 +03:00
1611f0ea68 Выровнял списки Обучаемые Инструкторы 2025-09-08 16:23:51 +03:00
bb37110a4f Перевод заголовка ГО ГУИ 2025-09-08 16:11:40 +03:00
53a58eadcb Рефакт+Переводы 2025-09-08 15:37:31 +03:00
22e2ebff94 Прокинул общее кол-во AMM и FIM 2025-09-05 17:23:51 +03:00
83cb8bf5a5 Прокинул тайминги на ГУИ 2025-09-05 16:41:39 +03:00
9d8e84b80f Пофиксил 4Гб оперативки 2025-09-05 13:20:48 +03:00
a69ec4feb7 cmd_GetOfflineMessages один раз 2025-09-04 18:04:25 +03:00
aeb24d659d убрал sendQueryTasksXML из slot_HashReady 2025-09-04 17:53:01 +03:00
b3109e4ac7 cmd_GetOfflineMessages 2025-09-04 17:41:28 +03:00
adfd058fa1 Контроллер мессенджера доработанный 2025-09-04 16:48:48 +03:00
7a909d1ee5 Контроллер мессенджера упрощенный 2025-09-03 18:30:36 +03:00
5e834b582f Завел контроллер Месанджера 2025-09-03 17:24:36 +03:00
e9b571aa81 Полуработающий мессенгер 2025-09-03 11:49:48 +03:00
179026d4ca внедрение мессенджера 2025-09-02 15:52:35 +03:00
0da66544f0 Перекомпоновал ГУИ 2025-09-02 12:24:31 +03:00
eaf5668528 Перенес кнопки задач вниз 2025-09-01 19:02:40 +03:00
5b74577347 Карточка обучаемого. Задачи. Общие виджеты. 2025-09-01 18:29:47 +03:00
b13b59beed Пофиксил неправильную распаковку репорта от Клиента 2025-09-01 15:03:08 +03:00
semenov
2c5def54ca Merge branch 'refactoring-messenger' into DEV 2025-08-20 14:35:22 +03:00
889457a8d3 Пустой тайминг 2025-08-20 14:33:31 +03:00
semenov
472300c1d8 bugfix: send old messages to QTGUI 2025-08-20 14:26:40 +03:00
28de2cc6c9 Заготовка для Карточки обучаемого 2025-08-20 12:26:34 +03:00
86aa07e89f Модуль DataBaseLMS рефакторинг 2025-08-19 18:05:48 +03:00
194b5129b8 допилил ownerWidget в DataBaseLMS 2025-08-19 16:49:45 +03:00
b412559483 Merge branch 'work17' into DEV 2025-08-18 17:20:05 +03:00
037390a9c7 Контроль целостности логинов юзеров 2025-08-18 17:19:29 +03:00
semenov
f9e21667a7 DOCS: change status 2025-08-18 12:34:34 +03:00
ef12d4f7a9 Починил клинч с мьютексом Провайдера ДБ 2025-08-13 16:15:28 +03:00
842118cbea до убирания mtxAccess из ProviderDBLMS 2025-08-13 12:44:48 +03:00
93fe4a94b2 QMutexLocker 2025-08-13 10:50:55 +03:00
7466e33599 Рефакт 2025-08-12 17:52:32 +03:00
semenov
07e082e967 feat: add logs 2025-08-12 14:59:43 +03:00
bcd58e9631 Рефакт users 1 2025-08-12 11:13:31 +03:00
568 changed files with 20779 additions and 11359 deletions

14
.gitignore vendored
View File

@@ -13,10 +13,12 @@ compile_commands.json
CTestTestfile.cmake CTestTestfile.cmake
_deps _deps
CMakeUserPresets.json CMakeUserPresets.json
TestServerLMS/TestServerLMS/CMakeLists.txt.user
ServerLMS/ServerLMS/CMakeLists.txt.user ProgramServerMPS/TestServerLMS/CMakeLists.txt.user.*
InstructorsAndTrainees/CMakeLists.txt.user ProgramAWSinstructorMPS/CMakeLists.txt.user.*
GUIdataBaseLMS/CMakeLists.txt.user LibServer/ServerLMS/CMakeLists.txt.user.*
DataBaseLMS/CMakeLists.txt.user LibInstructorsAndTrainees/CMakeLists.txt.user.*
LibDataBaseInterface/CMakeLists.txt.user.*
DOCS/.obsidian DOCS/.obsidian
GUIdataBaseLMS/StaticData

View File

@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.5) cmake_minimum_required(VERSION 3.5)
message("Using CMake ${CMAKE_VERSION}\n") message("Using CMake ${CMAKE_VERSION}\n")
project(LMS LANGUAGES CXX) project(MPS LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOUIC ON)
@@ -21,7 +21,7 @@ endif()
include(cmake/CommonInfoForProject.cmake) include(cmake/CommonInfoForProject.cmake)
common_info_for_project(LMS) common_info_for_project(MPS)
find_package(Qt5 COMPONENTS Widgets REQUIRED) find_package(Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt5 COMPONENTS Network REQUIRED) find_package(Qt5 COMPONENTS Network REQUIRED)
@@ -30,13 +30,14 @@ find_package(Qt5 COMPONENTS LinguistTools REQUIRED)
find_package(Qt5 COMPONENTS Xml REQUIRED) find_package(Qt5 COMPONENTS Xml REQUIRED)
find_package(Qt5 COMPONENTS Concurrent REQUIRED) find_package(Qt5 COMPONENTS Concurrent REQUIRED)
add_subdirectory(DataBaseLMS) add_subdirectory(LibDataBaseInterface)
add_subdirectory(InstructorsAndTrainees) add_subdirectory(LibInstructorsAndTrainees)
add_subdirectory(GUIdataBaseLMS) add_subdirectory(LibServer)
add_subdirectory(ServerLMS) add_subdirectory(ProgramAWSinstructorMPS)
add_subdirectory(TestServerLMS) add_subdirectory(ProgramServerMPS)
add_dependencies(InstructorsAndTrainees DataBaseLMS) add_dependencies(InstructorsAndTrainees DataBaseInterface)
add_dependencies(GUIdataBaseLMS InstructorsAndTrainees) add_dependencies(Server DataBaseInterface)
add_dependencies(ServerLMS DataBaseLMS) add_dependencies(Server InstructorsAndTrainees)
add_dependencies(TestServerLMS ServerLMS) add_dependencies(ProgramAWSinstructorMPS InstructorsAndTrainees)
add_dependencies(ProgramServerMPS Server)

View File

@@ -1,423 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.11.1, 2025-04-10T12:35:59. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{08851f69-ba1e-4324-82d1-68caa9ee1f99}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap">
<valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey">
<value type="QString">-fno-delayed-template-parsing</value>
</valuelist>
<value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.14.2 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.14.2 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5142.win64_mingw73_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<valuelist type="QVariantList" key="CMake.Configuration">
<value type="QString">CMAKE_BUILD_TYPE:STRING=Debug</value>
<value type="QString">CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
<value type="QString">CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}</value>
<value type="QString">CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}</value>
<value type="QString">QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}</value>
</valuelist>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/LOCAL_REP_RRJ_SERVER/RRJServer/BUILDS/Debug64</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">all</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Сборка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">clean</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Очистка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Очистка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Отладка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<valuelist type="QVariantList" key="CMake.Configuration">
<value type="QString">CMAKE_BUILD_TYPE:STRING=Release</value>
<value type="QString">CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
<value type="QString">CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}</value>
<value type="QString">CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}</value>
<value type="QString">QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}</value>
</valuelist>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/LOCAL_REP_RRJ_SERVER/RRJServer/BUILDS/Release64</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">all</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Сборка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">clean</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Очистка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Очистка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Выпуск</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<valuelist type="QVariantList" key="CMake.Configuration">
<value type="QString">CMAKE_BUILD_TYPE:STRING=RelWithDebInfo</value>
<value type="QString">CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
<value type="QString">CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}</value>
<value type="QString">CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}</value>
<value type="QString">QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}</value>
</valuelist>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/LOCAL_REP_RRJ_SERVER/build-RRJServer-Desktop_Qt_5_14_2_MinGW_64_bit-RelWithDebInfo</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">all</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Сборка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">clean</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Очистка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Очистка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Выпуск с отладочной информацией</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.3">
<valuelist type="QVariantList" key="CMake.Configuration">
<value type="QString">CMAKE_BUILD_TYPE:STRING=MinSizeRel</value>
<value type="QString">CMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
<value type="QString">CMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}</value>
<value type="QString">CMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}</value>
<value type="QString">QT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}</value>
</valuelist>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/LOCAL_REP_RRJ_SERVER/build-RRJServer-Desktop_Qt_5_14_2_MinGW_64_bit-MinSizeRel</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">all</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Сборка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Сборка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="QString" key="CMakeProjectManager.MakeStep.AdditionalArguments"></value>
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">clean</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Очистка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Очистка</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Выпуск минимального размера</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">4</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Развёртывание</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Развёртывание</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
<value type="QString">cpu-cycles</value>
</valuelist>
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
<value type="int" key="Analyzer.Perf.Frequency">250</value>
<valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
<value type="QString">-e</value>
<value type="QString">cpu-cycles</value>
<value type="QString">--call-graph</value>
<value type="QString">dwarf,4096</value>
<value type="QString">-F</value>
<value type="QString">250</value>
</valuelist>
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">GUIdataBaseLMS</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeRunConfiguration.GUIdataBaseLMS</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">GUIdataBaseLMS</value>
<value type="QString" key="RunConfiguration.Arguments"></value>
<value type="bool" key="RunConfiguration.Arguments.multi">false</value>
<value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/LOCAL_REP_RRJ_SERVER/RRJServer/BUILDS/Debug64/GUIdataBaseLMS</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
<value type="QString">cpu-cycles</value>
</valuelist>
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
<value type="int" key="Analyzer.Perf.Frequency">250</value>
<valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
<value type="QString">-e</value>
<value type="QString">cpu-cycles</value>
<value type="QString">--call-graph</value>
<value type="QString">dwarf,4096</value>
<value type="QString">-F</value>
<value type="QString">250</value>
</valuelist>
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">TestServerLMS</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeRunConfiguration.TestServerLMS</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">TestServerLMS</value>
<value type="QString" key="RunConfiguration.Arguments"></value>
<value type="bool" key="RunConfiguration.Arguments.multi">false</value>
<value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory"></value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/LOCAL_REP_RRJ_SERVER/RRJServer/BUILDS/Debug64/TestServerLMS</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">2</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">22</value>
</data>
<data>
<variable>Version</variable>
<value type="int">22</value>
</data>
</qtcreator>

BIN
DOCS/DBschem.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

View File

@@ -75,12 +75,13 @@ ServerLMS ^EJX4eIpX
Mainthread: Mainthread:
*serverLMS *serverLMS
*processingSystem
*dataParser *dataParser
*MultiThreadServer *MultiThreadServer
*processingSystem
*commonClientHandler *commonClientHandler
*chatSystem
^ite9vjus *processParser
*docsUpdater ^ite9vjus
ClientHandler: Thread ClientHandler: Thread
@@ -93,15 +94,17 @@ LoggerThread:
UpdateThread: UpdateThread:
*updateController *updateController
*assetsManager ^ZvWgIkFz *assetsManager
*docsUpdater
^ZvWgIkFz
Client QT ^sWMT4y6l Client QT ^sWMT4y6l
MainThread: MainThread:
*MainWindow *MainWindow
*UpdateNotifyWidget
*screenChecker *screenChecker
*extrnalExecuter *externalExecuter
*allWidgets *allWidgets
^NEUKUPV3 ^NEUKUPV3
@@ -113,6 +116,8 @@ WorkerThread:
*socket *socket
*dataParser *dataParser
*hashComparer *hashComparer
*postProcessorSystem
*dataParserOut
^8BGt5wjC ^8BGt5wjC
@@ -146,9 +151,9 @@ Server ^57kJSOBv
Клиент ^Iao6ua8K Клиент ^Iao6ua8K
Login/Pass ^FgztXDxQ sendClientAutorizationXML ^FgztXDxQ
XML Authorization ^FAEhzlqj Server AuthorizationXML ^FAEhzlqj
Send version ^Wsgy80Do Send version ^Wsgy80Do
@@ -173,10 +178,6 @@ ConnectionThread:
*TaskPreparation *TaskPreparation
*FIMTaskWidget ^O3pqGffr *FIMTaskWidget ^O3pqGffr
*chatSystem ^b7EqD2zH
*processParser ^QEHpQT3C
Порядок приема! ^IhrFmEwa Порядок приема! ^IhrFmEwa
ClientHandler ^hA67NX92 ClientHandler ^hA67NX92
@@ -267,535 +268,634 @@ TYPE_COMMAND ^Qljc4T07
TYPE_DISABLE ^IIrBIFHt TYPE_DISABLE ^IIrBIFHt
USER VersionDataXML ^W7PN2rtW
ID ^s0uHSEUi sendCheckHash ^N9XDpZcf
TRAINEES ^VdRzKKcg TYPE_CHECK_VERSION ^Ze62Cipy
INSTRUCTOR ^dbneSLbj Логин инструктора с дозагрузкой сценария ^Yjh3SCZW
Server ^PWQFD9Cw
Клиент ^OYfJYOhT
SendClientAutorizationXML ^Za9NF1mi
Server AuthorizationXML ^xHClCCKn
VersionDataXML ^gr6jkOBB
GETSERVERDATALIST ^ucynRquw
CHECKVERSIONLIST ^cidQq0td
HASHSENDCOMPLETE ^1NHntJg9
VersionDataXML ^lSsIgPGT
CANCHANGE ^0kAyN4XO
после нажатия выгрузки ^OgPlj3dk
CHANGEABLE ^A3apuHcm
ОТПРАВКА ФАЙЛОВ ^OKhIgcM3
TYPE_FINISH ^RNN4fRif
Где-то тут нужно пересчитывать docs ^ixmhU2Zx
сделать отдельный метод и клиенту повторный хэш не пересылать
^D0vsPWNF
RECALCULATE DOCS ^VUTu7wzn
SEND DOCS ^iM67vAqM
потому что по умолчанию он больше не пересылается ^WR3pLokt
%% %%
## Drawing ## Drawing
```compressed-json ```compressed-json
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
``` ```
%% %%

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

View File

@@ -8,6 +8,7 @@ tags: [excalidraw]
# Excalidraw Data # Excalidraw Data
## Text Elements ## Text Elements
Server ^IFISGtDh Server ^IFISGtDh
@@ -95,219 +96,450 @@ recognize ^cbFaiqgQ
sendInstalledVersion? ^wHecIDrY sendInstalledVersion? ^wHecIDrY
Обновление версии 2.0 ^k8TgwAx9
Инструктор 1 ^HzN3hTVf
Сервер ^fYkwjWON
Первичное обновление или обновление не Scenaries части ^S5OLkmcX
обновление только сценариев ^ILG4z0FH
Обновление в полном объеме без уточнений, по первой версии обновления ^BnztnoYb
Дозагрузка новых сценариев ^6KtdBRKv
Пересчет docs по canPlay ^HUV0GHOH
Отправка уведов клиентам о наличии обновления ^wUj0KJs4
Клиент ^gqufkQsE
Клиент ^DcrY1jCl
Клиент ^VC0b0ofc
У клиента все сценарии в наличии (отправитель) ^5MmswpU1
не делаем ничего ^vLRSpFhd
У клиента есть не все (при обновлении кто то еще выгрузил изменения) ^YSGYSqjL
отправляем docs ^IuuYIAuC
отправка ^hGggwW7c
Досылаем недостающие Scenaries ^1aR92hQv
У предыдущей версии удален какой либо сценарий ^OlPkE0Gx
отправляем docs ^NtxU8Z63
отправка при уже не актуальной версии ^Obzi2qJ9
Дозагрузка новых сценариев ^cwhKgQjN
Пересчет docs по canPlay ^JHWnre3C
отправляем delete на лишние файлы ^xEjE8ehi
отправка обновления отправителю без уведомления ^qfEWtzgP
уведы в Unity,QTclient, GUI
Добавить кнопку Обновить везде? ^EK8w9Zar
%% %%
## Drawing ## Drawing
```compressed-json ```compressed-json
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
gaaQUp42hjIx4CAAA===
``` ```
%% %%

View File

@@ -6,24 +6,18 @@ kanban-plugin: board
## backLog ## backLog
- [ ] увеличить размер текста в окне обновлений - [ ] проверить работоспособность без Qt - не работает
- [ ] Нужен ли дополнительный выбор для загрузки с мат моделью или нет? - [ ] 23 -> связное оборудование -> общая часть
- [ ] Делить по группам траэйнисы и инструкторы
- [ ] Проверить Максимальный объем пересылаемых позже сообщений
## bugs ## bugs
- [ ] QT client: sig fault если не выбрана версия - [ ] QT клиент, если сервер занят повторно не появляется окно авторизации
- [ ] QT client: после удаления версии сбрасывать текст в описании
- [ ] Сервер: Неправильный порядок отправки оффлайн сообщений
- [ ] Unity client: после отправки сообщения выделять Input field
- [ ] UnityCient: У схем Viewer отрегулировать прокрутку на Scroll
## feature client Unity ## feature client Unity
- [ ] Протестировать и обновить версию на testPC СХЕМЫ - [ ] добавить пресеты для камер
## feature client QT ## feature client QT
@@ -32,7 +26,6 @@ kanban-plugin: board
## feature server ## feature server
- [ ] убрать clientMap из serverLMS Widget в мультитред сервер
## NOW ## NOW
@@ -41,6 +34,44 @@ kanban-plugin: board
## Complete ## Complete
- [ ] добавить переход на сценарий из PDF по типу списка окон
- [ ] Гидравлическая система, при нажатии на пожарку при работающей 3й гидросистеме и включенном PTU, PTU путь не закрашивается обратно
- [ ] добавить сохранение предыдущей загруженнной версии
- [ ] поправить верстку в управлении серверами
- [ ] QT клиент: не работают текстовые ссылки при обновлении сценариев НЕ ДОБАВЛЯТЬ ПРОБЕЛ В НАЗВАНИИ
- [ ] М у EDP должно окрашиваться в оранжевый при подаче на на них питания
- [ ] Не включается ГС3 при выставлении всего в AUTO
- [ ] при включении двигателя без XFEED и работающей правой помпы (какой либо) неправильно вызывается анимация питания двигателя в топливной схеме
- [ ] Иконки окон не выключаются при повторном открытии
- [ ] Unity клиент: Вошел как на втором экране
- [ ] Unity клиент: При закрытии окна при включенных мат параметрах, неверно инициализируется окно и пропадает содержимое
- [ ] Перезаполнять имя на offline, если клиент отключился
- [ ] Проверить работу настроек матмодели ис по билда
- [ ] Подчищать креды при успешном логине в UNITY
- [ ] Читать сабпроцедуры из тасок
- [ ] BUSY не меняет иконку блокировки
- [ ] не работают ссылки при выгрузке в QT Client
- [ ] убрать из XML все настройки для мат модели
- [ ] не отправлять updateDocs если не залогинен и запретить все операции
- [ ] Завести CLIENT с состояние залогигнен или нет
- [ ] перетащить наименования хинтов в XML и забирать из оттуда при старте
- [ ] починить поведение окон при включенном обновлении у 2х пользователей
- [ ] Отменить изменения работает некрасиво
- [ ] увеличить размер текста в окне обновлений
- [ ] Делить по группам траэйнисы и инструкторы
- [ ] Проверить Максимальный объем пересылаемых позже сообщений 4 тысячи знаков
- [ ] Unity client: после отправки сообщения выделять Input field
- [ ] UnityCient: У схем Viewer отрегулировать прокрутку на Scroll
- [ ] QT client: после удаления версии сбрасывать текст в описании
- [ ] Нужен ли дополнительный выбор для загрузки с мат моделью или нет?
- [ ] QT client: sig fault если не выбрана версия
- [ ] добавить цифры при инициализации
- [ ] QT клиент не отключается updateFrame при отмене изменений
- [ ] не включается кнопка запуска при обнвление завершено
- [ ] Unity: Восстановление файлов
- [ ] Unity: Отправка файлов
- [ ] Сервер: Неправильный порядок отправки оффлайн сообщений
- [ ] убрать clientMap из serverLMS Widget в мультитред сервер
- [ ] Различать, загружен клиент из Unity или нет, для возможности отправлять сообщения только Unity - [ ] Различать, загружен клиент из Unity или нет, для возможности отправлять сообщения только Unity
- [ ] в ГУИ научится определять тип клиента при приеме сообщения - [ ] в ГУИ научится определять тип клиента при приеме сообщения
- [ ] Если клиент не isUnity отправлять сообщение на позднюю отправку - [ ] Если клиент не isUnity отправлять сообщение на позднюю отправку
@@ -344,6 +375,7 @@ kanban-plugin: board
## Cancel ## Cancel
- [ ] Протестировать и обновить версию на testPC СХЕМЫ
- [ ] Делить по группам номер группы - [ ] Делить по группам номер группы
- [ ] Добавить обновление инструктора, если он перелогинился - [ ] Добавить обновление инструктора, если он перелогинился
- [ ] добавить в settings адрес и булку мат модели - [ ] добавить в settings адрес и булку мат модели
@@ -367,6 +399,6 @@ kanban-plugin: board
%% kanban:settings %% kanban:settings
``` ```
{"kanban-plugin":"board","list-collapse":[false,false,false,false,false,false,false,false,false],"lane-width":200} {"kanban-plugin":"board","list-collapse":[false,false,false,false,false,false,false,false,false],"lane-width":200,"date-colors":[]}
``` ```
%% %%

View File

@@ -216,11 +216,6 @@ dataParser->Reader->ClientAuth
dataParser->Answer-> ^vSQuWpXz dataParser->Answer-> ^vSQuWpXz
## Embedded Files
05ef07a816f9ec699b87fb198591290fa361b552: [[Pasted Image 20250807152445_155.png]]
2a95ba7d8af8e78f4250366c65d7324680129bb2: [[Pasted Image 20250807152527_050.png]]
%% %%
## Drawing ## Drawing
```compressed-json ```compressed-json
@@ -236,372 +231,372 @@ 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
``` ```
%% %%

View File

@@ -0,0 +1,334 @@
---
excalidraw-plugin: parsed
tags: [excalidraw]
---
==⚠ Switch to EXCALIDRAW VIEW in the MORE OPTIONS menu of this document. ⚠== You can decompress Drawing data with the command palette: 'Decompress current Excalidraw file'. For more info check in plugin settings under 'Saving'
# Excalidraw Data
## Text Elements
Update controller ^TkcEsz23
DataParserOutput ^3J2mDJ91
PostProcessorSystem ^NNczxNF5
recognize ^yew7MTmR
DataParser ^VWkzR3Wc
пришли данные ^eF0Z1Xcp
реакция на распарсенные данные ^MRRTeYWw
дернули обновление ^zzKU1XHF
сформировали ответ ^c6svrUeo
PostProcessorSystem ^S6RhnjVy
отправили ответ ^f3xD8T9a
MainWindow ^vw7nwX7p
CommonButtonGroup ^xErMGE5L
InstructorButtonGroupWidget ^VJREKykS
EntryWidget ^mUcqMn0E
NewVersionWidget ^FMG4Ciab
UpdateNotifyWidget ^4m1cnqbo
VersionSelectWidget ^xicMVgid
waitAnimationWidget ^AnK1YT4P
Bootstrap ^eJObHGxm
create ^lW9myAl1
initialize ^TNfkDi6r
CoreManager ^UzTcomzR
create ^QervTCHL
Initialize ^aLopQwm7
dataParser ^5EgEO03J
hashComparer ^sga2k5zL
etc. Systems ^zMBWYwMi
Provider ^OYxiJKhY
Processing ^09kzGeqK
ClientHadler ^5HyYmLEU
UpdateThread ^FO3pAbhx
ClientThread ^fMIEFNBp
bootstrap ^dZUaLzRd
coreManager ^nqGr6J9W
widgetManager ^VuHO7U8Z
connect core and widget ^USOSDOWi
%%
## Drawing
```compressed-json
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
```
%%

View File

@@ -32,11 +32,14 @@
8. Проверка с перезапуском клиента 8. Проверка с перезапуском клиента
Работа с версиями Работа с версиями
1. QT клиент: Копирование версии 1. QT клиент GUI: Копирование версии
2. QT клиент: Копирование версии с указанием существующего имени -> ошибка 2. QT клиент GUI: Копирование версии с указанием существующего имени -> ошибка
3. QT клиент: Удаление версии 3. QT клиент GUI: Удаление версии
4. QT клиент: Удаление базовой версии -> ошибка 4. QT клиент GUI: Удаление базовой версии -> ошибка
5. QT клиент: Удаление версии которая выбрана -> ошибка 5. QT клиент GUI: Удаление версии которая выбрана -> ошибка
6. QT клиент: переключении версии 6. QT клиент GUI: переключении версии
7. Unity: отправка в базовую версию 7. Unity: отправка в базовую версию
8.
Сервер:
1. Выключение сервера -> рассылка все клиентам DISABLE. Клиенты должны отключится от сети
2.

1
DOCS/Андрей/.obsidian/app.json vendored Normal file
View File

@@ -0,0 +1 @@
{}

View File

@@ -0,0 +1 @@
{}

View File

@@ -0,0 +1,33 @@
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": true,
"backlink": true,
"canvas": true,
"outgoing-link": true,
"tag-pane": true,
"footnotes": false,
"properties": false,
"page-preview": true,
"daily-notes": true,
"templates": true,
"note-composer": true,
"command-palette": true,
"slash-command": false,
"editor-status": true,
"bookmarks": true,
"markdown-importer": false,
"zk-prefixer": false,
"random-note": false,
"outline": true,
"word-count": true,
"slides": false,
"audio-recorder": false,
"workspaces": false,
"file-recovery": true,
"publish": false,
"sync": true,
"bases": true,
"webviewer": false
}

View File

@@ -0,0 +1,167 @@
{
"main": {
"id": "8d0c52b76b567b03",
"type": "split",
"children": [
{
"id": "94de23b03ba8feab",
"type": "tabs",
"children": [
{
"id": "a426c8e70b3b0594",
"type": "leaf",
"state": {
"type": "empty",
"state": {},
"icon": "lucide-file",
"title": "Новая вкладка"
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "7ab439ef0cbf43ad",
"type": "split",
"children": [
{
"id": "87c7b6e79db73e25",
"type": "tabs",
"children": [
{
"id": "90cbfc4e2d07abe2",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Файловый менеджер"
}
},
{
"id": "1cd85305f47515c6",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Поиск"
}
},
{
"id": "5945ff7a53a2fcd5",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Закладки"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "f29104e843747e16",
"type": "split",
"children": [
{
"id": "b3ff3a3e0d768afc",
"type": "tabs",
"children": [
{
"id": "ff893448d70eb626",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Обратные ссылки"
}
},
{
"id": "2a427c576e6ea0ef",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Исходящие ссылки"
}
},
{
"id": "a753b701468fb8f1",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Теги"
}
},
{
"id": "ff03277f03b14f53",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Структура"
}
}
]
}
],
"direction": "horizontal",
"width": 300,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
"switcher:Меню быстрого перехода": false,
"graph:Граф": false,
"canvas:Создать новый холст": false,
"daily-notes:Сегодняшняя заметка": false,
"templates:Вставить шаблон": false,
"command-palette:Открыть палитру команд": false,
"bases:Создать новую базу": false
}
},
"active": "a426c8e70b3b0594",
"lastOpenFiles": []
}

View File

@@ -4,24 +4,31 @@ kanban-plugin: board
--- ---
## bugs ## backlog
- [ ] GUI: Сделать кнопку перезапроса общих списков FIM (по аналогии с АММ)
- [ ] /RUS/Scens/tasksFIM.xml возможно изменится структура
## Completed
## feature - [ ] При смене УЗ в ГУИ остается история переписки в мессенджере. При этом Имя инструктора в диалоге подменяется. (Путается только в ГУИ!)
[Возможно, поможет переинициализация мессенджера при переавторизации инструктора?]
- [ ] Отображать текущую версию data в статус баре
- [ ] Сделать крутилку на начальную загрузку Сервера
- [ ] Логин суперпользователя PostgreSQL предлагать по умолчанию postgres
- [ ] Сделать несколько попыток подключения к серверу
- [ ] Переобновление docs.xml в пределах версии (если инструктор изменяет процедуры)
- [ ] Реализовать механизм отображения и выбора подпроцедур для АММ.
- [ ] Создание БД из кода (если нет или слетела)
- [ ] Сервер при сворачивании превращается в трей - [ ] Сервер при сворачивании превращается в трей
- [ ] Вывод информации о таймингах обучаемого - [ ] Пароли хранить и пересылать в виде Хеша
- [ ] добавление окна чата инструктора (GUI) - [ ] Смена пароля админом (или инструктором только для обучаемых). Старый никому не виден (парольная политика)
- [ ] добавить таблицу users в БД - [ ] Сделать отправку сообщения на Enter
- [ ] Введение логина только латиницей и цифрами
- [ ] Кнопка открытия Персональной карты обучаемого
## now - [ ] Блокировка авторизации не работает при входе в редакторы И/О
- [ ] Добавить текущий статус задачи в "Проверке задачи" (AMM, FIM)
## Complete
- [ ] выдавать trainee_id при авторизации и вытащить передачу Trainee ID из тасок - [ ] выдавать trainee_id при авторизации и вытащить передачу Trainee ID из тасок
- [ ] Подсчет учебного времени - дельта между включением и выключением - [ ] Подсчет учебного времени - дельта между включением и выключением
- [ ] регистрация времени включения и выключения тренажера (по приходу уходу пакета is unity) с регистрацие БД - [ ] регистрация времени включения и выключения тренажера (по приходу уходу пакета is unity) с регистрацие БД
@@ -31,11 +38,42 @@ kanban-plugin: board
- [ ] Убрать ошибки QObject::moveToThread: Cannot move objects with a parent - [ ] Убрать ошибки QObject::moveToThread: Cannot move objects with a parent
- [ ] /RRJ-95NEW-100/tasksAMM.xml заменить получение на docs - [ ] /RRJ-95NEW-100/tasksAMM.xml заменить получение на docs
- [ ] отправка таски поштучно, при обновления статуса (проверка и тд) - [ ] отправка таски поштучно, при обновления статуса (проверка и тд)
- [ ] Проверка валидности логина в двух местах. Только в эдиторе оставил
- [ ] DataBaseLMS::transactionBegin()
DataBaseLMS::transactionEnd()
Разобраться. Удалено
- [ ] Как работает Мьютекс в DataBaseLMS. Убрал его оттуда.
- [ ] добавить таблицу users в БД. Добавлено.
- [ ] Вывод информации о таймингах обучаемого
- [ ] добавление окна чата инструктора (GUI)
- [ ] Убрать автоподстановку логина и пароля Админа при Авторизации
- [ ] Добавить время сообщений
- [ ] Уточнить назначение аватарок для remote и local клиентов
- [ ] Убрать кнопку Справка (?) из диалогов
- [ ] Убрать "DM-код" для узлов PM (AMM)
- [ ] Уменьшить размер диалога "Проверка задачи" (AMM)
- [ ] Учет ширины скрола на деревьях (появляется если дерево больше окна)
- [ ] Универсальный пересчет ширин колонок деревьев
- [ ] При обновлении деревьев слетает назначенная колонка сортировки
## backlog ## Server
- [ ] /RUS/Scens/tasksFIM.xml возможно изменится структура - [ ] Отходить от идентификации по Логину в пользу ID юзера везде, где это возможно.
(Так как сейчас может вызвать проблемы при смене логина юзера!!!)
- [ ] Зарефакторить databaselms_PostgreSQL.cpp
(возможно, нужно использовать транзакции при восстановлении БД!)
## GUI Messenger
- [ ] Не влазиют слишком большие сообщения
- [ ] Не видно новых пришедших сообщений, если выбран другой Юзер
## GUI общие
- [ ] Текстовый поиск в задачах

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,6 @@
{
"nodes":[
{"id":"3e71087c4a5247a0","type":"file","file":"DBschem.png","x":-1134,"y":-740,"width":1494,"height":808}
],
"edges":[]
}

View File

@@ -1 +0,0 @@
МАКСИМ ЧИТЕР

View File

@@ -0,0 +1,16 @@
| ENG | RUS |
| -------------------------------- | --- |
| Learning management system (LMS) | |
| Instructor | |
| | |
| authorization | |
| deauthorization | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |

1
DOCS/ВАЖНО!!!!.md Normal file
View File

@@ -0,0 +1 @@
Длина отправки тестового сообщения 4к знаков

View File

@@ -1,36 +0,0 @@
```
void SendSystem::sendMessageBlock(QString message)
{
QDataStream stream(socket);
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
QByteArray result = sendMessage(message);
stream << PacketType::TYPE_XMLANSWER;
stream << sendMessage(message);
socket->waitForBytesWritten();
socket->flush();
}
или файлом
void ServerLMSWidget::sendQDataStream(QTcpSocket *socket,QByteArray data)
{
QDataStream stream(socket);
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
stream << PacketType::TYPE_XMLANSWER;
stream << data;
socket->waitForBytesWritten();
socket->flush();
}
```
Типы сообщений QT->Unity:
TYPE_XMLANSWER
Остальные QT->QT
Сообщение порядок приема данных QDataStream:
1. размер сообщения(отсылается неявно)
2. само сообщение в бинарном формате(в нашем случае XML)
UNITY: при переходе на новую систему общения пакетами нужно:
отправлять пакет о типе XML ответа при каждой отправке

View File

@@ -1,8 +1,13 @@
Сервер -> Принимаем ServerLMS
- XML файлы с поиском по тегу (DataParser::xmlParser)
**ServerLMSWidget** - entry point, кнопки на первичном окне, обновление списка клиентов, хранит общий Mutex
**ProviderDBLMS** - связь с БД
**MultiThreadServer** - управление клиентами (подключение, удаление)
Участники Участники
RecognizeSystem - система распознавания типа пакета, экземпляр у каждого клиента RecognizeSystem - система распознавания типа пакета, экземпляр у каждого клиента
ProcessingSystem - система активации процессов (создает результат после распознания действия) 1 штука на всех ProcessingSystem - система активации процессов (создает результат после распознания действия) 1 штука на всех

75
DOCS/Отправка.md Normal file
View File

@@ -0,0 +1,75 @@
Отправка сообщений QT сервер:
Отправка маленьких XML пакетов без информации о размере. TYPE_XMLANSWER
```
void SendSystem::sendXmlAnswer(QByteArray array, PacketType packetType)
{
qDebug() << "SendSystemThread: " << QThread::currentThreadId();
Logger::instance().log("C: " + client->getLogin() + " send pack " + enumToString(packetType) +
" " + QString::fromUtf8(array),LogLevel::DEBUG);
if (client->getClientType() == TypeClientAutorization::TYPE_QT_CLIENT ||
client->getClientType() == TypeClientAutorization::TYPE_GUI)
{
// для QT
QDataStream stream(socket);
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
stream << packetType;
stream << array;
socket->waitForBytesWritten();
}
else
{ // для Unity
sendPacketType(packetType);
QByteArray message;
int size = array.length();
message.append(reinterpret_cast<char*>(&size), sizeof(int));
socket->write(message);
socket->write(array);
}
}
```
Отправка пакета без вложения:
`void SendSystem::sendPacketType(PacketType packetType){
if (client->getClientType() == TypeClientAutorization::TYPE_QT_CLIENT ||
client->getClientType() == TypeClientAutorization::TYPE_GUI)
{
//Для QT
QDataStream stream(socket);
stream.setVersion(QDataStream::Qt_DefaultCompiledVersion);
stream << packetType;
socket->waitForReadyRead(100);
}
else
{
//для Unity
QByteArray message;
int type = (int)packetType;
message.append(reinterpret_cast<char*>(&type), sizeof(int));
socket->write(message);
}
}`
Не подходит для последнего сообщения (например при отключении клиента)
Отправка сервисного сообщения (тип ServerNotify)
`void SendSystem::sendNotify(QString notify)
{
qDebug() << "SendNotify thread: " << QThread::currentThreadId();
auto answer = emit sigSendNotify(notify);
sendXmlAnswer(answer);
}`
Типы сообщений QT->Unity:
TYPE_XMLANSWER
Остальные QT->QT
Сообщение порядок приема данных QDataStream:
1. размер сообщения(отсылается неявно)
2. само сообщение в бинарном формате(в нашем случае XML)
UNITY: при переходе на новую систему общения пакетами нужно:
отправлять пакет о типе XML ответа при каждой отправке

View File

@@ -1,68 +0,0 @@
project(DataBaseLMS LANGUAGES CXX)
common_info_for_project(DataBaseLMS)
add_library(DataBaseLMS SHARED
DataBaseLMS_global.h
databaselms.cpp
databaselms.h
interfacedatabaselms.cpp
interfacedatabaselms.h
basicentity.cpp
basicentity.h
user.cpp
user.h
instructor.cpp
instructor.h
trainee.cpp
trainee.h
group.cpp
group.h
computer.cpp
computer.h
classroom.cpp
classroom.h
tasksAmmFim.cpp
tasksAmmFim.h
typeQueryToDB.h
timingoftrainee.cpp
timingoftrainee.h
contactModel.h
)
target_link_libraries(DataBaseLMS PRIVATE Qt5::Widgets)
target_link_libraries(DataBaseLMS PRIVATE Qt5::Sql)
target_link_libraries(DataBaseLMS PRIVATE Qt5::Xml)
target_compile_definitions(DataBaseLMS PRIVATE DATABASELMS_LIBRARY)
if(PROJECT_TYPE_DEBUG)
add_custom_command(TARGET DataBaseLMS
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${REPO_PATH}/BUILDS/Debug64/DataBaseLMS/libDataBaseLMS.dll
${REPO_PATH}/BUILDS/Debug64/TestServerLMS)
add_custom_command(TARGET DataBaseLMS
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${REPO_PATH}/BUILDS/Debug64/DataBaseLMS/libDataBaseLMS.dll
${REPO_PATH}/BUILDS/Debug64/GUIdataBaseLMS)
else()
add_custom_command(TARGET DataBaseLMS
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${REPO_PATH}/BUILDS/Release64/DataBaseLMS/libDataBaseLMS.dll
${REPO_PATH}/BUILDS/Release64/TestServerLMS)
add_custom_command(TARGET DataBaseLMS
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${REPO_PATH}/BUILDS/Release64/DataBaseLMS/libDataBaseLMS.dll
${REPO_PATH}/BUILDS/Release64/GUIdataBaseLMS)
endif()

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +0,0 @@
#include "instructor.h"
Instructor::Instructor():
User(),
isAdmin()
{
}

View File

@@ -1,479 +0,0 @@
#include <QMessageBox>
#include <QCoreApplication>
#include <QSqlError>
#include <QDateTime>
#include <QTime>
#include "interfacedatabaselms.h"
InterfaceDataBaseLMS::InterfaceDataBaseLMS(QWidget* parent):
QWidget(parent),
DataBaseLMS()
{
}
void InterfaceDataBaseLMS::slot_LanguageChanged(QString language)
{
qtLanguageTranslator.load(QString(QStringLiteral("translations/DataBaseLMS_")) + language, QStringLiteral("."));
QCoreApplication::installTranslator(&qtLanguageTranslator);
}
bool InterfaceDataBaseLMS::ConnectionToDB()
{
if(!createConnection())
{
QMessageBox::critical(nullptr, dbSettings.dbName, tr("Connection error: ") + db->lastError().text());
return false;
}
else
{
//QMessageBox::information(nullptr, dbName, tr("Connection is successful!"));
return true;
}
}
bool InterfaceDataBaseLMS::DisConnectionFromDB()
{
deleteConnection();
//QMessageBox::information(nullptr, dbName, tr("Disconnection is successful!"));
return true;
}
bool InterfaceDataBaseLMS::DBisConnected()
{
return isConnected();
}
//Инструкторы
bool InterfaceDataBaseLMS::AuthorizationInstructor(QString login, QString password)
{
if(! transactionBegin())
return false;
if(int id = selectInstructorID(login, password))
{
if(isArchivedInstructor(id) || isLoggedInInstructor(id))
{
transactionEnd();
return false;
}
if(updateInstructorLoggedIn(id, true))
return transactionEnd();
}
transactionEnd();
return false;
}
bool InterfaceDataBaseLMS::deAuthorizationInstructor(QString login)
{
if(! transactionBegin())
return false;
if(int id = selectInstructorID(login))
{
if(updateInstructorLoggedIn(id, false))
return transactionEnd();
}
transactionEnd();
return false;
}
bool InterfaceDataBaseLMS::deAuthorizationAllInstructors()
{
return updateAllInstructorsLoggedIn(false);
}
QString InterfaceDataBaseLMS::getNameInstructorByLogin(QString login)
{
return selectInstructorNameByLogin(login);
}
int InterfaceDataBaseLMS::getIdInstructorByLogin(QString login)
{
return selectInstructorID(login);
}
QList<Instructor> InterfaceDataBaseLMS::getListInstructors()
{
return selectAllInstructors();
}
Instructor InterfaceDataBaseLMS::getInstructor(int id)
{
return selectInstructor(id);
}
int InterfaceDataBaseLMS::newInstructor()
{
return insertInstructor();
}
int InterfaceDataBaseLMS::delInstructor(int id)
{
return deleteInstructor(id);
}
int InterfaceDataBaseLMS::editInstructor(Instructor instructor)
{
//Проверка корректности логина, имени, пароля
QList<Instructor> listInstructors = selectAllInstructors();
for(Instructor exist_instructor : listInstructors)
{
if(instructor.getName() == QStringLiteral("<instructor>"))
{//Имя не корректно!
QMessageBox::critical(nullptr, tr("Editing error!"),
tr("Unacceptable instructor name has been entered.\nThe changes will not be accepted."));
return 0;
}
if(instructor.getLogin() == QStringLiteral("<login>"))
{//Логин не корректен!
QMessageBox::critical(nullptr, tr("Editing error!"),
tr("Unacceptable instructor login has been entered.\nThe changes will not be accepted."));
return 0;
}
if(instructor.getPassword() == QStringLiteral("<password>"))
{//Пароль не корректный!
QMessageBox::critical(nullptr, tr("Editing error!"),
tr("Unacceptable instructor password has been entered.\nThe changes will not be accepted."));
return 0;
}
if(instructor.getName() == exist_instructor.getName() && instructor.getID() != exist_instructor.getID())
{//Имя уже существует
QMessageBox::critical(nullptr, tr("Editing error!"),
tr("An existing instructor name has been entered."));
return 0;
}
if(instructor.getLogin() == exist_instructor.getLogin() && instructor.getID() != exist_instructor.getID())
{//Логин уже существует!
QMessageBox::critical(nullptr, tr("Editing error!"),
tr("An existing instructor login has been entered.\nThe changes will not be accepted."));
return 0;
}
}
return updateInstructor(instructor);
}
bool InterfaceDataBaseLMS::isAdminInstructor(int id)
{
return selectInstructorIsAdmin(id);
}
bool InterfaceDataBaseLMS::isArchivedInstructor(int id)
{
return selectInstructorArchived(id);
}
bool InterfaceDataBaseLMS::isLoggedInInstructor(int id)
{
return selectInstructorLoggedIn(id);
}
//Инструкторы
bool InterfaceDataBaseLMS::AuthorizationTrainee(QString login, QString password, QString classroom_name, QString computer_name)
{
if(! transactionBegin())
return false;
if(int id = selectTraineeID(login, password))
{
if(isArchivedTrainee(id) || isLoggedInTrainee(id))
{
transactionEnd();
return false;
}
if(updateTraineeLoggedIn(id, true))
return transactionEnd();
}
transactionEnd();
return false;
}
bool InterfaceDataBaseLMS::deAuthorizationTrainee(QString login)
{
if(! transactionBegin())
return false;
if(int id = selectTraineeID(login))
{
if(updateTraineeLoggedIn(id, false))
return transactionEnd();
}
transactionEnd();
return false;
}
bool InterfaceDataBaseLMS::deAuthorizationAllTrainees()
{
return updateAllTraineesLoggedIn(false);
}
int InterfaceDataBaseLMS::entryTraineeOnSimulator(int id_trainee)
{
TimingOfTrainee timing(id_trainee);
timing = selectTimingTrainee(id_trainee);
if(!timing.getID())
{//Еще нет записи
int timing_id = insertTimingTrainee(id_trainee);
timing.setID(timing_id);
if(!timing_id)
return 0;
}
timing.fixEntry();
return updateTimingTrainee(id_trainee, timing);
}
int InterfaceDataBaseLMS::exitTraineeFromSimulator(int id_trainee)
{
TimingOfTrainee timing(id_trainee);
timing = selectTimingTrainee(id_trainee);
if(!timing.getID())
{//Еще нет записи
int timing_id = insertTimingTrainee(id_trainee);
timing.setID(timing_id);
if(!timing_id)
return 0;
}
timing.fixExit();
return updateTimingTrainee(id_trainee, timing);
}
QString InterfaceDataBaseLMS::getNameTraineeOnComputer(QString computer_name)
{
return selectTraineeNameOnComputer(computer_name);
}
Trainee InterfaceDataBaseLMS::getTraineeOnComputer(QString computer_name)
{
return selectTraineeOnComputer(computer_name);
}
QString InterfaceDataBaseLMS::getNameTraineeByLogin(QString login)
{
return selectTraineeNameByLogin(login);
}
int InterfaceDataBaseLMS::getIdTraineeByLogin(QString login)
{
return selectTraineeID(login);
}
QList<Trainee> InterfaceDataBaseLMS::getListTraineesInGroup(int id)
{
return selectAllTraineesInGroup(id);
}
QList<Group> InterfaceDataBaseLMS::getListGroups()
{
return selectAllGroups();
}
QList<Trainee> InterfaceDataBaseLMS::getListTrainees()
{
return selectAllTrainees();
}
Trainee InterfaceDataBaseLMS::getTrainee(int id)
{
return selectTrainee(id);
}
Group InterfaceDataBaseLMS::getGroup(int id)
{
return selectGroup(id);
}
int InterfaceDataBaseLMS::newGroup()
{
return insertGroup();
}
int InterfaceDataBaseLMS::delGroup(int id)
{
return deleteGroup(id);
}
int InterfaceDataBaseLMS::editGroup(Group group)
{
//Проверка корректности имени
QList<Group> listGroups = selectAllGroups();
for(Group exist_group : listGroups)
{
if(group.getName() == QStringLiteral("<group>"))
{//Имя не корректно!
QMessageBox::critical(nullptr, tr("Editing error!"),
tr("Unacceptable group name has been entered.\nThe changes will not be accepted."));
return 0;
}
if(group.getName() == exist_group.getName() && group.getID() != exist_group.getID())
{//Имя уже существует
QMessageBox::critical(nullptr, tr("Editing error!"),
tr("An existing group name has been entered.\nThe changes will not be accepted."));
return 0;
}
}
return updateGroup(group);
}
int InterfaceDataBaseLMS::newTaskAMM(TaskAmmFim task, int id_trainee)
{
return insertTaskAMM(task, id_trainee);
}
int InterfaceDataBaseLMS::delTaskAMM(int id)
{
return deleteTaskAMM(id);
}
int InterfaceDataBaseLMS::editTaskAMM(TaskAmmFim task)
{
return updateTaskAMM(task);
}
QList<TaskAmmFim> InterfaceDataBaseLMS::getListTasksAMMofTrainee(int id_trainee)
{
return selectTasksAMMofTrainee(id_trainee);
}
QList<TaskAmmFim> InterfaceDataBaseLMS::getListTasksFIMofTrainee(int id_trainee)
{
return selectTasksFIMofTrainee(id_trainee);
}
TaskAmmFim InterfaceDataBaseLMS::getTaskAMMbyID(int id_task)
{
return selectTaskAMMbyID(id_task);
}
TaskAmmFim InterfaceDataBaseLMS::getTaskFIMbyID(int id_task)
{
return selectTaskFIMbyID(id_task);
}
int InterfaceDataBaseLMS::newTaskFIM(TaskAmmFim task, int id_trainee)
{
return insertTaskFIM(task, id_trainee);
}
int InterfaceDataBaseLMS::delTaskFIM(int id)
{
deleteReportFIM(id);
return deleteTaskFIM(id);
}
int InterfaceDataBaseLMS::editTaskFIM(TaskAmmFim task)
{
return updateTaskFIM(task);
}
int InterfaceDataBaseLMS::replaceReportFIM(TaskAmmFim task)
{
deleteReportFIM(task.getID());
if(int report_id = insertReportFIM(task))
{
updateStatusTaskFIM(task.getID(), "checkup");
return report_id;
}
return 0;
}
int InterfaceDataBaseLMS::changeStatusTaskFIM(int id_task, QString status)
{
return updateStatusTaskFIM(id_task, status);
}
int InterfaceDataBaseLMS::changeStatusTaskAMM(int id_task, QString status)
{
return updateStatusTaskAMM(id_task, status);
}
int InterfaceDataBaseLMS::newTrainee(int id_group)
{
return insertTrainee(id_group);
}
int InterfaceDataBaseLMS::delTrainee(int id)
{
return deleteTrainee(id);
}
int InterfaceDataBaseLMS::editTrainee(Trainee trainee)
{
//Проверка корректности логина, имени, пароля
QList<Trainee> listTrainees = selectAllTrainees();
for(Trainee exist_trainee : listTrainees)
{
if(trainee.getName() == QStringLiteral("<trainee>"))
{//Имя не корректно!
QMessageBox::critical(nullptr, tr("Editing error!"),
tr("Unacceptable trainee name has been entered.\nThe changes will not be accepted."));
return 0;
}
if(trainee.getLogin() == QStringLiteral("<login>"))
{//Логин не корректен!
QMessageBox::critical(nullptr, tr("Editing error!"),
tr("Unacceptable trainee login has been entered.\nThe changes will not be accepted."));
return 0;
}
if(trainee.getPassword() == QStringLiteral("<password>"))
{//Пароль не корректный!
QMessageBox::critical(nullptr, tr("Editing error!"),
tr("Unacceptable trainee password has been entered.\nThe changes will not be accepted."));
return 0;
}
if(trainee.getName() == exist_trainee.getName() && trainee.getID() != exist_trainee.getID())
{//Имя уже существует
QMessageBox::critical(nullptr, tr("Editing error!"),
tr("An existing trainee name has been entered."));
return 0;
}
if(trainee.getLogin() == exist_trainee.getLogin() && trainee.getID() != exist_trainee.getID())
{//Логин уже существует!
QMessageBox::critical(nullptr, tr("Editing error!"),
tr("An existing trainee login has been entered.\nThe changes will not be accepted."));
return 0;
}
}
return updateTrainee(trainee);
}
bool InterfaceDataBaseLMS::isArchivedTrainee(int id)
{
return selectTraineeArchived(id);
}
bool InterfaceDataBaseLMS::isLoggedInTrainee(int id)
{
return selectTraineeLoggedIn(id);
}

View File

@@ -1,39 +0,0 @@
#include "tasksAmmFim.h"
#include <QDomDocument>
#include <QFile>
#include <QMessageBox>
int TaskAmmFim::lastID = 1;
void TaskAmmFim::initialize(int id, QString type, QString title, QString status, QString created_date, QString changed_date)
{
this->id = id;
this->type = type;
this->title = title;
this->status = status;
this->created_date = created_date;
this->changed_date = changed_date;
}
void TaskAmmFim::addMalfunction(Malfunction malfunction)
{
malfunctionList.append(malfunction);
}
void Malfunction::initialize(QString dmCode, QString num, QString description)
{
this->dmCode = dmCode;
this->num = num;
this->description = description;
}
void Malfunction::addMalfunctionSign(MalfunctionSign sign)
{
malfunctionSigns.append(sign);
}
void MalfunctionSign::initialize(int type, QString description)
{
this->type = type;
this->description = description;
}

View File

@@ -1,9 +0,0 @@
#include "trainee.h"
Trainee::Trainee():
User(),
group(),
computer()
{
}

View File

@@ -1,108 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ru_RU">
<context>
<name>InterfaceDataBaseLMS</name>
<message>
<location filename="../interfacedatabaselms.cpp" line="23"/>
<source>Connection error: </source>
<translation>Ошибка соединения: </translation>
</message>
<message>
<location filename="../interfacedatabaselms.cpp" line="121"/>
<location filename="../interfacedatabaselms.cpp" line="128"/>
<location filename="../interfacedatabaselms.cpp" line="135"/>
<location filename="../interfacedatabaselms.cpp" line="142"/>
<location filename="../interfacedatabaselms.cpp" line="149"/>
<location filename="../interfacedatabaselms.cpp" line="279"/>
<location filename="../interfacedatabaselms.cpp" line="286"/>
<location filename="../interfacedatabaselms.cpp" line="377"/>
<location filename="../interfacedatabaselms.cpp" line="384"/>
<location filename="../interfacedatabaselms.cpp" line="391"/>
<location filename="../interfacedatabaselms.cpp" line="398"/>
<location filename="../interfacedatabaselms.cpp" line="405"/>
<source>Editing error!</source>
<translation>Ошибка редактирования!</translation>
</message>
<message>
<location filename="../interfacedatabaselms.cpp" line="122"/>
<source>Unacceptable instructor name has been entered.
The changes will not be accepted.</source>
<translation>Введено недопустимое имя инструктора.
Изменения не будут приняты.</translation>
</message>
<message>
<location filename="../interfacedatabaselms.cpp" line="129"/>
<source>Unacceptable instructor login has been entered.
The changes will not be accepted.</source>
<translation>Введен недопустимый логин инструктора.
Изменения не будут приняты.</translation>
</message>
<message>
<location filename="../interfacedatabaselms.cpp" line="136"/>
<source>Unacceptable instructor password has been entered.
The changes will not be accepted.</source>
<translation>Введен недопустимый пароль инструктора.
Изменения не будут приняты.</translation>
</message>
<message>
<location filename="../interfacedatabaselms.cpp" line="143"/>
<source>An existing instructor name has been entered.</source>
<translation>Введено существующее имя инструктора.</translation>
</message>
<message>
<location filename="../interfacedatabaselms.cpp" line="150"/>
<source>An existing instructor login has been entered.
The changes will not be accepted.</source>
<translation>Введен существующий логин инструктора.
Изменения не будут приняты.</translation>
</message>
<message>
<location filename="../interfacedatabaselms.cpp" line="280"/>
<source>Unacceptable group name has been entered.
The changes will not be accepted.</source>
<translation>Введено недопустимое имя группы.
Изменения не будут приняты.</translation>
</message>
<message>
<location filename="../interfacedatabaselms.cpp" line="287"/>
<source>An existing group name has been entered.
The changes will not be accepted.</source>
<translation>Введено существующее имя группы.
Изменения не будут приняты.</translation>
</message>
<message>
<location filename="../interfacedatabaselms.cpp" line="378"/>
<source>Unacceptable trainee name has been entered.
The changes will not be accepted.</source>
<translation>Введено недопустимое имя обучаемого.
Изменения не будут приняты.</translation>
</message>
<message>
<location filename="../interfacedatabaselms.cpp" line="385"/>
<source>Unacceptable trainee login has been entered.
The changes will not be accepted.</source>
<translation>Введен недопустимый логин обучаемого.
Изменения не будут приняты.</translation>
</message>
<message>
<location filename="../interfacedatabaselms.cpp" line="392"/>
<source>Unacceptable trainee password has been entered.
The changes will not be accepted.</source>
<translation>Введен недопустимый пароль обучаемого.
Изменения не будут приняты.</translation>
</message>
<message>
<location filename="../interfacedatabaselms.cpp" line="399"/>
<source>An existing trainee name has been entered.</source>
<translation>Введено существующее имя обучаемого.</translation>
</message>
<message>
<location filename="../interfacedatabaselms.cpp" line="406"/>
<source>An existing trainee login has been entered.
The changes will not be accepted.</source>
<translation>Введен существующий логин обучаемого.
Изменения не будут приняты.</translation>
</message>
</context>
</TS>

View File

@@ -1,11 +0,0 @@
#include "user.h"
User::User():
BasicEntity(),
login(),
password(),
archived(),
loggedIn()
{
}

View File

@@ -1,22 +1,33 @@
/*Обязательные поля*/ /*Обязательные поля*/
*[mandatoryField="true"] { *[mandatoryField="true"] {
background-color: #fff2fb background-color: #fffdfd
} }
/*Общие настройки виджетов*/ /*Общие настройки виджетов*/
QWidget { QWidget {
font-family: Tahoma; font-family: Tahoma;
font-size: 14pt; font-size: 12pt;
icon-size: 24px; icon-size: 24px;
/*background-color: green;*/
}
QWidget#widgetControl {
/*border: 1px solid gray;*/
background: #E0E0E0;
}
QWidget#viewerTrainees
{
padding-left: 20px;
} }
QLineEdit, QTextEdit { QLineEdit, QTextEdit, QComboBox {
border: 1px solid gray; border: 1px solid gray;
border-radius: 4px; border-radius: 2px;
padding: 0px 8px; padding: 0px 8px;
background: white; background: #fafafafa;
selection-background-color: darkgray; selection-background-color: darkgray;
} }
QLineEdit[echoMode="2"] { QLineEdit[echoMode="2"] {
@@ -30,46 +41,69 @@ QLineEdit:read-only {
QGroupBox { QGroupBox {
background: #E0E0E0; background: #E0E0E0;
border: 1px solid gray; border: 1px solid gray;
border-radius: 5px; border-radius: 3px;
margin-top: 5ex; /* leave space at the top for the title */ margin-top: 5ex; /* leave space at the top for the title */
} }
QGroupBox::title { QGroupBox::title {
border: 1px solid gray; border: 1px solid gray;
border-bottom: none; border-bottom: none;
border-radius: 5px; border-radius: 4px;
subcontrol-origin: margin; subcontrol-origin: margin;
subcontrol-position: top left; subcontrol-position: top left;
padding-left: 10px; padding-left: 10px;
padding-right: 10px; padding-right: 10px;
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #A0CECE, stop: 1 #FFFFFF); stop: 0 #A0CECE, stop: 1 #FFFFFF);
} }
QPushButton, QToolButton { QPushButton, QToolButton {
border: 2px solid #8f8f91; border: 2px solid #8f8f91;
border-style: outset; border-style: outset;
border-radius: 5px; border-radius: 5px;
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #f6f7fa, stop: 1 #dadbde); stop: 0 #f6f7fa, stop: 1 #dadbde);
min-width: 80px; min-width: 75px;
height: 60px; height: 55px;
padding: 1px; padding: 1px;
qproperty-iconSize: 32px;
} }
QPushButton { QPushButton {
height: 25px; height: 25px;
width: 100px;
} }
QToolButton { QToolButton {
width: 200px; width: 180px;
height: 55px;
} }
QToolButton#btnSend { /*Кнопка Send Мессенджера*/
width: 60px; QToolButton#btnSend, QToolButton#btnDelete, QToolButton#btnCheck, QToolButton#btnOnlyActive,
QToolButton#btnSave, QToolButton#btnUpdateStyle, QToolButton#btnSetVersion,
QToolButton#btnAssignTask, QToolButton#btnCheckDB, QToolButton#btnRepare, QToolButton#btnDocsUpdating,
QToolButton#btnAssign {
width: 100px;
height: 55px;
} }
QToolButton#btnCheckDB, QToolButton#btnUpdateDocs {
width: 100px;
height: 55px;
}
QToolButton#btnViewPassword, QToolButton#btnChangePassword {
min-width: 18px;
width: 18px;
height: 18px;
}
QPushButton:flat, QToolButton:flat { QPushButton:flat, QToolButton:flat {
border: none; /* no border for a flat push button */ border: none; /* no border for a flat push button */
} }
QPushButton:default, QToolButton:default { QPushButton:default, QToolButton:default {
border-color: navy; /* make the default button prominent */ border-color: darkblue; /*make the default button prominent */
} }
QPushButton:hover , QToolButton:hover { QPushButton:hover , QToolButton:hover {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
@@ -86,11 +120,24 @@ QPushButton:checked, QToolButton:checked {
stop: 0 #dadbde, stop: 1 #f6f7fa); stop: 0 #dadbde, stop: 1 #f6f7fa);
border-style: inset; border-style: inset;
} }
/*
QDialogButtonBox {
border: 2px solid #8f8f91;
border-style: outset;
border-radius: 5px;
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #f6f7fa, stop: 1 #dadbde);
}
*/
QCheckBox { QCheckBox {
spacing: 20px; spacing: 20px;
} }
QCheckBox#checkAutoStart, QCheckBox#checkLocalhost {
spacing: 0px;
}
QCheckBox::indicator:checked { QCheckBox::indicator:checked {
width: 24px; width: 24px;
height: 24px; height: 24px;
@@ -104,25 +151,24 @@ QCheckBox::indicator:!checked {
QTreeWidget { QTreeWidget {
font-size: 12pt; font-size: 13pt;
font-family: Tahoma; font-family: Tahoma;
icon-size: 24px; icon-size: 32px;
} }
QTreeWidget::item { QTreeWidget::item {
height: 30px; height: 34px;
} }
/*Бранчи*/ /*Бранчи*/
QTreeWidget::branch:has-siblings:!adjoins-item { QTreeWidget::branch:has-siblings:!adjoins-item {
border-image: url(:/resources/icons/vline.png) 0; border-image: url(:/resources/icons/vline.png) 0;
} }
QTreeWidget::branch:has-siblings:adjoins-item { QTreeWidget::branch:has-siblings:adjoins-item {
border-image: url(:/resources/icons/branch-more.png) 0; border-image: url(:/resources/icons/branch-more.png) 0;
} }
QTreeWidget::branch:!has-children:!has-siblings:adjoins-item { QTreeWidget::branch:!has-children:!has-siblings:adjoins-item {
border-image: url(:/resources/icons/branch-end.png) 0; border-image: url(:/resources/icons/branch-end.png) 0;
} }
QTreeWidget::branch:closed:has-children:!has-siblings, QTreeWidget::branch:closed:has-children:!has-siblings,
QTreeWidget::branch:closed:has-children:has-siblings { QTreeWidget::branch:closed:has-children:has-siblings {
border-image: none; border-image: none;
@@ -137,32 +183,62 @@ QTreeWidget::branch:open:has-children:has-siblings {
QTreeWidget::item:hover, QTreeWidget::item:hover,
QTreeWidget::branch:hover { QTreeWidget::branch:hover {
background: #aee1ff; background: #aee1ff;
background: #C0EEEE;
} }
QTreeWidget::item:selected { QTreeWidget::item:selected {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6ea1f1, stop: 1 #567dbc); /*background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6ea1f1, stop: 1 #567dbc);*/
color: #ffff00; background: #6ea1f1;
background: #A0CECE;
color: #000000;
}
QTreeWidget::indicator:checked {
width: 24px;
height: 24px;
image: url(:/resources/icons/chekYes.png);
}
QTreeWidget::indicator:!checked {
width: 24px;
height: 24px;
image: url(:/resources/icons/chekNo.png);
} }
QHeaderView::section { QHeaderView::section {
/*
background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,
stop:0 #c1c1c1, stop: 0.5 #505050, stop:0 #c1c1c1, stop: 0.5 #505050,
stop: 0.6 #434343, stop:1 #656565); stop: 0.6 #434343, stop:1 #656565);*/
color: white; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #A0CECE, stop: 1 #FFFFFF);
color: black;
padding-left: 4px; padding-left: 4px;
border: 1px solid #6c6c6c; border: 1px solid #6c6c6c;
font-size: 13pt;
} }
QTabWidget::pane { /* The tab widget frame */ QTabWidget::pane { /* The tab widget frame */
border-top: 1px solid #C2C7CB; border-top: 1px solid #C2C7CB;
background-image: url(:/resources/icons/messengerPrint.png); /*background-image: url(:/resources/icons/messengerPrint.png);*/
}
QTabWidget::pane#tabWidgetTasks { /* The tab widget frame */
border-top: 1px solid #C2C7CB;
/*background-image: url(:/resources/icons/messengerPrint.png);*/
/*
padding-left: -18px;
padding-right: -18px;
padding-top: -8px;
padding-bottom: -8px;
*/
} }
QTabWidget::tab-bar { QTabWidget::tab-bar {
left: 0px; /* move to the right by 0px */ left: 0px; /* move to the right by 0px */
} }
QTabBar::tab { QTabBar::tab {
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, stop: 0 #E1E1E1, stop: 0.4 #DDDDDD,
@@ -171,28 +247,37 @@ QTabBar::tab {
border-bottom-color: #C2C7CB; /* same as the pane color */ border-bottom-color: #C2C7CB; /* same as the pane color */
border-top-left-radius: 4px; border-top-left-radius: 4px;
border-top-right-radius: 4px; border-top-right-radius: 4px;
min-width: 8ex; min-width: 40ex;
padding: 2px; padding: 2px;
font-size: 12pt;
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #A0CECE, stop: 1 #FFFFFF);
} }
/*
QTabBar::tab:selected { QTabBar::tab:selected {
border-color: #9B9B9B; border-color: #9B9B9B;
border-bottom-color: #C2C7CB; /* same as pane color */ border-bottom-color: #C2C7CB;
/* expand/overlap to the left and right by 4px */
margin-left: -4px;
margin-right: -4px;
background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6ea1f1, stop: 1 #567dbc); background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6ea1f1, stop: 1 #567dbc);
color: #ffffff; color: #ffffff;
} }
QTabBar::tab:!selected { */
margin-top: 5px; /* make non-selected tabs look smaller */ QTabBar::tab:selected {
background: #ffffff; /*background: #ffffff;*/
} }
QTabBar::tab:!selected {
margin-top: 10px; /* make non-selected tabs look smaller */
/*background: #ffffff;*/
}
QTabBar::tab:hover { QTabBar::tab:hover {
background: #aee1ff; background: #aee1ff;
background: #C0EEEE;
} }
QTabBar::scroller { /* the width of the scroll buttons */ QTabBar::scroller { /* the width of the scroll buttons */
@@ -202,15 +287,21 @@ QTabBar QToolButton { /* the scroll buttons are tool buttons */
min-width: 30px; min-width: 30px;
width: 30px; width: 30px;
padding: 0px; padding: 0px;
margin-top: 5px;
} }
QListWidget::item { QListWidget::item {
padding: -5px; /*padding: -5px;*/
} }
QListWidget { QListWidget#oneDialogMessenger {
/*background: pink;*/ /*background: #ddeeff;*/
background: transparent;
background: #f0ffff; background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #A0CECE, stop: 1 #FFFFFF);
}
QListWidget#subProcItemListWidget::item:hover {
background: #ffffff;
} }
QTextEdit { QTextEdit {
@@ -218,13 +309,76 @@ QTextEdit {
font-size: 12pt; font-size: 12pt;
} }
QTextEdit#MsgWidgetLocal { QTextEdit#editMsg {
background: lightgreen; height: 65px; /**/
background: #ddeeff;
background: #ffffff;
} }
QTextEdit#MsgWidgetRemote { QTextEdit#MsgWidgetEditTextLocal {
background: lightblue; /*background: tlightgreen;*/
background: #ddffdd;
border-radius: 8px;
}
QTextEdit#MsgWidgetEditTextRemote {
/*background: lightblue;*/
/*background: #ddeeff;*/
background: #ffffff;
border-radius: 8px;
}
QLabel#MsgWidgetLblTimeLocal {
font-size: 9pt;
/*background: yellow;*/
}
QLabel#MsgWidgetLblTimeRemote {
font-size: 9pt;
/*background: yellow;*/
} }
QWidget { QLabel#MsgWidgetLblNameLocal {
font-size: 9pt;
/*background: yellow;*/
}
QLabel#MsgWidgetLblNameRemote {
font-size: 9pt;
/*background: yellow;*/
}
QLabel#MsgWidgetLblAvatar {
/*background: pink;*/
}
QLabel#MessangerWidgetLblUser {
background: #ddeeff;
padding-left: 4px;
border-radius: 8px;
background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
stop: 0 #A0CECE, stop: 1 #FFFFFF);
}
QLabel#MessangerWidgetLblAvatar {
} }
QLabel#MessangerWidgetLblLoggedIn {
}
QLabel#PersonalCard_lblName {
font-size: 16pt;
}
QWidget#widgetControl {
background: #E0E0E0;
}
QPlainTextEdit#plainText{ /*Репорт*/
margin-left: 50pt;
margin-right: 100pt;
}
/**/
QComboBox {
/*background: #ffffff;
border-radius: 5px;*/
}

Binary file not shown.

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ServerSettingsContainer> <ServerSettingsContainer>
<ServerSettings Address="192.168.100.87" Port="6000" Language="RUS" AutoStart="0"/> <ServerSettings Address="192.168.100.82" Port="6000" Language="RUS" AutoStart="0"/>
</ServerSettingsContainer> </ServerSettingsContainer>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<ServerSettingsContainer>
<DataBaseSettings Type="QPSQL" Name="rrjdatabase" UserName="rrjuser" Password="rrjuser" HostName="localhost" Port="5432" Language="RUS"/>
</ServerSettingsContainer>

View File

@@ -1,40 +0,0 @@
project(GUIdataBaseLMS LANGUAGES CXX)
common_info_for_project(GUIdataBaseLMS)
add_executable(GUIdataBaseLMS
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
testDBpgSQL.qrc
)
target_link_libraries(GUIdataBaseLMS PRIVATE Qt5::Widgets)
target_link_libraries(GUIdataBaseLMS PRIVATE Qt5::Sql)
target_link_libraries(GUIdataBaseLMS PRIVATE Qt5::Xml)
target_link_libraries(GUIdataBaseLMS PRIVATE Qt5::Network)
target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees)
target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/instructors)
target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/trainees)
target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/tasks)
target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/docTasks)
target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/connectorToServer)
target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/connectorToServer/Core)
target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../InstructorsAndTrainees/messanger)
if(PROJECT_TYPE_DEBUG)
target_link_directories(GUIdataBaseLMS PUBLIC ${REPO_PATH}/BUILDS/Debug64/InstructorsAndTrainees)
else()
target_link_directories(GUIdataBaseLMS PUBLIC ${REPO_PATH}/BUILDS/Release64/InstructorsAndTrainees)
endif()
target_link_libraries(GUIdataBaseLMS PRIVATE libInstructorsAndTrainees.dll)
target_include_directories(GUIdataBaseLMS PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../DataBaseLMS)
if(PROJECT_TYPE_DEBUG)
target_link_directories(GUIdataBaseLMS PUBLIC ${REPO_PATH}/BUILDS/Debug64/DataBaseLMS)
else()
target_link_directories(GUIdataBaseLMS PUBLIC ${REPO_PATH}/BUILDS/Release64/DataBaseLMS)
endif()
target_link_libraries(GUIdataBaseLMS PRIVATE libDataBaseLMS.dll)

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<AuthData Login="admin" Password="admin" InstructorName="Администратор" ClientName="Администратор" AccessType="instructor"/>

View File

@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ClientDeAutorization Login="admin"/>

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ru_RU">
<context>
<name>MainWindow</name>
<message>
<location filename="../mainwindow.ui" line="14"/>
<source>Learning management system (LMS)</source>
<translation>Система управления обучением (СУО)</translation>
</message>
</context>
</TS>

View File

@@ -1,48 +0,0 @@
#include "commonview.h"
#include <QFile>
#include <QMessageBox>
CommonView::CommonView(ConnectorToServer* connectorToServer, TypeView type, QWidget *parent):
QWidget(parent),
connectorToServer(connectorToServer),
treeWidget(nullptr),
typeView(type),
archiveVisible(false),
notLoggedInVisible(true),
adminMode(false),
authComplited(false),
lastCurrentID(0),
typeObject(TypeObject::objInstructor),
waitAnimationWidget(nullptr)
{
treeWidget = new QTreeWidget();
treeWidget->setFocusPolicy(Qt::FocusPolicy::NoFocus);
waitAnimationWidget = new WaitAnimationWidget;
QMovie *movie = new QMovie(":/resources/icons/762.gif");
//waitAnimationWidget->setParent(this);
waitAnimationWidget->initialize(movie,this);
}
CommonView::~CommonView()
{
waitAnimationWidget->hideWithStop();
delete waitAnimationWidget;
}
void CommonView::setItemColorArchive(QTreeWidgetItem *item)
{
setItemColor(item,QColor(240, 240, 240));
}
void CommonView::setItemColorNoArchive(QTreeWidgetItem *item)
{
setItemColor(item,QColor(255, 255, 255));
}
void CommonView::setItemColor(QTreeWidgetItem *item, QColor color)
{
for (int i = 0; i < item->columnCount(); i++)
item->setBackground(i, color);
}

View File

@@ -1,16 +0,0 @@
#include "notifycontroller.h"
NotifyController::NotifyController(QObject *parent) : QObject(parent)
{
}
void NotifyController::showWarning(QString text)
{
QMessageBox warning;
warning.setText(text);
warning.setIcon(QMessageBox::Warning);
warning.setWindowTitle(tr("Error"));
warning.exec();
}

View File

@@ -1,18 +0,0 @@
#ifndef NOTIFYCONTROLLER_H
#define NOTIFYCONTROLLER_H
#include <QObject>
#include <QMessageBox>
class NotifyController : public QObject
{
Q_OBJECT
public:
explicit NotifyController(QObject *parent = nullptr);
void showWarning(QString text);
signals:
};
#endif // NOTIFYCONTROLLER_H

View File

@@ -1,472 +0,0 @@
#include "connectortoserver.h"
#include <QThread>
ConnectorToServer::ConnectorToServer(QWidget* parentWidget, QObject *parent) :
QObject(parent),
parentWidget(parentWidget),
connectionThread(nullptr),
client(nullptr),
dataParser(nullptr),
sendSystem(nullptr),
recognizeSystem(nullptr),
versionSelectWidget(nullptr),
versionContainer(nullptr),
notifyController(nullptr)
{
initialize();
}
ConnectorToServer::~ConnectorToServer()
{
delete client;
delete versionSelectWidget;
delete notifyController;
delete versionContainer;
delete recognizeSystem;
delete sendSystem;
delete dataParser;
connectionThread->quit();
connectionThread->wait();
delete connectionThread;
}
bool ConnectorToServer::authorizationInstructorLocal(QString login, QString password)
{
if (!client->getIsConnected())
{
return false;
}
ClientAutorization *autorization = new ClientAutorization;
autorization->Login = login;
autorization->Password = password;
autorization->TypeClient = TypeClientAutorization::TYPE_GUI;
QByteArray array = dataParser->createAuthMessage(autorization);
emit signal_sendXMLmsgGUItoServer(array);
return true;
}
bool ConnectorToServer::deAuthorizationInstructorLocal(QString login)
{
if (!client->getIsConnected())
{
return false;
}
ClientDeAutorization *deAutorization = new ClientDeAutorization;
deAutorization->Login = login;
QByteArray array = dataParser->createDeAuthMessage(deAutorization);
emit signal_sendXMLmsgGUItoServer(array);
return true;
}
bool ConnectorToServer::sendQueryToDB(TypeQueryToDB typeQuery, int id, void* data)
{
if (!client->getIsConnected())
{
return false;
}
ClientQueryToDB *queryToDB = new ClientQueryToDB;
queryToDB->typeQuery = typeQuery;
QByteArray array = dataParser->createQueryToDBMessage(queryToDB, id, data);
emit signal_sendXMLmsgGUItoServer(array);
return true;
}
bool ConnectorToServer::sendMessage(ClientMessage clientMessage)
{
if (!client->getIsConnected())
{
return false;
}
QByteArray array = dataParser->createMessage(clientMessage);
emit signal_sendXMLmsgGUItoServer(array);
return true;
}
bool ConnectorToServer::sendQueryTasksXML(QString type)
{
if (!client->getIsConnected())
{
return false;
}
QByteArray array = dataParser->createQueryTasksXMLMessage(type);
emit signal_sendXMLmsgGUItoServer(array);
return true;
}
void ConnectorToServer::setLoginName(QString name)
{
versionSelectWidget->setAuthor(name);
}
ServerSettings ConnectorToServer::getServerSettings()
{
return serverSettings;
}
bool ConnectorToServer::getIsConnected()
{
return client->getIsConnected();
}
void ConnectorToServer::SetConnectToServer()
{
serverSettings = *dataParser->getServerSettings();
emit sigSetConnect(dataParser->getServerSettings(),connectionThread);
}
void ConnectorToServer::StopConnectToServer()
{
emit sigStopConnect();
clearListModelDB();
}
QByteArray ConnectorToServer::getListTaskFimArray()
{
return listTaskFimArray;
}
QByteArray ConnectorToServer::getListTaskAmmArray()
{
return listTaskAmmArray;
}
QList<Instructor> ConnectorToServer::getListInstructors()
{
return listInstructors;
}
QList<Trainee> ConnectorToServer::getListTrainees()
{
return listTrainees;
}
QList<Group> ConnectorToServer::getListGroups()
{
return listGroups;
}
QList<Computer> ConnectorToServer::getListComputers()
{
return listComputers;
}
QList<Classroom> ConnectorToServer::getListClassrooms()
{
return listClassrooms;
}
QList<TaskAmmFim> ConnectorToServer::getListTasksAMMforTrainee(int trainee_id)
{
if(mapTasksAMM.contains(trainee_id))
return mapTasksAMM.value(trainee_id);
else
return QList<TaskAmmFim>();
}
QList<TaskAmmFim> ConnectorToServer::getListTasksFIMforTrainee(int trainee_id)
{
if(mapTasksFIM.contains(trainee_id))
return mapTasksFIM.value(trainee_id);
else
return QList<TaskAmmFim>();
}
bool ConnectorToServer::isArchivedInstructor(int id)
{
for(Instructor instructor : listInstructors)
{
if(instructor.getID() == id)
{
if(instructor.getArchived()) return true; else return false;
}
}
return false;
}
bool ConnectorToServer::isAdminInstructor(int id)
{
for(Instructor instructor : listInstructors)
{
if(instructor.getID() == id)
{
if(instructor.getIsAdmin()) return true; else return false;
}
}
return false;
}
bool ConnectorToServer::isLoggedInInstructor(int id)
{
for(Instructor instructor : listInstructors)
{
if(instructor.getID() == id)
{
if(instructor.getLoggedIn()) return true; else return false;
}
}
return false;
}
Instructor ConnectorToServer::getInstructor(int id)
{
for(Instructor instructor : listInstructors)
{
if(instructor.getID() == id)
return instructor;
}
return Instructor();
}
QList<Trainee> ConnectorToServer::getListTraineesInGroup(int id)
{
QList<Trainee> list;
for(Trainee trainee : listTrainees)
{
if(trainee.getGroup().getID() == id)
list.append(trainee);
}
return list;
}
bool ConnectorToServer::isArchivedTrainee(int id)
{
for(Trainee trainee : listTrainees)
{
if(trainee.getID() == id)
{
if(trainee.getArchived()) return true; else return false;
}
}
return false;
}
bool ConnectorToServer::isLoggedInTrainee(int id)
{
for(Trainee trainee : listTrainees)
{
if(trainee.getID() == id)
{
if(trainee.getLoggedIn()) return true; else return false;
}
}
return false;
}
Trainee ConnectorToServer::getTrainee(int id)
{
for(Trainee trainee : listTrainees)
{
if(trainee.getID() == id)
return trainee;
}
return Trainee();
}
Group ConnectorToServer::getGroup(int id)
{
for(Group group : listGroups)
{
if(group.getID() == id)
return group;
}
return Group();
}
int ConnectorToServer::getIdTraineeByLogin(QString login)
{
for(Trainee trainee : listTrainees)
{
if(trainee.getLogin() == login)
return trainee.getID();
}
return 0;
}
void ConnectorToServer::showVersionSelect()
{
QByteArray answer = dataParser->xmlAnswer_notify(cmd_CheckVersionList);
emit sigSendAnswerToServer(answer);
}
void ConnectorToServer::slot_AnswerQueryToDB_ListInstructors(QList<Instructor> listInstructors)
{
this->listInstructors = listInstructors;
emit signal_UpdateDB(true, false);
}
void ConnectorToServer::slot_AnswerQueryToDB_ListGroups(QList<Group> listGroups)
{
this->listGroups = listGroups;
emit signal_UpdateDB(false, true);
}
void ConnectorToServer::slot_AnswerQueryToDB_ListTrainees(QList<Trainee> listTrainees)
{
this->listTrainees = listTrainees;
emit signal_UpdateDB(false, true);
emit signal_InitMessanger(listTrainees);
}
void ConnectorToServer::slot_AnswerQueryToDB_ListComputers(QList<Computer> listComputers)
{
this->listComputers = listComputers;
//emit signal_UpdateDB(false, true); //TODO
}
void ConnectorToServer::slot_AnswerQueryToDB_ListClassrooms(QList<Classroom> listClassrooms)
{
this->listClassrooms = listClassrooms;
//emit signal_UpdateDB(false, true); //TODO
}
void ConnectorToServer::slot_AnswerQueryToDB_ListTasksAMMforTrainee(QList<TaskAmmFim> listTasks, int trainee_id)
{
//Удаляем старые задачи этого обучаемого
mapTasksAMM.remove(trainee_id);
//Добавляем новые
mapTasksAMM.insert(trainee_id, listTasks);
emit signal_UpdateTasksAMMforTrainee(trainee_id);
}
void ConnectorToServer::slot_AnswerQueryToDB_ListTasksFIMforTrainee(QList<TaskAmmFim> listTasks, int trainee_id)
{
//Удаляем старые задачи этого обучаемого
mapTasksFIM.remove(trainee_id);
//Добавляем новые
mapTasksFIM.insert(trainee_id, listTasks);
emit signal_UpdateTasksFIMforTrainee(trainee_id);
}
void ConnectorToServer::slot_AnswerQueryTasksXML_FIM(QByteArray array)
{
this->listTaskFimArray = array;
emit signal_UpdateTasksFIM();
}
void ConnectorToServer::slot_AnswerQueryTasksXML_AMM(QByteArray array)
{
this->listTaskAmmArray = array;
emit signal_UpdateTasksAMM();
}
void ConnectorToServer::slot_sendMessage(ClientMessage clientMessage)
{
sendMessage(clientMessage);
}
void ConnectorToServer::showServerList(QList<StreamingVersionData *> *serverList)
{
versionSelectWidget->fillView(serverList);
}
void ConnectorToServer::slot_HashReady()
{
//sendQueryTasksXML("fim");
sendQueryTasksXML("amm");
}
void ConnectorToServer::initialize()
{
createObjects();
bindConnection();
emit sigInitializeClient(recognizeSystem,sendSystem,connectionThread);
SetConnectToServer();
}
void ConnectorToServer::bindConnection()
{
connect(this,&ConnectorToServer::sigInitializeClient,client,&TCPClient::initialize,Qt::AutoConnection);
connect(this,&ConnectorToServer::sigSetConnect,client,&TCPClient::setConnect,Qt::AutoConnection);
connect(this,&ConnectorToServer::sigStopConnect,client,&TCPClient::setDisconnect,Qt::AutoConnection);
connect(this,&ConnectorToServer::signal_sendXMLmsgGUItoServer,sendSystem,&SendSystem::sendXMLmsgGUItoServer);
connect(this,&ConnectorToServer::sigSendAnswerToServer,sendSystem,&SendSystem::sendXMLAnswer,Qt::AutoConnection);
connect(recognizeSystem,&RecognizeSystem::sigAuth,this,&ConnectorToServer::sigLoginResult);
connect(recognizeSystem,&RecognizeSystem::sigDeAuth,this,&ConnectorToServer::sigDeLoginResult);
connect(recognizeSystem,&RecognizeSystem::signal_ReceiveMessage,this,&ConnectorToServer::signal_receiveMessage);
connect(recognizeSystem,&RecognizeSystem::sigShowServerDataList,this,&ConnectorToServer::showServerList);
connect (recognizeSystem,&RecognizeSystem::sigSetVersion,versionContainer,&VersionContainer::setServerVersionData);
//connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB,this,&ConnectorToServer::slot_AnswerQueryToDB);
connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListInstructors,this,&ConnectorToServer::slot_AnswerQueryToDB_ListInstructors);
connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListGroups,this,&ConnectorToServer::slot_AnswerQueryToDB_ListGroups);
connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListTrainees,this,&ConnectorToServer::slot_AnswerQueryToDB_ListTrainees);
connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListComputers,this,&ConnectorToServer::slot_AnswerQueryToDB_ListComputers);
connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListClassrooms,this,&ConnectorToServer::slot_AnswerQueryToDB_ListClassrooms);
connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListTasksAMMforTrainee,this,&ConnectorToServer::slot_AnswerQueryToDB_ListTasksAMMforTrainee);
connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListTasksFIMforTrainee,this,&ConnectorToServer::slot_AnswerQueryToDB_ListTasksFIMforTrainee);
connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryTasksXML_FIM,this,&ConnectorToServer::slot_AnswerQueryTasksXML_FIM);
connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryTasksXML_AMM,this,&ConnectorToServer::slot_AnswerQueryTasksXML_AMM);
connect(client,&TCPClient::signal_ConnectedToServer,this,&ConnectorToServer::signal_ConnectedToServer,Qt::AutoConnection);
connect(recognizeSystem,&RecognizeSystem::sigNotify,notifyController,&NotifyController::showWarning,Qt::AutoConnection);
connect(recognizeSystem,&RecognizeSystem::sigHashReady,this,&ConnectorToServer::slot_HashReady);
}
void ConnectorToServer::createObjects()
{
connectionThread = new QThread;
client = new TCPClient;
client->moveToThread(connectionThread);
dataParser = new DataParser;
sendSystem = new SendSystem;
sendSystem->moveToThread(connectionThread);
recognizeSystem = new RecognizeSystem;
recognizeSystem->moveToThread(connectionThread);
notifyController = new NotifyController;
versionContainer = new VersionContainer;
versionSelectWidget = new VersionSelectWidget(parentWidget);
versionSelectWidget->initialize(sendSystem,versionContainer,notifyController, recognizeSystem);
connectionThread->start();
connectionThread->setPriority(QThread::HighestPriority);
}
void ConnectorToServer::clearListModelDB()
{
listInstructors.clear();
listGroups.clear();
listTrainees.clear();
listComputers.clear();
listClassrooms.clear();
mapTasksAMM.clear();
mapTasksFIM.clear();
listTaskFimArray.clear();
listTaskAmmArray.clear();
}
SendSystem *ConnectorToServer::getSendSystem() const
{
return sendSystem;
}

View File

@@ -1,19 +0,0 @@
#include "dialogauthorizationinstructor.h"
#include "ui_dialogauthorizationinstructor.h"
DialogAuthorizationInstructor::DialogAuthorizationInstructor(QWidget *parent) :
QDialog(parent),
ui(new Ui::DialogAuthorizationInstructor)
{
ui->setupUi(this);
ui->editLogin->setProperty("mandatoryField", true);
ui->editPassword->setProperty("mandatoryField", true);
ui->editPassword->setEchoMode(QLineEdit::EchoMode::Password);
}
DialogAuthorizationInstructor::~DialogAuthorizationInstructor()
{
delete ui;
}

View File

@@ -1,33 +0,0 @@
#ifndef DIALOGAUTHORIZATIONINSTRUCTOR_H
#define DIALOGAUTHORIZATIONINSTRUCTOR_H
#include <QDialog>
#include "ui_dialogauthorizationinstructor.h"
namespace Ui {
class DialogAuthorizationInstructor;
}
class DialogAuthorizationInstructor : public QDialog
{
Q_OBJECT
public:
explicit DialogAuthorizationInstructor(QWidget *parent = nullptr);
~DialogAuthorizationInstructor();
QString getLogin()
{
return ui->editLogin->text();
}
QString getPassword()
{
return ui->editPassword->text();
}
private:
Ui::DialogAuthorizationInstructor *ui;
};
#endif // DIALOGAUTHORIZATIONINSTRUCTOR_H

View File

@@ -1,148 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DialogAuthorizationInstructor</class>
<widget class="QDialog" name="DialogAuthorizationInstructor">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>300</width>
<height>140</height>
</rect>
</property>
<property name="font">
<font>
<family>Tahoma</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="windowTitle">
<string>Instructor authorization</string>
</property>
<property name="windowIcon">
<iconset resource="../resources.qrc">
<normaloff>:/resources/icons/lms.png</normaloff>:/resources/icons/lms.png</iconset>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label_1">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Login</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Password</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QLineEdit" name="editLogin">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>admin</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="editPassword">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>admin</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="locale">
<locale language="English" country="UnitedStates"/>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources>
<include location="../resources.qrc"/>
</resources>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>DialogAuthorizationInstructor</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>DialogAuthorizationInstructor</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@@ -1,79 +0,0 @@
#include "dialogeditinstructor.h"
#include "ui_dialogeditinstructor.h"
#include <QPushButton>
DialogEditInstructor::DialogEditInstructor(QWidget *parent) :
QDialog(parent),
ui(new Ui::DialogEditInstructor),
instructorInput()
{
ui->setupUi(this);
verify();
ui->editName->setProperty("mandatoryField", true);
ui->editLogin->setProperty("mandatoryField", true);
ui->editPassword->setProperty("mandatoryField", true);
}
DialogEditInstructor::~DialogEditInstructor()
{
delete ui;
}
void DialogEditInstructor::setInstructor(Instructor instructor)
{
instructorInput = instructor;
ui->editName ->setText(instructor.getName());
ui->editLogin->setText(instructor.getLogin());
ui->editPassword->setText(instructor.getPassword());
ui->checkIsAdmin->setChecked(instructor.getIsAdmin());
ui->checkArchived->setChecked(instructor.getArchived());
ui->checkLoggedIn->setChecked(instructor.getLoggedIn());
if(instructor.getIsAdmin())
ui->editName->setEnabled(false);
else
ui->editName->setEnabled(true);
}
Instructor DialogEditInstructor::getInstructor()
{
Instructor instructor = instructorInput;
instructor.setName(ui->editName->text());
instructor.setLogin(ui->editLogin->text());
instructor.setPassword(ui->editPassword->text());
instructor.setIsAdmin(ui->checkIsAdmin->isChecked());
instructor.setArchived(ui->checkArchived->isChecked());
instructor.setLoggedIn(ui->checkLoggedIn->isChecked());
return instructor;
}
void DialogEditInstructor::on_editName_textChanged(const QString &arg1)
{
verify();
}
void DialogEditInstructor::on_editLogin_textChanged(const QString &arg1)
{
verify();
}
void DialogEditInstructor::on_editPassword_textChanged(const QString &arg1)
{
verify();
}
void DialogEditInstructor::verify()
{
if(ui->editName->text().trimmed() == QStringLiteral("") ||
ui->editLogin->text().trimmed() == QStringLiteral("") ||
ui->editPassword->text().trimmed() == QStringLiteral(""))
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
else
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
}

View File

@@ -1,204 +0,0 @@
#include <QHeaderView>
#include <QTranslator>
#include <QResizeEvent>
#include "instructorsview.h"
InstructorsView::InstructorsView(ConnectorToServer* connectorToServer, TypeView type, QWidget *parent):
CommonView(connectorToServer, type, parent)
{
typeObject = TypeObject::objInstructor;
}
void InstructorsView::resizeEvent(QResizeEvent *event)
{
int width = treeWidget->width();
treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_ID, 50);
treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Login, 100);
treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Password, 100);
treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Administrator, 120);
treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Archived, 80);
treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Logged, 100);
int widthInstructor;
if(typeView == TypeView::onlyView)
{//onlyView
widthInstructor = width - (300 + 10);
}
else
{//control
if(adminMode)
widthInstructor = width - (550 + 10);
else
widthInstructor = width - (420 + 10);
}
if(widthInstructor < 250)
widthInstructor = 250;
treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Instructor, widthInstructor);
QSize size = event->size();
waitAnimationWidget->resize(size);
}
void InstructorsView::slot_NeedUpdateUI(bool treeInstructor, bool treeTrainee)
{
updateButtons();
if(treeInstructor)
loadInstructorsFromDB();
}
void InstructorsView::preparationTreeWidget()
{
mtxTreeWidget.lock();
treeWidget->setColumnCount(clmn_count);
reSetHeadTreeWidget();
if(typeView == TypeView::onlyView)
{//onlyView
archiveVisible = false;
treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_ID, true);
treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Password, true);
treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Archived, true);
treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Administrator, true);
}
else
{//control
archiveVisible = true;
if(adminMode)
{
treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_ID, false);
treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Archived, false);
}
else
{
treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_ID, true);
treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Archived, true);
}
}
treeWidget->setSortingEnabled(true);
treeWidget->sortItems(ColumnsTreeInsructors::clmn_Instructor, Qt::SortOrder::AscendingOrder);
mtxTreeWidget.unlock();
}
void InstructorsView::loadInstructorsFromDB()
{
mtxTreeWidget.lock();
//Обновление дерева
treeWidget->clear();
//Инструкторы
QList<Instructor> listInstructors;
listInstructors = connectorToServer->getListInstructors();
for(Instructor instructor : listInstructors)
{
QTreeWidgetItem *ItemInstructor = new QTreeWidgetItem(treeWidget);
ItemInstructor->setText(ColumnsTreeInsructors::clmn_ID, QString::number(instructor.getID()));
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Instructor, instructor.getName());
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Login, instructor.getLogin());
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Password, instructor.getPassword());
//Сокрытие пароля
if(!adminMode)
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Password, QStringLiteral("******"));
if(instructor.getArchived())
{//Архивный
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Archived, tr("yes"));
ItemInstructor->setIcon(ColumnsTreeInsructors::clmn_Instructor, QIcon(QStringLiteral(":/resources/icons/archive.png")));
setItemColorArchive(ItemInstructor);
}
else
{//Не Архивный
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Archived, tr("no"));
ItemInstructor->setIcon(ColumnsTreeInsructors::clmn_Instructor, QIcon(QStringLiteral(":/resources/icons/instructor.png")));
setItemColorNoArchive(ItemInstructor);
}
if(instructor.getIsAdmin())
{//Админ
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Administrator, tr("yes"));
ItemInstructor->setIcon(ColumnsTreeInsructors::clmn_Instructor, QIcon(QStringLiteral(":/resources/icons/admin.png")));
}
else
{//Не Админ
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Administrator, tr("no"));
}
if(instructor.getLoggedIn())
{//Залогинен
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Logged, tr("yes"));
ItemInstructor->setIcon(ColumnsTreeInsructors::clmn_Logged, QIcon(QStringLiteral(":/resources/icons/circleGreen.png")));
}
else
{//Не Залогинен
ItemInstructor->setText(ColumnsTreeInsructors::clmn_Logged, tr("no"));
ItemInstructor->setIcon(ColumnsTreeInsructors::clmn_Logged, QIcon(QStringLiteral(":/resources/icons/circleGray.png")));
}
//Скрываем архивных (при необходимости)
if(instructor.getArchived())
if(! archiveVisible)
ItemInstructor->setHidden(true);
//Скрываем незалогиненых (при необходимости)
if(! instructor.getLoggedIn())
if(! notLoggedInVisible)
ItemInstructor->setHidden(true);
}
treeWidget->expandAll();
/*
//if(typeView == TypeView::control)
{
QTreeWidgetItem * item = treeWidget->topLevelItem(0);
if(item != nullptr)
treeWidget->setCurrentItem(item);
}*/
setCurrentInstructor(lastCurrentID);
treeWidget->sortItems(ColumnsTreeInsructors::clmn_Instructor, Qt::SortOrder::AscendingOrder);
mtxTreeWidget.unlock();
waitAnimationWidget->hideWithStop();
}
void InstructorsView::reSetHeadTreeWidget()
{
QStringList listHeaders = {tr("Instructor"), tr("Login"), tr("Password"), tr("Administrator"), tr("Archived"), tr("Logged"), tr("ID")};
treeWidget->setHeaderLabels(listHeaders);
}
void InstructorsView::setCurrentInstructor(int id)
{
for(int i = 0; i < treeWidget->topLevelItemCount(); i++)
{
QTreeWidgetItem * item = treeWidget->topLevelItem(i);
if(item != nullptr)
if(item->text(ColumnsTreeInsructors::clmn_ID).toInt() == id)
{
treeWidget->setCurrentItem(item);
return;
}
}
QTreeWidgetItem * item = treeWidget->topLevelItem(0);
if(item != nullptr)
treeWidget->setCurrentItem(item);
}

View File

@@ -1,82 +0,0 @@
#include <QMessageBox>
#include "editorinstructors.h"
#include "viewerinstructors.h"
#include "ui_viewerinstructors.h"
ViewerInstructors::ViewerInstructors(ConnectorToServer* connectorToServer, QWidget *parent) :
InstructorsView(connectorToServer, CommonView::TypeView::onlyView, parent),
ui(new Ui::ViewerInstructors)
{
ui->setupUi(this);
ui->horizontalLayout_1->addWidget(treeWidget);
treeWidget->setSelectionMode(QAbstractItemView::NoSelection);
preparationTreeWidget();
setNotLoggedInVisible(true);
ui->btnEditorInstructors->setVisible(false);
}
ViewerInstructors::~ViewerInstructors()
{
delete ui;
}
void ViewerInstructors::setAuthComplited(bool authComplited)
{
this->authComplited = authComplited;
updateButtons();
}
void ViewerInstructors::deactivate()
{
CommonView::deactivate();
updateButtons();
}
void ViewerInstructors::changeEvent(QEvent *event)
{
// В случае получения события изменения языка приложения
if (event->type() == QEvent::LanguageChange)
{// переведём окно заново
ui->retranslateUi(this);
reSetHeadTreeWidget();
//loadInstructorsFromDB();
slot_NeedUpdateUI(true, false);
}
}
void ViewerInstructors::on_btnEditorInstructors_clicked()
{
Q_EMIT signal_BlockAutorization(true);
EditorInstructors editorInstructors(connectorToServer, adminMode);
connect(connectorToServer, &ConnectorToServer::signal_UpdateDB, &editorInstructors, &EditorInstructors::slot_NeedUpdateUI);
QDialog* dialog = new QDialog(this);
QHBoxLayout *layout = new QHBoxLayout(dialog);
layout->addWidget(&editorInstructors);
dialog->setWindowTitle(tr("Editor of instructors"));
dialog->setMinimumSize(1600, 800);
dialog->setStyleSheet(this->styleSheet());
dialog->exec();
loadInstructorsFromDB();
Q_EMIT signal_BlockAutorization(false);
}
void ViewerInstructors::updateButtons()
{
if(adminMode && authComplited)
{
ui->btnEditorInstructors->setEnabled(true);
}
else
{
ui->btnEditorInstructors->setEnabled(false);
}
}

View File

@@ -1,488 +0,0 @@
#include <QMessageBox>
#include <QThread>
#include "instructorsandtraineeswidget.h"
#include "ui_instructorsandtraineeswidget.h"
#include "dialogauthorizationinstructor.h"
#include "dialogsettings.h"
InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::InstructorsAndTraineesWidget),
connectorToServer(nullptr),
viewerTrainees(nullptr),
viewerInstructors(nullptr),
messangerWidget(nullptr),
ammTasksWidget(nullptr),
fimTasksWidget(nullptr),
adminMode(false),
loginInstructorLoggedInLocal(QStringLiteral("")),
nameInstructorLoggedInLocal(QStringLiteral("")),
language("ENG")
{
ui->setupUi(this);
ui->btnSettings->setObjectName("btnSettings");
ui->tabWidget_Tasks->setObjectName("tabWidgetTasks");
ui->widget_Top->setObjectName("widgetTop");
ui->groupBox_Trainees->setObjectName("groupBox_Trainees");
#ifndef PROJECT_TYPE_DEBUG
//ui->btnUpdateStyleSheet->setVisible(false);
#endif
qRegisterMetaType<PacketType>("PacketType");
qRegisterMetaType<QList<Instructor>>("QList<Instructor>");
qRegisterMetaType<QList<Trainee>>("QList<Trainee>");
qRegisterMetaType<QList<Group>>("QList<Group>");
qRegisterMetaType<QList<Computer>>("QList<Computer>");
qRegisterMetaType<QList<Classroom>>("QList<Classroom>");
qRegisterMetaType<QList<Module*>>("QList<Module*>");
qRegisterMetaType<QList<QTreeWidgetItem*>>("QList<QTreeWidgetItem*>");
qRegisterMetaType<QList<TaskAmmFim>>("QList<TaskAmmFim>");
qRegisterMetaType<ClientMessage>("ClientMessage");
qDebug() << "InstructorsAndTraineesWidget init thread ID " << QThread::currentThreadId();
updateMyStyleSheet();
setLanguageInterfase();
connectorToServer = new ConnectorToServer(this);
connect(connectorToServer,&ConnectorToServer::sigLoginResult,this,&InstructorsAndTraineesWidget::checkLoginResult);
connect(connectorToServer,&ConnectorToServer::sigDeLoginResult,this,&InstructorsAndTraineesWidget::checkDeLoginResult);
viewerTrainees = new ViewerTrainees(connectorToServer, this);
viewerInstructors = new ViewerInstructors(connectorToServer, this);
connect(this, &InstructorsAndTraineesWidget::signal_NeedUpdateUI, viewerTrainees, &ViewerTrainees::slot_NeedUpdateUI);
connect(this, &InstructorsAndTraineesWidget::signal_NeedUpdateUI, viewerInstructors, &ViewerInstructors::slot_NeedUpdateUI);
connect(viewerInstructors, &ViewerInstructors::signal_BlockAutorization, this, &InstructorsAndTraineesWidget::signal_BlockAutorization);
connect(viewerTrainees, &ViewerTrainees::signal_BlockAutorization, this, &InstructorsAndTraineesWidget::signal_BlockAutorization);
//connect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerInstructors,&ViewerInstructors::slot_NeedUpdateUI);
//connect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerTrainees,&ViewerTrainees::slot_NeedUpdateUI);
connect(connectorToServer,&ConnectorToServer::signal_ConnectedToServer,this,&InstructorsAndTraineesWidget::slot_ConnectedToServer);
ammTasksWidget = new AMMtasksWidget(connectorToServer, TypeListTreeAMMFIM::listCommon, this);
fimTasksWidget = new FIMtasksWidget(connectorToServer, TypeListTreeAMMFIM::listCommon, this);
connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksFIM, fimTasksWidget, &FIMtasksWidget::slot_NeedUpdateUI);
connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksAMM, ammTasksWidget, &AMMtasksWidget::slot_NeedUpdateUI);
connect(viewerTrainees, &ViewerTrainees::signal_traineeSelected, fimTasksWidget, &FIMtasksWidget::slot_traineeSelected);
connect(viewerTrainees, &ViewerTrainees::signal_traineeSelected, ammTasksWidget, &AMMtasksWidget::slot_traineeSelected);
messangerWidget = new MessangerWidget(this);
//connect(connectorToServer,&ConnectorToServer::signal_InitMessanger,messangerWidget,&MessangerWidget::slot_InitMessanger);
connect(viewerTrainees, &ViewerTrainees::signal_traineeSelected, messangerWidget, &MessangerWidget::slot_traineeSelected);
connect(messangerWidget, &MessangerWidget::signal_tabMessengerChanged, viewerTrainees, &ViewerTrainees::slot_tabMessengerChanged);
connect(messangerWidget, &MessangerWidget::signal_sendMessage, connectorToServer, &ConnectorToServer::slot_sendMessage);
connect(connectorToServer,&ConnectorToServer::signal_receiveMessage,messangerWidget,&MessangerWidget::slot_showMessage);
connect(fimTasksWidget, &FIMtasksWidget::signal_AssignedTask, viewerTrainees, &ViewerTrainees::slot_waitAnimationWidgetShowWithPlayFIM);
connect(ammTasksWidget, &AMMtasksWidget::signal_AssignedTask, viewerTrainees, &ViewerTrainees::slot_waitAnimationWidgetShowWithPlayAMM);
//Размещение
ui->verticalLayout_Trainees->addWidget(viewerTrainees);
ui->verticalLayout_AMM->addWidget(ammTasksWidget);
ui->verticalLayout_FIM->addWidget(fimTasksWidget);
ui->verticalLayout_Messenger->addWidget(messangerWidget);
ui->verticalLayout_Instructors->addWidget(viewerInstructors);
ui->groupBox_Messenger->setMaximumWidth(500);
ui->groupBox_Instructors->setMaximumWidth(500);
ui->groupBox_Messenger->setMinimumWidth(490);
ui->groupBox_Instructors->setMinimumWidth(490);
ui->groupBox_Messenger->setMinimumHeight(500);
ui->groupBox_Instructors->setMinimumHeight(300);
ui->groupBox_Instructors->setMaximumHeight(300);
ui->groupBox_Trainees->setMinimumWidth(700);
ui->groupBox_Tasks->setMinimumWidth(600);
ui->btnAuthorizationInstructor->setEnabled(false);
ui->btnEditorTrainees->setEnabled(false);
ui->btnEditorInstructors->setEnabled(false);
ui->btnSetVersion->hide();
}
InstructorsAndTraineesWidget::~InstructorsAndTraineesWidget()
{
if(authorizationIsCompleted())
deAuthorizationInstructor(loginInstructorLoggedInLocal);
delete ammTasksWidget;
delete fimTasksWidget;
delete messangerWidget;
delete viewerInstructors;
delete viewerTrainees;
delete connectorToServer;
delete ui;
}
void InstructorsAndTraineesWidget::changeEvent(QEvent *event)
{
// В случае получения события изменения языка приложения
if (event->type() == QEvent::LanguageChange)
{// переведём окно заново
ui->retranslateUi(this);
updateLabelLoggedInInstructor(loginInstructorLoggedInLocal, nameInstructorLoggedInLocal);
updateLabelServer();
}
}
void InstructorsAndTraineesWidget::updateMyStyleSheet()
{
QString styleSheet = loadStyleSheet();
styleSheet = styleSheet.replace("\n", "");
this->setStyleSheet(styleSheet);
}
QString InstructorsAndTraineesWidget::getLanguage()
{
return language;
}
QString InstructorsAndTraineesWidget::loadStyleSheet()
{
//QString fileName = ":/resources/css/styleSheetMain.css";
QString fileName = "./resources/css/styleSheetMain.css";
QFile styleSheetFile(fileName);
if (!styleSheetFile.open(QFile::ReadOnly | QFile::Text))
{
QMessageBox::critical(this, tr("Attention!"), tr("The file could not be opened ") + fileName);
return QStringLiteral("");
}
else
{
QByteArray byteArray = styleSheetFile.readAll();
styleSheetFile.close();
QString style = byteArray;
return style;
}
}
void InstructorsAndTraineesWidget::slot_LanguageChanged(QString language)
{
qtLanguageTranslator.load(QString(QStringLiteral("translations/InstructorsAndTraineesWidget_")) + language, QStringLiteral("."));
qApp->installTranslator(&qtLanguageTranslator);
emit signal_LanguageChanged(language);
}
void InstructorsAndTraineesWidget::slot_UpdateStyleSheet()
{
updateMyStyleSheet();
}
void InstructorsAndTraineesWidget::checkLoginResult(ServerAuthorization *serverAuth)
{
if (serverAuth->Result)
{
loginInstructorLoggedInLocal = serverAuth->Login;
nameInstructorLoggedInLocal = serverAuth->ClientName;
idInstructorLoggedInLocal = serverAuth->Id;
if(loginInstructorLoggedInLocal == QStringLiteral("admin"))
adminMode = true;
else
adminMode = false;
viewerInstructors->setAdminMode(adminMode);
viewerTrainees->setAdminMode(adminMode);
viewerInstructors->setAuthComplited(true);
viewerTrainees->setAuthComplited(true);
ui->btnEditorTrainees->setEnabled(true);
if(adminMode)
ui->btnEditorInstructors->setEnabled(true);
Q_EMIT signal_NeedUpdateUI(true, true);
//ui->btnSetVersion->show();
//ui->btnAuthorizationInstructor->setText(tr("Deauthorization Instructor"));
updateLabelLoggedInInstructor(serverAuth->Login, serverAuth->ClientName);
connectorToServer->setLoginName(nameInstructorLoggedInLocal);
connectorToServer->sendQueryTasksXML("fim");
connectorToServer->sendQueryTasksXML("amm");
messangerWidget->initialize(serverAuth->Id);
//QMessageBox::information(this, tr("Instructor authorization"), tr("Successfully!"));
}
else
{
ui->btnAuthorizationInstructor->setChecked(false);
QMessageBox::warning(this, tr("Instructor authorization"), tr("Invalid login or password!"));
}
}
void InstructorsAndTraineesWidget::checkDeLoginResult(ServerDeAuthorization *serverDeAuth)
{
if (serverDeAuth->Result)
{
loginInstructorLoggedInLocal = QStringLiteral("");
nameInstructorLoggedInLocal = QStringLiteral("");
adminMode = false;
viewerInstructors->setAdminMode(adminMode);
viewerTrainees->setAdminMode(adminMode);
viewerInstructors->setAuthComplited(false);
viewerTrainees->setAuthComplited(false);
ui->btnEditorTrainees->setEnabled(false);
ui->btnEditorInstructors->setEnabled(false);
//Q_EMIT signal_NeedUpdateUI(true, false);
//ui->btnAuthorizationInstructor->setText(tr("Authorization Instructor"));
updateLabelLoggedInInstructor("","");
//QMessageBox::information(this, tr("Instructor deauthorization"), tr("Successfully!"));
}
else
{
ui->btnAuthorizationInstructor->setChecked(true);
QMessageBox::warning(this, tr("Instructor deauthorization"), tr("Error!"));
}
}
void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state)
{
if(state)
{//Сервер подключен
ui->btnConnectionToServer->setEnabled(false);
ui->btnAuthorizationInstructor->setEnabled(true);
ui->lblDBisConnected->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleGreen.png")));
//ServerSettings serverSettings = connectorToServer->getServerSettings();
//ui->lblServer->setText(serverSettings.Address + ":" +serverSettings.Port);
updateLabelLoggedInInstructor(loginInstructorLoggedInLocal, nameInstructorLoggedInLocal);
updateLabelServer();
}
else
{//Сервер отключен
ui->btnConnectionToServer->setEnabled(true);
ui->btnAuthorizationInstructor->setEnabled(false);
//ui->btnAuthorizationInstructor->setText(tr("Authorization Instructor"));
ui->btnAuthorizationInstructor->setChecked(false);
//ui->btnSetVersion->hide();
ui->lblDBisConnected->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleGray.png")));
//ui->lblServer->setText(tr("none"));
viewerInstructors->setAuthComplited(false);
viewerTrainees->setAuthComplited(false);
ui->btnEditorTrainees->setEnabled(false);
ui->btnEditorInstructors->setEnabled(false);
viewerTrainees->deactivate();
viewerInstructors->deactivate();
ammTasksWidget->deactivate();
fimTasksWidget->deactivate();
messangerWidget->clear();
loginInstructorLoggedInLocal = "";
nameInstructorLoggedInLocal = "";
updateLabelLoggedInInstructor(loginInstructorLoggedInLocal, nameInstructorLoggedInLocal);
updateLabelServer();
QMessageBox::warning(this, tr("Warning!"), tr("The server is disabled"));
}
}
bool InstructorsAndTraineesWidget::authorizationInstructorDialog(QWidget* parent)
{
DialogAuthorizationInstructor dlg(parent);
dlg.setWindowTitle(tr("Instructor authorization"));
do
{
switch( dlg.exec() )
{
case QDialog::Accepted:
{
QString login = dlg.getLogin();
QString password = dlg.getPassword();
connectorToServer->authorizationInstructorLocal(login, password);
return true;
}
case QDialog::Rejected:
return false;
default:
return false;
}
}
while(true);
return false;
}
bool InstructorsAndTraineesWidget::deAuthorizationInstructor(QString login)
{
connectorToServer->deAuthorizationInstructorLocal(login);
return true;
}
bool InstructorsAndTraineesWidget::authorizationIsCompleted()
{
if(loginInstructorLoggedInLocal == QStringLiteral(""))
return false;
else
return true;
}
void InstructorsAndTraineesWidget::on_btnConnectionToServer_clicked()
{
connectorToServer->SetConnectToServer();
}
void InstructorsAndTraineesWidget::on_btnAuthorizationInstructor_clicked()
{
bool stateIsChecked = ui->btnAuthorizationInstructor->isChecked();
if(stateIsChecked)
{//Авторизация Инструктора локальная (Администратора)
if(authorizationInstructorDialog(this))
{
connect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerInstructors,&ViewerInstructors::slot_NeedUpdateUI);
connect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerTrainees,&ViewerTrainees::slot_NeedUpdateUI);
connect(connectorToServer,&ConnectorToServer::signal_InitMessanger,messangerWidget,&MessangerWidget::slot_InitMessanger);
}
else
ui->btnAuthorizationInstructor->setChecked(false);
}
else
{//ДеАвторизация Инструктора локальная (Администратора)
if(authorizationIsCompleted())
{
if(deAuthorizationInstructor(loginInstructorLoggedInLocal))
{
disconnect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerInstructors,&ViewerInstructors::slot_NeedUpdateUI);
disconnect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerTrainees,&ViewerTrainees::slot_NeedUpdateUI);
disconnect(connectorToServer,&ConnectorToServer::signal_InitMessanger,messangerWidget,&MessangerWidget::slot_InitMessanger);
viewerTrainees->deactivate();
viewerInstructors->deactivate();
ammTasksWidget->deactivate();
fimTasksWidget->deactivate();
messangerWidget->clear();
}
else
ui->btnAuthorizationInstructor->setChecked(true);
}
}
}
void InstructorsAndTraineesWidget::updateLabelLoggedInInstructor(QString login, QString name)
{
if(authorizationIsCompleted())
{
QString nameLoggedInInstructor = QString("%1 (%2)").arg(name, login);
ui->lblLoggedInInstructor->setText(nameLoggedInInstructor);
if(loginInstructorLoggedInLocal == QStringLiteral("admin"))
ui->lblLoggedIn->setPixmap(QPixmap(QStringLiteral(":/resources/icons/admin.png")));
else
ui->lblLoggedIn->setPixmap(QPixmap(QStringLiteral(":/resources/icons/instructor.png")));
}
else
{
ui->lblLoggedInInstructor->setText(tr("none"));
ui->lblLoggedIn->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleGray.png")));
}
}
void InstructorsAndTraineesWidget::updateLabelServer()
{
if(!connectorToServer)
return;
if(connectorToServer->getIsConnected())
{
ServerSettings serverSettings = connectorToServer->getServerSettings();
ui->lblServer->setText(serverSettings.Address + " : " +serverSettings.Port);
}
else
ui->lblServer->setText(tr("none"));
}
void InstructorsAndTraineesWidget::setLanguageInterfase()
{
ServerSettings settings;
DialogSettings::loadSettings(&settings);
if(settings.Language == "ENG")
qtLanguageTranslator.load(QString("translations/InstructorsAndTraineesWidget_") + "en_EN", ".");
else
qtLanguageTranslator.load(QString("translations/InstructorsAndTraineesWidget_") + "ru_RU", ".");
qApp->installTranslator(&qtLanguageTranslator);
}
void InstructorsAndTraineesWidget::on_btnSetVersion_clicked()
{
connectorToServer->showVersionSelect();
}
void InstructorsAndTraineesWidget::on_btnSettings_clicked()
{
DialogSettings dlg(connectorToServer, (loginInstructorLoggedInLocal != ""), this);
connect(&dlg, &DialogSettings::signal_LanguageChanged, this, &InstructorsAndTraineesWidget::slot_LanguageChanged);
connect(&dlg, &DialogSettings::signal_UpdateStyleSheet, this, &InstructorsAndTraineesWidget::slot_UpdateStyleSheet);
switch( dlg.exec() )
{
case QDialog::Accepted:
{
language = dlg.getSettings().Language;
if(dlg.settingsServerIsChanged())
{
QMessageBox::warning(this, tr("Attention!"), tr("Server settings have been changed. Please reconnect to the server."));
if(authorizationIsCompleted())
deAuthorizationInstructor(loginInstructorLoggedInLocal);
connectorToServer->StopConnectToServer();
}
break;
}
case QDialog::Rejected:
break;
default:
break;
}
}
void InstructorsAndTraineesWidget::on_btnEditorTrainees_clicked()
{
this->viewerTrainees->on_btnEditorTrainees_clicked();
}
void InstructorsAndTraineesWidget::on_btnEditorInstructors_clicked()
{
this->viewerInstructors->on_btnEditorInstructors_clicked();
}

View File

@@ -1,441 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>InstructorsAndTraineesWidget</class>
<widget class="QWidget" name="InstructorsAndTraineesWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1314</width>
<height>901</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<family>Tahoma</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout_Main">
<item>
<widget class="QWidget" name="widget_Top" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_Top">
<item>
<widget class="QToolButton" name="btnConnectionToServer">
<property name="minimumSize">
<size>
<width>130</width>
<height>58</height>
</size>
</property>
<property name="text">
<string>Connection</string>
</property>
<property name="icon">
<iconset resource="resources.qrc">
<normaloff>:/resources/icons/connectDB.png</normaloff>:/resources/icons/connectDB.png</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="checkable">
<bool>false</bool>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnAuthorizationInstructor">
<property name="minimumSize">
<size>
<width>130</width>
<height>58</height>
</size>
</property>
<property name="text">
<string>Authorization</string>
</property>
<property name="icon">
<iconset resource="resources.qrc">
<normaloff>:/resources/icons/login-user.png</normaloff>:/resources/icons/login-user.png</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblDBisConnected">
<property name="minimumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="resources.qrc">:/resources/icons/circleGray.png</pixmap>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblServerPrefix">
<property name="text">
<string>Server: </string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblServer">
<property name="text">
<string>none</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblLoggedIn">
<property name="minimumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="resources.qrc">:/resources/icons/circleGray.png</pixmap>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblLoggedInPrefix">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>40</height>
</size>
</property>
<property name="text">
<string>Logged in Instructor: </string>
</property>
<property name="textFormat">
<enum>Qt::AutoText</enum>
</property>
<property name="scaledContents">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="lblLoggedInInstructor">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>40</height>
</size>
</property>
<property name="text">
<string>none</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="btnSetVersion">
<property name="minimumSize">
<size>
<width>58</width>
<height>58</height>
</size>
</property>
<property name="text">
<string>ChangeVersion</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnEditorTrainees">
<property name="minimumSize">
<size>
<width>58</width>
<height>58</height>
</size>
</property>
<property name="text">
<string>Editor Trainees</string>
</property>
<property name="icon">
<iconset resource="resources.qrc">
<normaloff>:/resources/icons/DB-trainees.png</normaloff>:/resources/icons/DB-trainees.png</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnEditorInstructors">
<property name="minimumSize">
<size>
<width>58</width>
<height>58</height>
</size>
</property>
<property name="text">
<string>Editor Instructors</string>
</property>
<property name="icon">
<iconset resource="resources.qrc">
<normaloff>:/resources/icons/DB-instructors.png</normaloff>:/resources/icons/DB-instructors.png</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="btnSettings">
<property name="minimumSize">
<size>
<width>58</width>
<height>58</height>
</size>
</property>
<property name="text">
<string>Settings</string>
</property>
<property name="icon">
<iconset resource="resources.qrc">
<normaloff>:/resources/icons/settings.png</normaloff>:/resources/icons/settings.png</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_Bottom">
<item>
<layout class="QVBoxLayout" name="verticalLayout_L">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_L">
<item>
<widget class="QGroupBox" name="groupBox_Trainees">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Trainees</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout_Trainees"/>
</item>
</layout>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox_Tasks">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Tasks</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_Tasks">
<item>
<widget class="QTabWidget" name="tabWidget_Tasks">
<property name="currentIndex">
<number>1</number>
</property>
<widget class="QWidget" name="tab_AMM">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<attribute name="title">
<string>AMM</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout_AMM"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_FIM">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<attribute name="title">
<string>FIM</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout_FIM"/>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_R">
<item>
<widget class="QGroupBox" name="groupBox_Messenger">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Messenger</string>
</property>
<layout class="QGridLayout" name="gridLayout_7">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout_Messenger"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_Instructors">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Instructors</string>
</property>
<layout class="QGridLayout" name="gridLayout_8">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout_Instructors"/>
</item>
</layout>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
<resources>
<include location="resources.qrc"/>
</resources>
<connections/>
</ui>

View File

@@ -1,260 +0,0 @@
#include <QListWidget>
#include <QBrush>
#include <QKeyEvent>
#include <QAbstractScrollArea>
#include <QMessageBox>
#include <QLabel>
#include "messangerwidget.h"
#include "ui_messangerwidget.h"
MessangerWidget::MessangerWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MessangerWidget),
selectedUserLogin(""),
selectedUserId("")
{
ui->setupUi(this);
ui->tabWidget->removeTab(1);
ui->tabWidget->removeTab(0);
ui->btnSend->setObjectName("btnSend");
ui->btnSend->setEnabled(false);
ui->editMsg->setEnabled(false);
}
MessangerWidget::~MessangerWidget()
{
delete ui;
}
void MessangerWidget::addMsgFromClient(Trainee trainee, QString text)
{
//Пробуем добавить вкладку диалога с клиентом (если вдруг еще нет)
addTabDialogMessenger(trainee);
//Ищем нужный диалог
QString login = trainee.getLogin();
foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
{//Есть такой
if(tabDialog->getUserLogin() == trainee.getLogin())
{
//Добавляем в существующую вкладку
ui->tabWidget->setCurrentIndex(getIndexTab(login));
tabDialog->addMsgWidgetRemote(text);
//Делаем ее текущей
ui->tabWidget->setCurrentIndex(getIndexTab(login));
selectedUserLogin = login;
selectedUserId = QString::number(trainee.getID());
return;
}
}
}
void MessangerWidget::initialize(QString id)
{
currClientId = id;
}
void MessangerWidget::addTabDialogMessenger(Trainee trainee)
{
if(listTabDialogMessenger.count() == 0)
{//Самая первая вкладка, делаем ее активной
selectedUserLogin = trainee.getLogin();
selectedUserId = QString::number(trainee.getID());
emit signal_tabMessengerChanged(selectedUserLogin);
ui->btnSend->setEnabled(true);
ui->editMsg->setEnabled(true);
}
//Проверяем наличие диалога с этим клиентом
foreach(TabDialogMessenger* dialogMsg, listTabDialogMessenger)
{
if(dialogMsg->getUserLogin() == trainee.getLogin())
{//Диалог для этого клиента уже существует
//Обновляем статус залогинивания
if(trainee.getLoggedIn())
ui->tabWidget->setTabIcon(getIndexTab(trainee.getLogin()), QIcon(":/resources/icons/circleGreen.png"));
else
ui->tabWidget->setTabIcon(getIndexTab(trainee.getLogin()), QIcon(":/resources/icons/circleGray.png"));
return;
}
}
//Диалога для этого клиента еще не существует
//Помещаем новый диалог в список диалогов
TabDialogMessenger* tabDialog = new TabDialogMessenger(trainee.getLogin(),QString::number(trainee.getID()), this);
listTabDialogMessenger.append(tabDialog);
//Добавляем новую вкладку диалога
int index = ui->tabWidget->addTab(tabDialog, /*login + ": " +*/ trainee.getName());
//Обновляем статус залогинивания
if(trainee.getLoggedIn())
ui->tabWidget->setTabIcon(index, QIcon(":/resources/icons/circleGreen.png"));
else
ui->tabWidget->setTabIcon(index, QIcon(":/resources/icons/circleGray.png"));
}
void MessangerWidget::actualizationTabsDialogMessenger()
{
foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
{
QString login = tabDialog->getUserLogin();
bool exist = false;
for(Trainee trainee : listTrainees)
{
if(trainee.getLogin() == login)
{
if(trainee.getArchived())
{//Стал архивным
//Удаляем диалог с клиентом
ui->tabWidget->removeTab(getIndexTab(login));
listTabDialogMessenger.removeOne(tabDialog);
}
else
exist = true;
break;
}
}
if(!exist)
{//Нет такого логина
//Удаляем диалог с клиентом
ui->tabWidget->removeTab(getIndexTab(login));
listTabDialogMessenger.removeOne(tabDialog);
}
}
}
int MessangerWidget::getIndexTab(QString login)
{
for(int index = 0; index < ui->tabWidget->count(); index++)
{
TabDialogMessenger* tabDialogMessenger = static_cast<TabDialogMessenger*>(ui->tabWidget->widget(index));
if(tabDialogMessenger->getUserLogin() == login)
return index;
}
return -1;
}
void MessangerWidget::clear()
{
ui->btnSend->setEnabled(false);
ui->editMsg->setEnabled(false);
listTrainees.clear();
actualizationTabsDialogMessenger();
}
void MessangerWidget::on_btnSend_clicked()
{
QString text = ui->editMsg->toPlainText();
QString from = currClientId + "-" + QString::number(0);// временный костыль, так как чаты только с обучаемыми
QString to = selectedUserId + "-" + QString::number(1);// временный костыль, так как чаты только с обучаемыми
ClientMessage message = ClientMessage(from,to,text);
emit signal_sendMessage(message);
ui->editMsg->clear();
//Ищем нужный диалог
foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
{
if(tabDialog->getUserLogin() == selectedUserLogin)
{
//Добавляем в существующую вкладку
tabDialog->addMsgWidgetLocal(text);
//Делаем ее активной
ui->tabWidget->setCurrentIndex(getIndexTab(selectedUserLogin));
return;
}
}
}
void MessangerWidget::on_tabWidget_currentChanged(int index)
{
//Ищем нужный диалог
foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
{
if(getIndexTab(tabDialog->getUserLogin()) == index)
{
selectedUserLogin = tabDialog->getUserLogin();
selectedUserId = tabDialog->getUserId();
emit signal_tabMessengerChanged(selectedUserLogin);
return;
}
}
}
void MessangerWidget::slot_traineeSelected(QString login)
{
//Ищем нужный диалог
foreach(TabDialogMessenger* tabDialog, listTabDialogMessenger)
{
if(tabDialog->getUserLogin() == login)
{
//Активируем нужную вкладку
ui->tabWidget->setCurrentIndex(getIndexTab(login));
ui->btnSend->setEnabled(true);
ui->editMsg->setEnabled(true);
return;
}
}
ui->btnSend->setEnabled(false);
ui->editMsg->setEnabled(false);
}
void MessangerWidget::slot_LanguageChanged(QString language)
{
qtLanguageTranslator.load(QString("translationsMy/ServerLMS_") + language, ".");
qApp->installTranslator(&qtLanguageTranslator);
}
void MessangerWidget::slot_InitMessanger(QList<Trainee> listTrainees)
{
this->listTrainees = listTrainees;
actualizationTabsDialogMessenger();
for(Trainee trainee: listTrainees)
{
if(! trainee.getArchived())
addTabDialogMessenger(trainee);
}
}
void MessangerWidget::slot_showMessage(ClientMessage clientMessage)
{
auto result = clientMessage.fromId.split("-");
for(Trainee trainee: listTrainees)
{
if(QString::number(trainee.getID()) == result[0])
{
addMsgFromClient(trainee, clientMessage.Text);
break;
}
}
}
void MessangerWidget::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return)
{
ui->btnSend->click();
}
}
void MessangerWidget::changeEvent(QEvent *event)
{
// В случае получения события изменения языка приложения
if (event->type() == QEvent::LanguageChange)
{
ui->retranslateUi(this); // переведём окно заново
}
}

View File

@@ -1,76 +0,0 @@
#ifndef MESSANGERWIDGET_H
#define MESSANGERWIDGET_H
#include <QWidget>
#include <QTranslator>
#include <trainee.h>
#include "Datas.h"
#include "tabdialogmessenger.h"
namespace Ui {
class MessangerWidget;
}
//Главный виджет мессенджера
class MessangerWidget : public QWidget
{
Q_OBJECT
public:
explicit MessangerWidget(QWidget *parent = nullptr);
~MessangerWidget();
protected:
// Метод получения событий
// В нём будет производиться проверка события смены перевода приложения
void changeEvent(QEvent * event) override;
public:
enum ETypeMsg{fromClient, toClient};
void addMsgFromClient(Trainee trainee, QString text);
void initialize(QString id);
void addTabDialogMessenger(Trainee trainee);
void actualizationTabsDialogMessenger();
int getIndexTab(QString login);
void clear();
private slots:
void on_btnSend_clicked();
void on_tabWidget_currentChanged(int index);
signals:
//сигнал о готовности нового сообщения на отправку клиенту
void signal_sendMessage(ClientMessage clientMessage);
//сигнал об изменении вкладки диалога с клиентом (TabDialogMessenger)
void signal_tabMessengerChanged(QString login);
public slots:
//слот обработки сигнала о смене языка
void slot_LanguageChanged(QString language);
//слот обработки сигнала об инициализации мессенджера
void slot_InitMessanger(QList<Trainee> listTrainees);
//слот обработки сигнала о выборе обучаемого
void slot_traineeSelected(QString login);
//слот о приходе нового сообщения от клиента
void slot_showMessage(ClientMessage clientMessage);
private:
virtual void keyPressEvent(QKeyEvent *event) override;
private:
Ui::MessangerWidget *ui;
QList <TabDialogMessenger*> listTabDialogMessenger;
QList<Trainee> listTrainees;
QString selectedUserLogin; //Логин клиента текущего диалога
QString selectedUserId; //id клиента текущего диалога
QString currClientId; //id этого клиента
QTranslator qtLanguageTranslator;
};
#endif // MESSANGERWIDGET_H

View File

@@ -1,134 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MessangerWidget</class>
<widget class="QWidget" name="MessangerWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>500</width>
<height>300</height>
</rect>
</property>
<property name="font">
<font>
<family>Tahoma</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout_Main">
<item>
<layout class="QVBoxLayout" name="verticalLayout_1" stretch="0">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab_1">
<attribute name="title">
<string>Tab 1</string>
</attribute>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Tab 2</string>
</attribute>
</widget>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item>
<widget class="QTextEdit" name="editMsg">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Ignored">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>50</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>1000</height>
</size>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QToolButton" name="btnSend">
<property name="sizePolicy">
<sizepolicy hsizetype="Ignored" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>65</width>
<height>58</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>1000</width>
<height>1000</height>
</size>
</property>
<property name="text">
<string>Send</string>
</property>
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/resources/icons/sendMsg.png</normaloff>:/resources/icons/sendMsg.png</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
<resources>
<include location="../resources.qrc"/>
</resources>
<connections/>
</ui>

View File

@@ -1,92 +0,0 @@
#include "msgwidget.h"
#include "ui_msgwidget.h"
MsgWidget::MsgWidget(QString avatar, AligneAvatar aligneAvatar, int width, QWidget *parent) :
QWidget(parent),
ui(new Ui::MsgWidget),
widthEdit(100)
{
ui->setupUi(this);
setAvatar(avatar);
if(aligneAvatar == AligneAvatar::Left)
setAligneAvatarLeft();
else
setAligneAvatarRight();
setWidth(width);
}
MsgWidget::~MsgWidget()
{
delete ui;
}
void MsgWidget::setAligneAvatarLeft()
{
ui->horizontalLayout->removeWidget(ui->textEdit);
ui->horizontalLayout->removeItem(ui->verticalLayout);
ui->horizontalLayout->removeItem(ui->horizontalLayout_2);
ui->horizontalLayout->addLayout(ui->verticalLayout);
ui->horizontalLayout->addWidget(ui->textEdit);
ui->horizontalLayout->addLayout(ui->horizontalLayout_2);
ui->textEdit->setObjectName("MsgWidgetLocal");
}
void MsgWidget::setAligneAvatarRight()
{
ui->horizontalLayout->removeWidget(ui->textEdit);
ui->horizontalLayout->removeItem(ui->verticalLayout);
ui->horizontalLayout->removeItem(ui->horizontalLayout_2);
ui->horizontalLayout->addLayout(ui->horizontalLayout_2);
ui->horizontalLayout->addWidget(ui->textEdit);
ui->horizontalLayout->addLayout(ui->verticalLayout);
ui->textEdit->setObjectName("MsgWidgetRemote");
}
void MsgWidget::setAvatar(QString avatar)
{
QPixmap pix(avatar);
ui->label->setPixmap( pix.scaled(32,32) );
}
void MsgWidget::setWidth(int width)
{
this->setFixedWidth(width);
widthEdit = width - 200;
}
void MsgWidget::setText(QString text)
{
ui->textEdit->setText(text);
}
void MsgWidget::on_textEdit_textChanged()
{
QString text = ui->textEdit->toPlainText();
QFontMetrics metricsFont(ui->textEdit->font()); //метрики шрифта
//геометрические параметры текста (высота/ширина в пикселях). В одну строку
QRect textRect = metricsFont.boundingRect(QRect(0, 0, 0, 0), 0, text);
int X = 10; // отступы
if(textRect.width() > widthEdit)
{//Не помещается в одну строку
textRect = metricsFont.boundingRect(QRect(0, 0, widthEdit, 10), Qt::TextWordWrap, text);
ui->textEdit->setFixedHeight(textRect.height() + X);
this->setFixedHeight(textRect.height() + X + 20);
}
else
{//В одну строку
ui->textEdit->setFixedWidth(textRect.width() + X);
ui->textEdit->setFixedHeight(textRect.height() + X);
this->setFixedHeight(textRect.height() + X + 20);
}
}

View File

@@ -1,106 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MsgWidget</class>
<widget class="QWidget" name="MsgWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>91</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="minimumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QTextEdit" name="textEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustIgnored</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@@ -1,57 +0,0 @@
#include <QScrollBar>
#include "tabdialogmessenger.h"
#include "msgwidget.h"
TabDialogMessenger::TabDialogMessenger(QString login , QString userId, QWidget *parent):
QListWidget(parent),
login(""),
userId("")
{
this->userId = userId;
this->login = login;
setWordWrap(true);
setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOn);
}
TabDialogMessenger::~TabDialogMessenger()
{
}
void TabDialogMessenger::addMsgWidgetLocal(QString text)
{
QListWidgetItem *listWidgetItem = new QListWidgetItem();
QString avatar = ":/resources/icons/instructor.png";
MsgWidget *msgWidget = new MsgWidget(avatar, MsgWidget::AligneAvatar::Left,
width() - verticalScrollBar()->size().width());
addItem(listWidgetItem);
setItemWidget(listWidgetItem, msgWidget);
msgWidget->setText(text);
//Корректировка высоты item
listWidgetItem->setSizeHint (QSize(10, msgWidget->height()));
scrollToItem(listWidgetItem);
}
void TabDialogMessenger::addMsgWidgetRemote(QString text)
{
QListWidgetItem *listWidgetItem = new QListWidgetItem();
QString avatar = ":/resources/icons/trainee.png";
MsgWidget *msgWidget = new MsgWidget(avatar, MsgWidget::AligneAvatar::Right,
width() - verticalScrollBar()->size().width());
addItem(listWidgetItem);
setItemWidget(listWidgetItem, msgWidget);
msgWidget->setText(text);
//Корректировка высоты item
listWidgetItem->setSizeHint (QSize(10, msgWidget->height()));
scrollToItem(listWidgetItem);
}

View File

@@ -1,29 +0,0 @@
#ifndef TABDIALOGMESSENGER_H
#define TABDIALOGMESSENGER_H
#include <QListWidget>
//Закладка ведения диалога с одним клиентом
//TODO сделать идентификацию по ID
class TabDialogMessenger : public QListWidget
{
Q_OBJECT
public:
TabDialogMessenger(QString userLogin, QString userId, QWidget *parent = nullptr);
~TabDialogMessenger();
QString getUserLogin() {return login;};
QString getUserId() {return userId;}
void addMsgWidgetLocal(QString text);
void addMsgWidgetRemote(QString text);
private:
QString login;
QString userId;
};
#endif // TABDIALOGMESSENGER_H

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -1,352 +0,0 @@
#include <QFile>
#include <QXmlStreamReader>
#include <QDomDocument>
#include <QMessageBox>
#include <QThread>
#include <QResizeEvent>
#include "ammtaskswidget.h"
#include "ui_ammtaskswidget.h"
#include "dialogchecktask.h"
AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeListTreeAMMFIM type, QWidget *parent) :
QWidget(parent),
ui(new Ui::AMMtasksWidget),
connectorToServer(connectorToServer),
treeWidget(nullptr),
type(type),
loginTraineeSelected(""),
idTraineeSelected(0),
threadPreparation(nullptr),
taskTreePreparation(nullptr),
waitAnimationWidget(nullptr),
flOnlyActive(false)
{
ui->setupUi(this);
qDebug() << "AMMtasksWidget init thread ID " << QThread::currentThreadId();
treeWidget = new QTreeWidget();
ui->horizontalLayout_1->addWidget(treeWidget);
connect(treeWidget, &QTreeWidget::currentItemChanged, this, &AMMtasksWidget::on_treeWidget_currentItemChanged);
preparationTreeWidget();
threadPreparation = new QThread();
taskTreePreparation = new TaskAMMFIMTreePreparation(type);
taskTreePreparation->moveToThread(threadPreparation);
threadPreparation->start();
threadPreparation->setPriority(QThread::HighestPriority);
connect(this, &AMMtasksWidget::signal_prepareAMMListItems, taskTreePreparation, &TaskAMMFIMTreePreparation::slot_prepareAMMListItems);
connect(this, &AMMtasksWidget::signal_prepareAMMListItemsForTrainee, taskTreePreparation, &TaskAMMFIMTreePreparation::slot_prepareAMMListItemsForTrainee);
connect(taskTreePreparation, &TaskAMMFIMTreePreparation::signal_listAMMItemsReady, this, &AMMtasksWidget::slot_AMMlistItemsReady);
connect(this, &AMMtasksWidget::signal_stopParserPreparation, taskTreePreparation, &TaskAMMFIMTreePreparation::slot_stopParserPreparation);
waitAnimationWidget = new WaitAnimationWidget;
QMovie *movie = new QMovie(":/resources/icons/762.gif");
waitAnimationWidget->setParent(this);
waitAnimationWidget->initialize(movie,this);
ui->btnDelete->setObjectName("btnDelete");
ui->btnDelete->setEnabled(false);
ui->btnCheck->setObjectName("btnCheck");
ui->btnCheck->setEnabled(false);
ui->btnOnlyActive->setObjectName("btnOnlyActive");
ui->btnOnlyActive->setEnabled(false);
ui->btnAssignTask->setObjectName("btnAssignTask");
ui->btnAssignTask->setEnabled(false);
if(type == TypeListTreeAMMFIM::listCommon)
{
ui->horizontalLayout_3->addWidget(ui->btnAssignTask);
ui->horizontalLayout_3->addWidget(ui->btnOnlyActive);
ui->horizontalLayout_3->addWidget(ui->btnCheck);
ui->horizontalLayout_3->addWidget(ui->btnDelete);
ui->horizontalLayout_3->setAlignment(Qt::AlignmentFlag::AlignLeft);
ui->btnDelete->setVisible(false);
ui->btnCheck->setVisible(false);
}
else
{
ui->btnOnlyActive->setVisible(false);
ui->btnAssignTask->setVisible(false);
ui->verticalLayout->setAlignment(Qt::AlignmentFlag::AlignBottom);
}
//ui->btnCheck->setVisible(false);
}
AMMtasksWidget::~AMMtasksWidget()
{
waitAnimationWidget->hideWithStop();
emit signal_stopParserPreparation();
threadPreparation->quit();
threadPreparation->wait();
delete threadPreparation;
delete taskTreePreparation;
delete waitAnimationWidget;
delete treeWidget;
delete ui;
}
void AMMtasksWidget::deactivate()
{
ui->btnAssignTask->setEnabled(false);
ui->btnOnlyActive->setEnabled(false);
treeWidget->clear();
loginTraineeSelected = "";
idTraineeSelected = 0;
}
void AMMtasksWidget::waitAnimationWidgetShowWithPlay()
{
waitAnimationWidget->showWithPlay();
}
void AMMtasksWidget::resizeEvent(QResizeEvent *event)
{
QSize size = event->size();
waitAnimationWidget->resize(size);
int width = treeWidget->width();
treeWidget->setColumnWidth(ColumnsTreeAMM::clmnAMM_ID, 50);
treeWidget->setColumnWidth(ColumnsTreeAMM::clmnAMM_code, 250);
treeWidget->setColumnWidth(ColumnsTreeAMM::clmnAMM_status, 110);
int widthPMorDM;
if(type == TypeListTreeAMMFIM::listCommon)
widthPMorDM = width - (250 + 10);
else
widthPMorDM = width - (410 + 10);
treeWidget->setColumnWidth(ColumnsTreeAMM::clmnAMM_PMorDM, widthPMorDM);
}
void AMMtasksWidget::changeEvent(QEvent *event)
{
// В случае получения события изменения языка приложения
if (event->type() == QEvent::LanguageChange)
{// переведём окно заново
ui->retranslateUi(this);
reSetHeadTreeWidget();
if(type == TypeListTreeAMMFIM::listCommon)
{
//slot_NeedUpdateUI();
}
else if(type == TypeListTreeAMMFIM::listForTrainee)
if(idTraineeSelected)
slot_UpdateTasksAMMforTrainee(idTraineeSelected);
}
}
void AMMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{
if(current == nullptr)
{
ui->btnDelete->setEnabled(false);
ui->btnCheck->setEnabled(false);
return;
}
else
{
ui->btnCheck->setEnabled(true);
ui->btnDelete->setEnabled(true);
}
int id = current->text(ColumnsTreeAMM::clmnAMM_ID).toInt();
if(taskTreePreparation->getTypeModuleAMMbyID(id) == ModuleType::TYPE_PM)
ui->btnAssignTask->setEnabled(false);
else
ui->btnAssignTask->setEnabled(true);
}
void AMMtasksWidget::slot_NeedUpdateUI()
{
qDebug() << "AMMtasksWidget::slot_NeedUpdateUI thread ID " << QThread::currentThreadId();
loadTasksAMM();
}
void AMMtasksWidget::slot_traineeSelected(QString login)
{
qDebug() << "AMMtasksWidget::slot_traineeSelected thread ID " << QThread::currentThreadId();
loginTraineeSelected = login;
idTraineeSelected = connectorToServer->getIdTraineeByLogin(loginTraineeSelected);
if(type == TypeListTreeAMMFIM::listForTrainee)
{
waitAnimationWidget->showWithPlay();
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_GET_TASKS_AMM_FOR_TRAINEE, idTraineeSelected);
}
}
void AMMtasksWidget::slot_UpdateTasksAMMforTrainee(int trainee_id)
{
qDebug() << "slot_UpdateTasksAMMforTrainee" << QThread::currentThreadId();
if(type == TypeListTreeAMMFIM::listForTrainee)
{
if(idTraineeSelected == trainee_id)
{
QList<TaskAmmFim> listTask = connectorToServer->getListTasksAMMforTrainee(trainee_id);
signal_prepareAMMListItemsForTrainee(listTask);
}
}
}
void AMMtasksWidget::loadTasksAMM(bool flRequestFromDB)
{
//Обновление дерева
treeWidget->clear();
waitAnimationWidget->showWithPlay();
QByteArray arrayAMM;
if(flRequestFromDB)
arrayAMM = connectorToServer->getListTaskAmmArray();
emit signal_prepareAMMListItems(arrayAMM, flOnlyActive);
}
void AMMtasksWidget::slot_AMMlistItemsReady(QList<QTreeWidgetItem *> listItems)
{
//Обновление дерева
treeWidget->clear();
for(QTreeWidgetItem * item : listItems)
treeWidget->addTopLevelItem(item);
QTreeWidgetItem * item = treeWidget->topLevelItem(0);
if(item != nullptr)
treeWidget->setCurrentItem(item);
waitAnimationWidget->hideWithStop();
ui->btnOnlyActive->setEnabled(true);
}
void AMMtasksWidget::preparationTreeWidget()
{
treeWidget->setColumnCount(clmnAMM_count);
reSetHeadTreeWidget();
if(type == TypeListTreeAMMFIM::listCommon)
{
treeWidget->setColumnHidden(ColumnsTreeAMM::clmnAMM_ID, true);
treeWidget->setColumnHidden(ColumnsTreeAMM::clmnAMM_status, true);
}
}
void AMMtasksWidget::reSetHeadTreeWidget()
{
QStringList listHeaders;
if(type == TypeListTreeAMMFIM::listForTrainee)
listHeaders = QStringList{tr("Task AMM"), tr("DM code"), tr("ID"), tr("Status")};
else
listHeaders = QStringList{tr("PM/DM"), tr("Code"), tr("ID"), tr("Status")};
treeWidget->setHeaderLabels(listHeaders);
}
void AMMtasksWidget::assignTaskAMMtoTrainee()
{
QTreeWidgetItem *current = treeWidget->currentItem();
if(current == nullptr)
return;
int id = current->text(ColumnsTreeAMM::clmnAMM_ID).toInt();
TaskAmmFim taskNew = taskTreePreparation->getTaskAMMbyID(id);
if(taskNew.getID())
{
int trainee_id = connectorToServer->getIdTraineeByLogin(loginTraineeSelected);
emit signal_AssignedTask();
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, trainee_id, &taskNew);
}
}
void AMMtasksWidget::on_btnDelete_clicked()
{
QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem();
if(treeItemCurrent != nullptr)
{
QTreeWidgetItem *treeItemParent = treeItemCurrent->parent();
if(treeItemParent == nullptr)
{//Выбрана задача
int id = treeItemCurrent->text(ColumnsTreeAMM::clmnAMM_ID).toInt();
if(QMessageBox::warning(this, tr("Attention!"), tr("The deletion will be irrevocable.\nDelete it anyway?"), QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Ok)
{
waitAnimationWidget->showWithPlay();
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_DEL_TASK_AMM_TO_TRAINEE, id);
}
}
}
}
void AMMtasksWidget::on_btnCheck_clicked()
{
QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem();
if(treeItemCurrent != nullptr)
{//Выбрана задача
int id = treeItemCurrent->text(ColumnsTreeAMM::clmnAMM_ID).toInt();
TaskAmmFim task = taskTreePreparation->getTaskAMMbyID(id);
if(!task.getID())
return;
DialogCheckTask dlg(connectorToServer, "amm", this);
dlg.setTask(&task);
QDialog* dialog = new QDialog(this);
QHBoxLayout *layout = new QHBoxLayout(dialog);
layout->addWidget(&dlg);
dialog->setWindowTitle(tr("Status Task"));
dialog->setMinimumSize(200, 100);
dialog->setStyleSheet(this->styleSheet());
dialog->exec();
if(dlg.getFlChanged())
waitAnimationWidget->showWithPlay();
}
}
void AMMtasksWidget::on_btnAssignTask_clicked()
{
if(QMessageBox::question(this, tr("New task"), tr("Assign this task?"), QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Ok)
assignTaskAMMtoTrainee();
}
void AMMtasksWidget::on_btnOnlyActive_clicked()
{
if(ui->btnOnlyActive->isChecked())
{
flOnlyActive = true;
}
else
{
flOnlyActive = false;
}
loadTasksAMM(true);
}

View File

@@ -1,113 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DialogEditGroup</class>
<widget class="QDialog" name="DialogEditGroup">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>300</width>
<height>96</height>
</rect>
</property>
<property name="font">
<font>
<family>Tahoma</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="windowTitle">
<string>Group</string>
</property>
<property name="windowIcon">
<iconset resource="../resources.qrc">
<normaloff>:/icons/group.png</normaloff>:/icons/group.png</iconset>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Name</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="editName">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="locale">
<locale language="English" country="UnitedStates"/>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="../resources.qrc"/>
</resources>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>DialogEditGroup</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>DialogEditGroup</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@@ -1,72 +0,0 @@
#include "dialogedittrainee.h"
#include "ui_dialogedittrainee.h"
#include <QPushButton>
DialogEditTrainee::DialogEditTrainee(QWidget *parent) :
QDialog(parent),
ui(new Ui::DialogEditTrainee),
traineeInput()
{
ui->setupUi(this);
verify();
ui->editName->setProperty("mandatoryField", true);
ui->editLogin->setProperty("mandatoryField", true);
ui->editPassword->setProperty("mandatoryField", true);
}
DialogEditTrainee::~DialogEditTrainee()
{
delete ui;
}
void DialogEditTrainee::setTrainee(Trainee trainee)
{
traineeInput = trainee;
ui->editName->setText(trainee.getName());
ui->editLogin->setText(trainee.getLogin());
ui->editPassword->setText(trainee.getPassword());
ui->checkArchived->setChecked(trainee.getArchived());
ui->checkLoggedIn->setChecked(trainee.getLoggedIn());
}
Trainee DialogEditTrainee::getTrainee()
{
Trainee trainee = traineeInput;
trainee.setName(ui->editName->text());
trainee.setLogin(ui->editLogin->text());
trainee.setPassword(ui->editPassword->text());
trainee.setArchived(ui->checkArchived->isChecked());
trainee.setLoggedIn(ui->checkLoggedIn->isChecked());
return trainee;
}
void DialogEditTrainee::on_editName_textChanged(const QString &arg1)
{
verify();
}
void DialogEditTrainee::on_editLogin_textChanged(const QString &arg1)
{
verify();
}
void DialogEditTrainee::on_editPassword_textChanged(const QString &arg1)
{
verify();
}
void DialogEditTrainee::verify()
{
if(ui->editName->text().trimmed() == QStringLiteral("") ||
ui->editLogin->text().trimmed() == QStringLiteral("") ||
ui->editPassword->text().trimmed() == QStringLiteral(""))
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
else
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
}

View File

@@ -1,262 +0,0 @@
#include <QHeaderView>
#include <QResizeEvent>
#include "traineesview.h"
TraineesView::TraineesView(ConnectorToServer* connectorToServer, TypeView type, QWidget *parent):
CommonView(connectorToServer, type, parent)
{
typeObject = TypeObject::objGroup;
}
void TraineesView::resizeEvent(QResizeEvent *event)
{
int width = treeWidget->width();
treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_ID, 50);
treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Login, 100);
treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Password, 100);
treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Class, 100);
treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Computer, 100);
treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_IP_address, 130);
treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Archived, 80);
treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Logged, 100);
int widthTrainee;
if(typeView == TypeView::onlyView)
{//onlyView
widthTrainee = width - (230 + 10);
}
else
{//control
if(adminMode)
widthTrainee = width - (760 + 10);
else
widthTrainee = width - (630 + 10);
}
if(widthTrainee < 250)
widthTrainee = 250;
treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Trainee, widthTrainee);
QSize size = event->size();
waitAnimationWidget->resize(size);
}
void TraineesView::slot_NeedUpdateUI(bool treeInstructor, bool treeTrainee)
{
updateButtons();
if(treeTrainee)
loadTraineesFromDB();
}
void TraineesView::preparationTreeWidget()
{
mtxTreeWidget.lock();
treeWidget->setColumnCount(clmn_count);
reSetHeadTreeWidget();
if(typeView == TypeView::onlyView)
{//onlyView
archiveVisible = false;
treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_ID, true);
treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_Password, true);
treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_Archived, true);
treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_Class, true);
treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_Computer, true);
treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_IP_address, true);
}
else
{//control
archiveVisible = true;
if(adminMode)
{
treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_ID, false);
treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_Archived, false);
}
else
{
treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_ID, true);
treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_Archived, true);
}
}
treeWidget->setSortingEnabled(true);
treeWidget->sortItems(ColumnsTreeTrainees::clmn_Trainee, Qt::SortOrder::AscendingOrder);
mtxTreeWidget.unlock();
}
void TraineesView::loadTraineesFromDB()
{
mtxTreeWidget.lock();
//Обновление дерева
treeWidget->clear();
QList <Group> listGroups;
QList <Trainee> listTrainees;
listGroups = connectorToServer->getListGroups();
listTrainees = connectorToServer->getListTrainees();
for(Group group : listGroups)
{
//Группа
int cntChildsNotArchived = 0;
QTreeWidgetItem *ItemGroup = new QTreeWidgetItem(treeWidget);
ItemGroup->setText(ColumnsTreeTrainees::clmn_ID, QString::number(group.getID()));
ItemGroup->setText(ColumnsTreeTrainees::clmn_Trainee, group.getName());
ItemGroup->setIcon(ColumnsTreeTrainees::clmn_Trainee, QIcon(QStringLiteral(":/resources/icons/group.png")));
setItemColor(ItemGroup, QColor(170, 190, 170));
//ItemGroup->set Property("greenButton", QVariant(true));
//((QAbstractItemView*)ItemGroup)->setIconSize(QSize(32, 32));
//Обучаемые
for(Trainee trainee : listTrainees)
{
if(trainee.getGroup().getID() != group.getID())
continue;
QTreeWidgetItem *ItemTrainee = new QTreeWidgetItem();
ItemTrainee->setText(ColumnsTreeTrainees::clmn_ID, QString::number(trainee.getID()));
ItemTrainee->setText(ColumnsTreeTrainees::clmn_Trainee, trainee.getName());
ItemTrainee->setText(ColumnsTreeTrainees::clmn_Login, trainee.getLogin());
ItemTrainee->setText(ColumnsTreeTrainees::clmn_Password, trainee.getPassword());
ItemTrainee->setText(ColumnsTreeTrainees::clmn_Class, trainee.getComputer().getClassroom().getName());
ItemTrainee->setText(ColumnsTreeTrainees::clmn_Computer, trainee.getComputer().getName());
ItemTrainee->setText(ColumnsTreeTrainees::clmn_IP_address, trainee.getComputer().getIpAddress());
//Сокрытие пароля
if(!adminMode)
ItemTrainee->setText(ColumnsTreeTrainees::clmn_Password, QStringLiteral("******"));
if(trainee.getArchived())
{//Архивный
ItemTrainee->setText(ColumnsTreeTrainees::clmn_Archived, tr("yes"));
ItemTrainee->setIcon(ColumnsTreeTrainees::clmn_Trainee, QIcon(QStringLiteral(":/resources/icons/archive.png")));
setItemColorArchive(ItemTrainee);
}
else
{//Не Архивный
ItemTrainee->setText(ColumnsTreeTrainees::clmn_Archived, tr("no"));
ItemTrainee->setIcon(ColumnsTreeTrainees::clmn_Trainee, QIcon(QStringLiteral(":/resources/icons/trainee.png")));
setItemColorNoArchive(ItemTrainee);
cntChildsNotArchived++;
}
if(trainee.getLoggedIn())
{//Залогинен
ItemTrainee->setText(ColumnsTreeTrainees::clmn_Logged, tr("yes"));
ItemTrainee->setIcon(ColumnsTreeTrainees::clmn_Logged, QIcon(QStringLiteral(":/resources/icons/circleGreen.png")));
}
else
{//Не Залогинен
ItemTrainee->setText(ColumnsTreeTrainees::clmn_Logged, tr("no"));
ItemTrainee->setIcon(ColumnsTreeTrainees::clmn_Logged, QIcon(QStringLiteral(":/resources/icons/circleGray.png")));
}
ItemGroup->addChild(ItemTrainee);
//Скрываем архивных (при необходимости)
if(trainee.getArchived())
if(! archiveVisible)
ItemTrainee->setHidden(true);
//Скрываем незалогиненых (при необходимости)
if(! trainee.getLoggedIn())
if(! notLoggedInVisible)
ItemTrainee->setHidden(true);
}
//if(! archiveVisible && cntChildsNotArchived == 0)
//delete ItemGroup;
}
treeWidget->expandAll();
/*
//if(typeView == TypeView::control)
{
QTreeWidgetItem * item = treeWidget->topLevelItem(0);
if(item != nullptr)
{
QTreeWidgetItem * itemChild = item->child(0);
if(itemChild != nullptr)
treeWidget->setCurrentItem(itemChild);
}
}*/
if(typeObject == TypeObject::objGroup)
setCurrentGroup(lastCurrentID);
else
setCurrentTrainee(lastCurrentID);
treeWidget->sortItems(ColumnsTreeTrainees::clmn_Trainee, Qt::SortOrder::AscendingOrder);
mtxTreeWidget.unlock();
waitAnimationWidget->hideWithStop();
}
void TraineesView::reSetHeadTreeWidget()
{
QStringList listHeaders = {tr("Trainee"), tr("Login"), tr("Password"), tr("Class"), tr("Computer"), tr("IP address"), tr("Archived"), tr("Logged"), tr("ID")};
treeWidget->setHeaderLabels(listHeaders);
}
void TraineesView::setCurrentGroup(int id)
{
typeObject = TypeObject::objGroup;
for(int i = 0; i < treeWidget->topLevelItemCount(); i++)
{
QTreeWidgetItem * item = treeWidget->topLevelItem(i);
if(item != nullptr)
if(item->text(ColumnsTreeTrainees::clmn_ID).toInt() == id)
{
treeWidget->setCurrentItem(item);
return;
}
}
QTreeWidgetItem * item = treeWidget->topLevelItem(0);
if(item != nullptr)
treeWidget->setCurrentItem(item);
}
void TraineesView::setCurrentTrainee(int id)
{
typeObject = TypeObject::objTrainee;
for(int i = 0; i < treeWidget->topLevelItemCount(); i++)
{
QTreeWidgetItem * item = treeWidget->topLevelItem(i);
if(item != nullptr)
{
for (int j = 0; j < item->childCount(); j++)
{
QTreeWidgetItem * itemChild = item->child(j);
if(itemChild != nullptr)
if(itemChild->text(ColumnsTreeTrainees::clmn_ID).toInt() == id)
{
treeWidget->setCurrentItem(itemChild);
return;
}
}//for (int j = 0; j < item->childCount(); j++)
}
}//for(int i = 0; i < treeWidget->topLevelItemCount(); i++)
QTreeWidgetItem * item = treeWidget->topLevelItem(0);
if(item != nullptr)
treeWidget->setCurrentItem(item);
}

View File

@@ -1,167 +0,0 @@
#include "editortrainees.h"
#include "viewertrainees.h"
#include "ui_viewertrainees.h"
ViewerTrainees::ViewerTrainees(ConnectorToServer* connectorToServer, QWidget *parent) :
TraineesView(connectorToServer, CommonView::TypeView::onlyView, parent),
ui(new Ui::ViewerTrainees),
ammTasksWidget(nullptr),
fimTasksWidget(nullptr)
{
ui->setupUi(this);
connect(treeWidget, &QTreeWidget::currentItemChanged, this, &ViewerTrainees::on_treeWidget_currentItemChanged);
ui->horizontalLayout_11->addWidget(treeWidget);
ammTasksWidget = new AMMtasksWidget(connectorToServer, TypeListTreeAMMFIM::listForTrainee, this);
fimTasksWidget = new FIMtasksWidget(connectorToServer, TypeListTreeAMMFIM::listForTrainee, this);
connect(this, &ViewerTrainees::signal_traineeSelected, fimTasksWidget, &FIMtasksWidget::slot_traineeSelected);
connect(this, &ViewerTrainees::signal_traineeSelected, ammTasksWidget, &AMMtasksWidget::slot_traineeSelected);
connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksAMMforTrainee, ammTasksWidget, &AMMtasksWidget::slot_UpdateTasksAMMforTrainee);
connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksFIMforTrainee, fimTasksWidget, &FIMtasksWidget::slot_UpdateTasksFIMforTrainee);
ui->verticalLayout_2->addWidget(ammTasksWidget);
ui->verticalLayout_2->addWidget(fimTasksWidget);
preparationTreeWidget();
setNotLoggedInVisible(true);
ui->btnEditorTrainees->setVisible(false);
}
ViewerTrainees::~ViewerTrainees()
{
delete ui;
}
void ViewerTrainees::setAuthComplited(bool authComplited)
{
this->authComplited = authComplited;
updateButtons();
}
void ViewerTrainees::deactivate()
{
CommonView::deactivate();
ammTasksWidget->deactivate();
fimTasksWidget->deactivate();
updateButtons();
}
/*
void ViewerTrainees::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column)
{
if(item->childCount() == 0)
{//Выбран обучаемый
QString login = item->text(ColumnsTreeTrainees::clmn_Login);
Q_EMIT signal_traineeSelected(login);
}
}*/
void ViewerTrainees::slot_tabMessengerChanged(QString login)
{
if(login == "")
return;
for (int i = 0; i < treeWidget->topLevelItemCount(); i++)
{//Проход по группам
int countChild = treeWidget->topLevelItem(i)->childCount();
for (int j = 0; j < countChild; j++)
{//Проход по обучаемым
QString loginChild = treeWidget->topLevelItem(i)->child(j)->text(ColumnsTreeTrainees::clmn_Login);
if(loginChild == login)
{
treeWidget->setCurrentItem(treeWidget->topLevelItem(i)->child(j));
typeObject = TypeObject::objTrainee;
int newCurrentID = connectorToServer->getIdTraineeByLogin(login);
if(newCurrentID == lastCurrentID)
return;
lastCurrentID = newCurrentID;
Q_EMIT signal_traineeSelected(login);
return;
}
}
}
}
void ViewerTrainees::slot_waitAnimationWidgetShowWithPlayFIM()
{
fimTasksWidget->waitAnimationWidgetShowWithPlay();
}
void ViewerTrainees::slot_waitAnimationWidgetShowWithPlayAMM()
{
ammTasksWidget->waitAnimationWidgetShowWithPlay();
}
void ViewerTrainees::changeEvent(QEvent *event)
{
// В случае получения события изменения языка приложения
if (event->type() == QEvent::LanguageChange)
{// переведём окно заново
ui->retranslateUi(this);
reSetHeadTreeWidget();
//loadTraineesFromDB();
slot_NeedUpdateUI(false, true);
}
}
void ViewerTrainees::on_btnEditorTrainees_clicked()
{
Q_EMIT signal_BlockAutorization(true);
EditorTrainees editorTraineesGroups(connectorToServer, adminMode);
connect(connectorToServer, &ConnectorToServer::signal_UpdateDB, &editorTraineesGroups, &EditorTrainees::slot_NeedUpdateUI);
QDialog* dialog = new QDialog(this);
QHBoxLayout *layout = new QHBoxLayout(dialog);
layout->addWidget(&editorTraineesGroups);
dialog->setWindowTitle(tr("Editor of trainees"));
dialog->setMinimumSize(1600, 800);
dialog->exec();
loadTraineesFromDB();
Q_EMIT signal_BlockAutorization(false);
}
void ViewerTrainees::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
{
if(current == nullptr)
return;
//if(current->childCount() == 0)
{//Выбран обучаемый
QString login = current->text(ColumnsTreeTrainees::clmn_Login);
//if(login != "")
{
int newCurrentID = connectorToServer->getIdTraineeByLogin(login);
if(newCurrentID == lastCurrentID)
return;
lastCurrentID = newCurrentID;
Q_EMIT signal_traineeSelected(login);
}
}
}
void ViewerTrainees::updateButtons()
{
if(authComplited)
{
ui->btnEditorTrainees->setEnabled(true);
}
else
{
ui->btnEditorTrainees->setEnabled(false);
}
}

View File

@@ -1,62 +0,0 @@
#ifndef TRAINEESWIDGET_H
#define TRAINEESWIDGET_H
#include "traineesview.h"
#include "ammtaskswidget.h"
#include "fimtaskswidget.h"
namespace Ui {
class ViewerTrainees;
}
//Виджет только для просмотра БД Обучаемых
class ViewerTrainees : public TraineesView
{
Q_OBJECT
public:
explicit ViewerTrainees(ConnectorToServer* connectorToServer, QWidget *parent = nullptr);
~ViewerTrainees();
public:
void setAuthComplited(bool authComplited);
void deactivate();
protected:
void changeEvent(QEvent * event) override;
Q_SIGNALS:
//сигнал о блокировке авторизации
void signal_BlockAutorization(bool block);
public Q_SLOTS:
//void on_treeWidget_itemClicked(QTreeWidgetItem *item, int column);
void on_btnEditorTrainees_clicked();
private Q_SLOTS:
void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
public Q_SLOTS:
//слот обработки сигнала об изменении вкладки диалога в мессенджере
void slot_tabMessengerChanged(QString login);
void slot_waitAnimationWidgetShowWithPlayFIM();
void slot_waitAnimationWidgetShowWithPlayAMM();
Q_SIGNALS:
//сигнал о выборе обучаемого
void signal_traineeSelected(QString login);
private:
void updateButtons() override;
private:
AMMtasksWidget* ammTasksWidget;
FIMtasksWidget* fimTasksWidget;
private:
Ui::ViewerTrainees *ui;
};
#endif // TRAINEESWIDGET_H

View File

@@ -1,82 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ViewerTrainees</class>
<widget class="QWidget" name="ViewerTrainees">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="font">
<font>
<family>Tahoma</family>
<pointsize>10</pointsize>
</font>
</property>
<property name="windowTitle">
<string>Trainees</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_1">
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_11"/>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_2"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QToolButton" name="btnEditorTrainees">
<property name="enabled">
<bool>false</bool>
</property>
<property name="minimumSize">
<size>
<width>130</width>
<height>58</height>
</size>
</property>
<property name="text">
<string>Editor of Trainees</string>
</property>
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/resources/icons/DB-trainees.png</normaloff>:/resources/icons/DB-trainees.png</iconset>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextUnderIcon</enum>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
<resources>
<include location="../resources.qrc"/>
</resources>
<connections/>
</ui>

View File

@@ -1,44 +0,0 @@
#include "newversionwidget.h"
#include "ui_newversionwidget.h"
NewVersionWidget::NewVersionWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::NewVersionWidget)
{
ui->setupUi(this);
setWindowFlags(Qt::SubWindow);
setAttribute(Qt::WA_ShowModal,true);
}
void NewVersionWidget::initialize(VersionSelectWidget *versionSelectWidget, QString prevName)
{
this->versionSelectWidget = versionSelectWidget;
ui->prevVerValue->setText(prevName);
validator = new QRegExpValidator(QRegExp("^[A-Za-z0-9]{20}$"));
ui->lineEdit->setValidator(validator);
}
void NewVersionWidget::on_createButton_clicked()
{
if(ui->lineEdit->text() != "")
{
versionSelectWidget->sendCopyEmit(ui->lineEdit->text());
hide();
}
}
void NewVersionWidget::on_cancelButton_clicked()
{
hide();
}
NewVersionWidget::~NewVersionWidget()
{
delete ui;
}
void NewVersionWidget::on_lineEdit_inputRejected()
{
QToolTip::showText(QCursor::pos(),tr("Only Latin letters and numbers"));
}

View File

@@ -1,36 +0,0 @@
#ifndef NEWVERSIONWIDGET_H
#define NEWVERSIONWIDGET_H
#include <Widgets/versionselectwidget.h>
#include <QWidget>
#include <QLineEdit>
#include <QToolTip>
namespace Ui {
class NewVersionWidget;
}
class VersionSelectWidget;
class NewVersionWidget : public QWidget
{
Q_OBJECT
public:
explicit NewVersionWidget(QWidget *parent = nullptr);
void initialize(VersionSelectWidget *versionSelectWidget,QString prevName);
~NewVersionWidget();
private slots:
void on_createButton_clicked();
void on_cancelButton_clicked();
void on_lineEdit_inputRejected();
private:
Ui::NewVersionWidget *ui;
VersionSelectWidget *versionSelectWidget;
QRegExpValidator *validator;
};
#endif // NEWVERSIONWIDGET_Hvoid on_lineEdit_inputRejected();

View File

@@ -1,259 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>NewVersionWidget</class>
<widget class="QWidget" name="NewVersionWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>344</width>
<height>200</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Create copy...</string>
</property>
<property name="windowIcon">
<iconset resource="../resources.qrc">
<normaloff>:/resources/icons/lms.png</normaloff>:/resources/icons/lms.png</iconset>
</property>
<property name="autoFillBackground">
<bool>true</bool>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QFrame" name="NewVerBackground">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="baseVerLayout">
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QLabel" name="prevVerTitle">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Basic version:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="prevVerValue">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>150</horstretch>
<verstretch>30</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="newNameLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>5</number>
</property>
<property name="topMargin">
<number>5</number>
</property>
<property name="rightMargin">
<number>5</number>
</property>
<property name="bottomMargin">
<number>5</number>
</property>
<item>
<widget class="QLabel" name="newNameVersionTitle">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>99</horstretch>
<verstretch>40</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>New name version:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>150</horstretch>
<verstretch>30</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>150</width>
<height>30</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>60</width>
<height>30</height>
</size>
</property>
<property name="toolTipDuration">
<number>1000</number>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="bottomMargin">
<number>6</number>
</property>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Minimum</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="createButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Create</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Minimum</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="cancelButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Cancel</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Minimum</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="../resources.qrc"/>
</resources>
<connections/>
</ui>

View File

@@ -1,174 +0,0 @@
#include "versionselectwidget.h"
#include "ui_versionselectwidget.h"
#include "ui_versionselectwidget.h"
#include <QMessageBox>
#include <QResizeEvent>
VersionSelectWidget::VersionSelectWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::VersionSelectWidget),
selectedVersion(nullptr),
waitAnimationWidget(nullptr),
recognizeSystem(nullptr)
{
ui->setupUi(this);
setWindowFlags(Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);
setAttribute(Qt::WA_ShowModal,true);
}
void VersionSelectWidget::initialize(SendSystem *sendSystem,VersionContainer *versionContainer,NotifyController *notifyController, RecognizeSystem *recognizeSystem)
{
this->recognizeSystem = recognizeSystem;
waitAnimationWidget = new WaitAnimationWidget;
QMovie *movie = new QMovie(":/resources/icons/762.gif");
waitAnimationWidget->setParent(this);
waitAnimationWidget->initialize(movie,this);
connect(this,&VersionSelectWidget::sigSendSwitchVersion,sendSystem,&SendSystem::sendChangeVersion,Qt::AutoConnection);
connect(this,&VersionSelectWidget::sigSendCopyVersion,sendSystem,&SendSystem::sendCopyVersion,Qt::AutoConnection);
connect(this,&VersionSelectWidget::sigSendDeleteVersion,sendSystem,&SendSystem::sendDeleteVersion,Qt::AutoConnection);
connect(this,&VersionSelectWidget::sigSendNotify,notifyController,&NotifyController::showWarning,Qt::AutoConnection);
connect(recognizeSystem,&RecognizeSystem::sigAnimationActivated,this,&VersionSelectWidget::slot_activateLoadAnimation,Qt::AutoConnection);
this->versionContainer = versionContainer;
hide();
setWindowTitle(tr("Version control"));
}
void VersionSelectWidget::fillView(QList<StreamingVersionData *> *serverData)
{
show();
ui->verListView->clear();
serverDataList = serverData;
ui->verValue->setText(versionContainer->getServerVersionData()->getViewName());
foreach(StreamingVersionData *data,*serverData)
{
ui->verListView->addItem(data->getViewName());
}
}
void VersionSelectWidget::on_verListView_itemClicked(QListWidgetItem *item)
{
foreach(StreamingVersionData *data,*serverDataList)
{
if(data->getViewName() == item->text())
{
QString info = tr("Version name: ") + data->getViewName() + "\n";
info.append(tr("Created: ") + data->getCreateData().toString() + "\n");
info.append(tr("Changeable: ") + changableText(data->getIsChangeable()) + "\n");
info.append(tr("Author: ") + data->getAuthor());
ui->infoValue->setText(info);
selectedVersion = data;
}
}
}
QString VersionSelectWidget::changableText(bool flag)
{
if(flag) return tr("Yes");
else return tr("No");
}
void VersionSelectWidget::on_createDuplicateButton_clicked()
{
if (selectedVersion == nullptr)
{
emit sigSendNotify(tr("Version not selected"));
return;
}
NewVersionWidget *newVersionWidget = new NewVersionWidget();
newVersionWidget->initialize(this,selectedVersion->getViewName());
/*
QDialog* dialog = new QDialog(this);
QHBoxLayout *layout = new QHBoxLayout(dialog);
layout->addWidget(newVersionWidget);
dialog->setWindowTitle(tr("Editor of instructors"));
dialog->setMinimumSize(200, 100);
dialog->setStyleSheet(this->styleSheet());
dialog->exec();
delete newVersionWidget;
*/
newVersionWidget->show();
}
void VersionSelectWidget::sendCopyEmit(QString newName)
{
QString result = selectedVersion->getViewName() + ";" + newName + ";" + authorName;
if (selectedVersion == nullptr)
{
emit sigSendNotify(tr("Version not selected"));
return;
}
//versionContainer->setLocalVersionData(selectedVersion);
emit sigSendCopyVersion(result);
}
void VersionSelectWidget::on_DeleteVersionButton_clicked()
{
if (selectedVersion == nullptr)
{
emit sigSendNotify(tr("Version not selected"));
return;
}
emit sigSendDeleteVersion(selectedVersion);
}
void VersionSelectWidget::on_switchServerVersionButton_clicked()
{
if (selectedVersion == nullptr)
{
emit sigSendNotify(tr("Version not selected"));
return;
}
versionContainer->setServerVersionData(selectedVersion);
ui->verValue->setText(selectedVersion->getViewName());
emit sigSendSwitchVersion(selectedVersion);
}
void VersionSelectWidget::slot_activateLoadAnimation(bool flag)
{
if (flag)
{
waitAnimationWidget->showWithPlay();
}
else
{
waitAnimationWidget->hideWithStop();
}
}
void VersionSelectWidget::setAuthor(QString name)
{
authorName = name;
}
void VersionSelectWidget::resizeEvent(QResizeEvent *event)
{
QSize size = event->size();
waitAnimationWidget->resize(size);
}
VersionSelectWidget::~VersionSelectWidget()
{
waitAnimationWidget->hideWithStop();
delete waitAnimationWidget;
delete ui;
}

View File

@@ -0,0 +1,77 @@
project(DataBaseInterface LANGUAGES CXX)
common_info_for_project(DataBaseInterface)
add_library(DataBaseInterface SHARED
DataBaseLMS_global.h
databaselms.cpp
databaselms_tasks.cpp
databaselms_groups.cpp
databaselms_users.cpp
databaselms_instructors.cpp
databaselms_trainees.cpp
databaselms_Postgresql.cpp
databaselms.h
interfacedatabaselms.cpp
interfacedatabaselms.h
basicentity.cpp
basicentity.h
user.cpp
user.h
instructor.cpp
instructor.h
trainee.cpp
trainee.h
group.cpp
group.h
computer.cpp
computer.h
classroom.cpp
classroom.h
tasksAmmFim.cpp
tasksAmmFim.h
typeQueryToDB.h
timingoftrainee.cpp
timingoftrainee.h
contactModel.h
hashtools.cpp
hashtools.h
DataBaseInterface.qrc
)
target_link_libraries(DataBaseInterface PRIVATE Qt5::Widgets)
target_link_libraries(DataBaseInterface PRIVATE Qt5::Sql)
target_link_libraries(DataBaseInterface PRIVATE Qt5::Xml)
target_compile_definitions(DataBaseInterface PRIVATE DATABASELMS_LIBRARY)
if(PROJECT_TYPE_DEBUG)
add_custom_command(TARGET DataBaseInterface
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${REPO_PATH}/BUILDS/Debug64/LibDataBaseInterface/libDataBaseInterface.dll
${REPO_PATH}/BUILDS/Debug64/ProgramServerMPS)
add_custom_command(TARGET DataBaseInterface
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${REPO_PATH}/BUILDS/Debug64/LibDataBaseInterface/libDataBaseInterface.dll
${REPO_PATH}/BUILDS/Debug64/ProgramAWSinstructorMPS)
else()
add_custom_command(TARGET DataBaseInterface
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${REPO_PATH}/BUILDS/Release64/LibDataBaseInterface/libDataBaseInterface.dll
${REPO_PATH}/BUILDS/Release64/ProgramServerMPS)
add_custom_command(TARGET DataBaseInterface
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
${REPO_PATH}/BUILDS/Release64/LibDataBaseInterface/libDataBaseInterface.dll
${REPO_PATH}/BUILDS/Release64/ProgramAWSinstructorMPS)
endif()

View File

@@ -1,5 +1,5 @@
<RCC> <RCC>
<qresource prefix="/"> <qresource prefix="/">
<file>resources/lms.png</file> <file>resources/blankXML/ErrorDB.xml</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@@ -0,0 +1,238 @@
#include "databaselms.h"
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlDriver>
#include <QDomDocument>
#include <QProcess>
const QString DataBaseLMS::TypeUserDBInstructor = "instructor";
const QString DataBaseLMS::TypeUserDBTrainee = "trainee";
DataBaseLMS::DataBaseLMS(QWidget *ownerWidget, QObject *parent):
QObject(parent),
db(nullptr),
UserNamePostgres(""),
PasswordPostgres(""),
ownerWidget(ownerWidget)
{
}
DataBaseLMS::~DataBaseLMS()
{
deleteConnection();
}
void DataBaseLMS::slot_LanguageChanged(QString language)
{
qtLanguageTranslator.load(QString(QStringLiteral("translations/DataBaseLMS_")) + language, QStringLiteral("."));
QCoreApplication::installTranslator(&qtLanguageTranslator);
}
bool DataBaseLMS::createConnection()
{
dbSettings = getDataBaseSettings();
dbSettings.connectionName = "Connection_" + dbSettings.dbName;
db = new QSqlDatabase(QSqlDatabase::addDatabase(dbSettings.dbType, dbSettings.connectionName));
db->setDatabaseName(dbSettings.dbName);
db->setUserName(dbSettings.dbUserName);
db->setPassword(dbSettings.dbPassword);
db->setHostName(dbSettings.dbHostName);
db->setPort(dbSettings.dbPort);
bool res = db->open();
if(!res)
{
deleteConnection();
return false;
}
else
{
bool flHas = db->driver()->hasFeature(QSqlDriver::Transactions);
qDebug() << "db->driver()->hasFeature(QSqlDriver::Transactions): " << flHas;
return true;
}
}
void DataBaseLMS::deleteConnection()
{
if(db != nullptr)
{
if(db->isOpen())
db->close();
delete db;
db = nullptr;
}
}
bool DataBaseLMS::isConnected()
{
if(db == nullptr)
{
return false;
}
else
{
if(db->isOpen())
{
return true;
}
}
return false;
}
DataBaseSettings DataBaseLMS::getDataBaseSettings()
{
DataBaseSettings settings;
QFile file("config/settings.xml");
if(!file.open(QIODevice::ReadOnly))
return settings;
QXmlStreamReader xmlReader(&file);
while (!xmlReader.atEnd()){
if(xmlReader.isStartElement()){
if(xmlReader.name() == "DataBaseSettings")
{
foreach(const QXmlStreamAttribute &attr, xmlReader.attributes())
{
QString name = attr.name().toString();
QString value = attr.value().toString();
if(name == "Type"){
settings.dbType = value;
}
if(name == "Name"){
settings.dbName = value;
}
if(name == "UserName"){
settings.dbUserName = value;
}
if(name == "Password"){
settings.dbPassword = value;
}
if(name == "HostName"){
settings.dbHostName = value;
}
if(name == "Port"){
settings.dbPort = value.toInt();
}
}
}
}
xmlReader.readNext();
}
file.close();
return settings;
}
int DataBaseLMS::queryExecInt(QString queryStr)
{
QSqlQuery query = QSqlQuery(*db);
if(queryExec(queryStr, &query))
{
if(query.first())
return query.value(0).toInt();
}
return 0;
}
QString DataBaseLMS::queryExecString(QString queryStr)
{
QSqlQuery query = QSqlQuery(*db);
if(queryExec(queryStr, &query))
{
if(query.first())
return query.value(0).toString();
}
return QStringLiteral("");
}
bool DataBaseLMS::queryExecBool(QString queryStr)
{
QSqlQuery query = QSqlQuery(*db);
if(queryExec(queryStr, &query))
{
if(query.first())
return query.value(0).toBool();
}
return false;
}
bool DataBaseLMS::queryExec(QString queryStr, QSqlQuery *query)
{
bool res = false;
if(! (res = query->exec(queryStr)) )
messageWarningErrorQuery(queryStr, query);
return res;
}
void DataBaseLMS::messageWarningErrorQuery(QString queryStr, QSqlQuery* query)
{
//Запись в файл ошибок БД
QDomDocument commonDOM;
QFile blankFile(":/resources/blankXML/ErrorDB.xml");
if (! blankFile.open(QFile::ReadOnly | QFile::Text))
qDebug() << QString("messageWarningErrorQuery: Couldn't read the file: ") + ":/resources/blankXML/ErrorDB.xml";
else
{
commonDOM.setContent(blankFile.readAll());
blankFile.close();
QDomNode errorDBNode = commonDOM.namedItem("ErrorDB");
QDomNode errorQueryNode = commonDOM.createElement("ErrorQuery");
errorDBNode.appendChild(errorQueryNode);
errorQueryNode.toElement().setAttribute("text", query->lastError().text());
QDomNode stringOfQueryNode = commonDOM.createElement("StringOfQuery");
errorDBNode.appendChild(stringOfQueryNode);
stringOfQueryNode.toElement().setAttribute("text", queryStr);
QDomNode executedQueryNode = commonDOM.createElement("ExecutedQuery");
errorDBNode.appendChild(executedQueryNode);
executedQueryNode.toElement().setAttribute("text", query->executedQuery());
QFile xmlOutFile("ErrorDB.xml");
if (!xmlOutFile.open(QFile::WriteOnly | QFile::Text))
qDebug() << QString("messageWarningErrorQuery: Failed to write a file: ") + "ErrorDB.xml";
else
{
QTextStream outFile(&xmlOutFile);
commonDOM.save(outFile, 4);
xmlOutFile.close();
}
}
//Сообщение об ошибке
QString textError = "";
textError = "Error query:\n" + query->lastError().text() + "\n" +
"String of query:\n" + queryStr + "\n" +
"Executed query:\n" + query->executedQuery();
emit signal_ErrorPostgreSQL(textError);
}

View File

@@ -3,6 +3,8 @@
#include <QSqlDatabase> #include <QSqlDatabase>
#include <QMutex> #include <QMutex>
#include <QWidget>
#include <QTranslator>
#include "instructor.h" #include "instructor.h"
#include "trainee.h" #include "trainee.h"
@@ -10,62 +12,97 @@
#include "tasksAmmFim.h" #include "tasksAmmFim.h"
#include "timingoftrainee.h" #include "timingoftrainee.h"
class DataBaseSettings static const QString backupEmptyName = ".\\restoreDB\\DBLMS_EMPTY.backup";
static const QString restoreDBscriptName = "restoreDBscript.bat";
class DATABASELMS_EXPORT DataBaseSettings
{ {
public: public:
QString dbName = "DataBaseLMS"; QString dbName = "";
QString dbType = "QPSQL"; QString dbType = "";
QString connectionName = "Connection"; QString connectionName = "";
QString dbUserName = "postgres"; QString dbUserName = "";
QString dbPassword = "12345678"; QString dbPassword = "";
QString dbHostName = ""; QString dbHostName = "";
int dbPort = 5432; int dbPort = 0;
}; };
class DataBaseLMS class DATABASELMS_EXPORT DataBaseLMS : public QObject
{ {
Q_OBJECT
public: public:
DataBaseLMS(); DataBaseLMS(QWidget *ownerWidget, QObject *parent = nullptr);
~DataBaseLMS(); ~DataBaseLMS();
public Q_SLOTS:
void slot_LanguageChanged(QString language);
signals:
void signal_ErrorPostgreSQL(QString text);
public:
static const QString TypeUserDBInstructor;
static const QString TypeUserDBTrainee;
public:
//PostgreSQL
bool setUserPasswordPostgres(QString userName, QString password);
bool checkDriverQPSQLavailable();
bool checkUserLMSexist();
bool checkDataBaseLMSexist();
bool createUser();
bool createDB();
bool prepareRestoreDBscript();
protected: protected:
//Подключение //Подключение
bool createConnection(); bool createConnection();
void deleteConnection(); void deleteConnection();
bool isConnected(); bool isConnected();
//Транзакции //Юзер
bool transactionBegin(); int selectUserID(QString type, QString login, QString password = QStringLiteral(""));
bool transactionEnd(); QString selectUserNameByLogin(QString type, QString login);
bool selectUserLoggedIn(QString type, int id_user);
//Списки bool selectUserArchived(QString type, int id_user);
QList<Instructor> selectAllInstructors(); int updateUserLoggedIn(QString type, int id_user, bool loggedIn);
QList<Trainee> selectAllTrainees(); bool updateAllUsersLoggedIn(QString type, bool loggedIn);
QList<Group> selectAllGroups(); int updateUserArchived(QString type, int id_user, bool archived);
//Инструктор //Инструктор
QList<Instructor> selectAllInstructors();
Instructor selectInstructor(int id_instructor); Instructor selectInstructor(int id_instructor);
int selectInstructorID(QString login, QString password = QStringLiteral(""));
QString selectInstructorNameByLogin(QString login);
bool selectInstructorIsAdmin(int id_instructor); bool selectInstructorIsAdmin(int id_instructor);
bool selectInstructorLoggedIn(int id_instructor);
bool selectInstructorArchived(int id_instructor);
int updateInstructorLoggedIn(int id_instructor, bool loggedIn);
bool updateAllInstructorsLoggedIn(bool loggedIn);
int updateInstructorArchived(int id_instructor, bool archived);
int insertInstructor(); int insertInstructor();
int insertInstructor(Instructor instructor); int insertInstructor(Instructor instructor);
int deleteInstructor(int id_instructor); int deleteInstructor(int id_instructor);
int updateInstructor(Instructor instructor); int updateInstructor(Instructor instructor);
//Группа //Группа
QList<Group> selectAllGroups();
Group selectGroup(int id_group); Group selectGroup(int id_group);
int insertGroup(); int insertGroup();
int insertGroup(Group group); int insertGroup(Group group);
int deleteGroup(int id_group); int deleteGroup(int id_group);
int updateGroup(Group group); int updateGroup(Group group);
//Обучаемый
QList<Trainee> selectAllTrainees();
Trainee selectTrainee(int id_trainee);
QList<Trainee> selectAllTraineesInGroup(int id_group);
QString selectTraineeNameOnComputer(QString computer_name);
Trainee selectTraineeOnComputer(QString computer_name);
int insertTrainee(int id_group);
int insertTrainee(Trainee trainee);
int deleteTrainee(int id_trainee);
int updateTrainee(Trainee trainee);
//Тайминг
int insertTimingTrainee(int id_trainee);
int updateTimingTrainee(int id_trainee, TimingOfTrainee timing);
TimingOfTrainee selectTimingTrainee(int id_trainee);
//Задача AMM //Задача AMM
int insertTaskAMM(TaskAmmFim task, int id_trainee); int insertTaskAMM(TaskAmmFim task, int id_trainee);
int updateTaskAMM(TaskAmmFim task); int updateTaskAMM(TaskAmmFim task);
@@ -80,35 +117,13 @@ protected:
int deleteTaskFIM(int id_task); int deleteTaskFIM(int id_task);
QList<TaskAmmFim> selectTasksFIMofTrainee(int id_trainee); QList<TaskAmmFim> selectTasksFIMofTrainee(int id_trainee);
TaskAmmFim selectTaskFIMbyID(int id_task); TaskAmmFim selectTaskFIMbyID(int id_task);
//int deleteReportFIMforTask(int task_id);
//int insertReportFIMforTask(TaskAmmFim task);
int updateReportFIMforTask(TaskAmmFim task);
int deleteReportFIM(int task_id); public:
int insertReportFIM(TaskAmmFim task);
//Обучаемый
Trainee selectTrainee(int id_trainee);
QList<Trainee> selectAllTraineesInGroup(int id_group);
int selectTraineeID(QString login, QString password = QStringLiteral(""));
QString selectTraineeNameByLogin(QString login);
QString selectTraineeNameOnComputer(QString computer_name);
Trainee selectTraineeOnComputer(QString computer_name);
bool selectTraineeArchived(int id_trainee);
bool selectTraineeLoggedIn(int id_trainee);
int updateTraineeLoggedIn(int id_trainee, bool loggedIn);
bool updateAllTraineesLoggedIn(bool loggedIn);
int updateTraineeArchived(int id_trainee, bool archived);
int insertTrainee(int id_group);
int insertTrainee(Trainee trainee);
int deleteTrainee(int id_trainee);
int updateTrainee(Trainee trainee);
//Тайминг
int insertTimingTrainee(int id_trainee);
int updateTimingTrainee(int id_trainee, TimingOfTrainee timing);
TimingOfTrainee selectTimingTrainee(int id_trainee);
private:
DataBaseSettings getDataBaseSettings(); DataBaseSettings getDataBaseSettings();
private:
int queryExecInt(QString queryStr); int queryExecInt(QString queryStr);
QString queryExecString(QString queryStr); QString queryExecString(QString queryStr);
bool queryExecBool(QString queryStr); bool queryExecBool(QString queryStr);
@@ -119,9 +134,13 @@ protected:
QSqlDatabase* db; QSqlDatabase* db;
DataBaseSettings dbSettings; DataBaseSettings dbSettings;
QString UserNamePostgres;
QString PasswordPostgres;
QTranslator qtLanguageTranslator;
private: private:
bool transactionBegined; QWidget* ownerWidget;
QMutex mtxAccess;
}; };
#endif // DATABASELMS_H #endif // DATABASELMS_H

View File

@@ -0,0 +1,255 @@
#include "databaselms.h"
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlDriver>
#include <QDomDocument>
#include <QProcess>
bool DataBaseLMS::setUserPasswordPostgres(QString userName, QString password)
{
DataBaseSettings settings = getDataBaseSettings();
QSqlDatabase dbCheck = QSqlDatabase::addDatabase("QPSQL");
dbCheck.setUserName(userName);
dbCheck.setPassword(password);
dbCheck.setHostName(settings.dbHostName);
dbCheck.setPort(settings.dbPort);
if (dbCheck.open())
{
UserNamePostgres = userName;
PasswordPostgres = password;
dbCheck.close();
return true;
}
else
{
qDebug() << "PostgreSQL connection error.";
return false;
}
}
bool DataBaseLMS::checkDriverQPSQLavailable()
{
return QSqlDatabase::isDriverAvailable("QPSQL");
}
bool DataBaseLMS::checkUserLMSexist()
{
DataBaseSettings settings = getDataBaseSettings();
QSqlDatabase dbCheck = QSqlDatabase::addDatabase("QPSQL");
dbCheck.setUserName(UserNamePostgres);
dbCheck.setPassword(PasswordPostgres);
dbCheck.setHostName(settings.dbHostName);
dbCheck.setPort(settings.dbPort);
if (dbCheck.open())
{
QSqlQuery query = QSqlQuery(dbCheck);
query.prepare("SELECT 1 FROM pg_roles WHERE rolname = :username");
query.bindValue(":username", settings.dbUserName);
if (query.exec() && query.next())
{
qDebug() << "The user exists.";
return true;
}
else
{
qDebug() << "The user does not exist.";
return false;
}
}
else
{
qDebug() << "PostgreSQL connection error.";
return false;
}
}
bool DataBaseLMS::checkDataBaseLMSexist()
{
DataBaseSettings settings = getDataBaseSettings();
QSqlDatabase dbCheck = QSqlDatabase::addDatabase("QPSQL");
bool flDBexist = false;
dbCheck.setUserName(UserNamePostgres);
dbCheck.setPassword(PasswordPostgres);
dbCheck.setHostName(settings.dbHostName);
dbCheck.setPort(settings.dbPort);
if (dbCheck.open())
{
QString queryStr = QString("SELECT datname FROM pg_database");
QSqlQuery query = QSqlQuery(dbCheck);
if(queryExec(queryStr, &query))
{
while (query.next())
{
QString nameDB = "";
nameDB = query.value(0).toString();
if(nameDB == dbSettings.dbName)
{
flDBexist = true;
break;
}
}
}
}
else
{
qDebug() << "PostgreSQL connection error.";
return false;
}
return flDBexist;
}
bool DataBaseLMS::createUser()
{
DataBaseSettings settings = getDataBaseSettings();
QSqlDatabase dbCheck = QSqlDatabase::addDatabase("QPSQL");
dbCheck.setUserName(UserNamePostgres);
dbCheck.setPassword(PasswordPostgres);
dbCheck.setHostName(settings.dbHostName);
dbCheck.setPort(settings.dbPort);
if (dbCheck.open())
{
QString queryStr = QString("CREATE USER %1 WITH ENCRYPTED PASSWORD '%2'").arg(settings.dbUserName, settings.dbPassword);
QSqlQuery query = QSqlQuery(dbCheck);
if(queryExec(queryStr, &query))
{
qDebug() << "User created.";
return true;
}
else
{
qDebug() << "User not created.";
return false;
}
}
else
{
qDebug() << "PostgreSQL connection error.";
return false;
}
}
bool DataBaseLMS::createDB()
{
DataBaseSettings settings = getDataBaseSettings();
QSqlDatabase dbCheck = QSqlDatabase::addDatabase("QPSQL");
dbCheck.setUserName(UserNamePostgres);
dbCheck.setPassword(PasswordPostgres);
dbCheck.setHostName(settings.dbHostName);
dbCheck.setPort(settings.dbPort);
if (dbCheck.open())
{
//Создание БД
QString queryStr = QString("CREATE DATABASE %1").arg(settings.dbName);
QSqlQuery query = QSqlQuery(dbCheck);
if(queryExec(queryStr, &query))
{
qDebug() << "The database has been created.";
//Залитие БД
if(prepareRestoreDBscript())
{
QProcess process;
QString pgRestorePath = restoreDBscriptName;
process.start("cmd /C " + pgRestorePath);
process.waitForFinished(-1); // Ждать бесконечно, пока процесс не завершится
}
//Назначение владельца
QString queryStr = QString("ALTER DATABASE %1 OWNER TO %2").arg(settings.dbName, settings.dbUserName);
QSqlQuery query = QSqlQuery(dbCheck);
if(queryExec(queryStr, &query))
{
qDebug() << "The owner of database has been changed.";
}
else
return false;
}
else
{
qDebug() << "The database was not created..";
return false;
}
}
else
{
qDebug() << "PostgreSQL connection error.";
return false;
}
dbCheck.close();
QSqlDatabase dbCheck2 = QSqlDatabase::addDatabase("QPSQL");
dbCheck2.setUserName(UserNamePostgres);
dbCheck2.setPassword(PasswordPostgres);
dbCheck2.setHostName(settings.dbHostName);
dbCheck2.setPort(settings.dbPort);
dbCheck2.setDatabaseName(settings.dbName);
if (dbCheck2.open())
{
QString newOwner = settings.dbUserName;
// Получаем список таблиц
QSqlQuery query(dbCheck2);
query.exec("SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = 'public';");
while (query.next())
{
QString tableName = query.value(0).toString();
QString alterQueryStr = QString("ALTER TABLE %1 OWNER TO %2;").arg(tableName).arg(newOwner);
QSqlQuery alterQuery(dbCheck2);
//dbCheck2.exec(alterQueryStr);
if(!queryExec(alterQueryStr, &alterQuery))
{
qDebug() << "Error changing owner for table " << tableName << ":" << dbCheck2.lastError().text();
return false;
}
}
}
return true;
}
bool DataBaseLMS::prepareRestoreDBscript()
{
DataBaseSettings settings = getDataBaseSettings();
QFile file(restoreDBscriptName);
if (file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QTextStream out(&file);
out << "set CURRENT_DIR=%~dp0\n";
out << "cd %CURRENT_DIR%\n";
out << QString("set \"PGPASSWORD=%1\"\n").arg(PasswordPostgres);
out << QString("pg_restore -U %1 -h %2 -p %3 -d %4 %5\n").arg(UserNamePostgres,
settings.dbHostName,
QString::number(settings.dbPort),
settings.dbName,
backupEmptyName);
file.close();
return true;
}
else
return false;
}

View File

@@ -0,0 +1,94 @@
#include "databaselms.h"
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlDriver>
QList<Group> DataBaseLMS::selectAllGroups()
{
QList<Group> listGroups;
QString queryStr = QString("SELECT group_id, name "
"FROM public.groups "
"ORDER BY group_id ASC");
QSqlQuery query = QSqlQuery(*db);
if(queryExec(queryStr, &query))
{
while (query.next())
{//Группа
Group group;
group.setID(query.value(0).toInt());
group.setName(query.value(1).toString());
listGroups.append(group);
}
}
return listGroups;
}
Group DataBaseLMS::selectGroup(int id_group)
{
Group group;
QString queryStr = QString("SELECT group_id, name "
"FROM public.groups "
"WHERE groups.group_id = %1 ").arg(
id_group);
QSqlQuery query = QSqlQuery(*db);
if(queryExec(queryStr, &query))
{
if (query.first())
{//Инструктор
group.setID(query.value(0).toInt());
group.setName(query.value(1).toString());
}
}
return group;
}
int DataBaseLMS::insertGroup()
{
QString queryStr = QString("INSERT INTO public.groups "
"DEFAULT VALUES "
"RETURNING group_id");
return queryExecInt(queryStr);
}
int DataBaseLMS::insertGroup(Group group)
{
QString queryStr = QString("INSERT INTO public.groups (name) "
"VALUES ('%1') "
"RETURNING groups.group_id").arg(
group.getName());
return queryExecInt(queryStr);
}
int DataBaseLMS::deleteGroup(int id_group)
{
QString queryStr = QString("DELETE FROM public.groups "
"WHERE group_id = %1 "
"RETURNING groups.group_id").arg(
QString::number(id_group));
return queryExecInt(queryStr);
}
int DataBaseLMS::updateGroup(Group group)
{
QString queryStr = QString("UPDATE public.groups SET name = '%1' "
"WHERE group_id = %2 "
"RETURNING groups.group_id").arg(
group.getName(),
QString::number(group.getID()) );
return queryExecInt(queryStr);
}

View File

@@ -0,0 +1,133 @@
#include "databaselms.h"
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlDriver>
QList<Instructor> DataBaseLMS::selectAllInstructors()
{
QList<Instructor> listInstructors;
QString queryStr = QString("SELECT user_id, name, login, password, is_admin, archived, logged_in "
"FROM public.users "
"WHERE users.type = '%1' "
"ORDER BY user_id ASC").arg(
TypeUserDBInstructor);
QSqlQuery query = QSqlQuery(*db);
if(queryExec(queryStr, &query))
{
while (query.next())
{//Инструктор
Instructor instructor;
instructor.setID(query.value(0).toInt());
instructor.setName(query.value(1).toString());
instructor.setLogin(query.value(2).toString());
instructor.setPassword(query.value(3).toString());
instructor.setIsAdmin(query.value(4).toBool());
instructor.setArchived(query.value(5).toBool());
instructor.setLoggedIn(query.value(6).toBool());
listInstructors.append(instructor);
}
}
return listInstructors;
}
Instructor DataBaseLMS::selectInstructor(int id_instructor)
{
Instructor instructor;
QString queryStr = QString("SELECT user_id, name, login, password, is_admin, archived, logged_in "
"FROM public.users "
"WHERE users.user_id = %1 AND users.type = '%2' ").arg(
QString::number(id_instructor),
TypeUserDBInstructor);
QSqlQuery query = QSqlQuery(*db);
if(queryExec(queryStr, &query))
{
if (query.first())
{//Инструктор
instructor.setID(query.value(0).toInt());
instructor.setName(query.value(1).toString());
instructor.setLogin(query.value(2).toString());
instructor.setPassword(query.value(3).toString());
instructor.setIsAdmin(query.value(4).toBool());
instructor.setArchived(query.value(5).toBool());
instructor.setLoggedIn(query.value(6).toBool());
}
}
return instructor;
}
bool DataBaseLMS::selectInstructorIsAdmin(int id_instructor)
{
QString queryStr = QString("SELECT users.is_admin "
"FROM public.users "
"WHERE user_id = %1 AND users.type = '%2' ").arg(
QString::number(id_instructor),
TypeUserDBInstructor );
return queryExecBool(queryStr);
}
int DataBaseLMS::insertInstructor()
{
QString queryStr = QString("INSERT INTO public.users (type, name, login, password, is_admin, archived, logged_in)"
"VALUES ('%1', DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT)"
"RETURNING user_id").arg(
TypeUserDBInstructor);
return queryExecInt(queryStr);
}
int DataBaseLMS::insertInstructor(Instructor instructor)
{
QString queryStr = QString("INSERT INTO public.users (type, name, login, password, is_admin, archived, logged_in) "
"VALUES ('%1', '%2', '%3', '%4', %5, %6, %7) "
"RETURNING user_id").arg(
TypeUserDBInstructor,
instructor.getName(),
instructor.getLogin(),
instructor.getPassword(),
instructor.getIsAdmin() ? "true" : "false",
instructor.getArchived() ? "true" : "false",
instructor.getLoggedIn() ? "true" : "false");
return queryExecInt(queryStr);
}
int DataBaseLMS::deleteInstructor(int id_instructor)
{
QString queryStr = QString("DELETE FROM public.users "
"WHERE user_id = %1 AND users.type = '%2' "
"RETURNING users.user_id").arg(
QString::number(id_instructor),
TypeUserDBInstructor);
return queryExecInt(queryStr);
}
int DataBaseLMS::updateInstructor(Instructor instructor)
{
QString queryStr = QString("UPDATE public.users "
"SET name = '%1', login = '%2', password = '%3', is_admin = %4, archived = %5, logged_in = %6 "
"WHERE user_id = %7 AND users.type = '%8' "
"RETURNING users.user_id").arg(
instructor.getName(),
instructor.getLogin(),
instructor.getPassword(),
instructor.getIsAdmin() ? "true" : "false",
instructor.getArchived() ? "true" : "false",
instructor.getLoggedIn() ? "true" : "false",
QString::number(instructor.getID()),
TypeUserDBInstructor);
return queryExecInt(queryStr);
}

View File

@@ -0,0 +1,988 @@
#include "databaselms.h"
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlDriver>
int DataBaseLMS::insertTaskAMM(TaskAmmFim task, int id_trainee)
{
QString queryStr;
bool resBool = false;
resBool = db->transaction();
task.ammProcedure.title = task.ammProcedure.title.replace("'", "''"); //Задваиваем одинарные кавычки
queryStr = QString("INSERT INTO public.tasks_amm (title, dm_code, fk_trainee_id) "
"VALUES ('%1', '%2', %3) "
"RETURNING tasks_amm.task_id").arg(
task.ammProcedure.title,
task.ammProcedure.dmCode,
QString::number(id_trainee));
int task_id = queryExecInt(queryStr);
if(!task_id)
{
resBool = db->rollback();
return 0;
}
for(SubProc subProc : task.listSubProc)
{
subProc.setTitle(subProc.getTitle().replace("'", "''")); //Задваиваем одинарные кавычки
queryStr = QString("INSERT INTO public.subprocs (dm_code, title, canplay, fk_task_amm_id) "
"VALUES ('%1', '%2', '%3', %4) "
"RETURNING subprocs.subproc_id").arg(
subProc.getDmCode(),
subProc.getTitle(),
subProc.getModeListStr(),
QString::number(task_id));
int subproc_id = queryExecInt(queryStr);
if(!subproc_id)
{
resBool = db->rollback();
return 0;
}
}
resBool = db->commit();
return task_id;
}
int DataBaseLMS::updateTaskAMM(TaskAmmFim task)
{
task.ammProcedure.title = task.ammProcedure.title.replace("'", "''"); //Задваиваем одинарные кавычки
QString queryStr = QString("UPDATE public.tasks_amm SET title = '%1', dm_code = '%2', status = '%3' "
"WHERE task_id = %4 "
"RETURNING tasks_amm.task_id").arg(
task.ammProcedure.title,
task.ammProcedure.dmCode,
task.status,
QString::number(task.getID()) );
return queryExecInt(queryStr);
}
int DataBaseLMS::updateStatusTaskAMM(int task_id, QString status)
{
QString queryStr;
bool resBool = false;
int id_trainee = 0;
resBool = db->transaction();
queryStr = QString("SELECT users.user_id "
"FROM public.users JOIN public.tasks_amm ON users.user_id = tasks_amm.fk_trainee_id "
"WHERE tasks_amm.task_id = %1 "
"ORDER BY users.user_id ASC").arg(
QString::number(task_id));
QSqlQuery query = QSqlQuery(*db);
if(queryExec(queryStr, &query))
{
if (query.first())
{//Обучаемый
id_trainee = query.value(0).toInt();
}
}
if(!id_trainee)
{
resBool = db->rollback();
return 0;
}
queryStr = QString("UPDATE public.tasks_amm SET status = '%1' "
"WHERE task_id = %2 "
"RETURNING tasks_amm.task_id").arg(
status,
QString::number(task_id) );
if(!queryExecInt(queryStr))
{
resBool = db->rollback();
return 0;
}
resBool = db->commit();
return id_trainee;
}
int DataBaseLMS::deleteTaskAMM(int id_task)
{
QString queryStr;
bool resBool = false;
int id_trainee = 0;
resBool = db->transaction();
queryStr = QString("SELECT users.user_id "
"FROM public.users JOIN public.tasks_amm ON users.user_id = tasks_amm.fk_trainee_id "
"WHERE tasks_amm.task_id = %1 "
"ORDER BY users.user_id ASC").arg(
QString::number(id_task));
QSqlQuery queryUserSEL = QSqlQuery(*db);
if(queryExec(queryStr, &queryUserSEL))
{
if (queryUserSEL.first())
{//Обучаемый
id_trainee = queryUserSEL.value(0).toInt();
}
}
if(!id_trainee)
{
resBool = db->rollback();
return 0;
}
queryStr = QString("DELETE FROM public.subprocs "
"WHERE fk_task_amm_id = %1 ").arg(
QString::number(id_task));
QSqlQuery querySubProcDEL = QSqlQuery(*db);
if(!queryExec(queryStr, &querySubProcDEL))
{
resBool = db->rollback();
return 0;
}
//--------------------
queryStr = QString("DELETE FROM public.tasks_amm "
"WHERE task_id = %1 "
"RETURNING tasks_amm.task_id").arg(
QString::number(id_task));
if(!queryExecInt(queryStr))
{
resBool = db->rollback();
return 0;
}
resBool = db->commit();
return id_trainee;
}
QList<TaskAmmFim> DataBaseLMS::selectTasksAMMofTrainee(int id_trainee)
{
QList<TaskAmmFim> listTasks;
QString queryStr;
bool resBool = false;
resBool = db->transaction();
queryStr = QString("SELECT tasks_amm.task_id, tasks_amm.title, tasks_amm.dm_code, tasks_amm.status, "
"users.user_id "
"FROM public.tasks_amm JOIN public.users ON users.user_id = tasks_amm.fk_trainee_id "
"WHERE tasks_amm.fk_trainee_id = %1 "
"ORDER BY tasks_amm.task_id ASC").arg(
id_trainee);
QSqlQuery query = QSqlQuery(*db);
if(queryExec(queryStr, &query))
{
while (query.next())
{//Задача
TaskAmmFim task;
task.setID(query.value(0).toInt());
task.ammProcedure.title = query.value(1).toString();
task.ammProcedure.dmCode = query.value(2).toString();
task.status = query.value(3).toString();
//Выгребаем все subproc для этой задачи
queryStr = QString("SELECT subprocs.subproc_id, subprocs.dm_code, subprocs.title, subprocs.canplay, "
"tasks_amm.task_id "
"FROM public.subprocs JOIN public.tasks_amm ON tasks_amm.task_id = subprocs.fk_task_amm_id "
"WHERE subprocs.fk_task_amm_id = %1 "
"ORDER BY subprocs.subproc_id ASC").arg(
task.getID());
QSqlQuery querySubProc = QSqlQuery(*db);
if(queryExec(queryStr, &querySubProc))
{
while (querySubProc.next())
{//Подпроцедура
SubProc subProc;
int subproc_id = 0;
subproc_id = querySubProc.value(0).toString().toInt();
subProc.setDmCode(querySubProc.value(1).toString());
subProc.setTitle(querySubProc.value(2).toString());
subProc.setModeListStr(querySubProc.value(3).toString());
task.listSubProc.append(subProc);
};
}
else
{
resBool = db->rollback();
return QList<TaskAmmFim>();
}
listTasks.append(task);
}
}
else
{
resBool = db->rollback();
return QList<TaskAmmFim>();
}
resBool = db->commit();
return listTasks;
}
TaskAmmFim DataBaseLMS::selectTaskAMMbyID(int id_task)
{
TaskAmmFim task;
QString queryStr;
bool resBool = false;
resBool = db->transaction();
queryStr = QString("SELECT tasks_amm.task_id, tasks_amm.title, tasks_amm.dm_code, tasks_amm.status "
"FROM public.tasks_amm "
"WHERE tasks_amm.task_id = %1 "
"ORDER BY tasks_amm.task_id ASC").arg(
id_task);
QSqlQuery query = QSqlQuery(*db);
if(queryExec(queryStr, &query))
{
if (query.first())
{//Задача
task.setID(query.value(0).toInt());
task.ammProcedure.title = query.value(1).toString();
task.ammProcedure.dmCode = query.value(2).toString();
task.status = query.value(3).toString();
//Выгребаем все subproc для этой задачи
queryStr = QString("SELECT subprocs.subproc_id, subprocs.dm_code, subprocs.title, subprocs.canplay, "
"tasks_amm.task_id "
"FROM public.subprocs JOIN public.tasks_amm ON tasks_amm.task_id = subprocs.fk_task_amm_id "
"WHERE subprocs.fk_task_amm_id = %1 "
"ORDER BY subprocs.subproc_id ASC").arg(
task.getID());
QSqlQuery querySubProc = QSqlQuery(*db);
if(queryExec(queryStr, &querySubProc))
{
while (querySubProc.next())
{//Подпроцедура
SubProc subProc;
int subproc_id = 0;
subproc_id = querySubProc.value(0).toString().toInt();
subProc.setDmCode(querySubProc.value(1).toString());
subProc.setTitle(querySubProc.value(2).toString());
subProc.setModeListStr(querySubProc.value(3).toString());
task.listSubProc.append(subProc);
};
}
else
{
resBool = db->rollback();
return TaskAmmFim();
}
}
}
else
{
resBool = db->rollback();
return TaskAmmFim();
}
resBool = db->commit();
return task;
}
int DataBaseLMS::insertTaskFIM(TaskAmmFim task, int id_trainee)
{
QString queryStr;
bool resBool = false;
resBool = db->transaction();
task.title = task.title.replace("'", "''"); //Задваиваем одинарные кавычки
queryStr = QString("INSERT INTO public.tasks_fim (title, fk_trainee_id) "
"VALUES ('%1', %2) "
"RETURNING tasks_fim.task_id").arg(
task.title,
QString::number(id_trainee));
int task_id = queryExecInt(queryStr);
if(!task_id)
{
resBool = db->rollback();
return 0;
}
for(Malfunction malfanction : task.malfunctionList)
{
malfanction.description = malfanction.description.replace("'", "''"); //Задваиваем одинарные кавычки
queryStr = QString("INSERT INTO public.malfunctions (num, dm_code, description, fk_task_fim_id) "
"VALUES ('%1', '%2', '%3', %4) "
"RETURNING malfunctions.malfunction_id").arg(
malfanction.num,
malfanction.dmCode,
malfanction.description,
QString::number(task_id));
int malfunction_id = queryExecInt(queryStr);
if(!malfunction_id)
{
resBool = db->rollback();
return 0;
}
//Sign
for(MalfunctionSign sign : malfanction.malfunctionSigns)
{
sign.description = sign.description.replace("'", "''"); //Задваиваем одинарные кавычки
queryStr = QString("INSERT INTO public.malf_signs (type, description, fk_malfunction_id) "
"VALUES ('%1', '%2', %3) "
"RETURNING malf_signs.sign_id").arg(
QString::number(sign.type),
sign.description,
QString::number(malfunction_id));
if(!queryExecInt(queryStr))
{
resBool = db->rollback();
return 0;
}
}
}
resBool = db->commit();
return task_id;
}
int DataBaseLMS::updateTaskFIM(TaskAmmFim task)
{
task.title = task.title.replace("'", "''"); //Задваиваем одинарные кавычки
QString queryStr = QString("UPDATE public.tasks_fim SET title = '%1', status = '%2' "
"WHERE task_id = %3 "
"RETURNING tasks_fim.task_id").arg(
task.title,
task.status,
QString::number(task.getID()) );
return queryExecInt(queryStr);
}
int DataBaseLMS::updateStatusTaskFIM(int task_id, QString status)
{
QString queryStr;
bool resBool = false;
int id_trainee = 0;
resBool = db->transaction();
queryStr = QString("SELECT users.user_id "
"FROM public.users JOIN public.tasks_fim ON users.user_id = tasks_fim.fk_trainee_id "
"WHERE tasks_fim.task_id = %1 "
"ORDER BY users.user_id ASC").arg(
QString::number(task_id));
QSqlQuery query = QSqlQuery(*db);
if(queryExec(queryStr, &query))
{
if (query.first())
{//Обучаемый
id_trainee = query.value(0).toInt();
}
}
if(!id_trainee)
{
resBool = db->rollback();
return 0;
}
queryStr = QString("UPDATE public.tasks_fim SET status = '%1' "
"WHERE task_id = %2 "
"RETURNING tasks_fim.task_id").arg(
status,
QString::number(task_id) );
QSqlQuery query1 = QSqlQuery(*db);
if(!queryExec(queryStr, &query1))
{
resBool = db->rollback();
return 0;
}
resBool = db->commit();
return id_trainee;
}
int DataBaseLMS::deleteTaskFIM(int id_task)
{
QString queryStr;
bool resBool = false;
int id_trainee = 0;
resBool = db->transaction();
queryStr = QString("SELECT users.user_id "
"FROM public.users JOIN public.tasks_fim ON users.user_id = tasks_fim.fk_trainee_id "
"WHERE tasks_fim.task_id = %1 "
"ORDER BY users.user_id ASC").arg(
QString::number(id_task));
QSqlQuery queryUserSEL = QSqlQuery(*db);
if(queryExec(queryStr, &queryUserSEL))
{
if (queryUserSEL.first())
{//Обучаемый
id_trainee = queryUserSEL.value(0).toInt();
}
}
if(!id_trainee)
{
resBool = db->rollback();
return 0;
}
//Выгребаем все malfunction для этой задачи
queryStr = QString("SELECT malfunctions.malfunction_id "
"FROM public.malfunctions JOIN public.tasks_fim ON tasks_fim.task_id = malfunctions.fk_task_fim_id "
"WHERE malfunctions.fk_task_fim_id = %1 "
"ORDER BY malfunctions.malfunction_id ASC").arg(
id_task);
QSqlQuery queryMalfSEL = QSqlQuery(*db);
if(queryExec(queryStr, &queryMalfSEL))
{
while (queryMalfSEL.next())
{//Неисправность
int malfunction_id = 0;
malfunction_id = queryMalfSEL.value(0).toString().toInt();
if(malfunction_id)
{
queryStr = QString("DELETE FROM public.malf_signs "
"WHERE fk_malfunction_id = %1 ").arg(
malfunction_id);
QSqlQuery querySignDEL = QSqlQuery(*db);
if(!queryExec(queryStr, &querySignDEL))
{
resBool = db->rollback();
return 0;
}
}
};
}
else
{
resBool = db->rollback();
return 0;
}
queryStr = QString("DELETE FROM public.malfunctions "
"WHERE fk_task_fim_id = %1 ").arg(
QString::number(id_task));
QSqlQuery queryMulfDEL = QSqlQuery(*db);
if(!queryExec(queryStr, &queryMulfDEL))
{
resBool = db->rollback();
return 0;
}
queryStr = QString("SELECT reports.report_id "
"FROM public.reports "
"WHERE fk_task_fim_id = %1 "
"ORDER BY reports.report_id ASC").arg(
QString::number(id_task));
int report_id = 0;
QSqlQuery queryReportsSEL = QSqlQuery(*db);
if(queryExec(queryStr, &queryReportsSEL))
{
if (queryReportsSEL.first())
{//Отчет
report_id = queryReportsSEL.value(0).toInt();
}
}
else
{
resBool = db->rollback();
return 0;
}
queryStr = QString("DELETE FROM public.report_items "
"WHERE fk_report_id = %1 ").arg(
QString::number(report_id));
QSqlQuery queryItemsDEL = QSqlQuery(*db);
if(!queryExec(queryStr, &queryItemsDEL))
{
resBool = db->rollback();
return 0;
}
queryStr = QString("DELETE FROM public.reports "
"WHERE report_id = %1 ").arg(
QString::number(report_id));
QSqlQuery queryReportsDEL = QSqlQuery(*db);
if(!queryExec(queryStr, &queryReportsDEL))
{
resBool = db->rollback();
return 0;
}
queryStr = QString("DELETE FROM public.tasks_fim "
"WHERE task_id = %1 "
"RETURNING tasks_fim.task_id").arg(
QString::number(id_task));
if(!queryExecInt(queryStr))
{
resBool = db->rollback();
return 0;
}
resBool = db->commit();
return id_trainee;
}
QList<TaskAmmFim> DataBaseLMS::selectTasksFIMofTrainee(int id_trainee)
{
QList<TaskAmmFim> listTasks;
QString queryStr;
bool resBool = false;
resBool = db->transaction();
queryStr = QString("SELECT tasks_fim.task_id, tasks_fim.title, tasks_fim.status, "
"users.user_id "
"FROM public.tasks_fim JOIN public.users ON users.user_id = tasks_fim.fk_trainee_id "
"WHERE tasks_fim.fk_trainee_id = %1 "
"ORDER BY tasks_fim.task_id ASC").arg(
id_trainee);
QSqlQuery query = QSqlQuery(*db);
if(queryExec(queryStr, &query))
{
while (query.next())
{//Задача
TaskAmmFim task;
task.setID(query.value(0).toInt());
task.title = query.value(1).toString();
task.status = query.value(2).toString();
//Выгребаем все malfunction для этой задачи
queryStr = QString("SELECT malfunctions.malfunction_id, malfunctions.num, malfunctions.dm_code, malfunctions.description, "
"tasks_fim.task_id "
"FROM public.malfunctions JOIN public.tasks_fim ON tasks_fim.task_id = malfunctions.fk_task_fim_id "
"WHERE malfunctions.fk_task_fim_id = %1 "
"ORDER BY malfunctions.num ASC").arg(
task.getID());
QSqlQuery queryMalf = QSqlQuery(*db);
if(queryExec(queryStr, &queryMalf))
{
while (queryMalf.next())
{//Неисправность
Malfunction malfanction;
int malfunction_id = 0;
malfunction_id = queryMalf.value(0).toString().toInt();
malfanction.num = queryMalf.value(1).toString();
malfanction.dmCode = queryMalf.value(2).toString();
malfanction.description = queryMalf.value(3).toString();
//Выгребаем сигналы для этой неисправности
queryStr = QString("SELECT malf_signs.sign_id, malf_signs.type, malf_signs.description "
"FROM public.malf_signs "
"WHERE fk_malfunction_id = %1 "
"ORDER BY malf_signs.sign_id ASC").arg(
QString::number(malfunction_id));
QSqlQuery querySign = QSqlQuery(*db);
if(queryExec(queryStr, &querySign))
{
while (querySign.next())
{//Сигналы
MalfunctionSign sign;
sign.type = querySign.value(1).toString().toInt();
sign.description = querySign.value(2).toString();
malfanction.malfunctionSigns.append(sign);
};
}
else
{
resBool = db->rollback();
return QList<TaskAmmFim>();
}
task.addMalfunction(malfanction);
};
}
else
{
resBool = db->rollback();
return QList<TaskAmmFim>();
}
//Выгребаем отчет для этой задачи
int report_id = 0;
queryStr = QString("SELECT reports.report_id "
"FROM public.reports "
"WHERE fk_task_fim_id = %1 "
"ORDER BY reports.report_id ASC").arg(
QString::number(task.getID()));
QSqlQuery queryReport = QSqlQuery(*db);
if(queryExec(queryStr, &queryReport))
{
if (queryReport.first())
{//Отчет
report_id = queryReport.value(0).toInt();
task.report.id = report_id;
}
}
else
{
resBool = db->rollback();
return QList<TaskAmmFim>();
}
if(report_id)
{//Отчет есть
//Выгребаем все item отчета
queryStr = QString("SELECT report_items.item_id, report_items.text, report_items.doc, report_items.dm_code, report_items.title, report_items.result, report_items.fk_report_id, report_items.number "
"FROM public.report_items "
"WHERE fk_report_id = %1 "
"ORDER BY report_items.number ASC").arg(
QString::number(report_id));
QSqlQuery queryItems = QSqlQuery(*db);
if(queryExec(queryStr, &queryItems))
{
while (queryItems.next())
{//report_item
FIMReportItem reportItem;
reportItem.id = queryItems.value(0).toInt();
reportItem.text = queryItems.value(1).toString();
reportItem.procedure.doc = queryItems.value(2).toString();
reportItem.procedure.dmCode = queryItems.value(3).toString();
reportItem.procedure.title = queryItems.value(4).toString();
reportItem.procedure.result = queryItems.value(5).toString();
//item_report
//number
task.report.itemList.append(reportItem);
}
}
else
{
resBool = db->rollback();
return QList<TaskAmmFim>();
}
}
listTasks.append(task);
};
}
else
{
resBool = db->rollback();
return QList<TaskAmmFim>();
}
resBool = db->commit();
return listTasks;
}
TaskAmmFim DataBaseLMS::selectTaskFIMbyID(int id_task)
{
TaskAmmFim task;
QString queryStr;
bool resBool = false;
resBool = db->transaction();
queryStr = QString("SELECT tasks_fim.task_id, tasks_fim.title, tasks_fim.status "
"FROM public.tasks_fim "
"WHERE tasks_fim.task_id = %1 "
"ORDER BY tasks_fim.task_id ASC").arg(
id_task);
QSqlQuery query = QSqlQuery(*db);
if(queryExec(queryStr, &query))
{
if(query.first())
{//Задача
task.setID(query.value(0).toInt());
task.title = query.value(1).toString();
task.status = query.value(2).toString();
//Выгребаем все malfunction для этой задачи
queryStr = QString("SELECT malfunctions.malfunction_id, malfunctions.num, malfunctions.dm_code, malfunctions.description, "
"tasks_fim.task_id "
"FROM public.malfunctions JOIN public.tasks_fim ON tasks_fim.task_id = malfunctions.fk_task_fim_id "
"WHERE malfunctions.fk_task_fim_id = %1 "
"ORDER BY malfunctions.num ASC").arg(
task.getID());
QSqlQuery queryMalf = QSqlQuery(*db);
if(queryExec(queryStr, &queryMalf))
{
while (queryMalf.next())
{//Неисправность
Malfunction malfanction;
int malfunction_id = 0;
malfunction_id = queryMalf.value(0).toString().toInt();
malfanction.num = queryMalf.value(1).toString();
malfanction.dmCode = queryMalf.value(2).toString();
malfanction.description = queryMalf.value(3).toString();
//Выгребаем сигналы для этой неисправности
queryStr = QString("SELECT malf_signs.sign_id, malf_signs.type, malf_signs.description "
"FROM public.malf_signs "
"WHERE fk_malfunction_id = %1 "
"ORDER BY malf_signs.sign_id ASC").arg(
QString::number(malfunction_id));
QSqlQuery querySign = QSqlQuery(*db);
if(queryExec(queryStr, &querySign))
{
while (querySign.next())
{//Сигналы
MalfunctionSign sign;
sign.type = querySign.value(1).toString().toInt();
sign.description = querySign.value(2).toString();
malfanction.malfunctionSigns.append(sign);
};
}
else
{
resBool = db->rollback();
return TaskAmmFim();
}
task.addMalfunction(malfanction);
};
}
else
{
resBool = db->rollback();
return TaskAmmFim();
}
//Выгребаем отчет для этой задачи
int report_id = 0;
queryStr = QString("SELECT reports.report_id "
"FROM public.reports "
"WHERE fk_task_fim_id = %1 "
"ORDER BY reports.report_id ASC").arg(
QString::number(task.getID()));
QSqlQuery queryReport = QSqlQuery(*db);
if(queryExec(queryStr, &queryReport))
{
if (queryReport.first())
{//Отчет
report_id = queryReport.value(0).toInt();
task.report.id = report_id;
}
}
else
{
resBool = db->rollback();
return TaskAmmFim();
}
if(report_id)
{//Отчет есть
//Выгребаем все item отчета
queryStr = QString("SELECT report_items.item_id, report_items.text, report_items.doc, report_items.dm_code, report_items.title, report_items.result, report_items.fk_report_id, report_items.number "
"FROM public.report_items "
"WHERE fk_report_id = %1 "
"ORDER BY report_items.number ASC").arg(
QString::number(report_id));
QSqlQuery queryItems = QSqlQuery(*db);
if(queryExec(queryStr, &queryItems))
{
while (queryItems.next())
{//report_item
FIMReportItem reportItem;
reportItem.id = queryItems.value(0).toInt();
reportItem.text = queryItems.value(1).toString();
reportItem.procedure.doc = queryItems.value(2).toString();
reportItem.procedure.dmCode = queryItems.value(3).toString();
reportItem.procedure.title = queryItems.value(4).toString();
reportItem.procedure.result = queryItems.value(5).toString();
//item_report
//number
task.report.itemList.append(reportItem);
}
}
else
{
resBool = db->rollback();
return TaskAmmFim();
}
}
};
}
else
{
resBool = db->rollback();
return TaskAmmFim();
}
resBool = db->commit();
return task;
}
int DataBaseLMS::updateReportFIMforTask(TaskAmmFim task)
{
QString queryStr;
bool resBool = false;
int report_id = 0;
int task_id = task.getID();
resBool = db->transaction();
queryStr = QString("SELECT reports.report_id "
"FROM public.reports "
"WHERE fk_task_fim_id = %1 "
"ORDER BY reports.report_id ASC").arg(
QString::number(task_id));
QSqlQuery queryReportsSEL = QSqlQuery(*db);
if(queryExec(queryStr, &queryReportsSEL))
{
if (queryReportsSEL.first())
{//Отчет
report_id = queryReportsSEL.value(0).toInt();
}
}
else
{
resBool = db->rollback();
return 0;
}
if(!report_id)
{
queryStr = QString("INSERT INTO public.reports (fk_task_fim_id) "
"VALUES (%1) "
"RETURNING reports.report_id").arg(
task.getID());
report_id = queryExecInt(queryStr);
if(!report_id)
{
resBool = db->rollback();
return 0;
}
}
else
{
queryStr = QString("DELETE FROM public.report_items "
"WHERE fk_report_id = %1 ").arg(
QString::number(report_id));
QSqlQuery queryItemsDEL = QSqlQuery(*db);
if(!queryExec(queryStr, &queryItemsDEL))
{
resBool = db->rollback();
return 0;
}
}
int number = 0;
for(FIMReportItem reportItem : task.report.itemList)
{
queryStr = QString("INSERT INTO public.report_items (text, doc, dm_code, title, result, fk_report_id, number) "
"VALUES ('%1', '%2', '%3', '%4', '%5', %6, %7) "
"RETURNING report_items.item_id").arg(
reportItem.text,
reportItem.procedure.doc,
reportItem.procedure.dmCode,
reportItem.procedure.title,
reportItem.procedure.result,
QString::number(report_id),
QString::number(++number));
if(!queryExecInt(queryStr))
{
resBool = db->rollback();
return 0;
}
}
queryStr = QString("UPDATE public.tasks_fim SET status = '%1' "
"WHERE task_id = %2 ").arg(
"checkup",
QString::number(task_id) );
QSqlQuery queryTaskUPD = QSqlQuery(*db);
if(!queryExec(queryStr, &queryTaskUPD))
{
resBool = db->rollback();
return 0;
}
resBool = db->commit();
return report_id;
}

View File

@@ -0,0 +1,538 @@
#include "databaselms.h"
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlDriver>
QList<Trainee> DataBaseLMS::selectAllTrainees()
{
bool resBool = false;
QList<Trainee> listTrainees;
resBool = db->transaction();
QString queryStr = QString("SELECT users.user_id, users.name, users.login, users.password, users.archived, users.logged_in, "
"groups.group_id, groups.name, "
"computers.computer_id, computers.name, computers.ip_address, "
"classrooms.classroom_id, classrooms.name "
"FROM public.users JOIN public.groups ON groups.group_id = users.fk_group_id "
"LEFT OUTER JOIN public.computers ON computers.computer_id = users.fk_computer_id "
"LEFT OUTER JOIN public.classrooms ON classrooms.classroom_id = computers.fk_classroom_id "
"WHERE users.type = '%1' "
"ORDER BY groups.name, users.name ASC").arg(
TypeUserDBTrainee);
QSqlQuery query = QSqlQuery(*db);
if(queryExec(queryStr, &query))
{
while (query.next())
{//Обучаемый
Trainee trainee;
trainee.setID(query.value(0).toInt());
trainee.setName(query.value(1).toString());
trainee.setLogin(query.value(2).toString());
trainee.setPassword(query.value(3).toString());
trainee.setArchived(query.value(4).toBool());
trainee.setLoggedIn(query.value(5).toBool());
Group group = Group(query.value(6).toInt(), query.value(7).toString());
trainee.setGroup(group);
Classroom classroom = Classroom(query.value(11).toInt(), query.value(12).toString());
Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom);
trainee.setComputer(computer);
//Тайминг
TimingOfTrainee timing(trainee.getID());
QString queryStrSELtiming = QString("SELECT timings.timing_id, timings.entry_time, timings.exit_time, timings.operating_time, timings.fk_trainee_id "
"FROM public.timings "
"WHERE fk_trainee_id = '%1'").arg(trainee.getID());
QSqlQuery querySelTiming = QSqlQuery(*db);
if(queryExec(queryStrSELtiming, &querySelTiming))
{
if (querySelTiming.first())
{//Тайминг
timing.setID(querySelTiming.value(0).toInt());
timing.setEntryTime(querySelTiming.value(1).toDateTime());
timing.setExitTime(querySelTiming.value(2).toDateTime());
timing.setOperatingTime(querySelTiming.value(3).toTime());
timing.setTraineeID(querySelTiming.value(4).toInt());
}
trainee.setTiming(timing);
}
else
{
resBool = db->rollback();
return QList<Trainee>();
}
listTrainees.append(trainee);
}
}
else
{
resBool = db->rollback();
return QList<Trainee>();
}
resBool = db->commit();
return listTrainees;
}
Trainee DataBaseLMS::selectTrainee(int id_trainee)
{
Trainee trainee;
QString queryStr = QString("SELECT users.user_id, users.name, users.login, users.password, users.archived, users.logged_in, "
"groups.group_id, groups.name, "
"computers.computer_id, computers.name, computers.ip_address, "
"classrooms.classroom_id, classrooms.name "
"FROM public.users JOIN public.groups ON groups.group_id = users.fk_group_id "
"LEFT OUTER JOIN public.computers ON computers.computer_id = users.fk_computer_id "
"LEFT OUTER JOIN public.classrooms ON classrooms.classroom_id = computers.fk_classroom_id "
"WHERE users.user_id = %1 AND users.type = '%2' "
"ORDER BY groups.name, users.name ASC").arg(
QString::number(id_trainee),
TypeUserDBTrainee);
QSqlQuery query = QSqlQuery(*db);
if(queryExec(queryStr, &query))
{
if (query.first())
{//Обучаемый
trainee.setID(query.value(0).toInt());
trainee.setName(query.value(1).toString());
trainee.setLogin(query.value(2).toString());
trainee.setPassword(query.value(3).toString());
trainee.setArchived(query.value(4).toBool());
trainee.setLoggedIn(query.value(5).toBool());
Group group = Group(query.value(6).toInt(), query.value(7).toString());
trainee.setGroup(group);
Classroom classroom = Classroom(query.value(11).toInt(), query.value(12).toString());
Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom);
trainee.setComputer(computer);
}
}
return trainee;
}
QList<Trainee> DataBaseLMS::selectAllTraineesInGroup(int id_group)
{
QList<Trainee> listTrainees;
QString queryStr = QString("SELECT users.user_id, users.name, users.login, users.password, users.archived, users.logged_in, "
"groups.group_id, groups.name, "
"computers.computer_id, computers.name, computers.ip_address, "
"classrooms.classroom_id, classrooms.name "
"FROM public.users JOIN public.groups ON groups.group_id = users.fk_group_id "
"LEFT OUTER JOIN public.computers ON computers.computer_id = users.fk_computer_id "
"LEFT OUTER JOIN public.classrooms ON classrooms.classroom_id = computers.fk_classroom_id "
"WHERE users.fk_group_id = %1 AND users.type = '%2' "
"ORDER BY groups.name, users.name ASC").arg(
QString::number(id_group),
TypeUserDBTrainee);
QSqlQuery query = QSqlQuery(*db);
if(queryExec(queryStr, &query))
{
while (query.next())
{//Обучаемый
Trainee trainee;
trainee.setID(query.value(0).toInt());
trainee.setName(query.value(1).toString());
trainee.setLogin(query.value(2).toString());
trainee.setPassword(query.value(3).toString());
trainee.setArchived(query.value(4).toBool());
trainee.setLoggedIn(query.value(5).toBool());
Group group = Group(query.value(6).toInt(), query.value(7).toString());
trainee.setGroup(group);
Classroom classroom = Classroom(query.value(11).toInt(), query.value(12).toString());
Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom);
trainee.setComputer(computer);
listTrainees.append(trainee);
}
}
return listTrainees;
}
QString DataBaseLMS::selectTraineeNameOnComputer(QString computer_name)
{
QString queryStr = QString("SELECT users.name "
"FROM public.users JOIN public.computers ON computers.computer_id = users.fk_computer_id "
"WHERE computers.name = '%1' AND users.type = '%2' ").arg(
computer_name,
TypeUserDBTrainee);
return queryExecString(queryStr);
}
Trainee DataBaseLMS::selectTraineeOnComputer(QString computer_name)
{
Trainee trainee;
QString queryStr = QString("SELECT users.trainee_id, users.name, users.login, users.password, users.archived, users.logged_in, "
"groups.group_id, groups.name, "
"computers.computer_id, computers.name, computers.ip_address, "
"classrooms.classroom_id, classrooms.name "
"FROM public.users JOIN public.groups ON groups.group_id = users.fk_group_id "
"LEFT OUTER JOIN public.computers ON computers.computer_id = users.fk_computer_id "
"LEFT OUTER JOIN public.classrooms ON classrooms.classroom_id = computers.fk_classroom_id "
"WHERE computers.name = '%1' AND users.type = '%2' ").arg(
computer_name,
TypeUserDBTrainee);
QSqlQuery query = QSqlQuery(*db);
if(queryExec(queryStr, &query))
{
if (query.first())
{//Обучаемый
trainee.setID(query.value(0).toInt());
trainee.setName(query.value(1).toString());
trainee.setLogin(query.value(2).toString());
trainee.setPassword(query.value(3).toString());
trainee.setArchived(query.value(4).toBool());
trainee.setLoggedIn(query.value(5).toBool());
Group group = Group(query.value(6).toInt(), query.value(7).toString());
trainee.setGroup(group);
Classroom classroom = Classroom(query.value(11).toInt(), query.value(12).toString());
Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom);
trainee.setComputer(computer);
}
}
return trainee;
}
int DataBaseLMS::insertTrainee(int id_group)
{
QString queryStr = QString("INSERT INTO public.users (type, name, login, password, archived, logged_in, fk_group_id) "
"VALUES ('%1', DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, %2) "
"RETURNING users.user_id").arg(
TypeUserDBTrainee,
QString::number(id_group));
return queryExecInt(queryStr);
}
int DataBaseLMS::insertTrainee(Trainee trainee)
{
QString queryStr = QString("INSERT INTO public.users (type, name, login, password, archived, logged_in, fk_group_id) "
"VALUES ('%1', '%2', '%3', '%4', %5, %6, %7) "
"RETURNING users.user_id").arg(
TypeUserDBTrainee,
trainee.getName(),
trainee.getLogin(),
trainee.getPassword(),
trainee.getArchived() ? "true" : "false",
trainee.getLoggedIn() ? "true" : "false",
QString::number(trainee.getGroup().getID()));
return queryExecInt(queryStr);
}
int DataBaseLMS::deleteTrainee(int id_trainee)
{
QString queryStr;
int res = 0;
bool resBool = false;
resBool = db->transaction();
//Удаление задач AMM
/*Выборка задач AMM для этого обучаемого*/
queryStr = QString("SELECT tasks_amm.task_id "
"FROM public.tasks_amm "
"WHERE tasks_amm.fk_trainee_id = %1 "
"ORDER BY tasks_amm.task_id ASC").arg(
id_trainee);
QSqlQuery queryTasksAMMSEL = QSqlQuery(*db);
if(queryExec(queryStr, &queryTasksAMMSEL))
{
while (queryTasksAMMSEL.next())
{//Задача
int task_id = queryTasksAMMSEL.value(0).toInt();
queryStr = QString("DELETE FROM public.subprocs "
"WHERE fk_task_amm_id = %1 ").arg(
QString::number(task_id));
QSqlQuery querySubProcDEL = QSqlQuery(*db);
if(!queryExec(queryStr, &querySubProcDEL))
{
resBool = db->rollback();
return 0;
}
}
}
else
{
resBool = db->rollback();
return 0;
}
queryStr = QString("DELETE FROM public.tasks_amm "
"WHERE fk_trainee_id = %1 ").arg(
QString::number(id_trainee));
QSqlQuery queryTasksAMMDEL = QSqlQuery(*db);
if(!queryExec(queryStr, &queryTasksAMMDEL))
{
resBool = db->rollback();
return 0;
}
//Удаление задач FIM
/*Выборка задач FIM для этого обучаемого*/
queryStr = QString("SELECT tasks_fim.task_id "
"FROM public.tasks_fim "
"WHERE tasks_fim.fk_trainee_id = %1 "
"ORDER BY tasks_fim.task_id ASC").arg(
id_trainee);
QSqlQuery queryTasksFIMSEL = QSqlQuery(*db);
if(queryExec(queryStr, &queryTasksFIMSEL))
{
while (queryTasksFIMSEL.next())
{//Задача
int task_id = queryTasksFIMSEL.value(0).toInt();
/*Выборка неисправностей для этой задачи*/
queryStr = QString("SELECT malfunctions.malfunction_id "
"FROM public.malfunctions "
"WHERE malfunctions.fk_task_fim_id = %1 "
"ORDER BY malfunctions.malfunction_id ASC").arg(
task_id);
QSqlQuery queryMulfSEL = QSqlQuery(*db);
if(queryExec(queryStr, &queryMulfSEL))
{
while (queryMulfSEL.next())
{//Неисправность
int mulf_id = queryMulfSEL.value(0).toInt();
/*Удаление сигналов для этой неисправности*/
queryStr = QString("DELETE FROM public.malf_signs "
"WHERE malf_signs.fk_malfunction_id = %1 ").arg(
mulf_id);
QSqlQuery querySign = QSqlQuery(*db);
if(!queryExec(queryStr, &querySign))
{
resBool = db->rollback();
return 0;
}
};
}
else
{
resBool = db->rollback();
return 0;
}
/*Удаление неисправностей*/
queryStr = QString("DELETE FROM public.malfunctions "
"WHERE malfunctions.fk_task_fim_id = %1 ").arg(
task_id);
QSqlQuery queryMulfDEL = QSqlQuery(*db);
if(!queryExec(queryStr, &queryMulfDEL))
{
resBool = db->rollback();
return 0;
}
/*Удаление отчетов для задачи*/
/*Выборка отчетов для этой задачи*/
queryStr = QString("SELECT reports.report_id "
"FROM public.reports "
"WHERE reports.fk_task_fim_id = %1 "
"ORDER BY reports.report_id ASC").arg(
task_id);
QSqlQuery queryReportsSEL = QSqlQuery(*db);
if(queryExec(queryStr, &queryReportsSEL))
{
while (queryReportsSEL.next())
{//отчет
int report_id = queryReportsSEL.value(0).toInt();
/*Удаление items для этого отчета*/
queryStr = QString("DELETE FROM public.report_items "
"WHERE report_items.fk_report_id = %1 ").arg(
report_id);
QSqlQuery queryReportDEL = QSqlQuery(*db);
if(!queryExec(queryStr, &queryReportDEL))
{
resBool = db->rollback();
return 0;
}
};
}
else
{
resBool = db->rollback();
return 0;
}
/*Удаление отчетов*/
queryStr = QString("DELETE FROM public.reports "
"WHERE reports.fk_task_fim_id = %1 ").arg(
task_id);
QSqlQuery queryReportsDEL = QSqlQuery(*db);
if(!queryExec(queryStr, &queryReportsDEL))
{
resBool = db->rollback();
return 0;
}
// ////////////////////////////
};
}
else
{
resBool = db->rollback();
return 0;
}
/*Удаление непосредственно задач FIM*/
queryStr = QString("DELETE FROM public.tasks_fim "
"WHERE fk_trainee_id = %1 ").arg(
QString::number(id_trainee));
QSqlQuery queryTasksFIMDEL = QSqlQuery(*db);
if(!queryExec(queryStr, &queryTasksFIMDEL))
{
resBool = db->rollback();
return 0;
}
/*Удаление таймингов для обучаемого*/
queryStr = QString("DELETE FROM public.timings "
"WHERE fk_trainee_id = %1 ").arg(
QString::number(id_trainee));
QSqlQuery queryTimingsDEL = QSqlQuery(*db);
if(!queryExec(queryStr, &queryTimingsDEL))
{
resBool = db->rollback();
return 0;
}
// ////////////////////////////
//Удаление обучаемого
queryStr = QString("DELETE FROM public.users "
"WHERE user_id = %1 AND users.type = '%2' "
"RETURNING users.user_id").arg(
QString::number(id_trainee),
TypeUserDBTrainee);
res = queryExecInt(queryStr);
if(res)
{
resBool = db->commit();
return res;
}
else
{
resBool = db->rollback();
return 0;
}
}
int DataBaseLMS::updateTrainee(Trainee trainee)
{
QString computer_id = (trainee.getComputer().getID() == 0 ? QStringLiteral("null") : QString::number(trainee.getComputer().getID()));
QString queryStr = QString("UPDATE public.users "
"SET name = '%1', login = '%2', password = '%3', archived = %4, logged_in = %5, "
"fk_group_id = %6, "
"fk_computer_id = %7 "
"WHERE user_id = %8 AND users.type = '%9' "
"RETURNING users.user_id").arg(
trainee.getName(),
trainee.getLogin(),
trainee.getPassword(),
trainee.getArchived() ? "true" : "false",
trainee.getLoggedIn() ? "true" : "false",
QString::number(trainee.getGroup().getID()),
computer_id,
QString::number(trainee.getID()),
TypeUserDBTrainee);
return queryExecInt(queryStr);
}
int DataBaseLMS::insertTimingTrainee(int id_trainee)
{
QString queryStr = QString("INSERT INTO public.timings (entry_time, exit_time, operating_time, fk_trainee_id) "
"VALUES (DEFAULT, DEFAULT, DEFAULT, %1) "
"RETURNING timings.timing_id").arg(
QString::number(id_trainee));
return queryExecInt(queryStr);
}
int DataBaseLMS::updateTimingTrainee(int id_trainee, TimingOfTrainee timing)
{
QString queryStr = QString("UPDATE public.timings "
"SET entry_time = '%1', exit_time = '%2', operating_time = '%3', fk_trainee_id = %4 "
"WHERE timing_id = %5 "
"RETURNING timings.timing_id").arg(
timing.getEntryTimeS(),
timing.getExitTimeS(),
timing.getOperatingTimeS(),
QString::number(id_trainee),
QString::number(timing.getID()) );
return queryExecInt(queryStr);
}
TimingOfTrainee DataBaseLMS::selectTimingTrainee(int id_trainee)
{
TimingOfTrainee timing(id_trainee);
QString queryStr = QString("SELECT timings.timing_id, timings.entry_time, timings.exit_time, timings.operating_time, timings.fk_trainee_id "
"FROM public.timings "
"WHERE fk_trainee_id = '%1'").arg(id_trainee);
QSqlQuery querySel = QSqlQuery(*db);
if(queryExec(queryStr, &querySel))
{
if (querySel.first())
{//Тайминг
timing.setID(querySel.value(0).toInt());
timing.setEntryTime(querySel.value(1).toDateTime());
timing.setExitTime(querySel.value(2).toDateTime());
timing.setOperatingTime(querySel.value(3).toTime());
timing.setTraineeID(querySel.value(4).toInt());
}
}
return timing;
}

Some files were not shown because too many files have changed in this diff Show More