Example #1
0
    def test_valid_existing_geometries(self):
        shapefile = BytesIO(VALID_SHAPEFILE)

        validation_errors = UploadShapefileValidator.validate(
            shapefile, None, False)

        self.assertEqual(len(validation_errors.errors), 0)
Example #2
0
    def test_too_many_extents_in_total(self, bytes_collection_mock):
        mock_shape_collection = []
        for i in range(0, 498):
            mock_shape_collection.append({'geometry': 'a geometry'})

        geometry_session_obj = {
            'features': [{
                'geometry': 'a geometry'
            }, {
                'geometry': 'another geometry'
            }, {
                'geometry': 'a third geometry'
            }]
        }

        shapefile = BytesIO()

        bytes_collection_mock.return_value.__enter__.return_value = mock_shape_collection
        validation_errors = UploadShapefileValidator.validate(
            shapefile, geometry_session_obj, False)

        self.assertEqual(len(validation_errors.errors), 1)
        self.assertEqual(
            validation_errors.errors['shapefile-input'].inline_message,
            "Too many extents")
        self.assertEqual(
            validation_errors.errors['shapefile-input'].summary_message,
            "Number of extents must be 500 (or fewer)")
Example #3
0
    def test_valid_no_existing_geometries(self):
        geometry_session_obj = {'features': []}
        shapefile = BytesIO(VALID_SHAPEFILE)

        validation_errors = UploadShapefileValidator.validate(
            shapefile, geometry_session_obj, False)

        self.assertEqual(len(validation_errors.errors), 0)
Example #4
0
    def test_upload_required(self):
        validation_errors = UploadShapefileValidator.validate(
            None, None, False)

        self.assertEqual(len(validation_errors.errors), 1)
        self.assertEqual(
            validation_errors.errors['shapefile-input'].inline_message,
            "Upload a file")
        self.assertEqual(
            validation_errors.errors['shapefile-input'].summary_message,
            "Upload a file")
Example #5
0
    def test_filesize_too_big(self):
        shapefile = BytesIO(b'a' * 1000001)
        validation_errors = UploadShapefileValidator.validate(
            shapefile, None, False)

        self.assertEqual(len(validation_errors.errors), 1)
        self.assertEqual(
            validation_errors.errors['shapefile-input'].inline_message,
            "Upload a smaller file")
        self.assertEqual(
            validation_errors.errors['shapefile-input'].summary_message,
            "File is bigger than 1MB")
Example #6
0
    def test_invalid_shapefile(self):
        shapefile = BytesIO()

        validation_errors = UploadShapefileValidator.validate(
            shapefile, None, False)

        self.assertEqual(len(validation_errors.errors), 1)
        self.assertEqual(
            validation_errors.errors['shapefile-input'].inline_message,
            "Upload a different file")
        self.assertEqual(
            validation_errors.errors['shapefile-input'].summary_message,
            "File not uploaded")
Example #7
0
    def test_shapefile_contents_required(self, bytes_collection_mock):
        mock_shape_collection = []

        shapefile = BytesIO()

        bytes_collection_mock.return_value.__enter__.return_value = mock_shape_collection
        validation_errors = UploadShapefileValidator.validate(
            shapefile, None, False)

        self.assertEqual(len(validation_errors.errors), 1)
        self.assertEqual(
            validation_errors.errors['shapefile-input'].inline_message,
            "Upload a different file")
        self.assertEqual(
            validation_errors.errors['shapefile-input'].summary_message,
            "File not uploaded")
Example #8
0
    def test_too_many_extents_in_shapefile(self, bytes_collection_mock):
        mock_shape_collection = []
        for i in range(0, 501):
            mock_shape_collection.append({'geometry': 'a geometry'})

        shapefile = BytesIO()

        bytes_collection_mock.return_value.__enter__.return_value = mock_shape_collection
        validation_errors = UploadShapefileValidator.validate(
            shapefile, None, False)

        self.assertEqual(len(validation_errors.errors), 1)
        self.assertEqual(
            validation_errors.errors['shapefile-input'].inline_message,
            "Too many extents")
        self.assertEqual(
            validation_errors.errors['shapefile-input'].summary_message,
            "Number of extents must be 500 (or fewer)")
def post_upload_shapefile():
    current_app.logger.info('Endpoint called')

    if g.session.add_charge_state is None:
        current_app.logger.info('Redirecting to: {}'.format(
            url_for('add_land_charge.new')))
        return redirect(url_for('add_land_charge.new'))

    file = request.files.get('shapefile-input')
    submit_token = request.form.get('csrf_token')
    unique_request = submit_token != g.session.submit_token
    already_uploaded = (
        not unique_request) and g.session.upload_shapefile_processed

    validation_errors = UploadShapefileValidator.validate(
        file, g.session.add_charge_state.geometry, already_uploaded)

    if validation_errors.errors:
        current_app.logger.error('Validation errors when uploading shapefile')
        return render_template(
            "upload_shapefile.html",
            validation_errors=validation_errors.errors,
            validation_summary_heading=validation_errors.summary_heading_text)

    if unique_request and not already_uploaded:
        g.session.submit_token = submit_token
        g.session.commit()

        geometries = parse_upload(file)

        if g.session.add_charge_state.geometry:
            g.session.add_charge_state.geometry['features'].extend(geometries)
        else:
            g.session.add_charge_state.geometry = {
                "type": "FeatureCollection",
                "features": geometries
            }
        g.session.upload_shapefile_processed = True
        g.session.commit()

    return redirect(url_for('add_land_charge.get_location', upload=True))
Example #10
0
    def test_too_many_extents_validation_when_already_uploaded(
            self, bytes_collection_mock):
        mock_shape_collection = [{
            'geometry': 'a geometry'
        }, {
            'geometry': 'another geometry'
        }]

        geometry_session_obj = {'features': []}

        for i in range(0, 499):
            geometry_session_obj['features'].append(
                {'geometry': 'some geometry'})

        shapefile = BytesIO()

        bytes_collection_mock.return_value.__enter__.return_value = mock_shape_collection
        validation_errors = UploadShapefileValidator.validate(
            shapefile, None, True)

        self.assertEqual(len(validation_errors.errors), 0)