From 731690e3588958095d3f7216b9cd54c0edfdeff0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 26 Jun 2014 16:29:44 -0700 Subject: [PATCH] add querying for settings that affect a specific type --- .../resources/web/settings/describe.json | 2 +- .../resources/web/settings/index.shtml | 6 +- .../src/DomainServerSettingsManager.cpp | 76 +++++++++++++++++-- 3 files changed, 73 insertions(+), 11 deletions(-) diff --git a/domain-server/resources/web/settings/describe.json b/domain-server/resources/web/settings/describe.json index 2c0440ac01..227b6bf0cd 100644 --- a/domain-server/resources/web/settings/describe.json +++ b/domain-server/resources/web/settings/describe.json @@ -1,7 +1,7 @@ { "audio": { "label": "Audio", - "types": [0], + "assignment-types": [0], "settings": { "unattenuated-zone": { "label": "Unattenuated Zone", diff --git a/domain-server/resources/web/settings/index.shtml b/domain-server/resources/web/settings/index.shtml index 15ce842f30..3bb669b32e 100644 --- a/domain-server/resources/web/settings/index.shtml +++ b/domain-server/resources/web/settings/index.shtml @@ -18,10 +18,12 @@
<% if(setting.type) %> <% if (setting.type === "checkbox") { %> - <% var checked_box = (_.isUndefined(values[group_key][setting_key]) ? setting.default : values[group_key][setting_key]) %> + <% var checked_box = (values[group_key] || {})[setting_key] || setting.default %> > <% } else { %> - + <% } %>
diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index 4229e45191..d7e2e05ca8 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -11,9 +11,12 @@ #include #include +#include #include #include +#include +#include #include #include "DomainServerSettingsManager.h" @@ -38,6 +41,9 @@ DomainServerSettingsManager::DomainServerSettingsManager() : _settingsMap = QJsonDocument::fromJson(configFile.readAll()).toVariant().toMap(); } +const QString DESCRIPTION_SETTINGS_KEY = "settings"; +const QString SETTING_DEFAULT_KEY = "default"; + bool DomainServerSettingsManager::handleHTTPRequest(HTTPConnection* connection, const QUrl &url) { if (connection->requestOperation() == QNetworkAccessManager::PostOperation && url.path() == "/settings.json") { // this is a POST operation to change one or more settings @@ -57,20 +63,75 @@ bool DomainServerSettingsManager::handleHTTPRequest(HTTPConnection* connection, return true; } else if (connection->requestOperation() == QNetworkAccessManager::GetOperation && url.path() == "/settings.json") { // this is a GET operation for our settings - // combine the description object and our current settings map - QJsonObject combinedObject; - combinedObject["descriptions"] = _descriptionObject; - combinedObject["values"] = QJsonDocument::fromVariant(_settingsMap).object(); - connection->respond(HTTPConnection::StatusCode200, QJsonDocument(combinedObject).toJson(), "application/json"); + // check if there is a query parameter for settings affecting a particular type of assignment + const QString SETTINGS_TYPE_QUERY_KEY = "type"; + QUrlQuery settingsQuery(url); + QString typeValue = settingsQuery.queryItemValue(SETTINGS_TYPE_QUERY_KEY); + + QJsonObject responseObject; + + if (typeValue.isEmpty()) { + // combine the description object and our current settings map + responseObject["descriptions"] = _descriptionObject; + responseObject["values"] = QJsonDocument::fromVariant(_settingsMap).object(); + } else { + // convert the string type value to a QJsonValue + QJsonValue queryType = QJsonValue(typeValue.toInt()); + + const QString AFFECTED_TYPES_JSON_KEY = "assignment-types"; + + // enumerate the groups in the description object to find which settings to pass + foreach(const QString& group, _descriptionObject.keys()) { + QJsonObject groupObject = _descriptionObject[group].toObject(); + QJsonObject groupSettingsObject = groupObject[DESCRIPTION_SETTINGS_KEY].toObject(); + + QJsonObject groupResponseObject; + + + foreach(const QString& settingKey, groupSettingsObject.keys()) { + QJsonObject settingObject = groupSettingsObject[settingKey].toObject(); + + QJsonArray affectedTypesArray = settingObject[AFFECTED_TYPES_JSON_KEY].toArray(); + if (affectedTypesArray.isEmpty()) { + affectedTypesArray = groupObject[AFFECTED_TYPES_JSON_KEY].toArray(); + } + + if (affectedTypesArray.contains(queryType)) { + // this is a setting we should include in the responseObject + + // we need to check if the settings map has a value for this setting + QVariant variantValue; + QVariant settingsMapGroupValue = _settingsMap.value(group); + + if (!settingsMapGroupValue.isNull()) { + variantValue = settingsMapGroupValue.toMap().value(settingKey); + } + + if (variantValue.isNull()) { + // no value for this setting, pass the default + groupResponseObject[settingKey] = settingObject[SETTING_DEFAULT_KEY]; + } else { + groupResponseObject[settingKey] = QJsonValue::fromVariant(variantValue); + } + } + } + + if (!groupResponseObject.isEmpty()) { + // set this group's object to the constructed object + responseObject[group] = groupResponseObject; + } + } + + } + + connection->respond(HTTPConnection::StatusCode200, QJsonDocument(responseObject).toJson(), "application/json"); return true; } return false; } -const QString DESCRIPTION_SETTINGS_KEY = "settings"; - void DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJsonObject& postedObject, QVariantMap& settingsVariant, QJsonObject descriptionObject) { @@ -94,7 +155,6 @@ void DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJ settingsVariant[key] = QVariantMap(); } - recurseJSONObjectAndOverwriteSettings(rootValue.toObject(), *reinterpret_cast(settingsVariant[key].data()), nextDescriptionObject[DESCRIPTION_SETTINGS_KEY].toObject());