def testWriteFiles(self): files = dict(base_file=SimpleUploadedFile('foo.shp', ' '), shx_file=SimpleUploadedFile('foo.shx', ' '), dbf_file=SimpleUploadedFile('foo.dbf', ' '), prj_file=SimpleUploadedFile('foo.prj', ' ')) form = LayerUploadForm(dict(), files) self.assertTrue(form.is_valid()) tempdir = form.write_files()[0] self.assertEquals(set(os.listdir(tempdir)), set(['foo.shp', 'foo.shx', 'foo.dbf', 'foo.prj'])) the_zip = zipfile.ZipFile('test_upload.zip', 'w') in_memory_file = StringIO.StringIO() in_memory_file.write('test') the_zip.writestr('foo.shp', in_memory_file.getvalue()) the_zip.writestr('foo.dbf', in_memory_file.getvalue()) the_zip.writestr('foo.shx', in_memory_file.getvalue()) the_zip.writestr('foo.prj', in_memory_file.getvalue()) the_zip.close() files = dict( base_file=SimpleUploadedFile('test_upload.zip', open('test_upload.zip').read())) form = LayerUploadForm(dict(), files) self.assertTrue(form.is_valid()) tempdir = form.write_files()[0] self.assertEquals(set(os.listdir(tempdir)), set(['foo.shp', 'foo.shx', 'foo.dbf', 'foo.prj'])) os.remove('test_upload.zip')
def layer_replace(request, layername, template='layers/layer_replace.html'): layer = _resolve_layer(request, layername, 'layers.change_layer', _PERMISSION_MSG_MODIFY) if request.method == 'GET': return render_to_response( template, RequestContext(request, { 'layer': layer, 'is_featuretype': layer.is_vector() })) elif request.method == 'POST': form = LayerUploadForm(request.POST, request.FILES) tempdir = None out = {} if form.is_valid(): try: tempdir, base_file = form.write_files() saved_layer = save(layer, base_file, request.user, overwrite=True) except Exception, e: out['success'] = False out['errors'] = str(e) else: out['success'] = True out['url'] = reverse('layer_detail', args=[saved_layer.typename]) finally:
def layer_replace(request, layername, template='layers/layer_replace.html'): layer = _resolve_layer(request, layername, 'layers.change_layer',_PERMISSION_MSG_MODIFY) if request.method == 'GET': cat = Layer.objects.gs_catalog info = cat.get_resource(layer.name) is_featuretype = info.resource_type == FeatureType.resource_type return render_to_response(template, RequestContext(request, {'layer': layer, 'is_featuretype': is_featuretype})) elif request.method == 'POST': form = LayerUploadForm(request.POST, request.FILES) tempdir = None out = {} if form.is_valid(): try: tempdir, base_file = form.write_files() saved_layer = save(layer, base_file, request.user, overwrite=True, permissions=layer.get_all_level_info()) except Exception, e: out['success'] = False out['errors'] = str(e) else: out['success'] = True out['url'] = reverse('layer_detail', args=[saved_layer.typename]) finally:
def layer_replace(request, layername, template='layers/layer_replace.html'): layer = _resolve_layer( request, layername, 'base.change_resourcebase', _PERMISSION_MSG_MODIFY) if request.method == 'GET': ctx = { 'charsets': CHARSETS, 'layer': layer, 'is_featuretype': layer.is_vector() } return render_to_response(template, RequestContext(request, ctx)) elif request.method == 'POST': form = LayerUploadForm(request.POST, request.FILES) tempdir = None out = {} if form.is_valid(): try: tempdir, base_file = form.write_files() saved_layer = file_upload( base_file, name=layer.name, user=request.user, overwrite=True, charset=form.cleaned_data["charset"], ) except Exception as e: out['success'] = False out['errors'] = str(e) else: out['success'] = True out['url'] = reverse( 'layer_detail', args=[ saved_layer.service_typename]) finally: if tempdir is not None: shutil.rmtree(tempdir) else: errormsgs = [] for e in form.errors.values(): errormsgs.append([escape(v) for v in e]) out['errors'] = form.errors out['errormsgs'] = errormsgs if out['success']: status_code = 200 else: status_code = 500 return HttpResponse( json.dumps(out), mimetype='application/json', status=status_code)
def testWriteFiles(self): files = dict(base_file=SimpleUploadedFile('foo.shp', ' '), shx_file=SimpleUploadedFile('foo.shx', ' '), dbf_file=SimpleUploadedFile('foo.dbf', ' '), prj_file=SimpleUploadedFile('foo.prj', ' ')) form = LayerUploadForm(dict(), files) self.assertTrue(form.is_valid()) tempdir = form.write_files()[0] self.assertEquals(set(os.listdir(tempdir)), set(['foo.shp', 'foo.shx', 'foo.dbf', 'foo.prj']))
def testZipValidation(self): the_zip = zipfile.ZipFile('test_upload.zip', 'w') in_memory_file = StringIO.StringIO() in_memory_file.write('test') the_zip.writestr('foo.shp', in_memory_file.getvalue()) the_zip.writestr('foo.dbf', in_memory_file.getvalue()) the_zip.writestr('foo.shx', in_memory_file.getvalue()) the_zip.writestr('foo.prj', in_memory_file.getvalue()) the_zip.close() files = dict(base_file=SimpleUploadedFile('test_upload.zip', open('test_upload.zip').read())) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) os.remove('test_upload.zip')
def layer_replace(request, layername, template='layers/layer_replace.html'): layer = _resolve_layer(request, layername, 'layers.change_layer', _PERMISSION_MSG_MODIFY) if request.method == 'GET': cat = Layer.objects.gs_catalog info = cat.get_resource(layer.name) is_featuretype = info.resource_type == FeatureType.resource_type return render_to_response( template, RequestContext(request, { 'layer': layer, 'is_featuretype': is_featuretype })) elif request.method == 'POST': form = LayerUploadForm(request.POST, request.FILES) tempdir = None if form.is_valid(): try: tempdir, base_file = form.write_files() saved_layer = save(layer, base_file, request.user, overwrite=True, permissions=layer.get_all_level_info()) return HttpResponse( json.dumps({ "success": True, "redirect_to": reverse('layer_metadata', args=[saved_layer.typename]) })) except Exception, e: logger.info("Unexpected error during upload.") return HttpResponse( json.dumps({ "success": False, "errors": ["Unexpected error during upload: " + escape(str(e))] })) finally:
def testShapefileValidation(self): files = dict( base_file=SimpleUploadedFile('foo.shp', ' '), shx_file=SimpleUploadedFile('foo.shx', ' '), dbf_file=SimpleUploadedFile('foo.dbf', ' '), prj_file=SimpleUploadedFile('foo.prj', ' ')) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) files = dict( base_file=SimpleUploadedFile('foo.SHP', ' '), shx_file=SimpleUploadedFile('foo.SHX', ' '), dbf_file=SimpleUploadedFile('foo.DBF', ' '), prj_file=SimpleUploadedFile('foo.PRJ', ' ')) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) files = dict( base_file=SimpleUploadedFile('foo.SHP', ' '), shx_file=SimpleUploadedFile('foo.shx', ' '), dbf_file=SimpleUploadedFile('foo.dbf', ' ')) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) files = dict( base_file=SimpleUploadedFile('foo.SHP', ' '), shx_file=SimpleUploadedFile('foo.shx', ' '), dbf_file=SimpleUploadedFile('foo.dbf', ' '), prj_file=SimpleUploadedFile('foo.PRJ', ' ')) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) files = dict( base_file=SimpleUploadedFile('foo.SHP', ' '), shx_file=SimpleUploadedFile('bar.shx', ' '), dbf_file=SimpleUploadedFile('bar.dbf', ' '), prj_file=SimpleUploadedFile('bar.PRJ', ' ')) self.assertFalse(LayerUploadForm(dict(), files).is_valid()) files = dict( base_file=SimpleUploadedFile('foo.shp', ' '), dbf_file=SimpleUploadedFile('foo.dbf', ' '), prj_file=SimpleUploadedFile('foo.PRJ', ' ')) self.assertFalse(LayerUploadForm(dict(), files).is_valid()) files = dict( base_file=SimpleUploadedFile('foo.txt', ' '), shx_file=SimpleUploadedFile('foo.shx', ' '), dbf_file=SimpleUploadedFile('foo.sld', ' '), prj_file=SimpleUploadedFile('foo.prj', ' ')) self.assertFalse(LayerUploadForm(dict(), files).is_valid())
def testGeoTiffValidation(self): files = dict(base_file=SimpleUploadedFile('foo.tif', ' ')) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) files = dict(base_file=SimpleUploadedFile('foo.TIF', ' ')) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) files = dict(base_file=SimpleUploadedFile('foo.tiff', ' ')) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) files = dict(base_file=SimpleUploadedFile('foo.TIF', ' ')) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) files = dict(base_file=SimpleUploadedFile('foo.geotif', ' ')) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) files = dict(base_file=SimpleUploadedFile('foo.GEOTIF', ' ')) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) files = dict(base_file=SimpleUploadedFile('foo.geotiff', ' ')) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) files = dict(base_file=SimpleUploadedFile('foo.GEOTIF', ' ')) self.assertTrue(LayerUploadForm(dict(), files).is_valid())
def testASCIIValidation(self): files = dict(base_file=SimpleUploadedFile('foo.asc', ' ')) self.assertTrue(LayerUploadForm(dict(), files).is_valid()) files = dict(base_file=SimpleUploadedFile('foo.ASC', ' ')) self.assertTrue(LayerUploadForm(dict(), files).is_valid())
def layer_replace(request, layername, template='layers/layer_replace.html'): layer = _resolve_layer(request, layername, 'base.change_resourcebase', _PERMISSION_MSG_MODIFY) if request.method == 'GET': ctx = { 'charsets': CHARSETS, 'layer': layer, 'is_featuretype': layer.is_vector(), 'is_layer': True, } return render_to_response(template, RequestContext(request, ctx)) elif request.method == 'POST': form = LayerUploadForm(request.POST, request.FILES) tempdir = None out = {} if form.is_valid(): try: tempdir, base_file = form.write_files() if layer.is_vector() and is_raster(base_file): out['success'] = False out['errors'] = _( "You are attempting to replace a vector layer with a raster." ) elif (not layer.is_vector()) and is_vector(base_file): out['success'] = False out['errors'] = _( "You are attempting to replace a raster layer with a vector." ) else: if check_ogc_backend(geoserver.BACKEND_PACKAGE): # delete geoserver's store before upload cat = gs_catalog cascading_delete(cat, layer.typename) out['ogc_backend'] = geoserver.BACKEND_PACKAGE elif check_ogc_backend(qgis_server.BACKEND_PACKAGE): try: qgis_layer = QGISServerLayer.objects.get( layer=layer) qgis_layer.delete() except QGISServerLayer.DoesNotExist: pass out['ogc_backend'] = qgis_server.BACKEND_PACKAGE saved_layer = file_upload( base_file, name=layer.name, user=request.user, overwrite=True, charset=form.cleaned_data["charset"], ) out['success'] = True out['url'] = reverse('layer_detail', args=[saved_layer.service_typename]) except Exception as e: logger.exception(e) tb = traceback.format_exc() out['success'] = False out['errors'] = str(tb) finally: if tempdir is not None: shutil.rmtree(tempdir) else: errormsgs = [] for e in form.errors.values(): errormsgs.append([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 dataset_append_replace_view(request, layername, template, action_type): try: layer = _resolve_dataset(request, layername, 'base.change_resourcebase', _PERMISSION_MSG_MODIFY) except PermissionDenied: return HttpResponse("Not allowed", status=403) except Exception: raise Http404("Not found") if not layer: raise Http404("Not found") if request.method == 'GET': ctx = { 'charsets': CHARSETS, 'resource': layer, 'is_featuretype': layer.is_vector(), 'is_dataset': True, } return render(request, template, context=ctx) elif request.method == 'POST': form = LayerUploadForm(request.POST, request.FILES) out = {} if form.is_valid(): try: tempdir, base_file = form.write_files() files, _tmpdir = get_files(base_file) # validate input source resource_is_valid = validate_input_source( layer=layer, filename=base_file, files=files, action_type=action_type) out = {} if resource_is_valid: getattr(resource_manager, action_type)(layer, vals={ 'files': list(files.values()), 'user': request.user }) out['success'] = True out['url'] = layer.get_absolute_url() # invalidating resource chache set_geowebcache_invalidate_cache(layer.typename) except Exception as e: logger.exception(e) out['success'] = False out['errors'] = str(e) finally: if tempdir is not None: shutil.rmtree(tempdir, ignore_errors=True) if _tmpdir is not None: shutil.rmtree(_tmpdir, ignore_errors=True) else: errormsgs = [] for e in form.errors.values(): errormsgs.append([escape(v) for v in e]) out['errors'] = form.errors out['errormsgs'] = errormsgs if out['success']: status_code = 200 register_event(request, 'change', layer) else: status_code = 400 return HttpResponse(json.dumps(out), content_type='application/json', status=status_code)