refs #720, allow to publish when there are errors, but some models pass validation

* return valid and invalid models
* return value "success" when there are any valid models
This commit is contained in:
Klaus Basan
2016-08-12 22:07:08 +02:00
committed by Mathew Sutcliffe
parent d10fe5ad18
commit da343d81c1
5 changed files with 43 additions and 38 deletions

View File

@@ -280,12 +280,12 @@ namespace BlackGui
void ps_onCustomContextMenu(const QPoint &point);
private:
QScopedPointer<Ui::CDbMappingComponent> ui;
QScopedPointer<CDbAutoStashingComponent> m_autoStashDialog; //!< dialog auto stashing
QScopedPointer<CDbModelMappingModifyComponent> m_modelModifyDialog; //!< dialog when modifying models
BlackMisc::Simulation::FsCommon::CVPilotRulesReader m_vPilotReader; //!< read vPilot rules
QScopedPointer<Ui::CDbMappingComponent> ui;
QScopedPointer<CDbAutoStashingComponent> m_autoStashDialog; //!< dialog auto stashing
QScopedPointer<CDbModelMappingModifyComponent> m_modelModifyDialog; //!< dialog when modifying models
BlackMisc::Simulation::FsCommon::CVPilotRulesReader m_vPilotReader; //!< read vPilot rules
BlackMisc::CData<BlackCore::Data::TAuthenticatedDbUser> m_swiftDbUser {this, &CDbMappingComponent::ps_userChanged};
BlackMisc::CDigestSignal m_dsStashedModelsChanged { this, &CDbMappingComponent::ps_digestStashedModelsChanged, &CDbMappingComponent::ps_onStashedModelsChangedDigest, 750, 25 };
BlackMisc::CDigestSignal m_dsStashedModelsChanged { this, &CDbMappingComponent::ps_digestStashedModelsChanged, &CDbMappingComponent::ps_onStashedModelsChangedDigest, 750, 25 };
const bool vPilotSupport = true; //!< vPilot support
bool m_vPilot1stInit = true; //!< vPilot extensions initaliazed?
bool m_vPilotEnabled = false; //!< use vPilot extensions

View File

@@ -231,7 +231,9 @@ namespace BlackGui
void CDbStashComponent::ps_onValidatePressed()
{
if (this->ui->tvp_StashAircraftModels->isEmpty()) {return; }
this->validateAndDisplay(true);
CAircraftModelList validModels;
CAircraftModelList invalidModels;
this->validateAndDisplay(validModels, invalidModels, true);
}
void CDbStashComponent::ps_onPublishPressed()
@@ -239,21 +241,21 @@ namespace BlackGui
if (this->ui->tvp_StashAircraftModels->isEmpty()) {return; }
// get models right here, because later steps might affect selection
CAircraftModelList models(getSelectedOrAllModels());
const CAircraftModelList models(getSelectedOrAllModels());
if (models.isEmpty()) { return; }
// validate
if (!this->validateAndDisplay()) { return; }
CAircraftModelList validModels;
CAircraftModelList invalidModels;
if (!this->validateAndDisplay(validModels, invalidModels)) { return; }
CStatusMessageList msgs;
if (models.size() > MaxModelPublished)
if (validModels.size() > MaxModelPublished)
{
CAircraftModelList::iterator i = models.begin();
std::advance(i, MaxModelPublished);
models.erase(i, models.end());
validModels.truncate(MaxModelPublished);
msgs.push_back(CStatusMessage(validationCategories(), CStatusMessage::SeverityWarning, QString("More than %1 values, values skipped").arg(MaxModelPublished)));
}
msgs.push_back(sApp->getWebDataServices()->asyncPublishModels(models));
msgs.push_back(sApp->getWebDataServices()->asyncPublishModels(validModels));
if (msgs.hasWarningOrErrorMessages())
{
this->showMessages(msgs);
@@ -293,13 +295,13 @@ namespace BlackGui
Q_UNUSED(skippedModels);
}
CStatusMessageList CDbStashComponent::validate(CAircraftModelList &invalidModels) const
CStatusMessageList CDbStashComponent::validate(CAircraftModelList &validModels, CAircraftModelList &invalidModels) const
{
if (this->ui->tvp_StashAircraftModels->isEmpty()) {return CStatusMessageList(); }
CAircraftModelList models(getSelectedOrAllModels());
const CAircraftModelList models(getSelectedOrAllModels());
if (models.isEmpty()) { return CStatusMessageList(); }
const CStatusMessageList msgs(models.validateForPublishing(invalidModels));
const CStatusMessageList msgs(models.validateForPublishing(validModels, invalidModels));
// OK?
if (msgs.isEmpty())
@@ -315,27 +317,27 @@ namespace BlackGui
}
}
bool CDbStashComponent::validateAndDisplay(bool displayInfo)
bool CDbStashComponent::validateAndDisplay(CAircraftModelList &validModels, CAircraftModelList &invalidModels, bool displayInfo)
{
CAircraftModelList invalidModels;
const CStatusMessageList msgs(this->validate(invalidModels));
const CStatusMessageList msgs(this->validate(validModels, invalidModels));
if (msgs.hasWarningOrErrorMessages())
{
this->showMessages(msgs);
this->ui->tvp_StashAircraftModels->setHighlightModelStrings(invalidModels.getModelStringList(false));
return false;
}
else
{
// delete highlighting
this->ui->tvp_StashAircraftModels->setHighlightModelStrings(QStringList());
if (displayInfo)
{
QString no = QString::number(this->getStashedModelsCount());
CStatusMessage msg(validationCategories(), CStatusMessage::SeverityInfo, "Validation passed for " + no + " models");
this->showMessage(msg);
}
return true; // no error
}
if (displayInfo)
{
QString no = QString::number(this->getStashedModelsCount());
CStatusMessage msg(validationCategories(), CStatusMessage::SeverityInfo, "Validation passed for " + no + " models");
this->showMessage(msg);
}
return !validModels.isEmpty(); // at least some valid objects
}
void CDbStashComponent::enableButtonRow()

View File

@@ -43,11 +43,9 @@ namespace BlackMisc
}
}
namespace Ui { class CDbStashComponent; }
namespace BlackGui
{
namespace Views { class CAircraftModelView; }
namespace Components
{
/*!
@@ -169,10 +167,10 @@ namespace BlackGui
bool showMessage(const BlackMisc::CStatusMessage &msg, int timeoutMs = -1);
//! Validate
BlackMisc::CStatusMessageList validate(BlackMisc::Simulation::CAircraftModelList &invalidModels) const;
BlackMisc::CStatusMessageList validate(BlackMisc::Simulation::CAircraftModelList &validModels, BlackMisc::Simulation::CAircraftModelList &invalidModels) const;
//! Validate and display info messages
bool validateAndDisplay(bool displayInfo = false);
bool validateAndDisplay(BlackMisc::Simulation::CAircraftModelList &validModels, BlackMisc::Simulation::CAircraftModelList &invalidModels, bool displayInfo = false);
//! Set the button row
void enableButtonRow();

View File

@@ -525,17 +525,18 @@ namespace BlackMisc
CStatusMessageList CAircraftModelList::validateForPublishing() const
{
CAircraftModelList invalidModels;
return validateForPublishing(invalidModels);
CAircraftModelList validModels;
return validateForPublishing(validModels, invalidModels);
}
CStatusMessageList CAircraftModelList::validateForPublishing(CAircraftModelList &validateModels) const
CStatusMessageList CAircraftModelList::validateForPublishing(CAircraftModelList &validModels, CAircraftModelList &invalidModels) const
{
if (this->isEmpty()) { return CStatusMessageList(); }
CStatusMessageList msgs;
for (const CAircraftModel &model : *this)
{
const CStatusMessageList msgsModel(model.validate(false));
CStatusMessage msgModel(msgsModel.toSingleMessage());
const CStatusMessage msgModel(msgsModel.toSingleMessage());
QStringList subMsgs;
if (!model.getDistributor().hasValidDbKey()) { subMsgs << "No distributor from DB"; }
@@ -546,16 +547,20 @@ namespace BlackMisc
// for color codes we do not need to check
if (!model.getLivery().getAirlineIcaoCode().hasValidDbKey()) { subMsgs << "No airline ICAO from DB"; }
}
CStatusMessage msgDb(CStatusMessage::SeverityError, subMsgs.join(", "));
const CStatusMessage msgDb(CStatusMessage::SeverityError, subMsgs.join(", "));
CStatusMessage singleMsg(CStatusMessageList({msgModel, msgDb}).toSingleMessage());
if (!singleMsg.isWarningOrAbove()) { continue; }
if (!singleMsg.isWarningOrAbove())
{
validModels.push_back(model);
continue;
}
if (model.hasModelString())
{
singleMsg.prependMessage(model.getModelString() + ": ");
}
msgs.push_back(singleMsg);
validateModels.push_back(model);
invalidModels.push_back(model);
}
return msgs;
}

View File

@@ -202,7 +202,7 @@ namespace BlackMisc
CStatusMessageList validateForPublishing() const;
//! Validate for publishing
CStatusMessageList validateForPublishing(CAircraftModelList &validateModels) const;
CStatusMessageList validateForPublishing(CAircraftModelList &validModels, CAircraftModelList &invalidModels) const;
//! To database JSON
QJsonArray toDatabaseJson() const;