QGIS API Documentation 3.99.0-Master (09f76ad7019)
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 <QString>
21#include <QUrl>
22#include <QUrlQuery>
23
24using namespace Qt::StringLiterals;
25
26QVariantMap QgsArcGisPortalUtils::retrieveUserInfo( const QString &communityUrl, const QString &user, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsHttpHeaders &requestHeaders, QgsFeedback *feedback, const QString &urlPrefix )
27{
28 QString endPoint = communityUrl;
29 if ( endPoint.endsWith( '/' ) )
30 endPoint.chop( 1 );
31
32 if ( user.isEmpty() )
33 endPoint += "/self"_L1;
34 else
35 endPoint += u"/users/"_s + user;
36
37 QUrl queryUrl( endPoint );
38 QUrlQuery query( queryUrl );
39 query.addQueryItem( u"f"_s, u"json"_s );
40 queryUrl.setQuery( query );
41
42 return QgsArcGisRestQueryUtils::queryServiceJSON( queryUrl, authcfg, errorTitle, errorText, requestHeaders, feedback, urlPrefix );
43}
44
45QVariantMap 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 )
46{
47 return QgsArcGisPortalUtils::retrieveUserInfo( communityUrl, user, authcfg, errorTitle, errorText, QgsHttpHeaders( requestHeaders ), feedback, urlPrefix );
48}
49
50QVariantList QgsArcGisPortalUtils::retrieveUserGroups( const QString &communityUrl, const QString &user, const QString &authcfg, QString &errorTitle, QString &errorText, const QgsHttpHeaders &requestHeaders, QgsFeedback *feedback, const QString &urlPrefix )
51{
52 const QVariantMap info = retrieveUserInfo( communityUrl, user, authcfg, errorTitle, errorText, requestHeaders, feedback, urlPrefix );
53 return info.value( u"groups"_s ).toList();
54}
55
56QVariantList 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 )
57{
58 return QgsArcGisPortalUtils::retrieveUserGroups( communityUrl, user, authcfg, errorTitle, errorText, QgsHttpHeaders( requestHeaders ), feedback, urlPrefix );
59}
60
61QVariantList 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 )
62{
63 QString endPoint = contentUrl;
64 if ( endPoint.endsWith( '/' ) )
65 endPoint.chop( 1 );
66
67 endPoint += u"/groups/"_s + groupId;
68
69 int start = 1;
70
71 QVariantList items;
72 while ( true )
73 {
74 QUrl queryUrl( endPoint );
75 QUrlQuery query( queryUrl );
76 query.addQueryItem( u"f"_s, u"json"_s );
77 query.addQueryItem( u"start"_s, QString::number( start ) );
78 query.addQueryItem( u"num"_s, QString::number( pageSize ) );
79 queryUrl.setQuery( query );
80
81 const QVariantMap response = QgsArcGisRestQueryUtils::queryServiceJSON( queryUrl, authcfg, errorTitle, errorText, requestHeaders, feedback, urlPrefix );
82 if ( !errorText.isEmpty() )
83 return QVariantList();
84
85 items.append( response.value( u"items"_s ).toList() );
86
87 if ( feedback && feedback->isCanceled() )
88 return items;
89
90 const int total = response.value( u"total"_s ).toInt();
91 start += pageSize;
92 if ( total < start )
93 break;
94 }
95 return items;
96}
97
98QVariantList 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 )
99{
100 return QgsArcGisPortalUtils::retrieveGroupContent( contentUrl, groupId, authcfg, errorTitle, errorText, QgsHttpHeaders( requestHeaders ), feedback, pageSize, urlPrefix );
101}
102
103QVariantList 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 )
104{
105 const QVariantList items = retrieveGroupContent( contentUrl, groupId, authcfg, errorTitle, errorText, requestHeaders, feedback, pageSize, urlPrefix );
106
107 // filter results to desired types
108 QVariantList result;
109 for ( const QVariant &item : items )
110 {
111 const QVariantMap itemDef = item.toMap();
112 const QString itemType = itemDef.value( u"type"_s ).toString();
113
114 for ( const int filterType : itemTypes )
115 {
116 if ( typeToString( static_cast< Qgis::ArcGisRestServiceType >( filterType ) ).compare( itemType, Qt::CaseInsensitive ) == 0 )
117 {
118 result << item;
119 break;
120 }
121 }
122 }
123 return result;
124}
125
126QVariantList 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 )
127{
128 return QgsArcGisPortalUtils::retrieveGroupItemsOfType( contentUrl, groupId, authcfg, itemTypes, errorTitle, errorText, QgsHttpHeaders( requestHeaders ), feedback, pageSize, urlPrefix );
129}
130
131
132QString QgsArcGisPortalUtils::typeToString( Qgis::ArcGisRestServiceType type )
133{
134 // note -- these values are different in the Portal REST responses vs the standard ArcGIS REST responses!
135 switch ( type )
136 {
138 return u"Feature Service"_s;
140 return u"Map Service"_s;
142 return u"Image Service"_s;
144 return u"Scene Service"_s;
145
150 return QString();
151 }
153}
ArcGisRestServiceType
Available ArcGIS REST service types.
Definition qgis.h:4465
@ GeocodeServer
GeocodeServer.
Definition qgis.h:4471
@ SceneServer
SceneServer.
Definition qgis.h:4473
@ Unknown
Other unknown/unsupported type.
Definition qgis.h:4472
@ GlobeServer
GlobeServer.
Definition qgis.h:4469
@ ImageServer
ImageServer.
Definition qgis.h:4468
@ FeatureServer
FeatureServer.
Definition qgis.h:4466
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:55
Implements simple HTTP header management.
#define BUILTIN_UNREACHABLE
Definition qgis.h:7524