def geoserver_post_save_map(instance, sender, **kwargs): instance.set_missing_info() local_layers = [] for layer in instance.layers: if layer.local: local_layers.append(layer.name) # If the map does not have any local layers, do not create the thumbnail. if len(local_layers) > 0: params = { 'layers': ",".join(local_layers).encode('utf-8'), 'format': 'image/png8', 'width': 200, 'height': 150, } # Add the bbox param only if the bbox is different to [None, None, # None, None] if None not in instance.bbox: params['bbox'] = instance.bbox_string # Avoid using urllib.urlencode here because it breaks the url. # commas and slashes in values get encoded and then cause trouble # with the WMS parser. p = "&".join("%s=%s" % item for item in params.items()) thumbnail_remote_url = ogc_server_settings.PUBLIC_LOCATION + \ "wms/reflect?" + p thumbnail_create_url = ogc_server_settings.LOCATION + \ "wms/reflect?" + p create_thumbnail(instance, thumbnail_remote_url, thumbnail_create_url, check_bbox=False) #Assuming map thumbnail was created successfully, updating Story object here if instance.chapter_index == 0: instance.story.update_thumbnail(instance) try: # update the elastic search index for the object after post_save triggers have fired. # TODO: this should be done asynchronously! update_es_index(sender, sender.objects.get(id=instance.id)) update_es_index(MapStory, MapStory.objects.get(id=instance.story.id)) except: pass
def geoserver_post_save_map(instance, sender, **kwargs): instance.set_missing_info() local_layers = [] for layer in instance.layers: if layer.local: local_layers.append(layer.name) # If the map does not have any local layers, do not create the thumbnail. if len(local_layers) > 0: params = { 'layers': ",".join(local_layers).encode('utf-8'), 'format': 'image/png8', 'width': 200, 'height': 150, } # Add the bbox param only if the bbox is different to [None, None, # None, None] if None not in instance.bbox: params['bbox'] = instance.bbox_string # Avoid using urllib.urlencode here because it breaks the url. # commas and slashes in values get encoded and then cause trouble # with the WMS parser. p = "&".join("%s=%s" % item for item in params.items()) thumbnail_remote_url = ogc_server_settings.PUBLIC_LOCATION + \ "wms/reflect?" + p thumbnail_create_url = ogc_server_settings.LOCATION + \ "wms/reflect?" + p create_thumbnail(instance, thumbnail_remote_url, thumbnail_create_url, check_bbox=False) try: # update the elastic search index for the object after post_save triggers have fired. # TODO: this should be done asynchronously! update_es_index(sender, sender.objects.get(id=instance.id)) except: pass
def map_detail(request, slug, snapshot=None, template='maps/map_detail.html'): ''' The view that show details of each map ''' # MapStory specific change from mapid parameter to slug parameter map_obj = _resolve_map( request, slug, '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 '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, access_token) else: config = snapshot_config(snapshot, map_obj, request.user, access_token) config = json.dumps(config) layers = MapLayer.objects.filter(map=map_obj.id) links = map_obj.link_set.download() group = None if map_obj.group: try: group = GroupProfile.objects.get(slug=map_obj.group.name) except GroupProfile.DoesNotExist: group = None ### # MapStory Specific Changes ### chapters = map_obj.chapters # Overwrite the layers list so that we can add all layers from all chapters. layers = [] for chapter in chapters: layers = layers + list(chapter.local_layers) keywords = json.dumps([tag.name for tag in map_obj.keywords.all()]) if request.method == "POST": keywords_form = KeywordsForm(request.POST, instance=map_obj) published_form = PublishStatusForm(instance=map_obj) if 'keywords' in request.POST: if keywords_form.is_valid(): new_keywords = keywords_form.cleaned_data['keywords'] map_obj.keywords.add(*new_keywords) map_obj.save() published_form = PublishStatusForm(instance=map_obj) elif 'published_submit_btn' in request.POST: published_form = PublishStatusForm(request.POST, instance=map_obj) if published_form.is_valid(): published_form.save() map_obj.is_published = published_form.cleaned_data['is_published'] map_obj.save() keywords_form = KeywordsForm(instance=map_obj) elif 'add_keyword' in request.POST: map_obj.keywords.add(request.POST['add_keyword']) map_obj.save() elif 'remove_keyword' in request.POST: map_obj.keywords.remove(request.POST['remove_keyword']) map_obj.save() else: keywords_form = KeywordsForm(instance=map_obj) published_form = PublishStatusForm(instance=map_obj) map_thumbnail = map_obj.get_thumbnail_url update_es_index(MapStory, MapStory.objects.get(id=map_obj.id)) # This will get URL encoded later and is used for the social media share URL share_url = "https://%s/story/%s" % (request.get_host(), map_obj.slug) share_title = "%s by %s." % (map_obj.title, map_obj.owner) share_description = map_obj.abstract # Check if user is admin in one of those organizations org_admin_memberships = [] memberships = OrganizationMembership.objects.filter( user_id=request.user.pk) for membership in memberships.all(): if membership.is_admin: org_admin_memberships.append(membership) if len(org_admin_memberships) < 1: org_admin_memberships = None ini_memberships = InitiativeMembership.objects.filter( user_id=request.user.pk) ini_admin_memberships = [] for m in ini_memberships.all(): if m.is_admin: ini_admin_memberships.append(m) if len(ini_admin_memberships) < 1: ini_admin_memberships = None ### # End MapStory Specific Changes ### context_dict = { 'config': config, 'resource': map_obj, 'group': group, '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, # MapStory Specific Additions 'keywords': keywords, 'keywords_form': keywords_form, 'published_form': published_form, 'thumbnail': map_thumbnail, 'share_url': share_url, 'share_title': share_title, 'share_description': share_description, 'organizations': org_admin_memberships, 'initiatives': ini_admin_memberships, } 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) # Favorites if request.user.is_authenticated(): context_dict["favorite_info"] = get_favorite_info( request.user, map_obj) return render(request, template, context=context_dict)
def geoserver_post_save(instance, sender, **kwargs): """Save keywords to GeoServer The way keywords are implemented requires the layer to be saved to the database before accessing them. """ if type(instance) is ResourceBase: if hasattr(instance, 'layer'): instance = instance.layer else: return if instance.storeType == "remoteStore": # Save layer attributes set_attributes(instance) return if not getattr(instance, 'gs_resource', None): try: gs_resource = gs_catalog.get_resource(instance.name, store=instance.store, workspace=instance.workspace) except socket_error as serr: if serr.errno != errno.ECONNREFUSED: # Not the error we are looking for, re-raise raise serr # If the connection is refused, take it easy. return else: gs_resource = instance.gs_resource if gs_resource is None: return if settings.RESOURCE_PUBLISHING: if instance.is_published != gs_resource.advertised: if getattr(ogc_server_settings, "BACKEND_WRITE_ENABLED", True): gs_resource.advertised = instance.is_published gs_catalog.save(gs_resource) if any(instance.keyword_list()): gs_resource.keywords = instance.keyword_list() # gs_resource should only be called if # ogc_server_settings.BACKEND_WRITE_ENABLED == True if getattr(ogc_server_settings, "BACKEND_WRITE_ENABLED", True): gs_catalog.save(gs_resource) bbox = gs_resource.latlon_bbox dx = float(bbox[1]) - float(bbox[0]) dy = float(bbox[3]) - float(bbox[2]) dataAspect = 1 if dy == 0 else dx / dy height = 550 width = int(height * dataAspect) # Set download links for WMS, WCS or WFS and KML links = wms_links(ogc_server_settings.public_url + 'wms?', instance.typename.encode('utf-8'), instance.bbox_string, instance.srid, height, width) for ext, name, mime, wms_url in links: Link.objects.get_or_create(resource=instance.resourcebase_ptr, name=ugettext(name), defaults=dict( extension=ext, url=wms_url, mime=mime, link_type='image', )) if instance.storeType == "dataStore": links = wfs_links(ogc_server_settings.public_url + 'wfs?', instance.typename.encode('utf-8')) for ext, name, mime, wfs_url in links: if mime == 'SHAPE-ZIP': name = 'Zipped Shapefile' Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=wfs_url, defaults=dict( extension=ext, name=name, mime=mime, url=wfs_url, link_type='data', )) if gs_resource.store.type and gs_resource.store.type.lower() == 'geogig' and \ gs_resource.store.connection_parameters.get('geogig_repository'): repo_url = '{url}geogig/{geogig_repository}'.format( url=ogc_server_settings.public_url, geogig_repository=gs_resource.store.connection_parameters.get( 'geogig_repository')) path = gs_resource.dom.findall('nativeName') if path: path = 'path={path}'.format(path=path[0].text) Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=repo_url, defaults=dict(extension='html', name='Clone in GeoGig', mime='text/xml', link_type='html')) def command_url(command): return "{repo_url}/{command}.json?{path}".format( repo_url=repo_url, path=path, command=command) Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=command_url('log'), defaults=dict(extension='json', name='GeoGig log', mime='application/json', link_type='html')) Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=command_url('statistics'), defaults=dict(extension='json', name='GeoGig statistics', mime='application/json', link_type='html')) elif instance.storeType == 'coverageStore': # FIXME(Ariel): This works for public layers, does it work for restricted too? # would those end up with no geotiff links, like, forever? permissions = instance.get_all_level_info() instance.set_permissions( {'users': { 'AnonymousUser': ['view_resourcebase'] }}) try: # Potentially 3 dimensions can be returned by the grid if there is a z # axis. Since we only want width/height, slice to the second # dimension covWidth, covHeight = get_coverage_grid_extent(instance)[:2] except GeoNodeException as e: msg = _('Could not create a download link for layer.') logger.warn(msg, e) else: links = wcs_links(ogc_server_settings.public_url + 'wcs?', instance.typename.encode('utf-8'), bbox=gs_resource.native_bbox[:-1], crs=gs_resource.native_bbox[-1], height=str(covHeight), width=str(covWidth)) for ext, name, mime, wcs_url in links: Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=wcs_url, defaults=dict( extension=ext, name=name, mime=mime, link_type='data', )) instance.set_permissions(permissions) kml_reflector_link_download = ogc_server_settings.public_url + "wms/kml?" + \ urllib.urlencode({'layers': instance.typename.encode('utf-8'), 'mode': "download"}) Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=kml_reflector_link_download, defaults=dict( extension='kml', name="KML", mime='text/xml', link_type='data', )) kml_reflector_link_view = ogc_server_settings.public_url + "wms/kml?" + \ urllib.urlencode({'layers': instance.typename.encode('utf-8'), 'mode': "refresh"}) Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=kml_reflector_link_view, defaults=dict( extension='kml', name="View in Google Earth", mime='text/xml', link_type='data', )) tile_url = ('%sgwc/service/gmaps?' % ogc_server_settings.public_url + 'layers=%s' % instance.typename.encode('utf-8') + '&zoom={z}&x={x}&y={y}' + '&format=image/png8') Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=tile_url, defaults=dict( extension='tiles', name="Tiles", mime='image/png', link_type='image', )) html_link_url = '%s%s' % (settings.SITEURL[:-1], instance.get_absolute_url()) Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=html_link_url, defaults=dict( extension='html', name=instance.typename, mime='text/html', link_type='html', )) params = { 'layers': instance.typename.encode('utf-8'), 'format': 'image/png8', 'width': 200, 'height': 150, } # Avoid using urllib.urlencode here because it breaks the url. # commas and slashes in values get encoded and then cause trouble # with the WMS parser. p = "&".join("%s=%s" % item for item in params.items()) thumbnail_remote_url = ogc_server_settings.PUBLIC_LOCATION + \ "wms/reflect?" + p thumbnail_create_url = ogc_server_settings.LOCATION + \ "wms/reflect?" + p create_thumbnail(instance, thumbnail_remote_url, thumbnail_create_url, ogc_client=http_client) legend_url = ogc_server_settings.PUBLIC_LOCATION + \ 'wms?request=GetLegendGraphic&format=image/png&WIDTH=20&HEIGHT=20&LAYER=' + \ instance.typename + '&legend_options=fontAntiAliasing:true;fontSize:12;forceLabels:on' Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=legend_url, defaults=dict( extension='png', name='Legend', url=legend_url, mime='image/png', link_type='image', )) ogc_wms_path = '%s/wms' % instance.workspace ogc_wms_url = urljoin(ogc_server_settings.public_url, ogc_wms_path) ogc_wms_name = 'OGC WMS: %s Service' % instance.workspace Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=ogc_wms_url, defaults=dict( extension='html', name=ogc_wms_name, url=ogc_wms_url, mime='text/html', link_type='OGC:WMS', )) if instance.storeType == "dataStore": ogc_wfs_path = '%s/wfs' % instance.workspace ogc_wfs_url = urljoin(ogc_server_settings.public_url, ogc_wfs_path) ogc_wfs_name = 'OGC WFS: %s Service' % instance.workspace Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=ogc_wfs_url, defaults=dict( extension='html', name=ogc_wfs_name, url=ogc_wfs_url, mime='text/html', link_type='OGC:WFS', )) if instance.storeType == "coverageStore": ogc_wcs_path = '%s/wcs' % instance.workspace ogc_wcs_url = urljoin(ogc_server_settings.public_url, ogc_wcs_path) ogc_wcs_name = 'OGC WCS: %s Service' % instance.workspace Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=ogc_wcs_url, defaults=dict( extension='html', name=ogc_wcs_name, url=ogc_wcs_url, mime='text/html', link_type='OGC:WCS', )) # remove links that belong to and old address for link in instance.link_set.all(): if not urlparse(settings.SITEURL).hostname == urlparse( link.url).hostname and not urlparse( ogc_server_settings.public_url).hostname == urlparse( link.url).hostname: link.delete() # Save layer attributes set_attributes(instance) # Save layer styles set_styles(instance, gs_catalog) # NOTTODO by simod: we should not do this! # need to be removed when fixing #2015 from geonode.catalogue.models import catalogue_post_save from geonode.layers.models import Layer catalogue_post_save(instance, Layer) try: # update the elastic search index for the object after post_save triggers have fired. update_es_index(sender, sender.objects.get(id=instance.id)) except: pass
def map_detail(request, slug, snapshot=None, template='maps/map_detail.html'): ''' The view that show details of each map ''' # MapStory specific change from mapid parameter to slug parameter map_obj = _resolve_map(request, slug, '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 '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, access_token) else: config = snapshot_config(snapshot, map_obj, request.user, access_token) config = json.dumps(config) layers = MapLayer.objects.filter(map=map_obj.id) links = map_obj.link_set.download() group = None if map_obj.group: try: group = GroupProfile.objects.get(slug=map_obj.group.name) except GroupProfile.DoesNotExist: group = None ### # MapStory Specific Changes ### chapters = map_obj.chapters # Overwrite the layers list so that we can add all layers from all chapters. layers = [] for chapter in chapters: layers = layers + list(chapter.local_layers) keywords = json.dumps([tag.name for tag in map_obj.keywords.all()]) if request.method == "POST": keywords_form = KeywordsForm(request.POST, instance=map_obj) published_form = PublishStatusForm(instance=map_obj) if 'keywords' in request.POST: if keywords_form.is_valid(): new_keywords = keywords_form.cleaned_data['keywords'] map_obj.keywords.add(*new_keywords) map_obj.save() published_form = PublishStatusForm(instance=map_obj) elif 'published_submit_btn' in request.POST: published_form = PublishStatusForm(request.POST, instance=map_obj) if published_form.is_valid(): published_form.save() map_obj.is_published = published_form.cleaned_data[ 'is_published'] map_obj.save() keywords_form = KeywordsForm(instance=map_obj) elif 'add_keyword' in request.POST: map_obj.keywords.add(request.POST['add_keyword']) map_obj.save() elif 'remove_keyword' in request.POST: map_obj.keywords.remove(request.POST['remove_keyword']) map_obj.save() else: keywords_form = KeywordsForm(instance=map_obj) published_form = PublishStatusForm(instance=map_obj) map_thumbnail = map_obj.get_thumbnail_url update_es_index(MapStory, MapStory.objects.get(id=map_obj.id)) # This will get URL encoded later and is used for the social media share URL share_url = "https://%s/story/%s" % (request.get_host(), map_obj.slug) share_title = "%s by %s." % (map_obj.title, map_obj.owner) share_description = map_obj.abstract # Check if user is admin in one of those organizations org_admin_memberships = [] memberships = OrganizationMembership.objects.filter( user_id=request.user.pk) for membership in memberships.all(): if membership.is_admin: org_admin_memberships.append(membership) if len(org_admin_memberships) < 1: org_admin_memberships = None ini_memberships = InitiativeMembership.objects.filter( user_id=request.user.pk) ini_admin_memberships = [] for m in ini_memberships.all(): if m.is_admin: ini_admin_memberships.append(m) if len(ini_admin_memberships) < 1: ini_admin_memberships = None ### # End MapStory Specific Changes ### context_dict = { 'config': config, 'resource': map_obj, 'group': group, '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, # MapStory Specific Additions 'keywords': keywords, 'keywords_form': keywords_form, 'published_form': published_form, 'thumbnail': map_thumbnail, 'share_url': share_url, 'share_title': share_title, 'share_description': share_description, 'organizations': org_admin_memberships, 'initiatives': ini_admin_memberships, } 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) # Favorites if request.user.is_authenticated(): context_dict["favorite_info"] = get_favorite_info( request.user, map_obj) return render(request, template, context=context_dict)
def map_detail(request, mapid, snapshot=None, template='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: MapStory.objects.filter(id=map_obj.id).update(popular_count=F('popular_count') + 1) if snapshot is None: config = map_obj.viewer_json(request.user) else: config = snapshot_config(snapshot, map_obj, request.user) config = json.dumps(config) chapters = map_obj.chapters layers = [] for chapter in chapters: layers = layers + list(chapter.local_layers) keywords = json.dumps([tag.name for tag in map_obj.keywords.all()]) if request.method == "POST": keywords_form = KeywordsForm(request.POST, instance=map_obj) published_form = PublishStatusForm(instance=map_obj) if 'keywords' in request.POST: if keywords_form.is_valid(): keywords_form.save() new_keywords = keywords_form.cleaned_data['keywords'] map_obj.keywords.set(*new_keywords) map_obj.save() published_form = PublishStatusForm(instance=map_obj) elif 'published_submit_btn' in request.POST: published_form = PublishStatusForm(request.POST, instance=map_obj) if published_form.is_valid(): published_form.save() map_obj.is_published = published_form.cleaned_data['is_published'] map_obj.save() keywords_form = KeywordsForm(instance=map_obj) elif 'add_keyword' in request.POST: map_obj.keywords.add(request.POST['add_keyword']) map_obj.save() elif 'remove_keyword' in request.POST: map_obj.keywords.remove(request.POST['remove_keyword']) map_obj.save() else: keywords_form = KeywordsForm(instance=map_obj) published_form = PublishStatusForm(instance=map_obj) map_thumbnail_dir = os.path.join(settings.MEDIA_ROOT, 'thumbs') map_default_thumbnail_array = map_obj.get_thumbnail_url().split('/') map_default_thumbnail_name = 'map' + str(mapid) + '.jpg' map_default_thumbnail = os.path.join(map_thumbnail_dir, map_default_thumbnail_name) # TODO: create function to handle map and layer thumbs if request.method == 'POST': map_thumb_form = ThumbnailImageForm(request.POST, request.FILES) if map_thumb_form.is_valid(): map_new_img = ThumbnailImage( thumbnail_image=request.FILES['thumbnail_image'] ) map_new_img.save() map_obj.save_thumbnail(map_default_thumbnail_name, map_new_img) map_user_upload_thumbnail = ThumbnailImage.objects.all()[0] map_user_upload_thumbnail_filepath = str( map_user_upload_thumbnail.thumbnail_image ) os.rename(map_user_upload_thumbnail_filepath, map_default_thumbnail) else: map_thumb_form = ThumbnailImageForm() map_thumbnail = map_obj.get_thumbnail_url update_es_index(MapStory, MapStory.objects.get(id=map_obj.id)) context_dict = { 'config': config, 'resource': map_obj, 'layers': layers, 'keywords': keywords, 'permissions_json': _perms_info_json(map_obj), 'documents': get_related_documents(map_obj), 'keywords_form': keywords_form, 'published_form': published_form, 'thumbnail': map_thumbnail, 'thumb_form': map_thumb_form } if settings.SOCIAL_ORIGINS: context_dict["social_links"] = build_social_links(request, map_obj) return render_to_response(template, RequestContext(request, context_dict))
def map_detail(request, mapid, snapshot=None, template='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: MapStory.objects.filter(id=map_obj.id).update( popular_count=F('popular_count') + 1) if snapshot is None: config = map_obj.viewer_json(request.user) else: config = snapshot_config(snapshot, map_obj, request.user) config = json.dumps(config) chapters = map_obj.chapters layers = [] for chapter in chapters: layers = layers + list(chapter.local_layers) keywords = json.dumps([tag.name for tag in map_obj.keywords.all()]) if request.method == "POST": keywords_form = KeywordsForm(request.POST, instance=map_obj) published_form = PublishStatusForm(instance=map_obj) if 'keywords' in request.POST: if keywords_form.is_valid(): keywords_form.save() new_keywords = keywords_form.cleaned_data['keywords'] map_obj.keywords.set(*new_keywords) map_obj.save() published_form = PublishStatusForm(instance=map_obj) elif 'published_submit_btn' in request.POST: published_form = PublishStatusForm(request.POST, instance=map_obj) if published_form.is_valid(): published_form.save() map_obj.is_published = published_form.cleaned_data[ 'is_published'] map_obj.save() keywords_form = KeywordsForm(instance=map_obj) elif 'add_keyword' in request.POST: map_obj.keywords.add(request.POST['add_keyword']) map_obj.save() elif 'remove_keyword' in request.POST: map_obj.keywords.remove(request.POST['remove_keyword']) map_obj.save() else: keywords_form = KeywordsForm(instance=map_obj) published_form = PublishStatusForm(instance=map_obj) map_thumbnail_dir = os.path.join(settings.MEDIA_ROOT, 'thumbs') map_default_thumbnail_array = map_obj.get_thumbnail_url().split('/') map_default_thumbnail_name = 'map' + str(mapid) + '.jpg' map_default_thumbnail = os.path.join(map_thumbnail_dir, map_default_thumbnail_name) # TODO: create function to handle map and layer thumbs if request.method == 'POST': map_thumb_form = ThumbnailImageForm(request.POST, request.FILES) if map_thumb_form.is_valid(): map_new_img = ThumbnailImage( thumbnail_image=request.FILES['thumbnail_image']) map_new_img.save() map_obj.save_thumbnail(map_default_thumbnail_name, map_new_img) map_user_upload_thumbnail = ThumbnailImage.objects.all()[0] map_user_upload_thumbnail_filepath = str( map_user_upload_thumbnail.thumbnail_image) os.rename(map_user_upload_thumbnail_filepath, map_default_thumbnail) else: map_thumb_form = ThumbnailImageForm() map_thumbnail = map_obj.get_thumbnail_url update_es_index(MapStory, MapStory.objects.get(id=map_obj.id)) context_dict = { 'config': config, 'resource': map_obj, 'layers': layers, 'keywords': keywords, 'permissions_json': _perms_info_json(map_obj), 'documents': get_related_documents(map_obj), 'keywords_form': keywords_form, 'published_form': published_form, 'thumbnail': map_thumbnail, 'thumb_form': map_thumb_form } if settings.SOCIAL_ORIGINS: context_dict["social_links"] = build_social_links(request, map_obj) return render_to_response(template, RequestContext(request, context_dict))
if created: Link.objects.filter(pk=link.pk).update(url=tile_url) # Save layer attributes set_attributes_from_geoserver(instance) # Save layer styles set_styles(instance, gs_catalog) # NOTTODO by simod: we should not do this! # need to be removed when fixing #2015 catalogue_post_save(instance, Layer) try: # update the elastic search index for the object after post_save triggers have fired. update_es_index(sender, sender.objects.get(id=instance.id)) update_es_index(MapStory, MapStory.objects.get(id=instance.story.id)) except: pass def geoserver_pre_save_maplayer(instance, sender, **kwargs): # If this object was saved via fixtures, # do not do post processing. if kwargs.get('raw', False): return try: if instance.ows_url is not None and len(instance.ows_url) > 0: instance.local = isinstance( gs_catalog.get_layer(
def geoserver_post_save(instance, sender, **kwargs): """Save keywords to GeoServer The way keywords are implemented requires the layer to be saved to the database before accessing them. """ if type(instance) is ResourceBase: if hasattr(instance, 'layer'): instance = instance.layer else: return if instance.storeType == "remoteStore": # Save layer attributes set_attributes(instance) return if not getattr(instance, 'gs_resource', None): try: gs_resource = gs_catalog.get_resource( instance.name, store=instance.store, workspace=instance.workspace) except socket_error as serr: if serr.errno != errno.ECONNREFUSED: # Not the error we are looking for, re-raise raise serr # If the connection is refused, take it easy. return else: gs_resource = instance.gs_resource if gs_resource is None: return if settings.RESOURCE_PUBLISHING: if instance.is_published != gs_resource.advertised: if getattr(ogc_server_settings, "BACKEND_WRITE_ENABLED", True): gs_resource.advertised = instance.is_published gs_catalog.save(gs_resource) if any(instance.keyword_list()): gs_resource.keywords = instance.keyword_list() # gs_resource should only be called if # ogc_server_settings.BACKEND_WRITE_ENABLED == True if getattr(ogc_server_settings, "BACKEND_WRITE_ENABLED", True): gs_catalog.save(gs_resource) bbox = gs_resource.latlon_bbox dx = float(bbox[1]) - float(bbox[0]) dy = float(bbox[3]) - float(bbox[2]) dataAspect = 1 if dy == 0 else dx / dy height = 550 width = int(height * dataAspect) # Set download links for WMS, WCS or WFS and KML links = wms_links(ogc_server_settings.public_url + 'wms?', instance.typename.encode('utf-8'), instance.bbox_string, instance.srid, height, width) for ext, name, mime, wms_url in links: Link.objects.get_or_create(resource=instance.resourcebase_ptr, name=ugettext(name), defaults=dict( extension=ext, url=wms_url, mime=mime, link_type='image', ) ) if instance.storeType == "dataStore": links = wfs_links( ogc_server_settings.public_url + 'wfs?', instance.typename.encode('utf-8')) for ext, name, mime, wfs_url in links: if mime == 'SHAPE-ZIP': name = 'Zipped Shapefile' Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=wfs_url, defaults=dict( extension=ext, name=name, mime=mime, url=wfs_url, link_type='data', ) ) if gs_resource.store.type and gs_resource.store.type.lower() == 'geogig' and \ gs_resource.store.connection_parameters.get('geogig_repository'): repo_url = '{url}geogig/{geogig_repository}'.format( url=ogc_server_settings.public_url, geogig_repository=gs_resource.store.connection_parameters.get('geogig_repository')) path = gs_resource.dom.findall('nativeName') if path: path = 'path={path}'.format(path=path[0].text) Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=repo_url, defaults=dict(extension='html', name='Clone in GeoGig', mime='text/xml', link_type='html' ) ) def command_url(command): return "{repo_url}/{command}.json?{path}".format(repo_url=repo_url, path=path, command=command) Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=command_url('log'), defaults=dict(extension='json', name='GeoGig log', mime='application/json', link_type='html' ) ) Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=command_url('statistics'), defaults=dict(extension='json', name='GeoGig statistics', mime='application/json', link_type='html' ) ) elif instance.storeType == 'coverageStore': # FIXME(Ariel): This works for public layers, does it work for restricted too? # would those end up with no geotiff links, like, forever? permissions = instance.get_all_level_info() instance.set_permissions( {'users': {'AnonymousUser': ['view_resourcebase']}}) try: # Potentially 3 dimensions can be returned by the grid if there is a z # axis. Since we only want width/height, slice to the second # dimension covWidth, covHeight = get_coverage_grid_extent(instance)[:2] except GeoNodeException as e: msg = _('Could not create a download link for layer.') logger.warn(msg, e) else: links = wcs_links(ogc_server_settings.public_url + 'wcs?', instance.typename.encode('utf-8'), bbox=gs_resource.native_bbox[:-1], crs=gs_resource.native_bbox[-1], height=str(covHeight), width=str(covWidth)) for ext, name, mime, wcs_url in links: Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=wcs_url, defaults=dict( extension=ext, name=name, mime=mime, link_type='data', ) ) instance.set_permissions(permissions) kml_reflector_link_download = ogc_server_settings.public_url + "wms/kml?" + \ urllib.urlencode({'layers': instance.typename.encode('utf-8'), 'mode': "download"}) Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=kml_reflector_link_download, defaults=dict( extension='kml', name="KML", mime='text/xml', link_type='data', ) ) kml_reflector_link_view = ogc_server_settings.public_url + "wms/kml?" + \ urllib.urlencode({'layers': instance.typename.encode('utf-8'), 'mode': "refresh"}) Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=kml_reflector_link_view, defaults=dict( extension='kml', name="View in Google Earth", mime='text/xml', link_type='data', ) ) tile_url = ('%sgwc/service/gmaps?' % ogc_server_settings.public_url + 'layers=%s' % instance.typename.encode('utf-8') + '&zoom={z}&x={x}&y={y}' + '&format=image/png8' ) Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=tile_url, defaults=dict( extension='tiles', name="Tiles", mime='image/png', link_type='image', ) ) html_link_url = '%s%s' % ( settings.SITEURL[:-1], instance.get_absolute_url()) Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=html_link_url, defaults=dict( extension='html', name=instance.typename, mime='text/html', link_type='html', ) ) params = { 'layers': instance.typename.encode('utf-8'), 'format': 'image/png8', 'width': 200, 'height': 150, } # Avoid using urllib.urlencode here because it breaks the url. # commas and slashes in values get encoded and then cause trouble # with the WMS parser. p = "&".join("%s=%s" % item for item in params.items()) thumbnail_remote_url = ogc_server_settings.PUBLIC_LOCATION + \ "wms/reflect?" + p thumbnail_create_url = ogc_server_settings.LOCATION + \ "wms/reflect?" + p create_thumbnail(instance, thumbnail_remote_url, thumbnail_create_url, ogc_client=http_client) legend_url = ogc_server_settings.PUBLIC_LOCATION + \ 'wms?request=GetLegendGraphic&format=image/png&WIDTH=20&HEIGHT=20&LAYER=' + \ instance.typename + '&legend_options=fontAntiAliasing:true;fontSize:12;forceLabels:on' Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=legend_url, defaults=dict( extension='png', name='Legend', url=legend_url, mime='image/png', link_type='image', ) ) ogc_wms_path = '%s/wms' % instance.workspace ogc_wms_url = urljoin(ogc_server_settings.public_url, ogc_wms_path) ogc_wms_name = 'OGC WMS: %s Service' % instance.workspace Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=ogc_wms_url, defaults=dict( extension='html', name=ogc_wms_name, url=ogc_wms_url, mime='text/html', link_type='OGC:WMS', ) ) if instance.storeType == "dataStore": ogc_wfs_path = '%s/wfs' % instance.workspace ogc_wfs_url = urljoin(ogc_server_settings.public_url, ogc_wfs_path) ogc_wfs_name = 'OGC WFS: %s Service' % instance.workspace Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=ogc_wfs_url, defaults=dict( extension='html', name=ogc_wfs_name, url=ogc_wfs_url, mime='text/html', link_type='OGC:WFS', ) ) if instance.storeType == "coverageStore": ogc_wcs_path = '%s/wcs' % instance.workspace ogc_wcs_url = urljoin(ogc_server_settings.public_url, ogc_wcs_path) ogc_wcs_name = 'OGC WCS: %s Service' % instance.workspace Link.objects.get_or_create(resource=instance.resourcebase_ptr, url=ogc_wcs_url, defaults=dict( extension='html', name=ogc_wcs_name, url=ogc_wcs_url, mime='text/html', link_type='OGC:WCS', ) ) # remove links that belong to and old address for link in instance.link_set.all(): if not urlparse( settings.SITEURL).hostname == urlparse( link.url).hostname and not urlparse( ogc_server_settings.public_url).hostname == urlparse( link.url).hostname: link.delete() # Save layer attributes set_attributes(instance) # Save layer styles set_styles(instance, gs_catalog) # NOTTODO by simod: we should not do this! # need to be removed when fixing #2015 from geonode.catalogue.models import catalogue_post_save from geonode.layers.models import Layer catalogue_post_save(instance, Layer) try: # update the elastic search index for the object after post_save triggers have fired. update_es_index(sender, sender.objects.get(id=instance.id)) except: pass