mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-25 19:55:07 +02:00
add operating hours to domain-server settings/UI
This commit is contained in:
parent
4e0aeea2b8
commit
7fa7abdb1d
5 changed files with 139 additions and 20 deletions
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"version": 1.4,
|
||||
"version": 1.5,
|
||||
"settings": [
|
||||
{
|
||||
"name": "metaverse",
|
||||
|
@ -143,9 +143,57 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"name": "utc_offset",
|
||||
"label": "Operating Hours",
|
||||
"help": "\"Open\" domains can be searched using their operating hours. Hours are entered in the local timezone, selected below.",
|
||||
|
||||
"name": "weekday_hours",
|
||||
"caption": "Weekday Hours (Monday-Friday)",
|
||||
"type": "table",
|
||||
"can_add_new_rows": false,
|
||||
"columns": [
|
||||
{
|
||||
"name": "open",
|
||||
"label": "Opening Time",
|
||||
"type": "time",
|
||||
"default": "00:00",
|
||||
"editable": true
|
||||
},
|
||||
{
|
||||
"name": "close",
|
||||
"label": "Closing Time",
|
||||
"type": "time",
|
||||
"default": "23:59",
|
||||
"editable": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "weekend_hours",
|
||||
"label": "Weekend Hours (Saturday/Sunday)",
|
||||
"type": "table",
|
||||
"can_add_new_rows": false,
|
||||
"columns": [
|
||||
{
|
||||
"name": "open",
|
||||
"label": "Opening Time",
|
||||
"type": "time",
|
||||
"default": "00:00",
|
||||
"editable": true
|
||||
},
|
||||
{
|
||||
"name": "close",
|
||||
"label": "Closing Time",
|
||||
"type": "time",
|
||||
"default": "23:59",
|
||||
"editable": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"label": "Time Zone",
|
||||
"help": "This server's time zone, used for searching open servers",
|
||||
"name": "utc_offset",
|
||||
"caption": "Time Zone",
|
||||
"help": "This server's time zone. Used to define your server's operating hours.",
|
||||
"type": "select",
|
||||
"options": [
|
||||
{
|
||||
|
|
|
@ -987,7 +987,7 @@ function makeTable(setting, keypath, setting_value, isLocked) {
|
|||
html += "<td class='key'>" + rowIndexOrName + "</td>"
|
||||
}
|
||||
|
||||
var isNonDeletableRow = false;
|
||||
var isNonDeletableRow = !setting.can_add_new_rows;
|
||||
|
||||
_.each(setting.columns, function(col) {
|
||||
|
||||
|
@ -1007,6 +1007,10 @@ function makeTable(setting, keypath, setting_value, isLocked) {
|
|||
html += "<td class='" + Settings.DATA_COL_CLASS + "'name='" + col.name + "'>"
|
||||
+ "<input type='checkbox' class='form-control table-checkbox' "
|
||||
+ "name='" + colName + "'" + (colValue ? " checked" : "") + " /></td>";
|
||||
} else if (isArray && col.type === "time" && col.editable) {
|
||||
html += "<td class='" + Settings.DATA_COL_CLASS + "'name='" + col.name + "'>"
|
||||
+ "<input type='time' class='form-control table-time " + Settings.TRIGGER_CHANGE_CLASS + "' "
|
||||
+ "name='" + colName + "' value='" + (colValue || col.default || "00:00") + "' /></td>";
|
||||
} else {
|
||||
// Use a hidden input so that the values are posted.
|
||||
html += "<td class='" + Settings.DATA_COL_CLASS + "' name='" + colName + "'>"
|
||||
|
@ -1196,15 +1200,21 @@ function addTableRow(add_glyphicon) {
|
|||
// Hide inputs
|
||||
var input = $(element).find("input")
|
||||
var isCheckbox = false;
|
||||
var isTime = false;
|
||||
if (input.hasClass("table-checkbox")) {
|
||||
input = $(input).parent();
|
||||
isCheckbox = true;
|
||||
} else if (input.hasClass("table-time")) {
|
||||
input = $(input).parent();
|
||||
isTime = true;
|
||||
}
|
||||
|
||||
var val = input.val();
|
||||
if (isCheckbox) {
|
||||
val = $(input).find("input").is(':checked');
|
||||
// don't hide the checkbox
|
||||
val = $(input).find("input").is(':checked');
|
||||
} else if (isTime) {
|
||||
// don't hide the time
|
||||
} else {
|
||||
input.attr("type", "hidden")
|
||||
}
|
||||
|
|
|
@ -31,30 +31,32 @@ const QString DomainMetadata::Users::HOSTNAMES = "user_hostnames";
|
|||
const QString DomainMetadata::DESCRIPTORS = "descriptors";
|
||||
const QString DomainMetadata::Descriptors::DESCRIPTION = "description";
|
||||
const QString DomainMetadata::Descriptors::CAPACITY = "capacity"; // parsed from security
|
||||
const QString DomainMetadata::Descriptors::HOURS = "hours";
|
||||
const QString DomainMetadata::Descriptors::RESTRICTION = "restriction"; // parsed from ACL
|
||||
const QString DomainMetadata::Descriptors::MATURITY = "maturity";
|
||||
const QString DomainMetadata::Descriptors::HOSTS = "hosts";
|
||||
const QString DomainMetadata::Descriptors::TAGS = "tags";
|
||||
const QString DomainMetadata::Descriptors::HOURS = "hours";
|
||||
const QString DomainMetadata::Descriptors::Hours::WEEKDAY = "weekday";
|
||||
const QString DomainMetadata::Descriptors::Hours::WEEKEND = "weekend";
|
||||
const QString DomainMetadata::Descriptors::Hours::UTC_OFFSET = "utc_offset";
|
||||
// descriptors metadata will appear as (JSON):
|
||||
// { "description": String, // capped description
|
||||
// "capacity": Number,
|
||||
// "hours": {
|
||||
// "utc_offset": Number,
|
||||
// "weekday": [ Number, Number ],
|
||||
// "weekend": [ Number, Number ]
|
||||
// }
|
||||
// "restriction": String, // enum of either open, hifi, or acl
|
||||
// "maturity": String, // enum corresponding to ESRB ratings
|
||||
// "hosts": [ String ], // capped list of usernames
|
||||
// "tags": [ String ], // capped list of tags
|
||||
// "hours": {
|
||||
// "utc_offset": Number,
|
||||
// "weekday": [ { "open": Time, "close": Time } ],
|
||||
// "weekend": [ { "open": Time, "close": Time } ],
|
||||
// }
|
||||
// }
|
||||
|
||||
// metadata will appear as (JSON):
|
||||
// { users: <USERS>, descriptors: <DESCRIPTORS> }
|
||||
//
|
||||
// it is meant to be sent to and consumed by an external API
|
||||
// NOTE: metadata may not appear as documented, as parts are generated by describe-settings.js
|
||||
|
||||
DomainMetadata::DomainMetadata(QObject* domainServer) : QObject(domainServer) {
|
||||
_metadata[USERS] = {};
|
||||
|
@ -86,20 +88,42 @@ QJsonObject DomainMetadata::get(const QString& group) {
|
|||
}
|
||||
|
||||
void DomainMetadata::descriptorsChanged() {
|
||||
const QString CAPACITY = "security.maximum_user_capacity";
|
||||
// get descriptors
|
||||
auto settings = static_cast<DomainServer*>(parent())->_settingsManager.getSettingsMap();
|
||||
auto descriptors = settings[DESCRIPTORS].toMap();
|
||||
|
||||
// parse capacity
|
||||
const QString CAPACITY = "security.maximum_user_capacity";
|
||||
const QVariant* capacityVariant = valueForKeyPath(settings, CAPACITY);
|
||||
unsigned int capacity = capacityVariant ? capacityVariant->toUInt() : 0;
|
||||
|
||||
auto descriptors = settings[DESCRIPTORS].toMap();
|
||||
descriptors[Descriptors::CAPACITY] = capacity;
|
||||
|
||||
// parse operating hours
|
||||
const QString WEEKDAY_HOURS = "weekday_hours";
|
||||
const QString WEEKEND_HOURS = "weekday_hours";
|
||||
const QString UTC_OFFSET = "utc_offset";
|
||||
auto weekdayHours = descriptors[WEEKDAY_HOURS];
|
||||
auto weekendHours = descriptors[WEEKEND_HOURS];
|
||||
auto utcOffset = descriptors[UTC_OFFSET];
|
||||
descriptors.remove(WEEKDAY_HOURS);
|
||||
descriptors.remove(WEEKEND_HOURS);
|
||||
descriptors.remove(UTC_OFFSET);
|
||||
QVariantMap hours {
|
||||
{ Descriptors::Hours::UTC_OFFSET, utcOffset },
|
||||
{ Descriptors::Hours::WEEKDAY, weekdayHours },
|
||||
{ Descriptors::Hours::WEEKEND, weekendHours }
|
||||
};
|
||||
descriptors[Descriptors::HOURS] = hours;
|
||||
|
||||
// update metadata
|
||||
_metadata[DESCRIPTORS] = descriptors;
|
||||
|
||||
// update overwritten fields
|
||||
// this further overwrites metadata, so it must be done after commiting descriptors
|
||||
securityChanged(false);
|
||||
|
||||
#if DEV_BUILD || PR_BUILD
|
||||
qDebug() << "Domain metadata descriptors set:" << _metadata[DESCRIPTORS];
|
||||
qDebug() << "Domain metadata descriptors set:" << QJsonObject::fromVariantMap(_metadata[DESCRIPTORS].toMap());
|
||||
#endif
|
||||
|
||||
sendDescriptors();
|
||||
|
@ -189,7 +213,7 @@ void DomainMetadata::maybeUpdateUsers() {
|
|||
++_tic;
|
||||
|
||||
#if DEV_BUILD || PR_BUILD
|
||||
qDebug() << "Domain metadata users updated:" << users;
|
||||
qDebug() << "Domain metadata users set:" << QJsonObject::fromVariantMap(_metadata[USERS].toMap());
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -198,10 +222,16 @@ void DomainMetadata::sendDescriptors() {
|
|||
const QUuid& domainID = DependencyManager::get<LimitedNodeList>()->getSessionUUID();
|
||||
if (!domainID.isNull()) {
|
||||
static const QString DOMAIN_UPDATE = "/api/v1/domains/%1";
|
||||
DependencyManager::get<AccountManager>()->sendRequest(DOMAIN_UPDATE.arg(uuidStringWithoutCurlyBraces(domainID)),
|
||||
QString path { DOMAIN_UPDATE.arg(uuidStringWithoutCurlyBraces(domainID)) };
|
||||
DependencyManager::get<AccountManager>()->sendRequest(path,
|
||||
AccountManagerAuth::Required,
|
||||
QNetworkAccessManager::PutOperation,
|
||||
JSONCallbackParameters(),
|
||||
domainUpdateJSON.toUtf8());
|
||||
|
||||
#if DEV_BUILD || PR_BUILD
|
||||
qDebug() << "Domain metadata sent to" << path;
|
||||
qDebug() << "Domain metadata update:" << domainUpdateJSON;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,11 +35,17 @@ public:
|
|||
public:
|
||||
static const QString DESCRIPTION;
|
||||
static const QString CAPACITY;
|
||||
static const QString HOURS;
|
||||
static const QString RESTRICTION;
|
||||
static const QString MATURITY;
|
||||
static const QString HOSTS;
|
||||
static const QString TAGS;
|
||||
static const QString HOURS;
|
||||
class Hours {
|
||||
public:
|
||||
static const QString WEEKDAY;
|
||||
static const QString WEEKEND;
|
||||
static const QString UTC_OFFSET;
|
||||
};
|
||||
};
|
||||
|
||||
DomainMetadata(QObject* domainServer);
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
#include <QtCore/QUrl>
|
||||
#include <QtCore/QUrlQuery>
|
||||
|
||||
#include <QTimeZone>
|
||||
|
||||
#include <Assignment.h>
|
||||
#include <HifiConfigVariantMap.h>
|
||||
#include <HTTPConnection.h>
|
||||
|
@ -69,7 +71,7 @@ DomainServerSettingsManager::DomainServerSettingsManager() :
|
|||
}
|
||||
|
||||
static const QString MISSING_SETTINGS_DESC_MSG =
|
||||
QString("Did not find settings decription in JSON at %1 - Unable to continue. domain-server will quit.\n%2 at %3")
|
||||
QString("Did not find settings description in JSON at %1 - Unable to continue. domain-server will quit.\n%2 at %3")
|
||||
.arg(SETTINGS_DESCRIPTION_RELATIVE_PATH).arg(parseError.errorString()).arg(parseError.offset);
|
||||
static const int MISSING_SETTINGS_DESC_ERROR_CODE = 6;
|
||||
|
||||
|
@ -258,6 +260,29 @@ void DomainServerSettingsManager::setupConfigMap(const QStringList& argumentList
|
|||
_standardAgentPermissions.clear();
|
||||
_agentPermissions.clear();
|
||||
}
|
||||
|
||||
if (oldVersion < 1.5) {
|
||||
// This was prior to operating hours, so add default hours
|
||||
static const QString WEEKDAY_HOURS{ "descriptors.weekday_hours" };
|
||||
static const QString WEEKEND_HOURS{ "descriptors.weekend_hours" };
|
||||
static const QString UTC_OFFSET{ "descriptors.utc_offset" };
|
||||
|
||||
QVariant* weekdayHours = valueForKeyPath(_configMap.getUserConfig(), WEEKDAY_HOURS, true);
|
||||
QVariant* weekendHours = valueForKeyPath(_configMap.getUserConfig(), WEEKEND_HOURS, true);
|
||||
QVariant* utcOffset = valueForKeyPath(_configMap.getUserConfig(), UTC_OFFSET, true);
|
||||
|
||||
|
||||
QVariantList allHours { QVariantMap{ { "open", QVariant("00:00") }, { "close", QVariant("23:59") } } };
|
||||
*weekdayHours = allHours;
|
||||
*weekendHours = allHours;
|
||||
*utcOffset = QVariant(QTimeZone::systemTimeZone().offsetFromUtc(QDateTime::currentDateTime()) / (float)3600);
|
||||
|
||||
// write the new settings to file
|
||||
persistToFile();
|
||||
|
||||
// reload the master and user config so the merged config is correct
|
||||
_configMap.loadMasterAndUserConfig(_argumentList);
|
||||
}
|
||||
}
|
||||
|
||||
unpackPermissions();
|
||||
|
|
Loading…
Reference in a new issue