From 24fb521e03e2d1c66cf979e3386bd64a70362f86 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 16 Jan 2025 16:46:48 +0300 Subject: [PATCH 01/77] =?UTF-8?q?=D0=BD=D0=B5=D0=B7=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D0=BA=D0=BE?= =?UTF-8?q?=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GUIdataBaseLMS/mainwindow.cpp | 6 +- .../instructorsandtraineeswidget.cpp | 55 ------------------- TestServerLMS/mainwindow.cpp | 10 ++-- 3 files changed, 9 insertions(+), 62 deletions(-) diff --git a/GUIdataBaseLMS/mainwindow.cpp b/GUIdataBaseLMS/mainwindow.cpp index 4413928..5ba4ac0 100644 --- a/GUIdataBaseLMS/mainwindow.cpp +++ b/GUIdataBaseLMS/mainwindow.cpp @@ -17,11 +17,11 @@ MainWindow::MainWindow(QWidget *parent) m_instructorsAndTraineesWidget = new InstructorsAndTraineesWidget(this); - connect(this, &MainWindow::signal_LanguageChanged, m_instructorsAndTraineesWidget, &InstructorsAndTraineesWidget::slot_LanguageChanged); - ui->horizontalLayout->addWidget(m_instructorsAndTraineesWidget); - this->move(0, 0); + connect(this, &MainWindow::signal_LanguageChanged, m_instructorsAndTraineesWidget, &InstructorsAndTraineesWidget::slot_LanguageChanged); + + //this->move(0, 0); //this->showNormal(); this->showMaximized(); } diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index dc84728..8f2feec 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -211,8 +211,6 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state) { if(state) {//Сервер подключен - - //ui->btnConnectionToDB->setText(tr("Disconnection DB")); ui->btnConnectionToServer->setEnabled(false); ui->btnAuthorizationInstructor->setEnabled(true); @@ -220,8 +218,6 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state) } else {//Сервер отключен - - //ui->btnConnectionToDB->setText(tr("Connection DB")); ui->btnConnectionToServer->setEnabled(true); ui->btnAuthorizationInstructor->setEnabled(false); @@ -275,51 +271,6 @@ bool InstructorsAndTraineesWidget::authorizationIsCompleted() void InstructorsAndTraineesWidget::on_btnConnectionToServer_clicked() { connectorToServer->SetConnectToServer(); - - if(true) - {//Подключение к БД -/* - connectorToServer->SetConnectToServer(); - - - if(! dbLMS->DBisConnected()) - { - if(dbLMS->ConnectionToDB()) - { - ui->btnConnectionToDB->setText(tr("Disconnection DB")); - ui->btnAuthorizationInstructor->setEnabled(true); - - ui->lblDBisConnected->setPixmap(QPixmap(QStringLiteral(":/icons/circleGreen.png"))); - - Q_EMIT signal_NeedUpdateUI(true, true); - - Q_EMIT signal_BlockAutorization(false); - - Q_EMIT signal_InitMessanger(dbLMS->getListTrainees()); - } - }*/ - } - else - {//Отключение от БД - /* - bool stateIsCheckedAuthorization = ui->btnAuthorizationInstructor->isChecked(); - if(stateIsCheckedAuthorization) - ui->btnAuthorizationInstructor->click(); - - if(dbLMS->DBisConnected()) - { - Q_EMIT signal_BlockAutorization(true); - - dbLMS->DisConnectionFromDB(); - - ui->btnConnectionToDB->setText(tr("Connection DB")); - ui->btnAuthorizationInstructor->setEnabled(false); - - ui->lblDBisConnected->setPixmap(QPixmap(QStringLiteral(":/icons/circleGray.png"))); - - Q_EMIT signal_NeedUpdateUI(true, true); - }*/ - } } void InstructorsAndTraineesWidget::on_btnAuthorizationInstructor_clicked() @@ -367,11 +318,5 @@ void InstructorsAndTraineesWidget::updateLabelLoggedInInstructor(QString login, void InstructorsAndTraineesWidget::on_btnUpdateStyleSheet_clicked() { - /* - viewerTrainees->updateMyStyleSheet(); - viewerInstructors->updateMyStyleSheet(); - messangerWidget->updateMyStyleSheet(); - */ - updateMyStyleSheet(); } diff --git a/TestServerLMS/mainwindow.cpp b/TestServerLMS/mainwindow.cpp index c991e89..5f32e2d 100644 --- a/TestServerLMS/mainwindow.cpp +++ b/TestServerLMS/mainwindow.cpp @@ -10,16 +10,18 @@ MainWindow::MainWindow(QWidget *parent) : { ui->setupUi(this); + //Задаём два пункта с текстом локалей в комбобоксе + ui->cmbLanguage->addItems(QStringList() << "English" << "Русский"); + m_serverLMSWidget = new ServerLMSWidget(this); ui->verticalLayout_1->addWidget(m_serverLMSWidget); connect(this, &MainWindow::signal_LanguageChanged, m_serverLMSWidget, &ServerLMSWidget::slot_LanguageChanged); - //Задаём два пункта с текстом локалей в комбобоксе - ui->cmbLanguage->addItems(QStringList() << "English" << "Русский"); - - this->showMaximized(); + this->move(0, 0); + this->showNormal(); + //this->showMaximized(); } MainWindow::~MainWindow() From 4b9ee1738ac6942733d309a078f22a02b80032bb Mon Sep 17 00:00:00 2001 From: semenov Date: Fri, 17 Jan 2025 11:10:34 +0300 Subject: [PATCH 02/77] bugfix: diff update --- DOCS/Алексей/Board.md | 6 ++++-- ServerLMS/Data/PacketType.h | 2 ++ ServerLMS/Data/StreamingVersionData.h | 14 ++++++++++++++ ServerLMS/Systems/recognizesystem.cpp | 8 +++----- ServerLMS/Systems/updatecontroller.cpp | 2 +- 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/DOCS/Алексей/Board.md b/DOCS/Алексей/Board.md index b0760b5..55eae26 100644 --- a/DOCS/Алексей/Board.md +++ b/DOCS/Алексей/Board.md @@ -10,7 +10,7 @@ kanban-plugin: board ## bugs -- [ ] QT сервер Найти причину двойного вызова проверки при логине инструктором +- [ ] При старт стопе не сканится шэред дата ## feature client Unity @@ -24,7 +24,6 @@ kanban-plugin: board - [ ] Иерархия проекта - папка application, папка updater и линк на основной экзешник - [ ] на старте все мониторы должны быть активны - [ ] Нужен ли дополнительный выбор для загрузки с мат моделью или нет? -- [ ] при создании копии переключение сервера и переключения клиента ## feature server @@ -32,6 +31,7 @@ kanban-plugin: board - [ ] добавить генерацию пустых файлов, если shared не найден - [ ] добавить подключение без DB - [ ] ПЕРЕВЕСТИ все действия под операции и формировать процент из них +- [ ] блокировать выгрузку под инструктором, если режим версия base ## NOW @@ -270,6 +270,8 @@ kanban-plugin: board ## BUGFIX Complete +- [ ] при создании копии переключение сервера и переключения клиента +- [ ] QT сервер Найти причину двойного вызова проверки при логине инструктором - [ ] QT клиент: device not open после прерывания загрузки - [ ] QT сервер При изменении версии правильный списке с файлами прилетает со второго раза - [ ] QT клиент, если обновление в режиме инструктора доступно, кнопку запуск отключать diff --git a/ServerLMS/Data/PacketType.h b/ServerLMS/Data/PacketType.h index 2b54672..326dda7 100644 --- a/ServerLMS/Data/PacketType.h +++ b/ServerLMS/Data/PacketType.h @@ -14,6 +14,8 @@ enum PacketType TYPE_XMLANSWER = 8, TYPE_QT = 9, TYPE_DISABLE = 11, + TYPE_UPDATE = 12, + TYPE_CHECK_VERSION = 13, TYPE_FILESIZE = 20, TYPE_XMLANSWER_MESSAGE_FOR_GUI = 90, diff --git a/ServerLMS/Data/StreamingVersionData.h b/ServerLMS/Data/StreamingVersionData.h index 3746bd7..007b368 100644 --- a/ServerLMS/Data/StreamingVersionData.h +++ b/ServerLMS/Data/StreamingVersionData.h @@ -36,11 +36,25 @@ public: return size; } + bool getIsChangeable() const; + void setIsChangeable(bool value); + private: QString absolutePath; QString viewName; QDateTime createData; + bool isChangeable; qint32 size; }; #endif // STREAMINGVERSIONDATA_H + +bool StreamingVersionData::getIsChangeable() const +{ +return isChangeable; +} + +void StreamingVersionData::setIsChangeable(bool value) +{ +isChangeable = value; +} diff --git a/ServerLMS/Systems/recognizesystem.cpp b/ServerLMS/Systems/recognizesystem.cpp index 2389ca6..46e929d 100644 --- a/ServerLMS/Systems/recognizesystem.cpp +++ b/ServerLMS/Systems/recognizesystem.cpp @@ -87,24 +87,22 @@ void RecognizeSystem::recognize() if (!stream.commitTransaction()) continue; } - if (command == commandUpdateFilesClient) //запускает процесс оновления + if (packetType == PacketType::TYPE_UPDATE) { + sendSystem->updateFiles(updateController->getFileSendList(), updateController->getFileDeleteList()); qDebug()<< "Call update"; packetType = PacketType::TYPE_NONE; - command = ""; } - if(command == "check") + if(packetType == PacketType::TYPE_CHECK_VERSION) { - command = ""; QFile checkFile(clientHash); checkFile.open(QIODevice::ReadOnly); updateController->compareFiles(clientHandler,checkFile.readAll()); checkFile.close(); - } if (packetType == PacketType::TYPE_XMLANSWER) diff --git a/ServerLMS/Systems/updatecontroller.cpp b/ServerLMS/Systems/updatecontroller.cpp index 7b0247a..08c7e9c 100644 --- a/ServerLMS/Systems/updatecontroller.cpp +++ b/ServerLMS/Systems/updatecontroller.cpp @@ -479,6 +479,7 @@ void UpdateController::createVersionListXmlAnswer(QList xmlWriter.writeEndDocument(); file.close(); } + void UpdateController::saveVersionToFile(StreamingVersionData *streamingVersion) //TODO: переименовать и перебросить в AssetManager { QFile file(version); @@ -498,7 +499,6 @@ void UpdateController::saveVersionToFile(StreamingVersionData *streamingVersion) file.close(); } - void UpdateController::sendNewVersionList() { commonClientHandler->sendNewVersionListToAllClient(); From 1950690f82c7b4ac46403c02c627252e05b64150 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Fri, 17 Jan 2025 14:29:27 +0300 Subject: [PATCH 03/77] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B4=D0=B0=D1=87=D1=83=20tasksFIM.xml=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D1=83=20GUI-?= =?UTF-8?q?=D0=BA=D0=BB=D0=B8=D0=B5=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connectorToServer/Core/dataparser.cpp | 19 +++ .../connectorToServer/Core/dataparser.h | 1 + .../Core/recognizesystem.cpp | 31 ++++ .../connectorToServer/Core/recognizesystem.h | 5 + .../connectorToServer/Core/tools.h | 6 +- .../connectorToServer/connectortoserver.cpp | 38 +++++ .../connectorToServer/connectortoserver.h | 15 ++ .../docTasks/doctaskswidget.cpp | 13 ++ .../docTasks/doctaskswidget.h | 7 + .../docTasks/fimtaskswidget.cpp | 156 ++++++++++-------- .../docTasks/fimtaskswidget.h | 23 ++- .../docTasks/fimtaskswidget.ui | 23 ++- .../instructorsandtraineeswidget.cpp | 7 +- .../instructorsandtraineeswidget.h | 2 + ServerLMS/Data/PacketType.h | 4 + ServerLMS/Data/typesDataServerClient.h | 6 + ServerLMS/Systems/Parsers/processparser.cpp | 23 +++ ServerLMS/Systems/Parsers/processparser.h | 1 + ServerLMS/Systems/processingsystem.cpp | 22 ++- ServerLMS/Systems/processingsystem.h | 4 +- ServerLMS/Systems/tools.h | 3 + ServerLMS/Systems/updatecontroller.cpp | 13 ++ ServerLMS/Systems/updatecontroller.h | 3 + ServerLMS/serverlmswidget.cpp | 8 +- 24 files changed, 342 insertions(+), 91 deletions(-) diff --git a/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp b/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp index 70cbbdb..1a1a735 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp @@ -179,6 +179,25 @@ void DataParser::createQueryToDBMessage(ClientQueryToDB *queryToDB, int id, void file.close(); } +void DataParser::createQueryTasksXMLMessage(QString type) +{ + QFile file(tempName); + file.open(QIODevice::WriteOnly); + QXmlStreamWriter xmlWriter(&file); + + xmlWriter.setAutoFormatting(true); + xmlWriter.writeStartDocument(); + xmlWriter.writeStartElement("QueryTasksXML"); + + xmlWriter.writeAttribute("Type", type); + + xmlWriter.writeEndElement(); + xmlWriter.writeEndElement(); + xmlWriter.writeEndDocument(); + + file.close(); +} + void DataParser::createDeAuthMessage(ClientDeAutorization *deAuth) { QFile file(tempName); diff --git a/InstructorsAndTrainees/connectorToServer/Core/dataparser.h b/InstructorsAndTrainees/connectorToServer/Core/dataparser.h index d041e85..c0a3406 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/dataparser.h +++ b/InstructorsAndTrainees/connectorToServer/Core/dataparser.h @@ -24,6 +24,7 @@ public: void createAuthMessage(ClientAutorization *auth); void createToClientMessage(ToClientMessage *toClientMessage); void createQueryToDBMessage(ClientQueryToDB *queryToDB, int id = 0, void* data = nullptr); + void createQueryTasksXMLMessage(QString type); void createDeAuthMessage(ClientDeAutorization *deAuth); void createAuthData(ServerAuthorization *serverAuth); void createAuthDataOffline(QString username,QString pass); diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp index d06662a..05adfa5 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp @@ -3,6 +3,8 @@ #include #include #include "instructor.h" +#include "tasksAmmFim.h" +#include "fimtaskswidget.h" RecognizeSystem::RecognizeSystem(QObject *parent): @@ -276,6 +278,22 @@ void RecognizeSystem::recognize(QTcpSocket *socket) break; }; + //xml-ответы на запросы AdditionalFiles + if(packetType == PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_FIM || + packetType == PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_AMM) + { + QByteArray array; + stream.startTransaction(); + stream >> array; + + if(!stream.commitTransaction()) + continue; + + xmlParserQueryTasksXML(packetType, array); + + packetType = PacketType::TYPE_NONE; + } + packetType = PacketType::TYPE_NONE; } } @@ -547,6 +565,19 @@ void RecognizeSystem::xmlParserQueryToDB(PacketType packetType, QByteArray array }; } +void RecognizeSystem::xmlParserQueryTasksXML(PacketType packetType, QByteArray array) +{ + QList listTaskAmmFim; + + //парсинг XML + listTaskAmmFim = FIMtasksWidget::loadTasksAmmFimFromXML(array); + + if(packetType == TYPE_XMLANSWER_QUERY_TASKS_XML_FIM) + emit sigAnswerQueryTasksXML_FIM(listTaskAmmFim); + else if(packetType == TYPE_XMLANSWER_QUERY_TASKS_XML_AMM) + emit sigAnswerQueryTasksXML_AMM(listTaskAmmFim); +} + void RecognizeSystem::checkAccessType(QString type) { if(type == "instructor") diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h index b2ece21..a01e22d 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h @@ -11,6 +11,7 @@ #include "trainee.h" #include "group.h" #include "Datas.h" +#include "tasksAmmFim.h" class RecognizeSystem : public QObject @@ -48,6 +49,9 @@ signals: void sigAnswerQueryToDB_ListClassrooms(QList listClassrooms); void sigAnswerQueryToDB_ListTasks(QList listTasks); + void sigAnswerQueryTasksXML_FIM(QList listTaskFim); + void sigAnswerQueryTasksXML_AMM(QList listTaskAmm); + private: QList *folderList; //MainWindow *mainWindow; @@ -63,6 +67,7 @@ private: void xmlParser(QByteArray array); void xmlParserQueryToDB(PacketType packetType, QByteArray array); + void xmlParserQueryTasksXML(PacketType packetType, QByteArray array); void checkAccessType(QString type); }; diff --git a/InstructorsAndTrainees/connectorToServer/Core/tools.h b/InstructorsAndTrainees/connectorToServer/Core/tools.h index 187a466..d64b155 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/tools.h +++ b/InstructorsAndTrainees/connectorToServer/Core/tools.h @@ -40,7 +40,11 @@ enum PacketType{ TYPE_XMLANSWER_QUERY_DB__LIST_TRAINEES = 102, TYPE_XMLANSWER_QUERY_DB__LIST_COMPUTERS = 103, TYPE_XMLANSWER_QUERY_DB__LIST_CLASSROOMS = 104, - TYPE_XMLANSWER_QUERY_DB__LIST_TASKS = 105 + TYPE_XMLANSWER_QUERY_DB__LIST_TASKS = 105, + + //xml-ответы на запросы AdditionalFiles + TYPE_XMLANSWER_QUERY_TASKS_XML_FIM = 130, + TYPE_XMLANSWER_QUERY_TASKS_XML_AMM = 131 }; Q_DECLARE_METATYPE(PacketType) diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index 4421bc0..de0f798 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -80,11 +80,34 @@ bool ConnectorToServer::sendMessageForClient(int id, QString login, QString text return true; } +bool ConnectorToServer::sendQueryTasksXML(QString type) +{ + if (!client->getIsConnected()) + { + return false; + } + + dataParser->createQueryTasksXMLMessage(type); + emit signal_sendXMLmsgGUItoServer(); + + return true; +} + void ConnectorToServer::SetConnectToServer() { emit sigSetConnect(dataParser->getServerSettings(),connectionThread); } +QList ConnectorToServer::getListTaskFim() +{ + return listTaskFim; +} + +QList ConnectorToServer::getListTaskAmm() +{ + return listTaskAmm; +} + QList ConnectorToServer::getListInstructors() { return listInstructors; @@ -274,6 +297,18 @@ void ConnectorToServer::slot_AnswerQueryToDB_ListTasks(QList listTasks) //emit signal_UpdateDB(false, true); } +void ConnectorToServer::slot_AnswerQueryTasksXML_FIM(QList listTaskFim) +{ + this->listTaskFim = listTaskFim; + emit signal_UpdateTasksFIM(); +} + +void ConnectorToServer::slot_AnswerQueryTasksXML_AMM(QList listTaskAmm) +{ + this->listTaskAmm = listTaskAmm; + emit signal_UpdateTasksAMM(); +} + void ConnectorToServer::slot_msgToClientReady(QString login, QString text) { int id = getIdTraineeByLogin(login); @@ -310,6 +345,9 @@ void ConnectorToServer::bindConnection() connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListClassrooms,this,&ConnectorToServer::slot_AnswerQueryToDB_ListClassrooms); connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListTasks,this,&ConnectorToServer::slot_AnswerQueryToDB_ListTasks); + 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); } diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.h b/InstructorsAndTrainees/connectorToServer/connectortoserver.h index 77eb228..9f158c7 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.h +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.h @@ -25,8 +25,14 @@ public: bool sendQueryToDB(TypeQueryToDB typeQuery, int id = 0, void* data = nullptr); bool sendMessageForClient(int id, QString login, QString text); + bool sendQueryTasksXML(QString type); + void SetConnectToServer(); +public: + QList getListTaskFim(); + QList getListTaskAmm(); + public: //Запросы к БД (локальной) QList getListInstructors(); @@ -61,6 +67,9 @@ public slots: void slot_AnswerQueryToDB_ListClassrooms(QList listClassrooms); void slot_AnswerQueryToDB_ListTasks(QList listTasks); + void slot_AnswerQueryTasksXML_FIM(QList listTaskFim); + void slot_AnswerQueryTasksXML_AMM(QList listTaskAmm); + void slot_msgToClientReady(QString login, QString text); signals: @@ -76,6 +85,9 @@ signals: void signal_UpdateDB(bool treeInstructor, bool treeTrainee); + void signal_UpdateTasksFIM(); + void signal_UpdateTasksAMM(); + void signal_ConnectedToServer(bool state); void signal_InitMessanger(QList listTrainees); @@ -102,6 +114,9 @@ private: QList listComputers; QList listClassrooms; QList listTasks; + + QList listTaskFim; + QList listTaskAmm; }; #endif // CONNECTORTOSERVER_H diff --git a/InstructorsAndTrainees/docTasks/doctaskswidget.cpp b/InstructorsAndTrainees/docTasks/doctaskswidget.cpp index 23a7f65..fe44cb0 100644 --- a/InstructorsAndTrainees/docTasks/doctaskswidget.cpp +++ b/InstructorsAndTrainees/docTasks/doctaskswidget.cpp @@ -62,6 +62,19 @@ void DocTasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, } } +void DocTasksWidget::slot_NeedUpdateUI() +{ + loadTasksAMM(); +} + +void DocTasksWidget::loadTasksAMM() +{ + //Обновление дерева + treeWidget->clear(); + + //TODO собственно обновление дерева +} + void DocTasksWidget::domElementParser(QDomElement element, Module* moduleParent) { QString name; diff --git a/InstructorsAndTrainees/docTasks/doctaskswidget.h b/InstructorsAndTrainees/docTasks/doctaskswidget.h index fc08f04..ed7b690 100644 --- a/InstructorsAndTrainees/docTasks/doctaskswidget.h +++ b/InstructorsAndTrainees/docTasks/doctaskswidget.h @@ -27,6 +27,10 @@ public: private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); +public Q_SLOTS: + //Слот обработки сигнала необходимости обновления интерфейса + void slot_NeedUpdateUI(); + private: void domElementParser(QDomElement element, Module* moduleParent); void loadDocTasksFromXML(); @@ -38,11 +42,14 @@ private: void updateTreeWidget(); void addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr); + void loadTasksAMM(); + private: Ui::DocTasksWidget *ui; QTreeWidget* treeWidget; QList listAllModules; + }; #endif // DOCTASKSWIDGET_H diff --git a/InstructorsAndTrainees/docTasks/fimtaskswidget.cpp b/InstructorsAndTrainees/docTasks/fimtaskswidget.cpp index 2c3ff25..a726b85 100644 --- a/InstructorsAndTrainees/docTasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/docTasks/fimtaskswidget.cpp @@ -6,17 +6,18 @@ #include "ui_fimtaskswidget.h" #include "tasksAmmFim.h" -FIMtasksWidget::FIMtasksWidget(QWidget *parent) : +FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, QWidget *parent) : QWidget(parent), - ui(new Ui::FIMtasksWidget) + ui(new Ui::FIMtasksWidget), + connectorToServer(connectorToServer) { ui->setupUi(this); - loadTasksAmmFimFromXML(); + //loadTasksAmmFimFromXML(); preparationTreeWidget(); - fillTree(); + //fillTree(); } FIMtasksWidget::~FIMtasksWidget() @@ -24,92 +25,86 @@ FIMtasksWidget::~FIMtasksWidget() delete ui; } -void FIMtasksWidget::loadTasksAmmFimFromXML() +QList FIMtasksWidget::loadTasksAmmFimFromXML(QByteArray array) { + QList listTaskAmmFim; + QDomDocument docTasksDOM; - QString xmlFileName = "./tasksFIM.xml"; - QFile xmlInFile(xmlFileName); - if (!xmlInFile.open(QFile::ReadOnly | QFile::Text)) - { - QMessageBox::critical(nullptr, tr("Attention!"), tr("The file could not be opened ") + xmlFileName); - return; - } - else - { - docTasksDOM.setContent(xmlInFile.readAll()); - xmlInFile.close(); - QDomElement RRJTasksElement = docTasksDOM.firstChildElement("RRJTasks"); - if(RRJTasksElement.isNull()) - return; + docTasksDOM.setContent(array); - QDomElement taskElement = RRJTasksElement.firstChildElement(); - if(taskElement.isNull()) - return; + QDomElement RRJTasksElement = docTasksDOM.firstChildElement("RRJTasks"); + if(RRJTasksElement.isNull()) + return listTaskAmmFim; - do - {/*task*/ - QString name = taskElement.nodeName(); - QDomNamedNodeMap nodeMap = taskElement.attributes(); + QDomElement taskElement = RRJTasksElement.firstChildElement(); + if(taskElement.isNull()) + return listTaskAmmFim; - if(name == "task") + do + {/*task*/ + QString name = taskElement.nodeName(); + QDomNamedNodeMap nodeMap = taskElement.attributes(); + + if(name == "task") + { + TaskAmmFim task; + + task.initialize(nodeMap.namedItem("id").nodeValue().toInt(), + nodeMap.namedItem("type").nodeValue(), + nodeMap.namedItem("title").nodeValue(), + nodeMap.namedItem("status").nodeValue(), + nodeMap.namedItem("created").nodeValue(), + nodeMap.namedItem("changed").nodeValue()); + + QDomElement malfunctionElement = taskElement.firstChildElement(); + if(!malfunctionElement.isNull()) { - TaskAmmFim task; + do + {/*malfunction*/ + QString name = malfunctionElement.nodeName(); + QDomNamedNodeMap nodeMap = malfunctionElement.attributes(); - task.initialize(nodeMap.namedItem("id").nodeValue().toInt(), - nodeMap.namedItem("type").nodeValue(), - nodeMap.namedItem("title").nodeValue(), - nodeMap.namedItem("status").nodeValue(), - nodeMap.namedItem("created").nodeValue(), - nodeMap.namedItem("changed").nodeValue()); + if(name == "malfunction") + { + Malfunction malfunction; - QDomElement malfunctionElement = taskElement.firstChildElement(); - if(!malfunctionElement.isNull()) - { - do - {/*malfunction*/ - QString name = malfunctionElement.nodeName(); - QDomNamedNodeMap nodeMap = malfunctionElement.attributes(); + malfunction.initialize(nodeMap.namedItem("dmCode").nodeValue(), + nodeMap.namedItem("num").nodeValue(), + nodeMap.namedItem("description").nodeValue()); - if(name == "malfunction") + QDomElement signElement = malfunctionElement.firstChildElement(); + if(!signElement.isNull()) { - Malfunction malfunction; + do + {/*malfunctionSign*/ + QString name = signElement.nodeName(); + QDomNamedNodeMap nodeMap = signElement.attributes(); - malfunction.initialize(nodeMap.namedItem("dmCode").nodeValue(), - nodeMap.namedItem("num").nodeValue(), - nodeMap.namedItem("description").nodeValue()); + if(name == "malfunctionSign") + { + MalfunctionSign sign; - QDomElement signElement = malfunctionElement.firstChildElement(); - if(!signElement.isNull()) - { - do - {/*malfunctionSign*/ - QString name = signElement.nodeName(); - QDomNamedNodeMap nodeMap = signElement.attributes(); + sign.initialize(nodeMap.namedItem("type").nodeValue().toInt(), + nodeMap.namedItem("description").nodeValue()); - if(name == "malfunctionSign") - { - MalfunctionSign sign; + malfunction.addMalfunctionSign(sign); + } - sign.initialize(nodeMap.namedItem("type").nodeValue().toInt(), - nodeMap.namedItem("description").nodeValue()); - - malfunction.addMalfunctionSign(sign); - } - - }while(! (signElement = signElement.nextSiblingElement()).isNull()); - } - task.addMalfunction(malfunction); + }while(! (signElement = signElement.nextSiblingElement()).isNull()); } - }while(! (malfunctionElement = malfunctionElement.nextSiblingElement()).isNull()); - } - listTaskAmmFim.append(task); + task.addMalfunction(malfunction); + } + }while(! (malfunctionElement = malfunctionElement.nextSiblingElement()).isNull()); } - }while (! (taskElement = taskElement.nextSiblingElement()).isNull()); - } + listTaskAmmFim.append(task); + } + }while (! (taskElement = taskElement.nextSiblingElement()).isNull()); + + return listTaskAmmFim; } -void FIMtasksWidget::fillTree() +void FIMtasksWidget::fillTree(QList listTaskAmmFim) { for(int i = 0; i < listTaskAmmFim.count(); i++) {/*Задачи*/ @@ -172,3 +167,22 @@ void FIMtasksWidget::reSetHeadTreeWidget() QStringList listHeaders = {tr("Title"), tr("ID")}; ui->treeWidget->setHeaderLabels(listHeaders); } + +void FIMtasksWidget::slot_NeedUpdateUI() +{ + loadTasksFIM(); +} + +void FIMtasksWidget::loadTasksFIM() +{ + //Обновление дерева + ui->treeWidget->clear(); + + //собственно обновление дерева + fillTree(connectorToServer->getListTaskFim()); +} + +void FIMtasksWidget::on_btnUpdateTasks_clicked() +{ + connectorToServer->sendQueryTasksXML("fim"); +} diff --git a/InstructorsAndTrainees/docTasks/fimtaskswidget.h b/InstructorsAndTrainees/docTasks/fimtaskswidget.h index 981bc00..a01b6cb 100644 --- a/InstructorsAndTrainees/docTasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/docTasks/fimtaskswidget.h @@ -3,6 +3,7 @@ #include #include "tasksAmmFim.h" +#include "connectortoserver.h" namespace Ui { class FIMtasksWidget; @@ -19,22 +20,34 @@ private: }; public: - explicit FIMtasksWidget(QWidget *parent = nullptr); + explicit FIMtasksWidget(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); ~FIMtasksWidget(); -private: - void loadTasksAmmFimFromXML(); - void fillTree(); +public: + static QList loadTasksAmmFimFromXML(QByteArray array); + +private: + void fillTree(QList listTaskAmmFim); void preparationTreeWidget(); void reSetHeadTreeWidget(); +public Q_SLOTS: + //Слот обработки сигнала необходимости обновления интерфейса + void slot_NeedUpdateUI(); + +private: + void loadTasksFIM(); public: QString userName; - QList listTaskAmmFim; + //QList listTaskAmmFim; + +private slots: + void on_btnUpdateTasks_clicked(); private: Ui::FIMtasksWidget *ui; + ConnectorToServer* connectorToServer; }; #endif // FIMTASKSWIDGET_H diff --git a/InstructorsAndTrainees/docTasks/fimtaskswidget.ui b/InstructorsAndTrainees/docTasks/fimtaskswidget.ui index 70106c9..a2ee50d 100644 --- a/InstructorsAndTrainees/docTasks/fimtaskswidget.ui +++ b/InstructorsAndTrainees/docTasks/fimtaskswidget.ui @@ -22,6 +22,13 @@ FIM + + + + List of tasks + + + @@ -31,12 +38,16 @@ - - - - List of tasks - - + + + + + + ... + + + + diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 8f2feec..d849704 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -29,6 +29,8 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : qRegisterMetaType>("QList"); qRegisterMetaType>("QList"); + qRegisterMetaType>("QList"); + connectorToServer = new ConnectorToServer(this); connect(connectorToServer,&ConnectorToServer::sigLoginResult,this,&InstructorsAndTraineesWidget::checkLoginResult); connect(connectorToServer,&ConnectorToServer::sigDeLoginResult,this,&InstructorsAndTraineesWidget::checkDeLoginResult); @@ -55,7 +57,10 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : docTasksWidget = new DocTasksWidget(this); - fIMtasksWidget = new FIMtasksWidget(this); + fIMtasksWidget = new FIMtasksWidget(connectorToServer, this); + + connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksFIM, fIMtasksWidget, &FIMtasksWidget::slot_NeedUpdateUI); + connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksAMM, docTasksWidget, &DocTasksWidget::slot_NeedUpdateUI); ui->horizontalLayout_3->addWidget(viewerTrainees); ui->horizontalLayout_3->addWidget(messangerWidget); diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.h b/InstructorsAndTrainees/instructorsandtraineeswidget.h index 4f822da..5f0beaa 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.h +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.h @@ -18,6 +18,8 @@ Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) +Q_DECLARE_METATYPE(QList) + namespace Ui { class InstructorsAndTraineesWidget; } diff --git a/ServerLMS/Data/PacketType.h b/ServerLMS/Data/PacketType.h index 2b54672..1b8c0ea 100644 --- a/ServerLMS/Data/PacketType.h +++ b/ServerLMS/Data/PacketType.h @@ -26,6 +26,10 @@ enum PacketType TYPE_XMLANSWER_QUERY_DB__LIST_CLASSROOMS = 104, TYPE_XMLANSWER_QUERY_DB__LIST_TASKS = 105, + //xml-ответы на запросы AdditionalFiles + TYPE_XMLANSWER_QUERY_TASKS_XML_FIM = 130, + TYPE_XMLANSWER_QUERY_TASKS_XML_AMM = 131, + //ответы по обновлениям HASH_READY = 150, CHANGE_DATA_VERSION = 151, diff --git a/ServerLMS/Data/typesDataServerClient.h b/ServerLMS/Data/typesDataServerClient.h index 32a19ab..3e6e719 100644 --- a/ServerLMS/Data/typesDataServerClient.h +++ b/ServerLMS/Data/typesDataServerClient.h @@ -79,6 +79,12 @@ public: TypeQueryToDB typeQuery; }; +class ClientQueryTasksXML +{ +public: + QString Type; +}; + class ServerMessage { public: diff --git a/ServerLMS/Systems/Parsers/processparser.cpp b/ServerLMS/Systems/Parsers/processparser.cpp index 7a94451..64ee485 100644 --- a/ServerLMS/Systems/Parsers/processparser.cpp +++ b/ServerLMS/Systems/Parsers/processparser.cpp @@ -43,6 +43,11 @@ void ProcessParser::read(ClientHandler *client, QByteArray array) queryToDb(xmlReader,client); } + else if(xmlReader.name() == "QueryTasksXML") + {//Запрос файла XML с задачами + + queryTasksXML(xmlReader,client); + } else if(xmlReader.name() == "ClientMessage") {//Сообщение от клиента @@ -223,6 +228,24 @@ void ProcessParser::queryToDb(QXmlStreamReader &xmlReader,ClientHandler *client) processingSystem->processingClientQueryToDB(client, queryToDB, id, data); } +void ProcessParser::queryTasksXML(QXmlStreamReader &xmlReader, ClientHandler *client) +{ + ClientQueryTasksXML clientQueryTasksXML; + + /*Перебираем все атрибуты тега*/ + foreach(const QXmlStreamAttribute &attr, xmlReader.attributes()) + { + QString name = attr.name().toString(); + QString value = attr.value().toString(); + //addTextToLogger(name + ": " + value); + + if(name == "Type") + clientQueryTasksXML.Type = value; + } + + processingSystem->processingClientQueryTasksXML(client, clientQueryTasksXML); +} + void ProcessParser::clientMessage(QXmlStreamReader &xmlReader,ClientHandler *client) { ClientMessage clientMessage; diff --git a/ServerLMS/Systems/Parsers/processparser.h b/ServerLMS/Systems/Parsers/processparser.h index 41046a1..fc8dc05 100644 --- a/ServerLMS/Systems/Parsers/processparser.h +++ b/ServerLMS/Systems/Parsers/processparser.h @@ -23,6 +23,7 @@ private: void clientDeAuth(QXmlStreamReader &xmlReader,ClientHandler *client); void toClientMessage(QXmlStreamReader &xmlReader,ClientHandler *client); void queryToDb(QXmlStreamReader &xmlReader,ClientHandler *client); + void queryTasksXML(QXmlStreamReader &xmlReader,ClientHandler *client); void clientMessage(QXmlStreamReader &xmlReader,ClientHandler *client); void clientNotify(QXmlStreamReader &xmlReader,ClientHandler *client); }; diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index ae055ab..552e634 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -2,10 +2,13 @@ #include -ProcessingSystem::ProcessingSystem(ProviderDBLMS* providerDBLMS, QObject *parent): - QObject(parent) +ProcessingSystem::ProcessingSystem(ProviderDBLMS* providerDBLMS, UpdateController* updateController, QObject *parent): + QObject(parent), + providerDBLMS(nullptr), + updateController(nullptr) { this->providerDBLMS = providerDBLMS; + this->updateController = updateController; } void ProcessingSystem::initialize(ServerLMSWidget *server, DataParser *dataParser, CommonClientHandler *commonClientHandler,Logger *logger) @@ -226,6 +229,21 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu //logger->addTextToLogger("To Client: " + str); } +void ProcessingSystem::processingClientQueryTasksXML(ClientHandler *client, ClientQueryTasksXML clientQueryTasksXML) +{ + QByteArray arrayAnswer; + + QString nameFile = ""; + if(clientQueryTasksXML.Type == "fim") + nameFile = tasksFIMfileName; + else if(clientQueryTasksXML.Type == "amm") + nameFile = tasksAMMfileName; + + arrayAnswer = updateController->getAdditionalFile(nameFile); + + client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_FIM); +} + void ProcessingSystem::processingToClientMessage(ClientHandler *client, ToClientMessage toClientMessage) { signal_msgToClientReady(toClientMessage.Login, toClientMessage.Text); diff --git a/ServerLMS/Systems/processingsystem.h b/ServerLMS/Systems/processingsystem.h index 22dc00d..f34b733 100644 --- a/ServerLMS/Systems/processingsystem.h +++ b/ServerLMS/Systems/processingsystem.h @@ -21,12 +21,13 @@ class ProcessingSystem : public QObject { Q_OBJECT public: - explicit ProcessingSystem(ProviderDBLMS* providerDBLMS, QObject *parent = nullptr); + explicit ProcessingSystem(ProviderDBLMS* providerDBLMS, UpdateController* updateController, QObject *parent = nullptr); void initialize(ServerLMSWidget *server,DataParser* dataParser,CommonClientHandler *commonClientServer,Logger *logger); void processingClientAutorization(ClientHandler *client, ClientAutorization clientAutorization); void processingClientDeAutorization(ClientHandler *client, ClientDeAutorization clientDeAutorization); void processingClientQueryToDB(ClientHandler *client, ClientQueryToDB clientQueryToDB, int id = 0, void* data = nullptr); + void processingClientQueryTasksXML(ClientHandler *client, ClientQueryTasksXML clientQueryTasksXML); void processingToClientMessage(ClientHandler *client, ToClientMessage toClientMessage); void processingFromClientMessage(ClientHandler *client, ClientMessage clientMessage); @@ -46,6 +47,7 @@ private: DataParser *dataParser; //InstructorsAndTraineesWidget *pInstructorsAndTrainees; ProviderDBLMS* providerDBLMS; + UpdateController* updateController; }; #endif // PROCESSINGSYSTEM_H diff --git a/ServerLMS/Systems/tools.h b/ServerLMS/Systems/tools.h index f78fff9..acf8c99 100644 --- a/ServerLMS/Systems/tools.h +++ b/ServerLMS/Systems/tools.h @@ -15,6 +15,7 @@ static const QString staticDataFolderName = "StaticData"; static const QString applicationFolderName = "Application"; static const QString sharedDataFolderName = "SharedData"; +static const QString additionalFilesFolderName = "AdditionalFiles"; static const QString streamingAssetsFolderName = "StreamingAssets"; static const QString tempFile = staticDataFolderName + "/save.xml"; static const QString version = staticDataFolderName + "/version.xml"; @@ -22,6 +23,8 @@ static const QString versionListFile = staticDataFolderName + "/versionList.xml" static const QString hashFileName = staticDataFolderName + "/serverHash.xml"; static const QString buildHashName = staticDataFolderName + "/buildHash.xml"; static const QString buildDataPath = "/Application/RRJLoader/RRJ_Data/"; +static const QString tasksAMMfileName = "/tasksAmm.xml"; +static const QString tasksFIMfileName = "/tasksFIM.xml"; static const QString baseNameVersion = "base";//может вынести комманды куда нибудь? diff --git a/ServerLMS/Systems/updatecontroller.cpp b/ServerLMS/Systems/updatecontroller.cpp index 7a548c1..850eee6 100644 --- a/ServerLMS/Systems/updatecontroller.cpp +++ b/ServerLMS/Systems/updatecontroller.cpp @@ -355,6 +355,19 @@ QList* UpdateController::calculateHash(QString path) return files; } +QByteArray UpdateController::getAdditionalFile(QString name) +{ + QString path = Tools::createSharedPath("/" + assetManager->getCurrentVersionData()->getViewName() + "/AdditionalFiles" + name); + QFile addFile(path); + QByteArray array; + if(addFile.open(QIODevice::ReadOnly)){ + array = addFile.readAll(); + addFile.close(); + } + + return array; +} + QByteArray UpdateController::getLocalHash() { QFile hashFile(hashFileName); diff --git a/ServerLMS/Systems/updatecontroller.h b/ServerLMS/Systems/updatecontroller.h index 611ef2f..81232fc 100644 --- a/ServerLMS/Systems/updatecontroller.h +++ b/ServerLMS/Systems/updatecontroller.h @@ -55,6 +55,9 @@ public: void createVersionListXmlAnswer(QList version); void saveVersionToFile(StreamingVersionData *streamingVersion); void xmlFileDataParse(QByteArray array); + + QByteArray getAdditionalFile(QString name); + public slots: void changeAssetVersion(QString versionName); void createCopyVersion(QString versionName,QString newVersionName); diff --git a/ServerLMS/serverlmswidget.cpp b/ServerLMS/serverlmswidget.cpp index f52eb00..f80d79d 100644 --- a/ServerLMS/serverlmswidget.cpp +++ b/ServerLMS/serverlmswidget.cpp @@ -54,14 +54,14 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) : assetsManager = new AssetsManager; assetsManager->moveToThread(updateThread); - processingSystem = new ProcessingSystem(providerDBLMS); + updateController = new UpdateController; + updateController->moveToThread(updateThread); + + processingSystem = new ProcessingSystem(providerDBLMS, updateController); processingSystem->moveToThread(updateThread); dataParser = new DataParser(assetsManager,processingSystem); - updateController = new UpdateController; - updateController->moveToThread(updateThread); - commonClientHandler = new CommonClientHandler; loggerThread->start(); From 91a4b04f05a01883f4cce276554ca57b8837370c Mon Sep 17 00:00:00 2001 From: semenov Date: Fri, 17 Jan 2025 16:47:22 +0300 Subject: [PATCH 04/77] feat: load to server block --- DOCS/Алексей/Board.md | 3 ++ ServerLMS/Data/StreamingVersionData.h | 22 +++++++------- ServerLMS/Systems/Parsers/processparser.cpp | 3 ++ ServerLMS/Systems/processingsystem.cpp | 19 +++++++++++- ServerLMS/Systems/processingsystem.h | 9 ++++-- ServerLMS/Systems/recognizesystem.cpp | 33 +++++++++++++++++++++ ServerLMS/Systems/recognizesystem.h | 2 ++ ServerLMS/Systems/tools.h | 4 +++ ServerLMS/Systems/updatecontroller.cpp | 18 ++++++++++- ServerLMS/Systems/updatecontroller.h | 1 + ServerLMS/serverlmswidget.cpp | 2 +- 11 files changed, 99 insertions(+), 17 deletions(-) diff --git a/DOCS/Алексей/Board.md b/DOCS/Алексей/Board.md index 55eae26..5507615 100644 --- a/DOCS/Алексей/Board.md +++ b/DOCS/Алексей/Board.md @@ -6,6 +6,8 @@ kanban-plugin: board ## backLog +- [ ] окошко с выбором перенести в GUI +- [ ] Клиент НЕ СМОЖЕТ ВЫБИРАТЬ ВЕРСИИ ## bugs @@ -24,6 +26,7 @@ kanban-plugin: board - [ ] Иерархия проекта - папка application, папка updater и линк на основной экзешник - [ ] на старте все мониторы должны быть активны - [ ] Нужен ли дополнительный выбор для загрузки с мат моделью или нет? +- [ ] передавать полную версию в StreaminVerData ## feature server diff --git a/ServerLMS/Data/StreamingVersionData.h b/ServerLMS/Data/StreamingVersionData.h index 007b368..5cd2ffc 100644 --- a/ServerLMS/Data/StreamingVersionData.h +++ b/ServerLMS/Data/StreamingVersionData.h @@ -13,6 +13,7 @@ public: this->viewName = viewName; this->createData = data; this->size = size; + this->isChangeable = true; } ~StreamingVersionData(); @@ -36,8 +37,15 @@ public: return size; } - bool getIsChangeable() const; - void setIsChangeable(bool value); + bool getIsChangeable() const + { + return isChangeable; + } + + void setIsChangeable(bool value) + { + isChangeable = value; + } private: QString absolutePath; @@ -48,13 +56,3 @@ private: }; #endif // STREAMINGVERSIONDATA_H - -bool StreamingVersionData::getIsChangeable() const -{ -return isChangeable; -} - -void StreamingVersionData::setIsChangeable(bool value) -{ -isChangeable = value; -} diff --git a/ServerLMS/Systems/Parsers/processparser.cpp b/ServerLMS/Systems/Parsers/processparser.cpp index 7a94451..314d84a 100644 --- a/ServerLMS/Systems/Parsers/processparser.cpp +++ b/ServerLMS/Systems/Parsers/processparser.cpp @@ -239,6 +239,7 @@ void ProcessParser::clientMessage(QXmlStreamReader &xmlReader,ClientHandler *cli } processingSystem->processingFromClientMessage(client, clientMessage); + } void ProcessParser::clientNotify(QXmlStreamReader &xmlReader,ClientHandler *client) @@ -255,6 +256,8 @@ void ProcessParser::clientNotify(QXmlStreamReader &xmlReader,ClientHandler *clie clientNotify.Code = value; } + + processingSystem->processingClientNotify(client, clientNotify); } diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index ae055ab..87ee13c 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -8,11 +8,16 @@ ProcessingSystem::ProcessingSystem(ProviderDBLMS* providerDBLMS, QObject *parent this->providerDBLMS = providerDBLMS; } -void ProcessingSystem::initialize(ServerLMSWidget *server, DataParser *dataParser, CommonClientHandler *commonClientHandler,Logger *logger) +void ProcessingSystem::initialize(ServerLMSWidget *server, + DataParser *dataParser, + CommonClientHandler *commonClientHandler, + Logger *logger, + UpdateController *updateController) { this->commonClientServer = commonClientHandler; this->dataParser = dataParser; this->server = server; + this->updateController = updateController; connect(this,&ProcessingSystem::sigAuthChanged,commonClientHandler, &CommonClientHandler::slot_AuthChanged,Qt::AutoConnection); connect(this,&ProcessingSystem::sigUpdateListClients,server, &ServerLMSWidget::slotUpdateListClients,Qt::AutoConnection); @@ -278,6 +283,18 @@ void ProcessingSystem::processingClientNotify(ClientHandler *client, ClientNotif { client->sendVersionList(); } + else if(clientNotify.Code == commandCanChangeVersion) + { + if (updateController->getCurrentVersion()->getIsChangeable()) + { + client->sigSendNotify(commandChangable); + } + else + { + client->sigSendNotify(commandUnchangable); + } + + } } diff --git a/ServerLMS/Systems/processingsystem.h b/ServerLMS/Systems/processingsystem.h index 22dc00d..d5b82fb 100644 --- a/ServerLMS/Systems/processingsystem.h +++ b/ServerLMS/Systems/processingsystem.h @@ -23,7 +23,12 @@ class ProcessingSystem : public QObject public: explicit ProcessingSystem(ProviderDBLMS* providerDBLMS, QObject *parent = nullptr); - void initialize(ServerLMSWidget *server,DataParser* dataParser,CommonClientHandler *commonClientServer,Logger *logger); + void initialize(ServerLMSWidget *server, + DataParser* dataParser, + CommonClientHandler *commonClientServer, + Logger *logger, + UpdateController *updateComtroller); + void processingClientAutorization(ClientHandler *client, ClientAutorization clientAutorization); void processingClientDeAutorization(ClientHandler *client, ClientDeAutorization clientDeAutorization); void processingClientQueryToDB(ClientHandler *client, ClientQueryToDB clientQueryToDB, int id = 0, void* data = nullptr); @@ -44,7 +49,7 @@ private: CommonClientHandler *commonClientServer; ServerLMSWidget *server; DataParser *dataParser; - //InstructorsAndTraineesWidget *pInstructorsAndTrainees; + UpdateController *updateController; ProviderDBLMS* providerDBLMS; }; diff --git a/ServerLMS/Systems/recognizesystem.cpp b/ServerLMS/Systems/recognizesystem.cpp index 46e929d..be2e1d9 100644 --- a/ServerLMS/Systems/recognizesystem.cpp +++ b/ServerLMS/Systems/recognizesystem.cpp @@ -168,6 +168,16 @@ void RecognizeSystem::recognize() QFile file(filePath); +// //ПРОВЕРКА НА ИЗМЕНЕНИЕ БАЗОВОЙ ВЕРСИИ +// bool check = checkIsChangeable(); +// bool check2 = checkNonStaticData(filePath); +// if(!check && check2) +// { +// packetType = PacketType::TYPE_NONE; +// sendSystem->sendNotify(commandTryBaseChange); +// mutex->unlock(); +// return; +// } if (file.exists()) { @@ -239,6 +249,17 @@ void RecognizeSystem::recognize() break; } +// //ПРОВЕРКА НА ИЗМЕНЕНИЕ БАЗОВОЙ ВЕРСИИ +// bool check = checkIsChangeable(); +// bool check2 = checkNonStaticData(filePath); +// if(!check && check2) +// { +// sendSystem->sendNotify(commandTryBaseChange); +// packetType = PacketType::TYPE_NONE; +// mutex->unlock(); +// return; +// } + QFile file(filePath); QFileInfo fileInfo(file); @@ -412,6 +433,18 @@ QString RecognizeSystem::createFullPath(QString path) return fullPath; } +bool RecognizeSystem::checkIsChangeable() +{ + return updateController->getCurrentVersion()->getIsChangeable(); +} + +bool RecognizeSystem::checkNonStaticData(QString path) +{ + if(path.contains(sharedDataFolderName)) return true; + + return false; +} + RecognizeSystem::~RecognizeSystem() { diff --git a/ServerLMS/Systems/recognizesystem.h b/ServerLMS/Systems/recognizesystem.h index 7d5c97c..29a2b24 100644 --- a/ServerLMS/Systems/recognizesystem.h +++ b/ServerLMS/Systems/recognizesystem.h @@ -61,5 +61,7 @@ private: void packetTypeInit(PacketType packet,Client *client); void packetTypeInit(PacketType type); QString createFullPath(QString path); + bool checkIsChangeable(); + bool checkNonStaticData(QString path); }; #endif // RECOGNIZESYSTEM_H diff --git a/ServerLMS/Systems/tools.h b/ServerLMS/Systems/tools.h index e896664..1b9199d 100644 --- a/ServerLMS/Systems/tools.h +++ b/ServerLMS/Systems/tools.h @@ -27,6 +27,7 @@ static const QString clientHash = staticDataFolderName + "/clientHash.xml"; static const QString baseNameVersion = "base";//может вынести комманды куда нибудь? static const QString commandTryBaseDelete = "BASEDELETETRY"; +static const QString commandTryBaseChange = "TRYBASECHANGE"; static const QString commandTryActiveDelete = "TRYACTIVEDELETE"; static const QString commandTryCopyWithSameNames = "SAMENAMES"; static const QString commandGetServerDataList = "GETSERVERDATALIST"; @@ -35,6 +36,9 @@ static const QString commandReadyClient = "READY"; static const QString commandDisableClient = "DISABLE"; static const QString commandDuplicateVerName = "DUPLICATEVERNAME"; static const QString commandHashCompleteClient = "HASHSENDCOMPLETE"; +static const QString commandCanChangeVersion = "CANCHANGE"; +static const QString commandChangable = "CHANGEABLE"; +static const QString commandUnchangable = "UNCHANGEABLE"; static const QString commandUpdateFilesClient = "update"; class Tools { diff --git a/ServerLMS/Systems/updatecontroller.cpp b/ServerLMS/Systems/updatecontroller.cpp index 08c7e9c..2b66318 100644 --- a/ServerLMS/Systems/updatecontroller.cpp +++ b/ServerLMS/Systems/updatecontroller.cpp @@ -431,6 +431,15 @@ void UpdateController::calculateSharedHash() fileInfo.absoluteFilePath(),fileInfo.fileName(), fileInfo.birthTime(),fileInfo.size()); + if(fileInfo.fileName() == baseNameVersion) + { + version->setIsChangeable(false); + } + else + { + version->setIsChangeable(true); + } + versionList->append(version); } @@ -447,8 +456,9 @@ void UpdateController::createVersionListXmlAnswer(QList { SAttribute attribute1 = {"Version", ver->getViewName()}; SAttribute attribute2 = {"Created", ver->getCreateData().toString()}; + SAttribute attribute3 = {"isChangeable",QString::number(ver->getIsChangeable())}; - QList listAttr = {attribute1, attribute2}; + QList listAttr = {attribute1, attribute2,attribute3}; SXmlAnswerTag tag = {"VersionData", listAttr}; listTag.append(tag); @@ -492,6 +502,7 @@ void UpdateController::saveVersionToFile(StreamingVersionData *streamingVersion) xmlWriter.writeStartElement("VersionData"); xmlWriter.writeAttribute("Version",streamingVersion->getViewName()); xmlWriter.writeAttribute("Created",streamingVersion->getCreateData().toString()); + xmlWriter.writeAttribute("isChangeable",QString::number(streamingVersion->getIsChangeable())); xmlWriter.writeEndElement(); xmlWriter.writeEndDocument(); @@ -543,6 +554,11 @@ void UpdateController::xmlFileDataParse(QByteArray array) } } +StreamingVersionData* UpdateController::getCurrentVersion() +{ + return assetManager->getCurrentVersionData(); +} + void UpdateController::printFileList(QList fileData) { QListIterator iterator(fileData); diff --git a/ServerLMS/Systems/updatecontroller.h b/ServerLMS/Systems/updatecontroller.h index efe3aee..6932588 100644 --- a/ServerLMS/Systems/updatecontroller.h +++ b/ServerLMS/Systems/updatecontroller.h @@ -54,6 +54,7 @@ public: void createVersionListXmlAnswer(QList version); void saveVersionToFile(StreamingVersionData *streamingVersion); void xmlFileDataParse(QByteArray array); + StreamingVersionData *getCurrentVersion(); public slots: void changeAssetVersion(QString versionName); void createCopyVersion(QString versionName,QString newVersionName); diff --git a/ServerLMS/serverlmswidget.cpp b/ServerLMS/serverlmswidget.cpp index b90a0c3..4f8c27f 100644 --- a/ServerLMS/serverlmswidget.cpp +++ b/ServerLMS/serverlmswidget.cpp @@ -70,7 +70,7 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) : updateThread->start(); commonClientHandler->initialize(&clientsMap,processingSystem,dataParser,logger); - processingSystem->initialize(this,dataParser,commonClientHandler,logger); + processingSystem->initialize(this,dataParser,commonClientHandler,logger,updateController); logger->setTypeLog("widget"); From 97fee998bbe3ae3dec805f4e0e8d74c9e1186be1 Mon Sep 17 00:00:00 2001 From: semenov Date: Mon, 20 Jan 2025 10:44:01 +0300 Subject: [PATCH 05/77] feat: change path --- ServerLMS/Systems/processingsystem.h | 1 - ServerLMS/Systems/tools.h | 6 ++---- ServerLMS/Systems/updatecontroller.cpp | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/ServerLMS/Systems/processingsystem.h b/ServerLMS/Systems/processingsystem.h index febb29d..d412e7a 100644 --- a/ServerLMS/Systems/processingsystem.h +++ b/ServerLMS/Systems/processingsystem.h @@ -52,7 +52,6 @@ private: DataParser *dataParser; UpdateController *updateController; ProviderDBLMS* providerDBLMS; - UpdateController* updateController; }; #endif // PROCESSINGSYSTEM_H diff --git a/ServerLMS/Systems/tools.h b/ServerLMS/Systems/tools.h index b554bbc..cf5fd3e 100644 --- a/ServerLMS/Systems/tools.h +++ b/ServerLMS/Systems/tools.h @@ -15,8 +15,9 @@ static const QString staticDataFolderName = "StaticData"; static const QString applicationFolderName = "Application"; static const QString sharedDataFolderName = "SharedData"; -static const QString additionalFilesFolderName = "AdditionalFiles"; +static const QString additionalFilesFolderName = "RRJ-95NEW-100"; static const QString streamingAssetsFolderName = "StreamingAssets"; +static const QString versionFolderName = "StreamingVersion"; static const QString tempFile = staticDataFolderName + "/save.xml"; static const QString version = staticDataFolderName + "/version.xml"; static const QString versionListFile = staticDataFolderName + "/versionList.xml"; @@ -26,9 +27,6 @@ static const QString buildDataPath = "/Application/RRJLoader/RRJ_Data/"; static const QString tasksAMMfileName = "/tasksAmm.xml"; static const QString tasksFIMfileName = "/tasksFIM.xml"; static const QString clientHash = staticDataFolderName + "/clientHash.xml"; -static const QString tasksAMMfileName = "/tasksAmm.xml"; -static const QString tasksFIMfileName = "/tasksFIM.xml"; -static const QString clientHash = staticDataFolderName + "/clientHash.xml"; static const QString baseNameVersion = "base";//может вынести комманды куда нибудь? diff --git a/ServerLMS/Systems/updatecontroller.cpp b/ServerLMS/Systems/updatecontroller.cpp index e850c77..8225da9 100644 --- a/ServerLMS/Systems/updatecontroller.cpp +++ b/ServerLMS/Systems/updatecontroller.cpp @@ -364,7 +364,7 @@ QList* UpdateController::calculateHash(QString path) QByteArray UpdateController::getAdditionalFile(QString name) { - QString path = Tools::createSharedPath("/" + assetManager->getCurrentVersionData()->getViewName() + "/AdditionalFiles" + name); + QString path = Tools::createSharedPath("/" + assetManager->getCurrentVersionData()->getViewName() + "/" + additionalFilesFolderName + name); QFile addFile(path); QByteArray array; if(addFile.open(QIODevice::ReadOnly)){ From 3e95be4447fc35dab20ad2b23d18603b40628729 Mon Sep 17 00:00:00 2001 From: semenov Date: Tue, 21 Jan 2025 11:33:51 +0300 Subject: [PATCH 06/77] feat: add versionChanger for GUI --- DOCS/Алексей/Board.md | 1 + InstructorsAndTrainees/CMakeLists.txt | 15 ++ .../connectorToServer/Core/dataparser.cpp | 4 +- .../Core/notifycontroller.cpp | 16 ++ .../connectorToServer/Core/notifycontroller.h | 18 ++ .../Core/recognizesystem.cpp | 94 +++++++ .../connectorToServer/Core/recognizesystem.h | 6 +- .../connectorToServer/Core/sendsystem.cpp | 37 +++ .../connectorToServer/Core/sendsystem.h | 7 + .../connectorToServer/Core/tools.h | 12 +- .../Core/versioncontainer.cpp | 42 +++ .../connectorToServer/Core/versioncontainer.h | 30 +++ .../connectorToServer/connectortoserver.cpp | 55 +++- .../connectorToServer/connectortoserver.h | 11 + .../connectorToServer/streamingversiondata.h | 74 ++++++ .../instructorsandtraineeswidget.cpp | 12 +- .../instructorsandtraineeswidget.h | 2 + .../instructorsandtraineeswidget.ui | 13 + InstructorsAndTrainees/resources.qrc | 1 + .../resources/icons/762.gif | Bin 0 -> 9842 bytes .../widgets/newversionwidget.cpp | 37 +++ .../widgets/newversionwidget.h | 31 +++ .../widgets/newversionwidget.ui | 219 ++++++++++++++++ .../widgets/versionselectwidget.cpp | 107 ++++++++ .../widgets/versionselectwidget.h | 50 ++++ .../widgets/versionselectwidget.ui | 239 ++++++++++++++++++ .../widgets/waitanimationwidget.cpp | 35 +++ .../widgets/waitanimationwidget.h | 27 ++ .../widgets/waitanimationwidget.ui | 73 ++++++ 29 files changed, 1259 insertions(+), 9 deletions(-) create mode 100644 InstructorsAndTrainees/connectorToServer/Core/notifycontroller.cpp create mode 100644 InstructorsAndTrainees/connectorToServer/Core/notifycontroller.h create mode 100644 InstructorsAndTrainees/connectorToServer/Core/versioncontainer.cpp create mode 100644 InstructorsAndTrainees/connectorToServer/Core/versioncontainer.h create mode 100644 InstructorsAndTrainees/connectorToServer/streamingversiondata.h create mode 100644 InstructorsAndTrainees/resources/icons/762.gif create mode 100644 InstructorsAndTrainees/widgets/newversionwidget.cpp create mode 100644 InstructorsAndTrainees/widgets/newversionwidget.h create mode 100644 InstructorsAndTrainees/widgets/newversionwidget.ui create mode 100644 InstructorsAndTrainees/widgets/versionselectwidget.cpp create mode 100644 InstructorsAndTrainees/widgets/versionselectwidget.h create mode 100644 InstructorsAndTrainees/widgets/versionselectwidget.ui create mode 100644 InstructorsAndTrainees/widgets/waitanimationwidget.cpp create mode 100644 InstructorsAndTrainees/widgets/waitanimationwidget.h create mode 100644 InstructorsAndTrainees/widgets/waitanimationwidget.ui diff --git a/DOCS/Алексей/Board.md b/DOCS/Алексей/Board.md index 5507615..59fe3b9 100644 --- a/DOCS/Алексей/Board.md +++ b/DOCS/Алексей/Board.md @@ -13,6 +13,7 @@ kanban-plugin: board ## bugs - [ ] При старт стопе не сканится шэред дата +- [ ] GUI server: при неподключенном сервере, отключать попытку изменить версию ## feature client Unity diff --git a/InstructorsAndTrainees/CMakeLists.txt b/InstructorsAndTrainees/CMakeLists.txt index 8e13872..bb9f9f3 100644 --- a/InstructorsAndTrainees/CMakeLists.txt +++ b/InstructorsAndTrainees/CMakeLists.txt @@ -60,7 +60,12 @@ add_library(InstructorsAndTrainees SHARED connectorToServer/Core/tools.cpp connectorToServer/Core/tools.h connectorToServer/Core/FileData.h + connectorToServer/Core/notifycontroller.cpp + connectorToServer/Core/notifycontroller.h + connectorToServer/Core/versioncontainer.cpp + connectorToServer/Core/versioncontainer.h connectorToServer/Datas.h + connectorToServer/streamingversiondata.h messanger/messangerwidget.cpp messanger/messangerwidget.h messanger/messangerwidget.ui @@ -74,6 +79,16 @@ add_library(InstructorsAndTrainees SHARED docTasks/fimtaskswidget.ui docTasks/tasksAmmFim.cpp docTasks/tasksAmmFim.h + widgets/newversionwidget.cpp + widgets/newversionwidget.h + widgets/newversionwidget.ui + widgets/versionselectwidget.cpp + widgets/versionselectwidget.h + widgets/versionselectwidget.ui + widgets/waitanimationwidget.cpp + widgets/waitanimationwidget.h + widgets/waitanimationwidget.ui + resources.qrc ) diff --git a/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp b/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp index 1a1a735..82ebfbf 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp @@ -6,6 +6,7 @@ #include "instructor.h" #include "trainee.h" #include "group.h" +#include "streamingversiondata.h" #include @@ -327,7 +328,8 @@ ServerSettings *DataParser::getServerSettings() if(xmlReader.isStartElement()){ - if(xmlReader.name() == "ServerSettings"){ + if(xmlReader.name() == "ServerSettings") + { foreach(const QXmlStreamAttribute &attr, xmlReader.attributes()){ QString name = attr.name().toString(); diff --git a/InstructorsAndTrainees/connectorToServer/Core/notifycontroller.cpp b/InstructorsAndTrainees/connectorToServer/Core/notifycontroller.cpp new file mode 100644 index 0000000..7c09e24 --- /dev/null +++ b/InstructorsAndTrainees/connectorToServer/Core/notifycontroller.cpp @@ -0,0 +1,16 @@ +#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("Ошибка")); + warning.exec(); +} diff --git a/InstructorsAndTrainees/connectorToServer/Core/notifycontroller.h b/InstructorsAndTrainees/connectorToServer/Core/notifycontroller.h new file mode 100644 index 0000000..1b08ef9 --- /dev/null +++ b/InstructorsAndTrainees/connectorToServer/Core/notifycontroller.h @@ -0,0 +1,18 @@ +#ifndef NOTIFYCONTROLLER_H +#define NOTIFYCONTROLLER_H + +#include +#include + +class NotifyController : public QObject +{ + Q_OBJECT +public: + explicit NotifyController(QObject *parent = nullptr); + + void showWarning(QString text); +signals: + +}; + +#endif // NOTIFYCONTROLLER_H diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp index 05adfa5..4764af1 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp @@ -254,6 +254,17 @@ void RecognizeSystem::recognize(QTcpSocket *socket) packetType = PacketType::TYPE_NONE; } + + if(packetType == PacketType::BUSY) + { + emit sigAnimationActivated(true); + } + + if(packetType == PacketType::FREE) + { + emit sigAnimationActivated(false); + } + //xml-ответы на запросы к БД switch(packetType) { @@ -337,6 +348,21 @@ void RecognizeSystem::xmlParser(QByteArray array) { emit sigStartCompare(); } + + if (value == "BASEDELETETRY") + { + emit sigNotify(tr("Нельзя удалять базовую версию")); + } + + if (value == "TRYACTIVEDELETE") + { + emit sigNotify(tr("Нельзя удалять активную версию")); + } + + if (value == "DUPLICATEVERNAME") + { + emit sigNotify(tr("Такое имя уже существет")); + } } } } @@ -414,6 +440,74 @@ void RecognizeSystem::xmlParser(QByteArray array) } emit sigDeAuth(serverDeAuth); + + } + + + if(xmlReader.name() == "VersionList") + { + QList *serverStreamingVersionDataList = new QList; + xmlReader.readNext(); + + while (!xmlReader.atEnd()) + { + if(xmlReader.isStartElement()) + { + if(xmlReader.name() == "VersionData") + { + StreamingVersionData *data = new StreamingVersionData; + + foreach(const QXmlStreamAttribute &attr,xmlReader.attributes()) + { + QString name = attr.name().toString(); + QString value = attr.value().toString(); + + if(name == "Version") + data->setName(value); + else if(name == "Created") + data->setCreateData(QDateTime::fromString(value)); + else if(name == "isChangeable") + { + data->setIsChangeable(value.toInt()); + } + } + + serverStreamingVersionDataList->append(data); + } + } + + xmlReader.readNext(); + } + + emit sigShowServerDataList(serverStreamingVersionDataList); + } + + if(xmlReader.name() == "VersionData") + { + StreamingVersionData *serverVersion = new StreamingVersionData; + foreach(const QXmlStreamAttribute &attr,xmlReader.attributes()) + { + QString name = attr.name().toString(); + QString value = attr.value().toString(); + + if (name == "Version") + { + serverVersion->setName(value); + } + + if (name == "Created") + { + serverVersion->setCreateData(QDateTime::fromString(value)); + } + + if (name == "isChangeable") + { + serverVersion->setIsChangeable(value.toInt()); + } + + } + + emit sigSetVersion(serverVersion); } xmlReader.readNext(); diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h index a01e22d..961f334 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h @@ -4,6 +4,7 @@ #include #include #include +#include //#include #include #include "dataparser.h" @@ -48,9 +49,12 @@ signals: void sigAnswerQueryToDB_ListComputers(QList listComputers); void sigAnswerQueryToDB_ListClassrooms(QList listClassrooms); void sigAnswerQueryToDB_ListTasks(QList listTasks); - void sigAnswerQueryTasksXML_FIM(QList listTaskFim); void sigAnswerQueryTasksXML_AMM(QList listTaskAmm); + void sigShowServerDataList(QList *versions); + void sigSetVersion(StreamingVersionData* serverVersion); + void sigNotify(QString text); + void sigAnimationActivated(bool flag); private: QList *folderList; diff --git a/InstructorsAndTrainees/connectorToServer/Core/sendsystem.cpp b/InstructorsAndTrainees/connectorToServer/Core/sendsystem.cpp index 051dbf2..dadaaf7 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/sendsystem.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/sendsystem.cpp @@ -129,6 +129,43 @@ void SendSystem::sendFinish() socket->waitForReadyRead(100); } +void SendSystem::sendChangeVersion(StreamingVersionData *streamingVersion) +{ + QDataStream stream(socket); + stream.setVersion(QDataStream::Qt_DefaultCompiledVersion); + stream << PacketType::CHANGE_DATA_VERSION; + stream << streamingVersion->getViewName(); + + socket->waitForReadyRead(100); +} + +void SendSystem::sendDeleteVersion(StreamingVersionData *streamingVersion) +{ + QDataStream stream(socket); + stream.setVersion(QDataStream::Qt_DefaultCompiledVersion); + stream << PacketType::DELETE_DATA_VERSION; + stream << streamingVersion->getViewName(); + + socket->waitForReadyRead(100); +} + +void SendSystem::sendCopyVersion(QString versionName) +{ + QDataStream stream(socket); + stream.setVersion(QDataStream::Qt_DefaultCompiledVersion); + stream << PacketType::COPY_VERSION; + + stream << versionName; +} + +void SendSystem::sendPacketType(PacketType packetType) +{ + QDataStream stream(socket); + QByteArray data; + stream.setVersion(QDataStream::Qt_DefaultCompiledVersion); + + stream << packetType; +} SendSystem::~SendSystem() { diff --git a/InstructorsAndTrainees/connectorToServer/Core/sendsystem.h b/InstructorsAndTrainees/connectorToServer/Core/sendsystem.h index b260776..1e22eef 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/sendsystem.h +++ b/InstructorsAndTrainees/connectorToServer/Core/sendsystem.h @@ -5,6 +5,9 @@ #include #include +#include +#include "Core/tools.h" + class SendSystem :public QObject { Q_OBJECT @@ -19,6 +22,10 @@ public: void sendXMLAnswer(QByteArray array); ~SendSystem(); void sendFinish(); + void sendChangeVersion(StreamingVersionData *streamingVersion); + void sendDeleteVersion(StreamingVersionData *streamingVersion); + void sendCopyVersion(QString versionName); + void sendPacketType(PacketType packetType); signals: void sigSend(); diff --git a/InstructorsAndTrainees/connectorToServer/Core/tools.h b/InstructorsAndTrainees/connectorToServer/Core/tools.h index d64b155..cb040f0 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/tools.h +++ b/InstructorsAndTrainees/connectorToServer/Core/tools.h @@ -19,6 +19,8 @@ static QString displayTemp = staticDataFolderName + "/displayData.xml"; static QString streamingHashFilename = staticDataFolderName + "/streamingHash.xml"; static QString serverHash = staticDataFolderName + "/serverHash.xml"; +static QString cmd_CheckVersionList = "CHECKVERSIONLIST"; + enum PacketType{ TYPE_NONE = 0, TYPE_UNITY = 1, @@ -31,6 +33,7 @@ enum PacketType{ TYPE_XMLANSWER = 8, TYPE_QT = 9, TYPE_DISABLE = 11, + TYPE_CHECKVERSION = 13, TYPE_XMLANSWER_MESSAGE_FOR_GUI = 90, @@ -44,7 +47,14 @@ enum PacketType{ //xml-ответы на запросы AdditionalFiles TYPE_XMLANSWER_QUERY_TASKS_XML_FIM = 130, - TYPE_XMLANSWER_QUERY_TASKS_XML_AMM = 131 + TYPE_XMLANSWER_QUERY_TASKS_XML_AMM = 131, + + HASH_READY = 150, + CHANGE_DATA_VERSION = 151, + COPY_VERSION = 152, + DELETE_DATA_VERSION = 153, + BUSY = 154, + FREE = 155 }; Q_DECLARE_METATYPE(PacketType) diff --git a/InstructorsAndTrainees/connectorToServer/Core/versioncontainer.cpp b/InstructorsAndTrainees/connectorToServer/Core/versioncontainer.cpp new file mode 100644 index 0000000..1c8bd1c --- /dev/null +++ b/InstructorsAndTrainees/connectorToServer/Core/versioncontainer.cpp @@ -0,0 +1,42 @@ +#include "versioncontainer.h" + +VersionContainer::VersionContainer(QObject *parent) : + QObject(parent) +{ + +} + +VersionContainer::~VersionContainer() +{ + +} + +QString VersionContainer::getServerVersion() const +{ + return serverVersionData->getViewName(); +} + +QString VersionContainer::getLocalVersion() const +{ + return localVersionData->getViewName(); +} + +StreamingVersionData *VersionContainer::getLocalVersionData() const +{ + return localVersionData; +} + +void VersionContainer::setLocalVersionData(StreamingVersionData *value) +{ + localVersionData = value; +} + +StreamingVersionData *VersionContainer::getServerVersionData() const +{ + return serverVersionData; +} + +void VersionContainer::setServerVersionData(StreamingVersionData *value) +{ + serverVersionData = value; +} diff --git a/InstructorsAndTrainees/connectorToServer/Core/versioncontainer.h b/InstructorsAndTrainees/connectorToServer/Core/versioncontainer.h new file mode 100644 index 0000000..8b12c77 --- /dev/null +++ b/InstructorsAndTrainees/connectorToServer/Core/versioncontainer.h @@ -0,0 +1,30 @@ +#ifndef VERSIONCONTAINER_H +#define VERSIONCONTAINER_H + +#include +#include "connectorToServer/streamingversiondata.h" + +class VersionContainer : public QObject +{ + Q_OBJECT +public: + explicit VersionContainer(QObject *parent = nullptr); + ~VersionContainer(); + + QString getServerVersion() const; + QString getLocalVersion() const; + + + StreamingVersionData *getLocalVersionData() const; + void setLocalVersionData(StreamingVersionData *value); + + StreamingVersionData *getServerVersionData() const; + void setServerVersionData(StreamingVersionData *value); + +private: + StreamingVersionData *localVersionData; + StreamingVersionData *serverVersionData; + +}; + +#endif // VERSIONCONTAINER_H diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index de0f798..7742ca5 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -7,7 +7,11 @@ ConnectorToServer::ConnectorToServer(QObject *parent) : client(nullptr), dataParser(nullptr), sendSystem(nullptr), - recognizeSystem(nullptr) + recognizeSystem(nullptr), + versionSelectWidget(nullptr), + versionContainer(nullptr), + notifyController(nullptr), + waitAnimationWidget(nullptr) { initialize(); } @@ -96,6 +100,7 @@ bool ConnectorToServer::sendQueryTasksXML(QString type) void ConnectorToServer::SetConnectToServer() { emit sigSetConnect(dataParser->getServerSettings(),connectionThread); + } QList ConnectorToServer::getListTaskFim() @@ -249,6 +254,12 @@ int ConnectorToServer::getIdTraineeByLogin(QString login) return 0; } +void ConnectorToServer::showVersionSelect() +{ + QByteArray answer = dataParser->xmlAnswer_notify(cmd_CheckVersionList); + emit sigSendAnswerToServer(answer); +} + /* void ConnectorToServer::slot_AnswerQueryToDB(QList* listInstructors, QList* listTrainees, @@ -316,6 +327,11 @@ void ConnectorToServer::slot_msgToClientReady(QString login, QString text) sendMessageForClient(id, login, text); } +void ConnectorToServer::showServerList(QList *serverList) +{ + versionSelectWidget->fillView(serverList); +} + void ConnectorToServer::initialize() { createObjects(); @@ -325,6 +341,22 @@ void ConnectorToServer::initialize() emit sigInitializeClient(recognizeSystem,sendSystem,connectionThread); emit sigSetConnect(dataParser->getServerSettings(),connectionThread); + +// QByteArray answer = dataParser->xmlAnswer_notify() +// sendSystem->sendXMLAnswer() + +} + +void ConnectorToServer::activateLoadAnimation(bool flag) +{ + if (flag) + { + waitAnimationWidget->showWithPlay(); + } + else + { + waitAnimationWidget->hideWithStop(); + } } void ConnectorToServer::bindConnection() @@ -332,10 +364,13 @@ void ConnectorToServer::bindConnection() connect(this,&ConnectorToServer::sigInitializeClient,client,&TCPClient::initialize,Qt::AutoConnection); connect(this,&ConnectorToServer::sigSetConnect,client,&TCPClient::setConnect,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_MessageForGUI,this,&ConnectorToServer::signal_msgFromClientReady); + 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); @@ -347,8 +382,11 @@ void ConnectorToServer::bindConnection() connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryTasksXML_FIM,this,&ConnectorToServer::slot_AnswerQueryTasksXML_FIM); connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryTasksXML_AMM,this,&ConnectorToServer::slot_AnswerQueryTasksXML_AMM); + connect(recognizeSystem,&RecognizeSystem::sigAnimationActivated,this,&ConnectorToServer::activateLoadAnimation,Qt::AutoConnection); - connect(client,&TCPClient::signal_ConnectedToServer,this,&ConnectorToServer::signal_ConnectedToServer); + connect(client,&TCPClient::signal_ConnectedToServer,this,&ConnectorToServer::signal_ConnectedToServer,Qt::AutoConnection); + + connect(recognizeSystem,&RecognizeSystem::sigNotify,notifyController,&NotifyController::showWarning,Qt::AutoConnection); } void ConnectorToServer::createObjects() @@ -360,12 +398,25 @@ void ConnectorToServer::createObjects() dataParser = new DataParser; + waitAnimationWidget = new WaitAnimationWidget; + sendSystem = new SendSystem; sendSystem->moveToThread(connectionThread); recognizeSystem = new RecognizeSystem; recognizeSystem->moveToThread(connectionThread); + notifyController = new NotifyController; + versionContainer = new VersionContainer; + versionSelectWidget = new VersionSelectWidget; + versionSelectWidget->initialize(sendSystem,versionContainer,notifyController); + + QMovie *movie = new QMovie(":/resources/icons/762.gif"); + + waitAnimationWidget->setParent(versionSelectWidget); + waitAnimationWidget->initialize(movie,versionSelectWidget); + waitAnimationWidget->moveToThread(connectionThread); + connectionThread->start(); connectionThread->setPriority(QThread::HighestPriority); } diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.h b/InstructorsAndTrainees/connectorToServer/connectortoserver.h index 9f158c7..5167542 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.h +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.h @@ -2,6 +2,8 @@ #define CONNECTORTOSERVER_H #include +#include +#include #include "Core\tcpclient.h" #include "Core\dataparser.h" #include "Core\sendsystem.h" @@ -12,6 +14,7 @@ #include "computer.h" #include "classroom.h" #include "task.h" +#include "streamingversiondata.h" class ConnectorToServer : public QObject { @@ -54,7 +57,9 @@ public: Group getGroup(int id); int getIdTraineeByLogin(QString login); + void showVersionSelect(); + void activateLoadAnimation(bool flag); public slots: /*void slot_AnswerQueryToDB(QList* listInstructors, QList* listTrainees, @@ -71,6 +76,7 @@ public slots: void slot_AnswerQueryTasksXML_AMM(QList listTaskAmm); void slot_msgToClientReady(QString login, QString text); + void showServerList(QList *serverList); signals: void sigSetConnect(ServerSettings* serverSettings,QThread *thread); @@ -93,6 +99,7 @@ signals: void signal_InitMessanger(QList listTrainees); void signal_msgFromClientReady(QString login, QString text); + void sigSendAnswerToServer(QByteArray array); private: @@ -106,6 +113,10 @@ private: DataParser *dataParser; SendSystem *sendSystem; RecognizeSystem *recognizeSystem; + VersionSelectWidget *versionSelectWidget; + VersionContainer *versionContainer; + NotifyController *notifyController; + WaitAnimationWidget *waitAnimationWidget; //Списочная модель БД СУО QList listInstructors; diff --git a/InstructorsAndTrainees/connectorToServer/streamingversiondata.h b/InstructorsAndTrainees/connectorToServer/streamingversiondata.h new file mode 100644 index 0000000..d190385 --- /dev/null +++ b/InstructorsAndTrainees/connectorToServer/streamingversiondata.h @@ -0,0 +1,74 @@ +#ifndef STREAMINGVERSIONDATA_H +#define STREAMINGVERSIONDATA_H + +#include +#include + +class StreamingVersionData +{ +public: + + StreamingVersionData(){} + + StreamingVersionData(QString absoltePath,QString viewName,QDateTime data,qint32 size) + { + this->absolutePath = absoltePath; + this->viewName = viewName; + this->createData = data; + this->size = size; + } + + void setName(QString viewName) + { + this->viewName = viewName; + } + + void setCreateData(QDateTime data) + { + this->createData = data; + } + + ~StreamingVersionData(); + + QString getAbsolutPath() const + { + return absolutePath; + } + + QString getViewName() const + { + return viewName; + } + + QDateTime getCreateData() const + { + return createData; + } + + qint32 getSize() const + { + return size; + } + + bool getIsChangeable() const + { + return isChangeable; + } + void setIsChangeable(bool value) + { + isChangeable = value; + } + + +private: + QString absolutePath; + QString viewName; + QDateTime createData; + bool isChangeable; + qint32 size; +}; + +#endif // STREAMINGVERSIONDATA_H + + + diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index d849704..42bda85 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -68,7 +68,7 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : ui->verticalLayout_1->addWidget(viewerInstructors); ui->verticalLayout_2->addWidget(docTasksWidget); ui->verticalLayout_2->addWidget(fIMtasksWidget); - + ui->btnSetVersion->hide(); viewerTrainees->setMinimumHeight(800); viewerInstructors->setMinimumSize(1800, 300); messangerWidget->setMinimumSize(500, 600); @@ -170,7 +170,7 @@ void InstructorsAndTraineesWidget::checkLoginResult(ServerAuthorization *serverA viewerTrainees->setAuthComplited(true); Q_EMIT signal_NeedUpdateUI(true, true); - + ui->btnSetVersion->show(); ui->btnAuthorizationInstructor->setText(tr("Deauthorization Instructor")); updateLabelLoggedInInstructor(serverAuth->Login, serverAuth->ClientName); @@ -200,7 +200,6 @@ void InstructorsAndTraineesWidget::checkDeLoginResult(ServerDeAuthorization *ser Q_EMIT signal_NeedUpdateUI(true, false); ui->btnAuthorizationInstructor->setText(tr("Authorization Instructor")); - updateLabelLoggedInInstructor("",""); QMessageBox::information(this, tr("Instructor deauthorization"), tr("Successfully!")); @@ -225,7 +224,7 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state) {//Сервер отключен ui->btnConnectionToServer->setEnabled(true); ui->btnAuthorizationInstructor->setEnabled(false); - + ui->btnSetVersion->hide(); ui->lblDBisConnected->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleGray.png"))); } } @@ -325,3 +324,8 @@ void InstructorsAndTraineesWidget::on_btnUpdateStyleSheet_clicked() { updateMyStyleSheet(); } + +void InstructorsAndTraineesWidget::on_btnSetVersion_clicked() +{ + connectorToServer->showVersionSelect(); +} diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.h b/InstructorsAndTrainees/instructorsandtraineeswidget.h index 5f0beaa..29e524d 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.h +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.h @@ -63,6 +63,8 @@ private Q_SLOTS: void on_btnAuthorizationInstructor_clicked(); void on_btnUpdateStyleSheet_clicked(); + void on_btnSetVersion_clicked(); + private: //Авторизация инструктора локальная bool authorizationInstructorDialog(QWidget* parent = nullptr); diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.ui b/InstructorsAndTrainees/instructorsandtraineeswidget.ui index 164f714..7b72e42 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.ui +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.ui @@ -203,6 +203,19 @@ + + + + + 58 + 58 + + + + ChangeVersion + + + diff --git a/InstructorsAndTrainees/resources.qrc b/InstructorsAndTrainees/resources.qrc index 56c11bf..d15df9e 100644 --- a/InstructorsAndTrainees/resources.qrc +++ b/InstructorsAndTrainees/resources.qrc @@ -40,5 +40,6 @@ resources/icons/task.png resources/icons/procedure.png resources/icons/malfunction.png + resources/icons/762.gif diff --git a/InstructorsAndTrainees/resources/icons/762.gif b/InstructorsAndTrainees/resources/icons/762.gif new file mode 100644 index 0000000000000000000000000000000000000000..d1a1bca8b7856ad73866ccb7f064d5ce0d1a9eed GIT binary patch literal 9842 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 Jl48`K{XgQexzGRr literal 0 HcmV?d00001 diff --git a/InstructorsAndTrainees/widgets/newversionwidget.cpp b/InstructorsAndTrainees/widgets/newversionwidget.cpp new file mode 100644 index 0000000..980781e --- /dev/null +++ b/InstructorsAndTrainees/widgets/newversionwidget.cpp @@ -0,0 +1,37 @@ +#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); +} + + +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; +} diff --git a/InstructorsAndTrainees/widgets/newversionwidget.h b/InstructorsAndTrainees/widgets/newversionwidget.h new file mode 100644 index 0000000..dbc62e5 --- /dev/null +++ b/InstructorsAndTrainees/widgets/newversionwidget.h @@ -0,0 +1,31 @@ +#ifndef NEWVERSIONWIDGET_H +#define NEWVERSIONWIDGET_H + +#include +#include + +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(); + +private: + Ui::NewVersionWidget *ui; + VersionSelectWidget *versionSelectWidget; +}; + +#endif // NEWVERSIONWIDGET_H diff --git a/InstructorsAndTrainees/widgets/newversionwidget.ui b/InstructorsAndTrainees/widgets/newversionwidget.ui new file mode 100644 index 0000000..9ba102e --- /dev/null +++ b/InstructorsAndTrainees/widgets/newversionwidget.ui @@ -0,0 +1,219 @@ + + + NewVersionWidget + + + + 0 + 0 + 325 + 200 + + + + + 0 + 0 + + + + Создать копию... + + + true + + + + + + + + + true + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + 0 + 0 + + + + Базовая версия: + + + + + + + TextLabel + + + + + + + + + 6 + + + 5 + + + 5 + + + 20 + + + 5 + + + + + Новое название: + + + + + + + + 0 + 0 + + + + + 150 + 30 + + + + + 60 + 30 + + + + + + + + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + Создать + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + Отмена + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 40 + 20 + + + + + + + + + + + + + + diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.cpp b/InstructorsAndTrainees/widgets/versionselectwidget.cpp new file mode 100644 index 0000000..2f76f3c --- /dev/null +++ b/InstructorsAndTrainees/widgets/versionselectwidget.cpp @@ -0,0 +1,107 @@ +#include "versionselectwidget.h" +#include "ui_versionselectwidget.h" +#include "ui_versionselectwidget.h" + +#include + +VersionSelectWidget::VersionSelectWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::VersionSelectWidget), + selectedVersion(nullptr) +{ + ui->setupUi(this); + setWindowFlags(Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint); + setAttribute(Qt::WA_ShowModal,true); +} + +void VersionSelectWidget::initialize(SendSystem *sendSystem,VersionContainer *versionContainer,NotifyController *notifyController) +{ + 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); + this->versionContainer = versionContainer; + hide(); + setWindowTitle(tr("Управление версиями")); +} + +void VersionSelectWidget::fillView(QList *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_itemDoubleClicked(QListWidgetItem *item) +{ + foreach(StreamingVersionData *data,*serverDataList) + { + if(data->getViewName() == item->text()) + { + QString info = "Имя версии: " + data->getViewName() + "\n"; + info.append("Создан: " + data->getCreateData().toString()); + ui->infoValue->setText(info); + selectedVersion = data; + } + } +} + + +void VersionSelectWidget::on_createDuplicateButton_clicked() +{ + NewVersionWidget *newVersionWidget = new NewVersionWidget; + newVersionWidget->initialize(this,selectedVersion->getViewName()); + newVersionWidget->show(); +} + +void VersionSelectWidget::sendCopyEmit(QString newName) +{ + QString result = selectedVersion->getViewName() + ";" + newName; + + if (selectedVersion == nullptr) + { + sigSendNotify(tr("Версия не выбрана")); + return; + } + + //versionContainer->setLocalVersionData(selectedVersion); + emit sigSendCopyVersion(result); +} + +void VersionSelectWidget::on_DeleteVersionButton_clicked() +{ + if (selectedVersion == nullptr) + { + sigSendNotify(tr("Версия не выбрана")); + return; + } + + emit sigSendDeleteVersion(selectedVersion); +} + +void VersionSelectWidget::on_switchServerVersionButton_clicked() +{ + if (selectedVersion == nullptr) + { + sigSendNotify(tr("Версия не выбрана")); + return; + } + + versionContainer->setServerVersionData(selectedVersion); + ui->verValue->setText(selectedVersion->getViewName()); + emit sigSendSwitchVersion(selectedVersion); +} + + + +VersionSelectWidget::~VersionSelectWidget() +{ + delete ui; +} + diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.h b/InstructorsAndTrainees/widgets/versionselectwidget.h new file mode 100644 index 0000000..b2dedb7 --- /dev/null +++ b/InstructorsAndTrainees/widgets/versionselectwidget.h @@ -0,0 +1,50 @@ +#ifndef VERSIONSELECTWIDGET_H +#define VERSIONSELECTWIDGET_H + +#include +#include + +#include +#include +#include +#include +#include + +namespace Ui { +class VersionSelectWidget; +} + +class VersionSelectWidget : public QWidget +{ + Q_OBJECT + +public: + explicit VersionSelectWidget(QWidget *parent = nullptr); + + void initialize(SendSystem *sendSystem,VersionContainer *versionContainer,NotifyController *notifyController); + void fillView(QList *serverData); + void sendCopyEmit(QString newName); + + ~VersionSelectWidget(); +private slots: + void on_verListView_itemDoubleClicked(QListWidgetItem *item); + void on_createDuplicateButton_clicked(); + void on_DeleteVersionButton_clicked(); + void on_switchServerVersionButton_clicked(); + +signals: + void sigSendDeleteVersion(StreamingVersionData *streaming); + void sigSendSwitchVersion(StreamingVersionData *selectVersion); + void sigSendCopyVersion(QString versionPair); + void sigSendNotify(QString message); + +private: + Ui::VersionSelectWidget *ui; + SendSystem *sendSystem; + QList *serverDataList; + VersionContainer *versionContainer; + NotifyController *notifyController; + StreamingVersionData *selectedVersion; +}; + +#endif // VERSIONSELECTWIDGET_H diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.ui b/InstructorsAndTrainees/widgets/versionselectwidget.ui new file mode 100644 index 0000000..6dbca69 --- /dev/null +++ b/InstructorsAndTrainees/widgets/versionselectwidget.ui @@ -0,0 +1,239 @@ + + + VersionSelectWidget + + + + 0 + 0 + 606 + 229 + + + + + 0 + 0 + + + + Form + + + false + + + + + 0 + 0 + 301 + 171 + + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + Calibri + 12 + + + + Qt::PreventContextMenu + + + Доступные версии на сервере + + + + + + + + + + + + 0 + 180 + 601 + 41 + + + + + 6 + + + + + QLayout::SetMinimumSize + + + 5 + + + 0 + + + + + + 0 + 0 + + + + + 9 + + + + Создать копию + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 9 + + + + Удалить + + + + + + + + + + 0 + 0 + + + + + 9 + + + + Переключить версию сервера + + + + + + + + + 310 + 0 + 291 + 131 + + + + + QLayout::SetDefaultConstraint + + + + + + 0 + 0 + + + + Информация: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + Тут будет информация о версии... + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + 310 + 140 + 291 + 31 + + + + + + + Текущая версия сервера: + + + + + + + none + + + + + + + + + diff --git a/InstructorsAndTrainees/widgets/waitanimationwidget.cpp b/InstructorsAndTrainees/widgets/waitanimationwidget.cpp new file mode 100644 index 0000000..547a79f --- /dev/null +++ b/InstructorsAndTrainees/widgets/waitanimationwidget.cpp @@ -0,0 +1,35 @@ +#include "waitanimationwidget.h" +#include "ui_waitanimationwidget.h" + +WaitAnimationWidget::WaitAnimationWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::WaitAnimationWidget), + loadingMovie(nullptr) +{ + ui->setupUi(this); +} + +void WaitAnimationWidget::initialize(QMovie *movie,QWidget *parent) +{ + ui->MovieLabel->setMovie(movie); + loadingMovie = movie; + setFixedSize(parent->width(),parent->height()); + hide(); +} + +void WaitAnimationWidget::showWithPlay() +{ + show(); + loadingMovie->start(); +} + +void WaitAnimationWidget::hideWithStop() +{ + hide(); + loadingMovie->stop(); +} + +WaitAnimationWidget::~WaitAnimationWidget() +{ + delete ui; +} diff --git a/InstructorsAndTrainees/widgets/waitanimationwidget.h b/InstructorsAndTrainees/widgets/waitanimationwidget.h new file mode 100644 index 0000000..e9ea6a9 --- /dev/null +++ b/InstructorsAndTrainees/widgets/waitanimationwidget.h @@ -0,0 +1,27 @@ +#ifndef WAITANIMATIONWIDGET_H +#define WAITANIMATIONWIDGET_H + +#include +#include + +namespace Ui { +class WaitAnimationWidget; +} + +class WaitAnimationWidget : public QWidget +{ + Q_OBJECT + +public: + explicit WaitAnimationWidget(QWidget *parent = nullptr); + void initialize(QMovie *movie,QWidget *parent); + void showWithPlay(); + void hideWithStop(); + ~WaitAnimationWidget(); + +private: + Ui::WaitAnimationWidget *ui; + QMovie *loadingMovie; +}; + +#endif // WAITANIMATIONWIDGET_H diff --git a/InstructorsAndTrainees/widgets/waitanimationwidget.ui b/InstructorsAndTrainees/widgets/waitanimationwidget.ui new file mode 100644 index 0000000..4819a89 --- /dev/null +++ b/InstructorsAndTrainees/widgets/waitanimationwidget.ui @@ -0,0 +1,73 @@ + + + WaitAnimationWidget + + + + 0 + 0 + 635 + 293 + + + + + 0 + 0 + + + + Form + + + false + + + background-color:rgba(0,0,0,50%); + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + 0 + 0 + + + + background-color:rgba(0,0,0,50%) + + + + + + :/resources/icons/762.gif + + + Qt::AlignCenter + + + + + + + + + + + + From 3baccee9b34cce80fee5ad2faf273dbc25921c06 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 21 Jan 2025 12:36:24 +0300 Subject: [PATCH 07/77] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B4=D0=B0=D1=87=D1=83=20tasksAMM.xml=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D1=83=20GUI-?= =?UTF-8?q?=D0=BA=D0=BB=D0=B8=D0=B5=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Core/recognizesystem.cpp | 38 ++++++++++----- .../connectorToServer/Core/recognizesystem.h | 4 +- .../connectorToServer/Core/tools.cpp | 2 +- .../connectorToServer/connectortoserver.cpp | 16 +++---- .../connectorToServer/connectortoserver.h | 12 ++--- .../docTasks/doctaskswidget.cpp | 47 ++++++++++--------- .../docTasks/doctaskswidget.h | 10 ++-- .../docTasks/doctaskswidget.ui | 11 +++++ .../docTasks/fimtaskswidget.cpp | 17 ++++--- .../docTasks/fimtaskswidget.h | 6 +-- .../instructorsandtraineeswidget.cpp | 2 +- ServerLMS/Systems/processingsystem.cpp | 15 ++++-- ServerLMS/Systems/updatecontroller.cpp | 11 +---- ServerLMS/Systems/updatecontroller.h | 2 +- ServerLMS/clienthandler.cpp | 5 ++ 15 files changed, 117 insertions(+), 81 deletions(-) diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp index 05adfa5..fd797f1 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp @@ -2,9 +2,9 @@ #include #include #include +#include #include "instructor.h" #include "tasksAmmFim.h" -#include "fimtaskswidget.h" RecognizeSystem::RecognizeSystem(QObject *parent): @@ -282,12 +282,25 @@ void RecognizeSystem::recognize(QTcpSocket *socket) if(packetType == PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_FIM || packetType == PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_AMM) { - QByteArray array; - stream.startTransaction(); - stream >> array; + QByteArray array; + QString xmlFileName = ""; - if(!stream.commitTransaction()) - continue; + if(packetType == PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_FIM) + xmlFileName = "./AdditionalFiles/tasksFIM.xml"; + else + xmlFileName = "./AdditionalFiles/tasksAMM.xml"; + + QFile xmlInFile(xmlFileName); + if (!xmlInFile.open(QFile::ReadOnly | QFile::Text)) + { + QMessageBox::critical(nullptr, tr("Attention!"), tr("The file could not be opened ") + xmlFileName); + return; + } + else + { + array = xmlInFile.readAll(); + xmlInFile.close(); + } xmlParserQueryTasksXML(packetType, array); @@ -567,15 +580,14 @@ void RecognizeSystem::xmlParserQueryToDB(PacketType packetType, QByteArray array void RecognizeSystem::xmlParserQueryTasksXML(PacketType packetType, QByteArray array) { - QList listTaskAmmFim; - - //парсинг XML - listTaskAmmFim = FIMtasksWidget::loadTasksAmmFimFromXML(array); - if(packetType == TYPE_XMLANSWER_QUERY_TASKS_XML_FIM) - emit sigAnswerQueryTasksXML_FIM(listTaskAmmFim); + { + emit sigAnswerQueryTasksXML_FIM(array); + } else if(packetType == TYPE_XMLANSWER_QUERY_TASKS_XML_AMM) - emit sigAnswerQueryTasksXML_AMM(listTaskAmmFim); + { + emit sigAnswerQueryTasksXML_AMM(array); + } } void RecognizeSystem::checkAccessType(QString type) diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h index a01e22d..e02a739 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h @@ -49,8 +49,8 @@ signals: void sigAnswerQueryToDB_ListClassrooms(QList listClassrooms); void sigAnswerQueryToDB_ListTasks(QList listTasks); - void sigAnswerQueryTasksXML_FIM(QList listTaskFim); - void sigAnswerQueryTasksXML_AMM(QList listTaskAmm); + void sigAnswerQueryTasksXML_FIM(QByteArray array); + void sigAnswerQueryTasksXML_AMM(QByteArray array); private: QList *folderList; diff --git a/InstructorsAndTrainees/connectorToServer/Core/tools.cpp b/InstructorsAndTrainees/connectorToServer/Core/tools.cpp index 1461a9d..2d933c9 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/tools.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/tools.cpp @@ -27,7 +27,7 @@ QString Tools::createLocalPath(QString path) QString Tools::createFullPath(QString path) { QString fullPath; - qint8 pos = path.indexOf("Application"); + qint8 pos = path.indexOf("AdditionalFiles"); QString localPath = path.remove(0,--pos); diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index de0f798..719e864 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -98,14 +98,14 @@ void ConnectorToServer::SetConnectToServer() emit sigSetConnect(dataParser->getServerSettings(),connectionThread); } -QList ConnectorToServer::getListTaskFim() +QByteArray ConnectorToServer::getListTaskFimArray() { - return listTaskFim; + return listTaskFimArray; } -QList ConnectorToServer::getListTaskAmm() +QByteArray ConnectorToServer::getListTaskAmmArray() { - return listTaskAmm; + return listTaskAmmArray; } QList ConnectorToServer::getListInstructors() @@ -297,15 +297,15 @@ void ConnectorToServer::slot_AnswerQueryToDB_ListTasks(QList listTasks) //emit signal_UpdateDB(false, true); } -void ConnectorToServer::slot_AnswerQueryTasksXML_FIM(QList listTaskFim) +void ConnectorToServer::slot_AnswerQueryTasksXML_FIM(QByteArray array) { - this->listTaskFim = listTaskFim; + this->listTaskFimArray = array; emit signal_UpdateTasksFIM(); } -void ConnectorToServer::slot_AnswerQueryTasksXML_AMM(QList listTaskAmm) +void ConnectorToServer::slot_AnswerQueryTasksXML_AMM(QByteArray array) { - this->listTaskAmm = listTaskAmm; + this->listTaskAmmArray = array; emit signal_UpdateTasksAMM(); } diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.h b/InstructorsAndTrainees/connectorToServer/connectortoserver.h index 9f158c7..4152a75 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.h +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.h @@ -30,8 +30,8 @@ public: void SetConnectToServer(); public: - QList getListTaskFim(); - QList getListTaskAmm(); + QByteArray getListTaskFimArray(); + QByteArray getListTaskAmmArray(); public: //Запросы к БД (локальной) @@ -67,8 +67,8 @@ public slots: void slot_AnswerQueryToDB_ListClassrooms(QList listClassrooms); void slot_AnswerQueryToDB_ListTasks(QList listTasks); - void slot_AnswerQueryTasksXML_FIM(QList listTaskFim); - void slot_AnswerQueryTasksXML_AMM(QList listTaskAmm); + void slot_AnswerQueryTasksXML_FIM(QByteArray array); + void slot_AnswerQueryTasksXML_AMM(QByteArray array); void slot_msgToClientReady(QString login, QString text); @@ -115,8 +115,8 @@ private: QList listClassrooms; QList listTasks; - QList listTaskFim; - QList listTaskAmm; + QByteArray listTaskFimArray; + QByteArray listTaskAmmArray; }; #endif // CONNECTORTOSERVER_H diff --git a/InstructorsAndTrainees/docTasks/doctaskswidget.cpp b/InstructorsAndTrainees/docTasks/doctaskswidget.cpp index fe44cb0..91a6bef 100644 --- a/InstructorsAndTrainees/docTasks/doctaskswidget.cpp +++ b/InstructorsAndTrainees/docTasks/doctaskswidget.cpp @@ -5,9 +5,10 @@ #include "doctaskswidget.h" #include "ui_doctaskswidget.h" -DocTasksWidget::DocTasksWidget(QWidget *parent) : +DocTasksWidget::DocTasksWidget(ConnectorToServer* connectorToServer, QWidget *parent) : QWidget(parent), - ui(new Ui::DocTasksWidget) + ui(new Ui::DocTasksWidget), + connectorToServer(connectorToServer) { ui->setupUi(this); @@ -19,9 +20,9 @@ DocTasksWidget::DocTasksWidget(QWidget *parent) : preparationTreeWidget(); - loadDocTasksFromXML(); + //loadDocTasksFromXML(); - updateTreeWidget(); + //updateTreeWidget(); } DocTasksWidget::~DocTasksWidget() @@ -72,7 +73,10 @@ void DocTasksWidget::loadTasksAMM() //Обновление дерева treeWidget->clear(); - //TODO собственно обновление дерева + QByteArray array = connectorToServer->getListTaskAmmArray(); + loadDocTasksFromXML(array); + + updateTreeWidget(); } void DocTasksWidget::domElementParser(QDomElement element, Module* moduleParent) @@ -176,29 +180,21 @@ void DocTasksWidget::domElementParser(QDomElement element, Module* moduleParent) }while (! (childElement = childElement.nextSiblingElement()).isNull()); } -void DocTasksWidget::loadDocTasksFromXML() +void DocTasksWidget::loadDocTasksFromXML(QByteArray array) { + deleteAllModuls(); + QDomDocument docTasksDOM; - QString xmlFileName = "./docs.xml"; - QFile xmlInFile(xmlFileName); - if (!xmlInFile.open(QFile::ReadOnly | QFile::Text)) - { - QMessageBox::critical(nullptr, tr("Attention!"), tr("The file could not be opened ") + xmlFileName); + + docTasksDOM.setContent(array); + + QDomElement manifestElement = docTasksDOM.firstChildElement("manifest"); + if(manifestElement.isNull()) return; - } - else - { - docTasksDOM.setContent(xmlInFile.readAll()); - xmlInFile.close(); - QDomElement manifestElement = docTasksDOM.firstChildElement("manifest"); - if(manifestElement.isNull()) - return; + //deleteAllModuls(); - //deleteAllModuls(); - - domElementParser(manifestElement, nullptr); - } + domElementParser(manifestElement, nullptr); } void DocTasksWidget::deleteAllModuls() @@ -297,3 +293,8 @@ void DocTasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* pare itemModule->setText(ColumnsTree::clmn_ID, ID); } + +void DocTasksWidget::on_btnUpdateTasks_clicked() +{ + connectorToServer->sendQueryTasksXML("amm"); +} diff --git a/InstructorsAndTrainees/docTasks/doctaskswidget.h b/InstructorsAndTrainees/docTasks/doctaskswidget.h index ed7b690..abfa327 100644 --- a/InstructorsAndTrainees/docTasks/doctaskswidget.h +++ b/InstructorsAndTrainees/docTasks/doctaskswidget.h @@ -5,6 +5,7 @@ #include #include #include "module.h" +#include "connectortoserver.h" namespace Ui { class DocTasksWidget; @@ -21,19 +22,21 @@ private: }; public: - explicit DocTasksWidget(QWidget *parent = nullptr); + explicit DocTasksWidget(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); ~DocTasksWidget(); private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); + void on_btnUpdateTasks_clicked(); + public Q_SLOTS: //Слот обработки сигнала необходимости обновления интерфейса void slot_NeedUpdateUI(); private: + void loadDocTasksFromXML(QByteArray array); void domElementParser(QDomElement element, Module* moduleParent); - void loadDocTasksFromXML(); void deleteAllModuls(); Module* searchModuleByID(int id); @@ -46,10 +49,11 @@ private: private: Ui::DocTasksWidget *ui; + ConnectorToServer* connectorToServer; QTreeWidget* treeWidget; +private: QList listAllModules; - }; #endif // DOCTASKSWIDGET_H diff --git a/InstructorsAndTrainees/docTasks/doctaskswidget.ui b/InstructorsAndTrainees/docTasks/doctaskswidget.ui index cefa158..1aa3eb6 100644 --- a/InstructorsAndTrainees/docTasks/doctaskswidget.ui +++ b/InstructorsAndTrainees/docTasks/doctaskswidget.ui @@ -49,6 +49,17 @@ + + + + + + ... + + + + + diff --git a/InstructorsAndTrainees/docTasks/fimtaskswidget.cpp b/InstructorsAndTrainees/docTasks/fimtaskswidget.cpp index a726b85..8f46ced 100644 --- a/InstructorsAndTrainees/docTasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/docTasks/fimtaskswidget.cpp @@ -25,9 +25,9 @@ FIMtasksWidget::~FIMtasksWidget() delete ui; } -QList FIMtasksWidget::loadTasksAmmFimFromXML(QByteArray array) +void FIMtasksWidget::loadTasksAmmFimFromXML(QByteArray array) { - QList listTaskAmmFim; + listTaskAmmFim.clear(); QDomDocument docTasksDOM; @@ -35,11 +35,11 @@ QList FIMtasksWidget::loadTasksAmmFimFromXML(QByteArray array) QDomElement RRJTasksElement = docTasksDOM.firstChildElement("RRJTasks"); if(RRJTasksElement.isNull()) - return listTaskAmmFim; + return; QDomElement taskElement = RRJTasksElement.firstChildElement(); if(taskElement.isNull()) - return listTaskAmmFim; + return; do {/*task*/ @@ -101,10 +101,10 @@ QList FIMtasksWidget::loadTasksAmmFimFromXML(QByteArray array) } }while (! (taskElement = taskElement.nextSiblingElement()).isNull()); - return listTaskAmmFim; + return; } -void FIMtasksWidget::fillTree(QList listTaskAmmFim) +void FIMtasksWidget::fillTree() { for(int i = 0; i < listTaskAmmFim.count(); i++) {/*Задачи*/ @@ -178,8 +178,11 @@ void FIMtasksWidget::loadTasksFIM() //Обновление дерева ui->treeWidget->clear(); + QByteArray array = connectorToServer->getListTaskFimArray(); + loadTasksAmmFimFromXML(array); + //собственно обновление дерева - fillTree(connectorToServer->getListTaskFim()); + fillTree(); } void FIMtasksWidget::on_btnUpdateTasks_clicked() diff --git a/InstructorsAndTrainees/docTasks/fimtaskswidget.h b/InstructorsAndTrainees/docTasks/fimtaskswidget.h index a01b6cb..28b5686 100644 --- a/InstructorsAndTrainees/docTasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/docTasks/fimtaskswidget.h @@ -24,10 +24,10 @@ public: ~FIMtasksWidget(); public: - static QList loadTasksAmmFimFromXML(QByteArray array); + void loadTasksAmmFimFromXML(QByteArray array); private: - void fillTree(QList listTaskAmmFim); + void fillTree(); void preparationTreeWidget(); void reSetHeadTreeWidget(); @@ -40,7 +40,7 @@ private: public: QString userName; - //QList listTaskAmmFim; + QList listTaskAmmFim; private slots: void on_btnUpdateTasks_clicked(); diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index d849704..46ebed5 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -56,7 +56,7 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : connect(connectorToServer,&ConnectorToServer::signal_msgFromClientReady,messangerWidget,&MessangerWidget::slot_msgFromClientReady); - docTasksWidget = new DocTasksWidget(this); + docTasksWidget = new DocTasksWidget(connectorToServer, this); fIMtasksWidget = new FIMtasksWidget(connectorToServer, this); connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksFIM, fIMtasksWidget, &FIMtasksWidget::slot_NeedUpdateUI); diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 552e634..4a1ccdb 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -234,14 +234,21 @@ void ProcessingSystem::processingClientQueryTasksXML(ClientHandler *client, Clie QByteArray arrayAnswer; QString nameFile = ""; + QString pathFile = ""; if(clientQueryTasksXML.Type == "fim") + { nameFile = tasksFIMfileName; + pathFile = updateController->getPathAdditionalFile(nameFile); + client->sendFileBlock(pathFile); + client->sendPacketType(PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_FIM); + } else if(clientQueryTasksXML.Type == "amm") + { nameFile = tasksAMMfileName; - - arrayAnswer = updateController->getAdditionalFile(nameFile); - - client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_FIM); + pathFile = updateController->getPathAdditionalFile(nameFile); + client->sendFileBlock(pathFile); + client->sendPacketType(PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_AMM); + } } void ProcessingSystem::processingToClientMessage(ClientHandler *client, ToClientMessage toClientMessage) diff --git a/ServerLMS/Systems/updatecontroller.cpp b/ServerLMS/Systems/updatecontroller.cpp index 850eee6..22ec26f 100644 --- a/ServerLMS/Systems/updatecontroller.cpp +++ b/ServerLMS/Systems/updatecontroller.cpp @@ -355,17 +355,10 @@ QList* UpdateController::calculateHash(QString path) return files; } -QByteArray UpdateController::getAdditionalFile(QString name) +QString UpdateController::getPathAdditionalFile(QString name) { QString path = Tools::createSharedPath("/" + assetManager->getCurrentVersionData()->getViewName() + "/AdditionalFiles" + name); - QFile addFile(path); - QByteArray array; - if(addFile.open(QIODevice::ReadOnly)){ - array = addFile.readAll(); - addFile.close(); - } - - return array; + return path; } QByteArray UpdateController::getLocalHash() diff --git a/ServerLMS/Systems/updatecontroller.h b/ServerLMS/Systems/updatecontroller.h index 81232fc..01d2a7c 100644 --- a/ServerLMS/Systems/updatecontroller.h +++ b/ServerLMS/Systems/updatecontroller.h @@ -56,7 +56,7 @@ public: void saveVersionToFile(StreamingVersionData *streamingVersion); void xmlFileDataParse(QByteArray array); - QByteArray getAdditionalFile(QString name); + QString getPathAdditionalFile(QString name); public slots: void changeAssetVersion(QString versionName); diff --git a/ServerLMS/clienthandler.cpp b/ServerLMS/clienthandler.cpp index 2ab918e..bf91696 100644 --- a/ServerLMS/clienthandler.cpp +++ b/ServerLMS/clienthandler.cpp @@ -102,6 +102,11 @@ void ClientHandler::sendXmlAnswer(QByteArray array, PacketType packetType) emit sigSendXmlAnswer(array, packetType); } +void ClientHandler::sendFileBlock(QString path) +{ + emit sigFileBlock(path); +} + bool ClientHandler::getIsSendStopped() { return emit sigGetIsSendStopped(); From adae8f43eb17183ab210d0891e7f84f8c2fb53e9 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 21 Jan 2025 12:45:27 +0300 Subject: [PATCH 08/77] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=BF=D0=BA=D1=83=20Tasks=20=D0=B8=D0=B7=20IaT=20?= =?UTF-8?q?=D1=81=D0=BE=20=D1=81=D1=82=D0=B0=D1=80=D1=8B=D0=BC=D0=B8=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/CMakeLists.txt | 3 -- InstructorsAndTrainees/tasks/taskswidget.cpp | 48 -------------------- InstructorsAndTrainees/tasks/taskswidget.h | 41 ----------------- InstructorsAndTrainees/tasks/taskswidget.ui | 41 ----------------- 4 files changed, 133 deletions(-) delete mode 100644 InstructorsAndTrainees/tasks/taskswidget.cpp delete mode 100644 InstructorsAndTrainees/tasks/taskswidget.h delete mode 100644 InstructorsAndTrainees/tasks/taskswidget.ui diff --git a/InstructorsAndTrainees/CMakeLists.txt b/InstructorsAndTrainees/CMakeLists.txt index 8e13872..b94628e 100644 --- a/InstructorsAndTrainees/CMakeLists.txt +++ b/InstructorsAndTrainees/CMakeLists.txt @@ -39,9 +39,6 @@ add_library(InstructorsAndTrainees SHARED instructors/dialogauthorizationinstructor.ui instructors/instructorsview.cpp instructors/instructorsview.h - tasks/taskswidget.cpp - tasks/taskswidget.h - tasks/taskswidget.ui docTasks/doctaskswidget.cpp docTasks/doctaskswidget.h docTasks/doctaskswidget.ui diff --git a/InstructorsAndTrainees/tasks/taskswidget.cpp b/InstructorsAndTrainees/tasks/taskswidget.cpp deleted file mode 100644 index 1a81740..0000000 --- a/InstructorsAndTrainees/tasks/taskswidget.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include "taskswidget.h" -#include "ui_taskswidget.h" - -TasksWidget::TasksWidget(InterfaceDataBaseLMS* dbLMS, QWidget *parent) : - QWidget(parent), - ui(new Ui::TasksWidget), - dbLMS(dbLMS) -{ - ui->setupUi(this); -} - -TasksWidget::~TasksWidget() -{ - delete ui; -} - -void TasksWidget::slot_traineeSelected(QString login) -{ - viewListTasksForTrainee(login); -} - -void TasksWidget::slot_LanguageChanged(QString language) -{ - qtLanguageTranslator.load(QString(QStringLiteral("translations/InstructorsAndTrainees_")) + language, QStringLiteral(".")); - qApp->installTranslator(&qtLanguageTranslator); -} - -void TasksWidget::viewListTasksForTrainee(QString login) -{ - /* - QList listTasks; - QStringList strListTasks; - - listTasks = pDbTrainees->getTasks(login); - - ui->listWidgetTasks->clear(); - ui->listWidgetTasks->addItems(listTasks); - */ -} - -void TasksWidget::changeEvent(QEvent *event) -{ - // В случае получения события изменения языка приложения - if (event->type() == QEvent::LanguageChange) - { - ui->retranslateUi(this); // переведём окно заново - } -} diff --git a/InstructorsAndTrainees/tasks/taskswidget.h b/InstructorsAndTrainees/tasks/taskswidget.h deleted file mode 100644 index c663b36..0000000 --- a/InstructorsAndTrainees/tasks/taskswidget.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef TASKSWIDGET_H -#define TASKSWIDGET_H - -#include -#include -#include "instructorsAndTrainees_global.h" -#include "interfacedatabaselms.h" - -namespace Ui { -class TasksWidget; -} - -class INSTRUCTORSANDTRAINEES_EXPORT TasksWidget : public QWidget -{ - Q_OBJECT - -public: - explicit TasksWidget(InterfaceDataBaseLMS* dbLMS, QWidget *parent = nullptr); - ~TasksWidget(); - -protected: - // Метод получения событий - // В нём будет производиться проверка события смены перевода приложения - void changeEvent(QEvent * event) override; - -public Q_SLOTS: - //слот обработки сигнала о выборе обучаемого - void slot_traineeSelected(QString login); - void slot_LanguageChanged(QString language); - -private: - void viewListTasksForTrainee(QString login); - -private: - Ui::TasksWidget *ui; - QTranslator qtLanguageTranslator; - - InterfaceDataBaseLMS* dbLMS; -}; - -#endif // TASKSWIDGET_H diff --git a/InstructorsAndTrainees/tasks/taskswidget.ui b/InstructorsAndTrainees/tasks/taskswidget.ui deleted file mode 100644 index 526413b..0000000 --- a/InstructorsAndTrainees/tasks/taskswidget.ui +++ /dev/null @@ -1,41 +0,0 @@ - - - TasksWidget - - - - 0 - 0 - 400 - 300 - - - - Task manager - - - - - - - - Task manager - - - - - - - - - - - - - - - - - - - From 07c4335b25b567fe6144b08138bd7ce238bd985f Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 21 Jan 2025 13:06:11 +0300 Subject: [PATCH 09/77] =?UTF-8?q?=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20docTasks=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docTasks/doctaskswidget.cpp | 9 +---- .../docTasks/doctaskswidget.ui | 6 +-- .../docTasks/fimtaskswidget.cpp | 19 +++++----- .../docTasks/fimtaskswidget.h | 28 +++++++------- .../docTasks/fimtaskswidget.ui | 37 ++++++++++--------- 5 files changed, 46 insertions(+), 53 deletions(-) diff --git a/InstructorsAndTrainees/docTasks/doctaskswidget.cpp b/InstructorsAndTrainees/docTasks/doctaskswidget.cpp index 91a6bef..f597cf5 100644 --- a/InstructorsAndTrainees/docTasks/doctaskswidget.cpp +++ b/InstructorsAndTrainees/docTasks/doctaskswidget.cpp @@ -13,16 +13,11 @@ DocTasksWidget::DocTasksWidget(ConnectorToServer* connectorToServer, QWidget *pa ui->setupUi(this); treeWidget = new QTreeWidget(); + ui->horizontalLayout_1->addWidget(treeWidget); connect(treeWidget, &QTreeWidget::currentItemChanged, this, &DocTasksWidget::on_treeWidget_currentItemChanged); - ui->horizontalLayout_2->addWidget(treeWidget); - preparationTreeWidget(); - - //loadDocTasksFromXML(); - - //updateTreeWidget(); } DocTasksWidget::~DocTasksWidget() @@ -192,8 +187,6 @@ void DocTasksWidget::loadDocTasksFromXML(QByteArray array) if(manifestElement.isNull()) return; - //deleteAllModuls(); - domElementParser(manifestElement, nullptr); } diff --git a/InstructorsAndTrainees/docTasks/doctaskswidget.ui b/InstructorsAndTrainees/docTasks/doctaskswidget.ui index 1aa3eb6..9b62e02 100644 --- a/InstructorsAndTrainees/docTasks/doctaskswidget.ui +++ b/InstructorsAndTrainees/docTasks/doctaskswidget.ui @@ -29,10 +29,10 @@ - + - + @@ -50,7 +50,7 @@ - + diff --git a/InstructorsAndTrainees/docTasks/fimtaskswidget.cpp b/InstructorsAndTrainees/docTasks/fimtaskswidget.cpp index 8f46ced..ed07f28 100644 --- a/InstructorsAndTrainees/docTasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/docTasks/fimtaskswidget.cpp @@ -13,11 +13,10 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, QWidget *pa { ui->setupUi(this); - //loadTasksAmmFimFromXML(); + treeWidget = new QTreeWidget(); + ui->horizontalLayout_1->addWidget(treeWidget); preparationTreeWidget(); - - //fillTree(); } FIMtasksWidget::~FIMtasksWidget() @@ -118,7 +117,7 @@ void FIMtasksWidget::fillTree() itemTask->setCheckState(0, Qt::Checked); itemTask->setIcon(0, QIcon(":/resources/icons/procedure.png")); - ui->treeWidget->addTopLevelItem(itemTask); + treeWidget->addTopLevelItem(itemTask); for (int j = 0; j < task.malfunctionList.count(); j++) {/*Неисправности*/ @@ -152,20 +151,20 @@ void FIMtasksWidget::fillTree() void FIMtasksWidget::preparationTreeWidget() { - ui->treeWidget->setColumnCount(2); + treeWidget->setColumnCount(2); reSetHeadTreeWidget(); - ui->treeWidget->setColumnWidth(ColumnsTree::clmn_ID, 20); - ui->treeWidget->setColumnWidth(ColumnsTree::clmn_Title, 500); + treeWidget->setColumnWidth(ColumnsTree::clmn_ID, 20); + treeWidget->setColumnWidth(ColumnsTree::clmn_Title, 500); - //ui->treeWidget->setColumnHidden(ColumnsTree::clmn_ID, true); + //treeWidget->setColumnHidden(ColumnsTree::clmn_ID, true); } void FIMtasksWidget::reSetHeadTreeWidget() { QStringList listHeaders = {tr("Title"), tr("ID")}; - ui->treeWidget->setHeaderLabels(listHeaders); + treeWidget->setHeaderLabels(listHeaders); } void FIMtasksWidget::slot_NeedUpdateUI() @@ -176,7 +175,7 @@ void FIMtasksWidget::slot_NeedUpdateUI() void FIMtasksWidget::loadTasksFIM() { //Обновление дерева - ui->treeWidget->clear(); + treeWidget->clear(); QByteArray array = connectorToServer->getListTaskFimArray(); loadTasksAmmFimFromXML(array); diff --git a/InstructorsAndTrainees/docTasks/fimtaskswidget.h b/InstructorsAndTrainees/docTasks/fimtaskswidget.h index 28b5686..4b4ce0d 100644 --- a/InstructorsAndTrainees/docTasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/docTasks/fimtaskswidget.h @@ -2,6 +2,7 @@ #define FIMTASKSWIDGET_H #include +#include #include "tasksAmmFim.h" #include "connectortoserver.h" @@ -23,31 +24,30 @@ public: explicit FIMtasksWidget(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); ~FIMtasksWidget(); -public: - void loadTasksAmmFimFromXML(QByteArray array); - -private: - void fillTree(); - void preparationTreeWidget(); - void reSetHeadTreeWidget(); +private Q_SLOTS: + void on_btnUpdateTasks_clicked(); public Q_SLOTS: //Слот обработки сигнала необходимости обновления интерфейса void slot_NeedUpdateUI(); private: + void loadTasksAmmFimFromXML(QByteArray array); + + void fillTree(); + void preparationTreeWidget(); + void reSetHeadTreeWidget(); + void loadTasksFIM(); -public: - QString userName; - QList listTaskAmmFim; - -private slots: - void on_btnUpdateTasks_clicked(); - private: Ui::FIMtasksWidget *ui; ConnectorToServer* connectorToServer; + QTreeWidget* treeWidget; + +private: + QString userName; + QList listTaskAmmFim; }; #endif // FIMTASKSWIDGET_H diff --git a/InstructorsAndTrainees/docTasks/fimtaskswidget.ui b/InstructorsAndTrainees/docTasks/fimtaskswidget.ui index a2ee50d..2ceeabe 100644 --- a/InstructorsAndTrainees/docTasks/fimtaskswidget.ui +++ b/InstructorsAndTrainees/docTasks/fimtaskswidget.ui @@ -17,29 +17,13 @@ - + FIM - - - - List of tasks - - - - - - - 1 - - - - - - + @@ -49,6 +33,23 @@ + + + + + + Code + + + + + + + + + + + From f6ecd377e700f3195aea245818872c70ea745eda Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 21 Jan 2025 15:42:36 +0300 Subject: [PATCH 10/77] =?UTF-8?q?=D0=94=D0=BE=D0=BE=D0=BF=D1=82=D0=B8?= =?UTF-8?q?=D0=BC=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BB=20Tasks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/CMakeLists.txt | 26 +++++++----- .../instructorsandtraineeswidget.cpp | 24 +++++------ .../instructorsandtraineeswidget.h | 9 ++--- .../ammtaskswidget.cpp} | 40 +++++++++---------- .../ammtaskswidget.h} | 22 +++++----- .../ammtaskswidget.ui} | 4 +- .../{docTasks => tasks}/fimtaskswidget.cpp | 4 +- .../{docTasks => tasks}/fimtaskswidget.h | 5 ++- .../{docTasks => tasks}/fimtaskswidget.ui | 0 .../{docTasks => tasks}/module.cpp | 0 .../{docTasks => tasks}/module.h | 0 .../{docTasks => tasks}/tasksAmmFim.cpp | 0 .../{docTasks => tasks}/tasksAmmFim.h | 0 13 files changed, 67 insertions(+), 67 deletions(-) rename InstructorsAndTrainees/{docTasks/doctaskswidget.cpp => tasks/ammtaskswidget.cpp} (89%) rename InstructorsAndTrainees/{docTasks/doctaskswidget.h => tasks/ammtaskswidget.h} (75%) rename InstructorsAndTrainees/{docTasks/doctaskswidget.ui => tasks/ammtaskswidget.ui} (95%) rename InstructorsAndTrainees/{docTasks => tasks}/fimtaskswidget.cpp (98%) rename InstructorsAndTrainees/{docTasks => tasks}/fimtaskswidget.h (95%) rename InstructorsAndTrainees/{docTasks => tasks}/fimtaskswidget.ui (100%) rename InstructorsAndTrainees/{docTasks => tasks}/module.cpp (100%) rename InstructorsAndTrainees/{docTasks => tasks}/module.h (100%) rename InstructorsAndTrainees/{docTasks => tasks}/tasksAmmFim.cpp (100%) rename InstructorsAndTrainees/{docTasks => tasks}/tasksAmmFim.h (100%) diff --git a/InstructorsAndTrainees/CMakeLists.txt b/InstructorsAndTrainees/CMakeLists.txt index b94628e..da0ec7b 100644 --- a/InstructorsAndTrainees/CMakeLists.txt +++ b/InstructorsAndTrainees/CMakeLists.txt @@ -9,6 +9,7 @@ add_library(InstructorsAndTrainees SHARED instructorsandtraineeswidget.ui commonview.cpp commonview.h + trainees/editortrainees.cpp trainees/editortrainees.h trainees/editortrainees.ui @@ -25,6 +26,7 @@ add_library(InstructorsAndTrainees SHARED trainees/viewertrainees.ui trainees/traineesview.cpp trainees/traineesview.h + instructors/viewerinstructors.cpp instructors/viewerinstructors.h instructors/viewerinstructors.ui @@ -39,11 +41,7 @@ add_library(InstructorsAndTrainees SHARED instructors/dialogauthorizationinstructor.ui instructors/instructorsview.cpp instructors/instructorsview.h - docTasks/doctaskswidget.cpp - docTasks/doctaskswidget.h - docTasks/doctaskswidget.ui - docTasks/module.cpp - docTasks/module.h + connectorToServer/connectortoserver.cpp connectorToServer/connectortoserver.h connectorToServer/Core/sendsystem.cpp @@ -58,6 +56,7 @@ add_library(InstructorsAndTrainees SHARED connectorToServer/Core/tools.h connectorToServer/Core/FileData.h connectorToServer/Datas.h + messanger/messangerwidget.cpp messanger/messangerwidget.h messanger/messangerwidget.ui @@ -66,11 +65,18 @@ add_library(InstructorsAndTrainees SHARED messanger/msgwidget.ui messanger/tabdialogmessenger.cpp messanger/tabdialogmessenger.h - docTasks/fimtaskswidget.cpp - docTasks/fimtaskswidget.h - docTasks/fimtaskswidget.ui - docTasks/tasksAmmFim.cpp - docTasks/tasksAmmFim.h + + tasks/ammtaskswidget.cpp + tasks/ammtaskswidget.h + tasks/ammtaskswidget.ui + tasks/module.cpp + tasks/module.h + tasks/fimtaskswidget.cpp + tasks/fimtaskswidget.h + tasks/fimtaskswidget.ui + tasks/tasksAmmFim.cpp + tasks/tasksAmmFim.h + resources.qrc ) diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 46ebed5..070f81e 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -2,7 +2,6 @@ #include "instructorsandtraineeswidget.h" #include "ui_instructorsandtraineeswidget.h" #include "dialogauthorizationinstructor.h" -#include "doctaskswidget.h" InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : QWidget(parent), @@ -11,8 +10,8 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : viewerTrainees(nullptr), viewerInstructors(nullptr), messangerWidget(nullptr), - docTasksWidget(nullptr), - fIMtasksWidget(nullptr), + ammTasksWidget(nullptr), + fimTasksWidget(nullptr), adminMode(false), loginInstructorLoggedInLocal(QStringLiteral("")), nameInstructorLoggedInLocal(QStringLiteral("")) @@ -27,9 +26,6 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : qRegisterMetaType>("QList"); qRegisterMetaType>("QList"); qRegisterMetaType>("QList"); - qRegisterMetaType>("QList"); - - qRegisterMetaType>("QList"); connectorToServer = new ConnectorToServer(this); connect(connectorToServer,&ConnectorToServer::sigLoginResult,this,&InstructorsAndTraineesWidget::checkLoginResult); @@ -56,18 +52,18 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : connect(connectorToServer,&ConnectorToServer::signal_msgFromClientReady,messangerWidget,&MessangerWidget::slot_msgFromClientReady); - docTasksWidget = new DocTasksWidget(connectorToServer, this); - fIMtasksWidget = new FIMtasksWidget(connectorToServer, this); + ammTasksWidget = new AMMtasksWidget(connectorToServer, this); + fimTasksWidget = new FIMtasksWidget(connectorToServer, this); - connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksFIM, fIMtasksWidget, &FIMtasksWidget::slot_NeedUpdateUI); - connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksAMM, docTasksWidget, &DocTasksWidget::slot_NeedUpdateUI); + connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksFIM, fimTasksWidget, &FIMtasksWidget::slot_NeedUpdateUI); + connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksAMM, ammTasksWidget, &AMMtasksWidget::slot_NeedUpdateUI); ui->horizontalLayout_3->addWidget(viewerTrainees); ui->horizontalLayout_3->addWidget(messangerWidget); ui->verticalLayout_1->addWidget(viewerInstructors); - ui->verticalLayout_2->addWidget(docTasksWidget); - ui->verticalLayout_2->addWidget(fIMtasksWidget); + ui->verticalLayout_2->addWidget(ammTasksWidget); + ui->verticalLayout_2->addWidget(fimTasksWidget); viewerTrainees->setMinimumHeight(800); viewerInstructors->setMinimumSize(1800, 300); @@ -84,8 +80,8 @@ InstructorsAndTraineesWidget::~InstructorsAndTraineesWidget() if(authorizationIsCompleted()) deAuthorizationInstructor(loginInstructorLoggedInLocal); - delete docTasksWidget; - delete fIMtasksWidget; + delete ammTasksWidget; + delete fimTasksWidget; delete messangerWidget; delete viewerInstructors; delete viewerTrainees; diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.h b/InstructorsAndTrainees/instructorsandtraineeswidget.h index 5f0beaa..0b6ac6f 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.h +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.h @@ -7,7 +7,7 @@ #include "viewertrainees.h" #include "viewerinstructors.h" #include "messangerwidget.h" -#include "doctaskswidget.h" +#include "ammtaskswidget.h" #include "fimtaskswidget.h" #include "connectortoserver.h" @@ -16,9 +16,6 @@ Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) -Q_DECLARE_METATYPE(QList) - -Q_DECLARE_METATYPE(QList) namespace Ui { class InstructorsAndTraineesWidget; @@ -78,8 +75,8 @@ private: ViewerTrainees* viewerTrainees; ViewerInstructors* viewerInstructors; MessangerWidget* messangerWidget; - DocTasksWidget* docTasksWidget; - FIMtasksWidget* fIMtasksWidget; + AMMtasksWidget* ammTasksWidget; + FIMtasksWidget* fimTasksWidget; bool adminMode; QString loginInstructorLoggedInLocal; diff --git a/InstructorsAndTrainees/docTasks/doctaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp similarity index 89% rename from InstructorsAndTrainees/docTasks/doctaskswidget.cpp rename to InstructorsAndTrainees/tasks/ammtaskswidget.cpp index f597cf5..f817aea 100644 --- a/InstructorsAndTrainees/docTasks/doctaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -2,12 +2,12 @@ #include #include #include -#include "doctaskswidget.h" -#include "ui_doctaskswidget.h" +#include "ammtaskswidget.h" +#include "ui_ammtaskswidget.h" -DocTasksWidget::DocTasksWidget(ConnectorToServer* connectorToServer, QWidget *parent) : +AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *parent) : QWidget(parent), - ui(new Ui::DocTasksWidget), + ui(new Ui::AMMtasksWidget), connectorToServer(connectorToServer) { ui->setupUi(this); @@ -15,18 +15,18 @@ DocTasksWidget::DocTasksWidget(ConnectorToServer* connectorToServer, QWidget *pa treeWidget = new QTreeWidget(); ui->horizontalLayout_1->addWidget(treeWidget); - connect(treeWidget, &QTreeWidget::currentItemChanged, this, &DocTasksWidget::on_treeWidget_currentItemChanged); + connect(treeWidget, &QTreeWidget::currentItemChanged, this, &AMMtasksWidget::on_treeWidget_currentItemChanged); preparationTreeWidget(); } -DocTasksWidget::~DocTasksWidget() +AMMtasksWidget::~AMMtasksWidget() { deleteAllModuls(); delete ui; } -void DocTasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) +void AMMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) { if(current == nullptr) return; @@ -58,23 +58,23 @@ void DocTasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, } } -void DocTasksWidget::slot_NeedUpdateUI() +void AMMtasksWidget::slot_NeedUpdateUI() { loadTasksAMM(); } -void DocTasksWidget::loadTasksAMM() +void AMMtasksWidget::loadTasksAMM() { //Обновление дерева treeWidget->clear(); QByteArray array = connectorToServer->getListTaskAmmArray(); - loadDocTasksFromXML(array); + loadAMMtasksFromXML(array); - updateTreeWidget(); + fillTree(); } -void DocTasksWidget::domElementParser(QDomElement element, Module* moduleParent) +void AMMtasksWidget::domElementParser(QDomElement element, Module* moduleParent) { QString name; @@ -175,7 +175,7 @@ void DocTasksWidget::domElementParser(QDomElement element, Module* moduleParent) }while (! (childElement = childElement.nextSiblingElement()).isNull()); } -void DocTasksWidget::loadDocTasksFromXML(QByteArray array) +void AMMtasksWidget::loadAMMtasksFromXML(QByteArray array) { deleteAllModuls(); @@ -190,7 +190,7 @@ void DocTasksWidget::loadDocTasksFromXML(QByteArray array) domElementParser(manifestElement, nullptr); } -void DocTasksWidget::deleteAllModuls() +void AMMtasksWidget::deleteAllModuls() { for(Module* module: listAllModules) { @@ -202,7 +202,7 @@ void DocTasksWidget::deleteAllModuls() listAllModules.clear(); } -Module *DocTasksWidget::searchModuleByID(int id) +Module *AMMtasksWidget::searchModuleByID(int id) { Module* ptrModule = nullptr; @@ -216,7 +216,7 @@ Module *DocTasksWidget::searchModuleByID(int id) return nullptr; } -void DocTasksWidget::preparationTreeWidget() +void AMMtasksWidget::preparationTreeWidget() { treeWidget->setColumnCount(2); @@ -228,13 +228,13 @@ void DocTasksWidget::preparationTreeWidget() //treeWidget->setColumnHidden(ColumnsTree::clmn_ID, true); } -void DocTasksWidget::reSetHeadTreeWidget() +void AMMtasksWidget::reSetHeadTreeWidget() { QStringList listHeaders = {tr("PM/DM"), tr("ID")}; treeWidget->setHeaderLabels(listHeaders); } -void DocTasksWidget::updateTreeWidget() +void AMMtasksWidget::fillTree() { //Обновление дерева treeWidget->clear(); @@ -245,7 +245,7 @@ void DocTasksWidget::updateTreeWidget() } } -void DocTasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* parentItem) +void AMMtasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* parentItem) { QTreeWidgetItem* itemModule = nullptr; @@ -287,7 +287,7 @@ void DocTasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* pare } -void DocTasksWidget::on_btnUpdateTasks_clicked() +void AMMtasksWidget::on_btnUpdateTasks_clicked() { connectorToServer->sendQueryTasksXML("amm"); } diff --git a/InstructorsAndTrainees/docTasks/doctaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h similarity index 75% rename from InstructorsAndTrainees/docTasks/doctaskswidget.h rename to InstructorsAndTrainees/tasks/ammtaskswidget.h index abfa327..b28d278 100644 --- a/InstructorsAndTrainees/docTasks/doctaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -1,5 +1,5 @@ -#ifndef DOCTASKSWIDGET_H -#define DOCTASKSWIDGET_H +#ifndef AMMTASKSWIDGET_H +#define AMMTASKSWIDGET_H #include #include @@ -8,10 +8,10 @@ #include "connectortoserver.h" namespace Ui { -class DocTasksWidget; +class AMMtasksWidget; } -class DocTasksWidget : public QWidget +class AMMtasksWidget : public QWidget { Q_OBJECT @@ -22,12 +22,11 @@ private: }; public: - explicit DocTasksWidget(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); - ~DocTasksWidget(); + explicit AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); + ~AMMtasksWidget(); private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); - void on_btnUpdateTasks_clicked(); public Q_SLOTS: @@ -35,20 +34,21 @@ public Q_SLOTS: void slot_NeedUpdateUI(); private: - void loadDocTasksFromXML(QByteArray array); + void loadAMMtasksFromXML(QByteArray array); void domElementParser(QDomElement element, Module* moduleParent); void deleteAllModuls(); Module* searchModuleByID(int id); void preparationTreeWidget(); void reSetHeadTreeWidget(); - void updateTreeWidget(); + + void fillTree(); void addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr); void loadTasksAMM(); private: - Ui::DocTasksWidget *ui; + Ui::AMMtasksWidget *ui; ConnectorToServer* connectorToServer; QTreeWidget* treeWidget; @@ -56,4 +56,4 @@ private: QList listAllModules; }; -#endif // DOCTASKSWIDGET_H +#endif // AMMTASKSWIDGET_H diff --git a/InstructorsAndTrainees/docTasks/doctaskswidget.ui b/InstructorsAndTrainees/tasks/ammtaskswidget.ui similarity index 95% rename from InstructorsAndTrainees/docTasks/doctaskswidget.ui rename to InstructorsAndTrainees/tasks/ammtaskswidget.ui index 9b62e02..97a4b02 100644 --- a/InstructorsAndTrainees/docTasks/doctaskswidget.ui +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.ui @@ -1,7 +1,7 @@ - DocTasksWidget - + AMMtasksWidget + 0 diff --git a/InstructorsAndTrainees/docTasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp similarity index 98% rename from InstructorsAndTrainees/docTasks/fimtaskswidget.cpp rename to InstructorsAndTrainees/tasks/fimtaskswidget.cpp index ed07f28..f9c225e 100644 --- a/InstructorsAndTrainees/docTasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -24,7 +24,7 @@ FIMtasksWidget::~FIMtasksWidget() delete ui; } -void FIMtasksWidget::loadTasksAmmFimFromXML(QByteArray array) +void FIMtasksWidget::loadFIMtasksFromXML(QByteArray array) { listTaskAmmFim.clear(); @@ -178,7 +178,7 @@ void FIMtasksWidget::loadTasksFIM() treeWidget->clear(); QByteArray array = connectorToServer->getListTaskFimArray(); - loadTasksAmmFimFromXML(array); + loadFIMtasksFromXML(array); //собственно обновление дерева fillTree(); diff --git a/InstructorsAndTrainees/docTasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h similarity index 95% rename from InstructorsAndTrainees/docTasks/fimtaskswidget.h rename to InstructorsAndTrainees/tasks/fimtaskswidget.h index 4b4ce0d..df7d975 100644 --- a/InstructorsAndTrainees/docTasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -32,12 +32,13 @@ public Q_SLOTS: void slot_NeedUpdateUI(); private: - void loadTasksAmmFimFromXML(QByteArray array); + void loadFIMtasksFromXML(QByteArray array); - void fillTree(); void preparationTreeWidget(); void reSetHeadTreeWidget(); + void fillTree(); + void loadTasksFIM(); private: diff --git a/InstructorsAndTrainees/docTasks/fimtaskswidget.ui b/InstructorsAndTrainees/tasks/fimtaskswidget.ui similarity index 100% rename from InstructorsAndTrainees/docTasks/fimtaskswidget.ui rename to InstructorsAndTrainees/tasks/fimtaskswidget.ui diff --git a/InstructorsAndTrainees/docTasks/module.cpp b/InstructorsAndTrainees/tasks/module.cpp similarity index 100% rename from InstructorsAndTrainees/docTasks/module.cpp rename to InstructorsAndTrainees/tasks/module.cpp diff --git a/InstructorsAndTrainees/docTasks/module.h b/InstructorsAndTrainees/tasks/module.h similarity index 100% rename from InstructorsAndTrainees/docTasks/module.h rename to InstructorsAndTrainees/tasks/module.h diff --git a/InstructorsAndTrainees/docTasks/tasksAmmFim.cpp b/InstructorsAndTrainees/tasks/tasksAmmFim.cpp similarity index 100% rename from InstructorsAndTrainees/docTasks/tasksAmmFim.cpp rename to InstructorsAndTrainees/tasks/tasksAmmFim.cpp diff --git a/InstructorsAndTrainees/docTasks/tasksAmmFim.h b/InstructorsAndTrainees/tasks/tasksAmmFim.h similarity index 100% rename from InstructorsAndTrainees/docTasks/tasksAmmFim.h rename to InstructorsAndTrainees/tasks/tasksAmmFim.h From 079a36a76d0fcfeaba14302ab9e91780196cd538 Mon Sep 17 00:00:00 2001 From: semenov Date: Tue, 21 Jan 2025 15:43:30 +0300 Subject: [PATCH 11/77] feat:draft version change --- DOCS/Алексей/Board.md | 7 +- .../Core/recognizesystem.cpp | 5 +- .../connectorToServer/connectortoserver.cpp | 5 + .../connectorToServer/connectortoserver.h | 1 + .../connectorToServer/streamingversiondata.h | 14 ++ .../instructorsandtraineeswidget.cpp | 2 +- .../widgets/versionselectwidget.cpp | 17 +- .../widgets/versionselectwidget.h | 4 + ServerLMS/Data/StreamingVersionData.h | 36 ++++ ServerLMS/Systems/assetsmanager.cpp | 188 +++++++++++++++++- ServerLMS/Systems/assetsmanager.h | 7 +- ServerLMS/Systems/recognizesystem.cpp | 2 +- ServerLMS/Systems/recognizesystem.h | 2 +- ServerLMS/Systems/updatecontroller.cpp | 87 ++------ ServerLMS/Systems/updatecontroller.h | 4 +- ServerLMS/serverlmswidget.cpp | 1 - 16 files changed, 287 insertions(+), 95 deletions(-) diff --git a/DOCS/Алексей/Board.md b/DOCS/Алексей/Board.md index 59fe3b9..9378343 100644 --- a/DOCS/Алексей/Board.md +++ b/DOCS/Алексей/Board.md @@ -13,13 +13,12 @@ kanban-plugin: board ## bugs - [ ] При старт стопе не сканится шэред дата -- [ ] GUI server: при неподключенном сервере, отключать попытку изменить версию ## feature client Unity -- [ ] отправлять сигнал на пересчет хэша с саб частью - [ ] Добавить обновление инструктора, если он перелогинился +- [ ] убрать функционал смены версии с клиента ## feature client QT @@ -27,7 +26,6 @@ kanban-plugin: board - [ ] Иерархия проекта - папка application, папка updater и линк на основной экзешник - [ ] на старте все мониторы должны быть активны - [ ] Нужен ли дополнительный выбор для загрузки с мат моделью или нет? -- [ ] передавать полную версию в StreaminVerData ## feature server @@ -40,10 +38,13 @@ kanban-plugin: board ## NOW +- [ ] добавить информацию Авторе и изменяемая версия или нет ## Complete +- [ ] отправлять сигнал на пересчет хэша с саб частью +- [ ] GUI server: при неподключенном сервере, отключать попытку изменить версию - [ ] добавить автоматическое выключение после создания копии - [ ] sendSystem::sendXmlAnswer новый вариант отпарвки XML пакетов - [ ] выписать все варианты взаимодействия между всеми клиентами и сервером diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp index 4764af1..ce76408 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp @@ -467,9 +467,10 @@ void RecognizeSystem::xmlParser(QByteArray array) else if(name == "Created") data->setCreateData(QDateTime::fromString(value)); else if(name == "isChangeable") - { data->setIsChangeable(value.toInt()); - } + else if(name == "author") + data->setAuthor(value); + } serverStreamingVersionDataList->append(data); diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index 7742ca5..3e6f697 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -97,6 +97,11 @@ bool ConnectorToServer::sendQueryTasksXML(QString type) return true; } +void ConnectorToServer::setLoginName(QString name) +{ + versionSelectWidget->setAuthor(name); +} + void ConnectorToServer::SetConnectToServer() { emit sigSetConnect(dataParser->getServerSettings(),connectionThread); diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.h b/InstructorsAndTrainees/connectorToServer/connectortoserver.h index 5167542..a393e3d 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.h +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.h @@ -60,6 +60,7 @@ public: void showVersionSelect(); void activateLoadAnimation(bool flag); + void setLoginName(QString name); public slots: /*void slot_AnswerQueryToDB(QList* listInstructors, QList* listTrainees, diff --git a/InstructorsAndTrainees/connectorToServer/streamingversiondata.h b/InstructorsAndTrainees/connectorToServer/streamingversiondata.h index d190385..45c8f4d 100644 --- a/InstructorsAndTrainees/connectorToServer/streamingversiondata.h +++ b/InstructorsAndTrainees/connectorToServer/streamingversiondata.h @@ -16,6 +16,7 @@ public: this->viewName = viewName; this->createData = data; this->size = size; + this->author = ""; } void setName(QString viewName) @@ -54,15 +55,26 @@ public: { return isChangeable; } + void setIsChangeable(bool value) { isChangeable = value; } + QString getAuthor() const + { + return author; + } + + void setAuthor(const QString &value) + { + author = value; + } private: QString absolutePath; QString viewName; + QString author; QDateTime createData; bool isChangeable; qint32 size; @@ -72,3 +84,5 @@ private: + + diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 42bda85..06ce766 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -174,7 +174,7 @@ void InstructorsAndTraineesWidget::checkLoginResult(ServerAuthorization *serverA ui->btnAuthorizationInstructor->setText(tr("Deauthorization Instructor")); updateLabelLoggedInInstructor(serverAuth->Login, serverAuth->ClientName); - + connectorToServer->setLoginName(loginInstructorLoggedInLocal); QMessageBox::information(this, tr("Instructor authorization"), tr("Successfully!")); } else diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.cpp b/InstructorsAndTrainees/widgets/versionselectwidget.cpp index 2f76f3c..60c15be 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.cpp +++ b/InstructorsAndTrainees/widgets/versionselectwidget.cpp @@ -45,13 +45,21 @@ void VersionSelectWidget::on_verListView_itemDoubleClicked(QListWidgetItem *item if(data->getViewName() == item->text()) { QString info = "Имя версии: " + data->getViewName() + "\n"; - info.append("Создан: " + data->getCreateData().toString()); + info.append("Создан: " + data->getCreateData().toString() + "\n"); + info.append("Изменяемый: " + changableText(data->getIsChangeable()) + "\n"); + info.append("Автор: " + data->getAuthor()); ui->infoValue->setText(info); selectedVersion = data; } } } +QString VersionSelectWidget::changableText(bool flag) +{ + if(flag) return tr("Да"); + else return tr("Нет"); +} + void VersionSelectWidget::on_createDuplicateButton_clicked() { @@ -62,7 +70,7 @@ void VersionSelectWidget::on_createDuplicateButton_clicked() void VersionSelectWidget::sendCopyEmit(QString newName) { - QString result = selectedVersion->getViewName() + ";" + newName; + QString result = selectedVersion->getViewName() + ";" + newName + ";" + authorName; if (selectedVersion == nullptr) { @@ -98,7 +106,10 @@ void VersionSelectWidget::on_switchServerVersionButton_clicked() emit sigSendSwitchVersion(selectedVersion); } - +void VersionSelectWidget::setAuthor(QString name) +{ + authorName = name; +} VersionSelectWidget::~VersionSelectWidget() { diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.h b/InstructorsAndTrainees/widgets/versionselectwidget.h index b2dedb7..5b6a9c8 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.h +++ b/InstructorsAndTrainees/widgets/versionselectwidget.h @@ -24,6 +24,7 @@ public: void initialize(SendSystem *sendSystem,VersionContainer *versionContainer,NotifyController *notifyController); void fillView(QList *serverData); void sendCopyEmit(QString newName); + void setAuthor(QString name); ~VersionSelectWidget(); private slots: @@ -45,6 +46,9 @@ private: VersionContainer *versionContainer; NotifyController *notifyController; StreamingVersionData *selectedVersion; + + QString authorName; + QString changableText(bool flag); }; #endif // VERSIONSELECTWIDGET_H diff --git a/ServerLMS/Data/StreamingVersionData.h b/ServerLMS/Data/StreamingVersionData.h index 5cd2ffc..752aecc 100644 --- a/ServerLMS/Data/StreamingVersionData.h +++ b/ServerLMS/Data/StreamingVersionData.h @@ -14,7 +14,10 @@ public: this->createData = data; this->size = size; this->isChangeable = true; + this->author = ""; } + StreamingVersionData(){}; + ~StreamingVersionData(); QString getAbsolutPath() const @@ -47,12 +50,45 @@ public: isChangeable = value; } + QString getAuthor() const + { + return author; + } + + void setAuthor(const QString &value) + { + author = value; + } + + void setViewName(const QString &value) + { + viewName = value; + } + + void setCreateData(const QDateTime &value) + { + createData = value; + } + + void setAbsolutePath(const QString &value) + { + absolutePath = value; + } + private: QString absolutePath; QString viewName; + QString author; QDateTime createData; bool isChangeable; qint32 size; }; #endif // STREAMINGVERSIONDATA_H + + + + + + + diff --git a/ServerLMS/Systems/assetsmanager.cpp b/ServerLMS/Systems/assetsmanager.cpp index ee883e2..4f75ebb 100644 --- a/ServerLMS/Systems/assetsmanager.cpp +++ b/ServerLMS/Systems/assetsmanager.cpp @@ -8,10 +8,76 @@ AssetsManager::AssetsManager(QObject *parent) : QObject(parent) void AssetsManager::initialize(UpdateController* updateContoller,DataParser *dataParser) { this->updateController = updateContoller; - connect(this,&AssetsManager::sigSaveVersion,updateContoller,&UpdateController::saveVersionToFile); + //connect(this,&AssetsManager::sigSaveVersion,updateContoller,&UpdateController::saveVersionToFile); datas = new QList; } +void AssetsManager::fillDatas() +{ + QByteArray array; + QFile file(versionListFile); + + if(!file.exists()) + { + return; + } + + datas->clear(); + + file.open(QIODevice::ReadOnly); + array = file.readAll(); + file.close(); + QXmlStreamReader xmlReader(array); + + xmlReader.readNext(); + QString name = xmlReader.name().toString(); + + while(!xmlReader.atEnd()) + { + name = xmlReader.name().toString(); + + if(!xmlReader.isStartElement()) { + xmlReader.readNext(); + continue; + } + + if(xmlReader.name() == "VersionList") + { + xmlReader.readNext(); + + while (!xmlReader.atEnd()) + { + if(xmlReader.isStartElement()) + { + if(xmlReader.name() == "VersionData") + { + StreamingVersionData *data = new StreamingVersionData(); + + foreach(const QXmlStreamAttribute &attr,xmlReader.attributes()) + { + QString name = attr.name().toString(); + QString value = attr.value().toString(); + + if(name == "Version") + data->setViewName(value); + else if(name == "Created") + data->setCreateData(QDateTime::fromString(value)); + else if(name == "isChangeable") + data->setIsChangeable(value.toInt()); + else if(name == "author") + data->setAuthor(value); + + } + + datas->append(data); + } + } + + xmlReader.readNext(); + } + } + } +} void AssetsManager::setVersionList(QList *streamingVersion) { datas->clear(); @@ -41,7 +107,7 @@ QString AssetsManager::setVersion(QString versionName) if (version->getViewName() == versionName) { currentVersionData = version; - emit sigSaveVersion(currentVersionData); + saveVersionToFile(currentVersionData); return version->getAbsolutPath(); } @@ -101,11 +167,11 @@ void AssetsManager::addVersion(StreamingVersionData *data) datas->push_back(data); } -void AssetsManager::createCopyVersion(QString versionName,QString newVersionName) +void AssetsManager::createCopyVersion(QString versionName,QString newVersionName,QString author) { qDebug() << "assetManager thread ID " << QThread::currentThreadId(); QListIterator iterator(*datas); - StreamingVersionData* data; + StreamingVersionData* data = new StreamingVersionData; while (iterator.hasNext()) { @@ -113,10 +179,15 @@ void AssetsManager::createCopyVersion(QString versionName,QString newVersionName if (version->getViewName() == versionName) { - data = version; + data->setAbsolutePath(version->getAbsolutPath()); } } + data->setAuthor(author); + data->setIsChangeable(true); + data->setViewName(newVersionName); + datas->append(data); + qDebug() << "Version for copy " << versionName; qDebug() << "New version name " << newVersionName; @@ -208,6 +279,113 @@ void AssetsManager::copyAllRecurse(QString source,QString destination) } } +void AssetsManager::writeVersionsToFile(QList version,bool isFirst) +{ + QList listTag; + + QFile file(versionListFile); + + foreach(StreamingVersionData* ver,version) + { + SAttribute attribute1 = {"Version", ver->getViewName()}; + SAttribute attribute2 = {"Created", ver->getCreateData().toString()}; + SAttribute attribute3; + SAttribute attribute4; + + if(isFirst) + { + attribute3 = {"isChangeable",QString::number(false)}; + attribute4 = {"author",tr("Константа-дизайн")}; + }else + { + attribute3 ={"isChangeable",QString::number(ver->getIsChangeable())}; + attribute4 = {"author",ver->getAuthor()}; + } + + + QList listAttr = {attribute1, attribute2,attribute3,attribute4}; + SXmlAnswerTag tag = {"VersionData", listAttr}; + + listTag.append(tag); + datas->append(ver); + } + + file.open(QIODevice::WriteOnly); + + QXmlStreamWriter xmlWriter(&file); + xmlWriter.setAutoFormatting(true); + xmlWriter.writeStartDocument(); + xmlWriter.writeStartElement("VersionList"); + + foreach(SXmlAnswerTag tag,listTag) + { + xmlWriter.writeStartElement(tag.elementName); + + foreach(SAttribute attribute,tag.attr) + { + xmlWriter.writeAttribute(attribute.name,attribute.value); + } + + xmlWriter.writeEndElement(); + } + + xmlWriter.writeEndElement(); + xmlWriter.writeEndDocument(); + file.close(); +} + +void AssetsManager::createFirstVersionListXML(QList version) //TODO: переименовать и перебросить в AssetManager +{ + QFile file(versionListFile); + + if(!file.exists()) + { + writeVersionsToFile(version,true); + } + else + { + + if(datas->count() == 0) fillDatas(); + + foreach(StreamingVersionData* ver,version) + { + foreach(StreamingVersionData* data,*datas) + { + if(ver->getViewName() == data->getViewName()) + { + data->setAbsolutePath(ver->getAbsolutPath()); + break; + } + } + } + + writeVersionsToFile(*datas,false); + } + + +} + +void AssetsManager::saveVersionToFile(StreamingVersionData *streamingVersion) //TODO: переименовать и перебросить в AssetManager +{ + QFile file(version); + file.open(QFile::WriteOnly); + + QXmlStreamWriter xmlWriter(&file); + xmlWriter.setAutoFormatting(true); + xmlWriter.writeStartDocument(); + + xmlWriter.writeStartElement("VersionData"); + xmlWriter.writeAttribute("Version",streamingVersion->getViewName()); + xmlWriter.writeAttribute("Created",streamingVersion->getCreateData().toString()); + xmlWriter.writeAttribute("isChangeable",QString::number(streamingVersion->getIsChangeable())); + xmlWriter.writeAttribute("author",streamingVersion->getAuthor()); + + xmlWriter.writeEndElement(); + xmlWriter.writeEndDocument(); + + file.close(); +} + AssetsManager::~AssetsManager() { diff --git a/ServerLMS/Systems/assetsmanager.h b/ServerLMS/Systems/assetsmanager.h index 559a0f7..dec309c 100644 --- a/ServerLMS/Systems/assetsmanager.h +++ b/ServerLMS/Systems/assetsmanager.h @@ -13,10 +13,11 @@ public: explicit AssetsManager(QObject *parent = nullptr); void initialize(UpdateController* updateContoller,DataParser *dataParser); void addVersion(StreamingVersionData *data); - void createCopyVersion(QString versionName,QString newName); + void createCopyVersion(QString versionName,QString newName,QString author); void deleteVersion(QString version); void setVersionList(QList *streamingVersion); bool findDuplicate(QString name); + void createFirstVersionListXML(QList assets); QString setVersion(QString versionName); QList *prepareLocalPathList(QList*fileData); @@ -27,6 +28,9 @@ public: StreamingVersionData *getCurrentVersionData() const; + void saveVersionToFile(StreamingVersionData *streamingVersion); + void writeVersionsToFile(QList version,bool isFirst); + signals: void sigSaveVersion(StreamingVersionData *versionData); @@ -36,6 +40,7 @@ private: StreamingVersionData* currentVersionData; void copyAllRecurse(QString source, QString destination); + void fillDatas(); }; #endif // ASSETSMANAGER_H diff --git a/ServerLMS/Systems/recognizesystem.cpp b/ServerLMS/Systems/recognizesystem.cpp index be2e1d9..65e28ef 100644 --- a/ServerLMS/Systems/recognizesystem.cpp +++ b/ServerLMS/Systems/recognizesystem.cpp @@ -366,7 +366,7 @@ void RecognizeSystem::recognize() break; } - emit sigCopyVersion(result[0],result[1]); + emit sigCopyVersion(result[0],result[1],result[2]); sendSystem->sendPacketType(PacketType::BUSY); } diff --git a/ServerLMS/Systems/recognizesystem.h b/ServerLMS/Systems/recognizesystem.h index 29a2b24..a28a893 100644 --- a/ServerLMS/Systems/recognizesystem.h +++ b/ServerLMS/Systems/recognizesystem.h @@ -36,7 +36,7 @@ signals: void sigXmlParser(ClientHandler *clientHandler,QByteArray data); void sigChangeVersion(QString versionName); void sigDeleteVersion(QString versionName); - void sigCopyVersion(QString versionName,QString newVersionName); + void sigCopyVersion(QString versionName,QString newVersionName,QString author); private: UpdateController *updateController; diff --git a/ServerLMS/Systems/updatecontroller.cpp b/ServerLMS/Systems/updatecontroller.cpp index 8225da9..faacac7 100644 --- a/ServerLMS/Systems/updatecontroller.cpp +++ b/ServerLMS/Systems/updatecontroller.cpp @@ -41,10 +41,10 @@ void UpdateController::changeAssetVersion(QString versionName) commonClientHandler->slot_sendPacketToAllClients(PacketType::FREE); } -void UpdateController::createCopyVersion(QString versionName,QString newVersionName) +void UpdateController::createCopyVersion(QString versionName,QString newVersionName,QString author) { commonClientHandler->slot_sendPacketToAllClients(PacketType::BUSY); - assetManager->createCopyVersion(versionName,newVersionName); + assetManager->createCopyVersion(versionName,newVersionName,author); commonClientHandler->slot_sendPacketToAllClients(PacketType::FREE); } @@ -444,83 +444,22 @@ void UpdateController::calculateSharedHash() fileInfo.absoluteFilePath(),fileInfo.fileName(), fileInfo.birthTime(),fileInfo.size()); - if(fileInfo.fileName() == baseNameVersion) - { - version->setIsChangeable(false); - } - else - { - version->setIsChangeable(true); - } +// if(fileInfo.fileName() == baseNameVersion) +// { +// version->setIsChangeable(false); +// version->setAuthor(tr("Константа-дизайн")); +// } +// else +// { +// version->setIsChangeable(true); +// } versionList->append(version); } - createVersionListXmlAnswer(*versionList); - assetManager->setVersionList(versionList); -} - -void UpdateController::createVersionListXmlAnswer(QList version) //TODO: переименовать и перебросить в AssetManager -{ - QList listTag; - - foreach(StreamingVersionData* ver,version) - { - SAttribute attribute1 = {"Version", ver->getViewName()}; - SAttribute attribute2 = {"Created", ver->getCreateData().toString()}; - SAttribute attribute3 = {"isChangeable",QString::number(ver->getIsChangeable())}; - - QList listAttr = {attribute1, attribute2,attribute3}; - SXmlAnswerTag tag = {"VersionData", listAttr}; - - listTag.append(tag); - } - - - QFile file(versionListFile); - file.open(QIODevice::WriteOnly); - - QXmlStreamWriter xmlWriter(&file); - xmlWriter.setAutoFormatting(true); - xmlWriter.writeStartDocument(); - xmlWriter.writeStartElement("VersionList"); - - foreach(SXmlAnswerTag tag,listTag) - { - xmlWriter.writeStartElement(tag.elementName); - - foreach(SAttribute attribute,tag.attr) - { - xmlWriter.writeAttribute(attribute.name,attribute.value); - } - - xmlWriter.writeEndElement(); - } - - xmlWriter.writeEndElement(); - xmlWriter.writeEndDocument(); - file.close(); -} - -void UpdateController::saveVersionToFile(StreamingVersionData *streamingVersion) //TODO: переименовать и перебросить в AssetManager -{ - QFile file(version); - file.open(QFile::WriteOnly); - - QXmlStreamWriter xmlWriter(&file); - xmlWriter.setAutoFormatting(true); - xmlWriter.writeStartDocument(); - - xmlWriter.writeStartElement("VersionData"); - xmlWriter.writeAttribute("Version",streamingVersion->getViewName()); - xmlWriter.writeAttribute("Created",streamingVersion->getCreateData().toString()); - xmlWriter.writeAttribute("isChangeable",QString::number(streamingVersion->getIsChangeable())); - - xmlWriter.writeEndElement(); - xmlWriter.writeEndDocument(); - - file.close(); + assetManager->createFirstVersionListXML(*versionList); + //assetManager->setVersionList(versionList); } void UpdateController::sendNewVersionList() diff --git a/ServerLMS/Systems/updatecontroller.h b/ServerLMS/Systems/updatecontroller.h index 8178144..919190a 100644 --- a/ServerLMS/Systems/updatecontroller.h +++ b/ServerLMS/Systems/updatecontroller.h @@ -51,8 +51,6 @@ public: DataInfo *getCurrentDataInfo(); void clearCurrentDataInfo(); - void createVersionListXmlAnswer(QList version); - void saveVersionToFile(StreamingVersionData *streamingVersion); void xmlFileDataParse(QByteArray array); QByteArray getAdditionalFile(QString name); @@ -60,7 +58,7 @@ public: public slots: void changeAssetVersion(QString versionName); - void createCopyVersion(QString versionName,QString newVersionName); + void createCopyVersion(QString versionName,QString newVersionName,QString author); void deleteAssetVersion(QString versionName); void setUpCurrentServerHash(); diff --git a/ServerLMS/serverlmswidget.cpp b/ServerLMS/serverlmswidget.cpp index 9502213..e3539ef 100644 --- a/ServerLMS/serverlmswidget.cpp +++ b/ServerLMS/serverlmswidget.cpp @@ -246,7 +246,6 @@ void ServerLMSWidget::on_btnStartServer_clicked() if(startServer()) { QApplication::setOverrideCursor(Qt::WaitCursor); - emit sigCalculateFullHash(); QApplication::restoreOverrideCursor(); ui->btnStartServer->setEnabled(false); From 81886000a4f9929ad804ef15a18807f61148cc42 Mon Sep 17 00:00:00 2001 From: semenov Date: Tue, 21 Jan 2025 16:05:18 +0300 Subject: [PATCH 12/77] fix: updateController --- ServerLMS/Systems/updatecontroller.h | 1 + 1 file changed, 1 insertion(+) diff --git a/ServerLMS/Systems/updatecontroller.h b/ServerLMS/Systems/updatecontroller.h index 01d9668..1104ce8 100644 --- a/ServerLMS/Systems/updatecontroller.h +++ b/ServerLMS/Systems/updatecontroller.h @@ -55,6 +55,7 @@ public: QString getPathAdditionalFile(QString name); + StreamingVersionData *getCurrentVersion(); public slots: void changeAssetVersion(QString versionName); void createCopyVersion(QString versionName,QString newVersionName,QString author); From 2020a05dae5d8acbba78ae575112f2d961ae394f Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 21 Jan 2025 16:45:39 +0300 Subject: [PATCH 13/77] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20AdditionalFiles=20=D0=BF=D0=B0=D0=BF=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connectorToServer/Core/recognizesystem.cpp | 4 ++-- InstructorsAndTrainees/connectorToServer/Core/tools.cpp | 2 +- InstructorsAndTrainees/connectorToServer/Core/tools.h | 1 + ServerLMS/Systems/updatecontroller.cpp | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp index b4ca04b..42c71ac 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp @@ -297,9 +297,9 @@ void RecognizeSystem::recognize(QTcpSocket *socket) QString xmlFileName = ""; if(packetType == PacketType::TYPE_XMLANSWER_QUERY_TASKS_XML_FIM) - xmlFileName = "./AdditionalFiles/tasksFIM.xml"; + xmlFileName = "./" + additionalFilesFolderName + "/tasksFIM.xml"; else - xmlFileName = "./AdditionalFiles/tasksAMM.xml"; + xmlFileName = "./" + additionalFilesFolderName + "/tasksAMM.xml"; QFile xmlInFile(xmlFileName); if (!xmlInFile.open(QFile::ReadOnly | QFile::Text)) diff --git a/InstructorsAndTrainees/connectorToServer/Core/tools.cpp b/InstructorsAndTrainees/connectorToServer/Core/tools.cpp index 2d933c9..d719b39 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/tools.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/tools.cpp @@ -27,7 +27,7 @@ QString Tools::createLocalPath(QString path) QString Tools::createFullPath(QString path) { QString fullPath; - qint8 pos = path.indexOf("AdditionalFiles"); + qint8 pos = path.indexOf(additionalFilesFolderName); QString localPath = path.remove(0,--pos); diff --git a/InstructorsAndTrainees/connectorToServer/Core/tools.h b/InstructorsAndTrainees/connectorToServer/Core/tools.h index cb040f0..a1d2df2 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/tools.h +++ b/InstructorsAndTrainees/connectorToServer/Core/tools.h @@ -10,6 +10,7 @@ static QString applicationEXEName = "RRJ.exe"; static QString applicationFolderName = "/Application"; static QString staticDataFolderName = "StaticData"; +static QString additionalFilesFolderName = "RRJ-95NEW-100"; static QString streamingAssetsPath = "/Application/RRJLoader/RRJ_Data/StreamingAssets"; static QString hashFilename = staticDataFolderName + "/clientHash.xml"; static QString settingsName = staticDataFolderName + "/settings.xml"; diff --git a/ServerLMS/Systems/updatecontroller.cpp b/ServerLMS/Systems/updatecontroller.cpp index 24adc28..2c55a2e 100644 --- a/ServerLMS/Systems/updatecontroller.cpp +++ b/ServerLMS/Systems/updatecontroller.cpp @@ -364,7 +364,7 @@ QList* UpdateController::calculateHash(QString path) QString UpdateController::getPathAdditionalFile(QString name) { - QString path = Tools::createSharedPath("/" + assetManager->getCurrentVersionData()->getViewName() + "/AdditionalFiles" + name); + QString path = Tools::createSharedPath("/" + assetManager->getCurrentVersionData()->getViewName() + "/" + additionalFilesFolderName + name); return path; } From baf5f535f9aafdc63872c1899d05262dbbacd18a Mon Sep 17 00:00:00 2001 From: semenov Date: Wed, 22 Jan 2025 10:14:43 +0300 Subject: [PATCH 14/77] bugfix:version info complete --- .../instructorsandtraineeswidget.cpp | 2 +- .../widgets/newversionwidget.ui | 41 ++++++++++++++++--- ServerLMS/Data/StreamingVersionData.h | 10 ++++- ServerLMS/Systems/assetsmanager.cpp | 29 ++++++------- ServerLMS/Systems/tools.cpp | 5 +++ ServerLMS/Systems/tools.h | 1 + ServerLMS/Systems/updatecontroller.cpp | 2 +- 7 files changed, 65 insertions(+), 25 deletions(-) diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index d00a1ec..1634632 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -170,7 +170,7 @@ void InstructorsAndTraineesWidget::checkLoginResult(ServerAuthorization *serverA ui->btnAuthorizationInstructor->setText(tr("Deauthorization Instructor")); updateLabelLoggedInInstructor(serverAuth->Login, serverAuth->ClientName); - connectorToServer->setLoginName(loginInstructorLoggedInLocal); + connectorToServer->setLoginName(nameInstructorLoggedInLocal); QMessageBox::information(this, tr("Instructor authorization"), tr("Successfully!")); } else diff --git a/InstructorsAndTrainees/widgets/newversionwidget.ui b/InstructorsAndTrainees/widgets/newversionwidget.ui index 9ba102e..03871e5 100644 --- a/InstructorsAndTrainees/widgets/newversionwidget.ui +++ b/InstructorsAndTrainees/widgets/newversionwidget.ui @@ -6,7 +6,7 @@ 0 0 - 325 + 344 200 @@ -61,7 +61,7 @@ - + 0 0 @@ -73,6 +73,12 @@ + + + 150 + 30 + + TextLabel @@ -92,13 +98,25 @@ 5 - 20 + 5 5 + + + 99 + 40 + + + + + 0 + 0 + + Новое название: @@ -108,8 +126,8 @@ - 0 - 0 + 150 + 30 @@ -126,6 +144,19 @@ + + + + Qt::Horizontal + + + + 40 + 20 + + + + diff --git a/ServerLMS/Data/StreamingVersionData.h b/ServerLMS/Data/StreamingVersionData.h index 752aecc..2e3e892 100644 --- a/ServerLMS/Data/StreamingVersionData.h +++ b/ServerLMS/Data/StreamingVersionData.h @@ -14,12 +14,20 @@ public: this->createData = data; this->size = size; this->isChangeable = true; - this->author = ""; } StreamingVersionData(){}; ~StreamingVersionData(); + void fill(StreamingVersionData* data) + { + this->absolutePath = data->getAbsolutPath(); + this->viewName = data->getViewName(); + this->createData = data->getCreateData(); + this->size = data->getSize(); + this->isChangeable = data->getIsChangeable(); + this->author = data->getAuthor(); + } QString getAbsolutPath() const { return absolutePath; diff --git a/ServerLMS/Systems/assetsmanager.cpp b/ServerLMS/Systems/assetsmanager.cpp index 4f75ebb..385dcb3 100644 --- a/ServerLMS/Systems/assetsmanager.cpp +++ b/ServerLMS/Systems/assetsmanager.cpp @@ -170,22 +170,13 @@ void AssetsManager::addVersion(StreamingVersionData *data) void AssetsManager::createCopyVersion(QString versionName,QString newVersionName,QString author) { qDebug() << "assetManager thread ID " << QThread::currentThreadId(); - QListIterator iterator(*datas); StreamingVersionData* data = new StreamingVersionData; - while (iterator.hasNext()) - { - StreamingVersionData *version = iterator.next(); - - if (version->getViewName() == versionName) - { - data->setAbsolutePath(version->getAbsolutPath()); - } - } - + data->setAbsolutePath(Tools::createSharedPath("/" + newVersionName)); data->setAuthor(author); data->setIsChangeable(true); data->setViewName(newVersionName); + data->setCreateData(QDateTime::currentDateTime()); datas->append(data); qDebug() << "Version for copy " << versionName; @@ -282,7 +273,7 @@ void AssetsManager::copyAllRecurse(QString source,QString destination) void AssetsManager::writeVersionsToFile(QList version,bool isFirst) { QList listTag; - + datas->clear(); QFile file(versionListFile); foreach(StreamingVersionData* ver,version) @@ -337,10 +328,10 @@ void AssetsManager::writeVersionsToFile(QList version,boo void AssetsManager::createFirstVersionListXML(QList version) //TODO: переименовать и перебросить в AssetManager { QFile file(versionListFile); - + QList *temp = new QList(); if(!file.exists()) { - writeVersionsToFile(version,true); + writeVersionsToFile(version,true); } else { @@ -353,16 +344,20 @@ void AssetsManager::createFirstVersionListXML(QList versi { if(ver->getViewName() == data->getViewName()) { - data->setAbsolutePath(ver->getAbsolutPath()); + StreamingVersionData *tempData = new StreamingVersionData; + + tempData->fill(data); + tempData->setAbsolutePath(ver->getAbsolutPath()); + temp->append(tempData); + break; } } } - writeVersionsToFile(*datas,false); + writeVersionsToFile(*temp,false); } - } void AssetsManager::saveVersionToFile(StreamingVersionData *streamingVersion) //TODO: переименовать и перебросить в AssetManager diff --git a/ServerLMS/Systems/tools.cpp b/ServerLMS/Systems/tools.cpp index 68de94f..70e2093 100644 --- a/ServerLMS/Systems/tools.cpp +++ b/ServerLMS/Systems/tools.cpp @@ -66,6 +66,11 @@ QString Tools::createStreamingToRealPath(QString path,StreamingVersionData* stre } +QString Tools::createVersionHashFilepath(QString fileName) +{ + return staticDataFolderName + "/" + fileName + "Hash.xml"; +} + QString Tools::createUpdateFilePath(QString path) { //qDebug() << "Full path: " << path; diff --git a/ServerLMS/Systems/tools.h b/ServerLMS/Systems/tools.h index cf5fd3e..cd8840f 100644 --- a/ServerLMS/Systems/tools.h +++ b/ServerLMS/Systems/tools.h @@ -56,6 +56,7 @@ public: static QString createSharedPath(QString path); static QString createRealPath(QString path,StreamingVersionData* currentVersionData); static QString createStreamingToRealPath(QString path, StreamingVersionData *streamingVersionData); + static QString createVersionHashFilepath(QString fileName); }; diff --git a/ServerLMS/Systems/updatecontroller.cpp b/ServerLMS/Systems/updatecontroller.cpp index 2c55a2e..9a45f73 100644 --- a/ServerLMS/Systems/updatecontroller.cpp +++ b/ServerLMS/Systems/updatecontroller.cpp @@ -428,7 +428,7 @@ void UpdateController::calculateSharedHash() if (fileInfo.fileName() == "." || fileInfo.fileName() == "..") continue; - QString fileName = staticDataFolderName + "/" + fileInfo.fileName() + "Hash.xml"; + QString fileName = Tools::createVersionHashFilepath(fileInfo.fileName()); fileList = calculateHash(fileInfo.absoluteFilePath()); saveHash(fileName,fileList); From 22b2fbddc32158cec96e61a892e34846d8e1a280 Mon Sep 17 00:00:00 2001 From: semenov Date: Wed, 22 Jan 2025 10:32:05 +0300 Subject: [PATCH 15/77] ref: change to ENG --- .../Core/notifycontroller.cpp | 2 +- .../Core/recognizesystem.cpp | 6 +++--- .../widgets/newversionwidget.ui | 8 ++++---- .../widgets/versionselectwidget.cpp | 20 +++++++++---------- .../widgets/versionselectwidget.ui | 18 ++++++++--------- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/InstructorsAndTrainees/connectorToServer/Core/notifycontroller.cpp b/InstructorsAndTrainees/connectorToServer/Core/notifycontroller.cpp index 7c09e24..86d4ca6 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/notifycontroller.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/notifycontroller.cpp @@ -11,6 +11,6 @@ void NotifyController::showWarning(QString text) warning.setText(text); warning.setIcon(QMessageBox::Warning); - warning.setWindowTitle(tr("Ошибка")); + warning.setWindowTitle(tr("Error")); warning.exec(); } diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp index 42c71ac..166eb7e 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp @@ -364,17 +364,17 @@ void RecognizeSystem::xmlParser(QByteArray array) if (value == "BASEDELETETRY") { - emit sigNotify(tr("Нельзя удалять базовую версию")); + emit sigNotify(tr("You cannot delete the basic version!")); } if (value == "TRYACTIVEDELETE") { - emit sigNotify(tr("Нельзя удалять активную версию")); + emit sigNotify(tr("You cannot delete the active version")); } if (value == "DUPLICATEVERNAME") { - emit sigNotify(tr("Такое имя уже существет")); + emit sigNotify(tr("This name already exists")); } } } diff --git a/InstructorsAndTrainees/widgets/newversionwidget.ui b/InstructorsAndTrainees/widgets/newversionwidget.ui index 03871e5..b5d4795 100644 --- a/InstructorsAndTrainees/widgets/newversionwidget.ui +++ b/InstructorsAndTrainees/widgets/newversionwidget.ui @@ -67,7 +67,7 @@ - Базовая версия: + Basic version: @@ -118,7 +118,7 @@ - Новое название: + New name version: @@ -189,7 +189,7 @@ - Создать + Create @@ -218,7 +218,7 @@ - Отмена + Cancel diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.cpp b/InstructorsAndTrainees/widgets/versionselectwidget.cpp index 60c15be..22b1b31 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.cpp +++ b/InstructorsAndTrainees/widgets/versionselectwidget.cpp @@ -22,7 +22,7 @@ void VersionSelectWidget::initialize(SendSystem *sendSystem,VersionContainer *ve connect(this,&VersionSelectWidget::sigSendNotify,notifyController,&NotifyController::showWarning,Qt::AutoConnection); this->versionContainer = versionContainer; hide(); - setWindowTitle(tr("Управление версиями")); + setWindowTitle(tr("Version control")); } void VersionSelectWidget::fillView(QList *serverData) @@ -44,10 +44,10 @@ void VersionSelectWidget::on_verListView_itemDoubleClicked(QListWidgetItem *item { if(data->getViewName() == item->text()) { - QString info = "Имя версии: " + data->getViewName() + "\n"; - info.append("Создан: " + data->getCreateData().toString() + "\n"); - info.append("Изменяемый: " + changableText(data->getIsChangeable()) + "\n"); - info.append("Автор: " + data->getAuthor()); + 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; } @@ -56,8 +56,8 @@ void VersionSelectWidget::on_verListView_itemDoubleClicked(QListWidgetItem *item QString VersionSelectWidget::changableText(bool flag) { - if(flag) return tr("Да"); - else return tr("Нет"); + if(flag) return tr("Yes"); + else return tr("No"); } @@ -74,7 +74,7 @@ void VersionSelectWidget::sendCopyEmit(QString newName) if (selectedVersion == nullptr) { - sigSendNotify(tr("Версия не выбрана")); + sigSendNotify(tr("Version not selected")); return; } @@ -86,7 +86,7 @@ void VersionSelectWidget::on_DeleteVersionButton_clicked() { if (selectedVersion == nullptr) { - sigSendNotify(tr("Версия не выбрана")); + sigSendNotify(tr("Version not selected")); return; } @@ -97,7 +97,7 @@ void VersionSelectWidget::on_switchServerVersionButton_clicked() { if (selectedVersion == nullptr) { - sigSendNotify(tr("Версия не выбрана")); + sigSendNotify(tr("Version not selected")); return; } diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.ui b/InstructorsAndTrainees/widgets/versionselectwidget.ui index 6dbca69..af13a94 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.ui +++ b/InstructorsAndTrainees/widgets/versionselectwidget.ui @@ -48,15 +48,15 @@ - Calibri - 12 + MS Shell Dlg 2 + 8 Qt::PreventContextMenu - Доступные версии на сервере + Available versions on the server: @@ -103,7 +103,7 @@ - Создать копию + Create copy @@ -127,7 +127,7 @@ - Удалить + Delete @@ -147,7 +147,7 @@ - Переключить версию сервера + Change server version @@ -175,7 +175,7 @@ - Информация: + Info: Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -185,7 +185,7 @@ - Тут будет информация о версии... + Double click on the version to see information... Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -220,7 +220,7 @@ - Текущая версия сервера: + Current server version: From 559d1862d1ce5b2d8f9ef7894647567c6250ede6 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 22 Jan 2025 14:36:17 +0300 Subject: [PATCH 16/77] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D1=83=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B4=D0=B0=D1=87=20=D0=BD=D0=B0=20=D1=81=D0=B5=D1=80=D0=B2?= =?UTF-8?q?=D0=B5=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/CMakeLists.txt | 3 + .../tasks => DataBaseLMS}/tasksAmmFim.cpp | 1 + .../tasks => DataBaseLMS}/tasksAmmFim.h | 15 +-- InstructorsAndTrainees/CMakeLists.txt | 4 +- .../connectorToServer/Core/dataparser.cpp | 18 ++++ .../connectorToServer/Datas.h | 4 +- .../instructorsandtraineeswidget.cpp | 13 +-- .../tasks/ammtaskswidget.cpp | 46 ++++++++- InstructorsAndTrainees/tasks/ammtaskswidget.h | 5 + .../tasks/ammtaskswidget.ui | 9 +- .../tasks/fimtaskswidget.cpp | 99 +++++++++++++++++-- InstructorsAndTrainees/tasks/fimtaskswidget.h | 11 ++- .../tasks/fimtaskswidget.ui | 9 +- ServerLMS/Data/typesDataServerClient.h | 4 +- 14 files changed, 211 insertions(+), 30 deletions(-) rename {InstructorsAndTrainees/tasks => DataBaseLMS}/tasksAmmFim.cpp (96%) rename {InstructorsAndTrainees/tasks => DataBaseLMS}/tasksAmmFim.h (91%) diff --git a/DataBaseLMS/CMakeLists.txt b/DataBaseLMS/CMakeLists.txt index e2eced4..f3f154c 100644 --- a/DataBaseLMS/CMakeLists.txt +++ b/DataBaseLMS/CMakeLists.txt @@ -24,10 +24,13 @@ add_library(DataBaseLMS SHARED task.h classroom.cpp classroom.h + tasksAmmFim.cpp + tasksAmmFim.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) diff --git a/InstructorsAndTrainees/tasks/tasksAmmFim.cpp b/DataBaseLMS/tasksAmmFim.cpp similarity index 96% rename from InstructorsAndTrainees/tasks/tasksAmmFim.cpp rename to DataBaseLMS/tasksAmmFim.cpp index 2ebb064..05d42c3 100644 --- a/InstructorsAndTrainees/tasks/tasksAmmFim.cpp +++ b/DataBaseLMS/tasksAmmFim.cpp @@ -3,6 +3,7 @@ #include #include +int TaskAmmFim::lastID = 1; void TaskAmmFim::initialize(int id, QString type, QString title, QString status, QString created_date, QString changed_date) { diff --git a/InstructorsAndTrainees/tasks/tasksAmmFim.h b/DataBaseLMS/tasksAmmFim.h similarity index 91% rename from InstructorsAndTrainees/tasks/tasksAmmFim.h rename to DataBaseLMS/tasksAmmFim.h index 01ee7de..3f278d3 100644 --- a/InstructorsAndTrainees/tasks/tasksAmmFim.h +++ b/DataBaseLMS/tasksAmmFim.h @@ -3,8 +3,9 @@ #include #include +#include "DataBaseLMS_global.h" -class ProcedureID +class DATABASELMS_EXPORT ProcedureID { public: ProcedureID(){}; @@ -16,7 +17,7 @@ public: QString result; // "" - нет результата, "viewed" - процедура изучена (просмотрена при отсутствующем сценарии), "completed" - выполнена (в т.ч. режим "контроль" сценария) }; -class MalfunctionSign // признак неисправности +class DATABASELMS_EXPORT MalfunctionSign // признак неисправности { public: MalfunctionSign(){}; @@ -29,7 +30,7 @@ public: QString description; // описание (напр. "ЭРРД, 25, DOOR_FAIL_TO_CLOSE" - для БСТО) }; -class Malfunction // неисправность +class DATABASELMS_EXPORT Malfunction // неисправность { public: Malfunction(){}; @@ -44,7 +45,7 @@ public: QList malfunctionSigns;// список соответствующих неисправности признаков }; -class FIMReportItem +class DATABASELMS_EXPORT FIMReportItem { public: FIMReportItem(){}; @@ -54,7 +55,7 @@ public: ProcedureID procedure; // ссылка на процедуру, при необходимости }; -class FIMReport +class DATABASELMS_EXPORT FIMReport { public: FIMReport(){}; @@ -63,7 +64,7 @@ public: QList itemList; }; -class TaskAmmFim +class DATABASELMS_EXPORT TaskAmmFim { public: TaskAmmFim(){}; @@ -97,6 +98,8 @@ public: // fim: QList malfunctionList; // список неисправностей FIMReport report; // отчет по выполнению "fim" + + static int lastID; }; #endif // TASKSAMMFIM_H diff --git a/InstructorsAndTrainees/CMakeLists.txt b/InstructorsAndTrainees/CMakeLists.txt index b564953..cae50e6 100644 --- a/InstructorsAndTrainees/CMakeLists.txt +++ b/InstructorsAndTrainees/CMakeLists.txt @@ -78,8 +78,8 @@ add_library(InstructorsAndTrainees SHARED tasks/fimtaskswidget.cpp tasks/fimtaskswidget.h tasks/fimtaskswidget.ui - tasks/tasksAmmFim.cpp - tasks/tasksAmmFim.h + #tasks/tasksAmmFim.cpp + #tasks/tasksAmmFim.h widgets/newversionwidget.cpp widgets/newversionwidget.h widgets/newversionwidget.ui diff --git a/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp b/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp index 82ebfbf..acf46b5 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp @@ -6,6 +6,7 @@ #include "instructor.h" #include "trainee.h" #include "group.h" +#include "tasksAmmFim.h" #include "streamingversiondata.h" #include @@ -171,6 +172,23 @@ void DataParser::createQueryToDBMessage(ClientQueryToDB *queryToDB, int id, void xmlWriter.writeAttribute("name", group->getName()); } } + else if(queryToDB->typeQuery == TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE) + { + TaskAmmFim* task = (TaskAmmFim*)data; + if(task) + { + xmlWriter.writeAttribute("title", task->ammProcedure.title); + xmlWriter.writeAttribute("dmCode", task->ammProcedure.dmCode); + } + } + else if(queryToDB->typeQuery == TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE) + { + TaskAmmFim* task = (TaskAmmFim*)data; + if(task) + { + xmlWriter.writeAttribute("title", task->title); + } + } } xmlWriter.writeEndElement(); diff --git a/InstructorsAndTrainees/connectorToServer/Datas.h b/InstructorsAndTrainees/connectorToServer/Datas.h index 0d2573f..ef8c985 100644 --- a/InstructorsAndTrainees/connectorToServer/Datas.h +++ b/InstructorsAndTrainees/connectorToServer/Datas.h @@ -52,7 +52,9 @@ enum TypeQueryToDB{ TYPE_QUERY_EDIT_GROUP, TYPE_QUERY_NEW_TRAINEE, TYPE_QUERY_DEL_TRAINEE, - TYPE_QUERY_EDIT_TRAINEE + TYPE_QUERY_EDIT_TRAINEE, + TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, + TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE }; class ClientQueryToDB{ diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index d00a1ec..0046ee3 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -43,6 +43,13 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : connect(connectorToServer,&ConnectorToServer::signal_ConnectedToServer,this,&InstructorsAndTraineesWidget::slot_ConnectedToServer); + ammTasksWidget = new AMMtasksWidget(connectorToServer, this); + fimTasksWidget = new FIMtasksWidget(connectorToServer, 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); @@ -52,12 +59,6 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : connect(connectorToServer,&ConnectorToServer::signal_msgFromClientReady,messangerWidget,&MessangerWidget::slot_msgFromClientReady); - ammTasksWidget = new AMMtasksWidget(connectorToServer, this); - fimTasksWidget = new FIMtasksWidget(connectorToServer, this); - - connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksFIM, fimTasksWidget, &FIMtasksWidget::slot_NeedUpdateUI); - connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksAMM, ammTasksWidget, &AMMtasksWidget::slot_NeedUpdateUI); - ui->horizontalLayout_3->addWidget(viewerTrainees); ui->horizontalLayout_3->addWidget(messangerWidget); diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index f817aea..d334931 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -8,7 +8,8 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *parent) : QWidget(parent), ui(new Ui::AMMtasksWidget), - connectorToServer(connectorToServer) + connectorToServer(connectorToServer), + loginTraineeSelected("") { ui->setupUi(this); @@ -18,6 +19,8 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *pa connect(treeWidget, &QTreeWidget::currentItemChanged, this, &AMMtasksWidget::on_treeWidget_currentItemChanged); preparationTreeWidget(); + + ui->btnAssignTaskToTrainee->setEnabled(false); } AMMtasksWidget::~AMMtasksWidget() @@ -45,17 +48,21 @@ void AMMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, PM* PMmodul = static_cast(module); type = "PM"; code = PMmodul->pmCode(); + ui->btnAssignTaskToTrainee->setEnabled(false); } else { DM* DMmodul = static_cast(module); type = "DM"; code = DMmodul->dmCode(); + ui->btnAssignTaskToTrainee->setEnabled(true); } ui->label->setText(type + " Code"); ui->editCode->setText(code); } + else + ui->btnAssignTaskToTrainee->setEnabled(false); } void AMMtasksWidget::slot_NeedUpdateUI() @@ -63,6 +70,11 @@ void AMMtasksWidget::slot_NeedUpdateUI() loadTasksAMM(); } +void AMMtasksWidget::slot_traineeSelected(QString login) +{ + loginTraineeSelected = login; +} + void AMMtasksWidget::loadTasksAMM() { //Обновление дерева @@ -291,3 +303,35 @@ void AMMtasksWidget::on_btnUpdateTasks_clicked() { connectorToServer->sendQueryTasksXML("amm"); } + +void AMMtasksWidget::on_btnAssignTaskToTrainee_clicked() +{ + QTreeWidgetItem *current = treeWidget->currentItem(); + + if(current == nullptr) + return; + + int id = current->text(ColumnsTree::clmn_ID).toInt(); + + Module* module = searchModuleByID(id); + + if(module) + { + if(module->getType() == ModuleType::TYPE_DM) + { + QString dmCode = ""; + QString techName = ""; + DM* DMmodul = static_cast(module); + dmCode = DMmodul->dmCode(); + techName = DMmodul->getLangStructRus().techName; + + int trainee_id = connectorToServer->getIdTraineeByLogin(loginTraineeSelected); + + TaskAmmFim taskNew; + taskNew.ammProcedure.title = techName; + taskNew.ammProcedure.dmCode = dmCode; + + connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, trainee_id, &taskNew); + } + } +} diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index b28d278..216f1b7 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -29,9 +29,13 @@ private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); void on_btnUpdateTasks_clicked(); + void on_btnAssignTaskToTrainee_clicked(); + public Q_SLOTS: //Слот обработки сигнала необходимости обновления интерфейса void slot_NeedUpdateUI(); + //слот обработки сигнала о выборе обучаемого + void slot_traineeSelected(QString login); private: void loadAMMtasksFromXML(QByteArray array); @@ -54,6 +58,7 @@ private: private: QList listAllModules; + QString loginTraineeSelected; }; #endif // AMMTASKSWIDGET_H diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.ui b/InstructorsAndTrainees/tasks/ammtaskswidget.ui index 97a4b02..b23e553 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.ui +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.ui @@ -54,7 +54,14 @@ - ... + Update List + + + + + + + Assign task diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index f9c225e..caf7049 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -9,24 +9,55 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, QWidget *parent) : QWidget(parent), ui(new Ui::FIMtasksWidget), - connectorToServer(connectorToServer) + connectorToServer(connectorToServer), + loginTraineeSelected("") { ui->setupUi(this); treeWidget = new QTreeWidget(); ui->horizontalLayout_1->addWidget(treeWidget); + connect(treeWidget, &QTreeWidget::currentItemChanged, this, &FIMtasksWidget::on_treeWidget_currentItemChanged); + preparationTreeWidget(); + + ui->btnAssignTaskToTrainee->setEnabled(false); } FIMtasksWidget::~FIMtasksWidget() { + + deleteAllTaskAmmFim(); delete ui; } +void FIMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) +{ + if(current == nullptr) + return; + + QString code = ""; + + QTreeWidgetItem *treeItemParent = current->parent(); + if(treeItemParent == nullptr) + {//Выбрана задача + int id = current->text(ColumnsTree::clmn_ID).toInt(); + + TaskAmmFim* task = getTaskByID(id); + + code = task->title; + + ui->btnAssignTaskToTrainee->setEnabled(true); + } + else + ui->btnAssignTaskToTrainee->setEnabled(false); + + ui->editCode->setText(code); +} + void FIMtasksWidget::loadFIMtasksFromXML(QByteArray array) { - listTaskAmmFim.clear(); + deleteAllTaskAmmFim(); QDomDocument docTasksDOM; @@ -47,9 +78,10 @@ void FIMtasksWidget::loadFIMtasksFromXML(QByteArray array) if(name == "task") { - TaskAmmFim task; + TaskAmmFim* task = nullptr; + task = new TaskAmmFim(); - task.initialize(nodeMap.namedItem("id").nodeValue().toInt(), + task->initialize(/*nodeMap.namedItem("id").nodeValue().toInt()*/ TaskAmmFim::lastID++, nodeMap.namedItem("type").nodeValue(), nodeMap.namedItem("title").nodeValue(), nodeMap.namedItem("status").nodeValue(), @@ -92,7 +124,7 @@ void FIMtasksWidget::loadFIMtasksFromXML(QByteArray array) }while(! (signElement = signElement.nextSiblingElement()).isNull()); } - task.addMalfunction(malfunction); + task->addMalfunction(malfunction); } }while(! (malfunctionElement = malfunctionElement.nextSiblingElement()).isNull()); } @@ -107,21 +139,21 @@ void FIMtasksWidget::fillTree() { for(int i = 0; i < listTaskAmmFim.count(); i++) {/*Задачи*/ - TaskAmmFim task = listTaskAmmFim.at(i); + TaskAmmFim* task = listTaskAmmFim.at(i); QTreeWidgetItem* itemTask = new QTreeWidgetItem(); - itemTask->setText(0, task.title); - itemTask->setText(1, QString::number(task.id)); + itemTask->setText(0, task->title); + itemTask->setText(1, QString::number(task->id)); itemTask->setFlags(itemTask->flags() | Qt::ItemIsUserCheckable); itemTask->setCheckState(0, Qt::Checked); itemTask->setIcon(0, QIcon(":/resources/icons/procedure.png")); treeWidget->addTopLevelItem(itemTask); - for (int j = 0; j < task.malfunctionList.count(); j++) + for (int j = 0; j < task->malfunctionList.count(); j++) {/*Неисправности*/ - Malfunction malfunction = task.malfunctionList.at(j); + Malfunction malfunction = task->malfunctionList.at(j); QTreeWidgetItem* itemMalfunction = new QTreeWidgetItem(); @@ -172,6 +204,11 @@ void FIMtasksWidget::slot_NeedUpdateUI() loadTasksFIM(); } +void FIMtasksWidget::slot_traineeSelected(QString login) +{ + loginTraineeSelected = login; +} + void FIMtasksWidget::loadTasksFIM() { //Обновление дерева @@ -184,7 +221,49 @@ void FIMtasksWidget::loadTasksFIM() fillTree(); } +TaskAmmFim* FIMtasksWidget::getTaskByID(int id) +{ + for(int i = 0; i < listTaskAmmFim.count(); i++) + {/*Задачи*/ + TaskAmmFim* task = listTaskAmmFim.at(i); + if(task->id == id) + return task; + } + + return nullptr; +} + +void FIMtasksWidget::deleteAllTaskAmmFim() +{ + for(TaskAmmFim* task: listTaskAmmFim) + delete task; + + listTaskAmmFim.clear(); +} + void FIMtasksWidget::on_btnUpdateTasks_clicked() { connectorToServer->sendQueryTasksXML("fim"); } + +void FIMtasksWidget::on_btnAssignTaskToTrainee_clicked() +{ + QTreeWidgetItem *current = treeWidget->currentItem(); + + if(current == nullptr) + return; + + int id = current->text(ColumnsTree::clmn_ID).toInt(); + + TaskAmmFim* task = getTaskByID(id); + + if(task) + { + int trainee_id = connectorToServer->getIdTraineeByLogin(loginTraineeSelected); + + TaskAmmFim taskNew; + taskNew.title = task->title; + + connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE, trainee_id, &taskNew); + } +} diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index df7d975..c55a1a2 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -25,11 +25,16 @@ public: ~FIMtasksWidget(); private Q_SLOTS: + void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); void on_btnUpdateTasks_clicked(); + void on_btnAssignTaskToTrainee_clicked(); + public Q_SLOTS: //Слот обработки сигнала необходимости обновления интерфейса void slot_NeedUpdateUI(); + //слот обработки сигнала о выборе обучаемого + void slot_traineeSelected(QString login); private: void loadFIMtasksFromXML(QByteArray array); @@ -41,6 +46,9 @@ private: void loadTasksFIM(); + TaskAmmFim* getTaskByID(int id); + void deleteAllTaskAmmFim(); + private: Ui::FIMtasksWidget *ui; ConnectorToServer* connectorToServer; @@ -48,7 +56,8 @@ private: private: QString userName; - QList listTaskAmmFim; + QList listTaskAmmFim; + QString loginTraineeSelected; }; #endif // FIMTASKSWIDGET_H diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.ui b/InstructorsAndTrainees/tasks/fimtaskswidget.ui index 2ceeabe..df023b4 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.ui +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.ui @@ -27,7 +27,14 @@ - ... + Update List + + + + + + + Assign task diff --git a/ServerLMS/Data/typesDataServerClient.h b/ServerLMS/Data/typesDataServerClient.h index 3e6e719..d3f637c 100644 --- a/ServerLMS/Data/typesDataServerClient.h +++ b/ServerLMS/Data/typesDataServerClient.h @@ -71,7 +71,9 @@ enum TypeQueryToDB{ TYPE_QUERY_EDIT_GROUP, TYPE_QUERY_NEW_TRAINEE, TYPE_QUERY_DEL_TRAINEE, - TYPE_QUERY_EDIT_TRAINEE + TYPE_QUERY_EDIT_TRAINEE, + TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, + TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE }; class ClientQueryToDB{ From 3155bf43ed7cd48b48878e5b8bc5520d73ede601 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 22 Jan 2025 17:32:06 +0300 Subject: [PATCH 17/77] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D1=82=D0=B0=D0=B1?= =?UTF-8?q?=D0=BB=D0=B8=D1=86=D0=B0=20=D0=91=D0=94=20tasks=5Famm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/databaselms.cpp | 23 +++++++++++++++++++++ DataBaseLMS/databaselms.h | 5 +++++ DataBaseLMS/interfacedatabaselms.cpp | 15 ++++++++++++++ DataBaseLMS/interfacedatabaselms.h | 4 ++++ DataBaseLMS/tasksAmmFim.h | 4 ++++ ServerLMS/Systems/Parsers/processparser.cpp | 17 +++++++++++++++ ServerLMS/Systems/processingsystem.cpp | 13 ++++++++++++ ServerLMS/providerdblms.cpp | 15 ++++++++++++++ ServerLMS/providerdblms.h | 5 +++++ 9 files changed, 101 insertions(+) diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index 668b07e..4fc22c1 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -447,6 +447,27 @@ int DataBaseLMS::updateGroup(Group group) return queryExecInt(queryStr); } +int DataBaseLMS::insertTaskAMM(int id_trainee) +{ + QString queryStr = QString("INSERT INTO public.tasks_amm (name, trainee_task) " + "VALUES (DEFAULT, %1) " + "RETURNING tasks_amm.task_id").arg( + QString::number(id_trainee)); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::updateTaskAMM(TaskAmmFim task) +{ + QString queryStr = QString("UPDATE public.tasks_amm SET name = '%1' " + "WHERE task_id = %2 " + "RETURNING tasks_amm.task_id").arg( + task.ammProcedure.dmCode, + QString::number(task.getID()) ); + + return queryExecInt(queryStr); +} + Trainee DataBaseLMS::selectTrainee(int id_trainee) { Trainee trainee; @@ -735,6 +756,7 @@ QList DataBaseLMS::selectTasksOfTrainee(int trainee_id) { QList tasks; + /* QString queryStr = QString("SELECT tasks.task_id, tasks.name " "FROM public.trainees " "JOIN public.trainees_tasks ON trainees_tasks.trainee_id = trainees.trainee_id " @@ -755,6 +777,7 @@ QList DataBaseLMS::selectTasksOfTrainee(int trainee_id) tasks.append(task); } } + */ return tasks; } diff --git a/DataBaseLMS/databaselms.h b/DataBaseLMS/databaselms.h index 98240df..6d73f30 100644 --- a/DataBaseLMS/databaselms.h +++ b/DataBaseLMS/databaselms.h @@ -7,6 +7,7 @@ #include "instructor.h" #include "trainee.h" #include "group.h" +#include "tasksAmmFim.h" class DataBaseLMS { @@ -52,6 +53,10 @@ protected: int deleteGroup(int group_id); int updateGroup(Group group); + //Задача + int insertTaskAMM(int id_trainee); + int updateTaskAMM(TaskAmmFim task); + //Обучаемый Trainee selectTrainee(int id_trainee); QList selectAllTraineesInGroup(int id_group); diff --git a/DataBaseLMS/interfacedatabaselms.cpp b/DataBaseLMS/interfacedatabaselms.cpp index 0767ce2..b02f468 100644 --- a/DataBaseLMS/interfacedatabaselms.cpp +++ b/DataBaseLMS/interfacedatabaselms.cpp @@ -281,6 +281,21 @@ int InterfaceDataBaseLMS::editGroup(Group group) return updateGroup(group); } +int InterfaceDataBaseLMS::newTaskAMM(int id_trainee) +{ + return insertTaskAMM(id_trainee); +} + +int InterfaceDataBaseLMS::delTaskAMM(int id) +{ + return 0; +} + +int InterfaceDataBaseLMS::editTaskAMM(TaskAmmFim task) +{ + return updateTaskAMM(task); +} + int InterfaceDataBaseLMS::newTrainee(int id_group) { return insertTrainee(id_group); diff --git a/DataBaseLMS/interfacedatabaselms.h b/DataBaseLMS/interfacedatabaselms.h index dd08015..0744b3e 100644 --- a/DataBaseLMS/interfacedatabaselms.h +++ b/DataBaseLMS/interfacedatabaselms.h @@ -69,6 +69,10 @@ public: int delGroup(int id); int editGroup(Group group); + int newTaskAMM(int id_trainee); + int delTaskAMM(int id); + int editTaskAMM(TaskAmmFim task); + int newTrainee(int id_group); int delTrainee(int id); int editTrainee(Trainee trainee); diff --git a/DataBaseLMS/tasksAmmFim.h b/DataBaseLMS/tasksAmmFim.h index 3f278d3..aadeeb8 100644 --- a/DataBaseLMS/tasksAmmFim.h +++ b/DataBaseLMS/tasksAmmFim.h @@ -72,6 +72,10 @@ public: public: void initialize(int id, QString type, QString title, QString status, QString created_date, QString changed_date); void addMalfunction(Malfunction malfunction); + +public: + void setID(int id){this->id = id;}; + int getID(){return id;}; public: int id; // для идентификации в БД diff --git a/ServerLMS/Systems/Parsers/processparser.cpp b/ServerLMS/Systems/Parsers/processparser.cpp index 49a3d24..083ea51 100644 --- a/ServerLMS/Systems/Parsers/processparser.cpp +++ b/ServerLMS/Systems/Parsers/processparser.cpp @@ -1,4 +1,5 @@ #include "processparser.h" +#include "tasksAmmFim.h" ProcessParser::ProcessParser(QObject *parent) : QObject(parent) { @@ -139,6 +140,7 @@ void ProcessParser::queryToDb(QXmlStreamReader &xmlReader,ClientHandler *client) Instructor instructor; Trainee trainee; Group group; + TaskAmmFim task; void* data = nullptr; /*Перебираем все атрибуты тега*/ @@ -205,6 +207,17 @@ void ProcessParser::queryToDb(QXmlStreamReader &xmlReader,ClientHandler *client) else if(name == "name") group.setName(value); break; + + case TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE: + if(name == "title") + task.ammProcedure.title = value; + else if(name == "dmCode") + task.ammProcedure.dmCode = value; + break; + case TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE: + if(name == "title") + task.title = value; + break; }; } } @@ -223,6 +236,10 @@ void ProcessParser::queryToDb(QXmlStreamReader &xmlReader,ClientHandler *client) case TypeQueryToDB::TYPE_QUERY_EDIT_GROUP: data = &group; break; + case TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE: + case TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE: + data = &task; + break; }; processingSystem->processingClientQueryToDB(client, queryToDB, id, data); diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 5a6a737..7312f02 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -226,6 +226,19 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu emit sigAuthChanged(); break; } + + case TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE: + { + int id_new; + id_new = providerDBLMS->newTaskAMM(id); + if(id_new) + { + (*(TaskAmmFim*)data).setID(id_new); + providerDBLMS->editTaskAMM(*(TaskAmmFim*)data); + } + //emit sigTasksChanged(); + break; + } } //client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_DB_LIST_INSTRUCTORS); diff --git a/ServerLMS/providerdblms.cpp b/ServerLMS/providerdblms.cpp index baca6c3..cadfb13 100644 --- a/ServerLMS/providerdblms.cpp +++ b/ServerLMS/providerdblms.cpp @@ -299,3 +299,18 @@ int ProviderDBLMS::editGroup(Group group) { return dbLMS->editGroup(group); } + +int ProviderDBLMS::newTaskAMM(int id_trainee) +{ + return dbLMS->newTaskAMM(id_trainee); +} + +int ProviderDBLMS::delTaskAMM(int id) +{ + return 0; +} + +int ProviderDBLMS::editTaskAMM(TaskAmmFim task) +{ + return dbLMS->editTaskAMM(task); +} diff --git a/ServerLMS/providerdblms.h b/ServerLMS/providerdblms.h index 06fcc75..bf53901 100644 --- a/ServerLMS/providerdblms.h +++ b/ServerLMS/providerdblms.h @@ -4,6 +4,7 @@ #include #include #include "interfacedatabaselms.h" +#include "tasksAmmFim.h" class ProviderDBLMS : public QObject { @@ -41,6 +42,10 @@ public: int delGroup(int id); int editGroup(Group group); + int newTaskAMM(int id_trainee); + int delTaskAMM(int id); + int editTaskAMM(TaskAmmFim task); + Q_SIGNALS: //сигнал о блокировке авторизации void signal_BlockAutorization(bool block); From ded0bc36273a740da1bc882440dbc66c18f52bce Mon Sep 17 00:00:00 2001 From: semenov Date: Wed, 22 Jan 2025 17:32:10 +0300 Subject: [PATCH 18/77] feat: add authors --- DOCS/Алексей/Board.md | 11 +++++++--- ServerLMS/Data/StreamingVersionData.h | 2 +- ServerLMS/Systems/Parsers/processparser.cpp | 23 +++++++++++++++++++++ ServerLMS/Systems/Parsers/processparser.h | 3 ++- ServerLMS/Systems/assetsmanager.cpp | 4 +++- ServerLMS/Systems/processingsystem.cpp | 6 ++++++ ServerLMS/Systems/processingsystem.h | 2 ++ ServerLMS/Systems/updatecontroller.cpp | 5 +++++ ServerLMS/Systems/updatecontroller.h | 2 ++ 9 files changed, 52 insertions(+), 6 deletions(-) diff --git a/DOCS/Алексей/Board.md b/DOCS/Алексей/Board.md index 9378343..e19c175 100644 --- a/DOCS/Алексей/Board.md +++ b/DOCS/Алексей/Board.md @@ -12,13 +12,12 @@ kanban-plugin: board ## bugs -- [ ] При старт стопе не сканится шэред дата ## feature client Unity - [ ] Добавить обновление инструктора, если он перелогинился -- [ ] убрать функционал смены версии с клиента +- [ ] При нажатии на кнопку обновить, менять надпись на Загрузка ## feature client QT @@ -38,11 +37,16 @@ kanban-plugin: board ## NOW -- [ ] добавить информацию Авторе и изменяемая версия или нет ## Complete +- [ ] Уведомление о том, что версия сервера неизменяемая и инструкция, что нужно переключить версию сервера, подтянуть изменяемую версию и перекинуть файлы + путь +- [ ] Qt ClientЖ отключать виджет версии при разьединении +- [ ] Отображать версию на сервере +- [ ] При удалении с клиента не удаляется папка на сервере +- [ ] убрать функционал смены версии с клиента +- [ ] добавить информацию Авторе и изменяемая версия или нет - [ ] отправлять сигнал на пересчет хэша с саб частью - [ ] GUI server: при неподключенном сервере, отключать попытку изменить версию - [ ] добавить автоматическое выключение после создания копии @@ -304,6 +308,7 @@ kanban-plugin: board ## Cancel +- [ ] При старт стопе не сканится шэред дата - [ ] разделения на серверное и GUI приложение - [ ] gui thread должен жить один - [ ] подготовить фасад для ui сервера diff --git a/ServerLMS/Data/StreamingVersionData.h b/ServerLMS/Data/StreamingVersionData.h index 2e3e892..20c19c9 100644 --- a/ServerLMS/Data/StreamingVersionData.h +++ b/ServerLMS/Data/StreamingVersionData.h @@ -13,7 +13,7 @@ public: this->viewName = viewName; this->createData = data; this->size = size; - this->isChangeable = true; + this->isChangeable = false; } StreamingVersionData(){}; diff --git a/ServerLMS/Systems/Parsers/processparser.cpp b/ServerLMS/Systems/Parsers/processparser.cpp index 49a3d24..a907109 100644 --- a/ServerLMS/Systems/Parsers/processparser.cpp +++ b/ServerLMS/Systems/Parsers/processparser.cpp @@ -58,6 +58,10 @@ void ProcessParser::read(ClientHandler *client, QByteArray array) clientNotify(xmlReader,client); } + else if(xmlReader.name() == "DataInfo") + { + clientDataInfo(xmlReader,client); + } else { emit sigLogMessage("XmlParser: unrecognized tag"); @@ -68,6 +72,25 @@ void ProcessParser::read(ClientHandler *client, QByteArray array) }//while(!xmlReader.atEnd()) } +void ProcessParser::clientDataInfo(QXmlStreamReader &xmlReader,ClientHandler *client) +{ + DataInfo *dataInfo = new DataInfo; + + foreach(const QXmlStreamAttribute &attr, xmlReader.attributes()) + { + QString name = attr.name().toString(); + QString value = attr.value().toString(); + + if(name == "path") + dataInfo->path= value.toUtf8(); + + if(name == "size") + dataInfo->size = value.toLong(); + } + + processingSystem->setCurrentDataInfo(dataInfo); + +} void ProcessParser::clientAuth(QXmlStreamReader &xmlReader,ClientHandler *client) { ClientAutorization clientAutorization; diff --git a/ServerLMS/Systems/Parsers/processparser.h b/ServerLMS/Systems/Parsers/processparser.h index fc8dc05..cf6f8f8 100644 --- a/ServerLMS/Systems/Parsers/processparser.h +++ b/ServerLMS/Systems/Parsers/processparser.h @@ -2,9 +2,9 @@ #define PROCESSPARSER_H #include -#include #include #include +#include "Data/typesDataServerClient.h" class ProcessParser : public QObject { @@ -26,6 +26,7 @@ private: void queryTasksXML(QXmlStreamReader &xmlReader,ClientHandler *client); void clientMessage(QXmlStreamReader &xmlReader,ClientHandler *client); void clientNotify(QXmlStreamReader &xmlReader,ClientHandler *client); + void clientDataInfo(QXmlStreamReader &xmlReader, ClientHandler *client); }; #endif // PROCESSPARSER_H diff --git a/ServerLMS/Systems/assetsmanager.cpp b/ServerLMS/Systems/assetsmanager.cpp index 385dcb3..b707f58 100644 --- a/ServerLMS/Systems/assetsmanager.cpp +++ b/ServerLMS/Systems/assetsmanager.cpp @@ -286,7 +286,9 @@ void AssetsManager::writeVersionsToFile(QList version,boo if(isFirst) { attribute3 = {"isChangeable",QString::number(false)}; - attribute4 = {"author",tr("Константа-дизайн")}; + QString author = tr("Константа-дизайн"); + attribute4 = {"author",author}; + ver->setAuthor(author); }else { attribute3 ={"isChangeable",QString::number(ver->getIsChangeable())}; diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 5a6a737..461b55a 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -24,6 +24,7 @@ void ProcessingSystem::initialize(ServerLMSWidget *server, connect(this,&ProcessingSystem::sigAuthChanged,commonClientHandler, &CommonClientHandler::slot_AuthChanged,Qt::AutoConnection); connect(this,&ProcessingSystem::sigUpdateListClients,server, &ServerLMSWidget::slotUpdateListClients,Qt::AutoConnection); + connect(this,&ProcessingSystem::sigSetData,updateController,&UpdateController::setDataInfo,Qt::AutoConnection); connect(this,&ProcessingSystem::signal_msgToClientReady,commonClientHandler, &CommonClientHandler::slot_msgToClientFromGUI); connect(this,&ProcessingSystem::signal_msgFromClientReady,commonClientHandler, &CommonClientHandler::slot_msgToGUIfromClient); connect(this,&ProcessingSystem::sigLogMessage,logger,&Logger::addTextToLogger,Qt::QueuedConnection); @@ -322,5 +323,10 @@ void ProcessingSystem::processingClientNotify(ClientHandler *client, ClientNotif } } +void ProcessingSystem::setCurrentDataInfo(DataInfo *dataInfo) +{ + emit sigSetData(dataInfo); +} + diff --git a/ServerLMS/Systems/processingsystem.h b/ServerLMS/Systems/processingsystem.h index d412e7a..ca75dfa 100644 --- a/ServerLMS/Systems/processingsystem.h +++ b/ServerLMS/Systems/processingsystem.h @@ -38,6 +38,7 @@ public: void processingFromClientMessage(ClientHandler *client, ClientMessage clientMessage); void processingClientNotify(ClientHandler *client, ClientNotify clientNotify); + void setCurrentDataInfo(DataInfo *dataInfo); signals: void sigUpdateListClients(); void sigAuthChanged(); @@ -45,6 +46,7 @@ signals: void sigAddToMessanger(QString login,QString text); void signal_msgToClientReady(QString login, QString text); void signal_msgFromClientReady(QString login, QString text); + void sigSetData(DataInfo *dataInfo); private: CommonClientHandler *commonClientServer; diff --git a/ServerLMS/Systems/updatecontroller.cpp b/ServerLMS/Systems/updatecontroller.cpp index 9a45f73..52264ec 100644 --- a/ServerLMS/Systems/updatecontroller.cpp +++ b/ServerLMS/Systems/updatecontroller.cpp @@ -193,6 +193,11 @@ void UpdateController::setUpCurrentServerHash() saveHash(hashFileName,fileList); } +void UpdateController::setDataInfo(DataInfo *value) +{ + dataInfo = value; +} + QString UpdateController::getCurrentStreamingPath() const { return currentStreamingPath; diff --git a/ServerLMS/Systems/updatecontroller.h b/ServerLMS/Systems/updatecontroller.h index 1104ce8..0abbbdd 100644 --- a/ServerLMS/Systems/updatecontroller.h +++ b/ServerLMS/Systems/updatecontroller.h @@ -56,6 +56,8 @@ public: QString getPathAdditionalFile(QString name); StreamingVersionData *getCurrentVersion(); + void setDataInfo(DataInfo *value); + public slots: void changeAssetVersion(QString versionName); void createCopyVersion(QString versionName,QString newVersionName,QString author); From b0422f8cf6d07040394d505e51b333aa11237fad Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 23 Jan 2025 09:21:33 +0300 Subject: [PATCH 19/77] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=D0=BB=20task=5Famm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/databaselms.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index 4fc22c1..ecaebaf 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -449,8 +449,8 @@ int DataBaseLMS::updateGroup(Group group) int DataBaseLMS::insertTaskAMM(int id_trainee) { - QString queryStr = QString("INSERT INTO public.tasks_amm (name, trainee_task) " - "VALUES (DEFAULT, %1) " + QString queryStr = QString("INSERT INTO public.tasks_amm (title, dm_code, trainee_task) " + "VALUES (DEFAULT, DEFAULT, %1) " "RETURNING tasks_amm.task_id").arg( QString::number(id_trainee)); @@ -459,9 +459,10 @@ int DataBaseLMS::insertTaskAMM(int id_trainee) int DataBaseLMS::updateTaskAMM(TaskAmmFim task) { - QString queryStr = QString("UPDATE public.tasks_amm SET name = '%1' " - "WHERE task_id = %2 " + QString queryStr = QString("UPDATE public.tasks_amm SET title = '%1', dm_code = '%2' " + "WHERE task_id = %3 " "RETURNING tasks_amm.task_id").arg( + task.ammProcedure.title, task.ammProcedure.dmCode, QString::number(task.getID()) ); From 46f658753592a52d6bb7466b9cb9a2d0d26de87a Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 23 Jan 2025 11:05:41 +0300 Subject: [PATCH 20/77] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=20TypeQueryToDB=20=D0=B2=20DataBaseLMS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/CMakeLists.txt | 1 + DataBaseLMS/databaselms.cpp | 49 +++++++++++++++++-- DataBaseLMS/databaselms.h | 11 +++-- DataBaseLMS/interfacedatabaselms.cpp | 17 ++++++- DataBaseLMS/interfacedatabaselms.h | 4 ++ DataBaseLMS/typeQueryToDB.h | 21 ++++++++ .../connectorToServer/Datas.h | 4 +- ServerLMS/Data/typesDataServerClient.h | 4 +- ServerLMS/Systems/processingsystem.cpp | 13 +++++ ServerLMS/providerdblms.cpp | 17 ++++++- ServerLMS/providerdblms.h | 4 ++ 11 files changed, 134 insertions(+), 11 deletions(-) create mode 100644 DataBaseLMS/typeQueryToDB.h diff --git a/DataBaseLMS/CMakeLists.txt b/DataBaseLMS/CMakeLists.txt index f3f154c..b9aafce 100644 --- a/DataBaseLMS/CMakeLists.txt +++ b/DataBaseLMS/CMakeLists.txt @@ -26,6 +26,7 @@ add_library(DataBaseLMS SHARED classroom.h tasksAmmFim.cpp tasksAmmFim.h + typeQueryToDB.h ) target_link_libraries(DataBaseLMS PRIVATE Qt5::Widgets) diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index ecaebaf..1d9cf40 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -426,12 +426,12 @@ int DataBaseLMS::insertGroup(Group group) return queryExecInt(queryStr); } -int DataBaseLMS::deleteGroup(int group_id) +int DataBaseLMS::deleteGroup(int id_group) { QString queryStr = QString("DELETE FROM public.groups " "WHERE group_id = %1 " "RETURNING groups.group_id").arg( - QString::number(group_id)); + QString::number(id_group)); return queryExecInt(queryStr); } @@ -469,6 +469,47 @@ int DataBaseLMS::updateTaskAMM(TaskAmmFim task) return queryExecInt(queryStr); } +int DataBaseLMS::deleteTaskAMM(int id_task) +{ + QString queryStr = QString("DELETE FROM public.tasks_amm " + "WHERE task_id = %1 " + "RETURNING tasks_amm.task_id").arg( + QString::number(id_task)); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::insertTaskFIM(int id_trainee) +{ + QString queryStr = QString("INSERT INTO public.tasks_fim (title, trainee_task) " + "VALUES (DEFAULT, %1) " + "RETURNING tasks_fim.task_id").arg( + QString::number(id_trainee)); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::updateTaskFIM(TaskAmmFim task) +{ + QString queryStr = QString("UPDATE public.tasks_fim SET title = '%1' " + "WHERE task_id = %2 " + "RETURNING tasks_fim.task_id").arg( + task.title, + QString::number(task.getID()) ); + + return queryExecInt(queryStr); +} + +int DataBaseLMS::deleteTaskFIM(int id_task) +{ + QString queryStr = QString("DELETE FROM public.tasks_fim " + "WHERE task_id = %1 " + "RETURNING tasks_fim.task_id").arg( + QString::number(id_task)); + + return queryExecInt(queryStr); +} + Trainee DataBaseLMS::selectTrainee(int id_trainee) { Trainee trainee; @@ -721,12 +762,12 @@ int DataBaseLMS::insertTrainee(Trainee trainee) return queryExecInt(queryStr); } -int DataBaseLMS::deleteTrainee(int trainee_id) +int DataBaseLMS::deleteTrainee(int id_trainee) { QString queryStr = QString("DELETE FROM public.trainees " "WHERE trainee_id = %1 " "RETURNING trainees.trainee_id").arg( - QString::number(trainee_id)); + QString::number(id_trainee)); return queryExecInt(queryStr); } diff --git a/DataBaseLMS/databaselms.h b/DataBaseLMS/databaselms.h index 6d73f30..6cb61e2 100644 --- a/DataBaseLMS/databaselms.h +++ b/DataBaseLMS/databaselms.h @@ -50,12 +50,17 @@ protected: Group selectGroup(int id_group); int insertGroup(); int insertGroup(Group group); - int deleteGroup(int group_id); + int deleteGroup(int id_group); int updateGroup(Group group); - //Задача + //Задача AMM int insertTaskAMM(int id_trainee); int updateTaskAMM(TaskAmmFim task); + int deleteTaskAMM(int id_task); + //Задача FIM + int insertTaskFIM(int id_trainee); + int updateTaskFIM(TaskAmmFim task); + int deleteTaskFIM(int id_task); //Обучаемый Trainee selectTrainee(int id_trainee); @@ -72,7 +77,7 @@ protected: int insertTrainee(int id_group); int insertTrainee(Trainee trainee); - int deleteTrainee(int trainee_id); + int deleteTrainee(int id_trainee); int updateTrainee(Trainee trainee); QList selectTasksOfTrainee(int trainee_id); diff --git a/DataBaseLMS/interfacedatabaselms.cpp b/DataBaseLMS/interfacedatabaselms.cpp index b02f468..efc302b 100644 --- a/DataBaseLMS/interfacedatabaselms.cpp +++ b/DataBaseLMS/interfacedatabaselms.cpp @@ -288,7 +288,7 @@ int InterfaceDataBaseLMS::newTaskAMM(int id_trainee) int InterfaceDataBaseLMS::delTaskAMM(int id) { - return 0; + return deleteTaskAMM(id); } int InterfaceDataBaseLMS::editTaskAMM(TaskAmmFim task) @@ -296,6 +296,21 @@ int InterfaceDataBaseLMS::editTaskAMM(TaskAmmFim task) return updateTaskAMM(task); } +int InterfaceDataBaseLMS::newTaskFIM(int id_trainee) +{ + return insertTaskFIM(id_trainee); +} + +int InterfaceDataBaseLMS::delTaskFIM(int id) +{ + return deleteTaskFIM(id); +} + +int InterfaceDataBaseLMS::editTaskFIM(TaskAmmFim task) +{ + return updateTaskFIM(task); +} + int InterfaceDataBaseLMS::newTrainee(int id_group) { return insertTrainee(id_group); diff --git a/DataBaseLMS/interfacedatabaselms.h b/DataBaseLMS/interfacedatabaselms.h index 0744b3e..cd06584 100644 --- a/DataBaseLMS/interfacedatabaselms.h +++ b/DataBaseLMS/interfacedatabaselms.h @@ -73,6 +73,10 @@ public: int delTaskAMM(int id); int editTaskAMM(TaskAmmFim task); + int newTaskFIM(int id_trainee); + int delTaskFIM(int id); + int editTaskFIM(TaskAmmFim task); + int newTrainee(int id_group); int delTrainee(int id); int editTrainee(Trainee trainee); diff --git a/DataBaseLMS/typeQueryToDB.h b/DataBaseLMS/typeQueryToDB.h new file mode 100644 index 0000000..72b45f0 --- /dev/null +++ b/DataBaseLMS/typeQueryToDB.h @@ -0,0 +1,21 @@ +#ifndef TYPEQUERYTODB_H +#define TYPEQUERYTODB_H + +#include "DataBaseLMS_global.h" + +enum TypeQueryToDB{ + TYPE_QUERY_GET_ALL_LISTS, + TYPE_QUERY_NEW_INSTRUCTOR, + TYPE_QUERY_DEL_INSTRUCTOR, + TYPE_QUERY_EDIT_INSTRUCTOR, + TYPE_QUERY_NEW_GROUP, + TYPE_QUERY_DEL_GROUP, + TYPE_QUERY_EDIT_GROUP, + TYPE_QUERY_NEW_TRAINEE, + TYPE_QUERY_DEL_TRAINEE, + TYPE_QUERY_EDIT_TRAINEE, + TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, + TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE +}; + +#endif // TYPEQUERYTODB_H diff --git a/InstructorsAndTrainees/connectorToServer/Datas.h b/InstructorsAndTrainees/connectorToServer/Datas.h index ef8c985..5f03268 100644 --- a/InstructorsAndTrainees/connectorToServer/Datas.h +++ b/InstructorsAndTrainees/connectorToServer/Datas.h @@ -2,6 +2,7 @@ #define DATAS_H #include +#include "typeQueryToDB.h" class ServerSettings{ public: @@ -41,7 +42,7 @@ class ClientDeAutorization{ public: QString Login; }; - +/* enum TypeQueryToDB{ TYPE_QUERY_GET_ALL_LISTS, TYPE_QUERY_NEW_INSTRUCTOR, @@ -56,6 +57,7 @@ enum TypeQueryToDB{ TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE }; +*/ class ClientQueryToDB{ public: diff --git a/ServerLMS/Data/typesDataServerClient.h b/ServerLMS/Data/typesDataServerClient.h index d3f637c..beee14e 100644 --- a/ServerLMS/Data/typesDataServerClient.h +++ b/ServerLMS/Data/typesDataServerClient.h @@ -3,6 +3,7 @@ #include #include +#include "typeQueryToDB.h" #define NOTIFY_SERVER_END "END" #define NOTIFY_SERVER_BLOCKED "BLOCKED" @@ -60,7 +61,7 @@ class ClientDeAutorization public: QString Login; }; - +/* enum TypeQueryToDB{ TYPE_QUERY_GET_ALL_LISTS, TYPE_QUERY_NEW_INSTRUCTOR, @@ -75,6 +76,7 @@ enum TypeQueryToDB{ TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE }; +*/ class ClientQueryToDB{ public: diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 0adbfae..9acc099 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -240,6 +240,19 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu //emit sigTasksChanged(); break; } + + case TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE: + { + int id_new; + id_new = providerDBLMS->newTaskFIM(id); + if(id_new) + { + (*(TaskAmmFim*)data).setID(id_new); + providerDBLMS->editTaskFIM(*(TaskAmmFim*)data); + } + //emit sigTasksChanged(); + break; + } } //client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_DB_LIST_INSTRUCTORS); diff --git a/ServerLMS/providerdblms.cpp b/ServerLMS/providerdblms.cpp index cadfb13..8a137bc 100644 --- a/ServerLMS/providerdblms.cpp +++ b/ServerLMS/providerdblms.cpp @@ -307,10 +307,25 @@ int ProviderDBLMS::newTaskAMM(int id_trainee) int ProviderDBLMS::delTaskAMM(int id) { - return 0; + return dbLMS->delTaskAMM(id); } int ProviderDBLMS::editTaskAMM(TaskAmmFim task) { return dbLMS->editTaskAMM(task); } + +int ProviderDBLMS::newTaskFIM(int id_trainee) +{ + return dbLMS->newTaskFIM(id_trainee); +} + +int ProviderDBLMS::delTaskFIM(int id) +{ + return dbLMS->delTaskFIM(id); +} + +int ProviderDBLMS::editTaskFIM(TaskAmmFim task) +{ + return dbLMS->editTaskFIM(task); +} diff --git a/ServerLMS/providerdblms.h b/ServerLMS/providerdblms.h index bf53901..852c90a 100644 --- a/ServerLMS/providerdblms.h +++ b/ServerLMS/providerdblms.h @@ -46,6 +46,10 @@ public: int delTaskAMM(int id); int editTaskAMM(TaskAmmFim task); + int newTaskFIM(int id_trainee); + int delTaskFIM(int id); + int editTaskFIM(TaskAmmFim task); + Q_SIGNALS: //сигнал о блокировке авторизации void signal_BlockAutorization(bool block); From 1ca29b964264d724ac9faeec669ef709ee13644c Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 23 Jan 2025 11:17:34 +0300 Subject: [PATCH 21/77] =?UTF-8?q?=D0=9F=D0=BE=D1=87=D0=B8=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D1=83=20=D0=B0=D0=B2?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D0=BE=D1=80=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D0=BE=D1=82=D0=BA=D0=BB=D1=8E=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B8=20=D0=A1=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/instructorsandtraineeswidget.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 6f6a4c2..234fbed 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -221,6 +221,8 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state) {//Сервер отключен 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"))); } From 6a86ae9909031679b2dd2a6c07de53f090178335 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 23 Jan 2025 12:04:59 +0300 Subject: [PATCH 22/77] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BE=D1=87=D0=B8=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=BE=D0=B2=20=D0=9E=D0=B1=D1=83=D1=87=D0=B0?= =?UTF-8?q?=D0=B5=D0=BC=D1=8B=D1=85=20=D0=B8=20=D0=B8=D0=BD=D1=81=D1=82?= =?UTF-8?q?=D1=80=D1=83=D0=BA=D1=82=D0=BE=D1=80=D0=BE=D0=B2=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=B5=D0=B0=D0=B2=D1=82=D0=BE=D1=80=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/commonview.h | 4 ++++ .../instructorsandtraineeswidget.cpp | 16 +++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/InstructorsAndTrainees/commonview.h b/InstructorsAndTrainees/commonview.h index ea9e755..157044e 100644 --- a/InstructorsAndTrainees/commonview.h +++ b/InstructorsAndTrainees/commonview.h @@ -39,6 +39,10 @@ public: { this->authComplited = authComplited; } + void clearTree() + { + treeWidget->clear(); + } protected: void setArchiveVisible(bool archiveVisible) diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 234fbed..b1bcc47 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -38,8 +38,8 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : 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_UpdateDB,viewerInstructors,&ViewerInstructors::slot_NeedUpdateUI); + //connect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerTrainees,&ViewerTrainees::slot_NeedUpdateUI); connect(connectorToServer,&ConnectorToServer::signal_ConnectedToServer,this,&InstructorsAndTraineesWidget::slot_ConnectedToServer); @@ -194,7 +194,7 @@ void InstructorsAndTraineesWidget::checkDeLoginResult(ServerDeAuthorization *ser viewerInstructors->setAuthComplited(false); viewerTrainees->setAuthComplited(false); - Q_EMIT signal_NeedUpdateUI(true, false); + //Q_EMIT signal_NeedUpdateUI(true, false); ui->btnAuthorizationInstructor->setText(tr("Authorization Instructor")); updateLabelLoggedInInstructor("",""); @@ -225,6 +225,9 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state) ui->btnAuthorizationInstructor->setChecked(false); ui->btnSetVersion->hide(); ui->lblDBisConnected->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleGray.png"))); + + viewerTrainees->clearTree(); + viewerInstructors->clearTree(); } } @@ -284,6 +287,8 @@ void InstructorsAndTraineesWidget::on_btnAuthorizationInstructor_clicked() {//Авторизация Инструктора локальная (Администратора) if(authorizationInstructorDialog(this)) { + connect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerInstructors,&ViewerInstructors::slot_NeedUpdateUI); + connect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerTrainees,&ViewerTrainees::slot_NeedUpdateUI); } else ui->btnAuthorizationInstructor->setChecked(false); @@ -294,6 +299,11 @@ void InstructorsAndTraineesWidget::on_btnAuthorizationInstructor_clicked() { if(deAuthorizationInstructor(loginInstructorLoggedInLocal)) { + disconnect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerInstructors,&ViewerInstructors::slot_NeedUpdateUI); + disconnect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerTrainees,&ViewerTrainees::slot_NeedUpdateUI); + + viewerTrainees->clearTree(); + viewerInstructors->clearTree(); } else ui->btnAuthorizationInstructor->setChecked(true); From 7fc2252a38c4ea0e076c33b20515043b5699a3b3 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 23 Jan 2025 12:22:31 +0300 Subject: [PATCH 23/77] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BE=D1=87=D0=B8=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=BE=D0=B2=20=D0=97=D0=B0=D0=B4=D0=B0=D1=87?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=20=D0=B4=D0=B5=D0=B0=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/instructorsandtraineeswidget.cpp | 8 +++++++- InstructorsAndTrainees/tasks/ammtaskswidget.h | 6 ++++++ InstructorsAndTrainees/tasks/fimtaskswidget.h | 6 ++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index b1bcc47..03b4e84 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -172,7 +172,7 @@ void InstructorsAndTraineesWidget::checkLoginResult(ServerAuthorization *serverA updateLabelLoggedInInstructor(serverAuth->Login, serverAuth->ClientName); connectorToServer->setLoginName(nameInstructorLoggedInLocal); - QMessageBox::information(this, tr("Instructor authorization"), tr("Successfully!")); + //QMessageBox::information(this, tr("Instructor authorization"), tr("Successfully!")); } else { @@ -228,6 +228,9 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state) viewerTrainees->clearTree(); viewerInstructors->clearTree(); + + ammTasksWidget->clearTree(); + fimTasksWidget->clearTree(); } } @@ -304,6 +307,9 @@ void InstructorsAndTraineesWidget::on_btnAuthorizationInstructor_clicked() viewerTrainees->clearTree(); viewerInstructors->clearTree(); + + ammTasksWidget->clearTree(); + fimTasksWidget->clearTree(); } else ui->btnAuthorizationInstructor->setChecked(true); diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index 216f1b7..2a34414 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -25,6 +25,12 @@ public: explicit AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); ~AMMtasksWidget(); +public: + void clearTree() + { + treeWidget->clear(); + } + private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); void on_btnUpdateTasks_clicked(); diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index c55a1a2..3be156c 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -24,6 +24,12 @@ public: explicit FIMtasksWidget(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); ~FIMtasksWidget(); +public: + void clearTree() + { + treeWidget->clear(); + } + private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); void on_btnUpdateTasks_clicked(); From 17dcf18da6d2653e5bbd1a1a51cc79c2f5872d17 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 23 Jan 2025 12:32:31 +0300 Subject: [PATCH 24/77] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BE=D1=87=D0=B8=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=9C=D0=B5?= =?UTF-8?q?=D1=81=D1=81=D0=B5=D0=BD=D0=B4=D0=B6=D0=B5=D1=80=D0=B0=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20=D0=B4=D0=B5=D0=B0=D0=B2=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/instructorsandtraineeswidget.cpp | 8 +++++++- InstructorsAndTrainees/messanger/messangerwidget.cpp | 6 ++++++ InstructorsAndTrainees/messanger/messangerwidget.h | 2 ++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 03b4e84..62fa036 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -52,7 +52,7 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : connect(viewerTrainees, &ViewerTrainees::signal_traineeSelected, ammTasksWidget, &AMMtasksWidget::slot_traineeSelected); messangerWidget = new MessangerWidget(this); - connect(connectorToServer,&ConnectorToServer::signal_InitMessanger,messangerWidget,&MessangerWidget::slot_InitMessanger); + //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_msgToClientReady, connectorToServer, &ConnectorToServer::slot_msgToClientReady); @@ -231,6 +231,8 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state) ammTasksWidget->clearTree(); fimTasksWidget->clearTree(); + + messangerWidget->clear(); } } @@ -292,6 +294,7 @@ void InstructorsAndTraineesWidget::on_btnAuthorizationInstructor_clicked() { 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); @@ -304,12 +307,15 @@ void InstructorsAndTraineesWidget::on_btnAuthorizationInstructor_clicked() { 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->clearTree(); viewerInstructors->clearTree(); ammTasksWidget->clearTree(); fimTasksWidget->clearTree(); + + messangerWidget->clear(); } else ui->btnAuthorizationInstructor->setChecked(true); diff --git a/InstructorsAndTrainees/messanger/messangerwidget.cpp b/InstructorsAndTrainees/messanger/messangerwidget.cpp index da36b37..6fe6fdd 100644 --- a/InstructorsAndTrainees/messanger/messangerwidget.cpp +++ b/InstructorsAndTrainees/messanger/messangerwidget.cpp @@ -130,6 +130,12 @@ int MessangerWidget::getIndexTab(QString login) return -1; } +void MessangerWidget::clear() +{ + listTrainees.clear(); + actualizationTabsDialogMessenger(); +} + void MessangerWidget::on_btnSend_clicked() { QString text = ui->editMsg->toPlainText(); diff --git a/InstructorsAndTrainees/messanger/messangerwidget.h b/InstructorsAndTrainees/messanger/messangerwidget.h index 48b4c66..b4438e7 100644 --- a/InstructorsAndTrainees/messanger/messangerwidget.h +++ b/InstructorsAndTrainees/messanger/messangerwidget.h @@ -37,6 +37,8 @@ public: int getIndexTab(QString login); + void clear(); + private slots: void on_btnSend_clicked(); void on_tabWidget_currentChanged(int index); From 96ec746baa01b8b80eacd86e8b2a9a82821eea68 Mon Sep 17 00:00:00 2001 From: semenov Date: Thu, 23 Jan 2025 13:13:31 +0300 Subject: [PATCH 25/77] feat: stable change version --- DOCS/Алексей/Board.md | 4 + DOCS/Алексей/DataParser scheme.md | 368 +++++++++++++------------- ServerLMS/Systems/recognizesystem.cpp | 4 +- 3 files changed, 192 insertions(+), 184 deletions(-) diff --git a/DOCS/Алексей/Board.md b/DOCS/Алексей/Board.md index e19c175..168d3d8 100644 --- a/DOCS/Алексей/Board.md +++ b/DOCS/Алексей/Board.md @@ -8,16 +8,20 @@ kanban-plugin: board - [ ] окошко с выбором перенести в GUI - [ ] Клиент НЕ СМОЖЕТ ВЫБИРАТЬ ВЕРСИИ +- [ ] qt клиент сервера, запрет на ввод латиницей и запрещенные знаки +- [ ] увеличить размер текста в окне обновлений ## bugs +- [ ] после выгрузки бесконечное обновление ## feature client Unity - [ ] Добавить обновление инструктора, если он перелогинился - [ ] При нажатии на кнопку обновить, менять надпись на Загрузка +- [ ] сохранение не отправленных задач ## feature client QT diff --git a/DOCS/Алексей/DataParser scheme.md b/DOCS/Алексей/DataParser scheme.md index 515fe1a..28d350b 100644 --- a/DOCS/Алексей/DataParser scheme.md +++ b/DOCS/Алексей/DataParser scheme.md @@ -231,368 +231,372 @@ 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= +hmMFsgiQKjLhiMcAbCNeQMeXfZcZcBduhSfRMMtNzsMvsLb+UcL3ucJlHuZ1wXuUIYpMj/RThe3ofua/yZDOAAloMCg4AHAATQDYg+zNAA4oBkBZmhJgbgAwA+YJcl9JRTyRrG5E5klUSekIeATaoTKfjIrxw5U0RI5RhAg5STLmWbHKEifHL0gCVS7/qsBU5T/AVOukATQIcsc5RHL85StKJBEXL05fWDckuXKqhpHKm4QT9q5XnL9AIhAq6eMk + +G5ZHLm5QCjRAm3L0gPehhMX7K0icXKo5eJkZMm9yQ8N3L9ALNgRDJbLxDPJkw5WnKa5ekAbiFOjLCCVBs5cwB5/jyB8ABEYUhErKbQuBEDGKQIjcC1AN5YaAkmklA2EJfVzpQNNakiUBHvAYA93AwACAMnBaMvGhzOnHZx5ZKxQxduRYYNnLZQCQByAX7K/5cQATQAgBZiGfALUCQAlsGwAdoLNhcADORwJBArwwkpAMIDyAgUIp1JQAAAKPUrUA + +A/oCIXBU4KocQAASl1AccGUA+YC1AcwAROuACwVyE14AtCrFSDIDMgxCveI1coLlroCbh05Wwx7ajjgxYHDgd9CUgmQDgVwQBUg1uUTKhAFmI1uUJo3staxwgFU6tsD+kLCrsAE5E9Mm5MJoRTmgVsGkJo8Cq3UwKAWAhAEYAF1B5AD8vWwYQGCAeisGaYcuZABgGXl9IBdptPAwyryD0VBiu4egnkv522HAACkHLUXmzoQFiBbAQAA= ``` %% \ No newline at end of file diff --git a/ServerLMS/Systems/recognizesystem.cpp b/ServerLMS/Systems/recognizesystem.cpp index 65e28ef..c524157 100644 --- a/ServerLMS/Systems/recognizesystem.cpp +++ b/ServerLMS/Systems/recognizesystem.cpp @@ -283,7 +283,7 @@ void RecognizeSystem::recognize() file.close(); return; } - if(socket->waitForReadyRead(TCP_READ_TIMEOUT)){ + if(socket->waitForReadyRead(100)){ continue; } @@ -314,7 +314,7 @@ void RecognizeSystem::recognize() tmpBlock.clear(); sizeReceiveData = 0; countSend = 0; - + packetType = PacketType::TYPE_NONE; } } From 8bb8ea0eaf109dd119a702a67bdc56c9f08d9031 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 23 Jan 2025 14:41:25 +0300 Subject: [PATCH 26/77] =?UTF-8?q?XML=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=81=D1=8B=20=D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D1=83=D1=8E?= =?UTF-8?q?=D1=82=D1=81=D1=8F=20=D0=BD=D0=B0=D0=BF=D1=80=D1=8F=D0=BC=D1=83?= =?UTF-8?q?=D1=8E=20=D0=B2=20QByteArray?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connectorToServer/Core/dataparser.cpp | 45 +++++++++---------- .../connectorToServer/Core/dataparser.h | 12 ++--- .../connectorToServer/Core/sendsystem.cpp | 9 +--- .../connectorToServer/Core/sendsystem.h | 2 +- .../connectorToServer/connectortoserver.cpp | 20 ++++----- .../connectorToServer/connectortoserver.h | 2 +- .../instructorsandtraineeswidget.cpp | 6 ++- 7 files changed, 45 insertions(+), 51 deletions(-) diff --git a/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp b/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp index acf46b5..b3ad8c3 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp @@ -54,13 +54,12 @@ void DataParser::createFileDataList(QList fileDataList,QString filenam file.close(); } -void DataParser::createAuthMessage(ClientAutorization *auth) +QByteArray DataParser::createAuthMessage(ClientAutorization *auth) { authPassCache = auth; //кэширование даных авторизации, для сохранения при успешном заходе - QFile file(tempName); - file.open(QIODevice::WriteOnly); - QXmlStreamWriter xmlWriter(&file); + QByteArray array; + QXmlStreamWriter xmlWriter(&array); xmlWriter.setAutoFormatting(true); xmlWriter.writeStartDocument(); @@ -74,14 +73,13 @@ void DataParser::createAuthMessage(ClientAutorization *auth) xmlWriter.writeEndElement(); xmlWriter.writeEndDocument(); - file.close(); + return array; } -void DataParser::createToClientMessage(ToClientMessage *toClientMessage) +QByteArray DataParser::createToClientMessage(ToClientMessage *toClientMessage) { - QFile file(tempName); - file.open(QIODevice::WriteOnly); - QXmlStreamWriter xmlWriter(&file); + QByteArray array; + QXmlStreamWriter xmlWriter(&array); xmlWriter.setAutoFormatting(true); xmlWriter.writeStartDocument(); @@ -95,16 +93,15 @@ void DataParser::createToClientMessage(ToClientMessage *toClientMessage) xmlWriter.writeEndElement(); xmlWriter.writeEndDocument(); - file.close(); + return array; } -void DataParser::createQueryToDBMessage(ClientQueryToDB *queryToDB, int id, void* data) +QByteArray DataParser::createQueryToDBMessage(ClientQueryToDB *queryToDB, int id, void* data) { - QFile file(tempName); - file.open(QIODevice::WriteOnly); - QXmlStreamWriter xmlWriter(&file); + QByteArray array; + QXmlStreamWriter xmlWriter(&array); xmlWriter.setAutoFormatting(true); xmlWriter.writeStartDocument(); @@ -195,14 +192,13 @@ void DataParser::createQueryToDBMessage(ClientQueryToDB *queryToDB, int id, void xmlWriter.writeEndElement(); xmlWriter.writeEndDocument(); - file.close(); + return array; } -void DataParser::createQueryTasksXMLMessage(QString type) +QByteArray DataParser::createQueryTasksXMLMessage(QString type) { - QFile file(tempName); - file.open(QIODevice::WriteOnly); - QXmlStreamWriter xmlWriter(&file); + QByteArray array; + QXmlStreamWriter xmlWriter(&array); xmlWriter.setAutoFormatting(true); xmlWriter.writeStartDocument(); @@ -214,14 +210,13 @@ void DataParser::createQueryTasksXMLMessage(QString type) xmlWriter.writeEndElement(); xmlWriter.writeEndDocument(); - file.close(); + return array; } -void DataParser::createDeAuthMessage(ClientDeAutorization *deAuth) +QByteArray DataParser::createDeAuthMessage(ClientDeAutorization *deAuth) { - QFile file(tempName); - file.open(QIODevice::WriteOnly); - QXmlStreamWriter xmlWriter(&file); + QByteArray array; + QXmlStreamWriter xmlWriter(&array); xmlWriter.setAutoFormatting(true); xmlWriter.writeStartDocument(); @@ -233,7 +228,7 @@ void DataParser::createDeAuthMessage(ClientDeAutorization *deAuth) xmlWriter.writeEndElement(); xmlWriter.writeEndDocument(); - file.close(); + return array; } diff --git a/InstructorsAndTrainees/connectorToServer/Core/dataparser.h b/InstructorsAndTrainees/connectorToServer/Core/dataparser.h index c0a3406..8e2e85c 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/dataparser.h +++ b/InstructorsAndTrainees/connectorToServer/Core/dataparser.h @@ -21,11 +21,13 @@ public: void createServerSettings(QString server,QString port); void saveClientSettrings(QString language,bool isAutoStart); void createFileDataList(QList fileDataList,QString filename); - void createAuthMessage(ClientAutorization *auth); - void createToClientMessage(ToClientMessage *toClientMessage); - void createQueryToDBMessage(ClientQueryToDB *queryToDB, int id = 0, void* data = nullptr); - void createQueryTasksXMLMessage(QString type); - void createDeAuthMessage(ClientDeAutorization *deAuth); + + QByteArray createAuthMessage(ClientAutorization *auth); + QByteArray createToClientMessage(ToClientMessage *toClientMessage); + QByteArray createQueryToDBMessage(ClientQueryToDB *queryToDB, int id = 0, void* data = nullptr); + QByteArray createQueryTasksXMLMessage(QString type); + QByteArray createDeAuthMessage(ClientDeAutorization *deAuth); + void createAuthData(ServerAuthorization *serverAuth); void createAuthDataOffline(QString username,QString pass); void addRunData(QList displays); diff --git a/InstructorsAndTrainees/connectorToServer/Core/sendsystem.cpp b/InstructorsAndTrainees/connectorToServer/Core/sendsystem.cpp index dadaaf7..3c34e5b 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/sendsystem.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/sendsystem.cpp @@ -31,21 +31,14 @@ void SendSystem::sendDisable() socket->waitForBytesWritten(); } -void SendSystem::sendXMLmsgGUItoServer() +void SendSystem::sendXMLmsgGUItoServer(QByteArray array) { QDataStream stream(socket); stream.setVersion(QDataStream::Qt_DefaultCompiledVersion); - QFile file(tempName); - file.open(QIODevice::ReadOnly); - - QByteArray array = file.readAll(); - stream << PacketType::TYPE_XMLANSWER; stream << array; socket->waitForBytesWritten(); - - file.close(); } void SendSystem::sendFileBlock(QString path) diff --git a/InstructorsAndTrainees/connectorToServer/Core/sendsystem.h b/InstructorsAndTrainees/connectorToServer/Core/sendsystem.h index 1e22eef..924b411 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/sendsystem.h +++ b/InstructorsAndTrainees/connectorToServer/Core/sendsystem.h @@ -14,7 +14,7 @@ class SendSystem :public QObject public: explicit SendSystem(QObject* parent = nullptr); void setSocket(QTcpSocket *socket); - void sendXMLmsgGUItoServer(); + void sendXMLmsgGUItoServer(QByteArray array); void sendDisable(); void sendFileBlock(QString path); void sendFolderBlock(QString path); diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index 13dabe1..69e6687 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -28,8 +28,8 @@ bool ConnectorToServer::authorizationInstructorLocal(QString login, QString pass autorization->Password = password; autorization->TypeClient = TypeClientAutorization::TYPE_GUI; - dataParser->createAuthMessage(autorization); - emit signal_sendXMLmsgGUItoServer(); + QByteArray array = dataParser->createAuthMessage(autorization); + emit signal_sendXMLmsgGUItoServer(array); return true; } @@ -44,8 +44,8 @@ bool ConnectorToServer::deAuthorizationInstructorLocal(QString login) ClientDeAutorization *deAutorization = new ClientDeAutorization; deAutorization->Login = login; - dataParser->createDeAuthMessage(deAutorization); - emit signal_sendXMLmsgGUItoServer(); + QByteArray array = dataParser->createDeAuthMessage(deAutorization); + emit signal_sendXMLmsgGUItoServer(array); return true; } @@ -60,8 +60,8 @@ bool ConnectorToServer::sendQueryToDB(TypeQueryToDB typeQuery, int id, void* dat ClientQueryToDB *queryToDB = new ClientQueryToDB; queryToDB->typeQuery = typeQuery; - dataParser->createQueryToDBMessage(queryToDB, id, data); - emit signal_sendXMLmsgGUItoServer(); + QByteArray array = dataParser->createQueryToDBMessage(queryToDB, id, data); + emit signal_sendXMLmsgGUItoServer(array); return true; } @@ -78,8 +78,8 @@ bool ConnectorToServer::sendMessageForClient(int id, QString login, QString text toClientMessage->Login = login; toClientMessage->Text = text; - dataParser->createToClientMessage(toClientMessage); - emit signal_sendXMLmsgGUItoServer(); + QByteArray array = dataParser->createToClientMessage(toClientMessage); + emit signal_sendXMLmsgGUItoServer(array); return true; } @@ -91,8 +91,8 @@ bool ConnectorToServer::sendQueryTasksXML(QString type) return false; } - dataParser->createQueryTasksXMLMessage(type); - emit signal_sendXMLmsgGUItoServer(); + QByteArray array = dataParser->createQueryTasksXMLMessage(type); + emit signal_sendXMLmsgGUItoServer(array); return true; } diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.h b/InstructorsAndTrainees/connectorToServer/connectortoserver.h index 67b06c8..70e0867 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.h +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.h @@ -85,7 +85,7 @@ signals: SendSystem *sendSystem, QThread *thread); - void signal_sendXMLmsgGUItoServer(); + void signal_sendXMLmsgGUItoServer(QByteArray array); void sigLoginResult(ServerAuthorization * serverAuth); void sigDeLoginResult(ServerDeAuthorization * serverDeAuth); diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 62fa036..1e36a42 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -172,6 +172,10 @@ void InstructorsAndTraineesWidget::checkLoginResult(ServerAuthorization *serverA updateLabelLoggedInInstructor(serverAuth->Login, serverAuth->ClientName); connectorToServer->setLoginName(nameInstructorLoggedInLocal); + + connectorToServer->sendQueryTasksXML("fim"); + connectorToServer->sendQueryTasksXML("amm"); + //QMessageBox::information(this, tr("Instructor authorization"), tr("Successfully!")); } else @@ -199,7 +203,7 @@ void InstructorsAndTraineesWidget::checkDeLoginResult(ServerDeAuthorization *ser ui->btnAuthorizationInstructor->setText(tr("Authorization Instructor")); updateLabelLoggedInInstructor("",""); - QMessageBox::information(this, tr("Instructor deauthorization"), tr("Successfully!")); + //QMessageBox::information(this, tr("Instructor deauthorization"), tr("Successfully!")); } else { From 2ab543d6eb6ebb0e01d859ab1dbf16e06ecc4f22 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 23 Jan 2025 16:03:04 +0300 Subject: [PATCH 27/77] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=20=D1=84?= =?UTF-8?q?=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=D0=BC=20Item=20=D0=B2=20=D0=B4=D1=80=D1=83=D0=B3=D0=BE?= =?UTF-8?q?=D0=BC=20=D0=BF=D0=BE=D1=82=D0=BE=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/instructorsandtraineeswidget.cpp | 3 +++ InstructorsAndTrainees/tasks/ammtaskswidget.cpp | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 1e36a42..58ada8d 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -1,4 +1,5 @@ #include +#include #include "instructorsandtraineeswidget.h" #include "ui_instructorsandtraineeswidget.h" #include "dialogauthorizationinstructor.h" @@ -27,6 +28,8 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : qRegisterMetaType>("QList"); qRegisterMetaType>("QList"); + qDebug() << "InstructorsAndTraineesWidget init thread ID " << QThread::currentThreadId(); + connectorToServer = new ConnectorToServer(this); connect(connectorToServer,&ConnectorToServer::sigLoginResult,this,&InstructorsAndTraineesWidget::checkLoginResult); connect(connectorToServer,&ConnectorToServer::sigDeLoginResult,this,&InstructorsAndTraineesWidget::checkDeLoginResult); diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index d334931..401d927 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "ammtaskswidget.h" #include "ui_ammtaskswidget.h" @@ -21,6 +22,8 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *pa preparationTreeWidget(); ui->btnAssignTaskToTrainee->setEnabled(false); + + qDebug() << "AMMtasksWidget init thread ID " << QThread::currentThreadId(); } AMMtasksWidget::~AMMtasksWidget() @@ -67,11 +70,13 @@ void AMMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, 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; } @@ -289,8 +294,8 @@ void AMMtasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* pare DM* DMmodul = static_cast(module); text = DMmodul->getLangStructRus().techName; - itemModule->setFlags(itemModule->flags() | Qt::ItemIsUserCheckable); - itemModule->setCheckState(0, Qt::Checked); + //itemModule->setFlags(itemModule->flags() | Qt::ItemIsUserCheckable); + //itemModule->setCheckState(0, Qt::Checked); itemModule->setIcon(0, QIcon(":/resources/icons/procedure.png")); } From eba107cac6c30a598774e8c4cd8e80d9167fe87b Mon Sep 17 00:00:00 2001 From: semenov Date: Thu, 23 Jan 2025 16:29:34 +0300 Subject: [PATCH 28/77] feat: add regex and notify --- DOCS/Алексей/Board.md | 6 ++++-- InstructorsAndTrainees/widgets/newversionwidget.cpp | 7 +++++++ InstructorsAndTrainees/widgets/newversionwidget.h | 9 +++++++-- InstructorsAndTrainees/widgets/newversionwidget.ui | 3 +++ InstructorsAndTrainees/widgets/versionselectwidget.cpp | 7 +++++++ 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/DOCS/Алексей/Board.md b/DOCS/Алексей/Board.md index 168d3d8..b3097fb 100644 --- a/DOCS/Алексей/Board.md +++ b/DOCS/Алексей/Board.md @@ -8,13 +8,13 @@ kanban-plugin: board - [ ] окошко с выбором перенести в GUI - [ ] Клиент НЕ СМОЖЕТ ВЫБИРАТЬ ВЕРСИИ -- [ ] qt клиент сервера, запрет на ввод латиницей и запрещенные знаки - [ ] увеличить размер текста в окне обновлений ## bugs -- [ ] после выгрузки бесконечное обновление +- [ ] sig fault если не выбрана версия +- [ ] после удаления версии сбрасывать текст в описании ## feature client Unity @@ -45,6 +45,8 @@ kanban-plugin: board ## Complete +- [ ] qt клиент сервера, запрет на ввод латиницей и запрещенные знаки +- [ ] после выгрузки бесконечное обновление - [ ] Уведомление о том, что версия сервера неизменяемая и инструкция, что нужно переключить версию сервера, подтянуть изменяемую версию и перекинуть файлы + путь - [ ] Qt ClientЖ отключать виджет версии при разьединении - [ ] Отображать версию на сервере diff --git a/InstructorsAndTrainees/widgets/newversionwidget.cpp b/InstructorsAndTrainees/widgets/newversionwidget.cpp index 980781e..1431ed4 100644 --- a/InstructorsAndTrainees/widgets/newversionwidget.cpp +++ b/InstructorsAndTrainees/widgets/newversionwidget.cpp @@ -14,6 +14,8 @@ void NewVersionWidget::initialize(VersionSelectWidget *versionSelectWidget, QStr { this->versionSelectWidget = versionSelectWidget; ui->prevVerValue->setText(prevName); + validator = new QRegExpValidator(QRegExp("^[A-Za-z0-9]{20}$")); + ui->lineEdit->setValidator(validator); } @@ -35,3 +37,8 @@ NewVersionWidget::~NewVersionWidget() { delete ui; } + +void NewVersionWidget::on_lineEdit_inputRejected() +{ + QToolTip::showText(QCursor::pos(),tr("Only Latin letters and numbers")); +} diff --git a/InstructorsAndTrainees/widgets/newversionwidget.h b/InstructorsAndTrainees/widgets/newversionwidget.h index dbc62e5..e1696fb 100644 --- a/InstructorsAndTrainees/widgets/newversionwidget.h +++ b/InstructorsAndTrainees/widgets/newversionwidget.h @@ -3,6 +3,8 @@ #include #include +#include +#include namespace Ui { class NewVersionWidget; @@ -20,12 +22,15 @@ public: private slots: void on_createButton_clicked(); - void on_cancelButton_clicked(); + void on_lineEdit_inputRejected(); private: Ui::NewVersionWidget *ui; VersionSelectWidget *versionSelectWidget; + QRegExpValidator *validator; }; -#endif // NEWVERSIONWIDGET_H +#endif // NEWVERSIONWIDGET_Hvoid on_lineEdit_inputRejected(); + + diff --git a/InstructorsAndTrainees/widgets/newversionwidget.ui b/InstructorsAndTrainees/widgets/newversionwidget.ui index b5d4795..928f73b 100644 --- a/InstructorsAndTrainees/widgets/newversionwidget.ui +++ b/InstructorsAndTrainees/widgets/newversionwidget.ui @@ -142,6 +142,9 @@ 30 + + 1000 + diff --git a/InstructorsAndTrainees/widgets/versionselectwidget.cpp b/InstructorsAndTrainees/widgets/versionselectwidget.cpp index 22b1b31..93ea715 100644 --- a/InstructorsAndTrainees/widgets/versionselectwidget.cpp +++ b/InstructorsAndTrainees/widgets/versionselectwidget.cpp @@ -63,6 +63,13 @@ QString VersionSelectWidget::changableText(bool flag) void VersionSelectWidget::on_createDuplicateButton_clicked() { + + if (selectedVersion == nullptr) + { + sigSendNotify(tr("Version not selected")); + return; + } + NewVersionWidget *newVersionWidget = new NewVersionWidget; newVersionWidget->initialize(this,selectedVersion->getViewName()); newVersionWidget->show(); From d6c78ba4283efffb0d1405db978fd2b23a351148 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 23 Jan 2025 17:54:21 +0300 Subject: [PATCH 29/77] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=20=D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20Item=20=D0=BE=D0=B2=20=D0=B2=20=D0=BE?= =?UTF-8?q?=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=82=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/CMakeLists.txt | 2 + .../instructorsandtraineeswidget.cpp | 2 + .../instructorsandtraineeswidget.h | 3 + .../tasks/ammtaskswidget.cpp | 49 ++++++++++++-- InstructorsAndTrainees/tasks/ammtaskswidget.h | 15 ++++- .../tasks/tasktreepreparation.cpp | 67 +++++++++++++++++++ .../tasks/tasktreepreparation.h | 27 ++++++++ .../widgets/waitanimationwidget.cpp | 5 ++ .../widgets/waitanimationwidget.h | 1 + 9 files changed, 166 insertions(+), 5 deletions(-) create mode 100644 InstructorsAndTrainees/tasks/tasktreepreparation.cpp create mode 100644 InstructorsAndTrainees/tasks/tasktreepreparation.h diff --git a/InstructorsAndTrainees/CMakeLists.txt b/InstructorsAndTrainees/CMakeLists.txt index cae50e6..ad4daa0 100644 --- a/InstructorsAndTrainees/CMakeLists.txt +++ b/InstructorsAndTrainees/CMakeLists.txt @@ -78,6 +78,8 @@ add_library(InstructorsAndTrainees SHARED tasks/fimtaskswidget.cpp tasks/fimtaskswidget.h tasks/fimtaskswidget.ui + tasks/tasktreepreparation.cpp + tasks/tasktreepreparation.h #tasks/tasksAmmFim.cpp #tasks/tasksAmmFim.h widgets/newversionwidget.cpp diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 58ada8d..9ca8258 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -27,6 +27,8 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : qRegisterMetaType>("QList"); qRegisterMetaType>("QList"); qRegisterMetaType>("QList"); + qRegisterMetaType>("QList"); + qRegisterMetaType>("QList"); qDebug() << "InstructorsAndTraineesWidget init thread ID " << QThread::currentThreadId(); diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.h b/InstructorsAndTrainees/instructorsandtraineeswidget.h index 8488a5b..881a8f0 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.h +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.h @@ -16,6 +16,9 @@ Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) +Q_DECLARE_METATYPE(QList) +Q_DECLARE_METATYPE(QList) + namespace Ui { class InstructorsAndTraineesWidget; diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index 401d927..2a55d2b 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "ammtaskswidget.h" #include "ui_ammtaskswidget.h" @@ -24,6 +25,20 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *pa ui->btnAssignTaskToTrainee->setEnabled(false); qDebug() << "AMMtasksWidget init thread ID " << QThread::currentThreadId(); + + threadPreparation = new QThread(); + taskTreePreparation = new TaskTreePreparation(); + taskTreePreparation->moveToThread(threadPreparation); + threadPreparation->start(); + threadPreparation->setPriority(QThread::HighestPriority); + connect(this, &AMMtasksWidget::signal_prepareListItems, taskTreePreparation, &TaskTreePreparation::slot_prepareListItems); + connect(taskTreePreparation, &TaskTreePreparation::signal_listItemsReady, this, &AMMtasksWidget::slot_listItemsReady); + + waitAnimationWidget = new WaitAnimationWidget; + QMovie *movie = new QMovie(":/resources/icons/762.gif"); + waitAnimationWidget->setParent(this); + waitAnimationWidget->initialize(movie,this); + waitAnimationWidget->moveToThread(threadPreparation); } AMMtasksWidget::~AMMtasksWidget() @@ -32,6 +47,12 @@ AMMtasksWidget::~AMMtasksWidget() delete ui; } +void AMMtasksWidget::resizeEvent(QResizeEvent *event) +{ + QSize size = event->size(); + waitAnimationWidget->resize(size); +} + void AMMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) { if(current == nullptr) @@ -85,10 +106,26 @@ void AMMtasksWidget::loadTasksAMM() //Обновление дерева treeWidget->clear(); + waitAnimationWidget->showWithPlay(); + QByteArray array = connectorToServer->getListTaskAmmArray(); loadAMMtasksFromXML(array); - fillTree(); + //fillTree(); + signal_prepareListItems(listAllModules); +} + +void AMMtasksWidget::slot_listItemsReady(QList listItems) +{ + //Обновление дерева + treeWidget->clear(); + + for(QTreeWidgetItem * item : listItems) + { + treeWidget->addTopLevelItem(item); + } + + waitAnimationWidget->hideWithStop(); } void AMMtasksWidget::domElementParser(QDomElement element, Module* moduleParent) @@ -258,11 +295,12 @@ void AMMtasksWidget::fillTree() for(Module* module : listAllModules) { - addModuleToTreeWidget(module); + QTreeWidgetItem* item = addModuleToTreeWidget(module); + treeWidget->addTopLevelItem(item); } } -void AMMtasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* parentItem) +QTreeWidgetItem* AMMtasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* parentItem) { QTreeWidgetItem* itemModule = nullptr; @@ -276,7 +314,8 @@ void AMMtasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* pare } else { - itemModule = new QTreeWidgetItem(treeWidget); + //itemModule = new QTreeWidgetItem(treeWidget); + itemModule = new QTreeWidgetItem(); } if(module->getType() == ModuleType::TYPE_PM) @@ -301,6 +340,8 @@ void AMMtasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* pare itemModule->setText(ColumnsTree::clmn_PMorDM, text); itemModule->setText(ColumnsTree::clmn_ID, ID); + + return itemModule; } diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index 2a34414..72b9175 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -6,6 +6,7 @@ #include #include "module.h" #include "connectortoserver.h" +#include "taskTreePreparation.h" namespace Ui { class AMMtasksWidget; @@ -31,6 +32,9 @@ public: treeWidget->clear(); } +public: + void resizeEvent(QResizeEvent *event) override; + private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); void on_btnUpdateTasks_clicked(); @@ -53,10 +57,15 @@ private: void reSetHeadTreeWidget(); void fillTree(); - void addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr); + QTreeWidgetItem* addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr); void loadTasksAMM(); +Q_SIGNALS: + void signal_prepareListItems(QList listAllModules); +public Q_SLOTS: + void slot_listItemsReady(QList listItems); + private: Ui::AMMtasksWidget *ui; ConnectorToServer* connectorToServer; @@ -65,6 +74,10 @@ private: private: QList listAllModules; QString loginTraineeSelected; + + QThread* threadPreparation; + TaskTreePreparation* taskTreePreparation; + WaitAnimationWidget *waitAnimationWidget; }; #endif // AMMTASKSWIDGET_H diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp new file mode 100644 index 0000000..fe42925 --- /dev/null +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp @@ -0,0 +1,67 @@ +#include +#include +#include "tasktreepreparation.h" + +TaskTreePreparation::TaskTreePreparation(QObject *parent) : QObject(parent) +{ + qDebug() << "TaskTreePreparation init thread ID " << QThread::currentThreadId(); +} + +QTreeWidgetItem *TaskTreePreparation::addModuleToTreeWidget(Module *module, QTreeWidgetItem *parentItem) +{ + QTreeWidgetItem* itemModule = nullptr; + + QString text; + QString ID = QString::number(module->getID()); + + if(parentItem) + { + itemModule = new QTreeWidgetItem(); + parentItem->addChild(itemModule); + } + else + { + //itemModule = new QTreeWidgetItem(treeWidget); + itemModule = new QTreeWidgetItem(); + } + + if(module->getType() == ModuleType::TYPE_PM) + { + PM* PMmodul = static_cast(module); + text = PMmodul->getLangStructRus().title; + + for(Module* module : PMmodul->getListChildModules()) + { + addModuleToTreeWidget(module, itemModule); + } + } + else + { + DM* DMmodul = static_cast(module); + text = DMmodul->getLangStructRus().techName; + + //itemModule->setFlags(itemModule->flags() | Qt::ItemIsUserCheckable); + //itemModule->setCheckState(0, Qt::Checked); + itemModule->setIcon(0, QIcon(":/resources/icons/procedure.png")); + } + + itemModule->setText(0, text); + itemModule->setText(1, ID); + + return itemModule; +} + +void TaskTreePreparation::slot_prepareListItems(QList listAllModules) +{ + qDebug() << "TaskTreePreparation::slot_prepareListItems thread ID " << QThread::currentThreadId(); + + listItems.clear(); + + for(Module* module : listAllModules) + { + QTreeWidgetItem* item = addModuleToTreeWidget(module); + listItems.append(item); + } + + Q_EMIT signal_listItemsReady(listItems); +} diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.h b/InstructorsAndTrainees/tasks/tasktreepreparation.h new file mode 100644 index 0000000..3c5bdb0 --- /dev/null +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.h @@ -0,0 +1,27 @@ +#ifndef TASKTREEPREPARATION_H +#define TASKTREEPREPARATION_H + +#include +#include +#include "module.h" + +class TaskTreePreparation : public QObject +{ + Q_OBJECT +public: + explicit TaskTreePreparation(QObject *parent = nullptr); + +public: + QTreeWidgetItem* addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr); + +public Q_SLOTS: + void slot_prepareListItems(QList listAllModules); + +Q_SIGNALS: + void signal_listItemsReady(QList listItems); + +private: + QList listItems; +}; + +#endif // TASKTREEPREPARATION_H diff --git a/InstructorsAndTrainees/widgets/waitanimationwidget.cpp b/InstructorsAndTrainees/widgets/waitanimationwidget.cpp index 547a79f..f226429 100644 --- a/InstructorsAndTrainees/widgets/waitanimationwidget.cpp +++ b/InstructorsAndTrainees/widgets/waitanimationwidget.cpp @@ -29,6 +29,11 @@ void WaitAnimationWidget::hideWithStop() loadingMovie->stop(); } +void WaitAnimationWidget::resize(QSize size) +{ + setFixedSize(size); +} + WaitAnimationWidget::~WaitAnimationWidget() { delete ui; diff --git a/InstructorsAndTrainees/widgets/waitanimationwidget.h b/InstructorsAndTrainees/widgets/waitanimationwidget.h index e9ea6a9..827ee99 100644 --- a/InstructorsAndTrainees/widgets/waitanimationwidget.h +++ b/InstructorsAndTrainees/widgets/waitanimationwidget.h @@ -17,6 +17,7 @@ public: void initialize(QMovie *movie,QWidget *parent); void showWithPlay(); void hideWithStop(); + void resize(QSize size); ~WaitAnimationWidget(); private: From 987ad12893d469e3131f609cd4ce52ce9a469249 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Fri, 24 Jan 2025 09:58:56 +0300 Subject: [PATCH 30/77] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=20=D0=BF=D0=B0=D1=80=D1=81=D0=B8=D0=BD=D0=B3=20taskAMM.X?= =?UTF-8?q?ML=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BF=D0=BE=D1=82=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tasks/ammtaskswidget.cpp | 211 ++---------------- InstructorsAndTrainees/tasks/ammtaskswidget.h | 12 +- .../tasks/tasktreepreparation.cpp | 158 ++++++++++++- .../tasks/tasktreepreparation.h | 10 +- 4 files changed, 171 insertions(+), 220 deletions(-) diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index 2a55d2b..f64fade 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -11,10 +11,17 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *pa QWidget(parent), ui(new Ui::AMMtasksWidget), connectorToServer(connectorToServer), - loginTraineeSelected("") + treeWidget(nullptr), + loginTraineeSelected(""), + threadPreparation(nullptr), + threadAnimation(nullptr), + taskTreePreparation(nullptr), + waitAnimationWidget(nullptr) { ui->setupUi(this); + qDebug() << "AMMtasksWidget init thread ID " << QThread::currentThreadId(); + treeWidget = new QTreeWidget(); ui->horizontalLayout_1->addWidget(treeWidget); @@ -22,9 +29,7 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *pa preparationTreeWidget(); - ui->btnAssignTaskToTrainee->setEnabled(false); - - qDebug() << "AMMtasksWidget init thread ID " << QThread::currentThreadId(); + ui->btnAssignTaskToTrainee->setEnabled(false); threadPreparation = new QThread(); taskTreePreparation = new TaskTreePreparation(); @@ -34,16 +39,17 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *pa connect(this, &AMMtasksWidget::signal_prepareListItems, taskTreePreparation, &TaskTreePreparation::slot_prepareListItems); connect(taskTreePreparation, &TaskTreePreparation::signal_listItemsReady, this, &AMMtasksWidget::slot_listItemsReady); - waitAnimationWidget = new WaitAnimationWidget; + threadAnimation = new QThread(); + waitAnimationWidget = new WaitAnimationWidget; QMovie *movie = new QMovie(":/resources/icons/762.gif"); waitAnimationWidget->setParent(this); waitAnimationWidget->initialize(movie,this); - waitAnimationWidget->moveToThread(threadPreparation); + waitAnimationWidget->moveToThread(threadAnimation); + threadAnimation->start(); } AMMtasksWidget::~AMMtasksWidget() { - deleteAllModuls(); delete ui; } @@ -109,10 +115,8 @@ void AMMtasksWidget::loadTasksAMM() waitAnimationWidget->showWithPlay(); QByteArray array = connectorToServer->getListTaskAmmArray(); - loadAMMtasksFromXML(array); - //fillTree(); - signal_prepareListItems(listAllModules); + signal_prepareListItems(array, &listAllModules); } void AMMtasksWidget::slot_listItemsReady(QList listItems) @@ -121,141 +125,11 @@ void AMMtasksWidget::slot_listItemsReady(QList listItems) treeWidget->clear(); for(QTreeWidgetItem * item : listItems) - { treeWidget->addTopLevelItem(item); - } waitAnimationWidget->hideWithStop(); } -void AMMtasksWidget::domElementParser(QDomElement element, Module* moduleParent) -{ - QString name; - - QDomElement childElement = element.firstChildElement(); - if(childElement.isNull()) - return; - - Module* module = nullptr; - - do - { - name = childElement.nodeName(); - - QDomNamedNodeMap nodeMap = childElement.attributes(); - - if(name == "pm") - { - module = new PM(); - PM* PMmodul = static_cast(module); - - PMmodul->initialize(nodeMap.namedItem("modelIdentCode").nodeValue(), - nodeMap.namedItem("pmIssuer").nodeValue(), - nodeMap.namedItem("pmNumber").nodeValue(), - nodeMap.namedItem("pmVolume").nodeValue()); - - if(moduleParent) - { - PMmodul->setParentModule(moduleParent); - - PM* PMmodulParent = static_cast(moduleParent); - PMmodulParent->addChildModule(module); - } - } - else if(name == "dm") - { - module = new DM(); - DM* DMmodul = static_cast(module); - - DMmodul->initialize(nodeMap.namedItem("modelIdentCode").nodeValue(), - nodeMap.namedItem("systemDiffCode").nodeValue(), - nodeMap.namedItem("systemCode").nodeValue(), - nodeMap.namedItem("subSystemCode").nodeValue(), - nodeMap.namedItem("subSubSystemCode").nodeValue(), - nodeMap.namedItem("assyCode").nodeValue(), - nodeMap.namedItem("disassyCode").nodeValue(), - nodeMap.namedItem("disassyCodeVariant").nodeValue(), - nodeMap.namedItem("infoCode").nodeValue(), - nodeMap.namedItem("infoCodeVariant").nodeValue(), - nodeMap.namedItem("itemLocationCode").nodeValue()); - - if(moduleParent) - { - DMmodul->setParentModule(moduleParent); - - PM* PMmodulParent = static_cast(moduleParent); - PMmodulParent->addChildModule(module); - } - } - else if(name == "rus" || name == "eng") - { - if(moduleParent) - { - if(moduleParent->getType() == ModuleType::TYPE_PM) - {//PM - PM* PMmodulParent = static_cast(moduleParent); - - if(name == "rus") - PMmodulParent->setLangStructRus(nodeMap.namedItem("title").nodeValue()); - else - PMmodulParent->setLangStructEng(nodeMap.namedItem("title").nodeValue()); - } - else - {//DM - DM* DMmodulParent = static_cast(moduleParent); - - if(name == "rus") - DMmodulParent->setLangStructRus(nodeMap.namedItem("techName").nodeValue(), - nodeMap.namedItem("infoName").nodeValue(), - nodeMap.namedItem("pdf").nodeValue(), - nodeMap.namedItem("bookmark").nodeValue(), - nodeMap.namedItem("xml").nodeValue()); - else - DMmodulParent->setLangStructEng(nodeMap.namedItem("techName").nodeValue(), - nodeMap.namedItem("infoName").nodeValue(), - nodeMap.namedItem("pdf").nodeValue(), - nodeMap.namedItem("bookmark").nodeValue(), - nodeMap.namedItem("xml").nodeValue()); - } - } - - } - - domElementParser(childElement, module); - - if(moduleParent == nullptr) - listAllModules.append(module); - - }while (! (childElement = childElement.nextSiblingElement()).isNull()); -} - -void AMMtasksWidget::loadAMMtasksFromXML(QByteArray array) -{ - deleteAllModuls(); - - QDomDocument docTasksDOM; - - docTasksDOM.setContent(array); - - QDomElement manifestElement = docTasksDOM.firstChildElement("manifest"); - if(manifestElement.isNull()) - return; - - domElementParser(manifestElement, nullptr); -} - -void AMMtasksWidget::deleteAllModuls() -{ - for(Module* module: listAllModules) - { - if(module->getType() == ModuleType::TYPE_PM) - delete static_cast(module); - else - delete static_cast(module); - } - listAllModules.clear(); -} - Module *AMMtasksWidget::searchModuleByID(int id) { Module* ptrModule = nullptr; @@ -288,63 +162,6 @@ void AMMtasksWidget::reSetHeadTreeWidget() treeWidget->setHeaderLabels(listHeaders); } -void AMMtasksWidget::fillTree() -{ - //Обновление дерева - treeWidget->clear(); - - for(Module* module : listAllModules) - { - QTreeWidgetItem* item = addModuleToTreeWidget(module); - treeWidget->addTopLevelItem(item); - } -} - -QTreeWidgetItem* AMMtasksWidget::addModuleToTreeWidget(Module *module, QTreeWidgetItem* parentItem) -{ - QTreeWidgetItem* itemModule = nullptr; - - QString text; - QString ID = QString::number(module->getID()); - - if(parentItem) - { - itemModule = new QTreeWidgetItem(); - parentItem->addChild(itemModule); - } - else - { - //itemModule = new QTreeWidgetItem(treeWidget); - itemModule = new QTreeWidgetItem(); - } - - if(module->getType() == ModuleType::TYPE_PM) - { - PM* PMmodul = static_cast(module); - text = PMmodul->getLangStructRus().title; - - for(Module* module : PMmodul->getListChildModules()) - { - addModuleToTreeWidget(module, itemModule); - } - } - else - { - DM* DMmodul = static_cast(module); - text = DMmodul->getLangStructRus().techName; - - //itemModule->setFlags(itemModule->flags() | Qt::ItemIsUserCheckable); - //itemModule->setCheckState(0, Qt::Checked); - itemModule->setIcon(0, QIcon(":/resources/icons/procedure.png")); - } - - itemModule->setText(ColumnsTree::clmn_PMorDM, text); - itemModule->setText(ColumnsTree::clmn_ID, ID); - - return itemModule; -} - - void AMMtasksWidget::on_btnUpdateTasks_clicked() { connectorToServer->sendQueryTasksXML("amm"); diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index 72b9175..73f8fa1 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -38,7 +38,6 @@ public: private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); void on_btnUpdateTasks_clicked(); - void on_btnAssignTaskToTrainee_clicked(); public Q_SLOTS: @@ -48,21 +47,13 @@ public Q_SLOTS: void slot_traineeSelected(QString login); private: - void loadAMMtasksFromXML(QByteArray array); - void domElementParser(QDomElement element, Module* moduleParent); - void deleteAllModuls(); Module* searchModuleByID(int id); - void preparationTreeWidget(); void reSetHeadTreeWidget(); - - void fillTree(); - QTreeWidgetItem* addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr); - void loadTasksAMM(); Q_SIGNALS: - void signal_prepareListItems(QList listAllModules); + void signal_prepareListItems(QByteArray array, QList* listAllModules); public Q_SLOTS: void slot_listItemsReady(QList listItems); @@ -76,6 +67,7 @@ private: QString loginTraineeSelected; QThread* threadPreparation; + QThread* threadAnimation; TaskTreePreparation* taskTreePreparation; WaitAnimationWidget *waitAnimationWidget; }; diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp index fe42925..e749139 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp @@ -2,11 +2,18 @@ #include #include "tasktreepreparation.h" -TaskTreePreparation::TaskTreePreparation(QObject *parent) : QObject(parent) +TaskTreePreparation::TaskTreePreparation(QObject *parent) : + QObject(parent), + listAllModules(nullptr) { qDebug() << "TaskTreePreparation init thread ID " << QThread::currentThreadId(); } +TaskTreePreparation::~TaskTreePreparation() +{ + deleteAllModuls(); +} + QTreeWidgetItem *TaskTreePreparation::addModuleToTreeWidget(Module *module, QTreeWidgetItem *parentItem) { QTreeWidgetItem* itemModule = nullptr; @@ -14,16 +21,10 @@ QTreeWidgetItem *TaskTreePreparation::addModuleToTreeWidget(Module *module, QTre QString text; QString ID = QString::number(module->getID()); + itemModule = new QTreeWidgetItem(); + if(parentItem) - { - itemModule = new QTreeWidgetItem(); parentItem->addChild(itemModule); - } - else - { - //itemModule = new QTreeWidgetItem(treeWidget); - itemModule = new QTreeWidgetItem(); - } if(module->getType() == ModuleType::TYPE_PM) { @@ -51,13 +52,148 @@ QTreeWidgetItem *TaskTreePreparation::addModuleToTreeWidget(Module *module, QTre return itemModule; } -void TaskTreePreparation::slot_prepareListItems(QList listAllModules) +void TaskTreePreparation::loadAMMtasksFromXML(QByteArray array) +{ + deleteAllModuls(); + + QDomDocument docTasksDOM; + + docTasksDOM.setContent(array); + + QDomElement manifestElement = docTasksDOM.firstChildElement("manifest"); + if(manifestElement.isNull()) + return; + + domElementParser(manifestElement, nullptr); +} + +void TaskTreePreparation::deleteAllModuls() +{ + if(listAllModules == nullptr) + return; + + for(Module* module: *listAllModules) + { + if(module->getType() == ModuleType::TYPE_PM) + delete static_cast(module); + else + delete static_cast(module); + } + listAllModules->clear(); +} + +void TaskTreePreparation::domElementParser(QDomElement element, Module* moduleParent) +{ + QString name; + + QDomElement childElement = element.firstChildElement(); + if(childElement.isNull()) + return; + + Module* module = nullptr; + + do + { + name = childElement.nodeName(); + + QDomNamedNodeMap nodeMap = childElement.attributes(); + + if(name == "pm") + { + module = new PM(); + PM* PMmodul = static_cast(module); + + PMmodul->initialize(nodeMap.namedItem("modelIdentCode").nodeValue(), + nodeMap.namedItem("pmIssuer").nodeValue(), + nodeMap.namedItem("pmNumber").nodeValue(), + nodeMap.namedItem("pmVolume").nodeValue()); + + if(moduleParent) + { + PMmodul->setParentModule(moduleParent); + + PM* PMmodulParent = static_cast(moduleParent); + PMmodulParent->addChildModule(module); + } + } + else if(name == "dm") + { + module = new DM(); + DM* DMmodul = static_cast(module); + + DMmodul->initialize(nodeMap.namedItem("modelIdentCode").nodeValue(), + nodeMap.namedItem("systemDiffCode").nodeValue(), + nodeMap.namedItem("systemCode").nodeValue(), + nodeMap.namedItem("subSystemCode").nodeValue(), + nodeMap.namedItem("subSubSystemCode").nodeValue(), + nodeMap.namedItem("assyCode").nodeValue(), + nodeMap.namedItem("disassyCode").nodeValue(), + nodeMap.namedItem("disassyCodeVariant").nodeValue(), + nodeMap.namedItem("infoCode").nodeValue(), + nodeMap.namedItem("infoCodeVariant").nodeValue(), + nodeMap.namedItem("itemLocationCode").nodeValue()); + + if(moduleParent) + { + DMmodul->setParentModule(moduleParent); + + PM* PMmodulParent = static_cast(moduleParent); + PMmodulParent->addChildModule(module); + } + } + else if(name == "rus" || name == "eng") + { + if(moduleParent) + { + if(moduleParent->getType() == ModuleType::TYPE_PM) + {//PM + PM* PMmodulParent = static_cast(moduleParent); + + if(name == "rus") + PMmodulParent->setLangStructRus(nodeMap.namedItem("title").nodeValue()); + else + PMmodulParent->setLangStructEng(nodeMap.namedItem("title").nodeValue()); + } + else + {//DM + DM* DMmodulParent = static_cast(moduleParent); + + if(name == "rus") + DMmodulParent->setLangStructRus(nodeMap.namedItem("techName").nodeValue(), + nodeMap.namedItem("infoName").nodeValue(), + nodeMap.namedItem("pdf").nodeValue(), + nodeMap.namedItem("bookmark").nodeValue(), + nodeMap.namedItem("xml").nodeValue()); + else + DMmodulParent->setLangStructEng(nodeMap.namedItem("techName").nodeValue(), + nodeMap.namedItem("infoName").nodeValue(), + nodeMap.namedItem("pdf").nodeValue(), + nodeMap.namedItem("bookmark").nodeValue(), + nodeMap.namedItem("xml").nodeValue()); + } + } + + } + + domElementParser(childElement, module); + + if(moduleParent == nullptr) + listAllModules->append(module); + + }while (! (childElement = childElement.nextSiblingElement()).isNull()); +} + +void TaskTreePreparation::slot_prepareListItems(QByteArray array, QList* listAllModules) { qDebug() << "TaskTreePreparation::slot_prepareListItems thread ID " << QThread::currentThreadId(); + this->listAllModules = listAllModules; + + loadAMMtasksFromXML(array); + listItems.clear(); - for(Module* module : listAllModules) + for(Module* module : *this->listAllModules) { QTreeWidgetItem* item = addModuleToTreeWidget(module); listItems.append(item); diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.h b/InstructorsAndTrainees/tasks/tasktreepreparation.h index 3c5bdb0..1f9bc31 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.h +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.h @@ -3,6 +3,7 @@ #include #include +#include #include "module.h" class TaskTreePreparation : public QObject @@ -10,18 +11,23 @@ class TaskTreePreparation : public QObject Q_OBJECT public: explicit TaskTreePreparation(QObject *parent = nullptr); + ~TaskTreePreparation(); -public: +private: QTreeWidgetItem* addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr); + void loadAMMtasksFromXML(QByteArray array); + void domElementParser(QDomElement element, Module* moduleParent); + void deleteAllModuls(); public Q_SLOTS: - void slot_prepareListItems(QList listAllModules); + void slot_prepareListItems(QByteArray array, QList* listAllModules); Q_SIGNALS: void signal_listItemsReady(QList listItems); private: QList listItems; + QList* listAllModules; }; #endif // TASKTREEPREPARATION_H From f25bb386c0866c1d15160261f954ea330e5c8a18 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Fri, 24 Jan 2025 14:40:18 +0300 Subject: [PATCH 31/77] commitTMP --- .../instructors/instructorsview.cpp | 11 +-- .../instructorsandtraineeswidget.cpp | 28 ++++-- .../instructorsandtraineeswidget.ui | 38 ++++++++- .../messanger/messangerwidget.ui | 10 --- .../tasks/ammtaskswidget.cpp | 1 + .../tasks/ammtaskswidget.ui | 85 +++++++++---------- .../tasks/fimtaskswidget.cpp | 25 +++++- InstructorsAndTrainees/tasks/fimtaskswidget.h | 8 +- .../tasks/fimtaskswidget.ui | 73 +++++++--------- .../trainees/traineesview.cpp | 19 +++-- 10 files changed, 172 insertions(+), 126 deletions(-) diff --git a/InstructorsAndTrainees/instructors/instructorsview.cpp b/InstructorsAndTrainees/instructors/instructorsview.cpp index 1ab1788..caaca23 100644 --- a/InstructorsAndTrainees/instructors/instructorsview.cpp +++ b/InstructorsAndTrainees/instructors/instructorsview.cpp @@ -25,7 +25,7 @@ void InstructorsView::slot_NeedUpdateUI(bool treeInstructor, bool treeTrainee) if(adminMode) { treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_ID, false); - treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Archived, false); + treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Archived, true); } else { @@ -49,11 +49,11 @@ void InstructorsView::preparationTreeWidget() treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_ID, 50); treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Instructor, 250); - treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Login, 100); + treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Login, 80); treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Password, 100); treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Administrator, 100); - treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Archived, 100); - treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Logged, 100); + treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Archived, 80); + treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Logged, 80); if(typeView == TypeView::onlyView) {//onlyView @@ -77,7 +77,8 @@ void InstructorsView::preparationTreeWidget() if(adminMode) { - + treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_ID, false); + treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Archived, false); } else { diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 9ca8258..5b99bf9 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -65,15 +65,29 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : ui->horizontalLayout_3->addWidget(viewerTrainees); - ui->horizontalLayout_3->addWidget(messangerWidget); - ui->verticalLayout_1->addWidget(viewerInstructors); - ui->verticalLayout_2->addWidget(ammTasksWidget); - ui->verticalLayout_2->addWidget(fimTasksWidget); + QWidget* wGB2 = new QWidget(this); + QHBoxLayout* lGB2 = new QHBoxLayout(this); + wGB2->setLayout(lGB2); + lGB2->addWidget(ui->groupBox_2); + ui->horizontalLayout_3->addWidget(wGB2); + + ui->verticalLayout_41->addWidget(ammTasksWidget); + ui->verticalLayout_42->addWidget(fimTasksWidget); + + ui->verticalLayout_2->addWidget(messangerWidget); + + ui->verticalLayout_2->addWidget(viewerInstructors); + ui->btnSetVersion->hide(); - viewerTrainees->setMinimumHeight(800); - viewerInstructors->setMinimumSize(1800, 300); - messangerWidget->setMinimumSize(500, 600); + viewerTrainees->setMaximumWidth(1050); + //viewerInstructors->setMinimumSize(500, 200); + //viewerInstructors->setMaximumHeight(400); + + viewerInstructors->setMinimumSize(500, 400); + viewerInstructors->setMaximumWidth(500); + + messangerWidget->setMinimumSize(500, 800); messangerWidget->setMaximumWidth(500); //ui->btnAuthorizationInstructor->setEnabled(false); diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.ui b/InstructorsAndTrainees/instructorsandtraineeswidget.ui index 7b72e42..8c36119 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.ui +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.ui @@ -20,7 +20,7 @@ Form - + @@ -236,6 +236,42 @@ + + + + Tasks + + + + + + 1 + + + + AMM + + + + + + + + + + FIM + + + + + + + + + + + + diff --git a/InstructorsAndTrainees/messanger/messangerwidget.ui b/InstructorsAndTrainees/messanger/messangerwidget.ui index 6b4da74..ff637d9 100644 --- a/InstructorsAndTrainees/messanger/messangerwidget.ui +++ b/InstructorsAndTrainees/messanger/messangerwidget.ui @@ -119,16 +119,6 @@ Tab 1 - - - - 110 - 30 - 256 - 192 - - - diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index f64fade..a561561 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -30,6 +30,7 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *pa preparationTreeWidget(); ui->btnAssignTaskToTrainee->setEnabled(false); + ui->btnUpdateTasks->setVisible(false); threadPreparation = new QThread(); taskTreePreparation = new TaskTreePreparation(); diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.ui b/InstructorsAndTrainees/tasks/ammtaskswidget.ui index b23e553..f248f9a 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.ui +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.ui @@ -21,54 +21,45 @@ - + - - - AMM - - - - - - - - - - - Code - - - - - - - true - - - - - - - - - - - Update List - - - - - - - Assign task - - - - - - - + + + + + + + + Code + + + + + + + true + + + + + + + + + + + Update List + + + + + + + Assign task + + + + diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index caf7049..5d455e0 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "fimtaskswidget.h" #include "ui_fimtaskswidget.h" #include "tasksAmmFim.h" @@ -10,10 +11,14 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, QWidget *pa QWidget(parent), ui(new Ui::FIMtasksWidget), connectorToServer(connectorToServer), + treeWidget(nullptr), + userName(""), loginTraineeSelected("") { ui->setupUi(this); + qDebug() << "FIMtasksWidget init thread ID " << QThread::currentThreadId(); + treeWidget = new QTreeWidget(); ui->horizontalLayout_1->addWidget(treeWidget); @@ -22,6 +27,7 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, QWidget *pa preparationTreeWidget(); ui->btnAssignTaskToTrainee->setEnabled(false); + ui->btnUpdateTasks->setVisible(false); } FIMtasksWidget::~FIMtasksWidget() @@ -145,8 +151,8 @@ void FIMtasksWidget::fillTree() itemTask->setText(0, task->title); itemTask->setText(1, QString::number(task->id)); - itemTask->setFlags(itemTask->flags() | Qt::ItemIsUserCheckable); - itemTask->setCheckState(0, Qt::Checked); + //itemTask->setFlags(itemTask->flags() | Qt::ItemIsUserCheckable); + //itemTask->setCheckState(0, Qt::Checked); itemTask->setIcon(0, QIcon(":/resources/icons/procedure.png")); treeWidget->addTopLevelItem(itemTask); @@ -201,11 +207,13 @@ void FIMtasksWidget::reSetHeadTreeWidget() void FIMtasksWidget::slot_NeedUpdateUI() { + qDebug() << "FIMtasksWidget::slot_NeedUpdateUI thread ID " << QThread::currentThreadId(); loadTasksFIM(); } void FIMtasksWidget::slot_traineeSelected(QString login) { + qDebug() << "FIMtasksWidget::slot_traineeSelected thread ID " << QThread::currentThreadId(); loginTraineeSelected = login; } @@ -241,6 +249,17 @@ void FIMtasksWidget::deleteAllTaskAmmFim() listTaskAmmFim.clear(); } +void FIMtasksWidget::updateTaskItem(QTreeWidgetItem *itemTask) +{ + for (int i = 0; i < itemTask->childCount(); i++) + { + QTreeWidgetItem* itemMalfunction = itemTask->child(i); + itemMalfunction->setCheckState(0, Qt::Checked); + itemMalfunction->setExpanded(false); + } + itemTask->setExpanded(false); +} + void FIMtasksWidget::on_btnUpdateTasks_clicked() { connectorToServer->sendQueryTasksXML("fim"); @@ -265,5 +284,7 @@ void FIMtasksWidget::on_btnAssignTaskToTrainee_clicked() taskNew.title = task->title; connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE, trainee_id, &taskNew); + + updateTaskItem(current); } } diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index 3be156c..2db7732 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -43,18 +43,18 @@ public Q_SLOTS: void slot_traineeSelected(QString login); private: + TaskAmmFim* getTaskByID(int id); void loadFIMtasksFromXML(QByteArray array); + void fillTree(); void preparationTreeWidget(); void reSetHeadTreeWidget(); - - void fillTree(); - void loadTasksFIM(); - TaskAmmFim* getTaskByID(int id); void deleteAllTaskAmmFim(); + void updateTaskItem(QTreeWidgetItem *itemTask); + private: Ui::FIMtasksWidget *ui; ConnectorToServer* connectorToServer; diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.ui b/InstructorsAndTrainees/tasks/fimtaskswidget.ui index df023b4..cf2853d 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.ui +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.ui @@ -15,49 +15,40 @@ - + + + + - - - FIM + + + Update List + + + + + + + Assign task + + + + + + + + + + + Code + + + + + + + true - - - - - - - Update List - - - - - - - Assign task - - - - - - - - - - - Code - - - - - - - - - - - - diff --git a/InstructorsAndTrainees/trainees/traineesview.cpp b/InstructorsAndTrainees/trainees/traineesview.cpp index da57579..cee8a3b 100644 --- a/InstructorsAndTrainees/trainees/traineesview.cpp +++ b/InstructorsAndTrainees/trainees/traineesview.cpp @@ -24,7 +24,7 @@ void TraineesView::slot_NeedUpdateUI(bool treeInstructor, bool treeTrainee) if(adminMode) { treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_ID, false); - treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_Archived, false); + treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_Archived, true); } else { @@ -46,16 +46,16 @@ void TraineesView::preparationTreeWidget() reSetHeadTreeWidget(); - treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_ID, 80); + treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_ID, 50); treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Trainee, 250); - treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Login, 100); + treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Login, 80); treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Password, 100); - treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Class, 130); - treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Computer, 130); + treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Class, 100); + treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Computer, 100); treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_IP_address, 130); - treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Archived, 100); - treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Logged, 100); - treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Tasks, 200); + treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Archived, 80); + treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Logged, 80); + treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Tasks, 60); if(typeView == TypeView::onlyView) @@ -79,7 +79,8 @@ void TraineesView::preparationTreeWidget() if(adminMode) { - + treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_ID, false); + treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_Archived, false); } else { From b5ea06ce9a3902fd1fcdff8d678b007e96c2eb7a Mon Sep 17 00:00:00 2001 From: krivoshein Date: Fri, 24 Jan 2025 16:39:12 +0300 Subject: [PATCH 32/77] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5?= =?UTF-8?q?=D0=B9=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/commonview.cpp | 2 +- .../instructors/instructorsview.cpp | 40 +++---------------- .../instructorsandtraineeswidget.cpp | 14 ++++--- .../trainees/traineesview.cpp | 38 ++---------------- 4 files changed, 19 insertions(+), 75 deletions(-) diff --git a/InstructorsAndTrainees/commonview.cpp b/InstructorsAndTrainees/commonview.cpp index aa7ab43..8e6bb54 100644 --- a/InstructorsAndTrainees/commonview.cpp +++ b/InstructorsAndTrainees/commonview.cpp @@ -9,7 +9,7 @@ CommonView::CommonView(ConnectorToServer* connectorToServer, TypeView type, QWid treeWidget(nullptr), typeView(type), archiveVisible(false), - notLoggedInVisible(false), + notLoggedInVisible(true), adminMode(false), authComplited(false), lastCurrentID(0), diff --git a/InstructorsAndTrainees/instructors/instructorsview.cpp b/InstructorsAndTrainees/instructors/instructorsview.cpp index caaca23..784e9ce 100644 --- a/InstructorsAndTrainees/instructors/instructorsview.cpp +++ b/InstructorsAndTrainees/instructors/instructorsview.cpp @@ -10,29 +10,6 @@ InstructorsView::InstructorsView(ConnectorToServer* connectorToServer, TypeView void InstructorsView::slot_NeedUpdateUI(bool treeInstructor, bool treeTrainee) { - if(typeView == TypeView::onlyView) - { - if(adminMode) - archiveVisible = false; - else - archiveVisible = false; - } - else - { - archiveVisible = true; - } - - if(adminMode) - { - treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_ID, false); - treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Archived, true); - } - else - { - treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_ID, true); - treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Archived, true); - } - updateButtons(); if(treeInstructor) @@ -49,31 +26,24 @@ void InstructorsView::preparationTreeWidget() treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_ID, 50); treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Instructor, 250); - treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Login, 80); + treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Login, 100); treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Password, 100); - treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Administrator, 100); + treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Administrator, 120); treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Archived, 80); - treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Logged, 80); + treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Logged, 100); if(typeView == TypeView::onlyView) {//onlyView + archiveVisible = false; + treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_ID, true); - //treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Login, true); treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Password, true); treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Archived, true); treeWidget->setColumnHidden(ColumnsTreeInsructors::clmn_Administrator, true); - - if(adminMode) - archiveVisible = false; - else - archiveVisible = false; - - notLoggedInVisible = true; } else {//control archiveVisible = true; - notLoggedInVisible = true; if(adminMode) { diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 5b99bf9..274b9c0 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -80,15 +80,19 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : ui->verticalLayout_2->addWidget(viewerInstructors); ui->btnSetVersion->hide(); + + viewerTrainees->setMinimumSize(500, 500); viewerTrainees->setMaximumWidth(1050); - //viewerInstructors->setMinimumSize(500, 200); - //viewerInstructors->setMaximumHeight(400); - viewerInstructors->setMinimumSize(500, 400); + wGB2->setMinimumSize(500, 500); + //wGB2->setMaximumWidth(1050); + + viewerInstructors->setMinimumSize(400, 400); viewerInstructors->setMaximumWidth(500); + viewerInstructors->setMaximumHeight(400); - messangerWidget->setMinimumSize(500, 800); - messangerWidget->setMaximumWidth(500); + messangerWidget->setMinimumSize(500, 500); + messangerWidget->setMaximumWidth(500); //ui->btnAuthorizationInstructor->setEnabled(false); diff --git a/InstructorsAndTrainees/trainees/traineesview.cpp b/InstructorsAndTrainees/trainees/traineesview.cpp index cee8a3b..e6350fe 100644 --- a/InstructorsAndTrainees/trainees/traineesview.cpp +++ b/InstructorsAndTrainees/trainees/traineesview.cpp @@ -9,29 +9,6 @@ TraineesView::TraineesView(ConnectorToServer* connectorToServer, TypeView type, void TraineesView::slot_NeedUpdateUI(bool treeInstructor, bool treeTrainee) { - if(typeView == TypeView::onlyView) - { - if(adminMode) - archiveVisible = false; - else - archiveVisible = false; - } - else - { - archiveVisible = true; - } - - if(adminMode) - { - treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_ID, false); - treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_Archived, true); - } - else - { - treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_ID, true); - treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_Archived, true); - } - updateButtons(); if(treeTrainee) @@ -48,34 +25,27 @@ void TraineesView::preparationTreeWidget() treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_ID, 50); treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Trainee, 250); - treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Login, 80); + 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, 80); + treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Logged, 100); treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Tasks, 60); if(typeView == TypeView::onlyView) {//onlyView + archiveVisible = false; + treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_ID, true); - //treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_Login, true); treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_Password, true); treeWidget->setColumnHidden(ColumnsTreeTrainees::clmn_Archived, true); - - if(adminMode) - archiveVisible = false; - else - archiveVisible = false; - - notLoggedInVisible = true; } else {//control archiveVisible = true; - notLoggedInVisible = true; if(adminMode) { From d9f660555e4145e6cfa7f78239cbbd5648922a3d Mon Sep 17 00:00:00 2001 From: krivoshein Date: Mon, 27 Jan 2025 09:41:34 +0300 Subject: [PATCH 33/77] =?UTF-8?q?=D0=91=D0=BB=D0=BE=D0=BA=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BE=D0=BA?= =?UTF-8?q?=20EditTrainees=20EditInstructors=20=D0=BF=D1=80=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=B5=D0=B0=D0=B2=D1=82=D0=BE=D1=80=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/commonview.h | 6 +----- InstructorsAndTrainees/instructors/viewerinstructors.cpp | 6 ++++++ InstructorsAndTrainees/instructors/viewerinstructors.h | 3 +++ InstructorsAndTrainees/trainees/viewertrainees.cpp | 6 ++++++ InstructorsAndTrainees/trainees/viewertrainees.h | 3 +++ 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/InstructorsAndTrainees/commonview.h b/InstructorsAndTrainees/commonview.h index 157044e..123cdb4 100644 --- a/InstructorsAndTrainees/commonview.h +++ b/InstructorsAndTrainees/commonview.h @@ -34,11 +34,7 @@ public: void setAdminMode(bool adminMode) { this->adminMode = adminMode; - } - void setAuthComplited(bool authComplited) - { - this->authComplited = authComplited; - } + } void clearTree() { treeWidget->clear(); diff --git a/InstructorsAndTrainees/instructors/viewerinstructors.cpp b/InstructorsAndTrainees/instructors/viewerinstructors.cpp index c72d8e9..9ef38c9 100644 --- a/InstructorsAndTrainees/instructors/viewerinstructors.cpp +++ b/InstructorsAndTrainees/instructors/viewerinstructors.cpp @@ -22,6 +22,12 @@ ViewerInstructors::~ViewerInstructors() delete ui; } +void ViewerInstructors::setAuthComplited(bool authComplited) +{ + this->authComplited = authComplited; + updateButtons(); +} + void ViewerInstructors::changeEvent(QEvent *event) { // В случае получения события изменения языка приложения diff --git a/InstructorsAndTrainees/instructors/viewerinstructors.h b/InstructorsAndTrainees/instructors/viewerinstructors.h index 3febad1..e055b0f 100644 --- a/InstructorsAndTrainees/instructors/viewerinstructors.h +++ b/InstructorsAndTrainees/instructors/viewerinstructors.h @@ -17,6 +17,9 @@ public: explicit ViewerInstructors(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); ~ViewerInstructors(); +public: + void setAuthComplited(bool authComplited); + protected: void changeEvent(QEvent * event) override; diff --git a/InstructorsAndTrainees/trainees/viewertrainees.cpp b/InstructorsAndTrainees/trainees/viewertrainees.cpp index 487fc24..ab3b2e9 100644 --- a/InstructorsAndTrainees/trainees/viewertrainees.cpp +++ b/InstructorsAndTrainees/trainees/viewertrainees.cpp @@ -21,6 +21,12 @@ ViewerTrainees::~ViewerTrainees() delete ui; } +void ViewerTrainees::setAuthComplited(bool authComplited) +{ + this->authComplited = authComplited; + updateButtons(); +} + /* void ViewerTrainees::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column) { diff --git a/InstructorsAndTrainees/trainees/viewertrainees.h b/InstructorsAndTrainees/trainees/viewertrainees.h index 6613484..1dc19be 100644 --- a/InstructorsAndTrainees/trainees/viewertrainees.h +++ b/InstructorsAndTrainees/trainees/viewertrainees.h @@ -17,6 +17,9 @@ public: explicit ViewerTrainees(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); ~ViewerTrainees(); +public: + void setAuthComplited(bool authComplited); + protected: void changeEvent(QEvent * event) override; From 2fe92856f854a23b3a75e80b21608211232f6abc Mon Sep 17 00:00:00 2001 From: krivoshein Date: Mon, 27 Jan 2025 09:55:25 +0300 Subject: [PATCH 34/77] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BE=D0=BB=D0=BE=D0=BD=D0=BA=D1=83=20code=20?= =?UTF-8?q?=D0=B2=20=D0=B2=D0=B8=D0=B4=D0=B6=D0=B5=D1=82=20AMM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/tasks/ammtaskswidget.cpp | 3 ++- InstructorsAndTrainees/tasks/ammtaskswidget.h | 7 ++----- InstructorsAndTrainees/tasks/tasktreepreparation.cpp | 11 ++++++++--- InstructorsAndTrainees/tasks/tasktreepreparation.h | 6 ++++++ 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index a561561..f80f14d 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -153,13 +153,14 @@ void AMMtasksWidget::preparationTreeWidget() treeWidget->setColumnWidth(ColumnsTree::clmn_ID, 80); treeWidget->setColumnWidth(ColumnsTree::clmn_PMorDM, 900); + treeWidget->setColumnWidth(ColumnsTree::clmn_code, 200); //treeWidget->setColumnHidden(ColumnsTree::clmn_ID, true); } void AMMtasksWidget::reSetHeadTreeWidget() { - QStringList listHeaders = {tr("PM/DM"), tr("ID")}; + QStringList listHeaders = {tr("PM/DM"), tr("Code"), tr("ID")}; treeWidget->setHeaderLabels(listHeaders); } diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index 73f8fa1..71772e0 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -16,11 +16,8 @@ class AMMtasksWidget : public QWidget { Q_OBJECT -private: - enum ColumnsTree{ - clmn_PMorDM = 0, - clmn_ID - }; +public: + public: explicit AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp index e749139..17a7200 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp @@ -2,6 +2,7 @@ #include #include "tasktreepreparation.h" + TaskTreePreparation::TaskTreePreparation(QObject *parent) : QObject(parent), listAllModules(nullptr) @@ -18,8 +19,9 @@ QTreeWidgetItem *TaskTreePreparation::addModuleToTreeWidget(Module *module, QTre { QTreeWidgetItem* itemModule = nullptr; - QString text; + QString text = ""; QString ID = QString::number(module->getID()); + QString code = ""; itemModule = new QTreeWidgetItem(); @@ -30,6 +32,7 @@ QTreeWidgetItem *TaskTreePreparation::addModuleToTreeWidget(Module *module, QTre { PM* PMmodul = static_cast(module); text = PMmodul->getLangStructRus().title; + code = PMmodul->pmCode(); for(Module* module : PMmodul->getListChildModules()) { @@ -40,14 +43,16 @@ QTreeWidgetItem *TaskTreePreparation::addModuleToTreeWidget(Module *module, QTre { DM* DMmodul = static_cast(module); text = DMmodul->getLangStructRus().techName; + code = DMmodul->dmCode(); //itemModule->setFlags(itemModule->flags() | Qt::ItemIsUserCheckable); //itemModule->setCheckState(0, Qt::Checked); itemModule->setIcon(0, QIcon(":/resources/icons/procedure.png")); } - itemModule->setText(0, text); - itemModule->setText(1, ID); + itemModule->setText(ColumnsTree::clmn_PMorDM, text); + itemModule->setText(ColumnsTree::clmn_code, code); + itemModule->setText(ColumnsTree::clmn_ID, ID); return itemModule; } diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.h b/InstructorsAndTrainees/tasks/tasktreepreparation.h index 1f9bc31..c6bdbd2 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.h +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.h @@ -6,6 +6,12 @@ #include #include "module.h" +enum ColumnsTree{ + clmn_PMorDM = 0, + clmn_code, + clmn_ID +}; + class TaskTreePreparation : public QObject { Q_OBJECT From 54e9ae6019e820950986a4ceebf4496101974bf5 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Mon, 27 Jan 2025 10:31:01 +0300 Subject: [PATCH 35/77] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B8=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B4=D0=B0=D1=87=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D0=BA=D1=80=D0=B5=D1=82=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=83=D1=87=D0=B0=D0=B5=D0=BC=D0=BE=D0=B3=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../instructorsandtraineeswidget.cpp | 4 ++-- InstructorsAndTrainees/tasks/ammtaskswidget.cpp | 10 +++++++++- InstructorsAndTrainees/tasks/ammtaskswidget.h | 8 +++++++- InstructorsAndTrainees/tasks/fimtaskswidget.cpp | 10 +++++++++- InstructorsAndTrainees/tasks/fimtaskswidget.h | 10 +++++++++- InstructorsAndTrainees/trainees/viewertrainees.cpp | 10 +++++++++- InstructorsAndTrainees/trainees/viewertrainees.h | 6 ++++++ InstructorsAndTrainees/trainees/viewertrainees.ui | 3 +++ 8 files changed, 54 insertions(+), 7 deletions(-) diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 274b9c0..7aab0dc 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -48,8 +48,8 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : connect(connectorToServer,&ConnectorToServer::signal_ConnectedToServer,this,&InstructorsAndTraineesWidget::slot_ConnectedToServer); - ammTasksWidget = new AMMtasksWidget(connectorToServer, this); - fimTasksWidget = new FIMtasksWidget(connectorToServer, this); + ammTasksWidget = new AMMtasksWidget(connectorToServer, AMMtasksWidget::TypeList::listCommon, this); + fimTasksWidget = new FIMtasksWidget(connectorToServer, FIMtasksWidget::TypeList::listForTrainee, this); connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksFIM, fimTasksWidget, &FIMtasksWidget::slot_NeedUpdateUI); connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksAMM, ammTasksWidget, &AMMtasksWidget::slot_NeedUpdateUI); diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index f80f14d..3af1b3b 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -7,11 +7,12 @@ #include "ammtaskswidget.h" #include "ui_ammtaskswidget.h" -AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *parent) : +AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeList type, QWidget *parent) : QWidget(parent), ui(new Ui::AMMtasksWidget), connectorToServer(connectorToServer), treeWidget(nullptr), + type(type), loginTraineeSelected(""), threadPreparation(nullptr), threadAnimation(nullptr), @@ -32,6 +33,13 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *pa ui->btnAssignTaskToTrainee->setEnabled(false); ui->btnUpdateTasks->setVisible(false); + if(type == TypeList::listForTrainee) + { + ui->btnAssignTaskToTrainee->setVisible(false); + ui->label->setVisible(false); + ui->editCode->setVisible(false); + } + threadPreparation = new QThread(); taskTreePreparation = new TaskTreePreparation(); taskTreePreparation->moveToThread(threadPreparation); diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index 71772e0..f25f290 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -17,10 +17,15 @@ class AMMtasksWidget : public QWidget Q_OBJECT public: + enum TypeList + { + listCommon = 0, + listForTrainee + }; public: - explicit AMMtasksWidget(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); + explicit AMMtasksWidget(ConnectorToServer* connectorToServer, TypeList type, QWidget *parent = nullptr); ~AMMtasksWidget(); public: @@ -58,6 +63,7 @@ private: Ui::AMMtasksWidget *ui; ConnectorToServer* connectorToServer; QTreeWidget* treeWidget; + TypeList type; private: QList listAllModules; diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index 5d455e0..5e95f64 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -7,11 +7,12 @@ #include "ui_fimtaskswidget.h" #include "tasksAmmFim.h" -FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, QWidget *parent) : +FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, TypeList type, QWidget *parent) : QWidget(parent), ui(new Ui::FIMtasksWidget), connectorToServer(connectorToServer), treeWidget(nullptr), + type(type), userName(""), loginTraineeSelected("") { @@ -28,6 +29,13 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, QWidget *pa ui->btnAssignTaskToTrainee->setEnabled(false); ui->btnUpdateTasks->setVisible(false); + + if(type == TypeList::listForTrainee) + { + ui->btnAssignTaskToTrainee->setVisible(false); + ui->label->setVisible(false); + ui->editCode->setVisible(false); + } } FIMtasksWidget::~FIMtasksWidget() diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index 2db7732..54720db 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -14,6 +14,13 @@ class FIMtasksWidget : public QWidget { Q_OBJECT +public: + enum TypeList + { + listCommon = 0, + listForTrainee + }; + private: enum ColumnsTree{ clmn_Title = 0, @@ -21,7 +28,7 @@ private: }; public: - explicit FIMtasksWidget(ConnectorToServer* connectorToServer, QWidget *parent = nullptr); + explicit FIMtasksWidget(ConnectorToServer* connectorToServer, TypeList type, QWidget *parent = nullptr); ~FIMtasksWidget(); public: @@ -59,6 +66,7 @@ private: Ui::FIMtasksWidget *ui; ConnectorToServer* connectorToServer; QTreeWidget* treeWidget; + TypeList type; private: QString userName; diff --git a/InstructorsAndTrainees/trainees/viewertrainees.cpp b/InstructorsAndTrainees/trainees/viewertrainees.cpp index ab3b2e9..f467191 100644 --- a/InstructorsAndTrainees/trainees/viewertrainees.cpp +++ b/InstructorsAndTrainees/trainees/viewertrainees.cpp @@ -4,7 +4,9 @@ ViewerTrainees::ViewerTrainees(ConnectorToServer* connectorToServer, QWidget *parent) : TraineesView(connectorToServer, CommonView::TypeView::onlyView, parent), - ui(new Ui::ViewerTrainees) + ui(new Ui::ViewerTrainees), + ammTasksWidget(nullptr), + fimTasksWidget(nullptr) { ui->setupUi(this); @@ -12,6 +14,12 @@ ViewerTrainees::ViewerTrainees(ConnectorToServer* connectorToServer, QWidget *pa ui->horizontalLayout_1->addWidget(treeWidget); + ammTasksWidget = new AMMtasksWidget(connectorToServer, AMMtasksWidget::TypeList::listForTrainee, this); + fimTasksWidget = new FIMtasksWidget(connectorToServer, FIMtasksWidget::TypeList::listForTrainee, this); + + ui->verticalLayout_2->addWidget(ammTasksWidget); + ui->verticalLayout_2->addWidget(fimTasksWidget); + preparationTreeWidget(); setNotLoggedInVisible(true); } diff --git a/InstructorsAndTrainees/trainees/viewertrainees.h b/InstructorsAndTrainees/trainees/viewertrainees.h index 1dc19be..e3be26a 100644 --- a/InstructorsAndTrainees/trainees/viewertrainees.h +++ b/InstructorsAndTrainees/trainees/viewertrainees.h @@ -2,6 +2,8 @@ #define TRAINEESWIDGET_H #include "traineesview.h" +#include "ammtaskswidget.h" +#include "fimtaskswidget.h" namespace Ui { class ViewerTrainees; @@ -43,6 +45,10 @@ Q_SIGNALS: private: void updateButtons() override; +private: + AMMtasksWidget* ammTasksWidget; + FIMtasksWidget* fimTasksWidget; + private: Ui::ViewerTrainees *ui; }; diff --git a/InstructorsAndTrainees/trainees/viewertrainees.ui b/InstructorsAndTrainees/trainees/viewertrainees.ui index aee5a98..122e49d 100644 --- a/InstructorsAndTrainees/trainees/viewertrainees.ui +++ b/InstructorsAndTrainees/trainees/viewertrainees.ui @@ -38,6 +38,9 @@ + + + From 923003a1600977c01a49f4abf72332fa66d4aa3a Mon Sep 17 00:00:00 2001 From: krivoshein Date: Mon, 27 Jan 2025 11:40:22 +0300 Subject: [PATCH 36/77] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=BA=D1=83=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=81=D0=BE=D0=B2=20=D0=B2=20=D1=81=D0=B5=D1=80?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=20=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=BB=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BA=D0=BE=D0=BD=D0=BA=D1=80=D0=B5=D1=82=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=BE=D0=B1=D1=83=D1=87=D0=B0=D0=B5=D0=BC=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/typeQueryToDB.h | 4 ++- .../instructorsandtraineeswidget.cpp | 2 +- .../tasks/ammtaskswidget.cpp | 6 +++++ .../tasks/fimtaskswidget.cpp | 6 +++++ .../trainees/viewertrainees.cpp | 25 +++++++++++++++++-- 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/DataBaseLMS/typeQueryToDB.h b/DataBaseLMS/typeQueryToDB.h index 72b45f0..d534b0c 100644 --- a/DataBaseLMS/typeQueryToDB.h +++ b/DataBaseLMS/typeQueryToDB.h @@ -15,7 +15,9 @@ enum TypeQueryToDB{ TYPE_QUERY_DEL_TRAINEE, TYPE_QUERY_EDIT_TRAINEE, TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, - TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE + TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE, + TYPE_QUERY_GET_TASKS_AMM_FOR_TRAINEE, + TYPE_QUERY_GET_TASKS_FIM_FOR_TRAINEE }; #endif // TYPEQUERYTODB_H diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 7aab0dc..d3e9255 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -49,7 +49,7 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : connect(connectorToServer,&ConnectorToServer::signal_ConnectedToServer,this,&InstructorsAndTraineesWidget::slot_ConnectedToServer); ammTasksWidget = new AMMtasksWidget(connectorToServer, AMMtasksWidget::TypeList::listCommon, this); - fimTasksWidget = new FIMtasksWidget(connectorToServer, FIMtasksWidget::TypeList::listForTrainee, this); + fimTasksWidget = new FIMtasksWidget(connectorToServer, FIMtasksWidget::TypeList::listCommon, this); connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksFIM, fimTasksWidget, &FIMtasksWidget::slot_NeedUpdateUI); connect(connectorToServer, &ConnectorToServer::signal_UpdateTasksAMM, ammTasksWidget, &AMMtasksWidget::slot_NeedUpdateUI); diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index 3af1b3b..1699a20 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -114,6 +114,12 @@ void AMMtasksWidget::slot_traineeSelected(QString login) { qDebug() << "AMMtasksWidget::slot_traineeSelected thread ID " << QThread::currentThreadId(); loginTraineeSelected = login; + + if(type == TypeList::listForTrainee) + { + int trainee_id = connectorToServer->getIdTraineeByLogin(loginTraineeSelected); + connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_GET_TASKS_AMM_FOR_TRAINEE, trainee_id); + } } void AMMtasksWidget::loadTasksAMM() diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index 5e95f64..1fb4c07 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -223,6 +223,12 @@ void FIMtasksWidget::slot_traineeSelected(QString login) { qDebug() << "FIMtasksWidget::slot_traineeSelected thread ID " << QThread::currentThreadId(); loginTraineeSelected = login; + + if(type == TypeList::listForTrainee) + { + int trainee_id = connectorToServer->getIdTraineeByLogin(loginTraineeSelected); + connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_GET_TASKS_FIM_FOR_TRAINEE, trainee_id); + } } void FIMtasksWidget::loadTasksFIM() diff --git a/InstructorsAndTrainees/trainees/viewertrainees.cpp b/InstructorsAndTrainees/trainees/viewertrainees.cpp index f467191..0624d7d 100644 --- a/InstructorsAndTrainees/trainees/viewertrainees.cpp +++ b/InstructorsAndTrainees/trainees/viewertrainees.cpp @@ -17,6 +17,9 @@ ViewerTrainees::ViewerTrainees(ConnectorToServer* connectorToServer, QWidget *pa ammTasksWidget = new AMMtasksWidget(connectorToServer, AMMtasksWidget::TypeList::listForTrainee, this); fimTasksWidget = new FIMtasksWidget(connectorToServer, FIMtasksWidget::TypeList::listForTrainee, this); + connect(this, &ViewerTrainees::signal_traineeSelected, fimTasksWidget, &FIMtasksWidget::slot_traineeSelected); + connect(this, &ViewerTrainees::signal_traineeSelected, ammTasksWidget, &AMMtasksWidget::slot_traineeSelected); + ui->verticalLayout_2->addWidget(ammTasksWidget); ui->verticalLayout_2->addWidget(fimTasksWidget); @@ -47,6 +50,9 @@ void ViewerTrainees::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column void ViewerTrainees::slot_tabMessengerChanged(QString login) { + if(login == "") + return; + for (int i = 0; i < treeWidget->topLevelItemCount(); i++) {//Проход по группам int countChild = treeWidget->topLevelItem(i)->childCount(); @@ -58,7 +64,12 @@ void ViewerTrainees::slot_tabMessengerChanged(QString login) { treeWidget->setCurrentItem(treeWidget->topLevelItem(i)->child(j)); typeObject = TypeObject::objTrainee; - lastCurrentID = connectorToServer->getIdTraineeByLogin(login); + int newCurrentID = connectorToServer->getIdTraineeByLogin(login); + + if(newCurrentID == lastCurrentID) + return; + + lastCurrentID = newCurrentID; Q_EMIT signal_traineeSelected(login); return; } @@ -106,7 +117,17 @@ void ViewerTrainees::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, if(current->childCount() == 0) {//Выбран обучаемый QString login = current->text(ColumnsTreeTrainees::clmn_Login); - Q_EMIT signal_traineeSelected(login); + if(login != "") + { + int newCurrentID = connectorToServer->getIdTraineeByLogin(login); + + if(newCurrentID == lastCurrentID) + return; + + lastCurrentID = newCurrentID; + + Q_EMIT signal_traineeSelected(login); + } } } From 5aa24ad242e940a6ca45c9e4a4e08d4a2eecaef8 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Mon, 27 Jan 2025 12:50:45 +0300 Subject: [PATCH 37/77] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BB=20=D1=81=D0=B8=D0=B3=D0=BD?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B0=D0=B2=D1=82=D0=BE=D1=80=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B2=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ServerLMS/Systems/commonclienthandler.cpp | 2 +- ServerLMS/Systems/commonclienthandler.h | 2 +- ServerLMS/Systems/processingsystem.cpp | 24 +++++++++++------------ ServerLMS/Systems/processingsystem.h | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/ServerLMS/Systems/commonclienthandler.cpp b/ServerLMS/Systems/commonclienthandler.cpp index e7e769d..2a84c6f 100644 --- a/ServerLMS/Systems/commonclienthandler.cpp +++ b/ServerLMS/Systems/commonclienthandler.cpp @@ -39,7 +39,7 @@ void CommonClientHandler::sendCurrentVersionToAllClient() } } -void CommonClientHandler::slot_AuthChanged() +void CommonClientHandler::slot_ListsInstructorsTraineesChanged() { //Проходим все открытые сокеты foreach(int idSocket, clientsMap->keys()) diff --git a/ServerLMS/Systems/commonclienthandler.h b/ServerLMS/Systems/commonclienthandler.h index 1abf5b8..0348e05 100644 --- a/ServerLMS/Systems/commonclienthandler.h +++ b/ServerLMS/Systems/commonclienthandler.h @@ -20,7 +20,7 @@ public: void sendNewVersionListToAllClient(); void sendCurrentVersionToAllClient(); - void slot_AuthChanged(); + void slot_ListsInstructorsTraineesChanged(); void slot_sendPacketToAllClients(PacketType packetType); //слот обработки сигнала о готовности нового сообщения на отправку клиенту от мессенджера void slot_msgToClientFromGUI(QString login, QString text); diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 9acc099..6c25246 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -22,7 +22,7 @@ void ProcessingSystem::initialize(ServerLMSWidget *server, this->server = server; this->updateController = updateController; - connect(this,&ProcessingSystem::sigAuthChanged,commonClientHandler, &CommonClientHandler::slot_AuthChanged,Qt::AutoConnection); + connect(this,&ProcessingSystem::sigListsInstructorsTraineesChanged,commonClientHandler, &CommonClientHandler::slot_ListsInstructorsTraineesChanged,Qt::AutoConnection); connect(this,&ProcessingSystem::sigUpdateListClients,server, &ServerLMSWidget::slotUpdateListClients,Qt::AutoConnection); connect(this,&ProcessingSystem::sigSetData,updateController,&UpdateController::setDataInfo,Qt::AutoConnection); connect(this,&ProcessingSystem::signal_msgToClientReady,commonClientHandler, &CommonClientHandler::slot_msgToClientFromGUI); @@ -82,7 +82,7 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien //logger->addTextToLogger("To Client: " + str); //Извещаем об изменениях в авторизации - emit sigAuthChanged(); + emit sigListsInstructorsTraineesChanged(); } void ProcessingSystem::processingClientDeAutorization(ClientHandler *client, ClientDeAutorization clientDeAutorization) @@ -127,7 +127,7 @@ void ProcessingSystem::processingClientDeAutorization(ClientHandler *client, Cli //logger->addTextToLogger("To Client: " + str); //Извещаем об изменениях в авторизации - emit sigAuthChanged(); + emit sigListsInstructorsTraineesChanged(); } void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQueryToDB clientQueryToDB, int id, void* data) @@ -162,19 +162,19 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu (*(Instructor*)data).setID(id_new); providerDBLMS->editInstructor(*(Instructor*)data); } - emit sigAuthChanged(); + emit sigListsInstructorsTraineesChanged(); break; } case TypeQueryToDB::TYPE_QUERY_DEL_INSTRUCTOR: { providerDBLMS->delInstructor(id); - emit sigAuthChanged(); + emit sigListsInstructorsTraineesChanged(); break; } case TypeQueryToDB::TYPE_QUERY_EDIT_INSTRUCTOR: { providerDBLMS->editInstructor(*(Instructor*)data); - emit sigAuthChanged(); + emit sigListsInstructorsTraineesChanged(); break; } @@ -187,19 +187,19 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu (*(Trainee*)data).setID(id_new); providerDBLMS->editTrainee(*(Trainee*)data); } - emit sigAuthChanged(); + emit sigListsInstructorsTraineesChanged(); break; } case TypeQueryToDB::TYPE_QUERY_DEL_TRAINEE: { providerDBLMS->delTrainee(id); - emit sigAuthChanged(); + emit sigListsInstructorsTraineesChanged(); break; } case TypeQueryToDB::TYPE_QUERY_EDIT_TRAINEE: { providerDBLMS->editTrainee(*(Trainee*)data); - emit sigAuthChanged(); + emit sigListsInstructorsTraineesChanged(); break; } @@ -212,19 +212,19 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu (*(Group*)data).setID(id_new); providerDBLMS->editGroup(*(Group*)data); } - emit sigAuthChanged(); + emit sigListsInstructorsTraineesChanged(); break; } case TypeQueryToDB::TYPE_QUERY_DEL_GROUP: { providerDBLMS->delGroup(id); - emit sigAuthChanged(); + emit sigListsInstructorsTraineesChanged(); break; } case TypeQueryToDB::TYPE_QUERY_EDIT_GROUP: { providerDBLMS->editGroup(*(Group*)data); - emit sigAuthChanged(); + emit sigListsInstructorsTraineesChanged(); break; } diff --git a/ServerLMS/Systems/processingsystem.h b/ServerLMS/Systems/processingsystem.h index ca75dfa..d497eac 100644 --- a/ServerLMS/Systems/processingsystem.h +++ b/ServerLMS/Systems/processingsystem.h @@ -41,7 +41,7 @@ public: void setCurrentDataInfo(DataInfo *dataInfo); signals: void sigUpdateListClients(); - void sigAuthChanged(); + void sigListsInstructorsTraineesChanged(); void sigLogMessage(QString log); void sigAddToMessanger(QString login,QString text); void signal_msgToClientReady(QString login, QString text); From eebe56dd6ca8357f21f3bd1d0ee1778e2db7fa67 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Mon, 27 Jan 2025 15:17:49 +0300 Subject: [PATCH 38/77] stopParser --- InstructorsAndTrainees/tasks/ammtaskswidget.cpp | 15 +++++++++++++++ .../tasks/tasktreepreparation.cpp | 14 +++++++++++++- .../tasks/tasktreepreparation.h | 4 ++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index 1699a20..9356ef7 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -59,6 +59,21 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty AMMtasksWidget::~AMMtasksWidget() { + waitAnimationWidget->hideWithStop(); + taskTreePreparation->stopParser(); + + threadAnimation->quit(); + threadAnimation->wait(); + + threadPreparation->quit(); + threadPreparation->wait(); + + delete threadAnimation; + delete threadPreparation; + + delete taskTreePreparation; + delete waitAnimationWidget; + delete treeWidget; delete ui; } diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp index 17a7200..0ec82e9 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp @@ -5,7 +5,8 @@ TaskTreePreparation::TaskTreePreparation(QObject *parent) : QObject(parent), - listAllModules(nullptr) + listAllModules(nullptr), + flagStop(false) { qDebug() << "TaskTreePreparation init thread ID " << QThread::currentThreadId(); } @@ -15,10 +16,18 @@ TaskTreePreparation::~TaskTreePreparation() deleteAllModuls(); } +void TaskTreePreparation::stopParser() +{ + flagStop = true; +} + QTreeWidgetItem *TaskTreePreparation::addModuleToTreeWidget(Module *module, QTreeWidgetItem *parentItem) { QTreeWidgetItem* itemModule = nullptr; + if(flagStop) + return itemModule; + QString text = ""; QString ID = QString::number(module->getID()); QString code = ""; @@ -91,6 +100,9 @@ void TaskTreePreparation::domElementParser(QDomElement element, Module* modulePa { QString name; + if(flagStop) + return; + QDomElement childElement = element.firstChildElement(); if(childElement.isNull()) return; diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.h b/InstructorsAndTrainees/tasks/tasktreepreparation.h index c6bdbd2..56b5a50 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.h +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.h @@ -19,6 +19,9 @@ public: explicit TaskTreePreparation(QObject *parent = nullptr); ~TaskTreePreparation(); +public: + void stopParser(); + private: QTreeWidgetItem* addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr); void loadAMMtasksFromXML(QByteArray array); @@ -34,6 +37,7 @@ Q_SIGNALS: private: QList listItems; QList* listAllModules; + bool flagStop; }; #endif // TASKTREEPREPARATION_H From c7c665bebd1858ff371dd1f0446a543836ca0d98 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 28 Jan 2025 13:19:33 +0300 Subject: [PATCH 39/77] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B0?= =?UTF-8?q?=D1=87=D0=B0=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0=20=D0=B2=20?= =?UTF-8?q?=D0=93=D0=A3=D0=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/databaselms.cpp | 30 +++++++++++++++++ DataBaseLMS/databaselms.h | 1 + DataBaseLMS/interfacedatabaselms.cpp | 5 +++ DataBaseLMS/interfacedatabaselms.h | 1 + .../Core/recognizesystem.cpp | 24 ++++++++++++++ .../connectorToServer/Core/recognizesystem.h | 1 + .../connectorToServer/Core/tools.h | 3 ++ .../connectorToServer/connectortoserver.cpp | 21 ++++++++++++ .../connectorToServer/connectortoserver.h | 11 +++++-- .../instructorsandtraineeswidget.cpp | 1 + .../instructorsandtraineeswidget.h | 2 ++ .../tasks/ammtaskswidget.cpp | 26 +++++++++++---- InstructorsAndTrainees/tasks/ammtaskswidget.h | 4 +++ .../tasks/fimtaskswidget.cpp | 11 +++++-- InstructorsAndTrainees/tasks/fimtaskswidget.h | 3 ++ .../tasks/tasktreepreparation.cpp | 32 +++++++++++++++++++ .../tasks/tasktreepreparation.h | 2 ++ .../trainees/viewertrainees.cpp | 2 ++ ServerLMS/Data/PacketType.h | 3 ++ ServerLMS/Systems/Parsers/dbanswerparser.cpp | 24 ++++++++++++++ ServerLMS/Systems/Parsers/dbanswerparser.h | 2 ++ ServerLMS/Systems/processingsystem.cpp | 14 ++++++++ ServerLMS/providerdblms.cpp | 18 +++++++++++ ServerLMS/providerdblms.h | 2 ++ ServerLMS/resources.qrc | 1 + ServerLMS/resources/blankXML/ListTasksAMM.xml | 3 ++ 26 files changed, 236 insertions(+), 11 deletions(-) create mode 100644 ServerLMS/resources/blankXML/ListTasksAMM.xml diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index 1d9cf40..b714b8e 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -479,6 +479,36 @@ int DataBaseLMS::deleteTaskAMM(int id_task) return queryExecInt(queryStr); } +QList DataBaseLMS::selectTasksAMMofTrainee(int id_trainee) +{ + QList listTasks; + + QString queryStr = QString("SELECT tasks_amm.task_id, tasks_amm.title, tasks_amm.dm_code, " + "trainees.trainee_id " + "FROM public.tasks_amm JOIN public.trainees ON trainees.trainee_id = tasks_amm.trainee_task " + "WHERE tasks_amm.trainee_task = %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(); + + listTasks.append(task); + } + } + + return listTasks; +} + int DataBaseLMS::insertTaskFIM(int id_trainee) { QString queryStr = QString("INSERT INTO public.tasks_fim (title, trainee_task) " diff --git a/DataBaseLMS/databaselms.h b/DataBaseLMS/databaselms.h index 6cb61e2..3a4a440 100644 --- a/DataBaseLMS/databaselms.h +++ b/DataBaseLMS/databaselms.h @@ -57,6 +57,7 @@ protected: int insertTaskAMM(int id_trainee); int updateTaskAMM(TaskAmmFim task); int deleteTaskAMM(int id_task); + QList selectTasksAMMofTrainee(int id_trainee); //Задача FIM int insertTaskFIM(int id_trainee); int updateTaskFIM(TaskAmmFim task); diff --git a/DataBaseLMS/interfacedatabaselms.cpp b/DataBaseLMS/interfacedatabaselms.cpp index efc302b..906e590 100644 --- a/DataBaseLMS/interfacedatabaselms.cpp +++ b/DataBaseLMS/interfacedatabaselms.cpp @@ -296,6 +296,11 @@ int InterfaceDataBaseLMS::editTaskAMM(TaskAmmFim task) return updateTaskAMM(task); } +QList InterfaceDataBaseLMS::getListTasksAMMofTrainee(int id_trainee) +{ + return selectTasksAMMofTrainee(id_trainee); +} + int InterfaceDataBaseLMS::newTaskFIM(int id_trainee) { return insertTaskFIM(id_trainee); diff --git a/DataBaseLMS/interfacedatabaselms.h b/DataBaseLMS/interfacedatabaselms.h index cd06584..172a49b 100644 --- a/DataBaseLMS/interfacedatabaselms.h +++ b/DataBaseLMS/interfacedatabaselms.h @@ -72,6 +72,7 @@ public: int newTaskAMM(int id_trainee); int delTaskAMM(int id); int editTaskAMM(TaskAmmFim task); + QList getListTasksAMMofTrainee(int id_trainee); int newTaskFIM(int id_trainee); int delTaskFIM(int id); diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp index 166eb7e..d4d4e72 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp @@ -274,6 +274,7 @@ void RecognizeSystem::recognize(QTcpSocket *socket) case TYPE_XMLANSWER_QUERY_DB__LIST_COMPUTERS: case TYPE_XMLANSWER_QUERY_DB__LIST_CLASSROOMS: case TYPE_XMLANSWER_QUERY_DB__LIST_TASKS: + case TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE: { QByteArray array; stream.startTransaction(); @@ -670,6 +671,29 @@ void RecognizeSystem::xmlParserQueryToDB(PacketType packetType, QByteArray array emit sigAnswerQueryToDB_ListTasks(listTasks); } break; + case TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE: + { + QList listTasks; + int trainee_id = 0; + QDomNode listNode = commonDOM.namedItem("ListTasksAMM"); + trainee_id = listNode.toElement().attribute("trainee_id").toInt(); + + for(int i = 0; i < listNode.childNodes().count(); i++) + { + QDomNode taskNode = listNode.childNodes().at(i); + if(taskNode.nodeName() == "taskAMM") + {//Задача + TaskAmmFim task; + task.setID(taskNode.toElement().attribute("task_id").toInt()); + task.ammProcedure.title = taskNode.toElement().attribute("title"); + task.ammProcedure.dmCode = taskNode.toElement().attribute("dmCode"); + + listTasks.append(task); + } + } + emit sigAnswerQueryToDB_ListTasksAMMforTrainee(listTasks, trainee_id); + } + break; }; } diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h index 441b7a2..2648ede 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h @@ -49,6 +49,7 @@ signals: void sigAnswerQueryToDB_ListComputers(QList listComputers); void sigAnswerQueryToDB_ListClassrooms(QList listClassrooms); void sigAnswerQueryToDB_ListTasks(QList listTasks); + void sigAnswerQueryToDB_ListTasksAMMforTrainee(QListlistTasks, int trainee_id); void sigAnswerQueryTasksXML_FIM(QByteArray array); void sigAnswerQueryTasksXML_AMM(QByteArray array); void sigShowServerDataList(QList *versions); diff --git a/InstructorsAndTrainees/connectorToServer/Core/tools.h b/InstructorsAndTrainees/connectorToServer/Core/tools.h index a1d2df2..7657c32 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/tools.h +++ b/InstructorsAndTrainees/connectorToServer/Core/tools.h @@ -46,6 +46,9 @@ enum PacketType{ TYPE_XMLANSWER_QUERY_DB__LIST_CLASSROOMS = 104, TYPE_XMLANSWER_QUERY_DB__LIST_TASKS = 105, + TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE = 106, + TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE = 107, + //xml-ответы на запросы AdditionalFiles TYPE_XMLANSWER_QUERY_TASKS_XML_FIM = 130, TYPE_XMLANSWER_QUERY_TASKS_XML_AMM = 131, diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index 69e6687..e6a7fdd 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -148,6 +148,14 @@ QList ConnectorToServer::getListTasks() return listTasks; } +QList ConnectorToServer::getListTasksAMMforTrainee(int trainee_id) +{ + if(mapTasksAMM.contains(trainee_id)) + return mapTasksAMM.value(trainee_id); + else + return QList(); +} + bool ConnectorToServer::isArchivedInstructor(int id) { for(Instructor instructor : listInstructors) @@ -313,6 +321,17 @@ void ConnectorToServer::slot_AnswerQueryToDB_ListTasks(QList listTasks) //emit signal_UpdateDB(false, true); } +void ConnectorToServer::slot_AnswerQueryToDB_ListTasksAMMforTrainee(QList listTasks, int trainee_id) +{ + //Удаляем старые задачи этого обучаемого + mapTasksAMM.remove(trainee_id); + + //Добавляем новые + mapTasksAMM.insert(trainee_id, listTasks); + + emit signal_UpdateTasksAMMforTrainee(trainee_id); +} + void ConnectorToServer::slot_AnswerQueryTasksXML_FIM(QByteArray array) { this->listTaskFimArray = array; @@ -385,6 +404,8 @@ void ConnectorToServer::bindConnection() connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListClassrooms,this,&ConnectorToServer::slot_AnswerQueryToDB_ListClassrooms); connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListTasks,this,&ConnectorToServer::slot_AnswerQueryToDB_ListTasks); + connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListTasksAMMforTrainee,this,&ConnectorToServer::slot_AnswerQueryToDB_ListTasksAMMforTrainee); + connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryTasksXML_FIM,this,&ConnectorToServer::slot_AnswerQueryTasksXML_FIM); connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryTasksXML_AMM,this,&ConnectorToServer::slot_AnswerQueryTasksXML_AMM); connect(recognizeSystem,&RecognizeSystem::sigAnimationActivated,this,&ConnectorToServer::activateLoadAnimation,Qt::AutoConnection); diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.h b/InstructorsAndTrainees/connectorToServer/connectortoserver.h index 70e0867..337ea71 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.h +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.h @@ -2,6 +2,7 @@ #define CONNECTORTOSERVER_H #include +#include #include #include #include "Core\tcpclient.h" @@ -44,6 +45,7 @@ public: QList getListComputers(); QList getListClassrooms(); QList getListTasks(); + QList getListTasksAMMforTrainee(int trainee_id); bool isArchivedInstructor(int id); bool isAdminInstructor(int id); @@ -72,6 +74,7 @@ public slots: void slot_AnswerQueryToDB_ListComputers(QList listComputers); void slot_AnswerQueryToDB_ListClassrooms(QList listClassrooms); void slot_AnswerQueryToDB_ListTasks(QList listTasks); + void slot_AnswerQueryToDB_ListTasksAMMforTrainee(QList listTasks, int trainee_id); void slot_AnswerQueryTasksXML_FIM(QByteArray array); void slot_AnswerQueryTasksXML_AMM(QByteArray array); @@ -92,8 +95,11 @@ signals: void signal_UpdateDB(bool treeInstructor, bool treeTrainee); - void signal_UpdateTasksFIM(); - void signal_UpdateTasksAMM(); + void signal_UpdateTasksFIM(); //Общий список + void signal_UpdateTasksAMM(); //Общий список + + void signal_UpdateTasksFIMforTrainee(int trainee_id); + void signal_UpdateTasksAMMforTrainee(int trainee_id); void signal_ConnectedToServer(bool state); @@ -126,6 +132,7 @@ private: QList listComputers; QList listClassrooms; QList listTasks; + QMap> mapTasksAMM; QByteArray listTaskFimArray; QByteArray listTaskAmmArray; diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index d3e9255..072b175 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -29,6 +29,7 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : qRegisterMetaType>("QList"); qRegisterMetaType>("QList"); qRegisterMetaType>("QList"); + qRegisterMetaType>("QList"); qDebug() << "InstructorsAndTraineesWidget init thread ID " << QThread::currentThreadId(); diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.h b/InstructorsAndTrainees/instructorsandtraineeswidget.h index 881a8f0..37ea7df 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.h +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.h @@ -10,6 +10,7 @@ #include "ammtaskswidget.h" #include "fimtaskswidget.h" #include "connectortoserver.h" +#include "tasksAmmFim.h" Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) @@ -18,6 +19,7 @@ Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) Q_DECLARE_METATYPE(QList) +Q_DECLARE_METATYPE(QList) namespace Ui { diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index 9356ef7..9609611 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -14,6 +14,7 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty treeWidget(nullptr), type(type), loginTraineeSelected(""), + idTraineeSelected(0), threadPreparation(nullptr), threadAnimation(nullptr), taskTreePreparation(nullptr), @@ -46,6 +47,7 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty threadPreparation->start(); threadPreparation->setPriority(QThread::HighestPriority); connect(this, &AMMtasksWidget::signal_prepareListItems, taskTreePreparation, &TaskTreePreparation::slot_prepareListItems); + connect(this, &AMMtasksWidget::signal_prepareListItemsForTrainee, taskTreePreparation, &TaskTreePreparation::slot_prepareListItemsForTrainee); connect(taskTreePreparation, &TaskTreePreparation::signal_listItemsReady, this, &AMMtasksWidget::slot_listItemsReady); threadAnimation = new QThread(); @@ -81,6 +83,12 @@ void AMMtasksWidget::resizeEvent(QResizeEvent *event) { QSize size = event->size(); waitAnimationWidget->resize(size); + + int width = treeWidget->width(); + + treeWidget->setColumnWidth(ColumnsTree::clmn_ID, 50); + treeWidget->setColumnWidth(ColumnsTree::clmn_code, 250); + treeWidget->setColumnWidth(ColumnsTree::clmn_PMorDM, width - 310); } void AMMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) @@ -129,11 +137,21 @@ void AMMtasksWidget::slot_traineeSelected(QString login) { qDebug() << "AMMtasksWidget::slot_traineeSelected thread ID " << QThread::currentThreadId(); loginTraineeSelected = login; + idTraineeSelected = connectorToServer->getIdTraineeByLogin(loginTraineeSelected); + if(type == TypeList::listForTrainee) + connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_GET_TASKS_AMM_FOR_TRAINEE, idTraineeSelected); +} + +void AMMtasksWidget::slot_UpdateTasksAMMforTrainee(int trainee_id) +{ if(type == TypeList::listForTrainee) { - int trainee_id = connectorToServer->getIdTraineeByLogin(loginTraineeSelected); - connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_GET_TASKS_AMM_FOR_TRAINEE, trainee_id); + if(idTraineeSelected == trainee_id) + { + QList listTask = connectorToServer->getListTasksAMMforTrainee(trainee_id); + signal_prepareListItemsForTrainee(listTask, &listAllModules); + } } } @@ -180,10 +198,6 @@ void AMMtasksWidget::preparationTreeWidget() reSetHeadTreeWidget(); - treeWidget->setColumnWidth(ColumnsTree::clmn_ID, 80); - treeWidget->setColumnWidth(ColumnsTree::clmn_PMorDM, 900); - treeWidget->setColumnWidth(ColumnsTree::clmn_code, 200); - //treeWidget->setColumnHidden(ColumnsTree::clmn_ID, true); } diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index f25f290..1bf1f7e 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -48,6 +48,8 @@ public Q_SLOTS: //слот обработки сигнала о выборе обучаемого void slot_traineeSelected(QString login); + void slot_UpdateTasksAMMforTrainee(int trainee_id); + private: Module* searchModuleByID(int id); void preparationTreeWidget(); @@ -56,6 +58,7 @@ private: Q_SIGNALS: void signal_prepareListItems(QByteArray array, QList* listAllModules); + void signal_prepareListItemsForTrainee(QList listTask, QList* listAllModules); public Q_SLOTS: void slot_listItemsReady(QList listItems); @@ -68,6 +71,7 @@ private: private: QList listAllModules; QString loginTraineeSelected; + int idTraineeSelected; QThread* threadPreparation; QThread* threadAnimation; diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index 1fb4c07..721dffb 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -45,6 +45,14 @@ FIMtasksWidget::~FIMtasksWidget() delete ui; } +void FIMtasksWidget::resizeEvent(QResizeEvent *event) +{ + int width = treeWidget->width(); + + treeWidget->setColumnWidth(ColumnsTree::clmn_ID, 50); + treeWidget->setColumnWidth(ColumnsTree::clmn_Title, width - 60); +} + void FIMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) { if(current == nullptr) @@ -201,9 +209,6 @@ void FIMtasksWidget::preparationTreeWidget() reSetHeadTreeWidget(); - treeWidget->setColumnWidth(ColumnsTree::clmn_ID, 20); - treeWidget->setColumnWidth(ColumnsTree::clmn_Title, 500); - //treeWidget->setColumnHidden(ColumnsTree::clmn_ID, true); } diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index 54720db..da6d47e 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -37,6 +37,9 @@ public: treeWidget->clear(); } +public: + void resizeEvent(QResizeEvent *event) override; + private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); void on_btnUpdateTasks_clicked(); diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp index 0ec82e9..314ddb0 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp @@ -218,3 +218,35 @@ void TaskTreePreparation::slot_prepareListItems(QByteArray array, QList Q_EMIT signal_listItemsReady(listItems); } + +void TaskTreePreparation::slot_prepareListItemsForTrainee(QList listTask, QList *listAllModules) +{ + qDebug() << "TaskTreePreparation::slot_prepareListItemsForTrainee thread ID " << QThread::currentThreadId(); + + this->listAllModules = listAllModules; + + //loadAMMtasksFromList(listTask); + + listItems.clear(); + + + for(TaskAmmFim task : listTask) + { + QTreeWidgetItem* item = nullptr; + + QString text = task.ammProcedure.title; + QString ID = QString::number(task.getID()); + QString code = task.ammProcedure.dmCode; + + item = new QTreeWidgetItem(); + item->setIcon(0, QIcon(":/resources/icons/procedure.png")); + + item->setText(ColumnsTree::clmn_PMorDM, text); + item->setText(ColumnsTree::clmn_code, code); + item->setText(ColumnsTree::clmn_ID, ID); + + listItems.append(item); + } + + Q_EMIT signal_listItemsReady(listItems); +} diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.h b/InstructorsAndTrainees/tasks/tasktreepreparation.h index 56b5a50..e61ab98 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.h +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.h @@ -5,6 +5,7 @@ #include #include #include "module.h" +#include "tasksAmmFim.h" enum ColumnsTree{ clmn_PMorDM = 0, @@ -30,6 +31,7 @@ private: public Q_SLOTS: void slot_prepareListItems(QByteArray array, QList* listAllModules); + void slot_prepareListItemsForTrainee(QList listTask, QList* listAllModules); Q_SIGNALS: void signal_listItemsReady(QList listItems); diff --git a/InstructorsAndTrainees/trainees/viewertrainees.cpp b/InstructorsAndTrainees/trainees/viewertrainees.cpp index 0624d7d..9fb0099 100644 --- a/InstructorsAndTrainees/trainees/viewertrainees.cpp +++ b/InstructorsAndTrainees/trainees/viewertrainees.cpp @@ -20,6 +20,8 @@ ViewerTrainees::ViewerTrainees(ConnectorToServer* connectorToServer, QWidget *pa 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); + ui->verticalLayout_2->addWidget(ammTasksWidget); ui->verticalLayout_2->addWidget(fimTasksWidget); diff --git a/ServerLMS/Data/PacketType.h b/ServerLMS/Data/PacketType.h index 686707b..0816fc5 100644 --- a/ServerLMS/Data/PacketType.h +++ b/ServerLMS/Data/PacketType.h @@ -28,6 +28,9 @@ enum PacketType TYPE_XMLANSWER_QUERY_DB__LIST_CLASSROOMS = 104, TYPE_XMLANSWER_QUERY_DB__LIST_TASKS = 105, + TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE = 106, + TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE = 107, + //xml-ответы на запросы AdditionalFiles TYPE_XMLANSWER_QUERY_TASKS_XML_FIM = 130, TYPE_XMLANSWER_QUERY_TASKS_XML_AMM = 131, diff --git a/ServerLMS/Systems/Parsers/dbanswerparser.cpp b/ServerLMS/Systems/Parsers/dbanswerparser.cpp index fffd8be..abe1dc2 100644 --- a/ServerLMS/Systems/Parsers/dbanswerparser.cpp +++ b/ServerLMS/Systems/Parsers/dbanswerparser.cpp @@ -107,3 +107,27 @@ QByteArray DBAnswerParser::listTasks(bool result, QList *listTasks) //TODO return QByteArray(); } + +QByteArray DBAnswerParser::listTasksAMMofTrainee(bool result, QList *listTasks, int trainee_id) +{ + QDomDocument commonDOM; + if(! dataParser->loadBlankXML(":/resources/blankXML/ListTasksAMM.xml", &commonDOM)) + return QByteArray(); + + QDomNode listNode = commonDOM.namedItem("ListTasksAMM"); + listNode.toElement().setAttribute("trainee_id", QString::number(trainee_id)); + + for(TaskAmmFim task : *listTasks) + { + //Задача + QDomNode taskNode = commonDOM.createElement("taskAMM"); + listNode.appendChild(taskNode); + taskNode.toElement().setAttribute("task_id", QString::number(task.getID())); + taskNode.toElement().setAttribute("title", task.ammProcedure.title); + taskNode.toElement().setAttribute("dmCode", task.ammProcedure.dmCode); + } + + dataParser->saveDOMtoXML("ListTasksAMM.xml", &commonDOM); + + return commonDOM.toByteArray(); +} diff --git a/ServerLMS/Systems/Parsers/dbanswerparser.h b/ServerLMS/Systems/Parsers/dbanswerparser.h index 26300ad..e86af15 100644 --- a/ServerLMS/Systems/Parsers/dbanswerparser.h +++ b/ServerLMS/Systems/Parsers/dbanswerparser.h @@ -19,6 +19,8 @@ public: QByteArray listComputers(bool result, QList *listComputers); QByteArray listClassrooms(bool result, QList *listClassrooms); QByteArray listTasks(bool result, QList *listTasks); + + QByteArray listTasksAMMofTrainee(bool result, QList *listTasks, int trainee_id); signals: private: diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 6c25246..0ca0531 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -238,6 +238,15 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu providerDBLMS->editTaskAMM(*(TaskAmmFim*)data); } //emit sigTasksChanged(); + //break; + } + case TypeQueryToDB::TYPE_QUERY_GET_TASKS_AMM_FOR_TRAINEE: + { + QList listTasks = providerDBLMS->GetListTasksAMMofTrainee(id); + + arrayAnswer = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasks, id); + client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE); + break; } @@ -251,6 +260,11 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu providerDBLMS->editTaskFIM(*(TaskAmmFim*)data); } //emit sigTasksChanged(); + //break; + } + + case TypeQueryToDB::TYPE_QUERY_GET_TASKS_FIM_FOR_TRAINEE: + { break; } } diff --git a/ServerLMS/providerdblms.cpp b/ServerLMS/providerdblms.cpp index 8a137bc..2de59ec 100644 --- a/ServerLMS/providerdblms.cpp +++ b/ServerLMS/providerdblms.cpp @@ -329,3 +329,21 @@ int ProviderDBLMS::editTaskFIM(TaskAmmFim task) { return dbLMS->editTaskFIM(task); } + +QList ProviderDBLMS::GetListTasksAMMofTrainee(int id_trainee) +{ + QList listTasks; + + mtxAccess.lock(); + + if(! dbLMS->DBisConnected()) + { + mtxAccess.unlock(); + return listTasks; + } + + listTasks = dbLMS->getListTasksAMMofTrainee(id_trainee); + + mtxAccess.unlock(); + return listTasks; +} diff --git a/ServerLMS/providerdblms.h b/ServerLMS/providerdblms.h index 852c90a..298d6c8 100644 --- a/ServerLMS/providerdblms.h +++ b/ServerLMS/providerdblms.h @@ -50,6 +50,8 @@ public: int delTaskFIM(int id); int editTaskFIM(TaskAmmFim task); + QList GetListTasksAMMofTrainee(int id_trainee); + Q_SIGNALS: //сигнал о блокировке авторизации void signal_BlockAutorization(bool block); diff --git a/ServerLMS/resources.qrc b/ServerLMS/resources.qrc index e502958..3a9591b 100644 --- a/ServerLMS/resources.qrc +++ b/ServerLMS/resources.qrc @@ -5,5 +5,6 @@ resources/blankXML/ListTrainees.xml resources/icons/switchOff.png resources/icons/switchOn.png + resources/blankXML/ListTasksAMM.xml diff --git a/ServerLMS/resources/blankXML/ListTasksAMM.xml b/ServerLMS/resources/blankXML/ListTasksAMM.xml new file mode 100644 index 0000000..d8ddab9 --- /dev/null +++ b/ServerLMS/resources/blankXML/ListTasksAMM.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file From 74ae7f7f75879a1322d3be0a6ad56b975a76db8d Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 28 Jan 2025 15:38:18 +0300 Subject: [PATCH 40/77] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B0?= =?UTF-8?q?=D1=87=D0=B0=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=20FIM=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0=20?= =?UTF-8?q?=D0=B2=20=D0=93=D0=A3=D0=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/databaselms.cpp | 29 ++++++++++++++++ DataBaseLMS/databaselms.h | 1 + DataBaseLMS/interfacedatabaselms.cpp | 5 +++ DataBaseLMS/interfacedatabaselms.h | 1 + .../Core/recognizesystem.cpp | 23 +++++++++++++ .../connectorToServer/Core/recognizesystem.h | 1 + .../connectorToServer/connectortoserver.cpp | 20 +++++++++++ .../connectorToServer/connectortoserver.h | 3 ++ .../tasks/fimtaskswidget.cpp | 33 ++++++++++++++++++- InstructorsAndTrainees/tasks/fimtaskswidget.h | 5 +++ .../trainees/viewertrainees.cpp | 1 + ServerLMS/Systems/Parsers/dbanswerparser.cpp | 23 +++++++++++++ ServerLMS/Systems/Parsers/dbanswerparser.h | 1 + ServerLMS/Systems/processingsystem.cpp | 5 +++ ServerLMS/providerdblms.cpp | 18 ++++++++++ ServerLMS/providerdblms.h | 1 + ServerLMS/resources.qrc | 1 + ServerLMS/resources/blankXML/ListTasksFIM.xml | 3 ++ 18 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 ServerLMS/resources/blankXML/ListTasksFIM.xml diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index b714b8e..06ecb88 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -540,6 +540,35 @@ int DataBaseLMS::deleteTaskFIM(int id_task) return queryExecInt(queryStr); } +QList DataBaseLMS::selectTasksFIMofTrainee(int id_trainee) +{ + QList listTasks; + + QString queryStr = QString("SELECT tasks_fim.task_id, tasks_fim.title, " + "trainees.trainee_id " + "FROM public.tasks_fim JOIN public.trainees ON trainees.trainee_id = tasks_fim.trainee_task " + "WHERE tasks_fim.trainee_task = %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(); + + listTasks.append(task); + } + } + + return listTasks; +} + Trainee DataBaseLMS::selectTrainee(int id_trainee) { Trainee trainee; diff --git a/DataBaseLMS/databaselms.h b/DataBaseLMS/databaselms.h index 3a4a440..3f5ea81 100644 --- a/DataBaseLMS/databaselms.h +++ b/DataBaseLMS/databaselms.h @@ -62,6 +62,7 @@ protected: int insertTaskFIM(int id_trainee); int updateTaskFIM(TaskAmmFim task); int deleteTaskFIM(int id_task); + QList selectTasksFIMofTrainee(int id_trainee); //Обучаемый Trainee selectTrainee(int id_trainee); diff --git a/DataBaseLMS/interfacedatabaselms.cpp b/DataBaseLMS/interfacedatabaselms.cpp index 906e590..00652ca 100644 --- a/DataBaseLMS/interfacedatabaselms.cpp +++ b/DataBaseLMS/interfacedatabaselms.cpp @@ -301,6 +301,11 @@ QList InterfaceDataBaseLMS::getListTasksAMMofTrainee(int id_trainee) return selectTasksAMMofTrainee(id_trainee); } +QList InterfaceDataBaseLMS::getListTasksFIMofTrainee(int id_trainee) +{ + return selectTasksFIMofTrainee(id_trainee); +} + int InterfaceDataBaseLMS::newTaskFIM(int id_trainee) { return insertTaskFIM(id_trainee); diff --git a/DataBaseLMS/interfacedatabaselms.h b/DataBaseLMS/interfacedatabaselms.h index 172a49b..6fd5f00 100644 --- a/DataBaseLMS/interfacedatabaselms.h +++ b/DataBaseLMS/interfacedatabaselms.h @@ -73,6 +73,7 @@ public: int delTaskAMM(int id); int editTaskAMM(TaskAmmFim task); QList getListTasksAMMofTrainee(int id_trainee); + QList getListTasksFIMofTrainee(int id_trainee); int newTaskFIM(int id_trainee); int delTaskFIM(int id); diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp index d4d4e72..9750900 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp @@ -275,6 +275,7 @@ void RecognizeSystem::recognize(QTcpSocket *socket) case TYPE_XMLANSWER_QUERY_DB__LIST_CLASSROOMS: case TYPE_XMLANSWER_QUERY_DB__LIST_TASKS: case TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE: + case TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE: { QByteArray array; stream.startTransaction(); @@ -694,6 +695,28 @@ void RecognizeSystem::xmlParserQueryToDB(PacketType packetType, QByteArray array emit sigAnswerQueryToDB_ListTasksAMMforTrainee(listTasks, trainee_id); } break; + case TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE: + { + QList listTasks; + int trainee_id = 0; + QDomNode listNode = commonDOM.namedItem("ListTasksFIM"); + trainee_id = listNode.toElement().attribute("trainee_id").toInt(); + + for(int i = 0; i < listNode.childNodes().count(); i++) + { + QDomNode taskNode = listNode.childNodes().at(i); + if(taskNode.nodeName() == "taskFIM") + {//Задача + TaskAmmFim task; + task.setID(taskNode.toElement().attribute("task_id").toInt()); + task.title = taskNode.toElement().attribute("title"); + + listTasks.append(task); + } + } + emit sigAnswerQueryToDB_ListTasksFIMforTrainee(listTasks, trainee_id); + } + break; }; } diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h index 2648ede..de47193 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h @@ -50,6 +50,7 @@ signals: void sigAnswerQueryToDB_ListClassrooms(QList listClassrooms); void sigAnswerQueryToDB_ListTasks(QList listTasks); void sigAnswerQueryToDB_ListTasksAMMforTrainee(QListlistTasks, int trainee_id); + void sigAnswerQueryToDB_ListTasksFIMforTrainee(QListlistTasks, int trainee_id); void sigAnswerQueryTasksXML_FIM(QByteArray array); void sigAnswerQueryTasksXML_AMM(QByteArray array); void sigShowServerDataList(QList *versions); diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index e6a7fdd..27e1637 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -156,6 +156,14 @@ QList ConnectorToServer::getListTasksAMMforTrainee(int trainee_id) return QList(); } +QList ConnectorToServer::getListTasksFIMforTrainee(int trainee_id) +{ + if(mapTasksFIM.contains(trainee_id)) + return mapTasksFIM.value(trainee_id); + else + return QList(); +} + bool ConnectorToServer::isArchivedInstructor(int id) { for(Instructor instructor : listInstructors) @@ -332,6 +340,17 @@ void ConnectorToServer::slot_AnswerQueryToDB_ListTasksAMMforTrainee(QList 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; @@ -405,6 +424,7 @@ void ConnectorToServer::bindConnection() connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListTasks,this,&ConnectorToServer::slot_AnswerQueryToDB_ListTasks); 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); diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.h b/InstructorsAndTrainees/connectorToServer/connectortoserver.h index 337ea71..b7dee66 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.h +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.h @@ -46,6 +46,7 @@ public: QList getListClassrooms(); QList getListTasks(); QList getListTasksAMMforTrainee(int trainee_id); + QList getListTasksFIMforTrainee(int trainee_id); bool isArchivedInstructor(int id); bool isAdminInstructor(int id); @@ -75,6 +76,7 @@ public slots: void slot_AnswerQueryToDB_ListClassrooms(QList listClassrooms); void slot_AnswerQueryToDB_ListTasks(QList listTasks); void slot_AnswerQueryToDB_ListTasksAMMforTrainee(QList listTasks, int trainee_id); + void slot_AnswerQueryToDB_ListTasksFIMforTrainee(QList listTasks, int trainee_id); void slot_AnswerQueryTasksXML_FIM(QByteArray array); void slot_AnswerQueryTasksXML_AMM(QByteArray array); @@ -133,6 +135,7 @@ private: QList listClassrooms; QList listTasks; QMap> mapTasksAMM; + QMap> mapTasksFIM; QByteArray listTaskFimArray; QByteArray listTaskAmmArray; diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index 721dffb..22a3833 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -14,7 +14,8 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty treeWidget(nullptr), type(type), userName(""), - loginTraineeSelected("") + loginTraineeSelected(""), + idTraineeSelected(0) { ui->setupUi(this); @@ -159,6 +160,9 @@ void FIMtasksWidget::loadFIMtasksFromXML(QByteArray array) void FIMtasksWidget::fillTree() { + //Обновление дерева + treeWidget->clear(); + for(int i = 0; i < listTaskAmmFim.count(); i++) {/*Задачи*/ TaskAmmFim* task = listTaskAmmFim.at(i); @@ -203,6 +207,19 @@ void FIMtasksWidget::fillTree() } } +void FIMtasksWidget::prepareListTasksForTrainee(QList listTask) +{ + deleteAllTaskAmmFim(); + + for(TaskAmmFim task : listTask) + { + TaskAmmFim* newTask = new TaskAmmFim(); + *newTask = task; + + listTaskAmmFim.append(newTask); + } +} + void FIMtasksWidget::preparationTreeWidget() { treeWidget->setColumnCount(2); @@ -228,6 +245,7 @@ void FIMtasksWidget::slot_traineeSelected(QString login) { qDebug() << "FIMtasksWidget::slot_traineeSelected thread ID " << QThread::currentThreadId(); loginTraineeSelected = login; + idTraineeSelected = connectorToServer->getIdTraineeByLogin(loginTraineeSelected); if(type == TypeList::listForTrainee) { @@ -236,6 +254,19 @@ void FIMtasksWidget::slot_traineeSelected(QString login) } } +void FIMtasksWidget::slot_UpdateTasksFIMforTrainee(int trainee_id) +{ + if(type == TypeList::listForTrainee) + { + if(idTraineeSelected == trainee_id) + { + QList listTask = connectorToServer->getListTasksFIMforTrainee(trainee_id); + prepareListTasksForTrainee(listTask); + fillTree(); + } + } +} + void FIMtasksWidget::loadTasksFIM() { //Обновление дерева diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index da6d47e..e9b90d5 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -52,11 +52,15 @@ public Q_SLOTS: //слот обработки сигнала о выборе обучаемого void slot_traineeSelected(QString login); + void slot_UpdateTasksFIMforTrainee(int trainee_id); + private: TaskAmmFim* getTaskByID(int id); void loadFIMtasksFromXML(QByteArray array); void fillTree(); + void prepareListTasksForTrainee(QList listTask); + void preparationTreeWidget(); void reSetHeadTreeWidget(); void loadTasksFIM(); @@ -75,6 +79,7 @@ private: QString userName; QList listTaskAmmFim; QString loginTraineeSelected; + int idTraineeSelected; }; #endif // FIMTASKSWIDGET_H diff --git a/InstructorsAndTrainees/trainees/viewertrainees.cpp b/InstructorsAndTrainees/trainees/viewertrainees.cpp index 9fb0099..83bebea 100644 --- a/InstructorsAndTrainees/trainees/viewertrainees.cpp +++ b/InstructorsAndTrainees/trainees/viewertrainees.cpp @@ -21,6 +21,7 @@ ViewerTrainees::ViewerTrainees(ConnectorToServer* connectorToServer, QWidget *pa 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); diff --git a/ServerLMS/Systems/Parsers/dbanswerparser.cpp b/ServerLMS/Systems/Parsers/dbanswerparser.cpp index abe1dc2..ee3f8cf 100644 --- a/ServerLMS/Systems/Parsers/dbanswerparser.cpp +++ b/ServerLMS/Systems/Parsers/dbanswerparser.cpp @@ -131,3 +131,26 @@ QByteArray DBAnswerParser::listTasksAMMofTrainee(bool result, QList return commonDOM.toByteArray(); } + +QByteArray DBAnswerParser::listTasksFIMofTrainee(bool result, QList *listTasks, int trainee_id) +{ + QDomDocument commonDOM; + if(! dataParser->loadBlankXML(":/resources/blankXML/ListTasksFIM.xml", &commonDOM)) + return QByteArray(); + + QDomNode listNode = commonDOM.namedItem("ListTasksFIM"); + listNode.toElement().setAttribute("trainee_id", QString::number(trainee_id)); + + for(TaskAmmFim task : *listTasks) + { + //Задача + QDomNode taskNode = commonDOM.createElement("taskFIM"); + listNode.appendChild(taskNode); + taskNode.toElement().setAttribute("task_id", QString::number(task.getID())); + taskNode.toElement().setAttribute("title", task.title); + } + + dataParser->saveDOMtoXML("ListTasksFIM.xml", &commonDOM); + + return commonDOM.toByteArray(); +} diff --git a/ServerLMS/Systems/Parsers/dbanswerparser.h b/ServerLMS/Systems/Parsers/dbanswerparser.h index e86af15..c3c0ca9 100644 --- a/ServerLMS/Systems/Parsers/dbanswerparser.h +++ b/ServerLMS/Systems/Parsers/dbanswerparser.h @@ -21,6 +21,7 @@ public: QByteArray listTasks(bool result, QList *listTasks); QByteArray listTasksAMMofTrainee(bool result, QList *listTasks, int trainee_id); + QByteArray listTasksFIMofTrainee(bool result, QList *listTasks, int trainee_id); signals: private: diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 0ca0531..6833c26 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -265,6 +265,11 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu case TypeQueryToDB::TYPE_QUERY_GET_TASKS_FIM_FOR_TRAINEE: { + QList listTasks = providerDBLMS->GetListTasksFIMofTrainee(id); + + arrayAnswer = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasks, id); + client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE); + break; } } diff --git a/ServerLMS/providerdblms.cpp b/ServerLMS/providerdblms.cpp index 2de59ec..7cd4e6f 100644 --- a/ServerLMS/providerdblms.cpp +++ b/ServerLMS/providerdblms.cpp @@ -347,3 +347,21 @@ QList ProviderDBLMS::GetListTasksAMMofTrainee(int id_trainee) mtxAccess.unlock(); return listTasks; } + +QList ProviderDBLMS::GetListTasksFIMofTrainee(int id_trainee) +{ + QList listTasks; + + mtxAccess.lock(); + + if(! dbLMS->DBisConnected()) + { + mtxAccess.unlock(); + return listTasks; + } + + listTasks = dbLMS->getListTasksFIMofTrainee(id_trainee); + + mtxAccess.unlock(); + return listTasks; +} diff --git a/ServerLMS/providerdblms.h b/ServerLMS/providerdblms.h index 298d6c8..bb138ac 100644 --- a/ServerLMS/providerdblms.h +++ b/ServerLMS/providerdblms.h @@ -51,6 +51,7 @@ public: int editTaskFIM(TaskAmmFim task); QList GetListTasksAMMofTrainee(int id_trainee); + QList GetListTasksFIMofTrainee(int id_trainee); Q_SIGNALS: //сигнал о блокировке авторизации diff --git a/ServerLMS/resources.qrc b/ServerLMS/resources.qrc index 3a9591b..73ebc38 100644 --- a/ServerLMS/resources.qrc +++ b/ServerLMS/resources.qrc @@ -6,5 +6,6 @@ resources/icons/switchOff.png resources/icons/switchOn.png resources/blankXML/ListTasksAMM.xml + resources/blankXML/ListTasksFIM.xml diff --git a/ServerLMS/resources/blankXML/ListTasksFIM.xml b/ServerLMS/resources/blankXML/ListTasksFIM.xml new file mode 100644 index 0000000..c080f12 --- /dev/null +++ b/ServerLMS/resources/blankXML/ListTasksFIM.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file From 036c89b1f2a5423d86f94101e2cc61661f5ed90a Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 29 Jan 2025 09:41:45 +0300 Subject: [PATCH 41/77] =?UTF-8?q?=D0=97=D0=B0=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B7=D0=B0=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/tasks/ammtaskswidget.cpp | 9 ++++++++- InstructorsAndTrainees/tasks/fimtaskswidget.cpp | 8 +++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index 9609611..bf8a9c1 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -203,7 +203,14 @@ void AMMtasksWidget::preparationTreeWidget() void AMMtasksWidget::reSetHeadTreeWidget() { - QStringList listHeaders = {tr("PM/DM"), tr("Code"), tr("ID")}; + QStringList listHeaders; + + if(type == TypeList::listForTrainee) + listHeaders = QStringList{tr("Task AMM"), tr("DM code"), tr("ID")}; + else + listHeaders = QStringList{tr("PM/DM"), tr("Code"), tr("ID")}; + + treeWidget->setHeaderLabels(listHeaders); } diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index 22a3833..acbb781 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -231,7 +231,13 @@ void FIMtasksWidget::preparationTreeWidget() void FIMtasksWidget::reSetHeadTreeWidget() { - QStringList listHeaders = {tr("Title"), tr("ID")}; + QStringList listHeaders; + + if(type == TypeList::listForTrainee) + listHeaders = QStringList{tr("Task FIM"), tr("ID")}; + else + listHeaders = QStringList{tr("Title"), tr("ID")}; + treeWidget->setHeaderLabels(listHeaders); } From 87de435d4cdfa027eaa4f6b4dc0f5aa0ed529aca Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 29 Jan 2025 10:25:44 +0300 Subject: [PATCH 42/77] =?UTF-8?q?=D0=A0=D0=B5=D1=81=D0=B0=D0=B9=D0=B7?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=20=D0=B7=D0=B0=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=BE=D0=B2=20=D0=B4=D0=B5=D1=80=D0=B5=D0=B2=D1=8C=D0=B5?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../instructors/instructorsview.cpp | 42 ++++++++++---- .../instructors/instructorsview.h | 6 +- .../instructorsandtraineeswidget.cpp | 2 +- .../trainees/traineesview.cpp | 55 ++++++++++++------- .../trainees/traineesview.h | 7 ++- 5 files changed, 77 insertions(+), 35 deletions(-) diff --git a/InstructorsAndTrainees/instructors/instructorsview.cpp b/InstructorsAndTrainees/instructors/instructorsview.cpp index 784e9ce..dd2ec39 100644 --- a/InstructorsAndTrainees/instructors/instructorsview.cpp +++ b/InstructorsAndTrainees/instructors/instructorsview.cpp @@ -8,6 +8,36 @@ InstructorsView::InstructorsView(ConnectorToServer* connectorToServer, TypeView 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 - (200 + 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); +} + void InstructorsView::slot_NeedUpdateUI(bool treeInstructor, bool treeTrainee) { updateButtons(); @@ -20,17 +50,9 @@ void InstructorsView::preparationTreeWidget() { mtxTreeWidget.lock(); - treeWidget->setColumnCount(7); + treeWidget->setColumnCount(clmn_count); - reSetHeadTreeWidget(); - - treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_ID, 50); - treeWidget->setColumnWidth(ColumnsTreeInsructors::clmn_Instructor, 250); - 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); + reSetHeadTreeWidget(); if(typeView == TypeView::onlyView) {//onlyView diff --git a/InstructorsAndTrainees/instructors/instructorsview.h b/InstructorsAndTrainees/instructors/instructorsview.h index 0411ea6..71de18a 100644 --- a/InstructorsAndTrainees/instructors/instructorsview.h +++ b/InstructorsAndTrainees/instructors/instructorsview.h @@ -21,9 +21,13 @@ protected: clmn_Administrator, clmn_Archived, clmn_Logged, - clmn_ID + clmn_ID, + clmn_count }; +public: + void resizeEvent(QResizeEvent *event) override; + public Q_SLOTS: //Слот обработки сигнала необходимости обновления интерфейса void slot_NeedUpdateUI(bool treeInstructor, bool treeTrainee); diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 072b175..0f4d0a7 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -92,7 +92,7 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : viewerInstructors->setMaximumWidth(500); viewerInstructors->setMaximumHeight(400); - messangerWidget->setMinimumSize(500, 500); + messangerWidget->setMinimumSize(400, 500); messangerWidget->setMaximumWidth(500); //ui->btnAuthorizationInstructor->setEnabled(false); diff --git a/InstructorsAndTrainees/trainees/traineesview.cpp b/InstructorsAndTrainees/trainees/traineesview.cpp index e6350fe..825b157 100644 --- a/InstructorsAndTrainees/trainees/traineesview.cpp +++ b/InstructorsAndTrainees/trainees/traineesview.cpp @@ -7,6 +7,38 @@ TraineesView::TraineesView(ConnectorToServer* connectorToServer, TypeView type, 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 - (530 + 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); +} + void TraineesView::slot_NeedUpdateUI(bool treeInstructor, bool treeTrainee) { updateButtons(); @@ -19,22 +51,10 @@ void TraineesView::preparationTreeWidget() { mtxTreeWidget.lock(); - treeWidget->setColumnCount(10); + treeWidget->setColumnCount(clmn_count); reSetHeadTreeWidget(); - treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_ID, 50); - treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Trainee, 250); - 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); - treeWidget->setColumnWidth(ColumnsTreeTrainees::clmn_Tasks, 60); - - if(typeView == TypeView::onlyView) {//onlyView archiveVisible = false; @@ -137,13 +157,6 @@ void TraineesView::loadTraineesFromDB() ItemTrainee->setIcon(ColumnsTreeTrainees::clmn_Logged, QIcon(QStringLiteral(":/resources/icons/circleGray.png"))); } - QString tasksStr; - for(Task task: trainee.getTasks()) - { - tasksStr += task.getName() + QStringLiteral("; "); - } - ItemTrainee->setText(ColumnsTreeTrainees::clmn_Tasks, tasksStr); - ItemGroup->addChild(ItemTrainee); //Скрываем архивных (при необходимости) @@ -185,7 +198,7 @@ void TraineesView::loadTraineesFromDB() void TraineesView::reSetHeadTreeWidget() { - QStringList listHeaders = {tr("Trainee"), tr("Login"), tr("Password"), tr("Class"), tr("Computer"), tr("IP address"), tr("Archived"), tr("Logged"), tr("Tasks"), tr("ID")}; + QStringList listHeaders = {tr("Trainee"), tr("Login"), tr("Password"), tr("Class"), tr("Computer"), tr("IP address"), tr("Archived"), tr("Logged"), tr("ID")}; treeWidget->setHeaderLabels(listHeaders); } diff --git a/InstructorsAndTrainees/trainees/traineesview.h b/InstructorsAndTrainees/trainees/traineesview.h index f37f7cd..dab045a 100644 --- a/InstructorsAndTrainees/trainees/traineesview.h +++ b/InstructorsAndTrainees/trainees/traineesview.h @@ -23,10 +23,13 @@ protected: clmn_IP_address, clmn_Archived, clmn_Logged, - clmn_Tasks, - clmn_ID + clmn_ID, + clmn_count }; +public: + void resizeEvent(QResizeEvent *event) override; + public Q_SLOTS: //Слот обработки сигнала необходимости обновления интерфейса void slot_NeedUpdateUI(bool treeInstructor, bool treeTrainee); From d87f8e501323cf13a9349cd65dd6bd6007a898f4 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 29 Jan 2025 10:49:41 +0300 Subject: [PATCH 43/77] =?UTF-8?q?=D0=9E=D1=87=D0=B8=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD=D0=B8=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/commonview.h | 1 + InstructorsAndTrainees/tasks/ammtaskswidget.h | 2 ++ InstructorsAndTrainees/tasks/fimtaskswidget.h | 2 ++ InstructorsAndTrainees/trainees/viewertrainees.cpp | 4 ++-- InstructorsAndTrainees/trainees/viewertrainees.h | 7 +++++++ 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/InstructorsAndTrainees/commonview.h b/InstructorsAndTrainees/commonview.h index 123cdb4..0f7755c 100644 --- a/InstructorsAndTrainees/commonview.h +++ b/InstructorsAndTrainees/commonview.h @@ -38,6 +38,7 @@ public: void clearTree() { treeWidget->clear(); + lastCurrentID = 0; } protected: diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index 1bf1f7e..6d91e35 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -32,6 +32,8 @@ public: void clearTree() { treeWidget->clear(); + loginTraineeSelected = ""; + idTraineeSelected = 0; } public: diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index e9b90d5..bcc426d 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -35,6 +35,8 @@ public: void clearTree() { treeWidget->clear(); + loginTraineeSelected = ""; + idTraineeSelected = 0; } public: diff --git a/InstructorsAndTrainees/trainees/viewertrainees.cpp b/InstructorsAndTrainees/trainees/viewertrainees.cpp index 83bebea..042d6bf 100644 --- a/InstructorsAndTrainees/trainees/viewertrainees.cpp +++ b/InstructorsAndTrainees/trainees/viewertrainees.cpp @@ -117,10 +117,10 @@ void ViewerTrainees::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, if(current == nullptr) return; - if(current->childCount() == 0) + //if(current->childCount() == 0) {//Выбран обучаемый QString login = current->text(ColumnsTreeTrainees::clmn_Login); - if(login != "") + //if(login != "") { int newCurrentID = connectorToServer->getIdTraineeByLogin(login); diff --git a/InstructorsAndTrainees/trainees/viewertrainees.h b/InstructorsAndTrainees/trainees/viewertrainees.h index e3be26a..638843d 100644 --- a/InstructorsAndTrainees/trainees/viewertrainees.h +++ b/InstructorsAndTrainees/trainees/viewertrainees.h @@ -22,6 +22,13 @@ public: public: void setAuthComplited(bool authComplited); + void clearTree() + { + CommonView::clearTree(); + ammTasksWidget->clearTree(); + fimTasksWidget->clearTree(); + } + protected: void changeEvent(QEvent * event) override; From e318c861675f1f0e9b1d3b1f9f571052d1191d31 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 29 Jan 2025 11:02:08 +0300 Subject: [PATCH 44/77] =?UTF-8?q?=D0=90=D0=BD=D0=B8=D0=BC=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=BE=D0=B6=D0=B8=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20AMM=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/tasks/ammtaskswidget.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index bf8a9c1..06e9ed5 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -140,7 +140,10 @@ void AMMtasksWidget::slot_traineeSelected(QString login) idTraineeSelected = connectorToServer->getIdTraineeByLogin(loginTraineeSelected); if(type == TypeList::listForTrainee) + { connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_GET_TASKS_AMM_FOR_TRAINEE, idTraineeSelected); + waitAnimationWidget->showWithPlay(); + } } void AMMtasksWidget::slot_UpdateTasksAMMforTrainee(int trainee_id) @@ -149,6 +152,7 @@ void AMMtasksWidget::slot_UpdateTasksAMMforTrainee(int trainee_id) { if(idTraineeSelected == trainee_id) { + //waitAnimationWidget->showWithPlay(); QList listTask = connectorToServer->getListTasksAMMforTrainee(trainee_id); signal_prepareListItemsForTrainee(listTask, &listAllModules); } From e45b5b67505a431b6c653b3105b22540d9658637 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 29 Jan 2025 12:11:26 +0300 Subject: [PATCH 45/77] =?UTF-8?q?=D0=90=D0=BD=D0=B8=D0=BC=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BB=20=D0=BE=D0=B6=D0=B8=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20FIM=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tasks/ammtaskswidget.cpp | 22 ++++--- .../tasks/fimtaskswidget.cpp | 57 +++++++++++++++---- InstructorsAndTrainees/tasks/fimtaskswidget.h | 6 +- .../tasks/tasktreepreparation.h | 3 +- 4 files changed, 69 insertions(+), 19 deletions(-) diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index 06e9ed5..adef13b 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -36,10 +36,10 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty if(type == TypeList::listForTrainee) { - ui->btnAssignTaskToTrainee->setVisible(false); - ui->label->setVisible(false); - ui->editCode->setVisible(false); + ui->btnAssignTaskToTrainee->setVisible(false); } + ui->label->setVisible(false); + ui->editCode->setVisible(false); threadPreparation = new QThread(); taskTreePreparation = new TaskTreePreparation(); @@ -88,7 +88,14 @@ void AMMtasksWidget::resizeEvent(QResizeEvent *event) treeWidget->setColumnWidth(ColumnsTree::clmn_ID, 50); treeWidget->setColumnWidth(ColumnsTree::clmn_code, 250); - treeWidget->setColumnWidth(ColumnsTree::clmn_PMorDM, width - 310); + + int widthPMorDM; + if(type == TypeList::listCommon) + widthPMorDM = width - (250 + 10); + else + widthPMorDM = width - (300 + 10); + + treeWidget->setColumnWidth(ColumnsTree::clmn_PMorDM, widthPMorDM); } void AMMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) @@ -141,8 +148,8 @@ void AMMtasksWidget::slot_traineeSelected(QString login) if(type == TypeList::listForTrainee) { - connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_GET_TASKS_AMM_FOR_TRAINEE, idTraineeSelected); waitAnimationWidget->showWithPlay(); + connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_GET_TASKS_AMM_FOR_TRAINEE, idTraineeSelected); } } @@ -198,11 +205,12 @@ Module *AMMtasksWidget::searchModuleByID(int id) void AMMtasksWidget::preparationTreeWidget() { - treeWidget->setColumnCount(2); + treeWidget->setColumnCount(clmn_count); reSetHeadTreeWidget(); - //treeWidget->setColumnHidden(ColumnsTree::clmn_ID, true); + if(type == TypeList::listCommon) + treeWidget->setColumnHidden(ColumnsTree::clmn_ID, true); } void AMMtasksWidget::reSetHeadTreeWidget() diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index acbb781..d781f76 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "fimtaskswidget.h" #include "ui_fimtaskswidget.h" #include "tasksAmmFim.h" @@ -15,7 +16,9 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty type(type), userName(""), loginTraineeSelected(""), - idTraineeSelected(0) + idTraineeSelected(0), + threadAnimation(nullptr), + waitAnimationWidget(nullptr) { ui->setupUi(this); @@ -33,25 +36,53 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty if(type == TypeList::listForTrainee) { - ui->btnAssignTaskToTrainee->setVisible(false); - ui->label->setVisible(false); - ui->editCode->setVisible(false); + ui->btnAssignTaskToTrainee->setVisible(false); } + ui->label->setVisible(false); + ui->editCode->setVisible(false); + + threadAnimation = new QThread(); + waitAnimationWidget = new WaitAnimationWidget; + QMovie *movie = new QMovie(":/resources/icons/762.gif"); + waitAnimationWidget->setParent(this); + waitAnimationWidget->initialize(movie,this); + waitAnimationWidget->moveToThread(threadAnimation); + threadAnimation->start(); } FIMtasksWidget::~FIMtasksWidget() { - deleteAllTaskAmmFim(); + + waitAnimationWidget->hideWithStop(); + + threadAnimation->quit(); + threadAnimation->wait(); + + delete threadAnimation; + + delete waitAnimationWidget; + delete treeWidget; + delete ui; } void FIMtasksWidget::resizeEvent(QResizeEvent *event) { + QSize size = event->size(); + waitAnimationWidget->resize(size); + int width = treeWidget->width(); treeWidget->setColumnWidth(ColumnsTree::clmn_ID, 50); - treeWidget->setColumnWidth(ColumnsTree::clmn_Title, width - 60); + + int widthTitle; + if(type == TypeList::listCommon) + widthTitle = width - (0 + 10); + else + widthTitle = width - (50 + 10); + + treeWidget->setColumnWidth(ColumnsTree::clmn_Title, widthTitle); } void FIMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) @@ -222,11 +253,12 @@ void FIMtasksWidget::prepareListTasksForTrainee(QList listTask) void FIMtasksWidget::preparationTreeWidget() { - treeWidget->setColumnCount(2); + treeWidget->setColumnCount(clmn_count); reSetHeadTreeWidget(); - //treeWidget->setColumnHidden(ColumnsTree::clmn_ID, true); + if(type == TypeList::listCommon) + treeWidget->setColumnHidden(ColumnsTree::clmn_ID, true); } void FIMtasksWidget::reSetHeadTreeWidget() @@ -255,8 +287,8 @@ void FIMtasksWidget::slot_traineeSelected(QString login) if(type == TypeList::listForTrainee) { - int trainee_id = connectorToServer->getIdTraineeByLogin(loginTraineeSelected); - connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_GET_TASKS_FIM_FOR_TRAINEE, trainee_id); + waitAnimationWidget->showWithPlay(); + connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_GET_TASKS_FIM_FOR_TRAINEE, idTraineeSelected); } } @@ -269,6 +301,7 @@ void FIMtasksWidget::slot_UpdateTasksFIMforTrainee(int trainee_id) QList listTask = connectorToServer->getListTasksFIMforTrainee(trainee_id); prepareListTasksForTrainee(listTask); fillTree(); + waitAnimationWidget->hideWithStop(); } } } @@ -278,11 +311,15 @@ void FIMtasksWidget::loadTasksFIM() //Обновление дерева treeWidget->clear(); + waitAnimationWidget->showWithPlay(); + QByteArray array = connectorToServer->getListTaskFimArray(); loadFIMtasksFromXML(array); //собственно обновление дерева fillTree(); + + waitAnimationWidget->hideWithStop(); } TaskAmmFim* FIMtasksWidget::getTaskByID(int id) diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index bcc426d..d396b5b 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -24,7 +24,8 @@ public: private: enum ColumnsTree{ clmn_Title = 0, - clmn_ID + clmn_ID, + clmn_count }; public: @@ -82,6 +83,9 @@ private: QList listTaskAmmFim; QString loginTraineeSelected; int idTraineeSelected; + + QThread* threadAnimation; + WaitAnimationWidget *waitAnimationWidget; }; #endif // FIMTASKSWIDGET_H diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.h b/InstructorsAndTrainees/tasks/tasktreepreparation.h index e61ab98..047da7a 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.h +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.h @@ -10,7 +10,8 @@ enum ColumnsTree{ clmn_PMorDM = 0, clmn_code, - clmn_ID + clmn_ID, + clmn_count }; class TaskTreePreparation : public QObject From ed75de6e04248a2443b49da3bf34ca2bdbcafbfc Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 29 Jan 2025 12:30:08 +0300 Subject: [PATCH 46/77] =?UTF-8?q?ToolTip=20=D0=B4=D0=BB=D1=8F=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B4=D0=B0=D1=87=20(=D0=BD=D0=B0=20=D1=81=D0=BB=D1=83?= =?UTF-8?q?=D1=87=D0=B0=D0=B9=20=D0=B4=D0=BB=D0=B8=D0=BD=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D1=81=D1=82=D1=80=D0=BE=D0=BA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/tasks/fimtaskswidget.cpp | 3 +++ InstructorsAndTrainees/tasks/tasktreepreparation.cpp | 2 ++ 2 files changed, 5 insertions(+) diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index d781f76..dcbcabd 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -205,6 +205,7 @@ void FIMtasksWidget::fillTree() //itemTask->setFlags(itemTask->flags() | Qt::ItemIsUserCheckable); //itemTask->setCheckState(0, Qt::Checked); itemTask->setIcon(0, QIcon(":/resources/icons/procedure.png")); + itemTask->setToolTip(0, task->title); treeWidget->addTopLevelItem(itemTask); @@ -218,6 +219,7 @@ void FIMtasksWidget::fillTree() itemMalfunction->setFlags(itemMalfunction->flags() | Qt::ItemIsUserCheckable); itemMalfunction->setCheckState(0, Qt::Checked); itemMalfunction->setIcon(0, QIcon(":/resources/icons/malfunction.png")); + itemMalfunction->setToolTip(0, malfunction.description); itemTask->addChild(itemMalfunction); @@ -231,6 +233,7 @@ void FIMtasksWidget::fillTree() //itemSign->setFlags(itemSign->flags() | Qt::ItemIsUserCheckable); //itemSign->setCheckState(0, Qt::Checked); itemSign->setIcon(0, QIcon(":/resources/icons/sign.png")); + itemSign->setToolTip(0, sign.description); itemMalfunction->addChild(itemSign); } diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp index 314ddb0..cf93f37 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp @@ -62,6 +62,7 @@ QTreeWidgetItem *TaskTreePreparation::addModuleToTreeWidget(Module *module, QTre itemModule->setText(ColumnsTree::clmn_PMorDM, text); itemModule->setText(ColumnsTree::clmn_code, code); itemModule->setText(ColumnsTree::clmn_ID, ID); + itemModule->setToolTip(0, text); return itemModule; } @@ -244,6 +245,7 @@ void TaskTreePreparation::slot_prepareListItemsForTrainee(QList list item->setText(ColumnsTree::clmn_PMorDM, text); item->setText(ColumnsTree::clmn_code, code); item->setText(ColumnsTree::clmn_ID, ID); + item->setToolTip(0, text); listItems.append(item); } From c7021968d9326bd5ea13325fcd56b03d266ea549 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 29 Jan 2025 14:43:17 +0300 Subject: [PATCH 47/77] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=89=D1=83=D1=8E=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA?= =?UTF-8?q?=D1=83=20AssignTask?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../instructorsandtraineeswidget.cpp | 57 +++++++++++++ .../instructorsandtraineeswidget.h | 8 ++ .../instructorsandtraineeswidget.ui | 76 ++++++++++++------ InstructorsAndTrainees/resources.qrc | 1 + .../resources/icons/assignTask.png | Bin 0 -> 8693 bytes .../tasks/ammtaskswidget.cpp | 15 +++- InstructorsAndTrainees/tasks/ammtaskswidget.h | 7 ++ .../tasks/fimtaskswidget.cpp | 15 +++- InstructorsAndTrainees/tasks/fimtaskswidget.h | 10 ++- 9 files changed, 162 insertions(+), 27 deletions(-) create mode 100644 InstructorsAndTrainees/resources/icons/assignTask.png diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 0f4d0a7..30a33ec 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -52,6 +52,13 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : ammTasksWidget = new AMMtasksWidget(connectorToServer, AMMtasksWidget::TypeList::listCommon, this); fimTasksWidget = new FIMtasksWidget(connectorToServer, FIMtasksWidget::TypeList::listCommon, this); + connect(this, &InstructorsAndTraineesWidget::signal_AssignTaskFIMtoTrainee, fimTasksWidget, &FIMtasksWidget::slot_AssignTaskFIMtoTrainee); + connect(this, &InstructorsAndTraineesWidget::signal_AssignTaskAMMtoTrainee, ammTasksWidget, &AMMtasksWidget::slot_AssignTaskAMMtoTrainee); + + connect(fimTasksWidget, &FIMtasksWidget::signal_currentItemChanged, this, &InstructorsAndTraineesWidget::slot_currentItemChanged); + connect(ammTasksWidget, &AMMtasksWidget::signal_currentItemChanged, this, &InstructorsAndTraineesWidget::slot_currentItemChanged); + + 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); @@ -97,6 +104,8 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : //ui->btnAuthorizationInstructor->setEnabled(false); + ui->btnAssignTask->setEnabled(false); + updateMyStyleSheet(); } @@ -264,6 +273,26 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state) } } +void InstructorsAndTraineesWidget::slot_currentItemChanged() +{ + int index = ui->tabWidget->currentIndex(); + + if(index == 0) + { + if(ammTasksWidget->getAccessAssignTask()) + ui->btnAssignTask->setEnabled(true); + else + ui->btnAssignTask->setEnabled(false); + } + else if(index == 1) + { + if(fimTasksWidget->getAccessAssignTask()) + ui->btnAssignTask->setEnabled(true); + else + ui->btnAssignTask->setEnabled(false); + } +} + bool InstructorsAndTraineesWidget::authorizationInstructorDialog(QWidget* parent) { DialogAuthorizationInstructor dlg(parent); @@ -378,3 +407,31 @@ void InstructorsAndTraineesWidget::on_btnSetVersion_clicked() { connectorToServer->showVersionSelect(); } + +void InstructorsAndTraineesWidget::on_btnAssignTask_clicked() +{ + int index = ui->tabWidget->currentIndex(); + + if(index == 0) + Q_EMIT signal_AssignTaskAMMtoTrainee(); + else if(index == 1) + Q_EMIT signal_AssignTaskFIMtoTrainee(); +} + +void InstructorsAndTraineesWidget::on_tabWidget_currentChanged(int index) +{ + if(index == 0) + { + if(ammTasksWidget->getAccessAssignTask()) + ui->btnAssignTask->setEnabled(true); + else + ui->btnAssignTask->setEnabled(false); + } + else if(index == 1) + { + if(fimTasksWidget->getAccessAssignTask()) + ui->btnAssignTask->setEnabled(true); + else + ui->btnAssignTask->setEnabled(false); + } +} diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.h b/InstructorsAndTrainees/instructorsandtraineeswidget.h index 37ea7df..0849baa 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.h +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.h @@ -51,6 +51,7 @@ public Q_SLOTS: void checkDeLoginResult(ServerDeAuthorization * serverDeAuth); void slot_ConnectedToServer(bool state); + void slot_currentItemChanged(); Q_SIGNALS: //сигнал об изменении языка интерфейса @@ -60,6 +61,9 @@ Q_SIGNALS: //сигнал о блокировке авторизации void signal_BlockAutorization(bool block); + void signal_AssignTaskAMMtoTrainee(); + void signal_AssignTaskFIMtoTrainee(); + private Q_SLOTS: void on_btnConnectionToServer_clicked(); void on_btnAuthorizationInstructor_clicked(); @@ -67,6 +71,10 @@ private Q_SLOTS: void on_btnSetVersion_clicked(); + void on_btnAssignTask_clicked(); + + void on_tabWidget_currentChanged(int index); + private: //Авторизация инструктора локальная bool authorizationInstructorDialog(QWidget* parent = nullptr); diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.ui b/InstructorsAndTrainees/instructorsandtraineeswidget.ui index 8c36119..a47deef 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.ui +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.ui @@ -242,32 +242,60 @@ Tasks - - - - 1 - - - - AMM - - - - + + + + + + 1 + + + + AMM + + + + + + + + + + FIM + + + + + + + + + + + + + + + Assign task + + + + :/resources/icons/assignTask.png:/resources/icons/assignTask.png + + + + 32 + 32 + + + + Qt::ToolButtonTextUnderIcon + + - - - - FIM - - - - - - - - + + diff --git a/InstructorsAndTrainees/resources.qrc b/InstructorsAndTrainees/resources.qrc index d15df9e..4417e39 100644 --- a/InstructorsAndTrainees/resources.qrc +++ b/InstructorsAndTrainees/resources.qrc @@ -41,5 +41,6 @@ resources/icons/procedure.png resources/icons/malfunction.png resources/icons/762.gif + resources/icons/assignTask.png diff --git a/InstructorsAndTrainees/resources/icons/assignTask.png b/InstructorsAndTrainees/resources/icons/assignTask.png new file mode 100644 index 0000000000000000000000000000000000000000..cd877894a13f271029a58f0cdfba670227cad5ba GIT binary patch literal 8693 zcmcI~`9GBF|NnK5A$4>ZlpzeGO(i3;BxcH1RGd`WED<7-Em_7)^)5q}7R8Cs>4;L6 zQ`xdi#ZbyxC?WeYMPtbrWA4v2w}0UK%h%)4W3Jcsd@a{{UstgX2W(cZP+0*0Sh;tP z&u!#fGQt)Ty;wJ(8!3Xc&dq^7oMM{O5^2n!3_>T~XFu*a$Mo?8QgywfIjssNw?_FC>bbTR#BcleD#Z+b6pQoqi2 z^Rs-j&@IvyY-Z`&wXBt#PU4!s(#!nL`$cKWr8t{kR_p&?(5gUp4|hAaIEUArL)-Sg z_uMd~x@w?CZ|$mAz^NSjj4m}ETB}o?QEo1g?Dv2x0l-g~j)Nuwz$*Fw$Hs%~d|3e2 zl#OImob~tqv9oe@UY%}i!O7dLWBE;oa0sA{nBSkCT4m!Dz*5xxa5Ix&VrCMwQ~Tf# zQ?)!oj@D|e{#y?TVd}?@CDeym|4Y4|UUj2&R6pE6F!-82g8FozY8GSwMr+LG2Ay;6 zw!7R8igs3YrUxdLY6Mx>0aP&-}2y2CQg(3-F#)E%rD(Q3`K95g+$I>kJE{&_%^cOHp<-R6MvbK-TX z{LN}J^48Seo1~$}dfw}o+1au#be|pV%_GDY?GoRA`IAaD>qbL;6m=66J3<1b9%+Hm zTVV91s>wvXHhRHQ&{@Up5smruj5T`XWGb8;%OTfp{-=_c^Xm@$VBub2-WFJ9bzU7^r}`US3sqj=j#JTincVR_W7sO|`=1pnNTm z8avt;*f2HKuX|GPv_$nft8{vFe6xEpRbKmdD7`dhF|+pS=MLAvFOAjX0uAT0Ye7)s zSiOHqw3B5-fMq~*%ilLamL1NmIdS;v&|G@dw>g(v?tPh-O)kOfZFUykXiY2lS~*jc z-_)92wv26-InVArzGpr~YpSDZ!J};}LQBE3&ktRlcK7T}(A$Ad$foLb(Oc0L zlj_L6Uq4?lwg!nFgh%ZJ*EZ-nE9S^nY?^Adawd67jjaq*bFSpKnJ^Y+wV#F1?-}|p zC^Mt#UWKVv`ZpCkN{^?~vagwlya!nwF3};g)F{o7>2hX z-GisVXpU_i<7vHg>JD%q^SJ1NqEEo>7$l3aiG&vQlii*G`cmTk|IG3TH;O8jD$n%!|TiX2QN9*P7KxNCvC%D zNo4Mq&=}&k8~%x-mBgcWWejnKGE7~@?<)&h{bM@!C7Fpt)L;2D-j4_x&TiI?V|{8p z21c2@%b?<3#@P#p7_j_?%V<@WE5$d@r(@- zYY@A%3cAhaoTGK`@_N4wljZ@bfq~QFAbQNiRi8| z0~{Ve->63DY6J(e0Ef}MBNiZla-LHy{mh050Fg4_ntViy27pX5Pxs(if(8Im^?apg zcf@cK9>Toli()uLPjt8}aHQpPudt!|!-x^@wIpEEi0G#7(kR||fB^x)F=utQhSG7q zFJF9{T^>=#cY1acVmuA7(Q4Z9dRW*KsW@P7ASc$lU-F!*;E*?sXQ%Q;wge{tge|x* zF)qL#+B8{F%GH{=%=5lnX2k?<&f$}HoJp6C&sQqh9I*~Wj~j~i1r1EC%R{%0R6NuD zBoCf$o-F$ZuDp-GGA7lIDc45InkkZmtrme7JwMF`jy_Z^DCgF{w+U`MvDFf~`AzyE zz<+wu-y1o=s}5UN*LO#C(sah*TgfKe#i!}5VLhRzXLCvfA{;YxsE)dw94@$dH#=l_ z&gE*OI$9KYBuIGO)J%bW+N9PL9UdL$mP}Q_gq$z#9i-2S_Qxllj1H}lR0^fXweMF! zi{5TF>51HfryP4fZxPlLIi>x)DigSQ*hhJFY{=R+AKNr4kbc&6Mp$=pS>Yw;qC);= zlabnEJ$pgn1K|gy5ITO7egx-_SLVC(9x0=G9f;re`Iy9K6@hodup!lq_k)Krdr<W%umyJf!jk?1ScE|-6;=`1Re6FKIZc9nD_u#bdsDPN@>n=t+pSW38&1I4EQGG2) zJs#a?WW7^#_LaHR)pt%*ohkhWQG50JI>v`k;BEJZPg`}-a_}hSV7$xX-G20u_4UST z%2ZzO$r-x?C3+$cGSgD+H=guQQSV)3SHxMN3MmfS<9ZpHck7M)2C_52gjRA~(| z+2&-`mj;PHfY;qjk+9x%4(=PT*+WVd+oswwV0~5EYWYdAfJ~lx^X8gvKN)o1YOzC4 z4USyAq*3fO^Fc{*(JI>+!y3BEHH>%#+|C}16UL>Hsq&P~3B zNX+-y!oh@|Euiziic;dkN&e0Hj;d1bLyFw|v0k}(lJNXs?cdR7zPQc!2s%PVLt; zk>}vqs(kK4125?T>hO*%b5l~hGq-X-pg6&r75%=(PvflXK2oMNpab;J;f7i+!|mRo+{OTb<9{ZCM!CzMfjSLaB=ivN6tSh zl};+c!LkL8ki+giOvHve`-8?{!3U7)L|+?b>u)Z zB0D>|wWc>0$GkuvD{$`%Mos&5MH^eY8EQ9U7MGoQc`(lS7r)*mV9w^WZpak+N2* z=89wWDP;8>>SKekthNnW?MF<_d}mjukT0Y&h93*>zasy3Q4VjqLs*ctjutvxZaaqaUNQ z5yQWx_(}5<%&C9(WOj}I!~r*n?eS=;(jS`|&LmTdTDsuEyu()o)q~?Aejse}nCNYS zI$YJ)=LU-Bm!d}9q)TS&duv$&03*5KVxG*2<9kS5KlE_m`xXvL$d{1f)=Z7}2l)Ti zK)^4`0D3fE;@SoqLCL~g&VE;hGXVeN^|H9kUGMCQeh0VhbO7M9z9=nNjUr=G%cyW~ z3TN#6=phLlwhvIv2+fgawTHs&7u*nVsDa;f06*hoJEkP-Qatdy&D;fm!`nnBM*fh9 z9LxB8wU%MnU@8r=c5oOAQK#Gr29sN5Pr?H+OyHo2W!;wuGd5zat> zViVt}NgwfVa8(`34oI8rLH%%G<2_zLk~i+_E!69Uam2fU-;XT1<~KtAU0y(@u8iMt zQCds?Xqq}>Y@SioowOD($;#*ii}~n7fKUq$95e=c%?Ol$X*EN(37ETys7M|;@%bCy1||zQ)u<)=={?L$CY?w6lR$YkTu0pvH()Pe z3^aRmpO+*D_giJOPafg=VBRP+4ufyWF8jJ<7SGd-kv8^79>_0VvUC?VI7Z@CPpCax zY`l_J5D+O2ks`;bKKas`UG%x-YtDgqmnpjI^Xa*Az7PjS%?4bnzLK-JVpp^#Wi;ZG zJVGamQ<+KS71)mvno}^5JrvzhLFg)&=msz6h4g3_mWX#e)g#-IM#2Ixa~GO)G;3uQ zU>RpnL{GhQ3C$xIge;L^s1MB+Ff$KMrq9ZCxN8&<0fupd=Y52p#C#AhF53=w;g=^> z*6bS`aW&K^B0r~IvfCL9@~$#tI9r!Mslgzx$5W@B2GZTH$ zOl<`@3va-f?_kCbp#{*;t%Ns>FbO??)A6fQR-J ze3_@FnH>wmgF+on=7Us2oG<3y?+VZRjNx_WaV)(Pr-jN-X31HP#KEvv6B*YgzDei$ zWBsNzV6XjW!QjQ-2QmEx2NDm^$7{w?J{gDz1UqLEApSXE?=xX`9~IwDL5Eo zrcu%W9>#MFIE-jKP<)SpxZ=Qy)8c?LsR+1=!5LWq+Aa*_BLO%_i%l8Np#cm|WuSK_ z0wlbJ+8=xPu-k{1i%-4wKEF9m{m!Q5>YVCu9FT&@_jvrt>jUsRV+EwKaC^<6p@-Ph zd2I+$o_qUf_Plfx+KniKPAPF^x9HTsI}{(` zW)0v5CuX*C652ELY4)!(mjF|TBJTbUSjBj(cA@fs0;dY>uSz`F_YU)GgaAiOO$)eT zwPBF)zz^$^rc}TT#r&J30p@ZHBHa$K@iA4xg`)qa96IWlWfajqGWf1)Le5vFoA_Dt*z1-GF_pu?o$!#5X%} zGLJ0>#tmh2=xr7daQM$x;eh&Gt^TQ&Zb!2t_+}+e<}-Qlt5B;>w$4glrd&GfEGP4) z9OQhQKsOMOkXrt8XJ}&h5rZ#=>)b9t`)~oJ#!6?w6v7EW?s+e2PsW|O$Mep>gPL~C z&Y+gBAAkeyT+H$CM}8X~q0JUYitXH7;;H)y;81`%CM<5?x2=W3;ZRJN2Zahyn1Kns zJcT}2K$h?RZ(<**cX>HFIOdb>OR8}A8ZHM<+6S@NW{Hfi>p|}EHq5ZmQ#f`RWF7bK z78?@vMIlze;hEv2I4L5dd@aa5(j``8Mkq7Nq1h27j1mwT0vd40-ij&CQbaRXL6)sE zmf?GE;g|wKyCXO+4s>G*FDC#G4v#m8y=U#@WSYx^LpcE$Ob~>z1rGPkd&J(aHSycL zam?|VSrJ2?Ksm|Dtb!TlG-0ZJdLo%i@H}BrD(*3v7@qe=h^qV^Lq+4M@b)nG{SBbF~b1<6kuK9dQV4RpU35QO5N!u*Sn{1jiMSWBW=Rivg6&i>V5Xf->lQ zm2IV%`jE-XvBWX^??j7hkxCk{e~bsUd41vp3+bH9TgyS56IK~FE}Rz%K(XMFI864B zcmtv|NqlTf30I6Y&5manc?4A}}TTBsJ5gaTz9BGP318huQK)-xaL^z~I=;z%c`oot624vx;CMMdG zRiQ+EKX6z(hn{e9#}gSBw;;5@Z)kw)UV@wO)HaN0vRO_j?Bc&IhkgQ4D%B#9*=_d+ z&%;TXaWn~J8Bd@iXITV_I!ZTQjp&27WQQ$JWQnQ}eErm(Mw6KGdk4oswQJC5mIiUv55 z$ZY=Gc39j#Q8nG!n#qg#32XFrkzrIW&Z}z!*m!vXJ@--><~3{q9Po2!_gO75HVjmH z0$q6U4#H7faZGY4I+?Uy3`D8HD{^%_MN`R$JLn$ka;` zGgTq8ds0+gQmg>s@2vyGiXq1^_(gA6ctJ^*ayxy=B{9ry7M*+z+wRpt_+D7rHzR&h3=!{0#JC^=74JKl?im& z*{~hTy_M5V{ogN*)K+;8$oeY)nfApx+1l6nvadfS*3Adbz3DM7i?TXd%5_uid`Zn; z`Bv7M0A%1$iB2=%J1Iwvu0+@x@J^&RW9HiHm{U-8YXO~5jv^XDei<5&`8o#fI8yHx z8PhW6$?*FU_GsFvUk|q8n6F`flcY%F>j6;}4w323*Hk&DQ2NF!{Uw>&6lU|45HL7qFOTMg=#Rt$Md4z?-J8%0WtaB1iI3^c`d?rOO8eZeqDm=mej)+3ydqW zA$tLZXi<$C@oAaR+~dp~Dn%OAhmpzjiOu2sC;ktvBWt4E;B>yy93wVLhCZd8zd>f! zX&kfXELW@v=gy3aqu4z6Z;&+y*VBMsh`J^it$fylQi&sVW>O?KGD0i(7$lZF+5j)_ z6U1?`;ed+x`9lm$q2ib>c0PI&o%6GS@AC89CnY0g%-QMEP$709e@q|^td5Vu2PGQp zG;nASY+U{S(m3;&E8%y#FA-feKR5=jK%}M=GSrJk;B5%Pj*n0ScJub`KdaGQH5PTR z%vW%Um4e}V`2Bf4f-YHjzQuP-m2jS53dg1**l1fIp|KlYJ}N|z00F+m4ExI=a+**% zLrP(Z;pwo%P?u7|7{zCAEHO-_)+{l6o0k}yrIs+f4qF0C_>PuprMDzFZY4?kAH1CO zQCxyBbUckIbnYoyQZTbxhAHfglVwVazjvRI0of9O^k??~OAg+H9yyE|uyQFF|B$lS zGqe0K76CKjuo_11IE)3r6i72;Vgc|agGMqAzRfVd4QTq!2yL6?|> zrpv@60R%&DM0tc_BPQiQ@Ont%kY)gZdzUk>!IB8}0RxEG?1alY1(o2gs001XB)~Hu zjL;rWyAHk6HNkOcIx2xQBha)1PqTqs_z0vXj{vw;hwOt0l1Q@zL?~X)%zy|l_JSD} zM9{%yc|%=)Iba4uJ97_=YD0wEcpAJG1NX=v;s7+oBe05q8Lj{%U{9xRKqwkwk^m&M zAh`^o&>;C!9!RXifzCe>iW?;1K}cc)Bv&8~Fdg<&JWUh&c`gSe2?*F{2NbR0N9#(& zK?4fC@U#a|xP|~E;p-_}^A(|2N-W4_N`vnwaar;Z@A-0O9IOWiPxFMT1YDLa9DIla zjMl*janOT5x`=}b{Mmp&tK1tv1C9rpKOVTkpvE=frw)`YL)acHz?@nR*2BtpDuAbU zc#v!d3N@i{J;HtjO~UcO5r*hV0Q>esp#`8QK%o@E{s0e?zjQ+B;F?e0Kc87^0$3F< zw1PTf5I3(hN%k14vxT#Zm~r*GO_A2QB!2%-XOiT`hR6A`4p%f;(_d;EpLA^Qt-mI{0dNue$b zN0MXYC9>2^%p-ZT0aI2?oz9tT=Jf8Uii9hG7B^$+ocUmN8oGt4THXG}1ZcFczV*>( z@4ew&G1Oo#$tup#v(Lx~G z)r9weW!(PbFOb{W(h^$`Rm!#abovSCoO=^yo~qUR6}}tgI>zzm>AF!lnMm_LV;KmG zHI$v5nZ$}*v-1xST5g(f;alshrmub|z@8ZGZZay~y#)>rXFOgNFxnQKGygGkq${zH z!soN9pNpCM2)bv+Y2cHVRh0YO%Yev0+jn`5#eU=7@H+RPZMebv0G4#N6#GJVNqI59 zl2g3~zK>bfT;lffMzp774FZW^)2-<_QfZ$Kqh(glcY83fwER&vp;n!tRUOa+->BrZ zqrE1BdwFZ%g|gR)6-*YZvZHFzMk^<&k+%hW>g)KubEMurgwFcvZvvo4dzUJ0D`85w zx-|20Hs3zd+O%pzc34umx$VzlRX`w&35=fos6y-Wv|4S3Lp8vPJN-^`Pk-`F$5fuq z9Dsw_OZ%cZ(`-<+P|1$k@d3 zYx>=znzEas7hEsUSF4|$K;#04ZND$Q*9yL{I(utIKvqfOaC)@+WN5%*VUBPi?wVtWdap|f?RaP>KA}9Fl{94EPN2>D+KD##~OW)wB9&r8rNF8 zAGJO}ay_x9x)}Xh($h10Db<;aoG)HxzWAUrr|q$lRa}nEzd2SljtAqqP3p1setupUi(this); @@ -32,6 +33,7 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty preparationTreeWidget(); ui->btnAssignTaskToTrainee->setEnabled(false); + Q_EMIT signal_currentItemChanged(); ui->btnUpdateTasks->setVisible(false); if(type == TypeList::listForTrainee) @@ -118,6 +120,7 @@ void AMMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, type = "PM"; code = PMmodul->pmCode(); ui->btnAssignTaskToTrainee->setEnabled(false); + accessAssignTask = false; } else { @@ -125,13 +128,18 @@ void AMMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, type = "DM"; code = DMmodul->dmCode(); ui->btnAssignTaskToTrainee->setEnabled(true); + accessAssignTask = true; } ui->label->setText(type + " Code"); ui->editCode->setText(code); } else + { ui->btnAssignTaskToTrainee->setEnabled(false); + accessAssignTask = false; + } + Q_EMIT signal_currentItemChanged(); } void AMMtasksWidget::slot_NeedUpdateUI() @@ -232,6 +240,11 @@ void AMMtasksWidget::on_btnUpdateTasks_clicked() } void AMMtasksWidget::on_btnAssignTaskToTrainee_clicked() +{ + slot_AssignTaskAMMtoTrainee(); +} + +void AMMtasksWidget::slot_AssignTaskAMMtoTrainee() { QTreeWidgetItem *current = treeWidget->currentItem(); diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index 6d91e35..6d4c46e 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -35,6 +35,7 @@ public: loginTraineeSelected = ""; idTraineeSelected = 0; } + bool getAccessAssignTask(){return accessAssignTask;} public: void resizeEvent(QResizeEvent *event) override; @@ -43,6 +44,8 @@ private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); void on_btnUpdateTasks_clicked(); void on_btnAssignTaskToTrainee_clicked(); +public Q_SLOTS: + void slot_AssignTaskAMMtoTrainee(); public Q_SLOTS: //Слот обработки сигнала необходимости обновления интерфейса @@ -52,6 +55,9 @@ public Q_SLOTS: void slot_UpdateTasksAMMforTrainee(int trainee_id); +Q_SIGNALS: + void signal_currentItemChanged(); + private: Module* searchModuleByID(int id); void preparationTreeWidget(); @@ -79,6 +85,7 @@ private: QThread* threadAnimation; TaskTreePreparation* taskTreePreparation; WaitAnimationWidget *waitAnimationWidget; + bool accessAssignTask; }; #endif // AMMTASKSWIDGET_H diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index dcbcabd..095d9c3 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -18,7 +18,8 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty loginTraineeSelected(""), idTraineeSelected(0), threadAnimation(nullptr), - waitAnimationWidget(nullptr) + waitAnimationWidget(nullptr), + accessAssignTask(false) { ui->setupUi(this); @@ -32,6 +33,7 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty preparationTreeWidget(); ui->btnAssignTaskToTrainee->setEnabled(false); + Q_EMIT signal_currentItemChanged(); ui->btnUpdateTasks->setVisible(false); if(type == TypeList::listForTrainee) @@ -102,11 +104,17 @@ void FIMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, code = task->title; ui->btnAssignTaskToTrainee->setEnabled(true); + accessAssignTask = true; } else + { ui->btnAssignTaskToTrainee->setEnabled(false); + accessAssignTask = false; + } ui->editCode->setText(code); + + Q_EMIT signal_currentItemChanged(); } void FIMtasksWidget::loadFIMtasksFromXML(QByteArray array) @@ -362,6 +370,11 @@ void FIMtasksWidget::on_btnUpdateTasks_clicked() } void FIMtasksWidget::on_btnAssignTaskToTrainee_clicked() +{ + slot_AssignTaskFIMtoTrainee(); +} + +void FIMtasksWidget::slot_AssignTaskFIMtoTrainee() { QTreeWidgetItem *current = treeWidget->currentItem(); diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index d396b5b..663ea67 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -39,6 +39,7 @@ public: loginTraineeSelected = ""; idTraineeSelected = 0; } + bool getAccessAssignTask(){return accessAssignTask;} public: void resizeEvent(QResizeEvent *event) override; @@ -46,8 +47,9 @@ public: private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); void on_btnUpdateTasks_clicked(); - void on_btnAssignTaskToTrainee_clicked(); +public Q_SLOTS: + void slot_AssignTaskFIMtoTrainee(); public Q_SLOTS: //Слот обработки сигнала необходимости обновления интерфейса @@ -57,6 +59,10 @@ public Q_SLOTS: void slot_UpdateTasksFIMforTrainee(int trainee_id); +Q_SIGNALS: + void signal_currentItemChanged(); + + private: TaskAmmFim* getTaskByID(int id); void loadFIMtasksFromXML(QByteArray array); @@ -86,6 +92,8 @@ private: QThread* threadAnimation; WaitAnimationWidget *waitAnimationWidget; + + bool accessAssignTask; }; #endif // FIMTASKSWIDGET_H From bcc8d52b1917f9901b9b9c9842c5f4ffda5368a0 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 29 Jan 2025 14:49:21 +0300 Subject: [PATCH 48/77] =?UTF-8?q?=D0=97=D0=B0=D1=87=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B5=D0=B5=20=D0=B2=20?= =?UTF-8?q?=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=D0=B5=20?= =?UTF-8?q?FIM=20AMM=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tasks/ammtaskswidget.cpp | 17 +------- .../tasks/ammtaskswidget.ui | 42 +------------------ .../tasks/fimtaskswidget.cpp | 13 ------ .../tasks/fimtaskswidget.ui | 36 ---------------- 4 files changed, 3 insertions(+), 105 deletions(-) diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index fb805c5..cf2edcc 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -32,16 +32,7 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty preparationTreeWidget(); - ui->btnAssignTaskToTrainee->setEnabled(false); Q_EMIT signal_currentItemChanged(); - ui->btnUpdateTasks->setVisible(false); - - if(type == TypeList::listForTrainee) - { - ui->btnAssignTaskToTrainee->setVisible(false); - } - ui->label->setVisible(false); - ui->editCode->setVisible(false); threadPreparation = new QThread(); taskTreePreparation = new TaskTreePreparation(); @@ -119,7 +110,7 @@ void AMMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, PM* PMmodul = static_cast(module); type = "PM"; code = PMmodul->pmCode(); - ui->btnAssignTaskToTrainee->setEnabled(false); + accessAssignTask = false; } else @@ -127,16 +118,12 @@ void AMMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, DM* DMmodul = static_cast(module); type = "DM"; code = DMmodul->dmCode(); - ui->btnAssignTaskToTrainee->setEnabled(true); + accessAssignTask = true; } - - ui->label->setText(type + " Code"); - ui->editCode->setText(code); } else { - ui->btnAssignTaskToTrainee->setEnabled(false); accessAssignTask = false; } Q_EMIT signal_currentItemChanged(); diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.ui b/InstructorsAndTrainees/tasks/ammtaskswidget.ui index f248f9a..655045c 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.ui +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.ui @@ -21,47 +21,7 @@ - - - - - - - - - - Code - - - - - - - true - - - - - - - - - - - Update List - - - - - - - Assign task - - - - - - + diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index 095d9c3..263a2d1 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -32,16 +32,7 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty preparationTreeWidget(); - ui->btnAssignTaskToTrainee->setEnabled(false); Q_EMIT signal_currentItemChanged(); - ui->btnUpdateTasks->setVisible(false); - - if(type == TypeList::listForTrainee) - { - ui->btnAssignTaskToTrainee->setVisible(false); - } - ui->label->setVisible(false); - ui->editCode->setVisible(false); threadAnimation = new QThread(); waitAnimationWidget = new WaitAnimationWidget; @@ -103,17 +94,13 @@ void FIMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, code = task->title; - ui->btnAssignTaskToTrainee->setEnabled(true); accessAssignTask = true; } else { - ui->btnAssignTaskToTrainee->setEnabled(false); accessAssignTask = false; } - ui->editCode->setText(code); - Q_EMIT signal_currentItemChanged(); } diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.ui b/InstructorsAndTrainees/tasks/fimtaskswidget.ui index cf2853d..fd932dc 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.ui +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.ui @@ -17,42 +17,6 @@ - - - - - - Update List - - - - - - - Assign task - - - - - - - - - - - Code - - - - - - - true - - - - - From c9c433cf6b35b19536f807217cf0ffc3f1fa9144 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 29 Jan 2025 15:40:31 +0300 Subject: [PATCH 49/77] =?UTF-8?q?=D0=97=D0=B0=D0=BF=D1=80=D0=B5=D1=82=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD=D0=B8=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B0=D1=80=D1=85=D0=B8=D0=B2=D0=BD=D1=8B?= =?UTF-8?q?=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/interfacedatabaselms.cpp | 10 +++++++++ ServerLMS/Systems/processingsystem.cpp | 28 +++++++++++++++----------- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/DataBaseLMS/interfacedatabaselms.cpp b/DataBaseLMS/interfacedatabaselms.cpp index 00652ca..944ad9a 100644 --- a/DataBaseLMS/interfacedatabaselms.cpp +++ b/DataBaseLMS/interfacedatabaselms.cpp @@ -51,6 +51,11 @@ bool InterfaceDataBaseLMS::AuthorizationInstructor(QString login, QString passwo if(int id = selectInstructorID(login, password)) { + if(isArchivedInstructor(id)) + { + transactionEnd(); + return false; + } if(updateInstructorLoggedIn(id, true)) return transactionEnd(); } @@ -174,6 +179,11 @@ bool InterfaceDataBaseLMS::AuthorizationTrainee(QString login, QString password, if(int id = selectTraineeID(login, password)) { + if(isArchivedTrainee(id)) + { + transactionEnd(); + return false; + } if(updateTraineeLoggedIn(id, true)) return transactionEnd(); } diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 6833c26..599866e 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -48,19 +48,8 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien QString traineeName; QByteArray arrayAnswer; - if(providerDBLMS->authorizationTrainee(clientAutorization.Login, clientAutorization.Password, "", "")) - {//Авторизуется обучаемый - client->getClient()->setLogin(clientAutorization.Login); - emit sigUpdateListClients(); - - //KAV redact - instructorName = providerDBLMS->getMainInstructorName(); - traineeName = providerDBLMS->getNameTraineeByLogin(clientAutorization.Login); - - arrayAnswer = dataParser->ClientAnswer()->authorization(true, instructorName, traineeName, "trainee", clientAutorization.Login); - } - else if(providerDBLMS->authorizationInstructor(clientAutorization.Login, clientAutorization.Password)) + if(providerDBLMS->authorizationInstructor(clientAutorization.Login, clientAutorization.Password)) {//Авторизуется инструктор client->getClient()->setLogin(clientAutorization.Login); @@ -71,6 +60,21 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien arrayAnswer = dataParser->ClientAnswer()->authorization(true, instructorName, instructorName, "instructor", clientAutorization.Login); } + else if(clientAutorization.TypeClient != TypeClientAutorization::TYPE_GUI) + { + if(providerDBLMS->authorizationTrainee(clientAutorization.Login, clientAutorization.Password, "", "")) + {//Авторизуется обучаемый + + client->getClient()->setLogin(clientAutorization.Login); + emit sigUpdateListClients(); + + //KAV redact + instructorName = providerDBLMS->getMainInstructorName(); + traineeName = providerDBLMS->getNameTraineeByLogin(clientAutorization.Login); + + arrayAnswer = dataParser->ClientAnswer()->authorization(true, instructorName, traineeName, "trainee", clientAutorization.Login); + } + } else {//Никто не авторизовался arrayAnswer = dataParser->ClientAnswer()->authorization(false, "", "", "", ""); From 534ef54aabd792c943ba0bd8b1e2674350539462 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 29 Jan 2025 16:25:37 +0300 Subject: [PATCH 50/77] =?UTF-8?q?=D0=97=D0=B0=D0=BF=D1=80=D0=B5=D1=82=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD=D0=B8=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D1=83=D0=B6=D0=B5=20=D0=B7=D0=B0=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=B8=D0=BD=D0=B8=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/interfacedatabaselms.cpp | 4 ++-- ServerLMS/Systems/processingsystem.cpp | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/DataBaseLMS/interfacedatabaselms.cpp b/DataBaseLMS/interfacedatabaselms.cpp index 944ad9a..650a55b 100644 --- a/DataBaseLMS/interfacedatabaselms.cpp +++ b/DataBaseLMS/interfacedatabaselms.cpp @@ -51,7 +51,7 @@ bool InterfaceDataBaseLMS::AuthorizationInstructor(QString login, QString passwo if(int id = selectInstructorID(login, password)) { - if(isArchivedInstructor(id)) + if(isArchivedInstructor(id) || isLoggedInInstructor(id)) { transactionEnd(); return false; @@ -179,7 +179,7 @@ bool InterfaceDataBaseLMS::AuthorizationTrainee(QString login, QString password, if(int id = selectTraineeID(login, password)) { - if(isArchivedTrainee(id)) + if(isArchivedTrainee(id) || isLoggedInTrainee(id)) { transactionEnd(); return false; diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 599866e..bbbd562 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -74,6 +74,10 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien arrayAnswer = dataParser->ClientAnswer()->authorization(true, instructorName, traineeName, "trainee", clientAutorization.Login); } + else + {//Никто не авторизовался + arrayAnswer = dataParser->ClientAnswer()->authorization(false, "", "", "", ""); + } } else {//Никто не авторизовался From 5926b2094235cb363498ed2e46c0170599319996 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 29 Jan 2025 16:51:16 +0300 Subject: [PATCH 51/77] =?UTF-8?q?=D0=9F=D0=BE=D0=B2=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=BD=D0=B0=D1=8F=20=D1=81=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20=D0=BF=D1=80=D0=B8=20=D0=B7=D0=B0=D0=B3?= =?UTF-8?q?=D1=80=D1=83=D0=B7=D0=BA=D0=B5=20=D0=98=D0=BD=D1=81=D1=82=D1=80?= =?UTF-8?q?=20=D0=B8=20=D0=9E=D0=B1=D1=83=D1=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/instructors/instructorsview.cpp | 2 ++ InstructorsAndTrainees/trainees/traineesview.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/InstructorsAndTrainees/instructors/instructorsview.cpp b/InstructorsAndTrainees/instructors/instructorsview.cpp index dd2ec39..0df79e3 100644 --- a/InstructorsAndTrainees/instructors/instructorsview.cpp +++ b/InstructorsAndTrainees/instructors/instructorsview.cpp @@ -167,6 +167,8 @@ void InstructorsView::loadInstructorsFromDB() setCurrentInstructor(lastCurrentID); + treeWidget->sortItems(ColumnsTreeInsructors::clmn_Instructor, Qt::SortOrder::AscendingOrder); + mtxTreeWidget.unlock(); } diff --git a/InstructorsAndTrainees/trainees/traineesview.cpp b/InstructorsAndTrainees/trainees/traineesview.cpp index 825b157..263ab02 100644 --- a/InstructorsAndTrainees/trainees/traineesview.cpp +++ b/InstructorsAndTrainees/trainees/traineesview.cpp @@ -193,6 +193,8 @@ void TraineesView::loadTraineesFromDB() else setCurrentTrainee(lastCurrentID); + treeWidget->sortItems(ColumnsTreeTrainees::clmn_Trainee, Qt::SortOrder::AscendingOrder); + mtxTreeWidget.unlock(); } From 65249110d13a8992a2c358654105a531e298c858 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 29 Jan 2025 17:18:00 +0300 Subject: [PATCH 52/77] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8?= =?UTF-8?q?=20Send?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/messanger/messangerwidget.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/InstructorsAndTrainees/messanger/messangerwidget.cpp b/InstructorsAndTrainees/messanger/messangerwidget.cpp index 6fe6fdd..bead357 100644 --- a/InstructorsAndTrainees/messanger/messangerwidget.cpp +++ b/InstructorsAndTrainees/messanger/messangerwidget.cpp @@ -19,6 +19,8 @@ MessangerWidget::MessangerWidget(QWidget *parent) : ui->tabWidget->removeTab(0); ui->btnSend->setObjectName("btnSend"); + + ui->btnSend->setEnabled(false); } MessangerWidget::~MessangerWidget() @@ -55,6 +57,7 @@ void MessangerWidget::addTabDialogMessenger(Trainee trainee) {//Самая первая вкладка, делаем ее активной currLogin = trainee.getLogin(); emit signal_tabMessengerChanged(currLogin); + ui->btnSend->setEnabled(true); } //Проверяем наличие диалога с этим клиентом @@ -132,6 +135,7 @@ int MessangerWidget::getIndexTab(QString login) void MessangerWidget::clear() { + ui->btnSend->setEnabled(false); listTrainees.clear(); actualizationTabsDialogMessenger(); } @@ -182,9 +186,11 @@ void MessangerWidget::slot_traineeSelected(QString login) { //Активируем нужную вкладку ui->tabWidget->setCurrentIndex(getIndexTab(login)); + ui->btnSend->setEnabled(true); return; } } + ui->btnSend->setEnabled(false); } void MessangerWidget::slot_LanguageChanged(QString language) From aa921e4f51cc150153357ba1c59ef48e7d1a3e5a Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 29 Jan 2025 18:35:20 +0300 Subject: [PATCH 53/77] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=20Instructors=20and=20Trainees?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InstructorsAndTraineesWidget_ru_RU.qm | Bin 7329 -> 12633 bytes .../InstructorsAndTraineesWidget_ru_RU.ts | 683 ++++++++++++++---- 2 files changed, 550 insertions(+), 133 deletions(-) diff --git a/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.qm b/InstructorsAndTrainees/translations/InstructorsAndTraineesWidget_ru_RU.qm index 7b82e2477d9922146fba554fce99847f9dc54606..43be936fbb0a6f9bb96ebd3053936dde534a421a 100644 GIT binary patch literal 12633 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 QQFO + + AMMtasksWidget + + + Form + Форма + + + + Task AMM + Задача AMM + + + + DM code + DM код + + + + + ID + ID + + + + PM/DM + + + + + Code + Код + + DialogAuthorizationInstructor - + Instructor authorization Авторизация инструктора - + Login Логин - - + + admin - + Password Пароль @@ -28,12 +62,12 @@ DialogEditGroup - + Group Группа - + Name Имя @@ -41,17 +75,17 @@ DialogEditInstructor - + Instructor Инструктор - + Name Имя - + Login Логин @@ -61,17 +95,17 @@ Пароль - + Administrator Администратор - + Archived Архивный - + Logged Залогирован @@ -79,32 +113,32 @@ DialogEditTrainee - + Trainee Обучаемый - + Name Имя - + Login Логин - + Password Пароль - + Archived Архивный - + Logged Залогирован @@ -112,63 +146,123 @@ EditorInstructors - + List instructors Список инструкторов - + New instructor Новый инструктор - + Delete instructor Удалить инструктора - - + + To archive Архивировать - + Edit Редактировать - + Show archive Показать архив - + + + + Error! Ошибка! - + You cannot delete the Administrator. Нельзя удалить администратора. - + + You cannot delete a logged-in instructor. + Вы не можете удалить инструктора, вошедшего в систему. + + + Attention! Внимание! - + The deletion will be irrevocable. Delete it anyway? Удаление будет безвозвратным. Всё равно удалить? - + + You cannot archive a logged-in instructor. + Вы не можете заархивировать инструктора, вошедшего в систему. + + + + You cannot edit a logged-in instructor. + Вы не можете редактировать инструктора, вошедшего в систему. + + + From archive Разархивировать + + + + + + + Editing error! + Ошибка редактирования! + + + + Unacceptable instructor name has been entered. +The changes will not be accepted. + Введено неприемлемое имя инструктора. +Изменения приняты не будут. + + + + Unacceptable instructor login has been entered. +The changes will not be accepted. + Введен неприемлемый логин инструктора. +Изменения приняты не будут. + + + + Unacceptable instructor password has been entered. +The changes will not be accepted. + Введен неприемлемый пароль инструктора. +Изменения приняты не будут. + + + + An existing instructor name has been entered. + Введено имя существующего инструктора. + + + + An existing instructor login has been entered. +The changes will not be accepted. + Был введен существующий логин инструктора. +Изменения приняты не будут. + EditorTrainees @@ -178,139 +272,272 @@ Delete it anyway? Список обучаемых - + New group Новая группа - + Delete group Удалить группу - + New trainee Новый обучаемый - + Delete trainee Удалить обучаемого - - - + + + To archive Архивировать - + Edit Редактировать - + Show archive Показать архив - + + + + + + + + Editing error! Ошибка редактирования! - + The group is not empty. It is not possible to delete a non-empty group. Группа не пуста. Невозможно удалить непустую группу. - - + + Attention! Внимание! - - + + The deletion will be irrevocable. Delete anyway? Удаление будет безвозвратным. Всё равно удалить? - + + + + Error! + Ошибка! + + + + You cannot delete a logged-in trainee. + Вы не можете удалить обучаемого, вошедшего в систему. + + + + You cannot archive a logged-in trainee. + Вы не можете заархивировать обучаемого, вошедшего в систему. + + + + You cannot edit a logged-in trainee. + Вы не можете редактировать обучаемого, вошедшего в систему. + + + From archive Разархивировать + + + Unacceptable group name has been entered. +The changes will not be accepted. + Введено неприемлемое название группы. +Изменения приняты не будут. + + + + An existing group name has been entered. +The changes will not be accepted. + Введено существующее название группы. +Изменения приняты не будут. + + + + Unacceptable trainee name has been entered. +The changes will not be accepted. + Введено неприемлемое имя обучаемого. +Изменения приняты не будут. + + + + Unacceptable trainee login has been entered. +The changes will not be accepted. + Введен неприемлемый логин обучаемого. +Изменения приняты не будут. + + + + Unacceptable trainee password has been entered. +The changes will not be accepted. + Был введен неприемлемый пароль обучаемого. +Изменения приняты не будут. + + + + An existing trainee name has been entered. + Введено имя существующего обучаемого. + + + + An existing trainee login has been entered. +The changes will not be accepted. + Был введен существующий логин обучаемого. +Изменения приняты не будут. + + + + FIMtasksWidget + + + Form + Форма + + + + Task FIM + Задача FIM + + + + + ID + ID + + + + Title + Заголовок + InstructorsAndTraineesWidget - + Form Форма - + Database LMS База данных СУО - - Connection to DB - Соединиться с БД + + Connection to Server + Подключение к серверу - - - + + Logged in Instructor: + Вошедший в систему инструктор: + + + + ChangeVersion + Изменение версии + + + + Update StyleSheet + + + + + Tasks + Задачи + + + + AMM + + + + + FIM + + + + + Assign task + Назначить задачу + + + + + + Authorization Instructor Авторизация инструктора - - Logged in instructor: - Авторизованный инструктор: - - - - + + none нет - - + + Deauthorization Instructor Деавторизация инструктора - - Disconnection DB - Отключение БД + Attention! + Внимание! - - - Connection DB - Подключение БД + + The file could not be opened + Файл не может быть открыт - - - + + Instructor deauthorization + Деавторизация инструктора + + + + Error! + Ошибка! + + + + Instructor authorization Авторизация инструктора - - Successfully! - Успешно! - - - + Invalid login or password! Неправильный логин или пароль! @@ -318,154 +545,336 @@ Delete anyway? InstructorsView - - + + yes да - - - + + + no нет - + Instructor Инструктор - + Login Логин - + Password Пароль - + Administrator Администратор - + Archived Архивный - + Logged Залогирован - + ID ID - TasksWidget + MessangerWidget - - - Task manager - Менеджер задач + + Form + Форма + + + + Messenger + Мессенджер + + + + Send + Отправить + + + + Tab 1 + + + + + Tab 2 + + + + + MsgWidget + + + Form + Форма + + + + TextLabel + + + + + NewVersionWidget + + + Создать копию... + + + + + Basic version: + + + + + TextLabel + + + + + New name version: + + + + + Create + + + + + Cancel + + + + + Only Latin letters and numbers + + + + + NotifyController + + + Error + + + + + RecognizeSystem + + + Attention! + Внимание! + + + + The file could not be opened + + + + + You cannot delete the basic version! + + + + + You cannot delete the active version + + + + + This name already exists + TraineesView - - + + yes да - - + + no нет - + Trainee Обучаемый - + Login Логин - + Password Пароль - + Class Класс - + Computer Компьютер - + IP address IP адрес - + Archived Архивный - + Logged Залогирован - - Tasks - Задачи - - - + ID ID + + VersionSelectWidget + + + Form + Форма + + + + Available versions on the server: + + + + + Create copy + + + + + Delete + + + + + Change server version + + + + + Info: + + + + + Double click on the version to see information... + + + + + Current server version: + + + + + none + нет + + + + Version control + + + + + Version name: + + + + + Created: + + + + + Changeable: + + + + + Author: + + + + + Yes + + + + + No + + + + + + + + Version not selected + + + ViewerInstructors - - + + Instructors Инструкторы - + Editor of Instructors Редактор инструкторов - - Attention! - Внимание! - - - - Only the Administrator has the right to edit instructors. - Только Администратор имеет право редактировать инструкторов. - - - + Editor of instructors Редактор инструкторов @@ -473,20 +882,28 @@ Delete anyway? ViewerTrainees - - + + Trainees Обучаемые - + Editor of Trainees Редактор обучаемых - + Editor of trainees Редактор обучаемых + + WaitAnimationWidget + + + Form + Форма + + From 239b7d258c69b7ba7e4aeed26ca221576d7a40db Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 30 Jan 2025 09:20:38 +0300 Subject: [PATCH 54/77] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D1=8B=D0=B5=20Tasks=20=D0=B8=D0=B7=20=D0=A1?= =?UTF-8?q?=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ServerLMS/serverlmswidget.cpp | 15 --------------- ServerLMS/serverlmswidget.h | 1 - ServerLMS/serverlmswidget.ui | 31 ++----------------------------- 3 files changed, 2 insertions(+), 45 deletions(-) diff --git a/ServerLMS/serverlmswidget.cpp b/ServerLMS/serverlmswidget.cpp index e3539ef..4e57eee 100644 --- a/ServerLMS/serverlmswidget.cpp +++ b/ServerLMS/serverlmswidget.cpp @@ -27,12 +27,6 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) : qRegisterMetaType("PacketType"); - ui->comboTasks->addItem("Задача 1"); - ui->comboTasks->addItem("Задача 2"); - ui->comboTasks->addItem("Задача 3"); - ui->comboTasks->addItem("Задача 4"); - ui->comboTasks->addItem("Задача 5"); - ui->btnStopServer->setEnabled(false); ui->btnStartServer->setEnabled(true); @@ -225,15 +219,6 @@ void ServerLMSWidget::slot_LanguageChanged(QString language) qApp->installTranslator(&qtLanguageTranslator); } - -void ServerLMSWidget::on_btnTaskSet_clicked() -{ - QString fullNameClient = ui->listWidget_Clients->currentItem()->text(); - QString textTask = ui->comboTasks->currentText(); - - commonClientHandler->slot_sendTaskToClient(fullNameClient,textTask); -} - void ServerLMSWidget::slotAddToLog(QString msg) { ui->listWidgetLogger->addItem(msg); diff --git a/ServerLMS/serverlmswidget.h b/ServerLMS/serverlmswidget.h index 545d822..a19d13a 100644 --- a/ServerLMS/serverlmswidget.h +++ b/ServerLMS/serverlmswidget.h @@ -98,7 +98,6 @@ public: private slots: void on_btnStartServer_clicked(); void on_btnStopServer_clicked(); - void on_btnTaskSet_clicked(); private: bool startServer(); diff --git a/ServerLMS/serverlmswidget.ui b/ServerLMS/serverlmswidget.ui index db4997a..db46443 100644 --- a/ServerLMS/serverlmswidget.ui +++ b/ServerLMS/serverlmswidget.ui @@ -28,7 +28,7 @@ Server LMS - + @@ -92,7 +92,7 @@ - + @@ -184,33 +184,6 @@ - - - - Tasks - - - - - - - - - - - - - Set - - - - - - - - - - From 7b14dc709ce706680d7b1f121f9c64b2e99248fe Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 30 Jan 2025 12:27:05 +0300 Subject: [PATCH 55/77] Transaction deleteTrainee --- DataBaseLMS/databaselms.cpp | 54 +++++++++++++++++-- DataBaseLMS/databaselms.h | 1 + .../connectorToServer/Core/dataparser.cpp | 9 ++++ .../tasks/ammtaskswidget.cpp | 5 -- InstructorsAndTrainees/tasks/ammtaskswidget.h | 2 +- .../tasks/fimtaskswidget.cpp | 17 ++++-- InstructorsAndTrainees/tasks/fimtaskswidget.h | 2 +- 7 files changed, 74 insertions(+), 16 deletions(-) diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index 06ecb88..7de46e4 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -2,6 +2,7 @@ #include #include +#include #include DataBaseLMS::DataBaseLMS(): @@ -20,14 +21,16 @@ bool DataBaseLMS::createConnection() { mtxAccess.lock(); - db = new QSqlDatabase(QSqlDatabase::addDatabase(dbType)); + db = new QSqlDatabase(QSqlDatabase::addDatabase(dbType, connectionName)); db->setDatabaseName(dbName); db->setUserName(dbUserName); db->setPassword(dbPassword); db->setPort(5432); db->setHostName("192.168.100.87"); - if(!db->open()) + bool res = db->open(); + + if(!res) { mtxAccess.unlock(); deleteConnection(); @@ -35,6 +38,11 @@ bool DataBaseLMS::createConnection() } else { + bool flHas = db->driver()->hasFeature(QSqlDriver::Transactions); + + //bool resBool = QSqlDatabase::database(connectionName).transaction(); + //resBool = QSqlDatabase::database(connectionName).commit(); + mtxAccess.unlock(); return true; } @@ -823,12 +831,50 @@ int DataBaseLMS::insertTrainee(Trainee trainee) int DataBaseLMS::deleteTrainee(int id_trainee) { - QString queryStr = QString("DELETE FROM public.trainees " + QString queryStr; + int res = 0; + bool resBool = false; + + resBool = db->transaction(); + + QSqlQuery query = QSqlQuery(*db); + + queryStr = QString("DELETE FROM public.tasks_amm " + "WHERE trainee_task = %1 ").arg( + QString::number(id_trainee)); + + if(!queryExec(queryStr, &query)) + { + resBool = db->rollback(); + return 0; + } + + queryStr = QString("DELETE FROM public.tasks_fim " + "WHERE trainee_task = %1 ").arg( + QString::number(id_trainee)); + + if(!queryExec(queryStr, &query)) + { + resBool = db->rollback(); + return 0; + } + + queryStr = QString("DELETE FROM public.trainees " "WHERE trainee_id = %1 " "RETURNING trainees.trainee_id").arg( QString::number(id_trainee)); - return queryExecInt(queryStr); + res = queryExecInt(queryStr); + if(res) + { + resBool = db->commit(); + return res; + } + else + { + resBool = db->rollback(); + return 0; + } } int DataBaseLMS::updateTrainee(Trainee trainee) diff --git a/DataBaseLMS/databaselms.h b/DataBaseLMS/databaselms.h index 3f5ea81..5b24b8b 100644 --- a/DataBaseLMS/databaselms.h +++ b/DataBaseLMS/databaselms.h @@ -94,6 +94,7 @@ private: protected: QSqlDatabase* db; const QString dbName = "DataBaseLMS"; + const QString connectionName = "Connection_DataBaseLMS"; private: bool transactionBegined; const QString dbUserName = "postgres"; diff --git a/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp b/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp index b3ad8c3..21e66f5 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp @@ -184,6 +184,15 @@ QByteArray DataParser::createQueryToDBMessage(ClientQueryToDB *queryToDB, int id if(task) { xmlWriter.writeAttribute("title", task->title); + + for(Malfunction malfunction : task->malfunctionList) + { + xmlWriter.writeStartElement("malfunction"); + xmlWriter.writeAttribute("dmCode", malfunction.dmCode); + xmlWriter.writeAttribute("num", malfunction.num); + xmlWriter.writeAttribute("description", malfunction.description); + xmlWriter.writeEndElement(); + } } } } diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index cf2edcc..9dde469 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -226,11 +226,6 @@ void AMMtasksWidget::on_btnUpdateTasks_clicked() connectorToServer->sendQueryTasksXML("amm"); } -void AMMtasksWidget::on_btnAssignTaskToTrainee_clicked() -{ - slot_AssignTaskAMMtoTrainee(); -} - void AMMtasksWidget::slot_AssignTaskAMMtoTrainee() { QTreeWidgetItem *current = treeWidget->currentItem(); diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index 6d4c46e..1c69759 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -43,7 +43,7 @@ public: private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); void on_btnUpdateTasks_clicked(); - void on_btnAssignTaskToTrainee_clicked(); + public Q_SLOTS: void slot_AssignTaskAMMtoTrainee(); diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index 263a2d1..b567986 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -356,11 +356,6 @@ void FIMtasksWidget::on_btnUpdateTasks_clicked() connectorToServer->sendQueryTasksXML("fim"); } -void FIMtasksWidget::on_btnAssignTaskToTrainee_clicked() -{ - slot_AssignTaskFIMtoTrainee(); -} - void FIMtasksWidget::slot_AssignTaskFIMtoTrainee() { QTreeWidgetItem *current = treeWidget->currentItem(); @@ -379,6 +374,18 @@ void FIMtasksWidget::slot_AssignTaskFIMtoTrainee() TaskAmmFim taskNew; taskNew.title = task->title; + //Назначенные неисправности + for (int i = 0; i < current->childCount(); i++) + { + QTreeWidgetItem* itemMalfunction = current->child(i); + + if(itemMalfunction->checkState(0) == Qt::Checked) + { + Malfunction malfunction = task->malfunctionList.at(i); + taskNew.malfunctionList.append(malfunction); + } + } + connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE, trainee_id, &taskNew); updateTaskItem(current); diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index 663ea67..99d649b 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -47,7 +47,7 @@ public: private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); void on_btnUpdateTasks_clicked(); - void on_btnAssignTaskToTrainee_clicked(); + public Q_SLOTS: void slot_AssignTaskFIMtoTrainee(); From b1e807b5e3244000c184e1c833c6829551d9dc07 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 30 Jan 2025 12:53:29 +0300 Subject: [PATCH 56/77] =?UTF-8?q?newTaskFIM=20=D0=B1=D0=B5=D0=B7=20editTas?= =?UTF-8?q?kFIM=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=BF=D1=80=D1=8F=D0=BC=D1=83=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/databaselms.cpp | 5 +++-- DataBaseLMS/databaselms.h | 2 +- DataBaseLMS/interfacedatabaselms.cpp | 4 ++-- DataBaseLMS/interfacedatabaselms.h | 2 +- ServerLMS/Systems/processingsystem.cpp | 5 ++++- ServerLMS/providerdblms.cpp | 4 ++-- ServerLMS/providerdblms.h | 2 +- 7 files changed, 14 insertions(+), 10 deletions(-) diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index 7de46e4..b74a847 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -517,11 +517,12 @@ QList DataBaseLMS::selectTasksAMMofTrainee(int id_trainee) return listTasks; } -int DataBaseLMS::insertTaskFIM(int id_trainee) +int DataBaseLMS::insertTaskFIM(TaskAmmFim task, int id_trainee) { QString queryStr = QString("INSERT INTO public.tasks_fim (title, trainee_task) " - "VALUES (DEFAULT, %1) " + "VALUES ('%1', %2) " "RETURNING tasks_fim.task_id").arg( + task.title, QString::number(id_trainee)); return queryExecInt(queryStr); diff --git a/DataBaseLMS/databaselms.h b/DataBaseLMS/databaselms.h index 5b24b8b..eec4c88 100644 --- a/DataBaseLMS/databaselms.h +++ b/DataBaseLMS/databaselms.h @@ -59,7 +59,7 @@ protected: int deleteTaskAMM(int id_task); QList selectTasksAMMofTrainee(int id_trainee); //Задача FIM - int insertTaskFIM(int id_trainee); + int insertTaskFIM(TaskAmmFim task, int id_trainee); int updateTaskFIM(TaskAmmFim task); int deleteTaskFIM(int id_task); QList selectTasksFIMofTrainee(int id_trainee); diff --git a/DataBaseLMS/interfacedatabaselms.cpp b/DataBaseLMS/interfacedatabaselms.cpp index 650a55b..5d385d8 100644 --- a/DataBaseLMS/interfacedatabaselms.cpp +++ b/DataBaseLMS/interfacedatabaselms.cpp @@ -316,9 +316,9 @@ QList InterfaceDataBaseLMS::getListTasksFIMofTrainee(int id_trainee) return selectTasksFIMofTrainee(id_trainee); } -int InterfaceDataBaseLMS::newTaskFIM(int id_trainee) +int InterfaceDataBaseLMS::newTaskFIM(TaskAmmFim task, int id_trainee) { - return insertTaskFIM(id_trainee); + return insertTaskFIM(task, id_trainee); } int InterfaceDataBaseLMS::delTaskFIM(int id) diff --git a/DataBaseLMS/interfacedatabaselms.h b/DataBaseLMS/interfacedatabaselms.h index 6fd5f00..74b3af6 100644 --- a/DataBaseLMS/interfacedatabaselms.h +++ b/DataBaseLMS/interfacedatabaselms.h @@ -75,7 +75,7 @@ public: QList getListTasksAMMofTrainee(int id_trainee); QList getListTasksFIMofTrainee(int id_trainee); - int newTaskFIM(int id_trainee); + int newTaskFIM(TaskAmmFim task, int id_trainee); int delTaskFIM(int id); int editTaskFIM(TaskAmmFim task); diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index bbbd562..ed81bbc 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -261,12 +261,15 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu case TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE: { int id_new; - id_new = providerDBLMS->newTaskFIM(id); + id_new = providerDBLMS->newTaskFIM(*(TaskAmmFim*)data, id); + + /* if(id_new) { (*(TaskAmmFim*)data).setID(id_new); providerDBLMS->editTaskFIM(*(TaskAmmFim*)data); } + */ //emit sigTasksChanged(); //break; } diff --git a/ServerLMS/providerdblms.cpp b/ServerLMS/providerdblms.cpp index 7cd4e6f..fd646ec 100644 --- a/ServerLMS/providerdblms.cpp +++ b/ServerLMS/providerdblms.cpp @@ -315,9 +315,9 @@ int ProviderDBLMS::editTaskAMM(TaskAmmFim task) return dbLMS->editTaskAMM(task); } -int ProviderDBLMS::newTaskFIM(int id_trainee) +int ProviderDBLMS::newTaskFIM(TaskAmmFim task, int id_trainee) { - return dbLMS->newTaskFIM(id_trainee); + return dbLMS->newTaskFIM(task, id_trainee); } int ProviderDBLMS::delTaskFIM(int id) diff --git a/ServerLMS/providerdblms.h b/ServerLMS/providerdblms.h index bb138ac..a575fc8 100644 --- a/ServerLMS/providerdblms.h +++ b/ServerLMS/providerdblms.h @@ -46,7 +46,7 @@ public: int delTaskAMM(int id); int editTaskAMM(TaskAmmFim task); - int newTaskFIM(int id_trainee); + int newTaskFIM(TaskAmmFim task, int id_trainee); int delTaskFIM(int id); int editTaskFIM(TaskAmmFim task); From baef585b46e3135327e58cdb8f254eb37d9c9fc1 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 30 Jan 2025 13:33:04 +0300 Subject: [PATCH 57/77] =?UTF-8?q?newTaskAMM=20=D0=B1=D0=B5=D0=B7=20editTas?= =?UTF-8?q?kAMM=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=BF=D1=80=D1=8F=D0=BC=D1=83=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/databaselms.cpp | 6 ++++-- DataBaseLMS/databaselms.h | 2 +- DataBaseLMS/interfacedatabaselms.cpp | 4 ++-- DataBaseLMS/interfacedatabaselms.h | 2 +- ServerLMS/Systems/processingsystem.cpp | 4 +++- ServerLMS/providerdblms.cpp | 4 ++-- ServerLMS/providerdblms.h | 2 +- 7 files changed, 14 insertions(+), 10 deletions(-) diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index b74a847..dacf733 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -455,11 +455,13 @@ int DataBaseLMS::updateGroup(Group group) return queryExecInt(queryStr); } -int DataBaseLMS::insertTaskAMM(int id_trainee) +int DataBaseLMS::insertTaskAMM(TaskAmmFim task, int id_trainee) { QString queryStr = QString("INSERT INTO public.tasks_amm (title, dm_code, trainee_task) " - "VALUES (DEFAULT, DEFAULT, %1) " + "VALUES ('%1', '%2', %3) " "RETURNING tasks_amm.task_id").arg( + task.ammProcedure.title, + task.ammProcedure.dmCode, QString::number(id_trainee)); return queryExecInt(queryStr); diff --git a/DataBaseLMS/databaselms.h b/DataBaseLMS/databaselms.h index eec4c88..79572a2 100644 --- a/DataBaseLMS/databaselms.h +++ b/DataBaseLMS/databaselms.h @@ -54,7 +54,7 @@ protected: int updateGroup(Group group); //Задача AMM - int insertTaskAMM(int id_trainee); + int insertTaskAMM(TaskAmmFim task, int id_trainee); int updateTaskAMM(TaskAmmFim task); int deleteTaskAMM(int id_task); QList selectTasksAMMofTrainee(int id_trainee); diff --git a/DataBaseLMS/interfacedatabaselms.cpp b/DataBaseLMS/interfacedatabaselms.cpp index 5d385d8..68e9596 100644 --- a/DataBaseLMS/interfacedatabaselms.cpp +++ b/DataBaseLMS/interfacedatabaselms.cpp @@ -291,9 +291,9 @@ int InterfaceDataBaseLMS::editGroup(Group group) return updateGroup(group); } -int InterfaceDataBaseLMS::newTaskAMM(int id_trainee) +int InterfaceDataBaseLMS::newTaskAMM(TaskAmmFim task, int id_trainee) { - return insertTaskAMM(id_trainee); + return insertTaskAMM(task, id_trainee); } int InterfaceDataBaseLMS::delTaskAMM(int id) diff --git a/DataBaseLMS/interfacedatabaselms.h b/DataBaseLMS/interfacedatabaselms.h index 74b3af6..9dad569 100644 --- a/DataBaseLMS/interfacedatabaselms.h +++ b/DataBaseLMS/interfacedatabaselms.h @@ -69,7 +69,7 @@ public: int delGroup(int id); int editGroup(Group group); - int newTaskAMM(int id_trainee); + int newTaskAMM(TaskAmmFim task, int id_trainee); int delTaskAMM(int id); int editTaskAMM(TaskAmmFim task); QList getListTasksAMMofTrainee(int id_trainee); diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index ed81bbc..88283fc 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -239,12 +239,14 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu case TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE: { int id_new; - id_new = providerDBLMS->newTaskAMM(id); + id_new = providerDBLMS->newTaskAMM(*(TaskAmmFim*)data, id); + /* if(id_new) { (*(TaskAmmFim*)data).setID(id_new); providerDBLMS->editTaskAMM(*(TaskAmmFim*)data); } + */ //emit sigTasksChanged(); //break; } diff --git a/ServerLMS/providerdblms.cpp b/ServerLMS/providerdblms.cpp index fd646ec..bd006ab 100644 --- a/ServerLMS/providerdblms.cpp +++ b/ServerLMS/providerdblms.cpp @@ -300,9 +300,9 @@ int ProviderDBLMS::editGroup(Group group) return dbLMS->editGroup(group); } -int ProviderDBLMS::newTaskAMM(int id_trainee) +int ProviderDBLMS::newTaskAMM(TaskAmmFim task, int id_trainee) { - return dbLMS->newTaskAMM(id_trainee); + return dbLMS->newTaskAMM(task, id_trainee); } int ProviderDBLMS::delTaskAMM(int id) diff --git a/ServerLMS/providerdblms.h b/ServerLMS/providerdblms.h index a575fc8..96705f9 100644 --- a/ServerLMS/providerdblms.h +++ b/ServerLMS/providerdblms.h @@ -42,7 +42,7 @@ public: int delGroup(int id); int editGroup(Group group); - int newTaskAMM(int id_trainee); + int newTaskAMM(TaskAmmFim task, int id_trainee); int delTaskAMM(int id); int editTaskAMM(TaskAmmFim task); From e3467578649fcb860555f14f80a47c0e48bad79b Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 30 Jan 2025 16:50:21 +0300 Subject: [PATCH 58/77] =?UTF-8?q?taskFIM=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=B2=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B7=D1=83=20=D1=81=20Malfunction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/databaselms.cpp | 34 +++++++++++++- .../connectorToServer/Core/dataparser.cpp | 5 +++ ServerLMS/Systems/Parsers/processparser.cpp | 44 +++++++++++++++++-- ServerLMS/Systems/Parsers/processparser.h | 4 +- 4 files changed, 80 insertions(+), 7 deletions(-) diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index dacf733..f5b15b4 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -521,13 +521,43 @@ QList DataBaseLMS::selectTasksAMMofTrainee(int id_trainee) int DataBaseLMS::insertTaskFIM(TaskAmmFim task, int id_trainee) { - QString queryStr = QString("INSERT INTO public.tasks_fim (title, trainee_task) " + QString queryStr; + bool resBool = false; + + resBool = db->transaction(); + + queryStr = QString("INSERT INTO public.tasks_fim (title, trainee_task) " "VALUES ('%1', %2) " "RETURNING tasks_fim.task_id").arg( task.title, QString::number(id_trainee)); - return queryExecInt(queryStr); + int task_id = queryExecInt(queryStr); + if(!task_id) + { + resBool = db->rollback(); + return 0; + } + + for(Malfunction malfanction : task.malfunctionList) + { + queryStr = QString("INSERT INTO public.malfunctions (num, dm_code, description, task_fim_malf) " + "VALUES ('%1', '%2', '%3', %4) " + "RETURNING malfunctions.malfunction_id").arg( + malfanction.num, + malfanction.dmCode, + malfanction.description, + QString::number(task_id)); + + if(!queryExecInt(queryStr)) + { + resBool = db->rollback(); + return 0; + } + } + + resBool = db->commit(); + return task_id; } int DataBaseLMS::updateTaskFIM(TaskAmmFim task) diff --git a/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp b/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp index 21e66f5..b0163d6 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/dataparser.cpp @@ -201,6 +201,11 @@ QByteArray DataParser::createQueryToDBMessage(ClientQueryToDB *queryToDB, int id xmlWriter.writeEndElement(); xmlWriter.writeEndDocument(); + QFile file("QueryToDB.xml"); + file.open(QIODevice::WriteOnly); + file.write(array); + file.close(); + return array; } diff --git a/ServerLMS/Systems/Parsers/processparser.cpp b/ServerLMS/Systems/Parsers/processparser.cpp index aa91cc2..d6706e5 100644 --- a/ServerLMS/Systems/Parsers/processparser.cpp +++ b/ServerLMS/Systems/Parsers/processparser.cpp @@ -42,7 +42,7 @@ void ProcessParser::read(ClientHandler *client, QByteArray array) else if(xmlReader.name() == "QueryToDB") {//Запрос к базе данных от клиента - queryToDb(xmlReader,client); + queryToDb(xmlReader,client, array); } else if(xmlReader.name() == "QueryTasksXML") {//Запрос файла XML с задачами @@ -92,6 +92,36 @@ void ProcessParser::clientDataInfo(QXmlStreamReader &xmlReader,ClientHandler *cl processingSystem->setCurrentDataInfo(dataInfo); } + +TaskAmmFim ProcessParser::xmlParserQueryToDB_ASSIGN_TASK_FIM_TO_TRAINEE(QByteArray array) +{ + TaskAmmFim task; + + QDomDocument commonDOM; + commonDOM.setContent(array); + + QDomNode mainNode = commonDOM.namedItem("QueryToDB"); + + task.title = mainNode.toElement().attribute("title"); + + for(int i = 0; i < mainNode.childNodes().count(); i++) + { + QDomNode malfunctionNode = mainNode.childNodes().at(i); + if(malfunctionNode.nodeName() == "malfunction") + {//Неисправность + Malfunction malfunction; + + malfunction.num = malfunctionNode.toElement().attribute("num"); + malfunction.dmCode = malfunctionNode.toElement().attribute("dmCode"); + malfunction.description = malfunctionNode.toElement().attribute("description"); + + task.malfunctionList.append(malfunction); + } + } + + return task; +} + void ProcessParser::clientAuth(QXmlStreamReader &xmlReader,ClientHandler *client) { ClientAutorization clientAutorization; @@ -156,7 +186,7 @@ void ProcessParser::toClientMessage(QXmlStreamReader &xmlReader,ClientHandler *c processingSystem->processingToClientMessage(client, toClientMessage); } -void ProcessParser::queryToDb(QXmlStreamReader &xmlReader,ClientHandler *client) +void ProcessParser::queryToDb(QXmlStreamReader &xmlReader,ClientHandler *client, QByteArray array) { ClientQueryToDB queryToDB; int id = 0; @@ -174,7 +204,13 @@ void ProcessParser::queryToDb(QXmlStreamReader &xmlReader,ClientHandler *client) //addTextToLogger(name + ": " + value); if(name == "TypeQuery") + { queryToDB.typeQuery = (TypeQueryToDB)value.toInt(); + if(queryToDB.typeQuery == TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE) + { + task = xmlParserQueryToDB_ASSIGN_TASK_FIM_TO_TRAINEE(array); + } + } else if(name == "id") id = value.toInt(); else @@ -238,8 +274,8 @@ void ProcessParser::queryToDb(QXmlStreamReader &xmlReader,ClientHandler *client) task.ammProcedure.dmCode = value; break; case TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE: - if(name == "title") - task.title = value; + //if(name == "title") + //task.title = value; break; }; } diff --git a/ServerLMS/Systems/Parsers/processparser.h b/ServerLMS/Systems/Parsers/processparser.h index cf6f8f8..2dca25a 100644 --- a/ServerLMS/Systems/Parsers/processparser.h +++ b/ServerLMS/Systems/Parsers/processparser.h @@ -22,11 +22,13 @@ private: void clientAuth(QXmlStreamReader &xmlReader,ClientHandler *client); void clientDeAuth(QXmlStreamReader &xmlReader,ClientHandler *client); void toClientMessage(QXmlStreamReader &xmlReader,ClientHandler *client); - void queryToDb(QXmlStreamReader &xmlReader,ClientHandler *client); + void queryToDb(QXmlStreamReader &xmlReader,ClientHandler *client, QByteArray array = QByteArray()); void queryTasksXML(QXmlStreamReader &xmlReader,ClientHandler *client); void clientMessage(QXmlStreamReader &xmlReader,ClientHandler *client); void clientNotify(QXmlStreamReader &xmlReader,ClientHandler *client); void clientDataInfo(QXmlStreamReader &xmlReader, ClientHandler *client); + + TaskAmmFim xmlParserQueryToDB_ASSIGN_TASK_FIM_TO_TRAINEE(QByteArray array); }; #endif // PROCESSPARSER_H From efb57f4868ed658fdd58fbf61c90045606075691 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Thu, 30 Jan 2025 17:39:00 +0300 Subject: [PATCH 59/77] =?UTF-8?q?taskFIM=20=D0=B2=D1=8B=D0=B4=D0=B0=D1=8E?= =?UTF-8?q?=D1=82=D1=81=D1=8F=20=D0=B8=D0=B7=20=D0=B1=D0=B0=D0=B7=D1=8B=20?= =?UTF-8?q?=D1=81=20Malfunction=20=D0=B2=20GUI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/databaselms.cpp | 44 +++++++++++++++++++- ServerLMS/Systems/Parsers/dbanswerparser.cpp | 9 ++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index f5b15b4..ff6b50a 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -573,6 +573,7 @@ int DataBaseLMS::updateTaskFIM(TaskAmmFim task) int DataBaseLMS::deleteTaskFIM(int id_task) { + //TODO доделать удаление malfunction QString queryStr = QString("DELETE FROM public.tasks_fim " "WHERE task_id = %1 " "RETURNING tasks_fim.task_id").arg( @@ -584,8 +585,12 @@ int DataBaseLMS::deleteTaskFIM(int id_task) QList DataBaseLMS::selectTasksFIMofTrainee(int id_trainee) { QList listTasks; + QString queryStr; + bool resBool = false; - QString queryStr = QString("SELECT tasks_fim.task_id, tasks_fim.title, " + resBool = db->transaction(); + + queryStr = QString("SELECT tasks_fim.task_id, tasks_fim.title, " "trainees.trainee_id " "FROM public.tasks_fim JOIN public.trainees ON trainees.trainee_id = tasks_fim.trainee_task " "WHERE tasks_fim.trainee_task = %1 " @@ -603,10 +608,45 @@ QList DataBaseLMS::selectTasksFIMofTrainee(int id_trainee) task.setID(query.value(0).toInt()); task.title = query.value(1).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.task_fim_malf " + "WHERE malfunctions.task_fim_malf = %1 " + "ORDER BY malfunctions.num ASC").arg( + task.getID()); + + QSqlQuery queryMalf = QSqlQuery(*db); + + if(queryExec(queryStr, &queryMalf)) + { + while (queryMalf.next()) + {//Неисправность + Malfunction malfanction; + + malfanction.num = queryMalf.value(1).toString(); + malfanction.dmCode = queryMalf.value(2).toString(); + malfanction.description = queryMalf.value(3).toString(); + + task.addMalfunction(malfanction); + }; + } + else + { + resBool = db->rollback(); + return QList(); + } + listTasks.append(task); - } + }; + } + else + { + resBool = db->rollback(); + return QList(); } + resBool = db->commit(); return listTasks; } diff --git a/ServerLMS/Systems/Parsers/dbanswerparser.cpp b/ServerLMS/Systems/Parsers/dbanswerparser.cpp index ee3f8cf..f652862 100644 --- a/ServerLMS/Systems/Parsers/dbanswerparser.cpp +++ b/ServerLMS/Systems/Parsers/dbanswerparser.cpp @@ -148,6 +148,15 @@ QByteArray DBAnswerParser::listTasksFIMofTrainee(bool result, QList listNode.appendChild(taskNode); taskNode.toElement().setAttribute("task_id", QString::number(task.getID())); taskNode.toElement().setAttribute("title", task.title); + + for(Malfunction malfunction : task.malfunctionList) + {//Неисправность + QDomNode malfunctionNode = commonDOM.createElement("malfunction"); + taskNode.appendChild(malfunctionNode); + malfunctionNode.toElement().setAttribute("dmCode", malfunction.dmCode); + malfunctionNode.toElement().setAttribute("num", malfunction.num); + malfunctionNode.toElement().setAttribute("description", malfunction.description); + } } dataParser->saveDOMtoXML("ListTasksFIM.xml", &commonDOM); From d3b55efd0e40808533b112d22f9e2fda33255b49 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Fri, 31 Jan 2025 09:39:48 +0300 Subject: [PATCH 60/77] =?UTF-8?q?taskFIM=20=D0=BF=D1=80=D0=B8=D0=BD=D0=B8?= =?UTF-8?q?=D0=BC=D0=B0=D1=8E=D1=82=D1=81=D1=8F=20=D0=B8=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=20=D1=81=20Malfunction=20=D0=B2=20GUI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../connectorToServer/Core/recognizesystem.cpp | 18 ++++++++++++++++-- .../tasks/fimtaskswidget.cpp | 8 ++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp index 9750900..93b7d82 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp @@ -703,14 +703,28 @@ void RecognizeSystem::xmlParserQueryToDB(PacketType packetType, QByteArray array trainee_id = listNode.toElement().attribute("trainee_id").toInt(); for(int i = 0; i < listNode.childNodes().count(); i++) - { + {//Задачи QDomNode taskNode = listNode.childNodes().at(i); if(taskNode.nodeName() == "taskFIM") - {//Задача + { TaskAmmFim task; task.setID(taskNode.toElement().attribute("task_id").toInt()); task.title = taskNode.toElement().attribute("title"); + for(int j = 0; j < taskNode.childNodes().count(); j++) + {//Неисправности + QDomNode malfunctionNode = taskNode.childNodes().at(j); + if(malfunctionNode.nodeName() == "malfunction") + { + Malfunction malfunction; + malfunction.num = malfunctionNode.toElement().attribute("num"); + malfunction.dmCode = malfunctionNode.toElement().attribute("dmCode"); + malfunction.description = malfunctionNode.toElement().attribute("description"); + + task.malfunctionList.append(malfunction); + } + } + listTasks.append(task); } } diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index b567986..ce67808 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -211,8 +211,12 @@ void FIMtasksWidget::fillTree() QTreeWidgetItem* itemMalfunction = new QTreeWidgetItem(); itemMalfunction->setText(0, malfunction.description); - itemMalfunction->setFlags(itemMalfunction->flags() | Qt::ItemIsUserCheckable); - itemMalfunction->setCheckState(0, Qt::Checked); + if(type == TypeList::listCommon) + { + itemMalfunction->setFlags(itemMalfunction->flags() | Qt::ItemIsUserCheckable); + itemMalfunction->setCheckState(0, Qt::Checked); + } + itemMalfunction->setIcon(0, QIcon(":/resources/icons/malfunction.png")); itemMalfunction->setToolTip(0, malfunction.description); From c46986f9e387774aee868ee0e643e58c0390de49 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Fri, 31 Jan 2025 11:27:57 +0300 Subject: [PATCH 61/77] =?UTF-8?q?=D0=9A=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F=20GUI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/commonview.h | 2 +- .../connectorToServer/Core/tcpclient.cpp | 1 + .../connectorToServer/connectortoserver.cpp | 3 ++- .../instructors/viewerinstructors.cpp | 6 +++++ .../instructors/viewerinstructors.h | 2 ++ .../instructorsandtraineeswidget.cpp | 25 ++++++++++++------- InstructorsAndTrainees/tasks/ammtaskswidget.h | 4 ++- InstructorsAndTrainees/tasks/fimtaskswidget.h | 3 ++- .../trainees/viewertrainees.cpp | 8 ++++++ .../trainees/viewertrainees.h | 7 +----- 10 files changed, 42 insertions(+), 19 deletions(-) diff --git a/InstructorsAndTrainees/commonview.h b/InstructorsAndTrainees/commonview.h index 0f7755c..dd1305d 100644 --- a/InstructorsAndTrainees/commonview.h +++ b/InstructorsAndTrainees/commonview.h @@ -35,7 +35,7 @@ public: { this->adminMode = adminMode; } - void clearTree() + void deactivate() { treeWidget->clear(); lastCurrentID = 0; diff --git a/InstructorsAndTrainees/connectorToServer/Core/tcpclient.cpp b/InstructorsAndTrainees/connectorToServer/Core/tcpclient.cpp index c6fcde2..ebbcb7b 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/tcpclient.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/tcpclient.cpp @@ -48,6 +48,7 @@ void TCPClient::setConnect(ServerSettings *serverSettings) else { isConnected = false; + emit signal_ConnectedToServer(false); emit sigServerDisconnect(); } } diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index 27e1637..0982b27 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -383,7 +383,8 @@ void ConnectorToServer::initialize() emit sigInitializeClient(recognizeSystem,sendSystem,connectionThread); - emit sigSetConnect(dataParser->getServerSettings(),connectionThread); + SetConnectToServer(); + //emit sigSetConnect(dataParser->getServerSettings(),connectionThread); // QByteArray answer = dataParser->xmlAnswer_notify() // sendSystem->sendXMLAnswer() diff --git a/InstructorsAndTrainees/instructors/viewerinstructors.cpp b/InstructorsAndTrainees/instructors/viewerinstructors.cpp index 9ef38c9..2ba92ec 100644 --- a/InstructorsAndTrainees/instructors/viewerinstructors.cpp +++ b/InstructorsAndTrainees/instructors/viewerinstructors.cpp @@ -28,6 +28,12 @@ void ViewerInstructors::setAuthComplited(bool authComplited) updateButtons(); } +void ViewerInstructors::deactivate() +{ + CommonView::deactivate(); + updateButtons(); +} + void ViewerInstructors::changeEvent(QEvent *event) { // В случае получения события изменения языка приложения diff --git a/InstructorsAndTrainees/instructors/viewerinstructors.h b/InstructorsAndTrainees/instructors/viewerinstructors.h index e055b0f..8d551b5 100644 --- a/InstructorsAndTrainees/instructors/viewerinstructors.h +++ b/InstructorsAndTrainees/instructors/viewerinstructors.h @@ -20,6 +20,8 @@ public: public: void setAuthComplited(bool authComplited); + void deactivate(); + protected: void changeEvent(QEvent * event) override; diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 30a33ec..0deea32 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -102,7 +102,7 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : messangerWidget->setMinimumSize(400, 500); messangerWidget->setMaximumWidth(500); - //ui->btnAuthorizationInstructor->setEnabled(false); + ui->btnAuthorizationInstructor->setEnabled(false); ui->btnAssignTask->setEnabled(false); @@ -263,13 +263,19 @@ void InstructorsAndTraineesWidget::slot_ConnectedToServer(bool state) ui->btnSetVersion->hide(); ui->lblDBisConnected->setPixmap(QPixmap(QStringLiteral(":/resources/icons/circleGray.png"))); - viewerTrainees->clearTree(); - viewerInstructors->clearTree(); + viewerInstructors->setAuthComplited(false); + viewerTrainees->setAuthComplited(false); - ammTasksWidget->clearTree(); - fimTasksWidget->clearTree(); + viewerTrainees->deactivate(); + viewerInstructors->deactivate(); + + ammTasksWidget->deactivate(); + fimTasksWidget->deactivate(); + ui->btnAssignTask->setEnabled(false); messangerWidget->clear(); + + QMessageBox::warning(this, tr("Warning!"), tr("The server is disabled")); } } @@ -366,11 +372,12 @@ void InstructorsAndTraineesWidget::on_btnAuthorizationInstructor_clicked() disconnect(connectorToServer,&ConnectorToServer::signal_UpdateDB,viewerTrainees,&ViewerTrainees::slot_NeedUpdateUI); disconnect(connectorToServer,&ConnectorToServer::signal_InitMessanger,messangerWidget,&MessangerWidget::slot_InitMessanger); - viewerTrainees->clearTree(); - viewerInstructors->clearTree(); + viewerTrainees->deactivate(); + viewerInstructors->deactivate(); - ammTasksWidget->clearTree(); - fimTasksWidget->clearTree(); + ammTasksWidget->deactivate(); + fimTasksWidget->deactivate(); + ui->btnAssignTask->setEnabled(false); messangerWidget->clear(); } diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index 1c69759..43252a7 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -29,8 +29,10 @@ public: ~AMMtasksWidget(); public: - void clearTree() + void deactivate() { + accessAssignTask = false; + //taskTreePreparation->stopParser(); treeWidget->clear(); loginTraineeSelected = ""; idTraineeSelected = 0; diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index 99d649b..65a4ce8 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -33,8 +33,9 @@ public: ~FIMtasksWidget(); public: - void clearTree() + void deactivate() { + accessAssignTask = false; treeWidget->clear(); loginTraineeSelected = ""; idTraineeSelected = 0; diff --git a/InstructorsAndTrainees/trainees/viewertrainees.cpp b/InstructorsAndTrainees/trainees/viewertrainees.cpp index 042d6bf..52f7f1a 100644 --- a/InstructorsAndTrainees/trainees/viewertrainees.cpp +++ b/InstructorsAndTrainees/trainees/viewertrainees.cpp @@ -41,6 +41,14 @@ void ViewerTrainees::setAuthComplited(bool authComplited) updateButtons(); } +void ViewerTrainees::deactivate() +{ + CommonView::deactivate(); + ammTasksWidget->deactivate(); + fimTasksWidget->deactivate(); + updateButtons(); +} + /* void ViewerTrainees::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column) { diff --git a/InstructorsAndTrainees/trainees/viewertrainees.h b/InstructorsAndTrainees/trainees/viewertrainees.h index 638843d..40cd3e7 100644 --- a/InstructorsAndTrainees/trainees/viewertrainees.h +++ b/InstructorsAndTrainees/trainees/viewertrainees.h @@ -22,12 +22,7 @@ public: public: void setAuthComplited(bool authComplited); - void clearTree() - { - CommonView::clearTree(); - ammTasksWidget->clearTree(); - fimTasksWidget->clearTree(); - } + void deactivate(); protected: void changeEvent(QEvent * event) override; From d4e7fc871a59dd811dc1095eebbbbd781f056850 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Fri, 31 Jan 2025 12:35:43 +0300 Subject: [PATCH 62/77] =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B2=D0=B5=D1=80=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=89=D0=B0=D1=8F=20=D0=B4=D0=B5=D0=B0=D0=B2=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/interfacedatabaselms.cpp | 1 + ServerLMS/providerdblms.cpp | 21 +++++++++++++++++++++ ServerLMS/providerdblms.h | 3 +++ ServerLMS/serverlmswidget.cpp | 1 + 4 files changed, 26 insertions(+) diff --git a/DataBaseLMS/interfacedatabaselms.cpp b/DataBaseLMS/interfacedatabaselms.cpp index 68e9596..f928ed8 100644 --- a/DataBaseLMS/interfacedatabaselms.cpp +++ b/DataBaseLMS/interfacedatabaselms.cpp @@ -42,6 +42,7 @@ bool InterfaceDataBaseLMS::DBisConnected() return isConnected(); } + //Инструкторы bool InterfaceDataBaseLMS::AuthorizationInstructor(QString login, QString password) diff --git a/ServerLMS/providerdblms.cpp b/ServerLMS/providerdblms.cpp index bd006ab..0c0984c 100644 --- a/ServerLMS/providerdblms.cpp +++ b/ServerLMS/providerdblms.cpp @@ -201,6 +201,27 @@ QString ProviderDBLMS::getNameInstructorByLogin(QString login) return res; } +bool ProviderDBLMS::deAuthorizationAll() +{ + mtxAccess.lock(); + + if(! dbLMS->DBisConnected()) + { + mtxAccess.unlock(); + return false; + } + + Q_EMIT signal_BlockAutorization(true); + + bool res1 = dbLMS->deAuthorizationAllTrainees(); + bool res2 = dbLMS->deAuthorizationAllInstructors(); + + Q_EMIT signal_BlockAutorization(false); + + mtxAccess.unlock(); + return res1 && res2; +} + QList ProviderDBLMS::GetListAllInstructors() { QList listInstructors; diff --git a/ServerLMS/providerdblms.h b/ServerLMS/providerdblms.h index 96705f9..e2bf040 100644 --- a/ServerLMS/providerdblms.h +++ b/ServerLMS/providerdblms.h @@ -25,6 +25,9 @@ public: bool deAuthorizationInstructor(QString login); QString getNameInstructorByLogin(QString login); + //Общая деавторизация + bool deAuthorizationAll(); + // QList GetListAllInstructors(); QList GetListAllTrainees(); diff --git a/ServerLMS/serverlmswidget.cpp b/ServerLMS/serverlmswidget.cpp index 4e57eee..435e5fe 100644 --- a/ServerLMS/serverlmswidget.cpp +++ b/ServerLMS/serverlmswidget.cpp @@ -39,6 +39,7 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) : providerDBLMS = new ProviderDBLMS(this); providerDBLMS->ConnectionToDB(); + providerDBLMS->deAuthorizationAll(); logger = new Logger(ui->listWidgetLogger); From 1d92e4ffeecf206f2235bd80f4f478b914da385d Mon Sep 17 00:00:00 2001 From: krivoshein Date: Fri, 31 Jan 2025 13:27:47 +0300 Subject: [PATCH 63/77] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B4=D0=B5=D1=80?= =?UTF-8?q?=D0=B6=D0=BA=D0=B0=20=D1=80=D1=83=D1=81=D0=B8=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B4=D0=BB=D1=8F=20FIM=20AMM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/tasks/ammtaskswidget.cpp | 13 +++++++++++++ InstructorsAndTrainees/tasks/ammtaskswidget.h | 2 ++ InstructorsAndTrainees/tasks/fimtaskswidget.cpp | 13 +++++++++++++ InstructorsAndTrainees/tasks/fimtaskswidget.h | 2 ++ 4 files changed, 30 insertions(+) diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index 9dde469..c2a0f2e 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -91,6 +91,19 @@ void AMMtasksWidget::resizeEvent(QResizeEvent *event) treeWidget->setColumnWidth(ColumnsTree::clmn_PMorDM, widthPMorDM); } +void AMMtasksWidget::changeEvent(QEvent *event) +{ + // В случае получения события изменения языка приложения + if (event->type() == QEvent::LanguageChange) + {// переведём окно заново + ui->retranslateUi(this); + + reSetHeadTreeWidget(); + + //slot_NeedUpdateUI(); + } +} + void AMMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) { if(current == nullptr) diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index 43252a7..c4f60d8 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -41,6 +41,8 @@ public: public: void resizeEvent(QResizeEvent *event) override; +protected: + void changeEvent(QEvent * event) override; private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index ce67808..47dffee 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -78,6 +78,19 @@ void FIMtasksWidget::resizeEvent(QResizeEvent *event) treeWidget->setColumnWidth(ColumnsTree::clmn_Title, widthTitle); } +void FIMtasksWidget::changeEvent(QEvent *event) +{ + // В случае получения события изменения языка приложения + if (event->type() == QEvent::LanguageChange) + {// переведём окно заново + ui->retranslateUi(this); + + reSetHeadTreeWidget(); + + //slot_NeedUpdateUI(); + } +} + void FIMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) { if(current == nullptr) diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index 65a4ce8..aae604d 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -44,6 +44,8 @@ public: public: void resizeEvent(QResizeEvent *event) override; +protected: + void changeEvent(QEvent * event) override; private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); From fe298d3e61ef2d0b9f34b3c31593aa5356965779 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Fri, 31 Jan 2025 14:33:21 +0300 Subject: [PATCH 64/77] =?UTF-8?q?=D0=AF=D0=B7=D1=8B=D0=BA=20=D1=81=D0=B5?= =?UTF-8?q?=D1=80=D0=B2=D0=B5=D1=80=D0=B0=20=D0=BF=D0=BE=20=D1=83=D0=BC?= =?UTF-8?q?=D0=BE=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8E=20English?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ServerLMS/serverlmswidget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ServerLMS/serverlmswidget.cpp b/ServerLMS/serverlmswidget.cpp index 435e5fe..8dfe6b4 100644 --- a/ServerLMS/serverlmswidget.cpp +++ b/ServerLMS/serverlmswidget.cpp @@ -31,8 +31,8 @@ ServerLMSWidget::ServerLMSWidget(QWidget *parent) : ui->btnStartServer->setEnabled(true); // Сделаем первоначальную инициализацию перевода для окна виджета - qtLanguageTranslator.load(QString("translations/ServerLMS_") + QString("ru_RU"), "."); - qApp->installTranslator(&qtLanguageTranslator); + //qtLanguageTranslator.load(QString("translations/ServerLMS_") + QString("en_EN"), "."); + //qApp->installTranslator(&qtLanguageTranslator); updateThread = new QThread; loggerThread = new QThread; From 02865821a0b66f7b987d8674749cc744ff038da5 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Fri, 31 Jan 2025 16:24:54 +0300 Subject: [PATCH 65/77] =?UTF-8?q?=D0=92=D1=8B=D0=B1=D0=BE=D1=80=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B2=D0=BE=D0=B3=D0=BE=20item=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20FIM=20AMM=20=D0=BF=D0=BE=20=D1=83=D0=BC=D0=BE=D0=BB?= =?UTF-8?q?=D1=87=D0=B0=D0=BD=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/tasks/ammtaskswidget.cpp | 4 ++++ InstructorsAndTrainees/tasks/fimtaskswidget.cpp | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index c2a0f2e..35ee461 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -194,6 +194,10 @@ void AMMtasksWidget::slot_listItemsReady(QList listItems) for(QTreeWidgetItem * item : listItems) treeWidget->addTopLevelItem(item); + QTreeWidgetItem * item = treeWidget->topLevelItem(0); + if(item != nullptr) + treeWidget->setCurrentItem(item); + waitAnimationWidget->hideWithStop(); } diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index 47dffee..62a25fa 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -251,6 +251,10 @@ void FIMtasksWidget::fillTree() } } } + + QTreeWidgetItem * item = treeWidget->topLevelItem(0); + if(item != nullptr) + treeWidget->setCurrentItem(item); } void FIMtasksWidget::prepareListTasksForTrainee(QList listTask) From c09ccbce26fe9f01a3b54ca48e557a5ded2eef9c Mon Sep 17 00:00:00 2001 From: semenov Date: Mon, 3 Feb 2025 10:32:44 +0300 Subject: [PATCH 66/77] quickFix: display send file --- ServerLMS/Systems/sendsystem.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ServerLMS/Systems/sendsystem.cpp b/ServerLMS/Systems/sendsystem.cpp index 65caacd..7d2140b 100644 --- a/ServerLMS/Systems/sendsystem.cpp +++ b/ServerLMS/Systems/sendsystem.cpp @@ -79,13 +79,13 @@ void SendSystem::sendFileBlock(QString path) countSend++; } - emit sigSendToLogger(Tools::getTime() + " send file " + fileInfo.fileName()); + //emit sigSendToLogger(Tools::getTime() + " send file " + fileInfo.fileName()); } file.close(); countSend = 0; socket->waitForBytesWritten(10); - socket->waitForReadyRead(100); + socket->waitForReadyRead(20); } void SendSystem::sendVersion() From 0574be1369b191a98e6e93a1a13ed53c03e62b93 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 18 Mar 2025 16:29:53 +0300 Subject: [PATCH 67/77] =?UTF-8?q?=D0=9E=D1=82=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=20=D0=BA=D0=BB=D0=B8=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D1=83=20=D0=AE=D0=BD=D0=B8=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/databaselms.cpp | 6 ++++++ DataBaseLMS/interfacedatabaselms.cpp | 5 +++++ DataBaseLMS/interfacedatabaselms.h | 1 + ServerLMS/Systems/processingsystem.cpp | 17 +++++++++++++++++ ServerLMS/providerdblms.cpp | 18 ++++++++++++++++++ ServerLMS/providerdblms.h | 2 ++ 6 files changed, 49 insertions(+) diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index ff6b50a..e0e5d34 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -457,6 +457,8 @@ int DataBaseLMS::updateGroup(Group group) int DataBaseLMS::insertTaskAMM(TaskAmmFim task, int id_trainee) { + task.ammProcedure.title = task.ammProcedure.title.replace("'", "''"); //Задваиваем одинарные кавычки + QString queryStr = QString("INSERT INTO public.tasks_amm (title, dm_code, trainee_task) " "VALUES ('%1', '%2', %3) " "RETURNING tasks_amm.task_id").arg( @@ -526,6 +528,8 @@ int DataBaseLMS::insertTaskFIM(TaskAmmFim task, int id_trainee) resBool = db->transaction(); + task.title = task.title.replace("'", "''"); //Задваиваем одинарные кавычки + queryStr = QString("INSERT INTO public.tasks_fim (title, trainee_task) " "VALUES ('%1', %2) " "RETURNING tasks_fim.task_id").arg( @@ -541,6 +545,8 @@ int DataBaseLMS::insertTaskFIM(TaskAmmFim task, int id_trainee) for(Malfunction malfanction : task.malfunctionList) { + malfanction.description = malfanction.description.replace("'", "''"); //Задваиваем одинарные кавычки + queryStr = QString("INSERT INTO public.malfunctions (num, dm_code, description, task_fim_malf) " "VALUES ('%1', '%2', '%3', %4) " "RETURNING malfunctions.malfunction_id").arg( diff --git a/DataBaseLMS/interfacedatabaselms.cpp b/DataBaseLMS/interfacedatabaselms.cpp index f928ed8..03c1b4f 100644 --- a/DataBaseLMS/interfacedatabaselms.cpp +++ b/DataBaseLMS/interfacedatabaselms.cpp @@ -233,6 +233,11 @@ QString InterfaceDataBaseLMS::getNameTraineeByLogin(QString login) return selectTraineeNameByLogin(login); } +int InterfaceDataBaseLMS::getIdTraineeByLogin(QString login) +{ + return selectTraineeID(login); +} + QList InterfaceDataBaseLMS::getListTraineesInGroup(int id) { return selectAllTraineesInGroup(id); diff --git a/DataBaseLMS/interfacedatabaselms.h b/DataBaseLMS/interfacedatabaselms.h index 9dad569..3ba2233 100644 --- a/DataBaseLMS/interfacedatabaselms.h +++ b/DataBaseLMS/interfacedatabaselms.h @@ -57,6 +57,7 @@ public: Trainee getTraineeOnComputer(QString computer_name); QString getNameTraineeByLogin(QString login); + int getIdTraineeByLogin(QString login); QList getListTraineesInGroup(int id); QList getListGroups(); diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 88283fc..0858461 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -86,6 +86,23 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien client->sendXmlAnswer(arrayAnswer); client->sendVersion(); + //Отправка списка задач клиенту Юнити + if(client->getClient()->getIsUnity()) + { + QString login = client->getClient()->getLogin(); + int id_trainee = providerDBLMS->getIdTraineeByLogin(login); + + //AMM + QList listTasksAMM = providerDBLMS->GetListTasksAMMofTrainee(id_trainee); + QByteArray arrayAnswerTasksAMM = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasksAMM, id_trainee); + client->sendXmlAnswer(arrayAnswerTasksAMM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE); + + //FIM + QList listTasksFIM = providerDBLMS->GetListTasksFIMofTrainee(id_trainee); + QByteArray arrayAnswerFIM = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasksFIM, id_trainee); + client->sendXmlAnswer(arrayAnswerFIM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE); + } + QString str = QString(arrayAnswer); //logger->addTextToLogger("To Client: " + str); diff --git a/ServerLMS/providerdblms.cpp b/ServerLMS/providerdblms.cpp index 0c0984c..cc42116 100644 --- a/ServerLMS/providerdblms.cpp +++ b/ServerLMS/providerdblms.cpp @@ -222,6 +222,24 @@ bool ProviderDBLMS::deAuthorizationAll() return res1 && res2; } +int ProviderDBLMS::getIdTraineeByLogin(QString login) +{ + int id_trainee = 0; + qDebug() << "ProviderDBLMS " << QThread::currentThreadId(); + mtxAccess.lock(); + + if(! dbLMS->DBisConnected()) + { + mtxAccess.unlock(); + return id_trainee; + } + + id_trainee = dbLMS->getIdTraineeByLogin(login); + + mtxAccess.unlock(); + return id_trainee; +} + QList ProviderDBLMS::GetListAllInstructors() { QList listInstructors; diff --git a/ServerLMS/providerdblms.h b/ServerLMS/providerdblms.h index e2bf040..3962a8b 100644 --- a/ServerLMS/providerdblms.h +++ b/ServerLMS/providerdblms.h @@ -29,6 +29,8 @@ public: bool deAuthorizationAll(); // + int getIdTraineeByLogin(QString login); + QList GetListAllInstructors(); QList GetListAllTrainees(); QList GetListAllGroups(); From 8f92c9487a7d266d69d8f41669e12ea1c356eb32 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Tue, 18 Mar 2025 17:47:14 +0300 Subject: [PATCH 68/77] =?UTF-8?q?=D0=9E=D1=82=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=20=D0=BF=D1=80=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ServerLMS/Systems/processingsystem.cpp | 43 +++++++++++++++++++++++++- ServerLMS/providerdblms.cpp | 18 +++++++++++ ServerLMS/providerdblms.h | 1 + 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 0858461..09d7415 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -86,7 +86,7 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien client->sendXmlAnswer(arrayAnswer); client->sendVersion(); - //Отправка списка задач клиенту Юнити + //Отправка списков задач клиенту Юнити if(client->getClient()->getIsUnity()) { QString login = client->getClient()->getLogin(); @@ -257,6 +257,27 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu { int id_new; id_new = providerDBLMS->newTaskAMM(*(TaskAmmFim*)data, id); + + if(id_new) + {//Отправка списка задач AMM клиенту Юнити + QString login = providerDBLMS->getLoginTraineeById(id); + //Проходим все открытые сокеты, ищем нужный + foreach(int idSocket, server->getClientsMap().keys()) + { + ClientHandler *handler = server->getClientsMap().value(idSocket); + if(handler->getClient()->getLogin() == login) + { + if(handler->getClient()->getIsUnity()) + {//Отправляем ему + //AMM + QList listTasksAMM = providerDBLMS->GetListTasksAMMofTrainee(id); + QByteArray arrayAnswerTasksAMM = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasksAMM, id); + handler->sendXmlAnswer(arrayAnswerTasksAMM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE); + } + } + } + } + /* if(id_new) { @@ -282,6 +303,26 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu int id_new; id_new = providerDBLMS->newTaskFIM(*(TaskAmmFim*)data, id); + if(id_new) + {//Отправка списка задач FIM клиенту Юнити + QString login = providerDBLMS->getLoginTraineeById(id); + //Проходим все открытые сокеты, ищем нужный + foreach(int idSocket, server->getClientsMap().keys()) + { + ClientHandler *handler = server->getClientsMap().value(idSocket); + if(handler->getClient()->getLogin() == login) + { + if(handler->getClient()->getIsUnity()) + {//Отправляем ему + //FIM + QList listTasksFIM = providerDBLMS->GetListTasksFIMofTrainee(id); + QByteArray arrayAnswerFIM = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasksFIM, id); + handler->sendXmlAnswer(arrayAnswerFIM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE); + } + } + } + } + /* if(id_new) { diff --git a/ServerLMS/providerdblms.cpp b/ServerLMS/providerdblms.cpp index cc42116..3372bd6 100644 --- a/ServerLMS/providerdblms.cpp +++ b/ServerLMS/providerdblms.cpp @@ -240,6 +240,24 @@ int ProviderDBLMS::getIdTraineeByLogin(QString login) return id_trainee; } +QString ProviderDBLMS::getLoginTraineeById(int id_trainee) +{ + QString login = ""; + qDebug() << "ProviderDBLMS " << QThread::currentThreadId(); + mtxAccess.lock(); + + if(! dbLMS->DBisConnected()) + { + mtxAccess.unlock(); + return login; + } + + login = dbLMS->getTrainee(id_trainee).getLogin(); + + mtxAccess.unlock(); + return login; +} + QList ProviderDBLMS::GetListAllInstructors() { QList listInstructors; diff --git a/ServerLMS/providerdblms.h b/ServerLMS/providerdblms.h index 3962a8b..38f0b37 100644 --- a/ServerLMS/providerdblms.h +++ b/ServerLMS/providerdblms.h @@ -30,6 +30,7 @@ public: // int getIdTraineeByLogin(QString login); + QString getLoginTraineeById(int id_trainee); QList GetListAllInstructors(); QList GetListAllTrainees(); From 06feb01b0dc5911bc788909f64c8a1638747d166 Mon Sep 17 00:00:00 2001 From: krivoshein Date: Wed, 19 Mar 2025 11:47:23 +0300 Subject: [PATCH 69/77] =?UTF-8?q?=D0=9A=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BD=D0=BE=D0=B5=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BE=D0=B1=D1=83=D1=87=D0=B0=D0=B5=D0=BC=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D1=81=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B0?= =?UTF-8?q?=D0=BC=D0=B8=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 11 ++++------- DataBaseLMS/DataBaseLMS.pgerd | 1 + DataBaseLMS/databaselms.cpp | 37 +++++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 DataBaseLMS/DataBaseLMS.pgerd diff --git a/.gitignore b/.gitignore index e5d8405..2c69128 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ # -/TestServerLMS/Debug64/Application/ /BUILDS/ CMakeLists.txt.user @@ -16,10 +15,8 @@ _deps CMakeUserPresets.json TestServerLMS/TestServerLMS/CMakeLists.txt.user ServerLMS/ServerLMS/CMakeLists.txt.user -DB_IaT/InstructorsAndTrainees/CMakeLists.txt.user -GUIdataBaseLMS/GUIdataBaseLMS/CMakeLists.txt.user -DB_LMS/DataBaseLMS/CMakeLists.txt.user -DB_LMS/DataBaseLMS/CMakeLists.txt.user -GUIdataBaseLMS/GUIdataBaseLMS/CMakeLists.txt.user +InstructorsAndTrainees/CMakeLists.txt.user +GUIdataBaseLMS/CMakeLists.txt.user +DataBaseLMS/CMakeLists.txt.user DOCS/.obsidian -GUIdataBaseLMS/GUIdataBaseLMS/StaticData +GUIdataBaseLMS/StaticData diff --git a/DataBaseLMS/DataBaseLMS.pgerd b/DataBaseLMS/DataBaseLMS.pgerd new file mode 100644 index 0000000..efc4590 --- /dev/null +++ b/DataBaseLMS/DataBaseLMS.pgerd @@ -0,0 +1 @@ +{"version":"80700","data":{"id":"1833ae95-5ccc-4798-aa33-bb759b37c92c","offsetX":0,"offsetY":0,"zoom":100,"gridSize":15,"layers":[{"id":"b496c6d6-bd77-4288-8ff9-733c3c7dd4d8","type":"diagram-links","isSvg":true,"transformed":true,"models":{"f9bb0269-3ae7-4326-9fce-56cd5119e8c6":{"id":"f9bb0269-3ae7-4326-9fce-56cd5119e8c6","locked":true,"type":"onetomany","source":"53909bdf-4aa2-481a-8c53-9ee6ca5dafa0","sourcePort":"80ff8eae-75d8-4a4f-9226-a7e28088fc84","target":"34b9cf90-0590-4349-9b0d-3313faf3d15b","targetPort":"fd73da6a-b8eb-4d74-ae17-5e2eb7fc6c49","points":[{"id":"e15aa1ca-4bc2-4b00-9f42-9b55939830b3","type":"point","x":209,"y":183.71875},{"id":"f0e35797-d7bb-4e14-8f1c-bfbf05c2ef1e","type":"point","x":209,"y":333.390625},{"id":"c7fda61c-b3fb-43b6-abf0-e3b2cb5d633b","type":"point","x":209,"y":533.578125}],"labels":[],"width":1,"color":"gray","curvyness":50,"selectedColor":"rgb(0,192,255)","data":{"local_table_uid":"34b9cf90-0590-4349-9b0d-3313faf3d15b","local_column_attnum":3,"referenced_table_uid":"53909bdf-4aa2-481a-8c53-9ee6ca5dafa0","referenced_column_attnum":1}},"940f0aaa-b74b-4c49-bde3-6dbefac0155a":{"id":"940f0aaa-b74b-4c49-bde3-6dbefac0155a","locked":true,"type":"onetomany","selected":false,"source":"71db2a40-71cf-45bf-980c-7678e3a5bc95","sourcePort":"93c89b03-b14a-43fa-a170-94353adcbdb0","target":"a0df494c-7a50-4e1c-a56a-78fa8e8b23bc","targetPort":"de1d7319-481f-42e7-b3fb-65da382dcbbf","points":[{"id":"8cf0cb28-b7a1-4972-9be5-ad1d73c6a183","type":"point","x":609,"y":764.109375},{"id":"44d8f146-eaf6-4e66-80ba-3f0829362754","type":"point","x":851,"y":764.109375},{"id":"bedde3da-6cd6-4180-97b3-31aa97d42b62","type":"point","x":851,"y":596.703125},{"id":"05c6a1a6-998b-43c3-9205-e40b88bf7f76","type":"point","x":1006,"y":596.703125}],"labels":[],"width":1,"color":"gray","curvyness":50,"selectedColor":"rgb(0,192,255)","data":{"local_table_uid":"a0df494c-7a50-4e1c-a56a-78fa8e8b23bc","local_column_attnum":3,"referenced_table_uid":"71db2a40-71cf-45bf-980c-7678e3a5bc95","referenced_column_attnum":1}},"da9cd2a3-a482-4c7d-b56f-e03a77fa1cbf":{"id":"da9cd2a3-a482-4c7d-b56f-e03a77fa1cbf","locked":true,"type":"onetomany","selected":false,"source":"71db2a40-71cf-45bf-980c-7678e3a5bc95","sourcePort":"93c89b03-b14a-43fa-a170-94353adcbdb0","target":"c9c11923-8020-4a9d-b8e4-3ced8a388796","targetPort":"1cd53830-5e8b-446b-9329-e87e9e738e0c","points":[{"id":"7852a048-8d12-433b-b614-4ad99f0e1e05","type":"point","x":609,"y":764.109375},{"id":"2fd1ac6c-0857-4665-b7fd-b390c95b0ca6","type":"point","x":745,"y":764.109375},{"id":"f52aa648-0d25-4929-96b8-0f4a1aaaf493","type":"point","x":745,"y":956.703125},{"id":"43e5b5ae-9971-4263-9377-f3b5fe06c0c9","type":"point","x":1006,"y":956.703125}],"labels":[],"width":1,"color":"gray","curvyness":50,"selectedColor":"rgb(0,192,255)","data":{"local_table_uid":"c9c11923-8020-4a9d-b8e4-3ced8a388796","local_column_attnum":3,"referenced_table_uid":"71db2a40-71cf-45bf-980c-7678e3a5bc95","referenced_column_attnum":1}},"b4c9f742-0892-4e73-98fe-a2e594f7ceab":{"id":"b4c9f742-0892-4e73-98fe-a2e594f7ceab","locked":true,"type":"onetomany","source":"34b9cf90-0590-4349-9b0d-3313faf3d15b","sourcePort":"839b371f-6343-48ec-bdd4-a31d3fddc38c","target":"71db2a40-71cf-45bf-980c-7678e3a5bc95","targetPort":"5fdbde0a-fe69-4ee8-af93-bb05340acc1a","points":[{"id":"f0aaa09f-d58d-439c-99d9-9a52adecd293","type":"point","x":209,"y":462.5},{"id":"a3ac0df5-da69-4356-b33b-3231000b2126","type":"point","x":376,"y":627.625},{"id":"596f7023-eccb-4524-8eba-e62f0fee380a","type":"point","x":376,"y":974.90625}],"labels":[],"width":1,"color":"gray","curvyness":50,"selectedColor":"rgb(0,192,255)","data":{"local_table_uid":"71db2a40-71cf-45bf-980c-7678e3a5bc95","local_column_attnum":11,"referenced_table_uid":"34b9cf90-0590-4349-9b0d-3313faf3d15b","referenced_column_attnum":1}},"66d26303-38db-407f-a2e9-301c3da0c8a5":{"id":"66d26303-38db-407f-a2e9-301c3da0c8a5","locked":true,"type":"onetomany","selected":false,"source":"5757cd17-d261-4285-afaa-9c87eb259e1a","sourcePort":"ba2d98b3-f801-4cdf-a3e0-237d39956fa9","target":"71db2a40-71cf-45bf-980c-7678e3a5bc95","targetPort":"dfe822b2-d69c-4a88-85f5-d1dc32ce85b3","points":[{"id":"b2c9828e-dfbd-4a69-bc9c-8c1e1b8921bd","type":"point","x":249,"y":1109.109375},{"id":"0ba0b97b-47c8-4c84-bc8f-1d8995dfeeda","type":"point","x":299,"y":1109.109375},{"id":"fd388e09-fbde-42c0-bfd2-ca4d6fb9d428","type":"point","x":299,"y":922.8125},{"id":"366dee2c-18da-4a4a-8fe2-0589b94fc8ff","type":"point","x":376,"y":922.8125}],"labels":[],"width":1,"color":"gray","curvyness":50,"selectedColor":"rgb(0,192,255)","data":{"local_table_uid":"71db2a40-71cf-45bf-980c-7678e3a5bc95","local_column_attnum":6,"referenced_table_uid":"5757cd17-d261-4285-afaa-9c87eb259e1a","referenced_column_attnum":1}}}},{"id":"8e1a2013-5ca1-4a86-99b6-e84c5a16e420","type":"diagram-nodes","isSvg":false,"transformed":true,"models":{"53909bdf-4aa2-481a-8c53-9ee6ca5dafa0":{"id":"53909bdf-4aa2-481a-8c53-9ee6ca5dafa0","type":"table","x":5,"y":79.609375,"ports":[{"id":"d708d39f-467e-414f-b621-c8076e877eb7","type":"onetomany","x":6,"y":183.71875,"name":"coll-port-1-left","alignment":"left","parentNode":"53909bdf-4aa2-481a-8c53-9ee6ca5dafa0","links":[]},{"id":"80ff8eae-75d8-4a4f-9226-a7e28088fc84","type":"onetomany","x":179,"y":183.71875,"name":"coll-port-1-right","alignment":"right","parentNode":"53909bdf-4aa2-481a-8c53-9ee6ca5dafa0","links":["f9bb0269-3ae7-4326-9fce-56cd5119e8c6"]}],"name":"Untitled","color":"rgb(0,192,255)","portsInOrder":[],"portsOutOrder":["d708d39f-467e-414f-b621-c8076e877eb7","80ff8eae-75d8-4a4f-9226-a7e28088fc84"],"otherInfo":{"data":{"columns":[{"name":"classroom_id","atttypid":23,"attlen":null,"attnum":1,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"a","defval":null,"typname":"integer","displaytypname":"integer","cltype":"integer","inheritedfrom":null,"inheritedid":null,"elemoid":23,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"i","genexpr":null,"relname":"classrooms","is_view_only":false,"attcompression":null,"seqrelid":16478,"seqtypid":23,"seqstart":"1","seqincrement":"1","seqmax":"2147483647","seqmin":"1","seqcache":"1","seqcycle":false,"is_pk":true,"is_primary_key":true,"attprecision":null,"coloptions":[],"edit_types":["bigint","double precision","information_schema.cardinal_number","integer","money","numeric","oid","real","regclass","regcollation","regconfig","regdictionary","regnamespace","regoper","regoperator","regproc","regprocedure","regrole","regtype","smallint"]},{"name":"name","atttypid":1043,"attlen":"30","attnum":2,"attndims":0,"atttypmod":34,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"x","attidentity":"","defval":"''::character varying","typname":"character varying","displaytypname":"character varying(30)","cltype":"character varying","inheritedfrom":null,"inheritedid":null,"elemoid":1043,"typnspname":"pg_catalog","defaultstorage":"x","description":null,"indkey":"1","isdup":false,"collspcname":"pg_catalog.\"default\"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"classrooms","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["\"char\"","character","character varying","character varying","information_schema.character_data","information_schema.yes_or_no","name","regclass","text"]}],"name":"classrooms","schema":"public","description":null,"rlspolicy":false,"forcerlspolicy":false,"fillfactor":null,"toast_tuple_target":null,"parallel_workers":null,"relpersistence":false,"primary_key":[{"oid":16465,"name":"educational_classes_pkey","col_count":1,"indnullsnotdistinct":false,"spcname":"pg_default","comment":null,"condeferrable":false,"condeferred":false,"conislocal":true,"fillfactor":null,"columns":[{"column":"classroom_id"}],"include":[]}],"unique_constraint":[],"foreign_key":[]},"note":"","metadata":{"data_failed":false,"is_promise":false}}},"34b9cf90-0590-4349-9b0d-3313faf3d15b":{"id":"34b9cf90-0590-4349-9b0d-3313faf3d15b","type":"table","x":5,"y":358.390625,"ports":[{"id":"7c5957b6-bdf8-40cc-b588-75d9c44beaf2","type":"onetomany","x":6,"y":533.578125,"name":"coll-port-3-left","alignment":"left","parentNode":"34b9cf90-0590-4349-9b0d-3313faf3d15b","links":[]},{"id":"fd73da6a-b8eb-4d74-ae17-5e2eb7fc6c49","type":"onetomany","x":179,"y":533.578125,"name":"coll-port-3-right","alignment":"right","parentNode":"34b9cf90-0590-4349-9b0d-3313faf3d15b","links":["f9bb0269-3ae7-4326-9fce-56cd5119e8c6"]},{"id":"223ec961-e683-4199-914d-2b3bdf1acc3b","type":"onetomany","x":6,"y":462.5,"name":"coll-port-1-left","alignment":"left","parentNode":"34b9cf90-0590-4349-9b0d-3313faf3d15b","links":[]},{"id":"839b371f-6343-48ec-bdd4-a31d3fddc38c","type":"onetomany","x":179,"y":462.5,"name":"coll-port-1-right","alignment":"right","parentNode":"34b9cf90-0590-4349-9b0d-3313faf3d15b","links":["b4c9f742-0892-4e73-98fe-a2e594f7ceab"]}],"name":"Untitled","color":"rgb(0,192,255)","portsInOrder":[],"portsOutOrder":["7c5957b6-bdf8-40cc-b588-75d9c44beaf2","fd73da6a-b8eb-4d74-ae17-5e2eb7fc6c49","223ec961-e683-4199-914d-2b3bdf1acc3b","839b371f-6343-48ec-bdd4-a31d3fddc38c"],"otherInfo":{"data":{"columns":[{"name":"computer_id","atttypid":23,"attlen":null,"attnum":1,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"a","defval":null,"typname":"integer","displaytypname":"integer","cltype":"integer","inheritedfrom":null,"inheritedid":null,"elemoid":23,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"i","genexpr":null,"relname":"computers","is_view_only":false,"attcompression":null,"seqrelid":16477,"seqtypid":23,"seqstart":"1","seqincrement":"1","seqmax":"2147483647","seqmin":"1","seqcache":"1","seqcycle":false,"is_pk":true,"is_primary_key":true,"attprecision":null,"coloptions":[],"edit_types":["bigint","double precision","information_schema.cardinal_number","integer","money","numeric","oid","real","regclass","regcollation","regconfig","regdictionary","regnamespace","regoper","regoperator","regproc","regprocedure","regrole","regtype","smallint"]},{"name":"name","atttypid":1043,"attlen":"30","attnum":2,"attndims":0,"atttypmod":34,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"x","attidentity":"","defval":"''::character varying","typname":"character varying","displaytypname":"character varying(30)","cltype":"character varying","inheritedfrom":null,"inheritedid":null,"elemoid":1043,"typnspname":"pg_catalog","defaultstorage":"x","description":null,"indkey":"1","isdup":false,"collspcname":"pg_catalog.\"default\"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"computers","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["\"char\"","character","character varying","character varying","information_schema.character_data","information_schema.yes_or_no","name","regclass","text"]},{"name":"classroom_computer","atttypid":23,"attlen":null,"attnum":3,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"","defval":null,"typname":"integer","displaytypname":"integer","cltype":"integer","inheritedfrom":null,"inheritedid":null,"elemoid":23,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":true,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"computers","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["bigint","double precision","information_schema.cardinal_number","integer","integer","money","numeric","oid","real","regclass","regcollation","regconfig","regdictionary","regnamespace","regoper","regoperator","regproc","regprocedure","regrole","regtype","smallint"]},{"name":"ip_address","atttypid":1043,"attlen":"30","attnum":4,"attndims":0,"atttypmod":34,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"x","attidentity":"","defval":"''::character varying","typname":"character varying","displaytypname":"character varying(30)","cltype":"character varying","inheritedfrom":null,"inheritedid":null,"elemoid":1043,"typnspname":"pg_catalog","defaultstorage":"x","description":null,"indkey":"1","isdup":false,"collspcname":"pg_catalog.\"default\"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"computers","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["\"char\"","character","character varying","character varying","character varying","information_schema.character_data","information_schema.yes_or_no","name","regclass","text"]}],"name":"computers","schema":"public","description":null,"rlspolicy":false,"forcerlspolicy":false,"fillfactor":null,"toast_tuple_target":null,"parallel_workers":null,"relpersistence":false,"primary_key":[{"oid":16470,"name":"computers_pkey","col_count":1,"indnullsnotdistinct":false,"spcname":"pg_default","comment":null,"condeferrable":false,"condeferred":false,"conislocal":true,"fillfactor":null,"columns":[{"column":"computer_id"}],"include":[]}],"foreign_key":[{"name":"computers_class_fkey","condeferrable":false,"condeferred":false,"confupdtype":"a","confdeltype":"a","confmatchtype":false,"conkey":[3],"confkey":[1],"confrelid":16462,"fknsp":"public","fktab":"computers","refnspoid":2200,"refnsp":"public","reftab":"classrooms","comment":null,"convalidated":true,"conislocal":true,"columns":[{"local_column":"classroom_computer","references":"53909bdf-4aa2-481a-8c53-9ee6ca5dafa0","referenced":"classroom_id","references_table_name":"public.classrooms"}],"remote_schema":"public","remote_table":"classrooms","coveringindex":null,"autoindex":false,"hasindex":false}],"unique_constraint":[]},"note":"","metadata":{"data_failed":false,"is_promise":false}}},"5757cd17-d261-4285-afaa-9c87eb259e1a":{"id":"5757cd17-d261-4285-afaa-9c87eb259e1a","type":"table","selected":false,"x":45,"y":1005,"ports":[{"id":"115fc3a6-8c48-48d9-9660-4454f550fd67","type":"onetomany","x":46,"y":1109.109375,"name":"coll-port-1-left","alignment":"left","parentNode":"5757cd17-d261-4285-afaa-9c87eb259e1a","links":[]},{"id":"ba2d98b3-f801-4cdf-a3e0-237d39956fa9","type":"onetomany","x":219,"y":1109.109375,"name":"coll-port-1-right","alignment":"right","parentNode":"5757cd17-d261-4285-afaa-9c87eb259e1a","links":["66d26303-38db-407f-a2e9-301c3da0c8a5"]}],"name":"Untitled","color":"rgb(0,192,255)","portsInOrder":[],"portsOutOrder":["115fc3a6-8c48-48d9-9660-4454f550fd67","ba2d98b3-f801-4cdf-a3e0-237d39956fa9"],"otherInfo":{"data":{"columns":[{"name":"group_id","atttypid":23,"attlen":null,"attnum":1,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"a","defval":null,"typname":"integer","displaytypname":"integer","cltype":"integer","inheritedfrom":null,"inheritedid":null,"elemoid":23,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"i","genexpr":null,"relname":"groups","is_view_only":false,"attcompression":null,"seqrelid":16447,"seqtypid":23,"seqstart":"1","seqincrement":"1","seqmax":"2147483647","seqmin":"1","seqcache":"1","seqcycle":false,"is_pk":true,"is_primary_key":true,"attprecision":null,"coloptions":[],"edit_types":["bigint","double precision","information_schema.cardinal_number","integer","money","numeric","oid","real","regclass","regcollation","regconfig","regdictionary","regnamespace","regoper","regoperator","regproc","regprocedure","regrole","regtype","smallint"]},{"name":"name","atttypid":1043,"attlen":"30","attnum":2,"attndims":0,"atttypmod":34,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"x","attidentity":"","defval":"''::character varying","typname":"character varying","displaytypname":"character varying(30)","cltype":"character varying","inheritedfrom":null,"inheritedid":null,"elemoid":1043,"typnspname":"pg_catalog","defaultstorage":"x","description":null,"indkey":"1","isdup":false,"collspcname":"pg_catalog.\"default\"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"groups","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["\"char\"","character","character varying","character varying","information_schema.character_data","information_schema.yes_or_no","name","regclass","text"]}],"name":"groups","schema":"public","description":null,"rlspolicy":false,"forcerlspolicy":false,"fillfactor":null,"toast_tuple_target":null,"parallel_workers":null,"relpersistence":false,"primary_key":[{"oid":16451,"name":"groups_pkey","col_count":1,"indnullsnotdistinct":false,"spcname":"pg_default","comment":null,"condeferrable":false,"condeferred":false,"conislocal":true,"fillfactor":null,"columns":[{"column":"group_id"}],"include":[]}],"unique_constraint":[],"foreign_key":[]},"note":"","metadata":{"data_failed":false,"is_promise":false}}},"7cc17f62-3301-4b64-b41e-4b991a256c6a":{"id":"7cc17f62-3301-4b64-b41e-4b991a256c6a","type":"table","selected":false,"x":375,"y":45,"ports":[],"name":"Untitled","color":"rgb(0,192,255)","portsInOrder":[],"portsOutOrder":[],"otherInfo":{"data":{"columns":[{"name":"instructor_id","atttypid":23,"attlen":null,"attnum":1,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"a","defval":null,"typname":"integer","displaytypname":"integer","cltype":"integer","inheritedfrom":null,"inheritedid":null,"elemoid":23,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"i","genexpr":null,"relname":"instructors","is_view_only":false,"attcompression":null,"seqrelid":16435,"seqtypid":23,"seqstart":"1","seqincrement":"1","seqmax":"2147483647","seqmin":"1","seqcache":"1","seqcycle":false,"is_pk":true,"is_primary_key":true,"attprecision":null,"coloptions":[],"edit_types":["bigint","double precision","information_schema.cardinal_number","integer","money","numeric","oid","real","regclass","regcollation","regconfig","regdictionary","regnamespace","regoper","regoperator","regproc","regprocedure","regrole","regtype","smallint"]},{"name":"name","atttypid":1043,"attlen":"30","attnum":2,"attndims":0,"atttypmod":34,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"x","attidentity":"","defval":"''::character varying","typname":"character varying","displaytypname":"character varying(30)","cltype":"character varying","inheritedfrom":null,"inheritedid":null,"elemoid":1043,"typnspname":"pg_catalog","defaultstorage":"x","description":null,"indkey":"1","isdup":false,"collspcname":"pg_catalog.\"default\"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"instructors","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["\"char\"","character","character varying","character varying","information_schema.character_data","information_schema.yes_or_no","name","regclass","text"]},{"name":"login","atttypid":1043,"attlen":"10","attnum":3,"attndims":0,"atttypmod":14,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"x","attidentity":"","defval":"''::character varying","typname":"character varying","displaytypname":"character varying(10)","cltype":"character varying","inheritedfrom":null,"inheritedid":null,"elemoid":1043,"typnspname":"pg_catalog","defaultstorage":"x","description":null,"indkey":"1","isdup":false,"collspcname":"pg_catalog.\"default\"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"instructors","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["\"char\"","character","character varying","character varying","character varying","information_schema.character_data","information_schema.yes_or_no","name","regclass","text"]},{"name":"password","atttypid":1043,"attlen":"10","attnum":4,"attndims":0,"atttypmod":14,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"x","attidentity":"","defval":"''::character varying","typname":"character varying","displaytypname":"character varying(10)","cltype":"character varying","inheritedfrom":null,"inheritedid":null,"elemoid":1043,"typnspname":"pg_catalog","defaultstorage":"x","description":null,"indkey":"1","isdup":false,"collspcname":"pg_catalog.\"default\"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"instructors","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["\"char\"","character","character varying","character varying","character varying","character varying","information_schema.character_data","information_schema.yes_or_no","name","regclass","text"]},{"name":"is_admin","atttypid":16,"attlen":null,"attnum":5,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"","defval":"false","typname":"boolean","displaytypname":"boolean","cltype":"boolean","inheritedfrom":null,"inheritedid":null,"elemoid":16,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"instructors","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["boolean","character","character varying","text"]},{"name":"archived","atttypid":16,"attlen":null,"attnum":6,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"","defval":"false","typname":"boolean","displaytypname":"boolean","cltype":"boolean","inheritedfrom":null,"inheritedid":null,"elemoid":16,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"instructors","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["boolean","boolean","character","character varying","text"]},{"name":"logged_in","atttypid":16,"attlen":null,"attnum":7,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"","defval":"false","typname":"boolean","displaytypname":"boolean","cltype":"boolean","inheritedfrom":null,"inheritedid":null,"elemoid":16,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"instructors","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["boolean","boolean","boolean","character","character varying","text"]}],"name":"instructors","schema":"public","description":null,"rlspolicy":false,"forcerlspolicy":false,"fillfactor":null,"toast_tuple_target":null,"parallel_workers":null,"relpersistence":false,"primary_key":[{"oid":16439,"name":"instructors_pkey","col_count":1,"indnullsnotdistinct":false,"spcname":"pg_default","comment":null,"condeferrable":false,"condeferred":false,"conislocal":true,"fillfactor":null,"columns":[{"column":"instructor_id"}],"include":[]}],"unique_constraint":[],"foreign_key":[]},"note":"","metadata":{"data_failed":false,"is_promise":false}}},"22eb3d01-2146-4012-a7ce-5cfda8f9145a":{"id":"22eb3d01-2146-4012-a7ce-5cfda8f9145a","type":"table","selected":false,"x":660,"y":45,"ports":[],"name":"Untitled","color":"rgb(0,192,255)","portsInOrder":[],"portsOutOrder":[],"otherInfo":{"data":{"columns":[{"name":"malfunction_id","atttypid":23,"attlen":null,"attnum":1,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"a","defval":null,"typname":"integer","displaytypname":"integer","cltype":"integer","inheritedfrom":null,"inheritedid":null,"elemoid":23,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"i","genexpr":null,"relname":"malfunctions","is_view_only":false,"attcompression":null,"seqrelid":49315,"seqtypid":23,"seqstart":"1","seqincrement":"1","seqmax":"2147483647","seqmin":"1","seqcache":"1","seqcycle":false,"is_pk":true,"is_primary_key":true,"attprecision":null,"coloptions":[],"edit_types":["bigint","double precision","information_schema.cardinal_number","integer","money","numeric","oid","real","regclass","regcollation","regconfig","regdictionary","regnamespace","regoper","regoperator","regproc","regprocedure","regrole","regtype","smallint"]},{"name":"num","atttypid":23,"attlen":null,"attnum":2,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"","defval":"0","typname":"integer","displaytypname":"integer","cltype":"integer","inheritedfrom":null,"inheritedid":null,"elemoid":23,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"malfunctions","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["bigint","double precision","information_schema.cardinal_number","integer","integer","money","numeric","oid","real","regclass","regcollation","regconfig","regdictionary","regnamespace","regoper","regoperator","regproc","regprocedure","regrole","regtype","smallint"]},{"name":"dm_code","atttypid":1043,"attlen":null,"attnum":3,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"x","attidentity":"","defval":"''::character varying","typname":"character varying","displaytypname":"character varying","cltype":"character varying","inheritedfrom":null,"inheritedid":null,"elemoid":1043,"typnspname":"pg_catalog","defaultstorage":"x","description":null,"indkey":"1","isdup":false,"collspcname":"pg_catalog.\"default\"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"malfunctions","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["\"char\"","character","character varying","character varying","information_schema.character_data","information_schema.yes_or_no","name","regclass","text"]},{"name":"description","atttypid":1043,"attlen":null,"attnum":4,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"x","attidentity":"","defval":"''::character varying","typname":"character varying","displaytypname":"character varying","cltype":"character varying","inheritedfrom":null,"inheritedid":null,"elemoid":1043,"typnspname":"pg_catalog","defaultstorage":"x","description":null,"indkey":"1","isdup":false,"collspcname":"pg_catalog.\"default\"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"malfunctions","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["\"char\"","character","character varying","character varying","character varying","information_schema.character_data","information_schema.yes_or_no","name","regclass","text"]},{"name":"task_fim_malf","atttypid":23,"attlen":null,"attnum":5,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"","defval":null,"typname":"integer","displaytypname":"integer","cltype":"integer","inheritedfrom":null,"inheritedid":null,"elemoid":23,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"malfunctions","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["bigint","double precision","information_schema.cardinal_number","integer","integer","integer","money","numeric","oid","real","regclass","regcollation","regconfig","regdictionary","regnamespace","regoper","regoperator","regproc","regprocedure","regrole","regtype","smallint"]}],"name":"malfunctions","schema":"public","description":null,"rlspolicy":false,"forcerlspolicy":false,"fillfactor":null,"toast_tuple_target":null,"parallel_workers":null,"relpersistence":false,"primary_key":[{"oid":49298,"name":"malfunctions_pkey","col_count":1,"indnullsnotdistinct":false,"spcname":"pg_default","comment":null,"condeferrable":false,"condeferred":false,"conislocal":true,"fillfactor":null,"columns":[{"column":"malfunction_id"}],"include":[]}],"unique_constraint":[],"foreign_key":[]},"note":"","metadata":{"data_failed":false,"is_promise":false}}},"a0df494c-7a50-4e1c-a56a-78fa8e8b23bc":{"id":"a0df494c-7a50-4e1c-a56a-78fa8e8b23bc","type":"table","selected":true,"x":1035,"y":450,"ports":[{"id":"de1d7319-481f-42e7-b3fb-65da382dcbbf","type":"onetomany","x":1036,"y":596.703125,"name":"coll-port-3-left","alignment":"left","parentNode":"a0df494c-7a50-4e1c-a56a-78fa8e8b23bc","links":["940f0aaa-b74b-4c49-bde3-6dbefac0155a"]},{"id":"dc95baf0-b380-4ae2-8761-dd7650c52af4","type":"onetomany","x":1209,"y":596.703125,"name":"coll-port-3-right","alignment":"right","parentNode":"a0df494c-7a50-4e1c-a56a-78fa8e8b23bc","links":[]}],"name":"Untitled","color":"rgb(0,192,255)","portsInOrder":[],"portsOutOrder":["de1d7319-481f-42e7-b3fb-65da382dcbbf","dc95baf0-b380-4ae2-8761-dd7650c52af4"],"otherInfo":{"data":{"columns":[{"name":"task_id","atttypid":23,"attlen":null,"attnum":1,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"a","defval":null,"typname":"integer","displaytypname":"integer","cltype":"integer","inheritedfrom":null,"inheritedid":null,"elemoid":23,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"i","genexpr":null,"relname":"tasks_amm","is_view_only":false,"attcompression":null,"seqrelid":16506,"seqtypid":23,"seqstart":"1","seqincrement":"1","seqmax":"2147483647","seqmin":"1","seqcache":"1","seqcycle":false,"is_pk":true,"is_primary_key":true,"attprecision":null,"coloptions":[],"edit_types":["bigint","double precision","information_schema.cardinal_number","integer","money","numeric","oid","real","regclass","regcollation","regconfig","regdictionary","regnamespace","regoper","regoperator","regproc","regprocedure","regrole","regtype","smallint"]},{"name":"dm_code","atttypid":1043,"attlen":null,"attnum":2,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"x","attidentity":"","defval":"''::character varying","typname":"character varying","displaytypname":"character varying","cltype":"character varying","inheritedfrom":null,"inheritedid":null,"elemoid":1043,"typnspname":"pg_catalog","defaultstorage":"x","description":null,"indkey":"1","isdup":false,"collspcname":"pg_catalog.\"default\"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"tasks_amm","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["\"char\"","character","character varying","character varying","information_schema.character_data","information_schema.yes_or_no","name","regclass","text"]},{"name":"trainee_task","atttypid":23,"attlen":null,"attnum":3,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"","defval":null,"typname":"integer","displaytypname":"integer","cltype":"integer","inheritedfrom":null,"inheritedid":null,"elemoid":23,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":true,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"tasks_amm","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["bigint","double precision","information_schema.cardinal_number","integer","integer","money","numeric","oid","real","regclass","regcollation","regconfig","regdictionary","regnamespace","regoper","regoperator","regproc","regprocedure","regrole","regtype","smallint"]},{"name":"title","atttypid":1043,"attlen":null,"attnum":4,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"x","attidentity":"","defval":"''::character varying","typname":"character varying","displaytypname":"character varying","cltype":"character varying","inheritedfrom":null,"inheritedid":null,"elemoid":1043,"typnspname":"pg_catalog","defaultstorage":"x","description":null,"indkey":"1","isdup":false,"collspcname":"pg_catalog.\"default\"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"tasks_amm","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["\"char\"","character","character varying","character varying","character varying","information_schema.character_data","information_schema.yes_or_no","name","regclass","text"]}],"name":"tasks_amm","schema":"public","description":null,"rlspolicy":false,"forcerlspolicy":false,"fillfactor":null,"toast_tuple_target":null,"parallel_workers":null,"relpersistence":false,"primary_key":[{"oid":16489,"name":"tasks_pkey","col_count":1,"indnullsnotdistinct":false,"spcname":"pg_default","comment":null,"condeferrable":false,"condeferred":false,"conislocal":true,"fillfactor":null,"columns":[{"column":"task_id"}],"include":[]}],"foreign_key":[{"name":"trainees_tasks","condeferrable":false,"condeferred":false,"confupdtype":"a","confdeltype":"a","confmatchtype":false,"conkey":[3],"confkey":[1],"confrelid":16442,"fknsp":"public","fktab":"tasks_amm","refnspoid":2200,"refnsp":"public","reftab":"trainees","comment":null,"convalidated":false,"conislocal":true,"columns":[{"local_column":"trainee_task","references":"71db2a40-71cf-45bf-980c-7678e3a5bc95","referenced":"trainee_id","references_table_name":"public.trainees"}],"remote_schema":"public","remote_table":"trainees","coveringindex":null,"autoindex":false,"hasindex":false}],"unique_constraint":[]},"note":"","metadata":{"data_failed":false,"is_promise":false}}},"c9c11923-8020-4a9d-b8e4-3ced8a388796":{"id":"c9c11923-8020-4a9d-b8e4-3ced8a388796","type":"table","selected":false,"x":1035,"y":810,"ports":[{"id":"1cd53830-5e8b-446b-9329-e87e9e738e0c","type":"onetomany","x":1036,"y":956.703125,"name":"coll-port-3-left","alignment":"left","parentNode":"c9c11923-8020-4a9d-b8e4-3ced8a388796","links":["da9cd2a3-a482-4c7d-b56f-e03a77fa1cbf"]},{"id":"e565bb9a-04c7-4d10-8366-baada0244430","type":"onetomany","x":1209,"y":956.703125,"name":"coll-port-3-right","alignment":"right","parentNode":"c9c11923-8020-4a9d-b8e4-3ced8a388796","links":[]}],"name":"Untitled","color":"rgb(0,192,255)","portsInOrder":[],"portsOutOrder":["1cd53830-5e8b-446b-9329-e87e9e738e0c","e565bb9a-04c7-4d10-8366-baada0244430"],"otherInfo":{"data":{"columns":[{"name":"task_id","atttypid":23,"attlen":null,"attnum":1,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"a","defval":null,"typname":"integer","displaytypname":"integer","cltype":"integer","inheritedfrom":null,"inheritedid":null,"elemoid":23,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"i","genexpr":null,"relname":"tasks_fim","is_view_only":false,"attcompression":null,"seqrelid":41108,"seqtypid":23,"seqstart":"1","seqincrement":"1","seqmax":"2147483647","seqmin":"1","seqcache":"1","seqcycle":false,"is_pk":true,"is_primary_key":true,"attprecision":null,"coloptions":[],"edit_types":["bigint","double precision","information_schema.cardinal_number","integer","money","numeric","oid","real","regclass","regcollation","regconfig","regdictionary","regnamespace","regoper","regoperator","regproc","regprocedure","regrole","regtype","smallint"]},{"name":"title","atttypid":1043,"attlen":null,"attnum":2,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"x","attidentity":"","defval":"'<title>'::character varying","typname":"character varying","displaytypname":"character varying","cltype":"character varying","inheritedfrom":null,"inheritedid":null,"elemoid":1043,"typnspname":"pg_catalog","defaultstorage":"x","description":null,"indkey":"1","isdup":false,"collspcname":"pg_catalog.\"default\"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"tasks_fim","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["\"char\"","character","character varying","character varying","information_schema.character_data","information_schema.yes_or_no","name","regclass","text"]},{"name":"trainee_task","atttypid":23,"attlen":null,"attnum":3,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"","defval":null,"typname":"integer","displaytypname":"integer","cltype":"integer","inheritedfrom":null,"inheritedid":null,"elemoid":23,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":true,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"tasks_fim","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["bigint","double precision","information_schema.cardinal_number","integer","integer","money","numeric","oid","real","regclass","regcollation","regconfig","regdictionary","regnamespace","regoper","regoperator","regproc","regprocedure","regrole","regtype","smallint"]}],"name":"tasks_fim","schema":"public","description":null,"rlspolicy":false,"forcerlspolicy":false,"fillfactor":null,"toast_tuple_target":null,"parallel_workers":null,"relpersistence":false,"primary_key":[{"oid":41106,"name":"task_fim_pkey","col_count":1,"indnullsnotdistinct":false,"spcname":"pg_default","comment":null,"condeferrable":false,"condeferred":false,"conislocal":true,"fillfactor":null,"columns":[{"column":"task_id"}],"include":[]}],"foreign_key":[{"name":"trainees_tasks","condeferrable":false,"condeferred":false,"confupdtype":"a","confdeltype":"a","confmatchtype":false,"conkey":[3],"confkey":[1],"confrelid":16442,"fknsp":"public","fktab":"tasks_fim","refnspoid":2200,"refnsp":"public","reftab":"trainees","comment":null,"convalidated":false,"conislocal":true,"columns":[{"local_column":"trainee_task","references":"71db2a40-71cf-45bf-980c-7678e3a5bc95","referenced":"trainee_id","references_table_name":"public.trainees"}],"remote_schema":"public","remote_table":"trainees","coveringindex":null,"autoindex":false,"hasindex":false}],"unique_constraint":[]},"note":"","metadata":{"data_failed":false,"is_promise":false}}},"71db2a40-71cf-45bf-980c-7678e3a5bc95":{"id":"71db2a40-71cf-45bf-980c-7678e3a5bc95","type":"table","selected":false,"x":405,"y":660,"ports":[{"id":"c4597e0d-4d1c-41ae-83bb-ebeb67da1ce3","type":"onetomany","x":406,"y":764.109375,"name":"coll-port-1-left","alignment":"left","parentNode":"71db2a40-71cf-45bf-980c-7678e3a5bc95","links":[]},{"id":"93c89b03-b14a-43fa-a170-94353adcbdb0","type":"onetomany","x":579,"y":764.109375,"name":"coll-port-1-right","alignment":"right","parentNode":"71db2a40-71cf-45bf-980c-7678e3a5bc95","links":["940f0aaa-b74b-4c49-bde3-6dbefac0155a","da9cd2a3-a482-4c7d-b56f-e03a77fa1cbf"]},{"id":"5fdbde0a-fe69-4ee8-af93-bb05340acc1a","type":"onetomany","x":406,"y":974.90625,"name":"coll-port-11-left","alignment":"left","parentNode":"71db2a40-71cf-45bf-980c-7678e3a5bc95","links":["b4c9f742-0892-4e73-98fe-a2e594f7ceab"]},{"id":"8c6462ca-10f1-4ff5-a5a2-6403b1ffcd3c","type":"onetomany","x":579,"y":974.90625,"name":"coll-port-11-right","alignment":"right","parentNode":"71db2a40-71cf-45bf-980c-7678e3a5bc95","links":[]},{"id":"dfe822b2-d69c-4a88-85f5-d1dc32ce85b3","type":"onetomany","x":406,"y":922.8125,"name":"coll-port-6-left","alignment":"left","parentNode":"71db2a40-71cf-45bf-980c-7678e3a5bc95","links":["66d26303-38db-407f-a2e9-301c3da0c8a5"]},{"id":"bd348bff-aef5-45a4-b2d6-6119709d7c48","type":"onetomany","x":579,"y":922.8125,"name":"coll-port-6-right","alignment":"right","parentNode":"71db2a40-71cf-45bf-980c-7678e3a5bc95","links":[]}],"name":"Untitled","color":"rgb(0,192,255)","portsInOrder":[],"portsOutOrder":["c4597e0d-4d1c-41ae-83bb-ebeb67da1ce3","93c89b03-b14a-43fa-a170-94353adcbdb0","5fdbde0a-fe69-4ee8-af93-bb05340acc1a","8c6462ca-10f1-4ff5-a5a2-6403b1ffcd3c","dfe822b2-d69c-4a88-85f5-d1dc32ce85b3","bd348bff-aef5-45a4-b2d6-6119709d7c48"],"otherInfo":{"data":{"columns":[{"name":"trainee_id","atttypid":23,"attlen":null,"attnum":1,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"a","defval":null,"typname":"integer","displaytypname":"integer","cltype":"integer","inheritedfrom":null,"inheritedid":null,"elemoid":23,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"i","genexpr":null,"relname":"trainees","is_view_only":false,"attcompression":null,"seqrelid":16441,"seqtypid":23,"seqstart":"1","seqincrement":"1","seqmax":"2147483647","seqmin":"1","seqcache":"1","seqcycle":false,"is_pk":true,"is_primary_key":true,"attprecision":null,"coloptions":[],"edit_types":["bigint","double precision","information_schema.cardinal_number","integer","money","numeric","oid","real","regclass","regcollation","regconfig","regdictionary","regnamespace","regoper","regoperator","regproc","regprocedure","regrole","regtype","smallint"]},{"name":"name","atttypid":1043,"attlen":"30","attnum":2,"attndims":0,"atttypmod":34,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"x","attidentity":"","defval":"'<trainee>'::character varying","typname":"character varying","displaytypname":"character varying(30)","cltype":"character varying","inheritedfrom":null,"inheritedid":null,"elemoid":1043,"typnspname":"pg_catalog","defaultstorage":"x","description":null,"indkey":"1","isdup":false,"collspcname":"pg_catalog.\"default\"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"trainees","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["\"char\"","character","character varying","character varying","information_schema.character_data","information_schema.yes_or_no","name","regclass","text"]},{"name":"login","atttypid":1043,"attlen":"10","attnum":3,"attndims":0,"atttypmod":14,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"x","attidentity":"","defval":"'<login>'::character varying","typname":"character varying","displaytypname":"character varying(10)","cltype":"character varying","inheritedfrom":null,"inheritedid":null,"elemoid":1043,"typnspname":"pg_catalog","defaultstorage":"x","description":null,"indkey":"1","isdup":false,"collspcname":"pg_catalog.\"default\"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"trainees","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["\"char\"","character","character varying","character varying","character varying","information_schema.character_data","information_schema.yes_or_no","name","regclass","text"]},{"name":"password","atttypid":1043,"attlen":"10","attnum":4,"attndims":0,"atttypmod":14,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"x","attidentity":"","defval":"'<password>'::character varying","typname":"character varying","displaytypname":"character varying(10)","cltype":"character varying","inheritedfrom":null,"inheritedid":null,"elemoid":1043,"typnspname":"pg_catalog","defaultstorage":"x","description":null,"indkey":"1","isdup":false,"collspcname":"pg_catalog.\"default\"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"trainees","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["\"char\"","character","character varying","character varying","character varying","character varying","information_schema.character_data","information_schema.yes_or_no","name","regclass","text"]},{"name":"archived","atttypid":16,"attlen":null,"attnum":5,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"","defval":"false","typname":"boolean","displaytypname":"boolean","cltype":"boolean","inheritedfrom":null,"inheritedid":null,"elemoid":16,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"trainees","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["boolean","character","character varying","text"]},{"name":"group_trainee","atttypid":23,"attlen":null,"attnum":6,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"","defval":null,"typname":"integer","displaytypname":"integer","cltype":"integer","inheritedfrom":null,"inheritedid":null,"elemoid":23,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":true,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"trainees","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["bigint","double precision","information_schema.cardinal_number","integer","integer","money","numeric","oid","real","regclass","regcollation","regconfig","regdictionary","regnamespace","regoper","regoperator","regproc","regprocedure","regrole","regtype","smallint"]},{"name":"logged_in","atttypid":16,"attlen":null,"attnum":7,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":true,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"","defval":"false","typname":"boolean","displaytypname":"boolean","cltype":"boolean","inheritedfrom":null,"inheritedid":null,"elemoid":16,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":false,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"trainees","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["boolean","boolean","character","character varying","text"]},{"name":"computer_trainee","atttypid":23,"attlen":null,"attnum":11,"attndims":0,"atttypmod":-1,"attacl":[],"attnotnull":false,"attoptions":null,"attfdwoptions":null,"attstattarget":-1,"attstorage":"p","attidentity":"","defval":null,"typname":"integer","displaytypname":"integer","cltype":"integer","inheritedfrom":null,"inheritedid":null,"elemoid":23,"typnspname":"pg_catalog","defaultstorage":"p","description":null,"indkey":"1","isdup":false,"collspcname":"","is_fk":true,"seclabels":null,"is_sys_column":false,"colconstype":"n","genexpr":null,"relname":"trainees","is_view_only":false,"attcompression":null,"seqrelid":null,"seqtypid":null,"seqstart":null,"seqincrement":null,"seqmax":null,"seqmin":null,"seqcache":null,"seqcycle":null,"is_pk":false,"is_primary_key":false,"attprecision":null,"coloptions":[],"edit_types":["bigint","double precision","information_schema.cardinal_number","integer","integer","integer","money","numeric","oid","real","regclass","regcollation","regconfig","regdictionary","regnamespace","regoper","regoperator","regproc","regprocedure","regrole","regtype","smallint"]}],"name":"trainees","schema":"public","description":null,"rlspolicy":false,"forcerlspolicy":false,"fillfactor":null,"toast_tuple_target":null,"parallel_workers":null,"relpersistence":false,"primary_key":[{"oid":16445,"name":"trainees_pkey","col_count":1,"indnullsnotdistinct":false,"spcname":"pg_default","comment":null,"condeferrable":false,"condeferred":false,"conislocal":true,"fillfactor":null,"columns":[{"column":"trainee_id"}],"include":[]}],"foreign_key":[{"name":"computer","condeferrable":false,"condeferred":false,"confupdtype":"a","confdeltype":"a","confmatchtype":false,"conkey":[11],"confkey":[1],"confrelid":16467,"fknsp":"public","fktab":"trainees","refnspoid":2200,"refnsp":"public","reftab":"computers","comment":null,"convalidated":false,"conislocal":true,"columns":[{"local_column":"computer_trainee","references":"34b9cf90-0590-4349-9b0d-3313faf3d15b","referenced":"computer_id","references_table_name":"public.computers"}],"remote_schema":"public","remote_table":"computers","coveringindex":null,"autoindex":false,"hasindex":false},{"name":"trainees_groups","condeferrable":false,"condeferred":false,"confupdtype":"a","confdeltype":"a","confmatchtype":false,"conkey":[6],"confkey":[1],"confrelid":16448,"fknsp":"public","fktab":"trainees","refnspoid":2200,"refnsp":"public","reftab":"groups","comment":null,"convalidated":false,"conislocal":true,"columns":[{"local_column":"group_trainee","references":"5757cd17-d261-4285-afaa-9c87eb259e1a","referenced":"group_id","references_table_name":"public.groups"}],"remote_schema":"public","remote_table":"groups","coveringindex":null,"autoindex":false,"hasindex":false}],"unique_constraint":[]},"note":"","metadata":{"data_failed":false,"is_promise":false}}}}}]}} \ No newline at end of file diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index e0e5d34..a7d4558 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -918,6 +918,8 @@ int DataBaseLMS::deleteTrainee(int id_trainee) QSqlQuery query = QSqlQuery(*db); + + //Удаление задач AMM queryStr = QString("DELETE FROM public.tasks_amm " "WHERE trainee_task = %1 ").arg( QString::number(id_trainee)); @@ -928,6 +930,39 @@ int DataBaseLMS::deleteTrainee(int id_trainee) return 0; } + + //Удаление задач FIM + + /*Выборка задач FIM для этого обучаемого*/ + queryStr = QString("SELECT tasks_fim.task_id, tasks_fim.title, " + "trainees.trainee_id " + "FROM public.tasks_fim JOIN public.trainees ON trainees.trainee_id = tasks_fim.trainee_task " + "WHERE tasks_fim.trainee_task = %1 " + "ORDER BY tasks_fim.task_id ASC").arg( + id_trainee); + + if(queryExec(queryStr, &query)) + { + while (query.next()) + {//Задача + /*Удаляем все malfunction для этой задачи*/ + queryStr = QString("DELETE FROM public.malfunctions " + "WHERE malfunctions.task_fim_malf = %1 ").arg( + query.value(0).toInt()); + if(!queryExec(queryStr, &query)) + { + resBool = db->rollback(); + return 0; + } + }; + } + else + { + resBool = db->rollback(); + return 0; + } + + /*Удаление непосредственно задач FIM*/ queryStr = QString("DELETE FROM public.tasks_fim " "WHERE trainee_task = %1 ").arg( QString::number(id_trainee)); @@ -938,6 +973,8 @@ int DataBaseLMS::deleteTrainee(int id_trainee) return 0; } + + //Удаление обучаемого queryStr = QString("DELETE FROM public.trainees " "WHERE trainee_id = %1 " "RETURNING trainees.trainee_id").arg( From 5a722383d16b2a9728f3ca5b1bc9770d1e10ca61 Mon Sep 17 00:00:00 2001 From: krivoshein <krivoshein@msk.dinamika-avia.ru> Date: Wed, 19 Mar 2025 12:23:07 +0300 Subject: [PATCH 70/77] =?UTF-8?q?=D0=BF=D0=BE=D1=84=D0=B8=D0=BA=D1=81?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B1=D0=B0=D0=B3=20=D1=81=20query?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/databaselms.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index a7d4558..693d2f2 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -934,9 +934,8 @@ int DataBaseLMS::deleteTrainee(int id_trainee) //Удаление задач FIM /*Выборка задач FIM для этого обучаемого*/ - queryStr = QString("SELECT tasks_fim.task_id, tasks_fim.title, " - "trainees.trainee_id " - "FROM public.tasks_fim JOIN public.trainees ON trainees.trainee_id = tasks_fim.trainee_task " + queryStr = QString("SELECT tasks_fim.task_id " + "FROM public.tasks_fim " "WHERE tasks_fim.trainee_task = %1 " "ORDER BY tasks_fim.task_id ASC").arg( id_trainee); @@ -949,7 +948,8 @@ int DataBaseLMS::deleteTrainee(int id_trainee) queryStr = QString("DELETE FROM public.malfunctions " "WHERE malfunctions.task_fim_malf = %1 ").arg( query.value(0).toInt()); - if(!queryExec(queryStr, &query)) + QSqlQuery queryDel = QSqlQuery(*db); + if(!queryExec(queryStr, &queryDel)) { resBool = db->rollback(); return 0; From 50d1a2cf9ec1c5a2a63c25be6be93981cf7e7162 Mon Sep 17 00:00:00 2001 From: krivoshein <krivoshein@msk.dinamika-avia.ru> Date: Wed, 19 Mar 2025 13:02:49 +0300 Subject: [PATCH 71/77] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=80=D1=8B=D0=B5=20Task?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/CMakeLists.txt | 2 - DataBaseLMS/databaselms.cpp | 38 ------------------- DataBaseLMS/databaselms.h | 2 - DataBaseLMS/interfacedatabaselms.cpp | 5 --- DataBaseLMS/interfacedatabaselms.h | 1 - DataBaseLMS/task.cpp | 7 ---- DataBaseLMS/task.h | 12 ------ DataBaseLMS/trainee.cpp | 3 +- DataBaseLMS/trainee.h | 5 --- .../Core/recognizesystem.cpp | 21 ---------- .../connectorToServer/Core/recognizesystem.h | 1 - .../connectorToServer/Core/tools.h | 1 - .../connectorToServer/connectortoserver.cpp | 12 ------ .../connectorToServer/connectortoserver.h | 4 -- ServerLMS/Data/PacketType.h | 1 - ServerLMS/Systems/Parsers/dbanswerparser.cpp | 6 --- ServerLMS/Systems/Parsers/dbanswerparser.h | 1 - 17 files changed, 1 insertion(+), 121 deletions(-) delete mode 100644 DataBaseLMS/task.cpp delete mode 100644 DataBaseLMS/task.h diff --git a/DataBaseLMS/CMakeLists.txt b/DataBaseLMS/CMakeLists.txt index b9aafce..a74f588 100644 --- a/DataBaseLMS/CMakeLists.txt +++ b/DataBaseLMS/CMakeLists.txt @@ -20,8 +20,6 @@ add_library(DataBaseLMS SHARED group.h computer.cpp computer.h - task.cpp - task.h classroom.cpp classroom.h tasksAmmFim.cpp diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index 693d2f2..257886f 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -181,8 +181,6 @@ QList<Trainee> DataBaseLMS::selectAllTrainees() Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom); trainee.setComputer(computer); - trainee.setTasks(selectTasksOfTrainee(trainee.getID())); - listTrainees.append(trainee); } } @@ -690,8 +688,6 @@ Trainee DataBaseLMS::selectTrainee(int id_trainee) 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); - - trainee.setTasks(selectTasksOfTrainee(trainee.getID())); } } @@ -735,8 +731,6 @@ QList<Trainee> DataBaseLMS::selectAllTraineesInGroup(int id_group) Computer computer = Computer(query.value(8).toInt(), query.value(9).toString(), query.value(10).toString(), classroom); trainee.setComputer(computer); - trainee.setTasks(selectTasksOfTrainee(trainee.getID())); - listTrainees.append(trainee); } } @@ -820,8 +814,6 @@ Trainee DataBaseLMS::selectTraineeOnComputer(QString computer_name) 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); - - trainee.setTasks(selectTasksOfTrainee(trainee.getID())); } } @@ -1015,36 +1007,6 @@ int DataBaseLMS::updateTrainee(Trainee trainee) return queryExecInt(queryStr); } -QList<Task> DataBaseLMS::selectTasksOfTrainee(int trainee_id) -{ - QList<Task> tasks; - - /* - QString queryStr = QString("SELECT tasks.task_id, tasks.name " - "FROM public.trainees " - "JOIN public.trainees_tasks ON trainees_tasks.trainee_id = trainees.trainee_id " - "JOIN public.tasks ON tasks.task_id = trainees_tasks.task_id " - "WHERE trainees.trainee_id = %1 " - "ORDER BY tasks.name ASC").arg( - trainee_id); - - QSqlQuery query = QSqlQuery(*db); - - if(queryExec(queryStr, &query)) - { - while (query.next()) - {//Задача - Task task; - task.setID(query.value(0).toInt()); - task.setName(query.value(1).toString()); - tasks.append(task); - } - } - */ - - return tasks; -} - int DataBaseLMS::queryExecInt(QString queryStr) { QSqlQuery query = QSqlQuery(*db); diff --git a/DataBaseLMS/databaselms.h b/DataBaseLMS/databaselms.h index 79572a2..29a2371 100644 --- a/DataBaseLMS/databaselms.h +++ b/DataBaseLMS/databaselms.h @@ -82,8 +82,6 @@ protected: int deleteTrainee(int id_trainee); int updateTrainee(Trainee trainee); - QList<Task> selectTasksOfTrainee(int trainee_id); - private: int queryExecInt(QString queryStr); QString queryExecString(QString queryStr); diff --git a/DataBaseLMS/interfacedatabaselms.cpp b/DataBaseLMS/interfacedatabaselms.cpp index 03c1b4f..0ed724b 100644 --- a/DataBaseLMS/interfacedatabaselms.cpp +++ b/DataBaseLMS/interfacedatabaselms.cpp @@ -213,11 +213,6 @@ bool InterfaceDataBaseLMS::deAuthorizationAllTrainees() return updateAllTraineesLoggedIn(false); } -QList<Task> InterfaceDataBaseLMS::getTasksTrainee(int id) -{ - return selectTasksOfTrainee(id); -} - QString InterfaceDataBaseLMS::getNameTraineeOnComputer(QString computer_name) { return selectTraineeNameOnComputer(computer_name); diff --git a/DataBaseLMS/interfacedatabaselms.h b/DataBaseLMS/interfacedatabaselms.h index 3ba2233..6fce95c 100644 --- a/DataBaseLMS/interfacedatabaselms.h +++ b/DataBaseLMS/interfacedatabaselms.h @@ -51,7 +51,6 @@ public: bool deAuthorizationAllTrainees(); //void setTasks(QString login, QStringList tasks); - QList<Task> getTasksTrainee(int id); QString getNameTraineeOnComputer(QString computer_name); Trainee getTraineeOnComputer(QString computer_name); diff --git a/DataBaseLMS/task.cpp b/DataBaseLMS/task.cpp deleted file mode 100644 index d99ae8e..0000000 --- a/DataBaseLMS/task.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "task.h" - -Task::Task(): - BasicEntity() -{ - -} diff --git a/DataBaseLMS/task.h b/DataBaseLMS/task.h deleted file mode 100644 index bc5889d..0000000 --- a/DataBaseLMS/task.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef TASK_H -#define TASK_H - -#include "basicentity.h" - -class DATABASELMS_EXPORT Task: public BasicEntity -{ -public: - Task(); -}; - -#endif // TASK_H diff --git a/DataBaseLMS/trainee.cpp b/DataBaseLMS/trainee.cpp index 32ecb02..0182f4d 100644 --- a/DataBaseLMS/trainee.cpp +++ b/DataBaseLMS/trainee.cpp @@ -3,8 +3,7 @@ Trainee::Trainee(): User(), group(), - computer(), - tasks() + computer() { } diff --git a/DataBaseLMS/trainee.h b/DataBaseLMS/trainee.h index 15d42de..7dad41a 100644 --- a/DataBaseLMS/trainee.h +++ b/DataBaseLMS/trainee.h @@ -6,7 +6,6 @@ #include "user.h" #include "group.h" #include "computer.h" -#include "task.h" class DATABASELMS_EXPORT Trainee: public User { @@ -19,13 +18,9 @@ public: void setComputer(Computer computer){this->computer = computer;} Computer getComputer(){return computer;} - void setTasks(QList<Task> tasks){this->tasks = tasks;} - QList<Task> getTasks(){return tasks;} - private: Group group; Computer computer; - QList<Task> tasks; }; #endif // TRAINEE_H diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp index 93b7d82..be3d0c3 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.cpp @@ -273,7 +273,6 @@ void RecognizeSystem::recognize(QTcpSocket *socket) case TYPE_XMLANSWER_QUERY_DB__LIST_TRAINEES: case TYPE_XMLANSWER_QUERY_DB__LIST_COMPUTERS: case TYPE_XMLANSWER_QUERY_DB__LIST_CLASSROOMS: - case TYPE_XMLANSWER_QUERY_DB__LIST_TASKS: case TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE: case TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE: { @@ -652,26 +651,6 @@ void RecognizeSystem::xmlParserQueryToDB(PacketType packetType, QByteArray array emit sigAnswerQueryToDB_ListClassrooms(listClassrooms); } break; - case TYPE_XMLANSWER_QUERY_DB__LIST_TASKS: - { - QList<Task> listTasks; - QDomNode listNode = commonDOM.namedItem("ListTasks"); - - for(int i = 0; i < listNode.childNodes().count(); i++) - { - QDomNode taskNode = listNode.childNodes().at(i); - if(taskNode.nodeName() == "Task") - {//Задача - Task task; - task.setID(taskNode.toElement().attribute("task_id").toInt()); - task.setName(taskNode.toElement().attribute("name")); - - listTasks.append(task); - } - } - emit sigAnswerQueryToDB_ListTasks(listTasks); - } - break; case TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE: { QList<TaskAmmFim> listTasks; diff --git a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h index de47193..55d910a 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h +++ b/InstructorsAndTrainees/connectorToServer/Core/recognizesystem.h @@ -48,7 +48,6 @@ signals: void sigAnswerQueryToDB_ListTrainees(QList<Trainee> listTrainees); void sigAnswerQueryToDB_ListComputers(QList<Computer> listComputers); void sigAnswerQueryToDB_ListClassrooms(QList<Classroom> listClassrooms); - void sigAnswerQueryToDB_ListTasks(QList<Task> listTasks); void sigAnswerQueryToDB_ListTasksAMMforTrainee(QList<TaskAmmFim>listTasks, int trainee_id); void sigAnswerQueryToDB_ListTasksFIMforTrainee(QList<TaskAmmFim>listTasks, int trainee_id); void sigAnswerQueryTasksXML_FIM(QByteArray array); diff --git a/InstructorsAndTrainees/connectorToServer/Core/tools.h b/InstructorsAndTrainees/connectorToServer/Core/tools.h index 7657c32..30ef3b3 100644 --- a/InstructorsAndTrainees/connectorToServer/Core/tools.h +++ b/InstructorsAndTrainees/connectorToServer/Core/tools.h @@ -44,7 +44,6 @@ enum PacketType{ TYPE_XMLANSWER_QUERY_DB__LIST_TRAINEES = 102, TYPE_XMLANSWER_QUERY_DB__LIST_COMPUTERS = 103, TYPE_XMLANSWER_QUERY_DB__LIST_CLASSROOMS = 104, - TYPE_XMLANSWER_QUERY_DB__LIST_TASKS = 105, TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE = 106, TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE = 107, diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp index 0982b27..301e84b 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.cpp @@ -143,11 +143,6 @@ QList<Classroom> ConnectorToServer::getListClassrooms() return listClassrooms; } -QList<Task> ConnectorToServer::getListTasks() -{ - return listTasks; -} - QList<TaskAmmFim> ConnectorToServer::getListTasksAMMforTrainee(int trainee_id) { if(mapTasksAMM.contains(trainee_id)) @@ -323,12 +318,6 @@ void ConnectorToServer::slot_AnswerQueryToDB_ListClassrooms(QList<Classroom> lis //emit signal_UpdateDB(false, true); } -void ConnectorToServer::slot_AnswerQueryToDB_ListTasks(QList<Task> listTasks) -{ - this->listTasks = listTasks; - //emit signal_UpdateDB(false, true); -} - void ConnectorToServer::slot_AnswerQueryToDB_ListTasksAMMforTrainee(QList<TaskAmmFim> listTasks, int trainee_id) { //Удаляем старые задачи этого обучаемого @@ -422,7 +411,6 @@ void ConnectorToServer::bindConnection() 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_ListTasks,this,&ConnectorToServer::slot_AnswerQueryToDB_ListTasks); connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListTasksAMMforTrainee,this,&ConnectorToServer::slot_AnswerQueryToDB_ListTasksAMMforTrainee); connect(recognizeSystem,&RecognizeSystem::sigAnswerQueryToDB_ListTasksFIMforTrainee,this,&ConnectorToServer::slot_AnswerQueryToDB_ListTasksFIMforTrainee); diff --git a/InstructorsAndTrainees/connectorToServer/connectortoserver.h b/InstructorsAndTrainees/connectorToServer/connectortoserver.h index b7dee66..c235ddf 100644 --- a/InstructorsAndTrainees/connectorToServer/connectortoserver.h +++ b/InstructorsAndTrainees/connectorToServer/connectortoserver.h @@ -14,7 +14,6 @@ #include "group.h" #include "computer.h" #include "classroom.h" -#include "task.h" #include "streamingversiondata.h" class ConnectorToServer : public QObject @@ -44,7 +43,6 @@ public: QList<Group> getListGroups(); QList<Computer> getListComputers(); QList<Classroom> getListClassrooms(); - QList<Task> getListTasks(); QList<TaskAmmFim> getListTasksAMMforTrainee(int trainee_id); QList<TaskAmmFim> getListTasksFIMforTrainee(int trainee_id); @@ -74,7 +72,6 @@ public slots: void slot_AnswerQueryToDB_ListTrainees(QList<Trainee> listTrainees); void slot_AnswerQueryToDB_ListComputers(QList<Computer> listComputers); void slot_AnswerQueryToDB_ListClassrooms(QList<Classroom> listClassrooms); - void slot_AnswerQueryToDB_ListTasks(QList<Task> listTasks); void slot_AnswerQueryToDB_ListTasksAMMforTrainee(QList<TaskAmmFim> listTasks, int trainee_id); void slot_AnswerQueryToDB_ListTasksFIMforTrainee(QList<TaskAmmFim> listTasks, int trainee_id); @@ -133,7 +130,6 @@ private: QList<Trainee> listTrainees; QList<Computer> listComputers; QList<Classroom> listClassrooms; - QList<Task> listTasks; QMap<int, QList<TaskAmmFim>> mapTasksAMM; QMap<int, QList<TaskAmmFim>> mapTasksFIM; diff --git a/ServerLMS/Data/PacketType.h b/ServerLMS/Data/PacketType.h index 0816fc5..67f64c3 100644 --- a/ServerLMS/Data/PacketType.h +++ b/ServerLMS/Data/PacketType.h @@ -26,7 +26,6 @@ enum PacketType TYPE_XMLANSWER_QUERY_DB__LIST_TRAINEES = 102, TYPE_XMLANSWER_QUERY_DB__LIST_COMPUTERS = 103, TYPE_XMLANSWER_QUERY_DB__LIST_CLASSROOMS = 104, - TYPE_XMLANSWER_QUERY_DB__LIST_TASKS = 105, TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE = 106, TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE = 107, diff --git a/ServerLMS/Systems/Parsers/dbanswerparser.cpp b/ServerLMS/Systems/Parsers/dbanswerparser.cpp index f652862..cfce748 100644 --- a/ServerLMS/Systems/Parsers/dbanswerparser.cpp +++ b/ServerLMS/Systems/Parsers/dbanswerparser.cpp @@ -102,12 +102,6 @@ QByteArray DBAnswerParser::listClassrooms(bool result, QList<Classroom> *listCla return QByteArray(); } -QByteArray DBAnswerParser::listTasks(bool result, QList<Task> *listTasks) -{ - //TODO - return QByteArray(); -} - QByteArray DBAnswerParser::listTasksAMMofTrainee(bool result, QList<TaskAmmFim> *listTasks, int trainee_id) { QDomDocument commonDOM; diff --git a/ServerLMS/Systems/Parsers/dbanswerparser.h b/ServerLMS/Systems/Parsers/dbanswerparser.h index c3c0ca9..64c53e5 100644 --- a/ServerLMS/Systems/Parsers/dbanswerparser.h +++ b/ServerLMS/Systems/Parsers/dbanswerparser.h @@ -18,7 +18,6 @@ public: QByteArray listTrainees(bool result, QList<Trainee> *listTrainees); QByteArray listComputers(bool result, QList<Computer> *listComputers); QByteArray listClassrooms(bool result, QList<Classroom> *listClassrooms); - QByteArray listTasks(bool result, QList<Task> *listTasks); QByteArray listTasksAMMofTrainee(bool result, QList<TaskAmmFim> *listTasks, int trainee_id); QByteArray listTasksFIMofTrainee(bool result, QList<TaskAmmFim> *listTasks, int trainee_id); From c0b2ff06218fb7d037b4d4e4051d5ff8f07076fa Mon Sep 17 00:00:00 2001 From: krivoshein <krivoshein@msk.dinamika-avia.ru> Date: Tue, 25 Mar 2025 12:58:42 +0300 Subject: [PATCH 72/77] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BD=D0=B0=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/databaselms.cpp | 88 +++++++++++++++++-- DataBaseLMS/typeQueryToDB.h | 5 +- .../tasks/ammtaskswidget.cpp | 31 +++++++ InstructorsAndTrainees/tasks/ammtaskswidget.h | 2 + .../tasks/ammtaskswidget.ui | 13 ++- .../tasks/fimtaskswidget.cpp | 31 +++++++ InstructorsAndTrainees/tasks/fimtaskswidget.h | 2 + .../tasks/fimtaskswidget.ui | 13 ++- ServerLMS/Systems/processingsystem.cpp | 74 ++++++++++++++-- 9 files changed, 242 insertions(+), 17 deletions(-) diff --git a/DataBaseLMS/databaselms.cpp b/DataBaseLMS/databaselms.cpp index 257886f..719c1f3 100644 --- a/DataBaseLMS/databaselms.cpp +++ b/DataBaseLMS/databaselms.cpp @@ -481,12 +481,46 @@ int DataBaseLMS::updateTaskAMM(TaskAmmFim task) int DataBaseLMS::deleteTaskAMM(int id_task) { - QString queryStr = QString("DELETE FROM public.tasks_amm " + QString queryStr; + bool resBool = false; + int id_trainee = 0; + + resBool = db->transaction(); + + queryStr = QString("SELECT trainees.trainee_id " + "FROM public.trainees JOIN public.tasks_amm ON trainees.trainee_id = tasks_amm.trainee_task " + "WHERE tasks_amm.task_id = %1 " + "ORDER BY trainees.trainee_id ASC").arg( + QString::number(id_task)); + + 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("DELETE FROM public.tasks_amm " "WHERE task_id = %1 " "RETURNING tasks_amm.task_id").arg( QString::number(id_task)); - return queryExecInt(queryStr); + if(!queryExecInt(queryStr)) + { + resBool = db->rollback(); + return 0; + } + + resBool = db->commit(); + return id_trainee; } QList<TaskAmmFim> DataBaseLMS::selectTasksAMMofTrainee(int id_trainee) @@ -577,13 +611,57 @@ int DataBaseLMS::updateTaskFIM(TaskAmmFim task) int DataBaseLMS::deleteTaskFIM(int id_task) { - //TODO доделать удаление malfunction - QString queryStr = QString("DELETE FROM public.tasks_fim " + QString queryStr; + bool resBool = false; + int id_trainee = 0; + + resBool = db->transaction(); + + queryStr = QString("SELECT trainees.trainee_id " + "FROM public.trainees JOIN public.tasks_fim ON trainees.trainee_id = tasks_fim.trainee_task " + "WHERE tasks_fim.task_id = %1 " + "ORDER BY trainees.trainee_id ASC").arg( + QString::number(id_task)); + + 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("DELETE FROM public.malfunctions " + "WHERE task_fim_malf = %1 ").arg( + QString::number(id_task)); + + QSqlQuery query1 = QSqlQuery(*db); + if(!queryExec(queryStr, &query1)) + { + 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)); - return queryExecInt(queryStr); + if(!queryExecInt(queryStr)) + { + resBool = db->rollback(); + return 0; + } + + resBool = db->commit(); + return id_trainee; } QList<TaskAmmFim> DataBaseLMS::selectTasksFIMofTrainee(int id_trainee) diff --git a/DataBaseLMS/typeQueryToDB.h b/DataBaseLMS/typeQueryToDB.h index d534b0c..215a523 100644 --- a/DataBaseLMS/typeQueryToDB.h +++ b/DataBaseLMS/typeQueryToDB.h @@ -17,7 +17,10 @@ enum TypeQueryToDB{ TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE, TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE, TYPE_QUERY_GET_TASKS_AMM_FOR_TRAINEE, - TYPE_QUERY_GET_TASKS_FIM_FOR_TRAINEE + TYPE_QUERY_GET_TASKS_FIM_FOR_TRAINEE, + + TYPE_QUERY_DELETE_TASK_AMM_TO_TRAINEE, + TYPE_QUERY_DELETE_TASK_FIM_TO_TRAINEE }; #endif // TYPEQUERYTODB_H diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index 35ee461..dd74f12 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -50,6 +50,10 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty waitAnimationWidget->initialize(movie,this); waitAnimationWidget->moveToThread(threadAnimation); threadAnimation->start(); + + ui->btnDelete->setEnabled(false); + if(type == TypeList::listCommon) + ui->btnDelete->setVisible(false); } AMMtasksWidget::~AMMtasksWidget() @@ -107,7 +111,14 @@ void AMMtasksWidget::changeEvent(QEvent *event) void AMMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) { if(current == nullptr) + { + ui->btnDelete->setEnabled(false); return; + } + else + { + ui->btnDelete->setEnabled(true); + } int id = current->text(ColumnsTree::clmn_ID).toInt(); @@ -274,3 +285,23 @@ void AMMtasksWidget::slot_AssignTaskAMMtoTrainee() } } } + +void AMMtasksWidget::on_btnDelete_clicked() +{ + QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem(); + + if(treeItemCurrent != nullptr) + { + QTreeWidgetItem *treeItemParent = treeItemCurrent->parent(); + if(treeItemParent == nullptr) + {//Выбрана задача + + int id = treeItemCurrent->text(ColumnsTree::clmn_ID).toInt(); + + if(QMessageBox::warning(this, tr("Attention!"), tr("The deletion will be irrevocable.\nDelete it anyway?"), QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Ok) + { + connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_DELETE_TASK_AMM_TO_TRAINEE, id); + } + } + } +} diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index c4f60d8..ede4bf9 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -48,6 +48,8 @@ private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); void on_btnUpdateTasks_clicked(); + void on_btnDelete_clicked(); + public Q_SLOTS: void slot_AssignTaskAMMtoTrainee(); diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.ui b/InstructorsAndTrainees/tasks/ammtaskswidget.ui index 655045c..fe61646 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.ui +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.ui @@ -21,7 +21,18 @@ </property> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> - <layout class="QHBoxLayout" name="horizontalLayout_1"/> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_1"/> + </item> + <item> + <widget class="QToolButton" name="btnDelete"> + <property name="text"> + <string>Delete</string> + </property> + </widget> + </item> + </layout> </item> </layout> </widget> diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index 62a25fa..35e05e2 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -41,6 +41,10 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty waitAnimationWidget->initialize(movie,this); waitAnimationWidget->moveToThread(threadAnimation); threadAnimation->start(); + + ui->btnDelete->setEnabled(false); + if(type == TypeList::listCommon) + ui->btnDelete->setVisible(false); } FIMtasksWidget::~FIMtasksWidget() @@ -94,7 +98,10 @@ void FIMtasksWidget::changeEvent(QEvent *event) void FIMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) { if(current == nullptr) + { + ui->btnDelete->setEnabled(false); return; + } QString code = ""; @@ -108,10 +115,14 @@ void FIMtasksWidget::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, code = task->title; accessAssignTask = true; + + ui->btnDelete->setEnabled(true); } else { accessAssignTask = false; + + ui->btnDelete->setEnabled(false); } Q_EMIT signal_currentItemChanged(); @@ -412,3 +423,23 @@ void FIMtasksWidget::slot_AssignTaskFIMtoTrainee() updateTaskItem(current); } } + +void FIMtasksWidget::on_btnDelete_clicked() +{ + QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem(); + + if(treeItemCurrent != nullptr) + { + QTreeWidgetItem *treeItemParent = treeItemCurrent->parent(); + if(treeItemParent == nullptr) + {//Выбрана задача + + int id = treeItemCurrent->text(ColumnsTree::clmn_ID).toInt(); + + if(QMessageBox::warning(this, tr("Attention!"), tr("The deletion will be irrevocable.\nDelete it anyway?"), QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Ok) + { + connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_DELETE_TASK_FIM_TO_TRAINEE, id); + } + } + } +} diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.h b/InstructorsAndTrainees/tasks/fimtaskswidget.h index aae604d..1c36d65 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.h +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.h @@ -51,6 +51,8 @@ private Q_SLOTS: void on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); void on_btnUpdateTasks_clicked(); + void on_btnDelete_clicked(); + public Q_SLOTS: void slot_AssignTaskFIMtoTrainee(); diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.ui b/InstructorsAndTrainees/tasks/fimtaskswidget.ui index fd932dc..c5d9089 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.ui +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.ui @@ -15,7 +15,18 @@ </property> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> - <layout class="QHBoxLayout" name="horizontalLayout_1"/> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_1"/> + </item> + <item> + <widget class="QToolButton" name="btnDelete"> + <property name="text"> + <string>Delete</string> + </property> + </widget> + </item> + </layout> </item> </layout> </widget> diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 09d7415..b30998a 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -343,6 +343,66 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu break; } + + case TypeQueryToDB::TYPE_QUERY_DELETE_TASK_AMM_TO_TRAINEE: + { + int id_trainee = providerDBLMS->delTaskAMM(id); + if(id_trainee) + { + QList<TaskAmmFim> listTasks = providerDBLMS->GetListTasksAMMofTrainee(id_trainee); + arrayAnswer = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasks, id_trainee); + client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE); + + //Отправка списка задач AMM клиенту Юнити + QString login = providerDBLMS->getLoginTraineeById(id_trainee); + //Проходим все открытые сокеты, ищем нужный + foreach(int idSocket, server->getClientsMap().keys()) + { + ClientHandler *handler = server->getClientsMap().value(idSocket); + if(handler->getClient()->getLogin() == login) + { + if(handler->getClient()->getIsUnity()) + {//Отправляем ему + //AMM + QList<TaskAmmFim> listTasksAMM = providerDBLMS->GetListTasksAMMofTrainee(id_trainee); + QByteArray arrayAnswerTasksAMM = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasksAMM, id_trainee); + handler->sendXmlAnswer(arrayAnswerTasksAMM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE); + } + } + } + } + break; + } + + case TypeQueryToDB::TYPE_QUERY_DELETE_TASK_FIM_TO_TRAINEE: + { + int id_trainee = providerDBLMS->delTaskFIM(id); + if(id_trainee) + { + QList<TaskAmmFim> listTasks = providerDBLMS->GetListTasksFIMofTrainee(id_trainee); + arrayAnswer = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasks, id_trainee); + client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE); + + //Отправка списка задач FIM клиенту Юнити + QString login = providerDBLMS->getLoginTraineeById(id_trainee); + //Проходим все открытые сокеты, ищем нужный + foreach(int idSocket, server->getClientsMap().keys()) + { + ClientHandler *handler = server->getClientsMap().value(idSocket); + if(handler->getClient()->getLogin() == login) + { + if(handler->getClient()->getIsUnity()) + {//Отправляем ему + //FIM + QList<TaskAmmFim> listTasksFIM = providerDBLMS->GetListTasksFIMofTrainee(id_trainee); + QByteArray arrayAnswerTasksFIM = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasksFIM, id_trainee); + handler->sendXmlAnswer(arrayAnswerTasksFIM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE); + } + } + } + } + break; + } } //client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_DB_LIST_INSTRUCTORS); @@ -402,15 +462,11 @@ void ProcessingSystem::processingClientNotify(ClientHandler *client, ClientNotif client->getSocket()->flush(); - QStringList listTasks; - //TODO KAV redact - //listTasks = pInstructorsAndTrainees->getDbLMS()->getWhatItDoes(client->getClient()->getLogin()); - - QByteArray arrayAnswer = dataParser->ClientAnswer()->tasks(listTasks); - client->sendXmlAnswer(arrayAnswer); - - QString str = QString(arrayAnswer); - emit sigLogMessage("To Client: " + str); + //QStringList listTasks; + //QByteArray arrayAnswer = dataParser->ClientAnswer()->tasks(listTasks); + //client->sendXmlAnswer(arrayAnswer); + //QString str = QString(arrayAnswer); + //emit sigLogMessage("To Client: " + str); } else if(clientNotify.Code == commandDisableClient) { From 2614a562652aaa7d6089290f9c5ae502d6003726 Mon Sep 17 00:00:00 2001 From: krivoshein <krivoshein@msk.dinamika-avia.ru> Date: Tue, 25 Mar 2025 16:40:32 +0300 Subject: [PATCH 73/77] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataBaseLMS/typeQueryToDB.h | 4 +- .../tasks/ammtaskswidget.cpp | 2 +- .../tasks/fimtaskswidget.cpp | 2 +- ServerLMS/Systems/processingsystem.cpp | 230 +++++++----------- ServerLMS/Systems/processingsystem.h | 4 + 5 files changed, 99 insertions(+), 143 deletions(-) diff --git a/DataBaseLMS/typeQueryToDB.h b/DataBaseLMS/typeQueryToDB.h index 215a523..7bc4df0 100644 --- a/DataBaseLMS/typeQueryToDB.h +++ b/DataBaseLMS/typeQueryToDB.h @@ -19,8 +19,8 @@ enum TypeQueryToDB{ TYPE_QUERY_GET_TASKS_AMM_FOR_TRAINEE, TYPE_QUERY_GET_TASKS_FIM_FOR_TRAINEE, - TYPE_QUERY_DELETE_TASK_AMM_TO_TRAINEE, - TYPE_QUERY_DELETE_TASK_FIM_TO_TRAINEE + TYPE_QUERY_DEL_TASK_AMM_TO_TRAINEE, + TYPE_QUERY_DEL_TASK_FIM_TO_TRAINEE }; #endif // TYPEQUERYTODB_H diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index dd74f12..51da65e 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -300,7 +300,7 @@ void AMMtasksWidget::on_btnDelete_clicked() if(QMessageBox::warning(this, tr("Attention!"), tr("The deletion will be irrevocable.\nDelete it anyway?"), QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Ok) { - connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_DELETE_TASK_AMM_TO_TRAINEE, id); + connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_DEL_TASK_AMM_TO_TRAINEE, id); } } } diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index 35e05e2..9cdf4b0 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -438,7 +438,7 @@ void FIMtasksWidget::on_btnDelete_clicked() if(QMessageBox::warning(this, tr("Attention!"), tr("The deletion will be irrevocable.\nDelete it anyway?"), QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Ok) { - connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_DELETE_TASK_FIM_TO_TRAINEE, id); + connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_DEL_TASK_FIM_TO_TRAINEE, id); } } } diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index b30998a..6b0be10 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -255,160 +255,79 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu case TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_AMM_TO_TRAINEE: { - int id_new; - id_new = providerDBLMS->newTaskAMM(*(TaskAmmFim*)data, id); - - if(id_new) - {//Отправка списка задач AMM клиенту Юнити - QString login = providerDBLMS->getLoginTraineeById(id); - //Проходим все открытые сокеты, ищем нужный - foreach(int idSocket, server->getClientsMap().keys()) - { - ClientHandler *handler = server->getClientsMap().value(idSocket); - if(handler->getClient()->getLogin() == login) - { - if(handler->getClient()->getIsUnity()) - {//Отправляем ему - //AMM - QList<TaskAmmFim> listTasksAMM = providerDBLMS->GetListTasksAMMofTrainee(id); - QByteArray arrayAnswerTasksAMM = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasksAMM, id); - handler->sendXmlAnswer(arrayAnswerTasksAMM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE); - } - } - } - } - - /* - if(id_new) + if(int id_new = providerDBLMS->newTaskAMM(*(TaskAmmFim*)data, id)) { - (*(TaskAmmFim*)data).setID(id_new); - providerDBLMS->editTaskAMM(*(TaskAmmFim*)data); - } - */ - //emit sigTasksChanged(); - //break; - } - case TypeQueryToDB::TYPE_QUERY_GET_TASKS_AMM_FOR_TRAINEE: - { - QList<TaskAmmFim> listTasks = providerDBLMS->GetListTasksAMMofTrainee(id); - - arrayAnswer = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasks, id); - client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE); - - break; - } - - case TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE: - { - int id_new; - id_new = providerDBLMS->newTaskFIM(*(TaskAmmFim*)data, id); - - if(id_new) - {//Отправка списка задач FIM клиенту Юнити - QString login = providerDBLMS->getLoginTraineeById(id); - //Проходим все открытые сокеты, ищем нужный - foreach(int idSocket, server->getClientsMap().keys()) - { - ClientHandler *handler = server->getClientsMap().value(idSocket); - if(handler->getClient()->getLogin() == login) - { - if(handler->getClient()->getIsUnity()) - {//Отправляем ему - //FIM - QList<TaskAmmFim> listTasksFIM = providerDBLMS->GetListTasksFIMofTrainee(id); - QByteArray arrayAnswerFIM = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasksFIM, id); - handler->sendXmlAnswer(arrayAnswerFIM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE); - } - } - } - } - - /* - if(id_new) - { - (*(TaskAmmFim*)data).setID(id_new); - providerDBLMS->editTaskFIM(*(TaskAmmFim*)data); - } - */ - //emit sigTasksChanged(); - //break; - } - - case TypeQueryToDB::TYPE_QUERY_GET_TASKS_FIM_FOR_TRAINEE: - { - QList<TaskAmmFim> listTasks = providerDBLMS->GetListTasksFIMofTrainee(id); - - arrayAnswer = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasks, id); - client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE); - - break; - } - - case TypeQueryToDB::TYPE_QUERY_DELETE_TASK_AMM_TO_TRAINEE: - { - int id_trainee = providerDBLMS->delTaskAMM(id); - if(id_trainee) - { - QList<TaskAmmFim> listTasks = providerDBLMS->GetListTasksAMMofTrainee(id_trainee); - arrayAnswer = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasks, id_trainee); - client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE); + //Отправка списка задач AMM клиенту GUI + sendListTasksAMMofTraineetoClient(client, id); //Отправка списка задач AMM клиенту Юнити - QString login = providerDBLMS->getLoginTraineeById(id_trainee); - //Проходим все открытые сокеты, ищем нужный - foreach(int idSocket, server->getClientsMap().keys()) - { - ClientHandler *handler = server->getClientsMap().value(idSocket); - if(handler->getClient()->getLogin() == login) - { - if(handler->getClient()->getIsUnity()) - {//Отправляем ему - //AMM - QList<TaskAmmFim> listTasksAMM = providerDBLMS->GetListTasksAMMofTrainee(id_trainee); - QByteArray arrayAnswerTasksAMM = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasksAMM, id_trainee); - handler->sendXmlAnswer(arrayAnswerTasksAMM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE); - } - } + if(ClientHandler* handler = getUnityClientById(id)) + {//Есть такой + sendListTasksAMMofTraineetoClient(handler, id); + } + } + break; + } + case TypeQueryToDB::TYPE_QUERY_ASSIGN_TASK_FIM_TO_TRAINEE: + { + if(int id_new = providerDBLMS->newTaskFIM(*(TaskAmmFim*)data, id)) + { + //Отправка списка задач FIM клиенту GUI + sendListTasksFIMofTraineetoClient(client, id); + + //Отправка списка задач FIM клиенту Юнити + if(ClientHandler* handler = getUnityClientById(id)) + {//Есть такой + sendListTasksFIMofTraineetoClient(handler, id); } } break; } - case TypeQueryToDB::TYPE_QUERY_DELETE_TASK_FIM_TO_TRAINEE: + case TypeQueryToDB::TYPE_QUERY_GET_TASKS_AMM_FOR_TRAINEE: { - int id_trainee = providerDBLMS->delTaskFIM(id); - if(id_trainee) - { - QList<TaskAmmFim> listTasks = providerDBLMS->GetListTasksFIMofTrainee(id_trainee); - arrayAnswer = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasks, id_trainee); - client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE); + //Отправка списка задач AMM клиенту GUI + sendListTasksAMMofTraineetoClient(client, id); + break; + } + case TypeQueryToDB::TYPE_QUERY_GET_TASKS_FIM_FOR_TRAINEE: + { + //Отправка списка задач FIM клиенту GUI + sendListTasksFIMofTraineetoClient(client, id); + break; + } - //Отправка списка задач FIM клиенту Юнити - QString login = providerDBLMS->getLoginTraineeById(id_trainee); - //Проходим все открытые сокеты, ищем нужный - foreach(int idSocket, server->getClientsMap().keys()) - { - ClientHandler *handler = server->getClientsMap().value(idSocket); - if(handler->getClient()->getLogin() == login) - { - if(handler->getClient()->getIsUnity()) - {//Отправляем ему - //FIM - QList<TaskAmmFim> listTasksFIM = providerDBLMS->GetListTasksFIMofTrainee(id_trainee); - QByteArray arrayAnswerTasksFIM = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasksFIM, id_trainee); - handler->sendXmlAnswer(arrayAnswerTasksFIM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE); - } - } + case TypeQueryToDB::TYPE_QUERY_DEL_TASK_AMM_TO_TRAINEE: + { + if(int id_trainee = providerDBLMS->delTaskAMM(id)) + { + //Отправка списка задач AMM клиенту GUI + sendListTasksAMMofTraineetoClient(client, id_trainee); + + //Отправка списка задач AMM клиенту Юнити + if(ClientHandler* handler = getUnityClientById(id_trainee)) + {//Есть такой + sendListTasksAMMofTraineetoClient(handler, id_trainee); } } break; } + case TypeQueryToDB::TYPE_QUERY_DEL_TASK_FIM_TO_TRAINEE: + { + if(int id_trainee = providerDBLMS->delTaskFIM(id)) + { + //Отправка списка задач FIM клиенту GUI + sendListTasksFIMofTraineetoClient(client, id_trainee); + + //Отправка списка задач FIM клиенту Юнити + if(ClientHandler* handler = getUnityClientById(id_trainee)) + {//Есть такой + sendListTasksFIMofTraineetoClient(handler, id_trainee); + } + } + break; + } } - - //client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_DB_LIST_INSTRUCTORS); - - //QString str = QString(arrayAnswer); - //logger->addTextToLogger("To Client: " + str); } void ProcessingSystem::processingClientQueryTasksXML(ClientHandler *client, ClientQueryTasksXML clientQueryTasksXML) @@ -500,5 +419,38 @@ void ProcessingSystem::setCurrentDataInfo(DataInfo *dataInfo) emit sigSetData(dataInfo); } +void ProcessingSystem::sendListTasksAMMofTraineetoClient(ClientHandler *client, int id_trainee) +{ + QList<TaskAmmFim> listTasks = providerDBLMS->GetListTasksAMMofTrainee(id_trainee); + QByteArray arrayAnswer = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasks, id_trainee); + client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE); +} + +void ProcessingSystem::sendListTasksFIMofTraineetoClient(ClientHandler *client, int id_trainee) +{ + QList<TaskAmmFim> listTasks = providerDBLMS->GetListTasksFIMofTrainee(id_trainee); + QByteArray arrayAnswer = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasks, id_trainee); + client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE); +} + +ClientHandler *ProcessingSystem::getUnityClientById(int id) +{ + QString login = providerDBLMS->getLoginTraineeById(id); + + //Проходим все открытые сокеты, ищем нужный + foreach(int idSocket, server->getClientsMap().keys()) + { + ClientHandler *handler = server->getClientsMap().value(idSocket); + if(handler->getClient()->getLogin() == login) + { + if(handler->getClient()->getIsUnity()) + { + return handler; + } + } + } + return nullptr; +} + diff --git a/ServerLMS/Systems/processingsystem.h b/ServerLMS/Systems/processingsystem.h index d497eac..cb73318 100644 --- a/ServerLMS/Systems/processingsystem.h +++ b/ServerLMS/Systems/processingsystem.h @@ -39,6 +39,10 @@ public: void processingClientNotify(ClientHandler *client, ClientNotify clientNotify); void setCurrentDataInfo(DataInfo *dataInfo); + + void sendListTasksAMMofTraineetoClient(ClientHandler* client, int id_trainee); + void sendListTasksFIMofTraineetoClient(ClientHandler* client, int id_trainee); + ClientHandler* getUnityClientById(int id); signals: void sigUpdateListClients(); void sigListsInstructorsTraineesChanged(); From d42f784403100f96d930749bff4cd7dda80aabf2 Mon Sep 17 00:00:00 2001 From: krivoshein <krivoshein@msk.dinamika-avia.ru> Date: Tue, 25 Mar 2025 17:49:05 +0300 Subject: [PATCH 74/77] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/resources.qrc | 1 + .../resources/icons/delete.png | Bin 0 -> 9396 bytes .../tasks/ammtaskswidget.cpp | 2 + .../tasks/ammtaskswidget.ui | 44 +++++++++++++++--- .../tasks/fimtaskswidget.cpp | 2 + .../tasks/fimtaskswidget.ui | 44 +++++++++++++++--- 6 files changed, 81 insertions(+), 12 deletions(-) create mode 100644 InstructorsAndTrainees/resources/icons/delete.png diff --git a/InstructorsAndTrainees/resources.qrc b/InstructorsAndTrainees/resources.qrc index 4417e39..8dcfa09 100644 --- a/InstructorsAndTrainees/resources.qrc +++ b/InstructorsAndTrainees/resources.qrc @@ -42,5 +42,6 @@ <file>resources/icons/malfunction.png</file> <file>resources/icons/762.gif</file> <file>resources/icons/assignTask.png</file> + <file>resources/icons/delete.png</file> </qresource> </RCC> diff --git a/InstructorsAndTrainees/resources/icons/delete.png b/InstructorsAndTrainees/resources/icons/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..1abb5deb690f7da166c1600e773cb1e6efc04278 GIT binary patch literal 9396 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 literal 0 HcmV?d00001 diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index 51da65e..110c211 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -54,6 +54,8 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty ui->btnDelete->setEnabled(false); if(type == TypeList::listCommon) ui->btnDelete->setVisible(false); + + ui->btnDelete->setObjectName("btnDelete"); } AMMtasksWidget::~AMMtasksWidget() diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.ui b/InstructorsAndTrainees/tasks/ammtaskswidget.ui index fe61646..7ae0b02 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.ui +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.ui @@ -26,16 +26,48 @@ <layout class="QHBoxLayout" name="horizontalLayout_1"/> </item> <item> - <widget class="QToolButton" name="btnDelete"> - <property name="text"> - <string>Delete</string> - </property> - </widget> + <layout class="QVBoxLayout" name="verticalLayout"> + <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> + <item> + <widget class="QToolButton" name="btnDelete"> + <property name="text"> + <string>Delete</string> + </property> + <property name="icon"> + <iconset resource="../resources.qrc"> + <normaloff>:/resources/icons/delete.png</normaloff>:/resources/icons/delete.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/> + <resources> + <include location="../resources.qrc"/> + </resources> <connections/> </ui> diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index 9cdf4b0..d087fde 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -45,6 +45,8 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty ui->btnDelete->setEnabled(false); if(type == TypeList::listCommon) ui->btnDelete->setVisible(false); + + ui->btnDelete->setObjectName("btnDelete"); } FIMtasksWidget::~FIMtasksWidget() diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.ui b/InstructorsAndTrainees/tasks/fimtaskswidget.ui index c5d9089..03e934d 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.ui +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.ui @@ -20,16 +20,48 @@ <layout class="QHBoxLayout" name="horizontalLayout_1"/> </item> <item> - <widget class="QToolButton" name="btnDelete"> - <property name="text"> - <string>Delete</string> - </property> - </widget> + <layout class="QVBoxLayout" name="verticalLayout"> + <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> + <item> + <widget class="QToolButton" name="btnDelete"> + <property name="text"> + <string>Delete</string> + </property> + <property name="icon"> + <iconset resource="../resources.qrc"> + <normaloff>:/resources/icons/delete.png</normaloff>:/resources/icons/delete.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/> + <resources> + <include location="../resources.qrc"/> + </resources> <connections/> </ui> From 1e39c57cca61fdb1211a87295f068687c209d3ff Mon Sep 17 00:00:00 2001 From: krivoshein <krivoshein@msk.dinamika-avia.ru> Date: Wed, 26 Mar 2025 10:19:58 +0300 Subject: [PATCH 75/77] =?UTF-8?q?=D0=A1=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20=D0=BF=D0=BE=D0=BA=D0=B0=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=87=D0=B8=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tasks/ammtaskswidget.cpp | 3 +- .../tasks/fimtaskswidget.cpp | 3 +- ServerLMS/Data/PacketType.h | 4 +-- ServerLMS/Systems/processingsystem.cpp | 29 ++++++++++--------- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index 110c211..3525353 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -51,11 +51,10 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty waitAnimationWidget->moveToThread(threadAnimation); threadAnimation->start(); + ui->btnDelete->setObjectName("btnDelete"); ui->btnDelete->setEnabled(false); if(type == TypeList::listCommon) ui->btnDelete->setVisible(false); - - ui->btnDelete->setObjectName("btnDelete"); } AMMtasksWidget::~AMMtasksWidget() diff --git a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp index d087fde..f832f3c 100644 --- a/InstructorsAndTrainees/tasks/fimtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/fimtaskswidget.cpp @@ -42,11 +42,10 @@ FIMtasksWidget::FIMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty waitAnimationWidget->moveToThread(threadAnimation); threadAnimation->start(); + ui->btnDelete->setObjectName("btnDelete"); ui->btnDelete->setEnabled(false); if(type == TypeList::listCommon) ui->btnDelete->setVisible(false); - - ui->btnDelete->setObjectName("btnDelete"); } FIMtasksWidget::~FIMtasksWidget() diff --git a/ServerLMS/Data/PacketType.h b/ServerLMS/Data/PacketType.h index 67f64c3..3b1929d 100644 --- a/ServerLMS/Data/PacketType.h +++ b/ServerLMS/Data/PacketType.h @@ -27,8 +27,8 @@ enum PacketType TYPE_XMLANSWER_QUERY_DB__LIST_COMPUTERS = 103, TYPE_XMLANSWER_QUERY_DB__LIST_CLASSROOMS = 104, - TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE = 106, - TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE = 107, + TYPE_XMLANSWER_QUERY_TASKS_AMM_OF_TRAINEE = 106, + TYPE_XMLANSWER_QUERY_TASKS_FIM_OF_TRAINEE = 107, //xml-ответы на запросы AdditionalFiles TYPE_XMLANSWER_QUERY_TASKS_XML_FIM = 130, diff --git a/ServerLMS/Systems/processingsystem.cpp b/ServerLMS/Systems/processingsystem.cpp index 6b0be10..f37dd50 100644 --- a/ServerLMS/Systems/processingsystem.cpp +++ b/ServerLMS/Systems/processingsystem.cpp @@ -95,12 +95,12 @@ void ProcessingSystem::processingClientAutorization(ClientHandler *client, Clien //AMM QList<TaskAmmFim> listTasksAMM = providerDBLMS->GetListTasksAMMofTrainee(id_trainee); QByteArray arrayAnswerTasksAMM = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasksAMM, id_trainee); - client->sendXmlAnswer(arrayAnswerTasksAMM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE); + client->sendXmlAnswer(arrayAnswerTasksAMM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_OF_TRAINEE); //FIM QList<TaskAmmFim> listTasksFIM = providerDBLMS->GetListTasksFIMofTrainee(id_trainee); QByteArray arrayAnswerFIM = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasksFIM, id_trainee); - client->sendXmlAnswer(arrayAnswerFIM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE); + client->sendXmlAnswer(arrayAnswerFIM, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_OF_TRAINEE); } QString str = QString(arrayAnswer); @@ -157,9 +157,8 @@ void ProcessingSystem::processingClientDeAutorization(ClientHandler *client, Cli void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQueryToDB clientQueryToDB, int id, void* data) { - QByteArray arrayAnswer; - qDebug() << "ProcessingQueryThread " << QThread::currentThreadId(); + switch (clientQueryToDB.typeQuery) { case TypeQueryToDB::TYPE_QUERY_GET_ALL_LISTS: @@ -168,6 +167,8 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu QList<Trainee> listTrainees = providerDBLMS->GetListAllTrainees(); QList<Group> listGroups = providerDBLMS->GetListAllGroups(); + QByteArray arrayAnswer; + arrayAnswer = dataParser->DbAnswer()->listInstructors(true, &listInstructors); client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_DB__LIST_INSTRUCTORS); @@ -261,9 +262,9 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu sendListTasksAMMofTraineetoClient(client, id); //Отправка списка задач AMM клиенту Юнити - if(ClientHandler* handler = getUnityClientById(id)) + if(ClientHandler* clientUnity = getUnityClientById(id)) {//Есть такой - sendListTasksAMMofTraineetoClient(handler, id); + sendListTasksAMMofTraineetoClient(clientUnity, id); } } break; @@ -276,9 +277,9 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu sendListTasksFIMofTraineetoClient(client, id); //Отправка списка задач FIM клиенту Юнити - if(ClientHandler* handler = getUnityClientById(id)) + if(ClientHandler* clientUnity = getUnityClientById(id)) {//Есть такой - sendListTasksFIMofTraineetoClient(handler, id); + sendListTasksFIMofTraineetoClient(clientUnity, id); } } break; @@ -305,9 +306,9 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu sendListTasksAMMofTraineetoClient(client, id_trainee); //Отправка списка задач AMM клиенту Юнити - if(ClientHandler* handler = getUnityClientById(id_trainee)) + if(ClientHandler* clientUnity = getUnityClientById(id_trainee)) {//Есть такой - sendListTasksAMMofTraineetoClient(handler, id_trainee); + sendListTasksAMMofTraineetoClient(clientUnity, id_trainee); } } break; @@ -320,9 +321,9 @@ void ProcessingSystem::processingClientQueryToDB(ClientHandler *client, ClientQu sendListTasksFIMofTraineetoClient(client, id_trainee); //Отправка списка задач FIM клиенту Юнити - if(ClientHandler* handler = getUnityClientById(id_trainee)) + if(ClientHandler* clientUnity = getUnityClientById(id_trainee)) {//Есть такой - sendListTasksFIMofTraineetoClient(handler, id_trainee); + sendListTasksFIMofTraineetoClient(clientUnity, id_trainee); } } break; @@ -423,14 +424,14 @@ void ProcessingSystem::sendListTasksAMMofTraineetoClient(ClientHandler *client, { QList<TaskAmmFim> listTasks = providerDBLMS->GetListTasksAMMofTrainee(id_trainee); QByteArray arrayAnswer = dataParser->DbAnswer()->listTasksAMMofTrainee(true, &listTasks, id_trainee); - client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_FOR_TRAINEE); + client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_AMM_OF_TRAINEE); } void ProcessingSystem::sendListTasksFIMofTraineetoClient(ClientHandler *client, int id_trainee) { QList<TaskAmmFim> listTasks = providerDBLMS->GetListTasksFIMofTrainee(id_trainee); QByteArray arrayAnswer = dataParser->DbAnswer()->listTasksFIMofTrainee(true, &listTasks, id_trainee); - client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_FOR_TRAINEE); + client->sendXmlAnswer(arrayAnswer, PacketType::TYPE_XMLANSWER_QUERY_TASKS_FIM_OF_TRAINEE); } ClientHandler *ProcessingSystem::getUnityClientById(int id) From 3e8fa010e39834ec235caf7cce326f11395b982c Mon Sep 17 00:00:00 2001 From: krivoshein <krivoshein@msk.dinamika-avia.ru> Date: Tue, 1 Apr 2025 11:12:40 +0300 Subject: [PATCH 76/77] =?UTF-8?q?=D0=9C=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GUIdataBaseLMS/mainwindow.cpp | 2 ++ InstructorsAndTrainees/instructorsandtraineeswidget.cpp | 3 +++ InstructorsAndTrainees/messanger/messangerwidget.cpp | 6 +++++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/GUIdataBaseLMS/mainwindow.cpp b/GUIdataBaseLMS/mainwindow.cpp index 5ba4ac0..a71b858 100644 --- a/GUIdataBaseLMS/mainwindow.cpp +++ b/GUIdataBaseLMS/mainwindow.cpp @@ -12,6 +12,8 @@ MainWindow::MainWindow(QWidget *parent) { ui->setupUi(this); + this->setWindowTitle(tr("Learning management system (LMS)")); + //Задаём два пункта с текстом локалей в комбобоксе ui->cmbLanguage->addItems(QStringList() << "English" << "Русский"); diff --git a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp index 0deea32..de9ce81 100644 --- a/InstructorsAndTrainees/instructorsandtraineeswidget.cpp +++ b/InstructorsAndTrainees/instructorsandtraineeswidget.cpp @@ -20,6 +20,9 @@ InstructorsAndTraineesWidget::InstructorsAndTraineesWidget(QWidget *parent) : ui->setupUi(this); ui->btnUpdateStyleSheet->setObjectName("btnUpdateStyleSheet"); + #ifndef PROJECT_TYPE_DEBUG + ui->btnUpdateStyleSheet->setVisible(false); + #endif qRegisterMetaType<PacketType>("PacketType"); qRegisterMetaType<QList<Instructor>>("QList<Instructor>"); diff --git a/InstructorsAndTrainees/messanger/messangerwidget.cpp b/InstructorsAndTrainees/messanger/messangerwidget.cpp index bead357..30c2bfe 100644 --- a/InstructorsAndTrainees/messanger/messangerwidget.cpp +++ b/InstructorsAndTrainees/messanger/messangerwidget.cpp @@ -19,8 +19,8 @@ MessangerWidget::MessangerWidget(QWidget *parent) : ui->tabWidget->removeTab(0); ui->btnSend->setObjectName("btnSend"); - ui->btnSend->setEnabled(false); + ui->editMsg->setEnabled(false); } MessangerWidget::~MessangerWidget() @@ -58,6 +58,7 @@ void MessangerWidget::addTabDialogMessenger(Trainee trainee) currLogin = trainee.getLogin(); emit signal_tabMessengerChanged(currLogin); ui->btnSend->setEnabled(true); + ui->editMsg->setEnabled(true); } //Проверяем наличие диалога с этим клиентом @@ -136,6 +137,7 @@ int MessangerWidget::getIndexTab(QString login) void MessangerWidget::clear() { ui->btnSend->setEnabled(false); + ui->editMsg->setEnabled(false); listTrainees.clear(); actualizationTabsDialogMessenger(); } @@ -187,10 +189,12 @@ void MessangerWidget::slot_traineeSelected(QString 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) From 910acdc87f49c773ea43f6079df2ea01459ea187 Mon Sep 17 00:00:00 2001 From: krivoshein <krivoshein@msk.dinamika-avia.ru> Date: Wed, 2 Apr 2025 14:46:33 +0300 Subject: [PATCH 77/77] =?UTF-8?q?=D0=A4=D0=B8=D0=BB=D1=8C=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=90=D0=9C=D0=9C=20=D0=BC=D0=B5?= =?UTF-8?q?=D0=B4=D0=BB=D0=B5=D0=BD=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InstructorsAndTrainees/resources.qrc | 1 + .../resources/icons/filter.png | Bin 0 -> 9147 bytes .../tasks/ammtaskswidget.cpp | 28 ++++++++++++-- InstructorsAndTrainees/tasks/ammtaskswidget.h | 10 ++++- .../tasks/ammtaskswidget.ui | 35 ++++++++++++++++++ InstructorsAndTrainees/tasks/module.cpp | 16 +++++++- InstructorsAndTrainees/tasks/module.h | 8 +++- .../tasks/tasktreepreparation.cpp | 16 +++++--- .../tasks/tasktreepreparation.h | 4 +- 9 files changed, 102 insertions(+), 16 deletions(-) create mode 100644 InstructorsAndTrainees/resources/icons/filter.png diff --git a/InstructorsAndTrainees/resources.qrc b/InstructorsAndTrainees/resources.qrc index 8dcfa09..d2a1133 100644 --- a/InstructorsAndTrainees/resources.qrc +++ b/InstructorsAndTrainees/resources.qrc @@ -43,5 +43,6 @@ <file>resources/icons/762.gif</file> <file>resources/icons/assignTask.png</file> <file>resources/icons/delete.png</file> + <file>resources/icons/filter.png</file> </qresource> </RCC> diff --git a/InstructorsAndTrainees/resources/icons/filter.png b/InstructorsAndTrainees/resources/icons/filter.png new file mode 100644 index 0000000000000000000000000000000000000000..7f4e679d17771b4aa9492804474dd7e0af0d6bc5 GIT binary patch literal 9147 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 literal 0 HcmV?d00001 diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp index 3525353..0c93034 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.cpp +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.cpp @@ -19,7 +19,8 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty threadAnimation(nullptr), taskTreePreparation(nullptr), waitAnimationWidget(nullptr), - accessAssignTask(false) + accessAssignTask(false), + flOnlyActive(false) { ui->setupUi(this); @@ -55,6 +56,8 @@ AMMtasksWidget::AMMtasksWidget(ConnectorToServer* connectorToServer, TypeList ty ui->btnDelete->setEnabled(false); if(type == TypeList::listCommon) ui->btnDelete->setVisible(false); + else + ui->btnOnlyActive->setVisible(false); } AMMtasksWidget::~AMMtasksWidget() @@ -186,16 +189,17 @@ void AMMtasksWidget::slot_UpdateTasksAMMforTrainee(int trainee_id) } } -void AMMtasksWidget::loadTasksAMM() +void AMMtasksWidget::loadTasksAMM(bool flRequestFromDB) { //Обновление дерева treeWidget->clear(); waitAnimationWidget->showWithPlay(); - QByteArray array = connectorToServer->getListTaskAmmArray(); + if(flRequestFromDB) + /*QByteArray array*/arrayAMM = connectorToServer->getListTaskAmmArray(); - signal_prepareListItems(array, &listAllModules); + emit signal_prepareListItems(/*array*/arrayAMM, &listAllModules, flOnlyActive); } void AMMtasksWidget::slot_listItemsReady(QList<QTreeWidgetItem *> listItems) @@ -306,3 +310,19 @@ void AMMtasksWidget::on_btnDelete_clicked() } } } + +void AMMtasksWidget::on_btnOnlyActive_clicked() +{ + if(ui->btnOnlyActive->isChecked()) + { + flOnlyActive = true; + //slot_listItemsReady(listItemsALL, listItemsACTIVE); + } + else + { + flOnlyActive = false; + //slot_listItemsReady(listItemsALL, listItemsACTIVE); + } + //connectorToServer->sendQueryTasksXML("amm"); + loadTasksAMM(false); +} diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.h b/InstructorsAndTrainees/tasks/ammtaskswidget.h index ede4bf9..10f3232 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.h +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.h @@ -50,6 +50,8 @@ private Q_SLOTS: void on_btnDelete_clicked(); + void on_btnOnlyActive_clicked(); + public Q_SLOTS: void slot_AssignTaskAMMtoTrainee(); @@ -68,10 +70,10 @@ private: Module* searchModuleByID(int id); void preparationTreeWidget(); void reSetHeadTreeWidget(); - void loadTasksAMM(); + void loadTasksAMM(bool flRequestFromDB = true); Q_SIGNALS: - void signal_prepareListItems(QByteArray array, QList<Module*>* listAllModules); + void signal_prepareListItems(QByteArray array, QList<Module*>* listAllModules, bool flOnlyActive); void signal_prepareListItemsForTrainee(QList<TaskAmmFim> listTask, QList<Module*>* listAllModules); public Q_SLOTS: void slot_listItemsReady(QList<QTreeWidgetItem*> listItems); @@ -92,6 +94,10 @@ private: TaskTreePreparation* taskTreePreparation; WaitAnimationWidget *waitAnimationWidget; bool accessAssignTask; + + bool flOnlyActive; + + QByteArray arrayAMM; }; #endif // AMMTASKSWIDGET_H diff --git a/InstructorsAndTrainees/tasks/ammtaskswidget.ui b/InstructorsAndTrainees/tasks/ammtaskswidget.ui index 7ae0b02..9d5f36d 100644 --- a/InstructorsAndTrainees/tasks/ammtaskswidget.ui +++ b/InstructorsAndTrainees/tasks/ammtaskswidget.ui @@ -40,8 +40,43 @@ </property> </spacer> </item> + <item> + <widget class="QToolButton" name="btnOnlyActive"> + <property name="minimumSize"> + <size> + <width>50</width> + <height>50</height> + </size> + </property> + <property name="text"> + <string>Active</string> + </property> + <property name="icon"> + <iconset resource="../resources.qrc"> + <normaloff>:/resources/icons/filter.png</normaloff>:/resources/icons/filter.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="QToolButton" name="btnDelete"> + <property name="minimumSize"> + <size> + <width>50</width> + <height>50</height> + </size> + </property> <property name="text"> <string>Delete</string> </property> diff --git a/InstructorsAndTrainees/tasks/module.cpp b/InstructorsAndTrainees/tasks/module.cpp index c7c5c32..6a7e716 100644 --- a/InstructorsAndTrainees/tasks/module.cpp +++ b/InstructorsAndTrainees/tasks/module.cpp @@ -5,7 +5,8 @@ int Module::lastID = 0; Module::Module(): type (ModuleType::TYPE_PM), parentModule(nullptr), - ID(0) + ID(0), + isActive(false) { ID = ++lastID; } @@ -38,6 +39,19 @@ Module *Module::getModuleByID(int id) return nullptr; } +void Module::setIsActiveTrue() +{ + this->isActive = true; + + if(parentModule) + parentModule->setIsActiveTrue(); +} + +bool Module::getIsActive() +{ + return this->isActive; +} + PM::PM(): diff --git a/InstructorsAndTrainees/tasks/module.h b/InstructorsAndTrainees/tasks/module.h index 3c5ca8e..009a328 100644 --- a/InstructorsAndTrainees/tasks/module.h +++ b/InstructorsAndTrainees/tasks/module.h @@ -20,11 +20,15 @@ public: void setParentModule(Module* parentModule){ this->parentModule = parentModule; }; Module* getModuleByID(int id); + void setIsActiveTrue(); + bool getIsActive(); + protected: ModuleType type; Module* parentModule; int ID; static int lastID; + bool isActive; }; @@ -47,7 +51,7 @@ public: void setLangStructEng(QString title); void addChildModule(Module* childModule); QList<Module*> getListChildModules(); - QString pmCode(); + QString pmCode(); private: QString modelIdentCode; @@ -106,7 +110,7 @@ private: QString disassyCodeVariant; QString infoCode; QString infoCodeVariant; - QString itemLocationCode; + QString itemLocationCode; dmLangStruct langRus; dmLangStruct langEng; diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp index cf93f37..c7980c9 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.cpp +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.cpp @@ -21,13 +21,16 @@ void TaskTreePreparation::stopParser() flagStop = true; } -QTreeWidgetItem *TaskTreePreparation::addModuleToTreeWidget(Module *module, QTreeWidgetItem *parentItem) +QTreeWidgetItem *TaskTreePreparation::addModuleToTreeWidget(Module *module, bool flOnlyActive, QTreeWidgetItem *parentItem) { QTreeWidgetItem* itemModule = nullptr; if(flagStop) return itemModule; + if(flOnlyActive && !module->getIsActive()) + return nullptr; + QString text = ""; QString ID = QString::number(module->getID()); QString code = ""; @@ -45,7 +48,7 @@ QTreeWidgetItem *TaskTreePreparation::addModuleToTreeWidget(Module *module, QTre for(Module* module : PMmodul->getListChildModules()) { - addModuleToTreeWidget(module, itemModule); + addModuleToTreeWidget(module, flOnlyActive, itemModule); } } else @@ -158,6 +161,10 @@ void TaskTreePreparation::domElementParser(QDomElement element, Module* modulePa PM* PMmodulParent = static_cast<PM*>(moduleParent); PMmodulParent->addChildModule(module); } + + //Активность + if(nodeMap.namedItem("active").nodeValue() == "true") + module->setIsActiveTrue(); } else if(name == "rus" || name == "eng") { @@ -201,7 +208,7 @@ void TaskTreePreparation::domElementParser(QDomElement element, Module* modulePa }while (! (childElement = childElement.nextSiblingElement()).isNull()); } -void TaskTreePreparation::slot_prepareListItems(QByteArray array, QList<Module*>* listAllModules) +void TaskTreePreparation::slot_prepareListItems(QByteArray array, QList<Module*>* listAllModules, bool flOnlyActive) { qDebug() << "TaskTreePreparation::slot_prepareListItems thread ID " << QThread::currentThreadId(); @@ -213,7 +220,7 @@ void TaskTreePreparation::slot_prepareListItems(QByteArray array, QList<Module*> for(Module* module : *this->listAllModules) { - QTreeWidgetItem* item = addModuleToTreeWidget(module); + QTreeWidgetItem* item = addModuleToTreeWidget(module, flOnlyActive); listItems.append(item); } @@ -230,7 +237,6 @@ void TaskTreePreparation::slot_prepareListItemsForTrainee(QList<TaskAmmFim> list listItems.clear(); - for(TaskAmmFim task : listTask) { QTreeWidgetItem* item = nullptr; diff --git a/InstructorsAndTrainees/tasks/tasktreepreparation.h b/InstructorsAndTrainees/tasks/tasktreepreparation.h index 047da7a..8cb0847 100644 --- a/InstructorsAndTrainees/tasks/tasktreepreparation.h +++ b/InstructorsAndTrainees/tasks/tasktreepreparation.h @@ -25,13 +25,13 @@ public: void stopParser(); private: - QTreeWidgetItem* addModuleToTreeWidget(Module* module, QTreeWidgetItem* parentItem = nullptr); + QTreeWidgetItem* addModuleToTreeWidget(Module* module, bool flOnlyActive = false, QTreeWidgetItem* parentItem = nullptr); void loadAMMtasksFromXML(QByteArray array); void domElementParser(QDomElement element, Module* moduleParent); void deleteAllModuls(); public Q_SLOTS: - void slot_prepareListItems(QByteArray array, QList<Module*>* listAllModules); + void slot_prepareListItems(QByteArray array, QList<Module*>* listAllModules, bool flOnlyActive); void slot_prepareListItemsForTrainee(QList<TaskAmmFim> listTask, QList<Module*>* listAllModules); Q_SIGNALS: