Skip to content

Commit

Permalink
Ensure absolute URL for initConfig.baseurl + remove `initConfig.gro…
Browse files Browse the repository at this point in the history
…up` property (#836)

* Ensure absolute URL for `initConfig.baseurl`

* fallback to absolute URL

* slim down `ClientView` response

* tests

* closes: #372

* tests

* tests

* g3w-suite/g3w-client@ecc1cb2
  • Loading branch information
Raruto committed May 6, 2024
1 parent 73a895a commit 77bc543
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 108 deletions.
9 changes: 5 additions & 4 deletions g3w-admin/client/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,10 @@ def get(
groupSerializer = GroupSerializer(
group, projectId=project_id, projectType=project_type, request=self.request
)
baseurl = "/{}".format(
settings.SITE_PREFIX_URL if settings.SITE_PREFIX_URL else ""
)

baseurl = "/{}".format(getattr(settings, 'SITE_PREFIX_URL') or '');
baseurl = self.request.build_absolute_uri(baseurl) if baseurl.startswith('/') else baseurl

generaldata = GeneralSuiteData.objects.get()

# change groupData name with title for i18n app
Expand All @@ -124,11 +125,11 @@ def get(
"rasterurl": settings.RASTER_URL,
"proxyurl": reverse("interface-proxy"),
"interfaceowsurl": reverse("interface-ows"),
"group": groupSerializer.data,
"g3wsuite_logo_img": settings.CLIENT_G3WSUITE_LOGO,
"credits": reverse("client-credits"),
"main_map_title": generaldata.main_map_title,
"i18n": settings.LANGUAGES,
**groupSerializer.data,
}

# add frontendurl if frontend is set
Expand Down
46 changes: 23 additions & 23 deletions g3w-admin/client/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,42 +127,42 @@ def testGroupConfigApiView(self):
response = self._testApiCall('group-map-config', ['gruppo-1', 'qdjango', '1'])
resp = json.loads(response.content)
self.assertEqual(resp["vectorurl"], "/vector/api/")
self.assertEqual(resp["group"]["crs"], {
self.assertEqual(resp["crs"], {
'epsg': 4326,
'proj4': '+proj=longlat +datum=WGS84 +no_defs',
'geographic': True,
'axisinverted': True,
'extent': [-180.0, -90.0, 180.0, 90.0]
})
print(resp["group"]["mapcontrols"])
self.assertEqual(resp["group"]["mapcontrols"], {'zoom': {}, 'zoombox': {}, 'zoomtoextent': {}, 'query': {}, 'querybbox': {}, 'querybypolygon': {}, 'overview': {}, 'scaleline': {}, 'geolocation': {}, 'streetview': {}, 'geocoding': {'providers': {}}, 'addlayers': {}, 'length': {}, 'area': {}, 'mouseposition': {}, 'scale': {}})
self.assertEqual(resp["group"]["header_logo_img"], "logo_img/qgis-logo.png")
self.assertEqual(resp["group"]["name"], "Gruppo 1")
self.assertIsNone(resp["group"]["header_logo_link"])
self.assertEqual(resp["group"]["initproject"], "qdjango:1")
self.assertEqual(resp["group"]["header_terms_of_use_link"], "")
self.assertTrue(resp["group"]["powered_by"])
self.assertEqual(resp["group"]["baselayers"], [{'crs': {'epsg': 3857, 'proj4': '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs', 'geographic': False, 'axisinverted': False}, 'servertype': 'OSM', 'attribution': "<a href='https://www.openstreetmap.org/copyright'>OpenStreetMap contributors</a>", 'name': 'OpenStreetMap', 'title': 'OSM', 'scalebasedvisibility': False, 'maxscale': 0, 'minscale': 100000000, 'id': 3, 'icon': None}])
self.assertEqual(resp["group"]["header_terms_of_use_text"], "")
self.assertEqual(resp["group"]["header_custom_links"], [])
self.assertEqual(resp["group"]["background_color"], "#ffffff")
self.assertEqual(resp["group"]["id"], 1)
self.assertEqual(resp["group"]["slug"], 'gruppo-1')
self.assertEqual(len(resp["group"]["projects"]), 1)

self.assertIn('vendorkeys', resp["group"])
self.assertEqual(resp["group"]["vendorkeys"], {'google': '123456789'})

project = resp["group"]["projects"][0]
print(resp["mapcontrols"])
self.assertEqual(resp["mapcontrols"], {'zoom': {}, 'zoombox': {}, 'zoomtoextent': {}, 'query': {}, 'querybbox': {}, 'querybypolygon': {}, 'overview': {}, 'scaleline': {}, 'geolocation': {}, 'streetview': {}, 'geocoding': {'providers': {}}, 'addlayers': {}, 'length': {}, 'area': {}, 'mouseposition': {}, 'scale': {}})
self.assertEqual(resp["header_logo_img"], "logo_img/qgis-logo.png")
self.assertEqual(resp["name"], "Gruppo 1")
self.assertIsNone(resp["header_logo_link"])
self.assertEqual(resp["initproject"], "qdjango:1")
self.assertEqual(resp["header_terms_of_use_link"], "")
self.assertTrue(resp["powered_by"])
self.assertEqual(resp["baselayers"], [{'crs': {'epsg': 3857, 'proj4': '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs', 'geographic': False, 'axisinverted': False}, 'servertype': 'OSM', 'attribution': "<a href='https://www.openstreetmap.org/copyright'>OpenStreetMap contributors</a>", 'name': 'OpenStreetMap', 'title': 'OSM', 'scalebasedvisibility': False, 'maxscale': 0, 'minscale': 100000000, 'id': 3, 'icon': None}])
self.assertEqual(resp["header_terms_of_use_text"], "")
self.assertEqual(resp["header_custom_links"], [])
self.assertEqual(resp["background_color"], "#ffffff")
self.assertEqual(resp["id"], 1)
self.assertEqual(resp["slug"], 'gruppo-1')
self.assertEqual(len(resp["projects"]), 1)

self.assertIn('vendorkeys', resp)
self.assertEqual(resp["vendorkeys"], {'google': '123456789'})

project = resp["projects"][0]
to_compare = {'description': '<p>progetto 1<br></p>', 'title': 'Un progetto',
'thumbnail': '/fake/project.png', 'gid': 'qdjango:1', 'type': 'qdjango', 'id': 1}
for k in list(to_compare.keys()):
self.assertEqual(project[k], to_compare[k])

self.assertIsNone(resp["group"]["overviewproject"])
self.assertIsNone(resp["overviewproject"])
self.assertIsNone(resp["main_map_title"])
self.assertEqual(resp["mediaurl"], "/media/")
self.assertEqual(resp["baseurl"], "/")
self.assertFalse(resp["baseurl"].startswith('/'), 'baseurl is not an absolute URI')
self.assertEqual(resp["vectorurl"], "/vector/api/")
self.assertEqual(resp["rasterurl"], "/raster/api/")
self.assertEqual(resp["proxyurl"], reverse('interface-proxy'))
Expand Down
121 changes: 48 additions & 73 deletions g3w-admin/client/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,14 +82,12 @@ def get_context_data(self, **kwargs):
contextData = super(ClientView, self).get_context_data(**kwargs)

# group serializer
try:
group = self.project.group
except:
group = get_object_or_404(Group, slug=kwargs['group_slug'])
groupSerializer = GroupSerializer(group, projectId=str(self.project.pk), projectType=kwargs['project_type'],
request=self.request)

groupData = deepcopy(groupSerializer.data)
groupSerializer = GroupSerializer(
getattr(self.project, 'group', get_object_or_404(Group, slug=kwargs['group_slug'])),
projectId=str(self.project.pk),
projectType=kwargs['project_type'],
request=self.request
)

# choose client by querystring paramenters
contextData['client_default'] = self.get_client_name()
Expand All @@ -116,74 +114,50 @@ def get_context_data(self, **kwargs):
except:
pass


# add user login data
# user data
u = self.request.user

# admin_url
change_grant_users = get_users_for_object(self.project, "change_project", with_group_users=True)
if u in change_grant_users or u.is_superuser:
admin_url = reverse('home')
else:
admin_url = None

user_data = {
'i18n': get_language(),
'login_url': login_url
}
if not u.is_anonymous:
user_data.update({
'id': u.pk,
'username': u.username,
'first_name': u.first_name,
'last_name': u.last_name,
'is_superuser': u.is_superuser,
'is_staff': u.is_staff,
'groups': [g.name for g in u.groups.all()],
'logout_url': logout_url

})

if admin_url:
user_data.update({
'admin_url': admin_url
})

user_data = JSONRenderer().render(user_data)

serializedGroup = JSONRenderer().render(groupData)
serializedGroup = str(serializedGroup, 'utf-8')

baseurl = "{}/{}".format(
settings.SITE_DOMAIN if hasattr(settings, 'SITE_DOMAIN') else '',
settings.SITE_PREFIX_URL if settings.SITE_PREFIX_URL else ''
)

frontendurl = ',"frontendurl":"{}"'.format(baseurl) if settings.FRONTEND else ''

generaldata = GeneralSuiteData.objects.get()
baseurl = "{}/{}".format(getattr(settings, 'SITE_DOMAIN', ''), getattr(settings, 'SITE_PREFIX_URL') or '')
baseurl = self.request.build_absolute_uri(baseurl) if baseurl.startswith('/') else baseurl

# add baseUrl property
contextData['group_config'] = 'var initConfig ={{ "i18n": {}, "staticurl":"{}", "client":"{}", ' \
'"mediaurl":"{}", "user":{}, "group":{}, "baseurl":"{}", "vectorurl":"{}", ' \
'"proxyurl": "{}", "rasterurl":"{}", "interfaceowsurl":"{}", "main_map_title":{}, ' \
'"g3wsuite_logo_img": "{}", "credits": "{}", ' \
'"version": "{}" {} }}'.\
format(json.dumps(settings.LANGUAGES),
settings.STATIC_URL,
"{}/".format(settings.CLIENT_DEFAULT),
settings.MEDIA_URL,
user_data.decode('UTF-8'),
serializedGroup, baseurl,
settings.VECTOR_URL,
reverse('interface-proxy'),
settings.RASTER_URL,
reverse('interface-ows'),
'"' + generaldata.main_map_title + '"' if generaldata.main_map_title else 'null',
settings.CLIENT_G3WSUITE_LOGO,
reverse('client-credits'),
get_version(),
frontendurl)
contextData['group_config'] = 'var initConfig = ' + JSONRenderer().render({
"i18n": settings.LANGUAGES,
"staticurl": settings.STATIC_URL,
"client": "{}/".format(settings.CLIENT_DEFAULT),
"mediaurl": settings.MEDIA_URL,
"user": {
'i18n': get_language(),
'login_url': login_url,
# logged user
**({
'id': u.pk,
'username': u.username,
'first_name': u.first_name,
'last_name': u.last_name,
'is_superuser': u.is_superuser,
'is_staff': u.is_staff,
'groups': [g.name for g in u.groups.all()],
'logout_url': logout_url
} if not u.is_anonymous else {}),
# admin user
**({
'admin_url': reverse('home')
} if (u in get_users_for_object(self.project, "change_project", with_group_users=True) or u.is_superuser) and reverse('home') else {})
},
"baseurl": baseurl,
"vectorurl": settings.VECTOR_URL,
"proxyurl": reverse('interface-proxy'),
"rasterurl": settings.RASTER_URL,
"interfaceowsurl": reverse('interface-ows'),
"main_map_title": getattr(GeneralSuiteData.objects.get(), 'main_map_title', None),
"g3wsuite_logo_img": settings.CLIENT_G3WSUITE_LOGO,
"credits": reverse('client-credits'),
"version": get_version(),
"frontendurl": baseurl if settings.FRONTEND else '',
# project data
**deepcopy(groupSerializer.data)
}).decode('UTF-8') + ';'

# project by type(app)
if not '{}-{}'.format(kwargs['project_type'], self.project.pk) in list(groupSerializer.projects.keys()):
Expand All @@ -193,7 +167,8 @@ def get_context_data(self, **kwargs):

contextData['page_title'] = '{} | {}'.format(
getattr(settings, 'G3WSUITE_CUSTOM_TITLE', 'g3w - client'),
self.project.title_ur if self.project.title_ur else self.project.title)
self.project.title_ur if self.project.title_ur else self.project.title
)

# choosen skin by user main role
contextData['skin_class'] = get_adminlte_skin_by_user(self.request.user)
Expand Down
8 changes: 4 additions & 4 deletions g3w-admin/editing/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@ def test_initconfig_plugin_start(self):
jcontent = json.loads(response.content)

# check editing into plugins section
self.assertTrue('editing' in jcontent['group']['plugins'])
self.assertTrue('editing' in jcontent['plugins'])

plugin = jcontent['group']['plugins']['editing']
plugin = jcontent['plugins']['editing']

# check gid and TYPES
self.assertEqual(plugin['gid'], 'qdjango:{}'.format(
Expand Down Expand Up @@ -137,9 +137,9 @@ def test_initconfig_plugin_start(self):
jcontent = json.loads(response.content)

# check editing into plugins section
self.assertTrue('editing' in jcontent['group']['plugins'])
self.assertTrue('editing' in jcontent['plugins'])

plugin = jcontent['group']['plugins']['editing']
plugin = jcontent['plugins']['editing']

# check gid and TYPES
self.assertEqual(plugin['gid'], 'qdjango:{}'.format(
Expand Down
4 changes: 2 additions & 2 deletions g3w-admin/qplotly/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,9 +150,9 @@ def test_initconfig_plugin_start(self):
jcontent = json.loads(response.content)

# check qplotly into plugins section
self.assertTrue('qplotly' in jcontent['group']['plugins'])
self.assertTrue('qplotly' in jcontent['plugins'])

plugin = jcontent['group']['plugins']['qplotly']
plugin = jcontent['plugins']['qplotly']

self.assertEqual(plugin['gid'], 'qdjango:{}'.format(
self.project.instance.pk))
Expand Down
4 changes: 2 additions & 2 deletions g3w-admin/qtimeseries/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ def test_initconfig_plugin_start(self):
jcontent = json.loads(response.content)

# check qplotly into plugins section
self.assertTrue('qtimeseries' in jcontent['group']['plugins'])
self.assertTrue('qtimeseries' in jcontent['plugins'])

plugin = jcontent['group']['plugins']['qtimeseries']
plugin = jcontent['plugins']['qtimeseries']

self.assertEqual(plugin['gid'], 'qdjango:{}'.format(
self.project_raster.instance.pk))
Expand Down

0 comments on commit 77bc543

Please sign in to comment.