def test_style_validity_and_name(self): # Check that including an SLD with a valid shapefile results in the SLD # getting picked up d = None try: d = tempfile.mkdtemp() for f in ("san_andres_y_providencia.sld", "lac.sld", "freshgwabs2.sld", "raster.sld", "line.sld",): path = os.path.join(d, f) f = open(path, "wb") f.write(SLDS[splitext(basename(path))[0]]) f.close() # Test 'san_andres_y_providencia.sld' san_andres_y_providencia_sld_file = os.path.join( d, "san_andres_y_providencia.sld") san_andres_y_providencia_sld_xml = open( san_andres_y_providencia_sld_file).read() san_andres_y_providencia_sld_name = extract_name_from_sld( None, san_andres_y_providencia_sld_xml) self.assertEquals( san_andres_y_providencia_sld_name, 'san_andres_y_providencia_administrative') # Test 'lac.sld' lac_sld_file = os.path.join(d, "lac.sld") lac_sld_xml = open(lac_sld_file).read() lac_sld_name = extract_name_from_sld( None, lac_sld_xml, sld_file=lac_sld_file) self.assertEquals(lac_sld_name, 'LAC NonIndigenous Access to Sanitation') # Test 'freshgwabs2.sld' freshgwabs2_sld_file = os.path.join(d, "freshgwabs2.sld") freshgwabs2_sld_xml = open(freshgwabs2_sld_file).read() freshgwabs2_sld_name = extract_name_from_sld( None, freshgwabs2_sld_xml, sld_file=freshgwabs2_sld_file) self.assertEquals(freshgwabs2_sld_name, 'freshgwabs2') # Test 'raster.sld' raster_sld_file = os.path.join(d, "raster.sld") raster_sld_xml = open(raster_sld_file).read() raster_sld_name = extract_name_from_sld( None, raster_sld_xml, sld_file=raster_sld_file) self.assertEquals( raster_sld_name, 'geonode-geonode_gwpollriskafriotest') # Test 'line.sld' line_sld_file = os.path.join(d, "line.sld") line_sld_xml = open(line_sld_file).read() line_sld_name = extract_name_from_sld( None, line_sld_xml, sld_file=line_sld_file) self.assertEquals(line_sld_name, 'line 3') finally: if d is not None: shutil.rmtree(d)
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 test_style_validity_and_name(self): # Check that including an SLD with a valid shapefile results in the SLD # getting picked up d = None try: d = tempfile.mkdtemp() for f in ( "san_andres_y_providencia.sld", "lac.sld", "freshgwabs2.sld", "raster.sld", "line.sld", ): path = os.path.join(d, f) f = open(path, "wb") f.write(SLDS[splitext(basename(path))[0]]) f.close() # Test 'san_andres_y_providencia.sld' san_andres_y_providencia_sld_file = os.path.join( d, "san_andres_y_providencia.sld") san_andres_y_providencia_sld_xml = open( san_andres_y_providencia_sld_file).read() san_andres_y_providencia_sld_name = extract_name_from_sld( None, san_andres_y_providencia_sld_xml) self.assertEquals(san_andres_y_providencia_sld_name, 'san_andres_y_providencia_administrative') # Test 'lac.sld' lac_sld_file = os.path.join(d, "lac.sld") lac_sld_xml = open(lac_sld_file).read() lac_sld_name = extract_name_from_sld(None, lac_sld_xml, sld_file=lac_sld_file) self.assertEquals(lac_sld_name, 'LAC NonIndigenous Access to Sanitation') # Test 'freshgwabs2.sld' freshgwabs2_sld_file = os.path.join(d, "freshgwabs2.sld") freshgwabs2_sld_xml = open(freshgwabs2_sld_file).read() freshgwabs2_sld_name = extract_name_from_sld( None, freshgwabs2_sld_xml, sld_file=freshgwabs2_sld_file) self.assertEquals(freshgwabs2_sld_name, 'freshgwabs2') # Test 'raster.sld' raster_sld_file = os.path.join(d, "raster.sld") raster_sld_xml = open(raster_sld_file).read() raster_sld_name = extract_name_from_sld(None, raster_sld_xml, sld_file=raster_sld_file) self.assertEquals(raster_sld_name, 'geonode-geonode_gwpollriskafriotest') # Test 'line.sld' line_sld_file = os.path.join(d, "line.sld") line_sld_xml = open(line_sld_file).read() line_sld_name = extract_name_from_sld(None, line_sld_xml, sld_file=line_sld_file) self.assertEquals(line_sld_name, 'line 3') finally: if d is not None: shutil.rmtree(d)
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 test_style_validity_and_name(self): # Check that including an SLD with a valid shapefile results in the SLD # getting picked up d = None try: d = tempfile.mkdtemp() files = ( "san_andres_y_providencia.sld", "lac.sld", "freshgwabs2.sld", "raster.sld", "line.sld", ) for f in files: path = os.path.join(d, f) with open(path, 'w') as f: name, ext = splitext(basename(path)) f.write(SLDS[name]) # Test 'san_andres_y_providencia.sld' san_andres_y_providencia_sld_file = os.path.join( d, "san_andres_y_providencia.sld") with open(san_andres_y_providencia_sld_file ) as san_andres_y_providencia_sld_xml_file: san_andres_y_providencia_sld_xml = san_andres_y_providencia_sld_xml_file.read( ) san_andres_y_providencia_sld_name = extract_name_from_sld( None, san_andres_y_providencia_sld_xml) self.assertEqual(san_andres_y_providencia_sld_name, 'san_andres_y_providencia_administrative') # Test 'lac.sld' lac_sld_file = os.path.join(d, "lac.sld") with open(lac_sld_file) as lac_sld_xml_file: lac_sld_xml = lac_sld_xml_file.read() lac_sld_name = extract_name_from_sld(None, lac_sld_xml, sld_file=lac_sld_file) self.assertEqual(lac_sld_name, 'LAC NonIndigenous Access to Sanitation') # Test 'freshgwabs2.sld' freshgwabs2_sld_file = os.path.join(d, "freshgwabs2.sld") with open(freshgwabs2_sld_file) as freshgwabs2_sld_xml_file: freshgwabs2_sld_xml = freshgwabs2_sld_xml_file.read() freshgwabs2_sld_name = extract_name_from_sld( None, freshgwabs2_sld_xml, sld_file=freshgwabs2_sld_file) self.assertEqual(freshgwabs2_sld_name, 'freshgwabs2') # Test 'raster.sld' raster_sld_file = os.path.join(d, "raster.sld") with open(raster_sld_file) as raster_sld_xml_file: raster_sld_xml = raster_sld_xml_file.read() raster_sld_name = extract_name_from_sld(None, raster_sld_xml, sld_file=raster_sld_file) self.assertEqual(raster_sld_name, 'geonode-geonode_gwpollriskafriotest') # Test 'line.sld' line_sld_file = os.path.join(d, "line.sld") with open(line_sld_file) as line_sld_xml_file: line_sld_xml = line_sld_xml_file.read() line_sld_name = extract_name_from_sld(None, line_sld_xml, sld_file=line_sld_file) self.assertEqual(line_sld_name, 'line 3') finally: if d is not None: shutil.rmtree(d, ignore_errors=True)