mirror of
https://gitea.msk.dinamika-avia.ru/Constanta-Design/RRJServer.git
synced 2026-03-28 19:55:48 +03:00
567 lines
17 KiB
C++
567 lines
17 KiB
C++
#include <QMessageBox>
|
||
#include "editortrainees.h"
|
||
#include "ui_editortrainees.h"
|
||
#include "dialogeditgroup.h"
|
||
#include "dialogedittrainee.h"
|
||
#include "specialmessagebox.h"
|
||
|
||
EditorTrainees::EditorTrainees(ConnectorToServer* connectorToServer, bool adminMode, QWidget *parent) :
|
||
TraineesView(connectorToServer, CommonView::TypeView::control, parent),
|
||
ui(new Ui::EditorTrainees),
|
||
dlgEditTrainee(nullptr),
|
||
dlgEditGroup(nullptr),
|
||
specialMessageBox(nullptr)
|
||
{
|
||
ui->setupUi(this);
|
||
|
||
connect(treeWidget, &QTreeWidget::currentItemChanged, this, &EditorTrainees::on_treeWidgetCurrentItemChanged);
|
||
|
||
ui->verticalLayout_1->addWidget(treeWidget);
|
||
|
||
this->adminMode = adminMode;
|
||
|
||
preparationTreeWidget();
|
||
//setNotLoggedInVisible(true);
|
||
loadTraineesFromDB();
|
||
|
||
if(adminMode)
|
||
ui->btnArchive->click();
|
||
|
||
waitAnimationWidget->setParent(this);
|
||
|
||
ui->btnNewGroup->setEnabled(true);
|
||
ui->btnDeleteGroup->setEnabled(false);
|
||
ui->btnNewTrainee->setEnabled(false);
|
||
ui->btnDeleteTrainee->setEnabled(false);
|
||
ui->btnToOrFromArchiveTrainee->setEnabled(false);
|
||
ui->btnEdit->setEnabled(false);
|
||
|
||
authComplited = true;
|
||
}
|
||
|
||
EditorTrainees::~EditorTrainees()
|
||
{
|
||
if(dlgEditTrainee)
|
||
{
|
||
dlgEditTrainee->close();
|
||
delete dlgEditTrainee;
|
||
dlgEditTrainee = nullptr;
|
||
}
|
||
|
||
if(dlgEditGroup)
|
||
{
|
||
dlgEditGroup->close();
|
||
delete dlgEditGroup;
|
||
dlgEditGroup = nullptr;
|
||
}
|
||
|
||
//SpecMsgBox::CloseAndDelete(specialMessageBox);
|
||
|
||
delete ui;
|
||
}
|
||
|
||
void EditorTrainees::closeEvent(QCloseEvent *event)
|
||
{
|
||
if(dlgEditTrainee)
|
||
dlgEditTrainee->close();
|
||
|
||
if(dlgEditGroup)
|
||
dlgEditGroup->close();
|
||
|
||
//SpecMsgBox::CloseAndDelete(specialMessageBox);
|
||
}
|
||
|
||
void EditorTrainees::on_btnNewGroup_clicked()
|
||
{
|
||
Group group;
|
||
Group group_edit;
|
||
|
||
if(editGroup(group, &group_edit))
|
||
{
|
||
waitAnimationWidget->showWithPlay();
|
||
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_NEW_GROUP, 0, &group_edit);
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
void EditorTrainees::on_btnDeleteGroup_clicked()
|
||
{
|
||
QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem();
|
||
|
||
if(treeItemCurrent != nullptr)
|
||
{
|
||
QTreeWidgetItem *treeItemParent = treeItemCurrent->parent();
|
||
if(treeItemParent == nullptr)
|
||
{//Выбрана группа
|
||
int id_group = treeItemCurrent->text(ColumnsTreeUsers::clmn_ID).toInt();
|
||
|
||
if(connectorToServer->getListTraineesInGroup(id_group).count() > 0)
|
||
{
|
||
SpecMsgBox::CriticalClose(specialMessageBox, this, tr("The group is not empty.\nIt is not possible to delete a non-empty group."));
|
||
return;
|
||
}
|
||
else
|
||
{//Пустая группа
|
||
if(SpecMsgBox::WarningYesNo(specialMessageBox, this, tr("The deletion will be irrevocable.\nDelete it anyway?")) == QDialog::Accepted)
|
||
{
|
||
waitAnimationWidget->showWithPlay();
|
||
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_DEL_GROUP, id_group);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void EditorTrainees::on_btnNewTrainee_clicked()
|
||
{
|
||
QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem();
|
||
|
||
if(treeItemCurrent != nullptr)
|
||
{
|
||
QTreeWidgetItem *treeItemParent = treeItemCurrent->parent();
|
||
if(treeItemParent == nullptr)
|
||
{//Выбрана группа. Можно добавить Обучаемого
|
||
int id_group = treeItemCurrent->text(ColumnsTreeUsers::clmn_ID).toInt();
|
||
|
||
Trainee trainee;
|
||
Trainee trainee_edit;
|
||
|
||
trainee.setNeedSetPassword(true);
|
||
|
||
if(editTrainee(trainee, &trainee_edit))
|
||
{
|
||
waitAnimationWidget->showWithPlay();
|
||
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_NEW_TRAINEE, id_group, &trainee_edit);
|
||
}
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
|
||
void EditorTrainees::on_btnDeleteTrainee_clicked()
|
||
{
|
||
QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem();
|
||
|
||
if(treeItemCurrent != nullptr)
|
||
{
|
||
QTreeWidgetItem *treeItemParent = treeItemCurrent->parent();
|
||
if(treeItemParent != nullptr)
|
||
{//Выбран обучаемый
|
||
|
||
int id_trainee = treeItemCurrent->text(ColumnsTreeUsers::clmn_ID).toInt();
|
||
int id_group = treeItemParent->text(ColumnsTreeUsers::clmn_ID).toInt();
|
||
|
||
if(connectorToServer->isLoggedInTrainee(id_trainee))
|
||
{//Обучаемый залогирован!
|
||
SpecMsgBox::CriticalClose(specialMessageBox, this, tr("You cannot delete a logged-in trainee."));
|
||
return;
|
||
}
|
||
|
||
if(SpecMsgBox::WarningYesNo(specialMessageBox, this, tr("The deletion will be irrevocable.\nDelete it anyway?")) == QDialog::Accepted)
|
||
{
|
||
waitAnimationWidget->showWithPlay();
|
||
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_DEL_TRAINEE, id_trainee);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void EditorTrainees::on_btnToOrFromArchiveTrainee_clicked()
|
||
{
|
||
QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem();
|
||
|
||
if(treeItemCurrent != nullptr)
|
||
{
|
||
QTreeWidgetItem *treeItemParent = treeItemCurrent->parent();
|
||
if(treeItemParent != nullptr)
|
||
{//Выбран обучаемый
|
||
|
||
int id_trainee = treeItemCurrent->text(ColumnsTreeUsers::clmn_ID).toInt();
|
||
|
||
Trainee trainee = connectorToServer->getTrainee(id_trainee);
|
||
if(trainee.getID() == 0)
|
||
return;
|
||
|
||
if(connectorToServer->isArchivedTrainee(id_trainee))
|
||
{//Архивный
|
||
trainee.setArchived(false);
|
||
waitAnimationWidget->showWithPlay();
|
||
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_EDIT_TRAINEE, id_trainee, &trainee);
|
||
}
|
||
else
|
||
{//Не Архивный
|
||
if(connectorToServer->isLoggedInTrainee(id_trainee))
|
||
{//Обучаемый залогирован!
|
||
SpecMsgBox::CriticalClose(specialMessageBox, this, tr("You cannot archive a logged-in trainee."));
|
||
return;
|
||
}
|
||
|
||
trainee.setArchived(true);
|
||
waitAnimationWidget->showWithPlay();
|
||
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_EDIT_TRAINEE, id_trainee, &trainee);
|
||
if(!archiveVisible)
|
||
ui->btnArchive->click();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void EditorTrainees::on_btnEdit_clicked()
|
||
{
|
||
QTreeWidgetItem *treeItemCurrent = treeWidget->currentItem();
|
||
|
||
if(treeItemCurrent == nullptr)
|
||
return;
|
||
|
||
QTreeWidgetItem *treeItemParent = treeItemCurrent->parent();
|
||
if(treeItemParent == nullptr)
|
||
{//Выбрана группа
|
||
|
||
int id_group = treeItemCurrent->text(ColumnsTreeUsers::clmn_ID).toInt();
|
||
|
||
Group group = connectorToServer->getGroup(id_group);
|
||
if(group.getID() == 0)
|
||
return;
|
||
|
||
Group group_edit;
|
||
|
||
if(editGroup(group, &group_edit))
|
||
{
|
||
waitAnimationWidget->showWithPlay();
|
||
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_EDIT_GROUP, id_group, &group_edit);
|
||
}
|
||
}
|
||
else
|
||
{//Выбран обучаемый
|
||
|
||
int id_trainee = treeItemCurrent->text(ColumnsTreeUsers::clmn_ID).toInt();
|
||
|
||
if(connectorToServer->isLoggedInTrainee(id_trainee))
|
||
{//Обучаемый залогирован!
|
||
SpecMsgBox::CriticalClose(specialMessageBox, this, tr("You cannot edit a logged-in trainee."));
|
||
return;
|
||
}
|
||
|
||
Trainee trainee = connectorToServer->getTrainee(id_trainee);
|
||
if(trainee.getID() == 0)
|
||
return;
|
||
|
||
Trainee trainee_edit;
|
||
|
||
if(editTrainee(trainee, &trainee_edit))
|
||
{
|
||
waitAnimationWidget->showWithPlay();
|
||
connectorToServer->sendQueryToDB(TypeQueryToDB::TYPE_QUERY_EDIT_TRAINEE, id_trainee, &trainee_edit);
|
||
}
|
||
}
|
||
}
|
||
|
||
void EditorTrainees::on_btnArchive_clicked()
|
||
{
|
||
bool state = ui->btnArchive->isChecked();
|
||
setArchiveVisible(state);
|
||
if(!state)
|
||
{
|
||
if(typeObject == TypeObject::objTrainee)
|
||
{
|
||
Trainee trainee = connectorToServer->getTrainee(lastCurrentID);
|
||
if(trainee.getID())
|
||
{
|
||
if(trainee.getArchived())
|
||
{
|
||
lastCurrentID = 0;
|
||
typeObject = TypeObject::objGroup;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
lastCurrentID = 0;
|
||
typeObject = TypeObject::objGroup;
|
||
}
|
||
}
|
||
else if(typeObject == TypeObject::objGroup)
|
||
{
|
||
Group group = connectorToServer->getGroup(lastCurrentID);
|
||
if(group.getID())
|
||
{}
|
||
else
|
||
{
|
||
lastCurrentID = 0;
|
||
typeObject = TypeObject::objGroup;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
lastCurrentID = 0;
|
||
typeObject = TypeObject::objGroup;
|
||
}
|
||
}
|
||
loadTraineesFromDB();
|
||
}
|
||
|
||
void EditorTrainees::on_treeWidgetCurrentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
|
||
{
|
||
//Определяем доступность и функционал кнопок для выбранного элемента
|
||
|
||
if(current == nullptr)
|
||
{
|
||
ui->btnNewGroup->setEnabled(true);
|
||
ui->btnDeleteGroup->setEnabled(false);
|
||
ui->btnNewTrainee->setEnabled(false);
|
||
ui->btnDeleteTrainee->setEnabled(false);
|
||
ui->btnToOrFromArchiveTrainee->setEnabled(false);
|
||
ui->btnEdit->setEnabled(false);
|
||
return;
|
||
}
|
||
|
||
QTreeWidgetItem *treeItemParent = current->parent();
|
||
if(treeItemParent == nullptr)
|
||
{//Выбрана группа
|
||
int id_group = current->text(ColumnsTreeUsers::clmn_ID).toInt();
|
||
|
||
lastCurrentID = id_group;
|
||
typeObject = TypeObject::objGroup;
|
||
|
||
if(adminMode)
|
||
{
|
||
ui->btnNewGroup->setEnabled(true);
|
||
|
||
if(connectorToServer->getListTraineesInGroup(id_group).count() > 0)
|
||
{//Группа не пуста
|
||
ui->btnDeleteGroup->setEnabled(false);
|
||
}
|
||
else
|
||
{//Группа пуста
|
||
ui->btnDeleteGroup->setEnabled(true);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
ui->btnNewGroup->setEnabled(false);
|
||
ui->btnDeleteGroup->setEnabled(false);
|
||
}
|
||
|
||
ui->btnNewTrainee->setEnabled(true);
|
||
ui->btnDeleteTrainee->setEnabled(false);
|
||
ui->btnToOrFromArchiveTrainee->setEnabled(false);
|
||
ui->btnEdit->setEnabled(true);
|
||
ui->btnArchive->setEnabled(true);
|
||
|
||
ui->btnToOrFromArchiveTrainee->setText(tr("To archive"));
|
||
ui->btnToOrFromArchiveTrainee->setIcon(QIcon(QStringLiteral(":/resources/icons/traineeArchive.png")));
|
||
}
|
||
else
|
||
{//Выбран обучаемый
|
||
int id_trainee = current->text(ColumnsTreeUsers::clmn_ID).toInt();
|
||
|
||
lastCurrentID = id_trainee;
|
||
typeObject = TypeObject::objTrainee;
|
||
|
||
ui->btnNewGroup->setEnabled(false);
|
||
ui->btnDeleteGroup->setEnabled(false);
|
||
ui->btnNewTrainee->setEnabled(false);
|
||
|
||
if(connectorToServer->isArchivedTrainee(id_trainee))
|
||
{//Архивный
|
||
//ui->btnDeleteTrainee->setEnabled(true);
|
||
|
||
ui->btnToOrFromArchiveTrainee->setText(tr("From archive"));
|
||
ui->btnToOrFromArchiveTrainee->setIcon(QIcon(QStringLiteral(":/resources/icons/traineeFromArchive.png")));
|
||
}
|
||
else
|
||
{//Не Архивный
|
||
//ui->btnDeleteTrainee->setEnabled(false);
|
||
|
||
ui->btnToOrFromArchiveTrainee->setText(tr("To archive"));
|
||
ui->btnToOrFromArchiveTrainee->setIcon(QIcon(QStringLiteral(":/resources/icons/traineeArchive.png")));
|
||
}
|
||
|
||
if(connectorToServer->isLoggedInTrainee(id_trainee))
|
||
{//Это залогированный! Удалять/Архивировать/Редактировать нельзя!
|
||
ui->btnDeleteTrainee->setEnabled(false);
|
||
ui->btnToOrFromArchiveTrainee->setEnabled(false);
|
||
ui->btnEdit->setEnabled(false);
|
||
}
|
||
else
|
||
{
|
||
ui->btnToOrFromArchiveTrainee->setEnabled(true);
|
||
|
||
if(connectorToServer->isArchivedTrainee(id_trainee))
|
||
ui->btnDeleteTrainee->setEnabled(true);
|
||
else
|
||
ui->btnDeleteTrainee->setEnabled(false);
|
||
|
||
ui->btnEdit->setEnabled(true);
|
||
}
|
||
|
||
//ui->btnToOrFromArchiveTrainee->setEnabled(true);
|
||
|
||
//ui->btnEdit->setEnabled(true);
|
||
ui->btnArchive->setEnabled(true);
|
||
}
|
||
}
|
||
|
||
bool EditorTrainees::verifyGroup(Group group)
|
||
{
|
||
//Проверка корректности имени
|
||
|
||
if(group.getName() == QStringLiteral("<group>"))
|
||
{//Имя не корректно!
|
||
SpecMsgBox::CriticalClose(specialMessageBox, this, tr("Unacceptable group name has been entered.\nThe changes will not be accepted."));
|
||
return false;
|
||
}
|
||
|
||
QList<Group> listGroups = connectorToServer->getListGroups();
|
||
|
||
for(Group exist_group : listGroups)
|
||
{
|
||
if(group.getName() == exist_group.getName() && group.getID() != exist_group.getID())
|
||
{//Имя уже существует
|
||
SpecMsgBox::CriticalClose(specialMessageBox, this, tr("An existing group name has been entered.\nThe changes will not be accepted."));
|
||
return false;
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
bool EditorTrainees::verifyTrainee(Trainee trainee)
|
||
{
|
||
//Проверка корректности логина, имени, пароля
|
||
|
||
if(trainee.getName() == QStringLiteral("<name>"))
|
||
{//Имя не корректно!
|
||
SpecMsgBox::CriticalClose(specialMessageBox, this, tr("Unacceptable trainee name has been entered.\nThe changes will not be accepted."));
|
||
return false;
|
||
}
|
||
|
||
if(trainee.getLogin() == QStringLiteral("<login>"))
|
||
{//Логин не корректен!
|
||
SpecMsgBox::CriticalClose(specialMessageBox, this, tr("Unacceptable trainee login has been entered.\nThe changes will not be accepted."));
|
||
return false;
|
||
}
|
||
|
||
if(trainee.getPassword() == QStringLiteral("<password>"))
|
||
{//Пароль не корректный!
|
||
SpecMsgBox::CriticalClose(specialMessageBox, this, tr("Unacceptable trainee password has been entered.\nThe changes will not be accepted."));
|
||
return false;
|
||
}
|
||
|
||
|
||
int user_I = connectorToServer->getIdInstructorByLogin(trainee.getLogin());
|
||
int user_T = connectorToServer->getIdTraineeByLogin(trainee.getLogin());
|
||
if((user_I && (user_I != trainee.getID())) || (user_T && (user_T != trainee.getID())))
|
||
{//Логин уже существует!
|
||
SpecMsgBox::CriticalClose(specialMessageBox, this, tr("An existing instructor or trainee login has been entered.\nThe changes will not be accepted."));
|
||
return 0;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
bool EditorTrainees::editGroup(Group group, Group *group_edit)
|
||
{
|
||
dlgEditGroup = new DialogEditGroup(this);
|
||
dlgEditGroup->setWindowFlags(dlgEditGroup->windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
||
|
||
dlgEditGroup->setGroup(group);
|
||
|
||
bool flStop = false;
|
||
bool res = false;
|
||
|
||
while (!flStop)
|
||
{
|
||
switch( dlgEditGroup->exec() )
|
||
{
|
||
case QDialog::Accepted:
|
||
{
|
||
*group_edit = dlgEditGroup->getGroup();
|
||
|
||
if(! verifyGroup(*group_edit))
|
||
{
|
||
dlgEditGroup->setGroup(*group_edit);
|
||
continue;
|
||
}
|
||
|
||
flStop = true;
|
||
res = true;
|
||
break;
|
||
}
|
||
case QDialog::Rejected:
|
||
flStop = true;
|
||
res = false;
|
||
break;
|
||
default:
|
||
flStop = true;
|
||
res = false;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if(dlgEditGroup)
|
||
{
|
||
delete dlgEditGroup;
|
||
dlgEditGroup = nullptr;
|
||
}
|
||
|
||
return res;
|
||
}
|
||
|
||
bool EditorTrainees::editTrainee(Trainee trainee, Trainee *trainee_edit)
|
||
{
|
||
dlgEditTrainee = new DialogEditTrainee(adminMode, this);
|
||
dlgEditTrainee->setWindowFlags(dlgEditTrainee->windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
||
|
||
dlgEditTrainee->setTrainee(trainee);
|
||
|
||
bool flStop = false;
|
||
bool res = false;
|
||
|
||
while (!flStop)
|
||
{
|
||
switch( dlgEditTrainee->exec() )
|
||
{
|
||
case QDialog::Accepted:
|
||
{
|
||
*trainee_edit = dlgEditTrainee->getTrainee();
|
||
|
||
if(! verifyTrainee(*trainee_edit))
|
||
{
|
||
dlgEditTrainee->setTrainee(*trainee_edit);
|
||
continue;
|
||
}
|
||
|
||
if(trainee_edit->getNeedSetPassword())
|
||
{
|
||
//Хэшируем пароль
|
||
trainee_edit->hashingPassword();
|
||
trainee_edit->setNeedSetPassword(false);
|
||
}
|
||
|
||
flStop = true;
|
||
res = true;
|
||
break;
|
||
}
|
||
case QDialog::Rejected:
|
||
flStop = true;
|
||
res = false;
|
||
break;
|
||
default:
|
||
flStop = true;
|
||
res = false;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if(dlgEditTrainee)
|
||
{
|
||
delete dlgEditTrainee;
|
||
dlgEditTrainee = nullptr;
|
||
}
|
||
|
||
return res;
|
||
}
|
||
|
||
|