def handle(self, layer, layer_config, *args, **kwargs): """ Replace the default layer style with one of the boilerplate styles. """ name = self.layer.name sld = get_sld_for(self.catalog, self.layer) style = None if sld is not None: try: self.catalog.create_style(name, sld, raw=True) except ConflictingDataError as e: msg = 'There was already a style named %s in GeoServer, try using another name: "%s"' % ( name, str(e)) logger.error(msg) try: self.catalog.create_style(name + '_layer', sld, raw=True) except ConflictingDataError as e: msg = 'There was already a style named %s in GeoServer, cannot overwrite: "%s"' % ( name, str(e)) logger.error(msg) e.args = (msg, ) if style is None: try: style = self.catalog.get_style(name) except BaseException: logger.warn( 'Could not retreive the Layer default Style name') # what are we doing with this var? msg = 'No style could be created for the layer, falling back to POINT default one' try: style = self.catalog.get_style(name + '_layer') except BaseException: style = self.catalog.get_style('point') logger.warn(msg) e.args = (msg, ) if style: self.layer.default_style = style self.catalog.save(self.layer) save_style(style)
def layer_upload(request, template='upload/layer_upload.html'): if request.method == 'GET': mosaics = Layer.objects.filter(is_mosaic=True).order_by('name') ctx = { 'mosaics': mosaics, 'charsets': CHARSETS, 'is_layer': True, } return render_to_response(template, RequestContext(request, ctx)) elif request.method == 'POST': form = NewLayerUploadForm(request.POST, request.FILES) tempdir = None errormsgs = [] out = {'success': False} if form.is_valid(): title = form.cleaned_data["layer_title"] # Replace dots in filename - GeoServer REST API upload bug # and avoid any other invalid characters. # Use the title if possible, otherwise default to the filename if title is not None and len(title) > 0: name_base = title else: name_base, __ = os.path.splitext( form.cleaned_data["base_file"].name) name = slugify(name_base.replace(".", "_")) try: # Moved this inside the try/except block because it can raise # exceptions when unicode characters are present. # This should be followed up in upstream Django. tempdir, base_file = form.write_files() if not form.cleaned_data["style_upload_form"]: saved_layer = file_upload( base_file, name=name, user=request.user, overwrite=False, charset=form.cleaned_data["charset"], abstract=form.cleaned_data["abstract"], title=form.cleaned_data["layer_title"], metadata_uploaded_preserve=form. cleaned_data["metadata_uploaded_preserve"], metadata_upload_form=form. cleaned_data["metadata_upload_form"]) else: saved_layer = Layer.objects.get(alternate=title) if not saved_layer: msg = 'Failed to process. Could not find matching layer.' raise Exception(msg) sld = open(base_file).read() try: dom = etree.XML(sld) except Exception: raise Exception( "The uploaded SLD file is not valid XML") el = dom.findall( "{http://www.opengis.net/sld}NamedLayer/{http://www.opengis.net/sld}Name" ) if len(el) == 0: raise Exception( "Please provide a name, unable to extract one from the SLD." ) match = None styles = list(saved_layer.styles.all()) + [ saved_layer.default_style ] for style in styles: if style.name == saved_layer.name: match = style break if match is None: cat = gs_catalog try: cat.create_style(saved_layer.name, sld) except Exception as e: logger.exception(e) style = cat.get_style(saved_layer.name) layer = cat.get_layer(title) if layer and style: layer.default_style = style cat.save(layer) saved_layer.default_style = save_style(style) else: cat = gs_catalog style = cat.get_style(saved_layer.name) style.update_body(sld) except Exception as e: exception_type, error, tb = sys.exc_info() logger.exception(e) out['success'] = False out['errors'] = str(error) # Assign the error message to the latest UploadSession from # that user. latest_uploads = UploadSession.objects.filter( user=request.user).order_by('-date') if latest_uploads.count() > 0: upload_session = latest_uploads[0] upload_session.error = str(error) upload_session.traceback = traceback.format_exc(tb) upload_session.context = log_snippet(CONTEXT_LOG_FILE) upload_session.save() out['traceback'] = upload_session.traceback out['context'] = upload_session.context out['upload_session'] = upload_session.id else: out['success'] = True if hasattr(saved_layer, 'info'): out['info'] = saved_layer.info out['url'] = reverse('layer_detail', args=[saved_layer.service_typename]) if hasattr(saved_layer, 'bbox_string'): out['bbox'] = saved_layer.bbox_string if hasattr(saved_layer, 'srid'): out['crs'] = { 'type': 'name', 'properties': saved_layer.srid } upload_session = saved_layer.upload_session upload_session.processed = True upload_session.save() permissions = form.cleaned_data["permissions"] if permissions is not None and len(permissions.keys()) > 0: saved_layer.set_permissions(permissions) saved_layer.handle_moderated_uploads() finally: if tempdir is not None: shutil.rmtree(tempdir) else: for e in form.errors.values(): errormsgs.extend([escape(v) for v in e]) out['errors'] = form.errors out['errormsgs'] = errormsgs if out['success']: status_code = 200 else: status_code = 400 return HttpResponse(json.dumps(out), content_type='application/json', status=status_code)
def layer_upload(request, template='upload/layer_upload.html'): if request.method == 'GET': mosaics = Layer.objects.filter(is_mosaic=True).order_by('name') ctx = { 'mosaics': mosaics, 'charsets': CHARSETS, 'is_layer': True, } return render_to_response(template, RequestContext(request, ctx)) elif request.method == 'POST': form = NewLayerUploadForm(request.POST, request.FILES) tempdir = None errormsgs = [] out = {'success': False} if form.is_valid(): title = form.cleaned_data["layer_title"] # Replace dots in filename - GeoServer REST API upload bug # and avoid any other invalid characters. # Use the title if possible, otherwise default to the filename if title is not None and len(title) > 0: name_base = title else: name_base, __ = os.path.splitext( form.cleaned_data["base_file"].name) title = slugify(name_base.replace(".", "_")) name = slugify(name_base.replace(".", "_")) if form.cleaned_data["abstract"] is not None and len(form.cleaned_data["abstract"]) > 0: abstract = form.cleaned_data["abstract"] else: abstract = "No abstract provided." try: # Moved this inside the try/except block because it can raise # exceptions when unicode characters are present. # This should be followed up in upstream Django. tempdir, base_file = form.write_files() if not form.cleaned_data["style_upload_form"]: saved_layer = file_upload( base_file, name=name, user=request.user, overwrite=False, charset=form.cleaned_data["charset"], abstract=abstract, title=title, metadata_uploaded_preserve=form.cleaned_data[ "metadata_uploaded_preserve"], metadata_upload_form=form.cleaned_data["metadata_upload_form"]) else: saved_layer = Layer.objects.get(alternate=title) if not saved_layer: msg = 'Failed to process. Could not find matching layer.' raise Exception(msg) sld = open(base_file).read() # Check SLD is valid extract_name_from_sld(gs_catalog, sld, sld_file=base_file) match = None styles = list(saved_layer.styles.all()) + [ saved_layer.default_style] for style in styles: if style and style.name == saved_layer.name: match = style break cat = gs_catalog layer = cat.get_layer(title) if match is None: try: cat.create_style(saved_layer.name, sld, raw=True) style = cat.get_style(saved_layer.name) if layer and style: layer.default_style = style cat.save(layer) saved_layer.default_style = save_style(style) except Exception as e: logger.exception(e) else: style = cat.get_style(saved_layer.name) # style.update_body(sld) try: cat.create_style(saved_layer.name, sld, overwrite=True, raw=True) style = cat.get_style(saved_layer.name) if layer and style: layer.default_style = style cat.save(layer) saved_layer.default_style = save_style(style) except Exception as e: logger.exception(e) # Invalidate GeoWebCache for the updated resource _invalidate_geowebcache_layer(saved_layer.alternate) except Exception as e: exception_type, error, tb = sys.exc_info() logger.exception(e) out['success'] = False out['errors'] = str(error) # Assign the error message to the latest UploadSession from # that user. latest_uploads = UploadSession.objects.filter( user=request.user).order_by('-date') if latest_uploads.count() > 0: upload_session = latest_uploads[0] upload_session.error = str(error) upload_session.traceback = traceback.format_exc(tb) upload_session.context = log_snippet(CONTEXT_LOG_FILE) upload_session.save() out['traceback'] = upload_session.traceback out['context'] = upload_session.context out['upload_session'] = upload_session.id else: out['success'] = True if hasattr(saved_layer, 'info'): out['info'] = saved_layer.info out['url'] = reverse( 'layer_detail', args=[ saved_layer.service_typename]) if hasattr(saved_layer, 'bbox_string'): out['bbox'] = saved_layer.bbox_string if hasattr(saved_layer, 'srid'): out['crs'] = { 'type': 'name', 'properties': saved_layer.srid } out['ogc_backend'] = settings.OGC_SERVER['default']['BACKEND'] upload_session = saved_layer.upload_session if upload_session: upload_session.processed = True upload_session.save() permissions = form.cleaned_data["permissions"] if permissions is not None and len(permissions.keys()) > 0: saved_layer.set_permissions(permissions) saved_layer.handle_moderated_uploads() finally: if tempdir is not None: shutil.rmtree(tempdir) else: for e in form.errors.values(): errormsgs.extend([escape(v) for v in e]) out['errors'] = form.errors out['errormsgs'] = errormsgs if out['success']: status_code = 200 else: status_code = 400 if settings.MONITORING_ENABLED: request.add_resource('layer', saved_layer.alternate if saved_layer else name) return HttpResponse( json.dumps(out), content_type='application/json', status=status_code)
def layer_upload(request, template='upload/layer_upload.html'): if request.method == 'GET': mosaics = Layer.objects.filter(is_mosaic=True).order_by('name') ctx = { 'mosaics': mosaics, 'charsets': CHARSETS, 'is_layer': True, } return render_to_response(template, RequestContext(request, ctx)) elif request.method == 'POST': form = NewLayerUploadForm(request.POST, request.FILES) tempdir = None saved_layer = None errormsgs = [] out = {'success': False} if form.is_valid(): title = form.cleaned_data["layer_title"] # Replace dots in filename - GeoServer REST API upload bug # and avoid any other invalid characters. # Use the title if possible, otherwise default to the filename if title is not None and len(title) > 0: name_base = title else: name_base, __ = os.path.splitext( form.cleaned_data["base_file"].name) title = slugify(name_base.replace(".", "_")) name = slugify(name_base.replace(".", "_")) if form.cleaned_data["abstract"] is not None and len( form.cleaned_data["abstract"]) > 0: abstract = form.cleaned_data["abstract"] else: abstract = "No abstract provided." try: # Moved this inside the try/except block because it can raise # exceptions when unicode characters are present. # This should be followed up in upstream Django. tempdir, base_file = form.write_files() if not form.cleaned_data["style_upload_form"]: saved_layer = file_upload( base_file, name=name, user=request.user, overwrite=False, charset=form.cleaned_data["charset"], abstract=abstract, title=title, metadata_uploaded_preserve=form. cleaned_data["metadata_uploaded_preserve"], metadata_upload_form=form. cleaned_data["metadata_upload_form"]) else: saved_layer = Layer.objects.get(alternate=title) if not saved_layer: msg = 'Failed to process. Could not find matching layer.' raise Exception(msg) sld = open(base_file).read() # Check SLD is valid extract_name_from_sld(gs_catalog, sld, sld_file=base_file) match = None styles = list(saved_layer.styles.all()) + [ saved_layer.default_style ] for style in styles: if style and style.name == saved_layer.name: match = style break cat = gs_catalog layer = cat.get_layer(title) if match is None: try: cat.create_style( saved_layer.name, sld, raw=True, workspace=settings.DEFAULT_WORKSPACE) style = cat.get_style(saved_layer.name, workspace=settings.DEFAULT_WORKSPACE) or \ cat.get_style(saved_layer.name) if layer and style: layer.default_style = style cat.save(layer) saved_layer.default_style = save_style(style) except Exception as e: logger.exception(e) else: style = cat.get_style(saved_layer.name, workspace=settings.DEFAULT_WORKSPACE) or \ cat.get_style(saved_layer.name) # style.update_body(sld) try: cat.create_style( saved_layer.name, sld, overwrite=True, raw=True, workspace=settings.DEFAULT_WORKSPACE) style = cat.get_style(saved_layer.name, workspace=settings.DEFAULT_WORKSPACE) or \ cat.get_style(saved_layer.name) if layer and style: layer.default_style = style cat.save(layer) saved_layer.default_style = save_style(style) except Exception as e: logger.exception(e) # Invalidate GeoWebCache for the updated resource _invalidate_geowebcache_layer(saved_layer.alternate) except Exception as e: exception_type, error, tb = sys.exc_info() logger.exception(e) out['success'] = False out['errors'] = str(error) # Assign the error message to the latest UploadSession from # that user. latest_uploads = UploadSession.objects.filter( user=request.user).order_by('-date') if latest_uploads.count() > 0: upload_session = latest_uploads[0] upload_session.error = str(error) upload_session.traceback = traceback.format_exc(tb) upload_session.context = log_snippet(CONTEXT_LOG_FILE) upload_session.save() out['traceback'] = upload_session.traceback out['context'] = upload_session.context out['upload_session'] = upload_session.id else: out['success'] = True if hasattr(saved_layer, 'info'): out['info'] = saved_layer.info out['url'] = reverse('layer_detail', args=[saved_layer.service_typename]) if hasattr(saved_layer, 'bbox_string'): out['bbox'] = saved_layer.bbox_string if hasattr(saved_layer, 'srid'): out['crs'] = { 'type': 'name', 'properties': saved_layer.srid } out['ogc_backend'] = settings.OGC_SERVER['default']['BACKEND'] upload_session = saved_layer.upload_session if upload_session: upload_session.processed = True upload_session.save() permissions = form.cleaned_data["permissions"] if permissions is not None and len(permissions.keys()) > 0: saved_layer.set_permissions(permissions) saved_layer.handle_moderated_uploads() finally: if tempdir is not None: shutil.rmtree(tempdir) else: for e in form.errors.values(): errormsgs.extend([escape(v) for v in e]) out['errors'] = form.errors out['errormsgs'] = errormsgs if out['success']: status_code = 200 else: status_code = 400 if settings.MONITORING_ENABLED: request.add_resource( 'layer', saved_layer.alternate if saved_layer else name) return HttpResponse(json.dumps(out), content_type='application/json', status=status_code)