refs #768, update of value objects

* Adjusted validation
* Use default airline object when a color livery is created (refs #774 also)
* Added/improved completer strings (e.g. getVDesignatorDbKey())
* utility functions in lists
This commit is contained in:
Klaus Basan
2016-10-17 02:29:14 +02:00
parent ab20b6c713
commit 8718260623
9 changed files with 74 additions and 14 deletions

View File

@@ -55,6 +55,18 @@ namespace BlackMisc
if (m_rank < 0 || m_rank >= 10) { m_rank = 10; }
}
QString CAircraftIcaoCode::getDesignatorDbKey() const
{
if (this->isLoadedFromDb())
{
return this->getDesignator() + " " + this->getDbKeyAsStringInParentheses();
}
else
{
return this->getDesignator();
}
}
QString CAircraftIcaoCode::convertToQString(bool i18n) const
{
Q_UNUSED(i18n);

View File

@@ -71,6 +71,9 @@ namespace BlackMisc
//! Get ICAO designator, e.g. "B737"
const QString &getDesignator() const { return m_designator; }
//! Designator and DB key
QString getDesignatorDbKey() const;
//! Set ICAO designator, e.g. "B737"
void setDesignator(const QString &icaoDesignator) { this->m_designator = icaoDesignator.trimmed().toUpper(); }

View File

@@ -192,6 +192,19 @@ namespace BlackMisc
return c.toList();
}
QStringList CAircraftIcaoCodeList::allManufacturers(bool onlyKnownDesignators) const
{
QStringList c;
for (const CAircraftIcaoCode &icao : *this)
{
if (onlyKnownDesignators && !icao.hasKnownDesignator()) { continue; }
const QString m(icao.getManufacturer());
if (m.isEmpty() || c.contains(m)) { continue; }
c.append(m);
}
return c;
}
CAircraftIcaoCodeList CAircraftIcaoCodeList::fromDatabaseJson(const QJsonArray &array, bool ignoreIncomplete)
{
CAircraftIcaoCodeList codes;

View File

@@ -94,6 +94,9 @@ namespace BlackMisc
//! All ICAO codes, no duplicates
QStringList allIcaoCodes(bool noUnspecified = true) const;
//! All manufacturers
QStringList allManufacturers(bool onlyKnownDesignators = true) const;
//! From our database JSON format
static CAircraftIcaoCodeList fromDatabaseJson(const QJsonArray &array, bool ignoreIncomplete = true);
};

View File

@@ -56,6 +56,18 @@ namespace BlackMisc
return QString("V").append(this->m_designator);
}
QString CAirlineIcaoCode::getVDesignatorDbKey() const
{
if (this->isLoadedFromDb())
{
return this->getVDesignator() + " " + this->getDbKeyAsStringInParentheses();
}
else
{
return this->getVDesignator();
}
}
void CAirlineIcaoCode::setDesignator(const QString &icaoDesignator)
{
this->m_designator = icaoDesignator.trimmed().toUpper();
@@ -286,7 +298,7 @@ namespace BlackMisc
bool CAirlineIcaoCode::isValidAirlineDesignator(const QString &airline)
{
// allow 2 chars for IATA
if (airline.length() < 2 || airline.length() > 5) return false;
if (airline.length() < 2 || airline.length() > 5) { return false; }
auto chars = makeRange(airline.begin(), airline.end());
if (chars.containsBy([](QChar c) { return !c.isUpper() && !c.isDigit(); })) { return false; }
return true;
@@ -377,11 +389,16 @@ namespace BlackMisc
{
if (!existsKey(json, prefix))
{
// when using relationship, this can be null
// when using relationship, this can be null (e.g. for color liveries)
return CAirlineIcaoCode();
}
const QString designator(json.value(prefix + "designator").toString());
QString designator(json.value(prefix + "designator").toString());
if (!CAirlineIcaoCode::isValidAirlineDesignator(designator))
{
designator = CAirlineIcaoCode::normalizeDesignator(designator);
}
const QString iata(json.value(prefix + "iata").toString());
const QString telephony(json.value(prefix + "callsign").toString());
const QString name(json.value(prefix + "name").toString());

View File

@@ -68,6 +68,9 @@ namespace BlackMisc
//! Get airline, e.g. "DLH", but "VMVA" for virtual airlines
const QString getVDesignator() const;
//! Get VDesignator plus key
QString getVDesignatorDbKey() const;
//! Set airline, e.g. "DLH"
void setDesignator(const QString &icaoDesignator);

View File

@@ -17,6 +17,7 @@
#include "blackmisc/statusmessage.h"
#include "blackmisc/stringutils.h"
#include "blackmisc/variant.h"
#include "blackmisc/verify.h"
#include <QCoreApplication>
#include <QJsonValue>
@@ -208,21 +209,27 @@ namespace BlackMisc
return CLivery();
}
QString combinedCode(json.value(prefix + "combinedcode").toString());
const QString combinedCode(json.value(prefix + "combinedcode").toString());
if (combinedCode.isEmpty())
{
CLivery liveryStub; // only consists of id, maybe id and timestamp
CLivery liveryStub; // only consists of id, maybe key and timestamp
liveryStub.setKeyAndTimestampFromDatabaseJson(json, prefix);
return liveryStub;
}
QString description(json.value(prefix + "description").toString());
CRgbColor colorFuselage(json.value(prefix + "colorfuselage").toString());
CRgbColor colorTail(json.value(prefix + "colortail").toString());
bool military = CDatastoreUtility::dbBoolStringToBool(json.value(prefix + "military").toString());
CAirlineIcaoCode airline(CAirlineIcaoCode::fromDatabaseJson(json, "al_"));
const bool isColorLivery = combinedCode.startsWith(colorLiveryMarker());
const QString description(json.value(prefix + "description").toString());
const CRgbColor colorFuselage(json.value(prefix + "colorfuselage").toString());
const CRgbColor colorTail(json.value(prefix + "colortail").toString());
const bool military = CDatastoreUtility::dbBoolStringToBool(json.value(prefix + "military").toString());
CAirlineIcaoCode airline;
if (!isColorLivery) { airline = CAirlineIcaoCode::fromDatabaseJson(json, "al_"); }
CLivery livery(combinedCode, airline, description, colorFuselage, colorTail, military);
livery.setKeyAndTimestampFromDatabaseJson(json, prefix);
// color liveries must have default ICAO, but airline liveries must have DB airline
BLACK_VERIFY_X((livery.isColorLivery() && !livery.getAirlineIcaoCode().hasValidDbKey()) || (livery.isAirlineLivery() && livery.getAirlineIcaoCode().hasValidDbKey()), Q_FUNC_INFO, "inconsistent data");
return livery;
}

View File

@@ -76,7 +76,7 @@ namespace BlackMisc
void IDatastoreObjectWithIntegerKey::setKeyAndTimestampFromDatabaseJson(const QJsonObject &json, const QString &prefix)
{
int dbKey = json.value(prefix + "id").toInt(-1);
const int dbKey = json.value(prefix + "id").toInt(-1);
const QString timestampString(json.value(prefix + "lastupdated").toString());
const QDateTime ts(CDatastoreUtility::parseTimestamp(timestampString));
this->setDbKey(dbKey);
@@ -85,7 +85,8 @@ namespace BlackMisc
bool IDatastoreObjectWithIntegerKey::existsKey(const QJsonObject &json, const QString &prefix)
{
return !json.value(prefix + "id").isNull();
const QJsonValue jv(json.value(prefix + "id"));
return !(jv.isNull() || jv.isUndefined());
}
CVariant IDatastoreObjectWithIntegerKey::propertyByIndex(const CPropertyIndex &index) const
@@ -166,7 +167,8 @@ namespace BlackMisc
bool IDatastoreObjectWithStringKey::existsKey(const QJsonObject &json, const QString &prefix)
{
return !json.value(prefix + "id").isNull();
const QJsonValue jv(json.value(prefix + "id"));
return !(jv.isNull() || jv.isUndefined());
}
CVariant IDatastoreObjectWithStringKey::propertyByIndex(const CPropertyIndex &index) const

View File

@@ -134,7 +134,7 @@ namespace BlackMisc
static const CLogCategoryList cats(CLogCategoryList(this).join({ CLogCategory::validation() }));
CStatusMessageList msgs;
if (!hasValidDbKey()) { msgs.push_back(CStatusMessage(cats, CStatusMessage::SeverityError, "Distributor: missing id")); }
if (!hasDescription()) { msgs.push_back(CStatusMessage(cats, CStatusMessage::SeverityWarning, "Distributor: missing description")); }
if (!hasDescription()) { msgs.push_back(CStatusMessage(cats, CStatusMessage::SeverityError, "Distributor: missing description")); }
return msgs;
}