QGIS API Documentation 3.99.0-Master (2fe06baccd8)
Loading...
Searching...
No Matches
qgsarcgisportalutils.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsarcgisportalutils.h
3 --------------------
4 begin : December 2020
5 copyright : (C) 2020 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
16
17#include "qgsarcgisrestquery.h"
18#include "qgsfeedback.h"
19
20#include <QUrl>
21#include <QUrlQuery>
22
23QVariantMap QgsArcGisPortalUtils::retrieveUserInfo( const QString &communityUrl, const QString &user, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsHttpHeaders &requestHeaders, QgsFeedback *feedback, const QString &urlPrefix )
24{
25 QString endPoint = communityUrl;
26 if ( endPoint.endsWith( '/' ) )
27 endPoint.chop( 1 );
28
29 if ( user.isEmpty() )
30 endPoint += QLatin1String( "/self" );
31 else
32 endPoint += QStringLiteral( "/users/" ) + user;
33
34 QUrl queryUrl( endPoint );
35 QUrlQuery query( queryUrl );
36 query.addQueryItem( QStringLiteral( "f" ), QStringLiteral( "json" ) );
37 queryUrl.setQuery( query );
38
39 return QgsArcGisRestQueryUtils::queryServiceJSON( queryUrl, authcfg, errorTitle, errorText, requestHeaders, feedback, urlPrefix );
40}
41
42QVariantMap QgsArcGisPortalUtils::retrieveUserInfo( const QString &communityUrl, const QString &user, const QString &authcfg, QString &errorTitle, QString &errorText, const QMap< QString, QVariant > &requestHeaders, QgsFeedback *feedback, const QString &urlPrefix )
43{
44 return QgsArcGisPortalUtils::retrieveUserInfo( communityUrl, user, authcfg, errorTitle, errorText, QgsHttpHeaders( requestHeaders ), feedback, urlPrefix );
45}
46
47QVariantList QgsArcGisPortalUtils::retrieveUserGroups( const QString &communityUrl, const QString &user, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsHttpHeaders &requestHeaders, QgsFeedback *feedback, const QString &urlPrefix )
48{
49 const QVariantMap info = retrieveUserInfo( communityUrl, user, authcfg, errorTitle, errorText, requestHeaders, feedback, urlPrefix );
50 return info.value( QStringLiteral( "groups" ) ).toList();
51}
52
53QVariantList QgsArcGisPortalUtils::retrieveUserGroups( const QString &communityUrl, const QString &user, const QString &authcfg, QString &errorTitle, QString &errorText, const QMap< QString, QVariant > &requestHeaders, QgsFeedback *feedback, const QString &urlPrefix )
54{
55 return QgsArcGisPortalUtils::retrieveUserGroups( communityUrl, user, authcfg, errorTitle, errorText, QgsHttpHeaders( requestHeaders ), feedback, urlPrefix );
56}
57
58QVariantList QgsArcGisPortalUtils::retrieveGroupContent( const QString &contentUrl, const QString &groupId, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsHttpHeaders &requestHeaders, QgsFeedback *feedback, int pageSize, const QString &urlPrefix )
59{
60 QString endPoint = contentUrl;
61 if ( endPoint.endsWith( '/' ) )
62 endPoint.chop( 1 );
63
64 endPoint += QStringLiteral( "/groups/" ) + groupId;
65
66 int start = 1;
67
68 QVariantList items;
69 while ( true )
70 {
71 QUrl queryUrl( endPoint );
72 QUrlQuery query( queryUrl );
73 query.addQueryItem( QStringLiteral( "f" ), QStringLiteral( "json" ) );
74 query.addQueryItem( QStringLiteral( "start" ), QString::number( start ) );
75 query.addQueryItem( QStringLiteral( "num" ), QString::number( pageSize ) );
76 queryUrl.setQuery( query );
77
78 const QVariantMap response = QgsArcGisRestQueryUtils::queryServiceJSON( queryUrl, authcfg, errorTitle, errorText, requestHeaders, feedback, urlPrefix );
79 if ( !errorText.isEmpty() )
80 return QVariantList();
81
82 items.append( response.value( QStringLiteral( "items" ) ).toList() );
83
84 if ( feedback && feedback->isCanceled() )
85 return items;
86
87 const int total = response.value( QStringLiteral( "total" ) ).toInt();
88 start += pageSize;
89 if ( total < start )
90 break;
91 }
92 return items;
93}
94
95QVariantList QgsArcGisPortalUtils::retrieveGroupContent( const QString &contentUrl, const QString &groupId, const QString &authcfg, QString &errorTitle, QString &errorText, const QMap< QString, QVariant > &requestHeaders, QgsFeedback *feedback, int pageSize, const QString &urlPrefix )
96{
97 return QgsArcGisPortalUtils::retrieveGroupContent( contentUrl, groupId, authcfg, errorTitle, errorText, QgsHttpHeaders( requestHeaders ), feedback, pageSize, urlPrefix );
98}
99
100QVariantList QgsArcGisPortalUtils::retrieveGroupItemsOfType( const QString &contentUrl, const QString &groupId, const QString &authcfg, const QList<int> &itemTypes, QString &errorTitle, QString &errorText, const QgsHttpHeaders &requestHeaders, QgsFeedback *feedback, int pageSize, const QString &urlPrefix )
101{
102 const QVariantList items = retrieveGroupContent( contentUrl, groupId, authcfg, errorTitle, errorText, requestHeaders, feedback, pageSize, urlPrefix );
103
104 // filter results to desired types
105 QVariantList result;
106 for ( const QVariant &item : items )
107 {
108 const QVariantMap itemDef = item.toMap();
109 const QString itemType = itemDef.value( QStringLiteral( "type" ) ).toString();
110
111 for ( const int filterType : itemTypes )
112 {
113 if ( typeToString( static_cast< Qgis::ArcGisRestServiceType >( filterType ) ).compare( itemType, Qt::CaseInsensitive ) == 0 )
114 {
115 result << item;
116 break;
117 }
118 }
119 }
120 return result;
121}
122
123QVariantList QgsArcGisPortalUtils::retrieveGroupItemsOfType( const QString &contentUrl, const QString &groupId, const QString &authcfg, const QList<int> &itemTypes, QString &errorTitle, QString &errorText, const QMap< QString, QVariant > &requestHeaders, QgsFeedback *feedback, int pageSize, const QString &urlPrefix )
124{
125 return QgsArcGisPortalUtils::retrieveGroupItemsOfType( contentUrl, groupId, authcfg, itemTypes, errorTitle, errorText, QgsHttpHeaders( requestHeaders ), feedback, pageSize, urlPrefix );
126}
127
128
129QString QgsArcGisPortalUtils::typeToString( Qgis::ArcGisRestServiceType type )
130{
131 // note -- these values are different in the Portal REST responses vs the standard ArcGIS REST responses!
132 switch ( type )
133 {
135 return QStringLiteral( "Feature Service" );
137 return QStringLiteral( "Map Service" );
139 return QStringLiteral( "Image Service" );
141 return QStringLiteral( "Scene Service" );
142
147 return QString();
148 }
150}
ArcGisRestServiceType
Available ArcGIS REST service types.
Definition qgis.h:4371
@ GeocodeServer
GeocodeServer.
Definition qgis.h:4377
@ SceneServer
SceneServer.
Definition qgis.h:4379
@ Unknown
Other unknown/unsupported type.
Definition qgis.h:4378
@ GlobeServer
GlobeServer.
Definition qgis.h:4375
@ ImageServer
ImageServer.
Definition qgis.h:4374
@ FeatureServer
FeatureServer.
Definition qgis.h:4372
static QVariantList retrieveGroupItemsOfType(const QString &contentUrl, const QString &groupId, const QString &authcfg, const QList< int > &itemTypes, QString &errorTitle, QString &errorText, const QgsHttpHeaders &requestHeaders=QgsHttpHeaders(), QgsFeedback *feedback=nullptr, int pageSize=100, const QString &urlPrefix=QString())
Retrieves JSON definitions for all items which belong the the specified groupId.
static QVariantMap retrieveUserInfo(const QString &communityUrl, const QString &user, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsHttpHeaders &requestHeaders=QgsHttpHeaders(), QgsFeedback *feedback=nullptr, const QString &urlPrefix=QString())
Retrieves JSON user info for the specified user name.
static QVariantList retrieveUserGroups(const QString &communityUrl, const QString &user, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsHttpHeaders &requestHeaders=QgsHttpHeaders(), QgsFeedback *feedback=nullptr, const QString &urlPrefix=QString())
Retrieves JSON definitions for all groups which the specified user name is a member of.
static QVariantList retrieveGroupContent(const QString &contentUrl, const QString &groupId, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsHttpHeaders &requestHeaders=QgsHttpHeaders(), QgsFeedback *feedback=nullptr, int pageSize=100, const QString &urlPrefix=QString())
Retrieves JSON definitions for all items which belong the the specified groupId.
static QVariantMap queryServiceJSON(const QUrl &url, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsHttpHeaders &requestHeaders=QgsHttpHeaders(), QgsFeedback *feedback=nullptr, const QString &urlPrefix=QString())
Performs a blocking request to a URL and returns the retrieved JSON content.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition qgsfeedback.h:44
bool isCanceled() const
Tells whether the operation has been canceled already.
Definition qgsfeedback.h:53
Implements simple HTTP header management.
#define BUILTIN_UNREACHABLE
Definition qgis.h:7208