From 77bc543aa5a21d07982ceb5f601517227cc242f7 Mon Sep 17 00:00:00 2001 From: Raruto Date: Mon, 6 May 2024 16:19:26 +0200 Subject: [PATCH] Ensure absolute URL for `initConfig.baseurl` + remove `initConfig.group` property (#836) * Ensure absolute URL for `initConfig.baseurl` * fallback to absolute URL * slim down `ClientView` response * tests * closes: https://github.com/g3w-suite/g3w-admin/issues/372 * tests * tests * https://github.com/g3w-suite/g3w-client/pull/617/commits/ecc1cb2e7eb920f07929a0e69815999bf4a01653 --- g3w-admin/client/api/views.py | 9 +- g3w-admin/client/tests/test_api.py | 46 ++++----- g3w-admin/client/views.py | 121 ++++++++++-------------- g3w-admin/editing/tests/test_api.py | 8 +- g3w-admin/qplotly/tests/test_api.py | 4 +- g3w-admin/qtimeseries/tests/test_api.py | 4 +- 6 files changed, 84 insertions(+), 108 deletions(-) diff --git a/g3w-admin/client/api/views.py b/g3w-admin/client/api/views.py index f7d1d6aa5..6d823132a 100644 --- a/g3w-admin/client/api/views.py +++ b/g3w-admin/client/api/views.py @@ -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 @@ -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 diff --git a/g3w-admin/client/tests/test_api.py b/g3w-admin/client/tests/test_api.py index 4caca5559..f5385e7b1 100644 --- a/g3w-admin/client/tests/test_api.py +++ b/g3w-admin/client/tests/test_api.py @@ -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': "OpenStreetMap contributors", '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': "OpenStreetMap contributors", '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': '

progetto 1

', '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')) diff --git a/g3w-admin/client/views.py b/g3w-admin/client/views.py index 443f8419b..7113d7645 100644 --- a/g3w-admin/client/views.py +++ b/g3w-admin/client/views.py @@ -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() @@ -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()): @@ -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) diff --git a/g3w-admin/editing/tests/test_api.py b/g3w-admin/editing/tests/test_api.py index 01e375fbc..19ac43d17 100644 --- a/g3w-admin/editing/tests/test_api.py +++ b/g3w-admin/editing/tests/test_api.py @@ -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( @@ -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( diff --git a/g3w-admin/qplotly/tests/test_api.py b/g3w-admin/qplotly/tests/test_api.py index 1bfd612bb..988618a19 100644 --- a/g3w-admin/qplotly/tests/test_api.py +++ b/g3w-admin/qplotly/tests/test_api.py @@ -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)) diff --git a/g3w-admin/qtimeseries/tests/test_api.py b/g3w-admin/qtimeseries/tests/test_api.py index cac42db6d..a9ce7f0b9 100644 --- a/g3w-admin/qtimeseries/tests/test_api.py +++ b/g3w-admin/qtimeseries/tests/test_api.py @@ -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))