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
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
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
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', '') })
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', '') }))
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 })
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")
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', '') })
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
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_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], }))
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)
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')
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")
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")
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)
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')
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)
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)
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 )
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 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
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
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 }))
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)
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)
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)
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 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)
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()
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
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
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
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
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
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, }, ), )
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 }))
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
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