def get_context_data(self, **kwargs):
        # list all required layers
        mapid = self.kwargs.get('mapid')
        request = self.request
        map_obj = _resolve_map(request, mapid, 'base.view_resourcebase',
                               _PERMISSION_MSG_VIEW)

        config = map_obj.viewer_json(request)
        layers = Layer.objects.all()
        map_layers = MapLayer.objects.filter(
            map_id=mapid).order_by('stack_order')

        context = {
            'create':
            False,
            'config':
            json.dumps(config),
            'layers':
            layers,
            'map_layers':
            map_layers,
            'map':
            map_obj,
            'preview':
            getattr(settings, 'GEONODE_CLIENT_LAYER_PREVIEW_LIBRARY',
                    'leaflet')
        }
        return context
Example #2
0
def _change_published_status(request, mapid, published):

    # let's restrict auth to superuser only
    if not request.user.is_superuser:
        return HttpResponse("Not allowed", status=403)

    # search for the resource
    xmap = None
    try:
        xmap = _resolve_map(request, mapid, 'base.view_resourcebase',
                            _PERMISSION_MSG_VIEW)

    except Http404:
        return HttpResponse(loader.render_to_string(
            '404.html', RequestContext(request, {})),
                            status=404)

    except PermissionDenied:
        return HttpResponse(loader.render_to_string(
            '401.html',
            RequestContext(
                request,
                {'error_message': _("You are not allowed to view this map.")
                 })),
                            status=403)

    if xmap is None:
        return HttpResponse('An unknown error has occured.',
                            mimetype="text/plain",
                            status=401)

    Map.objects.filter(id=mapid).update(is_published=published)

    return map_detail(request, mapid)
def map_download_leaflet(request,
                         mapid,
                         template='leaflet/maps/map_embed.html'):
    """Download leaflet map as static HTML.

    :param request: The request from the frontend.
    :type request: HttpRequest

    :param mapid: The id of the map.
    :type mapid: String

    :return: HTML file.
    """

    map_obj = _resolve_map(request, mapid, 'base.view_resourcebase',
                           _PERMISSION_MSG_VIEW)
    map_layers = MapLayer.objects.filter(map_id=mapid).order_by('stack_order')
    layers = []
    for layer in map_layers:
        if layer.group != 'background':
            layers.append(layer)

    context = {'resource': map_obj, 'map_layers': layers, 'for_download': True}

    the_page = render(request, template, context=context)

    response = HttpResponse(the_page.content,
                            content_type="html",
                            status=the_page.status_code)
    response['Content-Disposition'] = 'attachment; filename=%s.html' \
                                      % (map_obj.title,)

    return response
def map_download_qlr(request, mapid):
    """Download QLR file to open the maps' layer in QGIS desktop.

    :param request: The request from the frontend.
    :type request: HttpRequest

    :param mapid: The id of the map.
    :type mapid: String

    :return: QLR file.
    """

    map_obj = _resolve_map(request, mapid, 'base.view_resourcebase',
                           _PERMISSION_MSG_VIEW)

    def perm_filter(layer):
        return request.user.has_perm('base.view_resourcebase',
                                     obj=layer.get_self_resource())

    mapJson = map_obj.json(perm_filter)

    # we need to remove duplicate layers
    j_map = json.loads(mapJson)
    j_layers = j_map["layers"]
    for j_layer in j_layers:
        if j_layer["service"] is None:
            j_layers.remove(j_layer)
            continue
        if (len([_l for _l in j_layers if _l == j_layer])) > 1:
            j_layers.remove(j_layer)

    map_layers = []
    for layer in j_layers:
        layer_name = layer["name"].split(":")[1]
        ogc_url = reverse('qgis_server:layer-request',
                          kwargs={'layername': layer_name})
        url = settings.SITEURL + ogc_url.replace("/", "", 1)

        map_layers.append({
            'type': 'raster',
            'display': layer_name,
            'driver': 'wms',
            'crs': 'EPSG:4326',
            'format': 'image/png',
            'styles': '',
            'layers': layer_name,
            'url': url
        })

    json_layers = json.dumps(map_layers)
    url_server = settings.QGIS_SERVER_URL \
        + '?SERVICE=LAYERDEFINITIONS&LAYERS=' + json_layers
    fwd_request = requests.get(url_server)
    response = HttpResponse(fwd_request.content,
                            content_type="application/x-qgis-layer-definition",
                            status=fwd_request.status_code)
    response['Content-Disposition'] = 'attachment; filename=%s.qlr' \
                                      % map_obj.title

    return response
Example #5
0
    def get_context_data(self, **kwargs):
        # list all required layers
        mapid = self.kwargs.get('mapid')
        snapshot = self.kwargs.get('snapshot')
        request = self.request
        map_obj = _resolve_map(request,
                               mapid,
                               'base.view_resourcebase',
                               _PERMISSION_MSG_VIEW)

        if snapshot is None:
            config = map_obj.viewer_json(request)
        else:
            config = snapshot_config(snapshot,
                                     map_obj,
                                     request)

        layers = Layer.objects.all()
        map_layers = MapLayer.objects.filter(
            map_id=mapid).order_by('stack_order')

        context = {
            'create': False,
            'config': json.dumps(config),
            'layers': layers,
            'map_layers': map_layers,
            'map': map_obj,
            'preview': getattr(
                settings,
                'GEONODE_CLIENT_LAYER_PREVIEW_LIBRARY',
                '')
        }
        return context
    def get_context_data(self, **kwargs):
        # list all required layers
        mapid = self.kwargs.get('mapid')
        snapshot = self.kwargs.get('snapshot')
        request = self.request
        map_obj = _resolve_map(request, mapid, 'base.view_resourcebase',
                               _PERMISSION_MSG_VIEW)

        if 'access_token' in request.session:
            access_token = request.session['access_token']
        else:
            access_token = None

        if snapshot is None:
            config = map_obj.viewer_json(request.user, access_token)
        else:
            config = snapshot_config(snapshot, map_obj, request.user,
                                     access_token)

        layers = Layer.objects.all()
        map_layers = MapLayer.objects.filter(
            map_id=mapid).order_by('stack_order')

        context = {
            'create': False,
            'config': json.dumps(config),
            'layers': layers,
            'map_layers': map_layers,
            'map': map_obj,
            'preview': getattr(settings, 'LAYER_PREVIEW_LIBRARY', '')
        }
        return context
Example #7
0
def map_view_wm(request,
                mapid,
                snapshot=None,
                layer_name=None,
                template='wm_extra/maps/map_view.html'):
    """
    The view that returns the map composer opened to
    the map with the given map ID.
    """
    map_obj = _resolve_map(request, mapid, 'base.view_resourcebase',
                           _PERMISSION_MSG_VIEW)

    if snapshot is None:
        config = map_obj.viewer_json(request)
    else:
        config = snapshot_config(snapshot, map_obj, request)

    if layer_name:
        config = add_layers_to_map_config(request, map_obj, (layer_name, ),
                                          False)

    config = gxp2wm(config, map_obj)

    return render(
        request, template, {
            'config': json.dumps(config),
            'map': map_obj,
            'preview': getattr(settings, 'LAYER_PREVIEW_LIBRARY', '')
        })
Example #8
0
def map_view_wm(request, mapid, snapshot=None, template='maps/map_view.html'):
    """
    The view that returns the map composer opened to
    the map with the given map ID.
    """
    map_obj = _resolve_map(request, mapid, 'base.view_resourcebase',
                           _PERMISSION_MSG_VIEW)

    if 'access_token' in request.session:
        access_token = request.session['access_token']
    else:
        access_token = None

    if snapshot is None:
        config = map_obj.viewer_json(request.user, access_token)
    else:
        config = snapshot_config(snapshot, map_obj, request.user, access_token)

    geoexplorer2worldmap(config, map_obj)

    return render_to_response(
        template,
        RequestContext(
            request, {
                'config': json.dumps(config),
                'map': map_obj,
                'preview': getattr(settings, 'LAYER_PREVIEW_LIBRARY', '')
            }))
Example #9
0
def embed_map(request, map_id):
    map_obj = _resolve_map(request, map_id, 'base.view_resourcebase',
                           _PERMISSION_MSG_VIEW)
    return render(request, "%s/view_map.html" % APP_NAME, {
        "map_id": map_id,
        'map_obj': map_obj
    })
Example #10
0
def map_view_js(request, mapid):
    map_obj = _resolve_map(request, mapid, 'base.view_resourcebase',
                           _PERMISSION_MSG_VIEW)

    config = map_obj.viewer_json(request)
    return HttpResponse(json.dumps(config),
                        content_type="application/javascript")
Example #11
0
def map_view_wm(request, mapid, snapshot=None, layer_name=None, template='wm_extra/maps/map_view.html'):
    """
    The view that returns the map composer opened to
    the map with the given map ID.
    """
    map_obj = _resolve_map(
        request,
        mapid,
        'base.view_resourcebase',
        _PERMISSION_MSG_VIEW)

    if snapshot is None:
        config = map_obj.viewer_json(request)
    else:
        config = snapshot_config(snapshot, map_obj, request)
    if layer_name:
        config = add_layers_to_map_config(request, map_obj, (layer_name, ), False)

    config = gxp2wm(config, map_obj)

    return render(request, template, {
        'config': json.dumps(config),
        'map': map_obj,
        'preview': getattr(
            settings,
            'LAYER_PREVIEW_LIBRARY',
            '')
    })
Example #12
0
    def get_context_data(self, **kwargs):
        """Prepare context data."""

        mapid = self.kwargs.get('mapid')
        snapshot = self.kwargs.get('snapshot')
        request = self.request

        map_obj = _resolve_map(request, mapid, 'base.view_resourcebase',
                               _PERMISSION_MSG_VIEW)

        if snapshot is None:
            config = map_obj.viewer_json(request)
        else:
            config = snapshot_config(snapshot, map_obj, request)
        # list all required layers
        map_layers = MapLayer.objects.filter(
            map_id=mapid).order_by('stack_order')
        context = {
            'config':
            json.dumps(config),
            'create':
            False,
            'resource':
            map_obj,
            'layers':
            map_layers,
            'preview':
            getattr(settings, 'GEONODE_CLIENT_LAYER_PREVIEW_LIBRARY', '')
        }
        return context
Example #13
0
def _change_published_status(request, mapid, published):

    # let's restrict auth to superuser only
    if not request.user.is_superuser:
        return HttpResponse("Not allowed", status=403)

    # search for the resource
    xmap = None
    try:
        xmap = _resolve_map(request, mapid, "base.view_resourcebase", _PERMISSION_MSG_VIEW)

    except Http404:
        return HttpResponse(loader.render_to_string("404.html", RequestContext(request, {})), status=404)

    except PermissionDenied:
        return HttpResponse(
            loader.render_to_string(
                "401.html", RequestContext(request, {"error_message": _("You are not allowed to view this map.")})
            ),
            status=403,
        )

    if xmap is None:
        return HttpResponse("An unknown error has occured.", mimetype="text/plain", status=401)

    Map.objects.filter(id=mapid).update(is_published=published)

    return map_detail(request, mapid)
Example #14
0
def map_metadata_detail(request, mapid,
                        template='maps/metadata_detail.html'):

    map_obj = _resolve_map(request, mapid, 'view_resourcebase')
    return render_to_response(template, RequestContext(request, {
        "layer": map_obj,
        "mapid": mapid,
        'SITEURL': settings.SITEURL[:-1],
    }))
Example #15
0
def map_metadata_detail(request, mapid,
                        template='maps/metadata_detail.html'):

    map_obj = _resolve_map(request, mapid, 'view_resourcebase')
    return render_to_response(template, RequestContext(request, {
        "layer": map_obj,
        "mapid": mapid,
        'SITEURL': settings.SITEURL[:-1],
    }))
Example #16
0
def home_new(request):
    map_obj = _resolve_map(request, "11", 'base.view_resourcebase')
    access_token = None
    config = map_obj.viewer_json(request.user, access_token)
    context = {
        'config': json.dumps(config),
        'map': map_obj,
        'preview': getattr(settings, 'LAYER_PREVIEW_LIBRARY', '')
    }
    return render(request, "index_ungs.html", context)
Example #17
0
def site_map_detail(request, mapid):
    # BETTER WAY INSTEAD OF DO TWO _RESOLVE_MAP PER CALL?
    the_map = _resolve_map(request, mapid, 'base.view_resourcebase',
                           _PERMISSION_MSG_VIEW)
    site = get_current_site(request)
    if not SiteResources.objects.get(site=site).resources.filter(
            pk=the_map.pk).exists():
        raise Http404
    else:
        return map_detail(request, mapid, template='maps/map_detail.html')
Example #18
0
def map_view_js(request, mapid):
    map_obj = _resolve_map(
        request,
        mapid,
        'base.view_resourcebase',
        _PERMISSION_MSG_VIEW)

    config = map_obj.viewer_json(request)
    return HttpResponse(
        json.dumps(config),
        content_type="application/javascript")
Example #19
0
def map_view_js(request, mapid):
    map_obj = _resolve_map(request, mapid, 'base.view_resourcebase',
                           _PERMISSION_MSG_VIEW)
    if 'access_token' in request.session:
        access_token = request.session['access_token']
    else:
        access_token = None

    config = map_obj.viewer_json(request.user, access_token)
    return HttpResponse(json.dumps(config),
                        content_type="application/javascript")
Example #20
0
def add_layer_wm(request):
    """
    The view that returns the map composer opened to
    a given map and adds a layer on top of it.
    """
    map_id = request.GET.get('map_id')
    layer_name = request.GET.get('layer_name')

    map_obj = _resolve_map(request, map_id, 'base.view_resourcebase',
                           _PERMISSION_MSG_VIEW)

    return map_view_wm(request, str(map_obj.id), layer_name=layer_name)
Example #21
0
def site_map_detail(request, mapid):
    # BETTER WAY INSTEAD OF DO TWO _RESOLVE_MAP PER CALL?
    the_map = _resolve_map(
        request,
        mapid,
        'base.view_resourcebase',
        _PERMISSION_MSG_VIEW)
    site = get_current_site(request)
    if not SiteResources.objects.get(site=site).resources.filter(pk=the_map.pk).exists():
        raise Http404
    else:
        return map_detail(request, mapid, template='maps/map_detail.html')
Example #22
0
def map_detail_wm(request, mapid, snapshot=None, template='wm_extra/maps/map_detail.html'):
    '''
    The view that show details of each map
    '''
    map_obj = _resolve_map(
        request,
        mapid,
        'base.view_resourcebase',
        _PERMISSION_MSG_VIEW)
    # Update count for popularity ranking,
    # but do not includes admins or resource owners
    if request.user != map_obj.owner and not request.user.is_superuser:
        Map.objects.filter(
            id=map_obj.id).update(
            popular_count=F('popular_count') + 1)

    if snapshot is None:
        config = map_obj.viewer_json(request)
    else:
        config = snapshot_config(snapshot, map_obj, request)

    config = json.dumps(config)
    layers = MapLayer.objects.filter(map=map_obj.id)
    links = map_obj.link_set.download()

    config = gxp2wm(config)

    context_dict = {
        'config': config,
        'resource': map_obj,
        'layers': layers,
        'perms_list': get_perms(request.user, map_obj.get_self_resource()),
        'permissions_json': _perms_info_json(map_obj),
        "documents": get_related_documents(map_obj),
        'links': links,
    }

    context_dict["preview"] = getattr(
        settings,
        'GEONODE_CLIENT_LAYER_PREVIEW_LIBRARY',
        'geoext')
    context_dict["crs"] = getattr(
        settings,
        'DEFAULT_MAP_CRS',
        'EPSG:900913')

    if settings.SOCIAL_ORIGINS:
        context_dict["social_links"] = build_social_links(request, map_obj)

    return render(request, template, context_dict)
Example #23
0
def map_detail_wm(request, mapid, snapshot=None, template='wm_extra/maps/map_detail.html'):
    '''
    The view that show details of each map
    '''
    map_obj = _resolve_map(
        request,
        mapid,
        'base.view_resourcebase',
        _PERMISSION_MSG_VIEW)
    # Update count for popularity ranking,
    # but do not includes admins or resource owners
    if request.user != map_obj.owner and not request.user.is_superuser:
        Map.objects.filter(
            id=map_obj.id).update(
            popular_count=F('popular_count') + 1)

    if snapshot is None:
        config = map_obj.viewer_json(request)
    else:
        config = snapshot_config(snapshot, map_obj, request)

    config = json.dumps(config)
    layers = MapLayer.objects.filter(map=map_obj.id)
    links = map_obj.link_set.download()

    config = gxp2wm(config)

    context_dict = {
        'config': config,
        'resource': map_obj,
        'layers': layers,
        'perms_list': get_perms(request.user, map_obj.get_self_resource()),
        'permissions_json': _perms_info_json(map_obj),
        "documents": get_related_documents(map_obj),
        'links': links,
    }

    context_dict["preview"] = getattr(
        settings,
        'GEONODE_CLIENT_LAYER_PREVIEW_LIBRARY',
        'geoext')
    context_dict["crs"] = getattr(
        settings,
        'DEFAULT_MAP_CRS',
        'EPSG:900913')

    if settings.SOCIAL_ORIGINS:
        context_dict["social_links"] = build_social_links(request, map_obj)

    return render(request, template, context_dict)
 def get_geonode_map(self, caller, serializer):
     from geonode.maps.views import _PERMISSION_MSG_SAVE
     try:
         from geonode.maps.views import _resolve_map
         if 'id' in serializer.validated_data:
             mapid = serializer.validated_data['id']
             map_obj = _resolve_map(caller.request, str(mapid),
                                    'base.change_resourcebase',
                                    _PERMISSION_MSG_SAVE)
             return map_obj
     except Exception:
         tb = traceback.format_exc()
         logger.debug(tb)
         raise APIException(_PERMISSION_MSG_SAVE)
Example #25
0
def add_layer_wm(request):
    """
    The view that returns the map composer opened to
    a given map and adds a layer on top of it.
    """
    map_id = request.GET.get('map_id')
    layer_name = request.GET.get('layer_name')

    map_obj = _resolve_map(
        request,
        map_id,
        'base.view_resourcebase',
        _PERMISSION_MSG_VIEW)

    return map_view_wm(request, str(map_obj.id), layer_name=layer_name)
Example #26
0
def map_json_wm(request, mapid, snapshot=None):
    if request.method == 'GET':
        map_obj = _resolve_map(
            request,
            mapid,
            'base.view_resourcebase',
            _PERMISSION_MSG_VIEW)

        return HttpResponse(
            json.dumps(
                map_obj.viewer_json(request)))
    elif request.method == 'PUT':
        if not request.user.is_authenticated():
            return HttpResponse(
                _PERMISSION_MSG_LOGIN,
                status=401,
                content_type="text/plain"
            )

        map_obj = Map.objects.get(id=mapid)
        if not request.user.has_perm(
            'change_resourcebase',
                map_obj.get_self_resource()):
            return HttpResponse(
                _PERMISSION_MSG_SAVE,
                status=401,
                content_type="text/plain"
            )
        try:
            map_obj.update_from_viewer(request.body, context={'request': request, 'mapId': mapid, 'map': map_obj})
            update_ext_map(request, map_obj)
            MapSnapshot.objects.create(
                config=clean_config(
                    request.body),
                map=map_obj,
                user=request.user)

            return HttpResponse(
                json.dumps(
                    map_obj.viewer_json(request)))
        except ValueError as e:
            return HttpResponse(
                "The server could not understand the request." + str(e),
                content_type="text/plain",
                status=400
            )
Example #27
0
def map_json_wm(request, mapid, snapshot=None):
    if request.method == 'GET':
        map_obj = _resolve_map(
            request,
            mapid,
            'base.view_resourcebase',
            _PERMISSION_MSG_VIEW)

        return HttpResponse(
            json.dumps(
                map_obj.viewer_json(request)))
    elif request.method == 'PUT':
        if not request.user.is_authenticated():
            return HttpResponse(
                _PERMISSION_MSG_LOGIN,
                status=401,
                content_type="text/plain"
            )

        map_obj = Map.objects.get(id=mapid)
        if not request.user.has_perm(
            'change_resourcebase',
                map_obj.get_self_resource()):
            return HttpResponse(
                _PERMISSION_MSG_SAVE,
                status=401,
                content_type="text/plain"
            )
        try:
            map_obj.update_from_viewer(request.body, context={'request': request, 'mapId': mapid, 'map': map_obj})
            update_ext_map(request, map_obj)
            MapSnapshot.objects.create(
                config=clean_config(
                    request.body),
                map=map_obj,
                user=request.user)

            return HttpResponse(
                json.dumps(
                    map_obj.viewer_json(request)))
        except ValueError as e:
            return HttpResponse(
                "The server could not understand the request." + str(e),
                content_type="text/plain",
                status=400
            )
Example #28
0
def map_view_wm_mobile(request, mapid=None, snapshot=None):
    """
    The view that returns the map composer opened to
    the mobile version for the map with the given map ID.
    """
    map_obj = _resolve_map(request, mapid, 'base.view_resourcebase',
                           _PERMISSION_MSG_VIEW)

    # TODO check if it is a new map
    # if mapid is None:
    #    return newmap(request);

    # TODO check if it is a mapid or suffix
    # if mapid.isdigit():
    #    map_obj = Map.objects.get(pk=mapid)
    # else:
    #    map_obj = Map.objects.get(urlsuffix=mapid)

    if snapshot is None:
        config = map_obj.viewer_json(request)
    else:
        config = snapshot_config(snapshot, map_obj, request)

    config = gxp2wm(config, map_obj)

    first_visit_mobile = True
    if request.session.get('visit_mobile' + str(map_obj.id), False):
        first_visit_mobile = False
    else:
        request.session['visit_mobile' + str(map_obj.id)] = True
    config['first_visit_mobile'] = first_visit_mobile

    template = 'wm_extra/maps/mobilemap.html'

    return render(
        request,
        template,
        {
            'config': json.dumps(config),
            # 'GOOGLE_API_KEY' : settings.GOOGLE_API_KEY,
            # 'GEONETWORK_BASE_URL' : settings.GEONETWORK_BASE_URL,
            # 'GEOSERVER_BASE_URL' : settings.GEOSERVER_BASE_URL,
            # 'DB_DATASTORE' : settings.DB_DATASTORE,
            'maptitle': map_obj.title,
            # 'urlsuffix': get_suffix_if_custom(map_obj),
        })
Example #29
0
def map_view_wm_mobile(request, mapid=None, snapshot=None):
    """
    The view that returns the map composer opened to
    the mobile version for the map with the given map ID.
    """
    map_obj = _resolve_map(
        request,
        mapid,
        'base.view_resourcebase',
        _PERMISSION_MSG_VIEW)

    # TODO check if it is a new map
    # if mapid is None:
    #    return newmap(request);

    # TODO check if it is a mapid or suffix
    # if mapid.isdigit():
    #    map_obj = Map.objects.get(pk=mapid)
    # else:
    #    map_obj = Map.objects.get(urlsuffix=mapid)

    if snapshot is None:
        config = map_obj.viewer_json(request)
    else:
        config = snapshot_config(snapshot, map_obj, request)

    config = gxp2wm(config, map_obj)

    first_visit_mobile = True
    if request.session.get('visit_mobile' + str(map_obj.id), False):
        first_visit_mobile = False
    else:
        request.session['visit_mobile' + str(map_obj.id)] = True
    config['first_visit_mobile'] = first_visit_mobile

    template = 'wm_extra/maps/mobilemap.html'

    return render(request, template, {
        'config': json.dumps(config),
        # 'GOOGLE_API_KEY' : settings.GOOGLE_API_KEY,
        # 'GEONETWORK_BASE_URL' : settings.GEONETWORK_BASE_URL,
        # 'GEOSERVER_BASE_URL' : settings.GEOSERVER_BASE_URL,
        # 'DB_DATASTORE' : settings.DB_DATASTORE,
        'maptitle': map_obj.title,
        # 'urlsuffix': get_suffix_if_custom(map_obj),
    })
    def get_queryset(self, caller, queryset):
        allowed_map_ids = []
        for _q in queryset:
            mapid = _q.id
            try:
                from geonode.maps.views import (_resolve_map,
                                                _PERMISSION_MSG_VIEW)
                map_obj = _resolve_map(caller.request, str(mapid),
                                       'base.view_resourcebase',
                                       _PERMISSION_MSG_VIEW)
                if map_obj:
                    allowed_map_ids.append(mapid)
            except Exception:
                tb = traceback.format_exc()
                logger.debug(tb)

        queryset = queryset.filter(id__in=allowed_map_ids)
        return queryset
Example #31
0
	def getRisk(self, request):

		p = urlparse(request.META.get('HTTP_REFERER')).path.split('/')
		mapCode = p[3] if 'v2' in p else p[2]
		map_obj = _resolve_map(request, mapCode, 'base.view_resourcebase', _PERMISSION_MSG_VIEW)

		queryset = matrix(user=request.user,resourceid=map_obj,action='Interactive Calculation')
		queryset.save()

		requestbody = boundaryFilter = json.loads(request.body)

		wkts = ['ST_GeomFromText(\''+i+'\',4326)' for i in boundaryFilter['spatialfilter']]
		bring = wkts[-1] if len(wkts) else None
		filterLock = 'ST_Union(ARRAY['+', '.join(wkts)+'])'

		response = getSecurityStatistic(request, filterLock, boundaryFilter.get('flag'), boundaryFilter.get('code'), requestbody=requestbody)

		return response
Example #32
0
def map_metadata_detail(request, mapid,
                        template='maps/metadata_detail.html'):

    map_obj = _resolve_map(request, mapid, 'view_resourcebase')

    thumbnail_dir = os.path.join(settings.MEDIA_ROOT, 'thumbs')
    default_thumbnail_array = map_obj.get_thumbnail_url().split('/')
    default_thumbnail_name = default_thumbnail_array[
        len(default_thumbnail_array) - 1
    ]
    default_thumbnail = os.path.join(thumbnail_dir, default_thumbnail_name)

    if request.method == 'POST':
        thumb_form = ThumbnailImageForm(request.POST, request.FILES)
        if thumb_form.is_valid():
            new_img = ThumbnailImage(
                thumbnail_image=request.FILES['thumbnail_image']
            )
            new_img.save()
            user_upload_thumbnail = ThumbnailImage.objects.all()[0]
            user_upload_thumbnail_filepath = str(
                user_upload_thumbnail.thumbnail_image
            )

            # only create backup for original thumbnail
            if os.path.isfile(default_thumbnail + '.bak') is False:
                os.rename(default_thumbnail, default_thumbnail + '.bak')

            os.rename(user_upload_thumbnail_filepath, default_thumbnail)

            return HttpResponseRedirect(
                reverse('map_metadata_detail', args=[mapid])
            )
    else:
        thumb_form = ThumbnailImageForm()

    thumbnail = map_obj.get_thumbnail_url
    return render_to_response(template, RequestContext(request, {
        "layer": map_obj,
        "mapid": mapid,
        'SITEURL': settings.SITEURL[:-1],
        "thumbnail": thumbnail,
        "thumb_form": thumb_form
    }))
Example #33
0
    def get_context_data(self, **kwargs):
        mapid = self.kwargs.get('mapid')
        request = self.request
        map_obj = _resolve_map(request,
                               mapid,
                               'base.view_resourcebase',
                               _PERMISSION_MSG_VIEW)

        if request.method == 'POST':
            if not request.user.is_authenticated():
                return self.render_to_response(
                    'You must be logged in to save new maps',
                    content_type="text/plain",
                    status=401
                )
            map_obj.overwrite = True
            map_obj.save()
            map_obj.set_default_permissions()
            map_obj.handle_moderated_uploads()
            # If the body has been read already, use an empty string.
            # See https://github.com/django/django/commit/58d555caf527d6f1bdfeab14527484e4cca68648
            # for a better exception to catch when we move to Django 1.7.
            try:
                body = request.body
            except Exception:
                body = ''

            try:
                # Call the base implementation first to get a context
                context = super(UpdateView, self).get_context_data(**kwargs)
                map_obj.update_from_viewer(body, context=context)
            except ValueError as e:
                return self.render_to_response(str(e), status=400)
            else:
                context = {
                    'create': False,
                    'status': 200,
                    'map': map_obj,
                    'content_type': 'application/json'
                }
                return context
        else:
            return self.render_to_response(status=405)
Example #34
0
def new_map_config(request):
    '''
    View that creates a new map.

    If the query argument 'copy' is given, the initial map is
    a copy of the map with the id specified, otherwise the
    default map configuration is used.  If copy is specified
    and the map specified does not exist a 404 is returned.
    '''
    DEFAULT_MAP_CONFIG, DEFAULT_BASE_LAYERS = default_map_config(request)

    if 'access_token' in request.session:
        access_token = request.session['access_token']
    else:
        access_token = None

    if request.method == 'GET' and 'copy' in request.GET:
        mapid = request.GET['copy']
        map_obj = _resolve_map(request, mapid, 'base.view_resourcebase')

        map_obj.abstract = DEFAULT_ABSTRACT
        map_obj.title = DEFAULT_TITLE
        if request.user.is_authenticated():
            map_obj.owner = request.user

        config = map_obj.viewer_json(request.user, access_token)
        del config['id']
    else:
        if request.method == 'GET':
            params = request.GET
        elif request.method == 'POST':
            params = request.POST
        else:
            return HttpResponse(status=405)

        if 'layer' in params:
            bbox = None
            map_obj = Map(projection=getattr(settings, 'DEFAULT_MAP_CRS',
                          'EPSG:900913'))
            config = add_layers_to_map_config(request, map_obj, params.getlist('layer'))
        else:
            config = DEFAULT_MAP_CONFIG
    return json.dumps(config)
Example #35
0
    def get_context_data(self, **kwargs):
        mapid = self.kwargs.get('mapid')
        request = self.request
        map_obj = _resolve_map(request,
                               mapid,
                               'base.view_resourcebase',
                               _PERMISSION_MSG_VIEW)

        if request.method == 'POST':
            if not request.user.is_authenticated:
                return self.render_to_response(
                    'You must be logged in to save new maps',
                    content_type="text/plain",
                    status=401
                )
            map_obj.overwrite = True
            map_obj.save()
            map_obj.set_default_permissions()
            map_obj.handle_moderated_uploads()
            # If the body has been read already, use an empty string.
            # See https://github.com/django/django/commit/58d555caf527d6f1bdfeab14527484e4cca68648
            # for a better exception to catch when we move to Django 1.7.
            try:
                body = request.body
            except Exception:
                body = ''

            try:
                # Call the base implementation first to get a context
                context = super(UpdateView, self).get_context_data(**kwargs)
                map_obj.update_from_viewer(body, context=context)
            except ValueError as e:
                return self.render_to_response(str(e), status=400)
            else:
                context = {
                    'create': False,
                    'status': 200,
                    'map': map_obj,
                    'content_type': 'application/json'
                }
                return context
        else:
            return self.render_to_response(status=405)
Example #36
0
def map_download_leaflet(request, mapid,
                         template='leaflet/maps/map_embed.html'):
    """Download leaflet map as static HTML.

    :param request: The request from the frontend.
    :type request: HttpRequest

    :param mapid: The id of the map.
    :type mapid: String

    :return: HTML file.
    """

    map_obj = _resolve_map(request,
                           mapid,
                           'base.view_resourcebase',
                           _PERMISSION_MSG_VIEW)
    map_layers = MapLayer.objects.filter(
        map_id=mapid).order_by('stack_order')
    layers = []
    for layer in map_layers:
        if layer.group != 'background':
            layers.append(layer)

    context = {
        'resource': map_obj,
        'map_layers': layers,
        'for_download': True
    }

    the_page = render(request, template, context=context)

    response = HttpResponse(
        the_page.content, content_type="html",
        status=the_page.status_code)
    response['Content-Disposition'] = 'attachment; filename=%s.html' \
                                      % (map_obj.title,)

    return response
Example #37
0
def new_map_config(request):
    '''
    View that creates a new map.

    If the query argument 'copy' is given, the initial map is
    a copy of the map with the id specified, otherwise the
    default map configuration is used.  If copy is specified
    and the map specified does not exist a 404 is returned.
    '''
    DEFAULT_MAP_CONFIG, DEFAULT_BASE_LAYERS = default_map_config(request)

    if request.method == 'GET' and 'copy' in request.GET:
        mapid = request.GET['copy']
        map_obj = _resolve_map(request, mapid, 'base.view_resourcebase')

        map_obj.abstract = DEFAULT_ABSTRACT
        map_obj.title = DEFAULT_TITLE
        if request.user.is_authenticated():
            map_obj.owner = request.user

        config = map_obj.viewer_json(request)
        del config['id']
    else:
        if request.method == 'GET':
            params = request.GET
        elif request.method == 'POST':
            params = request.POST
        else:
            return HttpResponse(status=405)

        if 'layer' in params:
            map_obj = Map(projection=getattr(settings, 'DEFAULT_MAP_CRS',
                          'EPSG:900913'))
            config = add_layers_to_map_config(request, map_obj, params.getlist('layer'))
        else:
            config = DEFAULT_MAP_CONFIG
    return json.dumps(config)
Example #38
0
def savematrix(request=None,
               action='',
               resourcecode=getattr(settings, 'MATRIX_DEFAULT_MAP_CODE', None),
               resource=None):
    try:
        if not resource:
            from geonode.maps.views import _resolve_map, _PERMISSION_MSG_VIEW
            resource = _resolve_map(request, resourcecode,
                                    'base.view_resourcebase',
                                    _PERMISSION_MSG_VIEW)
    except Exception as identifier:
        logger.warning(
            '_resolve_map() failed using resource_code=%s, check settings.MATRIX_DEFAULT_MAP_CODE'
            % (resourcecode))
    else:
        if hasattr(request, 'user') and isinstance(request.user, Profile):
            user = request.user
        elif 'user' in request.GET:
            user = get_object_or_404(Profile, id=request.GET['user'])
        else:
            logger.warning('savematrix() needs valid user object')
            return
        queryset = matrix(user=user, resourceid=resource, action=action)
        queryset.save()
Example #39
0
def common(request):
    response = {}
    code = None
    flag = 'entireAfg'
    filterLock = None
    rawFilterLock = None

    if 'page' not in request.GET:
        mutable = request.GET._mutable
        request.GET._mutable = True
        request.GET['page'] = 'baseline'
        request.GET._mutable = mutable

    if 'code' in request.GET:
        code = int(request.GET['code'])
        flag = 'currentProvince'

    if 'flag' in request.GET:
        filterLock = request.GET['filter']
        rawFilterLock = filterLock
        filterLock = 'ST_GeomFromText(\'' + filterLock + '\',4326)'
        flag = request.GET['flag']

    if 'pdf' in request.GET:
        # mapCode = '700'
        mapCode = settings.MATRIX_DEFAULT_MAP_CODE
        try:
            map_obj = _resolve_map(request, mapCode, 'base.view_resourcebase',
                                   _PERMISSION_MSG_VIEW)
        except Exception as identifier:
            print 'Warning: _resolve_map() failed using settings.MATRIX_DEFAULT_MAP_CODE'
        else:
            px = get_object_or_404(Profile, id=request.GET['user'])
            queryset = matrix(user=px,
                              resourceid=map_obj,
                              action='Dashboard PDF ' + request.GET['page'])
            queryset.save()
    else:
        # mapCode = '700'
        mapCode = settings.MATRIX_DEFAULT_MAP_CODE
        try:
            map_obj = _resolve_map(request, mapCode, 'base.view_resourcebase',
                                   _PERMISSION_MSG_VIEW)
        except Exception as identifier:
            print 'Warning: _resolve_map() failed using settings.MATRIX_DEFAULT_MAP_CODE.'
        else:
            queryset = matrix(user=request.user,
                              resourceid=map_obj,
                              action='Dashboard ' + request.GET['page'])
            queryset.save()

    page_name = request.GET['page']
    arg = [request, filterLock, flag, code]
    if page_name in ['accessibility', 'security']:
        arg = [request, rawFilterLock, flag, code]
    kwarg = {}
    page_name = 'avalancheforecast' if page_name == 'avalcheforecast' else page_name
    if page_name in ['drought']:
        if 'date' in request.GET:
            kwarg['date'] = request.GET.get('date')

    # get response data by importing module dynamically and run its dashboard functiion
    if page_name in settings.DASHBOARD_TO_APP.keys() \
    and settings.DASHBOARD_TO_APP[page_name] in settings.DASHBOARD_PAGE_MODULES:
        module = importlib.import_module(
            '%s.views' % (settings.DASHBOARD_TO_APP[page_name]))
        # page_meta = dict_ext(module.get_dashboard_meta()).pathget('pagenames', page_name)
        dashboard_meta = dict_ext(module.get_dashboard_meta())
        page_meta = list_ext([
            v for v in dashboard_meta.pathget('pages')
            if v.get('name') == page_name
        ]).get(0, dict_ext)
        response = dict_ext(
            page_meta.get('function')
            (*arg, **kwarg) if page_meta.get('function') else {})
        response['dashboard_template'] = page_meta.get('template')
    elif page_name == 'baseline':
        response = dashboard_baseline(*arg, **kwarg)
        response['dashboard_template'] = 'dash_baseline.html'
    elif page_name == 'main':
        response = getAllQuickOverview(*arg, **kwarg)
        response['dashboard_template'] = 'dash_main.html'
    else:
        raise Http404("Dashboard page '%s' not found" % (request.GET['page']))

    # if request.GET['page'] == 'baseline':
    # 	response = getBaseline(request, filterLock, flag, code)
    # elif request.GET['page'] == 'floodforecast':
    # 	response = getFloodForecast(request, filterLock, flag, code)
    # elif request.GET['page'] == 'floodrisk':
    # 	response = getFloodRisk(request, filterLock, flag, code)
    # elif request.GET['page'] == 'avalancherisk':
    # 	response = getAvalancheRisk(request, filterLock, flag, code)
    # elif request.GET['page'] == 'avalcheforecast':
    # 	response = getAvalancheForecast(request, filterLock, flag, code)
    # elif request.GET['page'] == 'accessibility':
    # 	response = getAccessibility(request, rawFilterLock, flag, code)
    # elif request.GET['page'] == 'earthquake':
    # 	response = getEarthquake(request, filterLock, flag, code)
    # elif request.GET['page'] == 'security':
    # 	response = getSecurity(request, rawFilterLock, flag, code)
    # elif request.GET['page'] == 'landslide':
    # 	response = getLandslideRisk(request, filterLock, flag, code)
    # elif request.GET['page'] == 'main':
    # 	response = getQuickOverview(request, filterLock, flag, code)

    response['add_link'] = '&code=' + str(
        code) if 'code' in request.GET else ''
    # if 'code' in request.GET:
    # 	response['add_link'] = '&code='+str(code)

    response['checked'] = request.GET['_checked'].split(
        ",") if '_checked' in request.GET else []
    # response['checked'] = []
    # if '_checked' in request.GET:
    # 	response['checked'] = request.GET['_checked'].split(",")

    response['jsondata'] = json.dumps(response, cls=JSONEncoderCustom)

    return response
Example #40
0
    def convert(self, viewer, request):
        """
            input: GeoNode JSON Gxp Config
            output: MapStore2 compliant str(config)
        """
        # Initialization
        viewer_obj = json.loads(viewer)
        if isinstance(viewer_obj, str):
            viewer_obj = json.loads(viewer_obj)

        map_id = None
        if 'id' in viewer_obj and viewer_obj['id']:
            try:
                map_id = int(viewer_obj['id'])
            except Exception:
                pass

        data = {}
        data['version'] = 2

        # Map Definition
        try:
            # Map Definition
            ms2_map = {}
            ms2_map['projection'] = viewer_obj['map']['projection']
            ms2_map['units'] = viewer_obj['map']['units']
            ms2_map['zoom'] = viewer_obj['map'][
                'zoom'] if viewer_obj['map']['zoom'] > 0 else 2
            ms2_map['maxExtent'] = viewer_obj['map']['maxExtent']
            ms2_map['maxResolution'] = viewer_obj['map']['maxResolution']

            # Backgrouns
            backgrounds = self.getBackgrounds(viewer, MAP_BASELAYERS)
            if backgrounds:
                ms2_map['layers'] = backgrounds
            else:
                ms2_map['layers'] = MAP_BASELAYERS + [
                    # TODO: covnert Viewer Background Layers
                    # Add here more backgrounds e.g.:
                    # {
                    # 	"type": "wms",
                    # 	"url": "https://demo.geo-solutions.it/geoserver/wms",
                    # 	"visibility": True,
                    # 	"opacity": 0.5,
                    # 	"title": "Weather data",
                    # 	"name": "nurc:Arc_Sample",
                    # 	"group": "Meteo",
                    # 	"format": "image/png",
                    # 	"bbox": {
                    # 		"bounds": {
                    # 			"minx": -25.6640625,
                    # 			"miny": 26.194876675795218,
                    # 			"maxx": 48.1640625,
                    # 			"maxy": 56.80087831233043
                    # 		},
                    # 		"crs": "EPSG:4326"
                    # 	}
                    # }, ...
                ]

            if settings.BING_API_KEY:
                ms2_map['bingApiKey'] = settings.BING_API_KEY

            # Security Info
            info = {}
            info['canDelete'] = False
            info['canEdit'] = False
            info['description'] = viewer_obj['about']['abstract']
            info['id'] = map_id
            info['name'] = viewer_obj['about']['title']
            ms2_map['info'] = info

            # Overlays
            overlays, selected = self.get_overlays(viewer, request=request)
            if selected and 'name' in selected and selected[
                    'name'] and not map_id:
                # We are generating a Layer Details View
                center, zoom = self.get_center_and_zoom(
                    viewer_obj['map'], selected)
                ms2_map['center'] = center
                ms2_map['zoom'] = zoom

                try:
                    # - extract from GeoNode guardian
                    from geonode.layers.views import (_resolve_layer,
                                                      _PERMISSION_MSG_MODIFY,
                                                      _PERMISSION_MSG_DELETE)
                    if _resolve_layer(request, selected['name'],
                                      'base.change_resourcebase',
                                      _PERMISSION_MSG_MODIFY).user_can(
                                          request.user,
                                          'base.change_resourcebase'):
                        info['canEdit'] = True

                    if _resolve_layer(request, selected['name'],
                                      'base.delete_resourcebase',
                                      _PERMISSION_MSG_DELETE).user_can(
                                          request.user,
                                          'base.delete_resourcebase'):
                        info['canDelete'] = True
                except Exception:
                    tb = traceback.format_exc()
                    logger.debug(tb)
            else:
                # We are getting the configuration of a Map
                # On GeoNode model the Map Center is always saved in 4326
                _x = get_valid_number(viewer_obj['map']['center'][0])
                _y = get_valid_number(viewer_obj['map']['center'][1])
                _crs = 'EPSG:4326'
                if _x > 360.0 or _x < -360.0:
                    _crs = viewer_obj['map']['projection']
                ms2_map['center'] = {'x': _x, 'y': _y, 'crs': _crs}
                try:
                    # - extract from GeoNode guardian
                    from geonode.maps.views import (_resolve_map,
                                                    _PERMISSION_MSG_SAVE,
                                                    _PERMISSION_MSG_DELETE)
                    if _resolve_map(request, str(map_id),
                                    'base.change_resourcebase',
                                    _PERMISSION_MSG_SAVE).user_can(
                                        request.user,
                                        'base.change_resourcebase'):
                        info['canEdit'] = True

                    if _resolve_map(request, str(map_id),
                                    'base.delete_resourcebase',
                                    _PERMISSION_MSG_DELETE).user_can(
                                        request.user,
                                        'base.delete_resourcebase'):
                        info['canDelete'] = True
                except Exception:
                    tb = traceback.format_exc()
                    logger.debug(tb)

            for overlay in overlays:
                if 'name' in overlay and overlay['name']:
                    ms2_map['layers'].append(overlay)

            data['map'] = ms2_map
        except Exception:
            # traceback.print_exc()
            tb = traceback.format_exc()
            logger.debug(tb)

        # Additional Configurations
        if map_id:
            from mapstore2_adapter import fixup_map
            from mapstore2_adapter.api.models import MapStoreResource
            try:
                fixup_map(map_id)
                ms2_resource = MapStoreResource.objects.get(id=map_id)
                ms2_map_data = ms2_resource.data.blob
                if isinstance(ms2_map_data, string_types):
                    ms2_map_data = json.loads(ms2_map_data)
                if 'map' in ms2_map_data:
                    for _k, _v in ms2_map_data['map'].items():
                        if _k not in data['map']:
                            data['map'][_k] = ms2_map_data['map'][_k]
                    del ms2_map_data['map']
                data.update(ms2_map_data)
            except Exception:
                # traceback.print_exc()
                tb = traceback.format_exc()
                logger.debug(tb)

        # Default Catalogue Services Definition
        try:
            ms2_catalogue = {}
            ms2_catalogue['selectedService'] = CATALOGUE_SELECTED_SERVICE
            ms2_catalogue['services'] = CATALOGUE_SERVICES
            data['catalogServices'] = ms2_catalogue
        except Exception:
            # traceback.print_exc()
            tb = traceback.format_exc()
            logger.debug(tb)

        json_str = json.dumps(data, cls=DjangoJSONEncoder, sort_keys=True)
        for (c, d) in unsafe_chars.items():
            json_str = json_str.replace(c, d)

        return json_str
Example #41
0
def common(request):
	response = {}
	code = None
	flag = 'entireAfg'
	filterLock = None
	rawFilterLock = None

	if 'page' not in request.GET:
		mutable = request.GET._mutable
		request.GET._mutable = True
		request.GET['page'] = 'baseline'
		request.GET._mutable = mutable

	if 'code' in request.GET:
		code = int(request.GET['code'])
		flag = 'currentProvince'

	if 'flag' in request.GET:
		filterLock = request.GET['filter']
		rawFilterLock = filterLock
		filterLock = 'ST_GeomFromText(\''+filterLock+'\',4326)'
		flag = request.GET['flag']

	if 'pdf' in request.GET:
		mapCode = '700'
		map_obj = _resolve_map(request, mapCode, 'base.view_resourcebase', _PERMISSION_MSG_VIEW)
		px = get_object_or_404(Profile, id=request.GET['user'])
		# print px
		queryset = matrix(user=px,resourceid=map_obj,action='Dashboard PDF '+request.GET['page'])
		queryset.save()
	else:
		mapCode = '700'
		map_obj = _resolve_map(request, mapCode, 'base.view_resourcebase', _PERMISSION_MSG_VIEW)
		queryset = matrix(user=request.user,resourceid=map_obj,action='Dashboard '+request.GET['page'])
		queryset.save()

	if request.GET['page'] == 'baseline':
		response = getBaseline(request, filterLock, flag, code)
	elif request.GET['page'] == 'floodforecast':
		response = getFloodForecast(request, filterLock, flag, code)
	elif request.GET['page'] == 'floodrisk':
		response = getFloodRisk(request, filterLock, flag, code)
	elif request.GET['page'] == 'avalancherisk':
		response = getAvalancheRisk(request, filterLock, flag, code)
	elif request.GET['page'] == 'avalcheforecast':
		response = getAvalancheForecast(request, filterLock, flag, code)
	elif request.GET['page'] == 'accessibility':
		response = getAccessibility(request, rawFilterLock, flag, code)
	elif request.GET['page'] == 'earthquake':
		response = getEarthquake(request, filterLock, flag, code)
	elif request.GET['page'] == 'security':
		response = getSecurity(request, rawFilterLock, flag, code)
	elif request.GET['page'] == 'landslide':
		response = getLandslideRisk(request, filterLock, flag, code)
	elif request.GET['page'] == 'drought':
		dateIn_str = request.GET['date'] if ('date' in request.GET) else str(date.today())
		dateIn = dateIn_str.split('-')
		woy = dateIn[0] + '%03d' % date(int(dateIn[0]), int(dateIn[1]), int(dateIn[2])).isocalendar()[1]
		closest_woy = getClosestDroughtWOY(woy)

		if request.GET.get('woy'):
			closest_woy = request.GET.get('woy')

		response = getDroughtRisk(request, filterLock, flag, code, closest_woy)
	elif request.GET['page'] == 'main':
		response = getQuickOverview(request, filterLock, flag, code)

	if 'code' in request.GET:
		response['add_link'] = '&code='+str(code)

	if request.GET.get('templatevar'):
		response.update(json.loads(request.GET.get('templatevar')))

	response['checked'] = []
	if '_checked' in request.GET:
		response['checked'] = filter(None, request.GET['_checked'].split(","))

	class CustomEncoder(json.JSONEncoder):
	    def default(self, obj):
	        if obj.__class__.__name__  == "GeoValuesQuerySet":
	            return list(obj)
	        elif obj.__class__.__name__  == "date":
	            return obj.strftime("%Y-%m-%d")
	        elif obj.__class__.__name__  == "datetime":
	            return obj.strftime("%Y-%m-%d %H:%M:%S")
	        elif obj.__class__.__name__  == "Decimal":
	            return float(obj)
	        else:
	            print 'not converted to json:', obj.__class__.__name__
	            # return {} # convert un-json-able object to empty object
	            return 'not converted to json: %s' % (obj.__class__.__name__) # convert un-json-able object to empty object

	response['jsondata'] = json.dumps(response, cls = CustomEncoder)

	return response
Example #42
0
def new_map_config(request):
    '''
    View that creates a new map.

    If the query argument 'copy' is given, the initial map is
    a copy of the map with the id specified, otherwise the
    default map configuration is used.  If copy is specified
    and the map specified does not exist a 404 is returned.
    '''
    DEFAULT_MAP_CONFIG, DEFAULT_BASE_LAYERS = default_map_config(request)

    if 'access_token' in request.session:
        access_token = request.session['access_token']
    else:
        access_token = None

    if request.method == 'GET' and 'copy' in request.GET:
        mapid = request.GET['copy']
        map_obj = _resolve_map(request, mapid, 'base.view_resourcebase')

        map_obj.abstract = DEFAULT_ABSTRACT
        map_obj.title = DEFAULT_TITLE
        map_obj.refresh_interval = 60000
        if request.user.is_authenticated():
            map_obj.owner = request.user

        config = map_obj.viewer_json(request.user, access_token)
        del config['id']
    else:
        if request.method == 'GET':
            params = request.GET
        elif request.method == 'POST':
            params = request.POST
        else:
            return HttpResponse(status=405)

        if 'layer' in params:
            bbox = None
            map_obj = Map(projection=getattr(settings, 'DEFAULT_MAP_CRS',
                                             'EPSG:900913'))
            layers = []
            for layer_name in params.getlist('layer'):
                try:
                    layer = _resolve_layer(request, layer_name)
                except ObjectDoesNotExist:
                    # bad layer, skip
                    continue
                except Http404:
                    # can't find the layer, skip it.
                    continue

                if not request.user.has_perm(
                        'view_resourcebase',
                        obj=layer.get_self_resource()):
                    # invisible layer, skip inclusion
                    continue

                layer_bbox = layer.bbox
                # assert False, str(layer_bbox)
                if bbox is None:
                    bbox = list(layer_bbox[0:4])
                else:
                    bbox = list(bbox)
                    bbox[0] = min(bbox[0], layer_bbox[0])
                    bbox[1] = max(bbox[1], layer_bbox[1])
                    bbox[2] = min(bbox[2], layer_bbox[2])
                    bbox[3] = max(bbox[3], layer_bbox[3])

                config = layer.attribute_config()

                # Add required parameters for GXP lazy-loading
                config["title"] = layer.title
                config["queryable"] = True

                config["srs"] = getattr(settings, 'DEFAULT_MAP_CRS',
                                        'EPSG:900913')
                config["bbox"] = bbox if config["srs"] != 'EPSG:900913' \
                    else llbbox_to_mercator([float(coord) for coord in bbox])

                if layer.storeType == "remoteStore":
                    service = layer.service
                    # Probably not a good idea to send the access token
                    # to every remote service. This should never match,
                    # so no access token should be sent to remote services.
                    ogc_server_url = urlsplit(
                        ogc_server_settings.PUBLIC_LOCATION).netloc
                    service_url = urlsplit(service.base_url).netloc

                    if config["srs"] == 'EPSG:900913':
                        target_srid = 3857
                    else:
                        target_srid = config["srs"]
                    reprojected_bbox = bbox_to_projection(
                        bbox,
                        source_srid=layer.srid,
                        target_srid=target_srid
                    )
                    bbox = reprojected_bbox[:4]
                    config['bbox'] = [float(coord) for coord in bbox]

                    if access_token and ogc_server_url == service_url and \
                            'access_token' not in service.base_url:
                        url = service.base_url + '?access_token={}'.format(
                            access_token)
                    else:
                        url = service.base_url
                    use_proxy = (callable(uses_proxy_route) and
                                 uses_proxy_route(service.base_url))
                    if layer.alternate is not None:
                        config["layerid"] = layer.alternate
                    maplayer = MapLayer(
                        map=map_obj,
                        name=layer.typename,
                        ows_url=layer.ows_url,
                        layer_params=json.dumps(config, cls=DjangoJSONEncoder),
                        visibility=True,
                        source_params=json.dumps({
                            "ptype": service.ptype,
                            "remote": True,
                            "url": url,
                            "name": service.name,
                            "use_proxy": use_proxy})
                    )
                else:
                    ogc_server_url = urlsplit(
                        ogc_server_settings.PUBLIC_LOCATION).netloc
                    layer_url = urlsplit(layer.ows_url).netloc

                    if access_token and ogc_server_url == layer_url and \
                            'access_token' not in layer.ows_url:
                        url = layer.ows_url + '?access_token=' + access_token
                    else:
                        url = layer.ows_url
                    maplayer = MapLayer(
                        map=map_obj,
                        name=layer.typename,
                        ows_url=url,
                        # use DjangoJSONEncoder to handle Decimal values
                        layer_params=json.dumps(config, cls=DjangoJSONEncoder),
                        visibility=True
                    )

                layers.append(maplayer)

            if bbox is not None:
                minx, miny, maxx, maxy = [float(coord) for coord in bbox]
                x = (minx + maxx) / 2
                y = (miny + maxy) / 2

                if layer.is_remote or getattr(settings, 'DEFAULT_MAP_CRS',
                                              'EPSG:900913') == "EPSG:4326":
                    center = list((x, y))
                else:
                    center = list(forward_mercator((x, y)))

                if center[1] == float('-inf'):
                    center[1] = 0

                BBOX_DIFFERENCE_THRESHOLD = 1e-5

                # Check if the bbox is invalid
                valid_x = (maxx - minx) ** 2 > BBOX_DIFFERENCE_THRESHOLD
                valid_y = (maxy - miny) ** 2 > BBOX_DIFFERENCE_THRESHOLD

                if valid_x:
                    width_zoom = math.log(360 / abs(maxx - minx), 2)
                else:
                    width_zoom = 15

                if valid_y:
                    height_zoom = math.log(360 / abs(maxy - miny), 2)
                else:
                    height_zoom = 15

                map_obj.center_x = center[0]
                map_obj.center_y = center[1]
                map_obj.zoom = math.ceil(min(width_zoom, height_zoom))

            config = map_obj.viewer_json(
                request.user, access_token, *(DEFAULT_BASE_LAYERS + layers))
            config['fromLayer'] = True
        else:
            config = DEFAULT_MAP_CONFIG
    return json.dumps(config)
    def get_context_data(self, **kwargs):
        request = self.request
        if request and 'access_token' in request.session:
            access_token = request.session['access_token']
        else:
            access_token = None

        DEFAULT_MAP_CONFIG, DEFAULT_BASE_LAYERS = default_map_config(request)

        layers = Layer.objects.all()

        if request.method == 'GET' and 'copy' in request.GET:
            """Prepare context data."""
            request = self.request
            mapid = self.request.GET['copy']

            map_obj = _resolve_map(request, mapid, 'base.view_resourcebase',
                                   _PERMISSION_MSG_VIEW)

            config = map_obj.viewer_json(request)

            # list all required layers
            map_layers = MapLayer.objects.filter(
                map_id=mapid).order_by('stack_order')
            context = {
                'config':
                json.dumps(config),
                'create':
                False,
                'layers':
                layers,
                'map':
                map_obj,
                'map_layers':
                map_layers,
                'preview':
                getattr(settings, 'GEONODE_CLIENT_LAYER_PREVIEW_LIBRARY',
                        'leaflet')
            }
            return context
        else:
            if request.method == 'GET':
                params = request.GET
            elif request.method == 'POST':
                params = request.POST
            else:
                return self.render_to_response(status=405)

            if 'layer' in params:
                bbox = None
                map_obj = Map(projection=getattr(settings, 'DEFAULT_MAP_CRS',
                                                 'EPSG:3857'))

                for layer_name in params.getlist('layer'):
                    try:
                        layer = _resolve_layer(request, layer_name)
                    except ObjectDoesNotExist:
                        # bad layer, skip
                        continue

                    if not request.user.has_perm(
                            'view_resourcebase',
                            obj=layer.get_self_resource()):
                        # invisible layer, skip inclusion
                        continue

                    layer_bbox = layer.bbox
                    # assert False, str(layer_bbox)
                    if bbox is None:
                        bbox = list(layer_bbox[0:4])
                    else:
                        bbox[0] = min(bbox[0], layer_bbox[0])
                        bbox[1] = min(bbox[1], layer_bbox[1])
                        bbox[2] = max(bbox[2], layer_bbox[2])
                        bbox[3] = max(bbox[3], layer_bbox[3])

                    config = layer.attribute_config()

                    # Add required parameters for GXP lazy-loading
                    config["title"] = layer.title
                    config["queryable"] = True

                    config["srs"] = getattr(settings, 'DEFAULT_MAP_CRS',
                                            'EPSG:3857')
                    config["bbox"] = bbox if config["srs"] != 'EPSG:3857' \
                        else llbbox_to_mercator(
                        [float(coord) for coord in bbox])

                    if layer.storeType == "remoteStore":
                        service = layer.remote_service
                        # Probably not a good idea to send the access token to every remote service.
                        # This should never match, so no access token should be sent to remote services.
                        ogc_server_url = urlsplit(
                            ogc_server_settings.PUBLIC_LOCATION).netloc
                        service_url = urlsplit(service.base_url).netloc

                        if access_token and ogc_server_url == service_url and \
                                'access_token' not in service.base_url:
                            url = '%s?access_token=%s' % (service.base_url,
                                                          access_token)
                        else:
                            url = service.base_url
                        map_layers = MapLayer(map=map_obj,
                                              name=layer.typename,
                                              ows_url=layer.ows_url,
                                              layer_params=json.dumps(config),
                                              visibility=True,
                                              source_params=json.dumps({
                                                  "ptype":
                                                  service.ptype,
                                                  "remote":
                                                  True,
                                                  "url":
                                                  url,
                                                  "name":
                                                  service.name,
                                                  "title":
                                                  "[R] %s" % service.title
                                              }))
                    else:
                        ogc_server_url = urlsplit(
                            ogc_server_settings.PUBLIC_LOCATION).netloc
                        layer_url = urlsplit(layer.ows_url).netloc

                        if access_token and ogc_server_url == layer_url and \
                                'access_token' not in layer.ows_url:
                            url = layer.ows_url + '?access_token=' + \
                                access_token
                        else:
                            url = layer.ows_url
                        map_layers = MapLayer(
                            map=map_obj,
                            name=layer.typename,
                            ows_url=url,
                            # use DjangoJSONEncoder to handle Decimal values
                            layer_params=json.dumps(config,
                                                    cls=DjangoJSONEncoder),
                            visibility=True)

                if bbox and len(bbox) >= 4:
                    minx, miny, maxx, maxy = [float(coord) for coord in bbox]
                    x = (minx + maxx) / 2
                    y = (miny + maxy) / 2

                    if getattr(settings, 'DEFAULT_MAP_CRS',
                               'EPSG:3857') == "EPSG:4326":
                        center = list((x, y))
                    else:
                        center = list(forward_mercator((x, y)))

                    if center[1] == float('-inf'):
                        center[1] = 0

                    BBOX_DIFFERENCE_THRESHOLD = 1e-5

                    # Check if the bbox is invalid
                    valid_x = (maxx - minx)**2 > BBOX_DIFFERENCE_THRESHOLD
                    valid_y = (maxy - miny)**2 > BBOX_DIFFERENCE_THRESHOLD

                    if valid_x:
                        width_zoom = math.log(360 / abs(maxx - minx), 2)
                    else:
                        width_zoom = 15

                    if valid_y:
                        height_zoom = math.log(360 / abs(maxy - miny), 2)
                    else:
                        height_zoom = 15

                    map_obj.center_x = center[0]
                    map_obj.center_y = center[1]
                    map_obj.zoom = math.ceil(min(width_zoom, height_zoom))

                map_obj.handle_moderated_uploads()

                config = map_obj.viewer_json(request)
                config['fromLayer'] = True
                context = {
                    'config':
                    json.dumps(config),
                    'create':
                    True,
                    'layers':
                    layers,
                    'map':
                    map_obj,
                    'map_layers':
                    map_layers,
                    'preview':
                    getattr(settings, 'GEONODE_CLIENT_LAYER_PREVIEW_LIBRARY',
                            'leaflet')
                }

            else:
                # list all required layers
                layers = Layer.objects.all()
                context = {'create': True, 'layers': layers}
            return context
Example #44
0
def map_download_qlr(request, mapid):
    """Download QLR file to open the maps' layer in QGIS desktop.

    :param request: The request from the frontend.
    :type request: HttpRequest

    :param mapid: The id of the map.
    :type mapid: String

    :return: QLR file.
    """

    map_obj = _resolve_map(request,
                           mapid,
                           'base.view_resourcebase',
                           _PERMISSION_MSG_VIEW)

    def perm_filter(layer):
        return request.user.has_perm(
            'base.view_resourcebase',
            obj=layer.get_self_resource())

    mapJson = map_obj.json(perm_filter)

    # we need to remove duplicate layers
    j_map = json.loads(mapJson)
    j_layers = j_map["layers"]
    for j_layer in j_layers:
        if j_layer["service"] is None:
            j_layers.remove(j_layer)
            continue
        if (len([_l for _l in j_layers if _l == j_layer])) > 1:
            j_layers.remove(j_layer)

    map_layers = []
    for layer in j_layers:
        layer_name = layer["name"].split(":")[1]
        ogc_url = reverse('qgis_server:layer-request',
                          kwargs={'layername': layer_name})
        url = settings.SITEURL + ogc_url.replace("/", "", 1)

        map_layers.append({
            'type': 'raster',
            'display': layer_name,
            'driver': 'wms',
            'crs': 'EPSG:4326',
            'format': 'image/png',
            'styles': '',
            'layers': layer_name,
            'url': url
        })

    json_layers = json.dumps(map_layers)
    url_server = settings.QGIS_SERVER_URL \
        + '?SERVICE=LAYERDEFINITIONS&LAYERS=' + json_layers
    fwd_request = requests.get(url_server)
    response = HttpResponse(
        fwd_request.content,
        content_type="application/x-qgis-layer-definition",
        status=fwd_request.status_code)
    response['Content-Disposition'] = 'attachment; filename=%s.qlr' \
                                      % map_obj.title

    return response
Example #45
0
def map_metadata(request, mapid, template="maps/cread_map_metadata.html"):

    map_obj = _resolve_map(request, mapid, "base.change_resourcebase_metadata", _PERMISSION_MSG_VIEW)

    cmapqs = CReadResource.objects.filter(resource=map_obj)

    if len(cmapqs) == 0:
        logger.info("cread_resource does not exist for map %r", map_obj)
        cread_resource = None
    else:
        logger.debug("cread_resource found for map %r (%d)", map_obj, len(cmapqs))
        cread_resource = cmapqs[0]

    poc = map_obj.poc
    metadata_author = map_obj.metadata_author
    topic_category = map_obj.category
    cread_subcategory = cread_resource.subcategory if cread_resource else None

    if request.method == "POST":
        baseinfo_form = CReadBaseInfoForm(request.POST, prefix="baseinfo")
        map_form = CReadMapForm(
            # map_form = MapForm(
            request.POST,
            instance=map_obj,
            prefix="resource",
        )
        category_form = CategoryForm(
            request.POST,
            prefix="category_choice_field",
            initial=int(request.POST["category_choice_field"]) if "category_choice_field" in request.POST else None,
        )
        cread_subcategory_form = CReadSubCategoryForm(
            request.POST,
            prefix="cread_subcategory_choice_field",
            initial=int(request.POST["cread_subcategory_choice_field"])
            if "cread_subcategory_choice_field" in request.POST
            else None,
        )
    else:
        baseinfo_form = CReadBaseInfoForm(
            prefix="baseinfo", initial={"title": map_obj.title, "abstract": map_obj.abstract}
        )
        map_form = CReadMapForm(instance=map_obj, prefix="resource")
        category_form = CategoryForm(
            prefix="category_choice_field", initial=topic_category.id if topic_category else None
        )
        cread_subcategory_form = CReadSubCategoryForm(
            prefix="cread_subcategory_choice_field", initial=cread_subcategory.id if cread_subcategory else None
        )

    if (
        request.method == "POST"
        and baseinfo_form.is_valid()
        and map_form.is_valid()
        and cread_subcategory_form.is_valid()
    ):

        new_title = strip_tags(baseinfo_form.cleaned_data["title"])
        new_abstract = strip_tags(baseinfo_form.cleaned_data["abstract"])

        new_poc = map_form.cleaned_data["poc"]
        new_author = map_form.cleaned_data["metadata_author"]
        new_keywords = map_form.cleaned_data["keywords"]

        if new_poc is None:
            if poc is None:
                poc_form = ProfileForm(request.POST, prefix="poc", instance=poc)
            else:
                poc_form = ProfileForm(request.POST, prefix="poc")
            if poc_form.has_changed and poc_form.is_valid():
                new_poc = poc_form.save()

        if new_author is None:
            if metadata_author is None:
                author_form = ProfileForm(request.POST, prefix="author", instance=metadata_author)
            else:
                author_form = ProfileForm(request.POST, prefix="author")
            if author_form.has_changed and author_form.is_valid():
                new_author = author_form.save()

        # CRead category
        # note: call to is_valid is needed to compute the cleaned data
        if cread_subcategory_form.is_valid():
            logger.info("Checking CReadLayer record %r ", cread_subcategory_form.is_valid())
            cread_subcat_id = cread_subcategory_form.cleaned_data["cread_subcategory_choice_field"]
            new_creadsubcategory = CReadSubCategory.objects.get(id=cread_subcat_id)
            new_creadcategory = new_creadsubcategory.category
            logger.debug(
                "Selected cread cat/subcat: %s : %s / %s",
                new_creadcategory.identifier,
                new_creadcategory.name,
                new_creadsubcategory.identifier,
            )

            if cread_resource:
                logger.info("Update CReadResource record")
            else:
                logger.info("Create new CReadResource record")
                cread_resource = CReadResource()
                cread_resource.resource = map_obj

            cread_resource.category = new_creadcategory
            cread_resource.subcategory = new_creadsubcategory
            cread_resource.save()
        else:
            new_creadsubcategory = None
            logger.info("CRead subcategory form is not valid")
        # End cread category

        # Update original topic category according to cread category
        if category_form.is_valid():
            new_category = TopicCategory.objects.get(id=category_form.cleaned_data["category_choice_field"])
        elif new_creadsubcategory:
            logger.debug("Assigning default ISO category from CREAD category")
            new_category = TopicCategory.objects.get(id=new_creadsubcategory.relatedtopic.id)

        if new_poc is not None and new_author is not None:
            the_map = map_form.save()
            the_map.poc = new_poc
            the_map.metadata_author = new_author
            the_map.title = new_title
            the_map.abstract = new_abstract
            the_map.save()
            the_map.keywords.clear()
            the_map.keywords.add(*new_keywords)
            the_map.category = new_category
            the_map.save()

            if getattr(settings, "SLACK_ENABLED", False):
                try:
                    from geonode.contrib.slack.utils import build_slack_message_map, send_slack_messages

                    send_slack_messages(build_slack_message_map("map_edit", the_map))
                except:
                    print "Could not send slack message for modified map."

            return HttpResponseRedirect(reverse("map_detail", args=(map_obj.id,)))

    if poc is None:
        poc_form = ProfileForm(request.POST, prefix="poc")
    else:
        if poc is None:
            poc_form = ProfileForm(instance=poc, prefix="poc")
        else:
            map_form.fields["poc"].initial = poc.id
            poc_form = ProfileForm(prefix="poc")
            poc_form.hidden = True

    if metadata_author is None:
        author_form = ProfileForm(request.POST, prefix="author")
    else:
        if metadata_author is None:
            author_form = ProfileForm(instance=metadata_author, prefix="author")
        else:
            map_form.fields["metadata_author"].initial = metadata_author.id
            author_form = ProfileForm(prefix="author")
            author_form.hidden = True

    # creates cat - subcat association
    categories_struct = []
    for category in CReadCategory.objects.all():
        subcats = []
        for subcat in CReadSubCategory.objects.filter(category=category):
            subcats.append(subcat.id)
        categories_struct.append((category.id, category.description, subcats))

    return render_to_response(
        template,
        RequestContext(
            request,
            {
                "map": map_obj,
                "map_form": map_form,
                "poc_form": poc_form,
                "author_form": author_form,
                "category_form": category_form,
                "baseinfo_form": baseinfo_form,
                "cread_sub_form": cread_subcategory_form,
                "cread_categories": categories_struct,
            },
        ),
    )
Example #46
0
def map_metadata(request, mapid, template='maps/cread_map_metadata.html'):

    map_obj = _resolve_map(request, mapid, 'base.change_resourcebase_metadata',
                           _PERMISSION_MSG_VIEW)

    cmapqs = CReadResource.objects.filter(resource=map_obj)

    if len(cmapqs) == 0:
        logger.info('cread_resource does not exist for map %r', map_obj)
        cread_resource = None
    else:
        logger.debug('cread_resource found for map %r (%d)', map_obj,
                     len(cmapqs))
        cread_resource = cmapqs[0]

    poc = map_obj.poc
    metadata_author = map_obj.metadata_author
    topic_category = map_obj.category
    cread_subcategory = cread_resource.subcategory if cread_resource else None

    if request.method == "POST":
        baseinfo_form = CReadBaseInfoForm(request.POST, prefix="baseinfo")
        map_form = CReadMapForm(
            #map_form = MapForm(
            request.POST,
            instance=map_obj,
            prefix="resource")
        category_form = CategoryForm(
            request.POST,
            prefix="category_choice_field",
            initial=int(request.POST["category_choice_field"])
            if "category_choice_field" in request.POST else None)
        cread_subcategory_form = CReadSubCategoryForm(
            request.POST,
            prefix="cread_subcategory_choice_field",
            initial=int(request.POST["cread_subcategory_choice_field"])
            if "cread_subcategory_choice_field" in request.POST else None)
    else:
        baseinfo_form = CReadBaseInfoForm(prefix="baseinfo",
                                          initial={
                                              'title': map_obj.title,
                                              'abstract': map_obj.abstract
                                          })
        map_form = CReadMapForm(instance=map_obj, prefix="resource")
        category_form = CategoryForm(
            prefix="category_choice_field",
            initial=topic_category.id if topic_category else None)
        cread_subcategory_form = CReadSubCategoryForm(
            prefix="cread_subcategory_choice_field",
            initial=cread_subcategory.id if cread_subcategory else None)

    if request.method == "POST" \
            and baseinfo_form.is_valid() \
            and map_form.is_valid() \
            and cread_subcategory_form.is_valid():

        new_title = strip_tags(baseinfo_form.cleaned_data['title'])
        new_abstract = strip_tags(baseinfo_form.cleaned_data['abstract'])

        new_poc = map_form.cleaned_data['poc']
        new_author = map_form.cleaned_data['metadata_author']
        new_keywords = map_form.cleaned_data['keywords']

        if new_poc is None:
            if poc is None:
                poc_form = ProfileForm(request.POST,
                                       prefix="poc",
                                       instance=poc)
            else:
                poc_form = ProfileForm(request.POST, prefix="poc")
            if poc_form.has_changed and poc_form.is_valid():
                new_poc = poc_form.save()

        if new_author is None:
            if metadata_author is None:
                author_form = ProfileForm(request.POST,
                                          prefix="author",
                                          instance=metadata_author)
            else:
                author_form = ProfileForm(request.POST, prefix="author")
            if author_form.has_changed and author_form.is_valid():
                new_author = author_form.save()

        # CRead category
        # note: call to is_valid is needed to compute the cleaned data
        if (cread_subcategory_form.is_valid()):
            logger.info("Checking CReadLayer record %r ",
                        cread_subcategory_form.is_valid())
            cread_subcat_id = cread_subcategory_form.cleaned_data[
                'cread_subcategory_choice_field']
            new_creadsubcategory = CReadSubCategory.objects.get(
                id=cread_subcat_id)
            new_creadcategory = new_creadsubcategory.category
            logger.debug("Selected cread cat/subcat: %s : %s / %s",
                         new_creadcategory.identifier, new_creadcategory.name,
                         new_creadsubcategory.identifier)

            if cread_resource:
                logger.info("Update CReadResource record")
            else:
                logger.info("Create new CReadResource record")
                cread_resource = CReadResource()
                cread_resource.resource = map_obj

            cread_resource.category = new_creadcategory
            cread_resource.subcategory = new_creadsubcategory
            cread_resource.save()
        else:
            new_creadsubcategory = None
            logger.info("CRead subcategory form is not valid")
        # End cread category

        # Update original topic category according to cread category
        if category_form.is_valid():
            new_category = TopicCategory.objects.get(
                id=category_form.cleaned_data['category_choice_field'])
        elif new_creadsubcategory:
            logger.debug("Assigning default ISO category from CREAD category")
            new_category = TopicCategory.objects.get(
                id=new_creadsubcategory.relatedtopic.id)

        if new_poc is not None and new_author is not None:
            the_map = map_form.save()
            the_map.poc = new_poc
            the_map.metadata_author = new_author
            the_map.title = new_title
            the_map.abstract = new_abstract
            the_map.save()
            the_map.keywords.clear()
            the_map.keywords.add(*new_keywords)
            the_map.category = new_category
            the_map.save()

            if getattr(settings, 'SLACK_ENABLED', False):
                try:
                    from geonode.contrib.slack.utils import build_slack_message_map, send_slack_messages
                    send_slack_messages(
                        build_slack_message_map("map_edit", the_map))
                except:
                    print "Could not send slack message for modified map."

            return HttpResponseRedirect(
                reverse('map_detail', args=(map_obj.id, )))

    if poc is None:
        poc_form = ProfileForm(request.POST, prefix="poc")
    else:
        if poc is None:
            poc_form = ProfileForm(instance=poc, prefix="poc")
        else:
            map_form.fields['poc'].initial = poc.id
            poc_form = ProfileForm(prefix="poc")
            poc_form.hidden = True

    if metadata_author is None:
        author_form = ProfileForm(request.POST, prefix="author")
    else:
        if metadata_author is None:
            author_form = ProfileForm(instance=metadata_author,
                                      prefix="author")
        else:
            map_form.fields['metadata_author'].initial = metadata_author.id
            author_form = ProfileForm(prefix="author")
            author_form.hidden = True

    # creates cat - subcat association
    categories_struct = []
    for category in CReadCategory.objects.all():
        subcats = []
        for subcat in CReadSubCategory.objects.filter(category=category):
            subcats.append(subcat.id)
        categories_struct.append((category.id, category.description, subcats))

    return render_to_response(
        template,
        RequestContext(
            request, {
                "map": map_obj,
                "map_form": map_form,
                "poc_form": poc_form,
                "author_form": author_form,
                "category_form": category_form,
                "baseinfo_form": baseinfo_form,
                "cread_sub_form": cread_subcategory_form,
                "cread_categories": categories_struct
            }))
Example #47
0
    def get_context_data(self, **kwargs):
        request = self.request
        if request and 'access_token' in request.session:
            access_token = request.session['access_token']
        else:
            access_token = None

        snapshot = self.kwargs.get('snapshot')

        DEFAULT_MAP_CONFIG, DEFAULT_BASE_LAYERS = default_map_config(request)

        layers = Layer.objects.all()

        if request.method == 'GET' and 'copy' in request.GET:
            """Prepare context data."""
            request = self.request
            mapid = self.request.GET['copy']

            map_obj = _resolve_map(
                request, mapid, 'base.view_resourcebase', _PERMISSION_MSG_VIEW)

            if snapshot is None:
                config = map_obj.viewer_json(request)
            else:
                config = snapshot_config(snapshot, map_obj, request)
            # list all required layers
            map_layers = MapLayer.objects.filter(
                map_id=mapid).order_by('stack_order')
            context = {
                'config': json.dumps(config),
                'create': False,
                'layers': layers,
                'map': map_obj,
                'map_layers': map_layers,
                'preview': getattr(
                    settings,
                    'GEONODE_CLIENT_LAYER_PREVIEW_LIBRARY',
                    '')
            }
            return context
        else:
            if request.method == 'GET':
                params = request.GET
            elif request.method == 'POST':
                params = request.POST
            else:
                return self.render_to_response(status=405)

            if 'layer' in params:
                bbox = None
                map_obj = Map(projection=getattr(
                    settings, 'DEFAULT_MAP_CRS', 'EPSG:3857'))

                for layer_name in params.getlist('layer'):
                    try:
                        layer = _resolve_layer(request, layer_name)
                    except ObjectDoesNotExist:
                        # bad layer, skip
                        continue

                    if not request.user.has_perm(
                            'view_resourcebase',
                            obj=layer.get_self_resource()):
                        # invisible layer, skip inclusion
                        continue

                    layer_bbox = layer.bbox
                    # assert False, str(layer_bbox)
                    if bbox is None:
                        bbox = list(layer_bbox[0:4])
                    else:
                        bbox[0] = min(bbox[0], layer_bbox[0])
                        bbox[1] = min(bbox[1], layer_bbox[1])
                        bbox[2] = max(bbox[2], layer_bbox[2])
                        bbox[3] = max(bbox[3], layer_bbox[3])

                    config = layer.attribute_config()

                    # Add required parameters for GXP lazy-loading
                    config["title"] = layer.title
                    config["queryable"] = True

                    config["srs"] = getattr(settings,
                                            'DEFAULT_MAP_CRS', 'EPSG:3857')
                    config["bbox"] = bbox if config["srs"] != 'EPSG:3857' \
                        else llbbox_to_mercator(
                        [float(coord) for coord in bbox])

                    if layer.storeType == "remoteStore":
                        service = layer.remote_service
                        # Probably not a good idea to send the access token to every remote service.
                        # This should never match, so no access token should be sent to remote services.
                        ogc_server_url = urlparse.urlsplit(
                            ogc_server_settings.PUBLIC_LOCATION).netloc
                        service_url = urlparse.urlsplit(
                            service.base_url).netloc

                        if access_token and ogc_server_url == service_url and \
                                'access_token' not in service.base_url:
                            url = '%s?access_token=%s' % (service.base_url, access_token)
                        else:
                            url = service.base_url
                        map_layers = MapLayer(map=map_obj,
                                              name=layer.typename,
                                              ows_url=layer.ows_url,
                                              layer_params=json.dumps(config),
                                              visibility=True,
                                              source_params=json.dumps({
                                                "ptype": service.ptype,
                                                "remote": True,
                                                "url": url,
                                                "name": service.name,
                                                "title": "[R] %s" % service.title}))
                    else:
                        ogc_server_url = urlparse.urlsplit(
                            ogc_server_settings.PUBLIC_LOCATION).netloc
                        layer_url = urlparse.urlsplit(layer.ows_url).netloc

                        if access_token and ogc_server_url == layer_url and \
                                'access_token' not in layer.ows_url:
                            url = layer.ows_url + '?access_token=' + \
                                  access_token
                        else:
                            url = layer.ows_url
                        map_layers = MapLayer(
                            map=map_obj,
                            name=layer.typename,
                            ows_url=url,
                            # use DjangoJSONEncoder to handle Decimal values
                            layer_params=json.dumps(
                                config,
                                cls=DjangoJSONEncoder),
                            visibility=True
                        )

                if bbox and len(bbox) >= 4:
                    minx, miny, maxx, maxy = [float(coord) for coord in bbox]
                    x = (minx + maxx) / 2
                    y = (miny + maxy) / 2

                    if getattr(settings,
                               'DEFAULT_MAP_CRS', 'EPSG:3857') == "EPSG:4326":
                        center = list((x, y))
                    else:
                        center = list(forward_mercator((x, y)))

                    if center[1] == float('-inf'):
                        center[1] = 0

                    BBOX_DIFFERENCE_THRESHOLD = 1e-5

                    # Check if the bbox is invalid
                    valid_x = (maxx - minx) ** 2 > BBOX_DIFFERENCE_THRESHOLD
                    valid_y = (maxy - miny) ** 2 > BBOX_DIFFERENCE_THRESHOLD

                    if valid_x:
                        width_zoom = math.log(360 / abs(maxx - minx), 2)
                    else:
                        width_zoom = 15

                    if valid_y:
                        height_zoom = math.log(360 / abs(maxy - miny), 2)
                    else:
                        height_zoom = 15

                    map_obj.center_x = center[0]
                    map_obj.center_y = center[1]
                    map_obj.zoom = math.ceil(min(width_zoom, height_zoom))

                map_obj.handle_moderated_uploads()

                if snapshot is None:
                    config = map_obj.viewer_json(request)
                else:
                    config = snapshot_config(snapshot, map_obj, request)

                config['fromLayer'] = True
                context = {
                    'config': json.dumps(config),
                    'create': True,
                    'layers': layers,
                    'map': map_obj,
                    'map_layers': map_layers,
                    'preview': getattr(
                        settings,
                        'GEONODE_CLIENT_LAYER_PREVIEW_LIBRARY',
                        '')
                }

            else:
                # list all required layers
                layers = Layer.objects.all()
                context = {
                    'create': True,
                    'layers': layers
                }
            return context
Example #48
0
def getOverviewMaps(request):
	selectedBox = request.GET['send']

	map_obj = _resolve_map(request, request.GET['mapID'], 'base.view_resourcebase', _PERMISSION_MSG_VIEW)
	queryset = matrix(user=request.user,resourceid=map_obj,action='Interactive Map Download')
	queryset.save()

	response = HttpResponse(content_type="image/png")
	url = 'http://asdc.immap.org/geoserver/geonode/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&LAYERS=geonode%3Aafg_admbnda_adm2%2Cgeonode%3Aafg_admbnda_adm1&STYLES=overview_adm2,overview_adm1&SRS=EPSG%3A4326&WIDTH=292&HEIGHT=221&BBOX=59.150390625%2C28.135986328125%2C76.025390625%2C38.792724609375'
	# url2='http://asdc.immap.org/geoserver/geonode/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&SRS=EPSG%3A4326&WIDTH=768&HEIGHT=485&BBOX=59.150390625%2C28.135986328125%2C76.025390625%2C38.792724609375&SLD_BODY='+selectedBox
	url2='http://asdc.immap.org/geoserver/geonode/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&SRS=EPSG%3A4326&WIDTH=292&HEIGHT=221&BBOX=59.150390625%2C28.135986328125%2C76.025390625%2C38.792724609375'
	template = '<sld:StyledLayerDescriptor xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" xmlns:sld="http://www.opengis.net/sld" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" version="1.0.0">'
	template +='<sld:UserLayer>'
	template +=     '<sld:Name>Inline</sld:Name>'
	template +=      '<sld:InlineFeature>'
	template +=         '<sld:FeatureCollection>'
	template +=             '<gml:featureMember>'
	template +=                 '<feature>'
	template +=                     '<polygonProperty>'
	template +=                         '<gml:Polygon  srsName="4326">'
	template +=                             '<gml:outerBoundaryIs>'
	template +=                                 '<gml:LinearRing>'
	template +=                                     '<gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">'+selectedBox
	template +=                                     '</gml:coordinates>'
	template +=                                 '</gml:LinearRing>'
	template +=                             '</gml:outerBoundaryIs>'
	template +=                         '</gml:Polygon>'
	template +=                      '</polygonProperty>'
	template +=                      '<title>Pacific NW</title>'
	template +=                 '</feature>'
	template +=             '</gml:featureMember>'
	template +=         '</sld:FeatureCollection>'
	template +=     '</sld:InlineFeature>'
	template +=     '<sld:UserStyle>'
	template +=         '<sld:FeatureTypeStyle>'
	template +=             '<sld:Rule>'
	template +=                 '<sld:PolygonSymbolizer>'
	template +=                     '<sld:Stroke>'
	template +=                         '<sld:CssParameter name="stroke">#FF0000</sld:CssParameter>'
	template +=                         '<sld:CssParameter name="stroke-width">1</sld:CssParameter>'
	template +=                     '</sld:Stroke>'
	template +=                 '</sld:PolygonSymbolizer>'
	template +=             '</sld:Rule>'
	template +=         '</sld:FeatureTypeStyle>'
	template +=     '</sld:UserStyle>'
	template += '</sld:UserLayer>'
	template +='</sld:StyledLayerDescriptor>'

	header = {
		"Content-Type": "application/json",
		"Authorization": "Basic " + base64.encodestring("boedy1996:kontol").replace('\n', '')
	}

	request1 = urllib2.Request(url, None, header)

	input_file = StringIO(urllib2.urlopen(request1).read())


	background = Image.open(input_file)

	values = {'SLD_BODY' : template}
	data = urllib.urlencode(values)


	request2 = urllib2.Request(url2, data)
	request2.add_header('Authorization', "Basic " + base64.encodestring("boedy1996:kontol").replace('\n', ''))
	response2 = urllib2.urlopen(request2)

	input_file2 = StringIO(response2.read())
	# input_file = StringIO(urllib2.urlopen(request2,data).read())

	overlay = Image.open(input_file2)

	new_img = Image.blend(background, overlay, 0.5)  #background.paste(overlay, overlay.size, overlay)

	new_img.save(response, 'PNG', quality=300)
	background.save(response, 'PNG', quality=300)

	return response