def testJSONField(self): field = JSONField() # a valid JSON document should pass field.clean('{ "users": [] }') # text which is not JSON should fail self.assertRaises(ValidationError, lambda: field.clean('<users></users>'))
class LayerUploadForm(forms.Form): base_file = forms.FileField() dbf_file = forms.FileField(required=False) shx_file = forms.FileField(required=False) prj_file = forms.FileField(required=False) sld_file = forms.FileField(required=False) xml_file = forms.FileField(required=False) geogit = forms.BooleanField(required=False) geogit_store = forms.CharField(required=False) time = forms.BooleanField(required=False) abstract = forms.CharField(required=False) layer_title = forms.CharField(required=False) permissions = JSONField() spatial_files = ("base_file", "dbf_file", "shx_file", "prj_file", "sld_file", "xml_file") def clean(self): requires_datastore = () if ogc_server_settings.DATASTORE else ('.csv', '.kml') types = [t for t in files.types if t.code not in requires_datastore] supported_type = lambda ext: any([t.matches(ext) for t in types]) cleaned = super(LayerUploadForm, self).clean() base_name, base_ext = os.path.splitext(cleaned["base_file"].name) if base_ext.lower() == '.zip': # for now, no verification, but this could be unified pass elif not supported_type(base_ext.lower()[1:]): supported = " , ".join([t.name for t in types]) raise forms.ValidationError( "%s files are supported. You uploaded a %s file" % (supported, base_ext)) if base_ext.lower() == ".shp": dbf_file = cleaned["dbf_file"] shx_file = cleaned["shx_file"] if dbf_file is None or shx_file is None: raise forms.ValidationError( "When uploading Shapefiles, .SHX and .DBF files are also required." ) dbf_name, __ = os.path.splitext(dbf_file.name) shx_name, __ = os.path.splitext(shx_file.name) if dbf_name != base_name or shx_name != base_name: raise forms.ValidationError( "It looks like you're uploading " "components from different Shapefiles. Please " "double-check your file selections.") if cleaned["prj_file"] is not None: prj_file = cleaned["prj_file"].name if os.path.splitext(prj_file)[0] != base_name: raise forms.ValidationError( "It looks like you're " "uploading components from different Shapefiles. " "Please double-check your file selections.") return cleaned def write_files(self): tempdir = tempfile.mkdtemp(dir=settings.FILE_UPLOAD_TEMP_DIR) for field in self.spatial_files: f = self.cleaned_data[field] if f is not None: path = os.path.join(tempdir, f.name) with open(path, 'w') as writable: for c in f.chunks(): writable.write(c) absolute_base_file = os.path.join(tempdir, self.cleaned_data["base_file"].name) return tempdir, absolute_base_file
class LayerUploadForm(forms.Form): base_file = forms.FileField() dbf_file = forms.FileField(required=False) shx_file = forms.FileField(required=False) prj_file = forms.FileField(required=False) xml_file = forms.FileField(required=False) if check_ogc_backend(geoserver.BACKEND_PACKAGE): sld_file = forms.FileField(required=False) if check_ogc_backend(qgis_server.BACKEND_PACKAGE): qml_file = forms.FileField(required=False) geogig = forms.BooleanField(required=False) geogig_store = forms.CharField(required=False) time = forms.BooleanField(required=False) mosaic = forms.BooleanField(required=False) append_to_mosaic_opts = forms.BooleanField(required=False) append_to_mosaic_name = forms.CharField(required=False) mosaic_time_regex = forms.CharField(required=False) mosaic_time_value = forms.CharField(required=False) time_presentation = forms.CharField(required=False) time_presentation_res = forms.IntegerField(required=False) time_presentation_default_value = forms.CharField(required=False) time_presentation_reference_value = forms.CharField(required=False) is_private = forms.BooleanField(required=False, initial=False) abstract = forms.CharField(required=False) layer_title = forms.CharField(required=False) permissions = JSONField() metadata_uploaded_preserve = forms.BooleanField(required=False) metadata_upload_form = forms.BooleanField(required=False) style_upload_form = forms.BooleanField(required=False) spatial_files = [ "base_file", "dbf_file", "shx_file", "prj_file", "xml_file", ] # Adding style file based on the backend if check_ogc_backend(geoserver.BACKEND_PACKAGE): spatial_files.append('sld_file') if check_ogc_backend(qgis_server.BACKEND_PACKAGE): spatial_files.append('qml_file') spatial_files = tuple(spatial_files) def clean(self): requires_datastore = () if ogc_server_settings.DATASTORE else ('.csv', '.kml') types = [t for t in files.types if t.code not in requires_datastore] def supported_type(ext): return any([t.matches(ext) for t in types]) cleaned = super(LayerUploadForm, self).clean() base_name, base_ext = os.path.splitext(cleaned["base_file"].name) if base_ext.lower() == '.zip': # for now, no verification, but this could be unified pass elif not supported_type(base_ext.lower()[1:]): supported = " , ".join([t.name for t in types]) raise forms.ValidationError( "%s files are supported. You uploaded a %s file" % (supported, base_ext)) if base_ext.lower() == ".shp": dbf_file = cleaned["dbf_file"] shx_file = cleaned["shx_file"] if dbf_file is None or shx_file is None: raise forms.ValidationError( "When uploading Shapefiles, .SHX and .DBF files are also required." ) dbf_name, __ = os.path.splitext(dbf_file.name) shx_name, __ = os.path.splitext(shx_file.name) if dbf_name != base_name or shx_name != base_name: raise forms.ValidationError( "It looks like you're uploading " "components from different Shapefiles. Please " "double-check your file selections.") if cleaned["prj_file"] is not None: prj_file = cleaned["prj_file"].name if os.path.splitext(prj_file)[0] != base_name: raise forms.ValidationError( "It looks like you're " "uploading components from different Shapefiles. " "Please double-check your file selections.") return cleaned def write_files(self): tempdir = tempfile.mkdtemp(dir=settings.FILE_UPLOAD_TEMP_DIR) for field in self.spatial_files: f = self.cleaned_data[field] if f is not None: path = os.path.join(tempdir, f.name) with open(path, 'wb') as writable: for c in f.chunks(): writable.write(c) absolute_base_file = os.path.join(tempdir, self.cleaned_data["base_file"].name) return tempdir, absolute_base_file