示例#1
0
def _response_callback(**kwargs):
    content = kwargs['content']
    status = kwargs['status']
    content_type = kwargs['content_type']

    # Replace Proxy URL
    content_type_list = [
        'application/xml', 'text/xml', 'text/plain', 'application/json',
        'text/json'
    ]
    try:
        if re.findall(r"(?=(\b" + '|'.join(content_type_list) + r"\b))",
                      content_type):
            _gn_proxy_url = urljoin(settings.SITEURL, '/gs/')
            if isinstance(content, bytes):
                content = content.decode('UTF-8')
            content = content\
                .replace(ogc_server_settings.LOCATION, _gn_proxy_url)\
                .replace(ogc_server_settings.PUBLIC_LOCATION, _gn_proxy_url)
    except Exception as e:
        logger.exception(e)

    if 'affected_layers' in kwargs and kwargs['affected_layers']:
        for layer in kwargs['affected_layers']:
            geoserver_post_save_local(layer)

    return HttpResponse(content=content,
                        status=status,
                        content_type=content_type)
示例#2
0
 def on_geoserver_messages(self, body, message):
     # logger.debug("on_geoserver_messages: RECEIVED MSG - body: %r" % (body,))
     layer_id = body.get("id")
     geoserver_post_save_local(layer_id)
     # Not sure if we need to send ack on this fanout version.
     message.ack()
     logger.info("on_geoserver_messages: finished")
     self._check_message_limit()
示例#3
0
 def on_geoserver_messages(self, body, message):
     # logger.debug("on_geoserver_messages: RECEIVED MSG - body: %r" % (body,))
     layer_id = body.get("id")
     geoserver_post_save_local(layer_id)
     # Not sure if we need to send ack on this fanout version.
     message.ack()
     logger.info("on_geoserver_messages: finished")
     self._check_message_limit()
示例#4
0
def _response_callback(**kwargs):
    status = kwargs.get('status')
    content = kwargs.get('content')
    content_type = kwargs.get('content_type')
    response_headers = kwargs.get('response_headers', None)
    content_type_list = [
        'application/xml', 'text/xml', 'text/plain', 'application/json',
        'text/json'
    ]

    if content:
        if not content_type:
            if isinstance(content, bytes):
                content = content.decode('UTF-8')
            if (re.match(r'^<.+>$', content)):
                content_type = 'application/xml'
            elif (re.match(r'^({|[).+(}|])$', content)):
                content_type = 'application/json'
            else:
                content_type = 'text/plain'

        # Replace Proxy URL
        try:
            if isinstance(content, bytes):
                try:
                    _content = content.decode('UTF-8')
                except UnicodeDecodeError:
                    _content = content
            else:
                _content = content
            if re.findall(f"(?=(\\b{'|'.join(content_type_list)}\\b))",
                          content_type):
                _gn_proxy_url = urljoin(settings.SITEURL, '/gs/')
                content = _content\
                    .replace(ogc_server_settings.LOCATION, _gn_proxy_url)\
                    .replace(ogc_server_settings.PUBLIC_LOCATION, _gn_proxy_url)
                for _ows_endpoint in list(
                        dict.fromkeys(
                            re.findall(rf'{_gn_proxy_url}w\ws', content,
                                       re.IGNORECASE))):
                    content = content.replace(_ows_endpoint,
                                              f'{_gn_proxy_url}ows')
        except Exception as e:
            logger.exception(e)

    if 'affected_datasets' in kwargs and kwargs['affected_datasets']:
        for layer in kwargs['affected_datasets']:
            geoserver_post_save_local(layer)

    _response = HttpResponse(content=content,
                             status=status,
                             content_type=content_type)
    return fetch_response_headers(_response, response_headers)
示例#5
0
 def on_geoserver_messages(self, body, message):
     # logger.debug("on_geoserver_messages: RECEIVED MSG - body: %r" % (body,))
     layer_id = body.get("id")
     try:
         layer = _wait_for_layer(layer_id)
     except Layer.DoesNotExist as err:
         logger.exception(err)
         return
     geoserver_post_save_local(layer)
     # Not sure if we need to send ack on this fanout version.
     message.ack()
     logger.info("on_geoserver_messages: finished")
     self._check_message_limit()
示例#6
0
 def on_geoserver_messages(self, body, message):
     logger.debug("on_geoserver_messages: RECEIVED MSG - body: %r" %
                  (body, ))
     layer_id = body.get("id")
     try:
         layer = _wait_for_layer(layer_id)
     except Layer.DoesNotExist as err:
         logger.debug(err)
         return
     try:
         geoserver_post_save_local(layer)
     except Exception, err:
         logger.error("Cannot handle geoserver message: %s",
                      err,
                      exc_info=err)
示例#7
0
 def on_geoserver_messages(self, body, message):
     logger.debug("on_geoserver_messages: RECEIVED MSG - body: %r" % (body,))
     layer_id = body.get("id")
     try:
         layer = _wait_for_layer(layer_id)
     except Layer.DoesNotExist as err:
         logger.debug(err)
         return
     # try:
     geoserver_post_save_local(layer)
     # except Exception, err:
     #     logger.error("Cannot handle geoserver message: %s", err, exc_info=err)
     # Not sure if we need to send ack on this fanout version.
     message.ack()
     logger.debug("on_geoserver_messages: finished")
     self._check_message_limit()
示例#8
0
    def test_save_and_delete_signals(self):
        """Test that GeoServer Signals methods work as espected"""

        layers = Layer.objects.all()[:2].values_list('id', flat=True)
        test_perm_layer = Layer.objects.get(id=layers[0])

        self.client.login(username='******', password='******')

        if check_ogc_backend(geoserver.BACKEND_PACKAGE):
            from geonode.geoserver.signals import (geoserver_pre_delete,
                                                   geoserver_post_save,
                                                   geoserver_post_save_local)
            # Handle Layer Save and Upload Signals
            geoserver_post_save(test_perm_layer, sender=Layer)
            geoserver_post_save_local(test_perm_layer)

            # Check instance bbox and links
            self.assertIsNotNone(test_perm_layer.bbox)
            self.assertIsNotNone(test_perm_layer.srid)
            self.assertIsNotNone(test_perm_layer.link_set)
            self.assertEquals(len(test_perm_layer.link_set.all()), 7)

            # Layer Manipulation
            from geonode.geoserver.upload import geoserver_upload
            from geonode.geoserver.signals import gs_catalog
            from geonode.geoserver.helpers import (
                check_geoserver_is_up, get_sld_for, fixup_style,
                set_layer_style, get_store, set_attributes_from_geoserver,
                set_styles, create_gs_thumbnail, cleanup)
            check_geoserver_is_up()

            admin_user = get_user_model().objects.get(username="******")
            saved_layer = geoserver_upload(
                test_perm_layer,
                os.path.join(gisdata.VECTOR_DATA,
                             "san_andres_y_providencia_poi.shp"),
                admin_user,
                test_perm_layer.name,
                overwrite=True)

            self.assertIsNotNone(saved_layer)
            _log(saved_layer)
            workspace, name = test_perm_layer.alternate.split(':')
            self.assertIsNotNone(workspace)
            self.assertIsNotNone(name)
            ws = gs_catalog.get_workspace(workspace)
            self.assertIsNotNone(ws)
            store = get_store(gs_catalog, name, workspace=ws)
            _log("1. ------------ %s " % store)
            self.assertIsNotNone(store)

            # Save layer attributes
            set_attributes_from_geoserver(test_perm_layer)

            # Save layer styles
            set_styles(test_perm_layer, gs_catalog)

            # set SLD
            sld = test_perm_layer.default_style.sld_body if test_perm_layer.default_style else None
            if sld:
                _log("2. ------------ %s " % sld)
                set_layer_style(test_perm_layer, test_perm_layer.alternate,
                                sld)

            fixup_style(gs_catalog, test_perm_layer.alternate, None)
            self.assertIsNone(get_sld_for(gs_catalog, test_perm_layer))
            _log("3. ------------ %s " %
                 get_sld_for(gs_catalog, test_perm_layer))

            create_gs_thumbnail(test_perm_layer, overwrite=True)
            self.assertIsNotNone(test_perm_layer.get_thumbnail_url())
            self.assertTrue(test_perm_layer.has_thumbnail())

            # Handle Layer Delete Signals
            geoserver_pre_delete(test_perm_layer, sender=Layer)

            # Check instance has been removed from GeoServer also
            from geonode.geoserver.views import get_layer_capabilities
            self.assertIsNone(get_layer_capabilities(test_perm_layer))

            # Cleaning Up
            test_perm_layer.delete()
            cleanup(test_perm_layer.name, test_perm_layer.uuid)
示例#9
0
文件: tests.py 项目: MapStory/geonode
    def test_save_and_delete_signals(self):
        """Test that GeoServer Signals methods work as espected"""

        layers = Layer.objects.all()[:2].values_list('id', flat=True)
        test_perm_layer = Layer.objects.get(id=layers[0])

        self.client.login(username='******', password='******')

        if check_ogc_backend(geoserver.BACKEND_PACKAGE):
            from geonode.geoserver.signals import (geoserver_pre_delete,
                                                   geoserver_post_save,
                                                   geoserver_post_save_local)
            # Handle Layer Save and Upload Signals
            geoserver_post_save(test_perm_layer, sender=Layer)
            geoserver_post_save_local(test_perm_layer)

            # Check instance bbox and links
            self.assertIsNotNone(test_perm_layer.bbox)
            self.assertIsNotNone(test_perm_layer.srid)
            self.assertIsNotNone(test_perm_layer.link_set)
            self.assertEquals(len(test_perm_layer.link_set.all()), 9)

            # Layer Manipulation
            from geonode.geoserver.upload import geoserver_upload
            from geonode.geoserver.signals import gs_catalog
            from geonode.geoserver.helpers import (check_geoserver_is_up,
                                                   get_sld_for,
                                                   fixup_style,
                                                   set_layer_style,
                                                   get_store,
                                                   set_attributes_from_geoserver,
                                                   set_styles,
                                                   create_gs_thumbnail,
                                                   cleanup)
            check_geoserver_is_up()

            admin_user = get_user_model().objects.get(username="******")
            saved_layer = geoserver_upload(
                test_perm_layer,
                os.path.join(
                    gisdata.VECTOR_DATA,
                    "san_andres_y_providencia_poi.shp"),
                admin_user,
                test_perm_layer.name,
                overwrite=True
            )

            self.assertIsNotNone(saved_layer)
            _log(saved_layer)
            workspace, name = test_perm_layer.alternate.split(':')
            self.assertIsNotNone(workspace)
            self.assertIsNotNone(name)
            ws = gs_catalog.get_workspace(workspace)
            self.assertIsNotNone(ws)
            store = get_store(gs_catalog, name, workspace=ws)
            _log("1. ------------ %s " % store)
            self.assertIsNotNone(store)

            # Save layer attributes
            set_attributes_from_geoserver(test_perm_layer)

            # Save layer styles
            set_styles(test_perm_layer, gs_catalog)

            # set SLD
            sld = test_perm_layer.default_style.sld_body if test_perm_layer.default_style else None
            if sld:
                _log("2. ------------ %s " % sld)
                set_layer_style(test_perm_layer, test_perm_layer.alternate, sld)

            fixup_style(gs_catalog, test_perm_layer.alternate, None)
            self.assertIsNone(get_sld_for(gs_catalog, test_perm_layer))
            _log("3. ------------ %s " % get_sld_for(gs_catalog, test_perm_layer))

            create_gs_thumbnail(test_perm_layer, overwrite=True)
            self.assertIsNotNone(test_perm_layer.get_thumbnail_url())
            self.assertTrue(test_perm_layer.has_thumbnail())

            # Handle Layer Delete Signals
            geoserver_pre_delete(test_perm_layer, sender=Layer)

            # Check instance has been removed from GeoServer also
            from geonode.geoserver.views import get_layer_capabilities
            self.assertIsNone(get_layer_capabilities(test_perm_layer))

            # Cleaning Up
            test_perm_layer.delete()
            cleanup(test_perm_layer.name, test_perm_layer.uuid)