コード例 #1
0
    def test_validate_model_returns_status_code_0_when_no_errors_detected(
            self):
        """
        Test validate_model returns a 0 status code when no errors are detected.
        """
        upload = {
            "workspace": self.workspace,
            "local": UploadedFile(name="SWAT_Model.zip"),
            "aws": {}
        }

        model = SWATModelZip(upload)
        validation_results = model.validate_model()

        self.assertEqual(validation_results["status"], 0)
コード例 #2
0
    def test_missing_hru_id_field_detected(self):
        """
        Test that the appropriate error is thrown when the
        hru1 shapefile is missing a field named "HRU_ID".
        """
        upload = {
            "workspace": self.workspace,
            "local": UploadedFile(name="SWAT_Model_Missing_HRU_ID_Field.zip"),
            "aws": {}
        }

        model = SWATModelZip(upload)
        validation_results = model.validate_model()

        self.assertEqual(validation_results["status"], 1)
        self.assertFalse(model.errors["hru_id"])
コード例 #3
0
    def test_handles_missing_root_folder(self):
        """
        Test that a missing root folder does not cause an error
        as long as the Watershed and Scenarios folders are found.
        """
        upload = {
            "workspace": self.workspace,
            "local": UploadedFile(name="SWAT_Model_No_Root_Folder.zip"),
            "aws": {}
        }

        model = SWATModelZip(upload)
        validation_results = model.validate_model()

        self.assertEqual(validation_results["status"], 0)
        self.assertTrue(os.path.exists(model.swat_model_directory))
コード例 #4
0
    def test_that_number_of_hrus_in_hru1_match_hru_files(self):
        """
        Test that the number of unique hrus in the hru1 shapefile
        match the number of .hru files in the TxtInOut directory.
        """
        upload = {
            "workspace": self.workspace,
            "local": UploadedFile(name="SWAT_Model.zip"),
            "aws": {}
        }

        model = SWATModelZip(upload)
        validation_results = model.validate_model()

        self.assertEqual(validation_results["status"], 0)
        self.assertEqual(len(validation_results["errors"]), 0)
        self.assertTrue(model.errors["matching_hrus"])
コード例 #5
0
    def test_validate_model_returns_folders_error_when_required_swat_folders_missing(
            self):
        """
        Test that the "folders" error is returned by validate_model when the
        "Watershed" and/or "Scenarios" folders are missing.
        """
        upload = {
            "workspace": self.workspace,
            "local": UploadedFile(name="SWAT_Model_Missing_SWAT_Folders.zip"),
            "aws": {}
        }

        model = SWATModelZip(upload)
        validation_results = model.validate_model()

        self.assertEqual(validation_results["status"], 1)
        self.assertFalse(model.errors["folders"])
コード例 #6
0
    def test_validate_model_returns_status_code_1_when_errors_detected(self):
        """
        Test validate_model returns a 1 status code when errors are found.
        """
        upload = {
            "workspace": self.workspace,
            "local": UploadedFile(name="SWAT_Model_Missing_Reqs.zip"),
            "aws": {}
        }

        model = SWATModelZip(upload)
        validation_results = model.validate_model()

        self.assertEqual(validation_results["status"], 1)
        self.assertFalse(model.errors["raster"])
        self.assertFalse(model.errors["shapefile"])
        self.assertFalse(model.errors["hrus"])
コード例 #7
0
    def test_missing_keys(self):
        """
        Test that missing keys in the upload dictionary are detected.
        """
        # Missing "workspace" key
        upload = {"local": UploadedFile(name="test_file.zip"), "aws": {}}

        with self.assertRaises(KeyError):
            SWATModelZip(upload)
コード例 #8
0
    def test_validate_model_detects_missing_swatoutput_database(self):
        """
        Test that validate model checks for SWATOutput.mdb and toggles
        the appropriate error flag if it is not found.
        """
        upload = {
            "workspace":
            self.workspace,
            "local":
            UploadedFile(name="SWAT_Model_Missing_SWATOutput_database.zip"),
            "aws": {}
        }

        model = SWATModelZip(upload, "field")
        validation_results = model.validate_model()

        self.assertEqual(validation_results["status"], 1)
        self.assertFalse(model.errors["swatmdb"])
コード例 #9
0
    def test_validate_model_detects_mismatching_number_of_hrus_in_hru1_and_txtinout(
            self):
        """
        Test that the correct errors is thrown when the number of hrus in
        hru1 shapefile and the number .hru files in the TxtInOut directory
        do not match.
        """
        upload = {
            "workspace": self.workspace,
            "local": UploadedFile(name="SWAT_Model_Mismatching_HRUs.zip"),
            "aws": {}
        }

        model = SWATModelZip(upload)
        validation_results = model.validate_model()

        self.assertEqual(validation_results["status"], 1)
        self.assertEqual(len(validation_results["errors"]), 1)
        self.assertFalse(model.errors["matching_hrus"])
コード例 #10
0
    def test_file_is_not_a_zip(self):
        """
        Test that the uploaded file has the .zip extension.
        """
        upload = {
            "workspace": self.workspace,
            "local": UploadedFile(name="SWAT_Model.tar.gz"),
            "aws": {}
        }

        with self.assertRaises(NotAZipError):
            SWATModelZip(upload)
コード例 #11
0
    def test_file_does_not_exist(self):
        """
        Test that the uploaded file exists.
        """
        # "workspace" key points to file that does not exist
        upload = {
            "workspace": os.path.join(self.workspace),
            "local": UploadedFile(name="SWAT_Model_Does_Not_Exist.zip"),
            "aws": {}
        }

        with self.assertRaises(FileNotFoundError):
            SWATModelZip(upload)
コード例 #12
0
ファイル: views.py プロジェクト: hancocb/swat-tools
def upload_swat_model_zip(request):
    """ This view uploads the SWAT model zip in to the input directory. """
    # Clear any previous progress or error messages
    request.session['progress_complete'] = []
    request.session['progress_message'] = []
    request.session['error'] = []

    # If user is submitting a zipped SWAT Model
    if request.method == 'POST':
        upload = {
            'workspace': request.session.get('directory'),
            'local': request.FILES.get('swat_model_zip', None),
            'aws': None
        }

        # Check if the uploaded zip is on the aws s3 server
        task_id = request.session.get('unique_directory_name')
        if task_id in request.session.get('on_s3').keys():
            file_name, file_size = request.session.get('on_s3')[task_id]
            upload['aws'] = S3Upload.objects.filter(email=request.user.email,
                                                    file_name=file_name,
                                                    file_size=file_size)

        try:
            swat_model = SWATModelZip(upload)
        except Exception as e:
            logger.error(str(e))
            error_msg = 'An unexpected error has occurred, ' \
                        'please try again. If the issue persists ' \
                        'please use the Contact Us form to request ' \
                        'further assistance from the site admins.'
            request.session['error'] = error_msg
            request.session['error_swat_model'] = error_msg
            return render(request, 'fieldswat/index.html')

        validation_results = swat_model.validate_model()
        if validation_results["status"] == 1:
            request.session['error'] = validation_results['errors']
            request.session['error_swat_model'] = validation_results['errors']
            return render(request, 'fieldswat/index.html')
        try:
            # fetch data from SWATOutput.mdb
            swatoutput_mdb_data = get_unique_years_from_mdb(
                swat_model.get_directory())

            request.session['swatoutput_years'] = swatoutput_mdb_data['years']
            request.session['swatoutput_runoff'] = swatoutput_mdb_data[
                'runoff']
            request.session['swatoutput_sediment'] = swatoutput_mdb_data[
                'sediment']

            # get unique_years
            unique_years = list(set(swatoutput_mdb_data['years']))
            unique_years.sort()
        except Exception as e:
            logger.error(str(e))
            logger.error(
                "{0}: Missing .hru file or unique year in database.".format(
                    request.session.get('unique_directory_name')))
            error_msg = 'You are either missing a .hru file or unique ' \
                        'year in your database. Please compare your ' \
                        'database with the example data to assess ' \
                        'its compatibility with the Field_SWAT tool. ' \
                        'If the issue persists then use the ' \
                        '"Contact Us" option to report your issue to ' \
                        'the Site Administrator.'
            request.session['error'] = error_msg
            request.session['error_swat_model'] = error_msg
            return render(request, 'fieldswat/index.html')

        request.session['swatoutput_unique_years'] = unique_years

        # add unique years to context
        context = {'fieldswat_unique_years': [year for year in unique_years]}

        # Update relevant session variables
        request.session[
            'fieldswat_swat_model_filename'] = swat_model.get_filename()
        request.session['fieldswat_swat_model_dir'] = swat_model.get_directory(
        )

        request.session['progress_message'].append(
            'Swat Model zip folder uploaded.')

        # Render the main page
        return render(request, 'fieldswat/index.html', context)
    else:
        # Nothing was posted, reload main page
        return render(request, 'fieldswat/index.html')