Fix URL parameters for filters

refs #9077
This commit is contained in:
Gunnar Beutner 2015-07-30 08:30:17 +02:00
parent 1634dbc6e4
commit 625a7eafbe
2 changed files with 16 additions and 15 deletions

View File

@ -75,7 +75,7 @@ std::vector<DynamicObject::Ptr> FilterUtility::GetFilterTargets(const QueryDescr
boost::algorithm::to_lower(attr); boost::algorithm::to_lower(attr);
if (query->Contains(attr)) { if (query->Contains(attr)) {
String name = query->Get(attr); String name = HttpUtility::GetLastParameter(query, attr);
DynamicObject::Ptr obj = GetObjectByTypeAndName(type->GetName(), name); DynamicObject::Ptr obj = GetObjectByTypeAndName(type->GetName(), name);
if (!obj) if (!obj)
BOOST_THROW_EXCEPTION(std::invalid_argument("Object does not exist.")); BOOST_THROW_EXCEPTION(std::invalid_argument("Object does not exist."));
@ -87,21 +87,28 @@ std::vector<DynamicObject::Ptr> FilterUtility::GetFilterTargets(const QueryDescr
if (query->Contains(attr)) { if (query->Contains(attr)) {
Array::Ptr names = query->Get(attr); Array::Ptr names = query->Get(attr);
ObjectLock olock(names); if (names) {
BOOST_FOREACH(const String& name, names) { ObjectLock olock(names);
DynamicObject::Ptr obj = GetObjectByTypeAndName(type->GetName(), name); BOOST_FOREACH(const String& name, names) {
if (!obj) DynamicObject::Ptr obj = GetObjectByTypeAndName(type->GetName(), name);
BOOST_THROW_EXCEPTION(std::invalid_argument("Object does not exist.")); if (!obj)
result.push_back(obj); BOOST_THROW_EXCEPTION(std::invalid_argument("Object does not exist."));
result.push_back(obj);
}
} }
} }
} }
if (query->Contains("filter")) { if (query->Contains("filter") || result.empty()) {
if (!query->Contains("type")) if (!query->Contains("type"))
BOOST_THROW_EXCEPTION(std::invalid_argument("Type must be specified when using a filter.")); BOOST_THROW_EXCEPTION(std::invalid_argument("Type must be specified when using a filter."));
String filter = HttpUtility::GetLastParameter(query, "filter"); String filter;
if (!query->Contains("filter"))
filter = "true";
else
filter = HttpUtility::GetLastParameter(query, "filter");
String type = HttpUtility::GetLastParameter(query, "type"); String type = HttpUtility::GetLastParameter(query, "type");
Log(LogInformation, "FilterUtility", filter); Log(LogInformation, "FilterUtility", filter);

View File

@ -52,8 +52,6 @@ bool StatusQueryHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& re
String attr = type->GetName(); String attr = type->GetName();
boost::algorithm::to_lower(attr); boost::algorithm::to_lower(attr);
params->Set(attr, request.RequestUrl->GetPath()[2]); params->Set(attr, request.RequestUrl->GetPath()[2]);
} else if (!params->Contains("filter")) {
params->Set("filter", "true");
} }
std::vector<DynamicObject::Ptr> objs = FilterUtility::GetFilterTargets(qd, params); std::vector<DynamicObject::Ptr> objs = FilterUtility::GetFilterTargets(qd, params);
@ -78,10 +76,6 @@ bool StatusQueryHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& re
Dictionary::Ptr result1 = new Dictionary(); Dictionary::Ptr result1 = new Dictionary();
for (int fid = 0; fid < type->GetFieldCount(); fid++) { for (int fid = 0; fid < type->GetFieldCount(); fid++) {
Field field = type->GetFieldInfo(fid); Field field = type->GetFieldInfo(fid);
if ((field.Attributes & (FAConfig|FAState)) == 0)
continue;
String aname = prefix + "." + field.Name; String aname = prefix + "." + field.Name;
if (!attrs.empty() && attrs.find(aname) == attrs.end()) if (!attrs.empty() && attrs.find(aname) == attrs.end())
continue; continue;