def test_create_resource_over_quota(self):
     uquota = self.user.quotas.first()
     # make user's quota over hard limit 125%
     uquota.used_value = uquota.allocated_value * 1.3
     uquota.save()
     # create_resource should raise quota exception now that the creator user is over hard limit
     with self.assertRaises(QuotaException):
         resource_pre_create_actions(
             resource_type='GenericResource',
             resource_title='My Test Resource',
             page_redirect_url_key=None,
             files=(self.file_one, ),
             metadata=None,
             requesting_user=self.user,
         )
Пример #2
0
    def test_create_resource_over_quota(self):
        if not QuotaMessage.objects.exists():
            QuotaMessage.objects.create()
        qmsg = QuotaMessage.objects.first()
        qmsg.enforce_quota = True
        qmsg.save()

        uquota = self.user.quotas.first()
        # make user's quota over hard limit 125%
        uquota.used_value = uquota.allocated_value * 1.3
        uquota.save()

        # create_resource should raise quota exception now that the creator user is over hard
        # limit and enforce quota flag is set to True
        with self.assertRaises(QuotaException):
            resource_pre_create_actions(
                resource_type='GenericResource',
                resource_title='My Test Resource',
                page_redirect_url_key=None,
                files=(self.file_one, ),
                metadata=None,
                requesting_user=self.user,
            )

        qmsg.enforce_quota = False
        qmsg.save()
        # create resource should not raise quota exception now that enforce_quota flag
        # is set to False
        try:
            resource_pre_create_actions(
                resource_type='GenericResource',
                resource_title='My Test Resource',
                page_redirect_url_key=None,
                files=(self.file_one, ),
                metadata=None,
                requesting_user=self.user,
            )
        except QuotaException as ex:
            self.fail(
                "create resource should not raise QuotaException for over quota cases "
                " if quota is not enforced - Quota Exception: " + ex.message)
Пример #3
0
    def test_create_resource_over_quota(self):
        if not QuotaMessage.objects.exists():
            QuotaMessage.objects.create()
        qmsg = QuotaMessage.objects.first()
        qmsg.enforce_quota = True
        qmsg.save()

        uquota = self.user.quotas.first()
        # make user's quota over hard limit 125%
        uquota.used_value = uquota.allocated_value * 1.3
        uquota.save()

        # create_resource should raise quota exception now that the creator user is over hard
        # limit and enforce quota flag is set to True
        with self.assertRaises(QuotaException):
            resource_pre_create_actions(resource_type='GenericResource',
                                        resource_title='My Test Resource',
                                        page_redirect_url_key=None,
                                        files=(self.file_one,),
                                        metadata=None,
                                        requesting_user=self.user,)

        qmsg.enforce_quota = False
        qmsg.save()
        # create resource should not raise quota exception now that enforce_quota flag
        # is set to False
        try:
            resource_pre_create_actions(resource_type='GenericResource',
                                        resource_title='My Test Resource',
                                        page_redirect_url_key=None,
                                        files=(self.file_one,),
                                        metadata=None,
                                        requesting_user=self.user, )
        except QuotaException as ex:
            self.fail(
                "create resource should not raise QuotaException for over quota cases "
                " if quota is not enforced - Quota Exception: " + ex.message)
Пример #4
0
    def _create_netcdf_resource(self):
        files = [UploadedFile(file=self.netcdf_file_obj, name=self.netcdf_file_name)]
        _, _, metadata, _ = utils.resource_pre_create_actions(
            resource_type='NetcdfResource',
            resource_title='Snow water equivalent estimation at TWDEF site '
                           'from Oct 2009 to June 2010',
            page_redirect_url_key=None,
            files=files,
            metadata=None)

        self.resNetcdf = hydroshare.create_resource(
            'NetcdfResource',
            self.user,
            'Snow water equivalent estimation at TWDEF site from Oct 2009 to June 2010',
            files=files,
            metadata=metadata
        )

        utils.resource_post_create_actions(self.resNetcdf, self.user, metadata)
Пример #5
0
    def _create_netcdf_resource(self):
        files = [
            UploadedFile(file=self.netcdf_file_obj, name=self.netcdf_file_name)
        ]
        _, _, metadata = utils.resource_pre_create_actions(
            resource_type='NetcdfResource',
            resource_title='Snow water equivalent estimation at TWDEF site '
            'from Oct 2009 to June 2010',
            page_redirect_url_key=None,
            files=files,
            metadata=None)

        self.resNetcdf = hydroshare.create_resource(
            'NetcdfResource',
            self.user,
            'Snow water equivalent estimation at TWDEF site from Oct 2009 to June 2010',
            files=files,
            metadata=metadata)

        utils.resource_post_create_actions(self.resNetcdf, self.user, metadata)
Пример #6
0
    def test_metadata_extraction_of_wkt_crs_on_resource_creation(self):
        files = [
            UploadedFile(file=self.netcdf_file_obj_crs,
                         name=self.netcdf_file_name_crs)
        ]
        _, _, metadata, _ = utils.resource_pre_create_actions(
            resource_type='NetcdfResource',
            resource_title='Snow water equivalent estimation at TWDEF site '
            'from Oct 2009 to June 2010',
            page_redirect_url_key=None,
            files=files,
            metadata=None,
        )

        self.resNetcdf = hydroshare.create_resource(
            'NetcdfResource',
            self.user,
            'Snow water equivalent estimation at TWDEF site from Oct 2009 to June 2010',
            files=files,
            metadata=metadata)

        self._test_metadata_extraction_wkt_crs()
Пример #7
0
    def test_metadata_extraction_on_resource_creation(self):
        # passing the file object that points to the temp dir doesn't work - create_resource
        # throws error open the file from the fixed file location
        files = [
            UploadedFile(file=self.netcdf_file_obj, name=self.netcdf_file_name)
        ]
        _, _, metadata, _ = utils.resource_pre_create_actions(
            resource_type='NetcdfResource',
            resource_title='Snow water equivalent estimation at TWDEF site '
            'from Oct 2009 to June 2010',
            page_redirect_url_key=None,
            files=files,
            metadata=None,
        )

        self.resNetcdf = hydroshare.create_resource(
            'NetcdfResource',
            self.user,
            'Snow water equivalent estimation at TWDEF site from Oct 2009 to June 2010',
            files=files,
            metadata=metadata)

        super(TestNetcdfMetaData, self).netcdf_metadata_extraction()
Пример #8
0
    def test_metadata_in_user_zone(self):
        # only do federation testing when REMOTE_USE_IRODS is True and irods docker containers
        # are set up properly
        if not super(TestNetcdfMetaData, self).is_federated_irods_available():
            return

        # test metadata extraction with resource creation with nc file coming from user zone space
        fed_test_file_full_path = '/{zone}/home/{username}/{fname}'.format(
            zone=settings.HS_USER_IRODS_ZONE,
            username=self.user.username,
            fname=self.netcdf_file_name)
        res_upload_files = []
        _, _, metadata, fed_res_path = utils.resource_pre_create_actions(
            resource_type='NetcdfResource',
            resource_title=
            'Snow water equivalent estimation at TWDEF site from Oct 2009 to June '
            '2010',
            page_redirect_url_key=None,
            files=res_upload_files,
            source_names=[fed_test_file_full_path])
        self.resNetcdf = hydroshare.create_resource(
            'NetcdfResource',
            self.user,
            'Snow water equivalent estimation at TWDEF site from Oct 2009 to June 2010',
            files=res_upload_files,
            source_names=[fed_test_file_full_path],
            fed_res_path=fed_res_path[0] if len(fed_res_path) == 1 else '',
            move=False,
            metadata=metadata)
        utils.resource_post_create_actions(self.resNetcdf, self.user, metadata)
        super(TestNetcdfMetaData, self).netcdf_metadata_extraction()

        # test metadata is deleted after content file is deleted in user zone space
        # there should be 2 content files at this point
        self.assertEqual(self.resNetcdf.files.all().count(), 2)

        # there should be 2 format elements
        self.assertEqual(self.resNetcdf.metadata.formats.all().count(), 2)

        # delete content file now
        hydroshare.delete_resource_file(self.resNetcdf.short_id,
                                        self.netcdf_file_name, self.user)

        # there should no content file
        self.assertEqual(self.resNetcdf.files.all().count(), 0)

        # there should be a title element
        self.assertNotEqual(self.resNetcdf.metadata.title, None)

        # there should be abstract element
        self.assertNotEqual(self.resNetcdf.metadata.description, None)

        # there should be 1 creator element (based on the extracted metadata)
        self.assertEqual(self.resNetcdf.metadata.creators.all().count(), 1)

        # there should be 1 contributor element
        self.assertEqual(self.resNetcdf.metadata.contributors.all().count(), 1)

        # there should be no coverage element
        self.assertEqual(self.resNetcdf.metadata.coverages.all().count(), 0)

        # there should be no format element
        self.assertEqual(self.resNetcdf.metadata.formats.all().count(), 0)

        # there should be subject element
        self.assertNotEqual(self.resNetcdf.metadata.subjects.all().count(), 0)

        # testing extended metadata elements
        self.assertEqual(self.resNetcdf.metadata.ori_coverage.all().count(), 0)
        self.assertEqual(self.resNetcdf.metadata.variables.all().count(), 0)

        # test metadata extraction with a valid nc file being added coming from user zone space
        res_add_files = []
        utils.resource_file_add_pre_process(
            resource=self.resNetcdf,
            files=res_add_files,
            user=self.user,
            source_names=[fed_test_file_full_path])
        utils.resource_file_add_process(resource=self.resNetcdf,
                                        files=res_add_files,
                                        user=self.user,
                                        source_names=[fed_test_file_full_path])

        super(TestNetcdfMetaData, self).netcdf_metadata_extraction()
        self.assertEqual(CoreMetaData.objects.all().count(), 1)
        # delete resource
        hydroshare.delete_resource(self.resNetcdf.short_id)
        self.assertEqual(CoreMetaData.objects.all().count(), 0)
    def test_metadata_in_user_zone(self):
        super(TestRasterMetaData, self).assert_federated_irods_available()
        # test metadata extraction with resource creation with tif file coming from user zone space
        fed_test_file_full_path = '/{zone}/home/{username}/{fname}'.format(
            zone=settings.HS_USER_IRODS_ZONE, username=self.user.username,
            fname=self.raster_tif_file_name)
        res_upload_files = []
        _, _, metadata, fed_res_path = utils.resource_pre_create_actions(
            resource_type='RasterResource',
            resource_title='My Test Raster Resource',
            page_redirect_url_key=None,
            files=res_upload_files,
            source_names=[fed_test_file_full_path])

        self.resRaster = hydroshare.create_resource(
            'RasterResource',
            self.user,
            'My Test Raster Resource',
            files=res_upload_files,
            source_names=[fed_test_file_full_path],
            fed_res_path=fed_res_path[0] if len(fed_res_path) == 1 else '',
            move=False,
            metadata=metadata)

        # raster file validation and metadata extraction in post resource creation signal handler
        utils.resource_post_create_actions(resource=self.resRaster, user=self.user,
                                           metadata=[])
        super(TestRasterMetaData, self).raster_metadata_extraction()

        # test metadata is deleted after content file is deleted in user zone space
        # there should be 2 content file: tif file and vrt file at this point
        self.assertEqual(self.resRaster.files.all().count(), 2)

        # there should be 2 format elements
        self.assertEqual(self.resRaster.metadata.formats.all().count(), 2)
        self.assertEqual(self.resRaster.metadata.formats.all().filter(
            value='application/vrt').count(), 1)
        self.assertEqual(self.resRaster.metadata.formats.all().filter(
            value='image/tiff').count(), 1)

        # delete content file now
        hydroshare.delete_resource_file(self.resRaster.short_id, self.raster_tif_file_name,
                                        self.user)

        # there should be no content file
        self.assertEqual(self.resRaster.files.all().count(), 0)

        # there should be a title element
        self.assertNotEqual(self.resRaster.metadata.title, None)

        # there should be no abstract element
        self.assertEqual(self.resRaster.metadata.description, None)

        # there should be 1 creator element
        self.assertEqual(self.resRaster.metadata.creators.all().count(), 1)

        # there should be no contributor element
        self.assertEqual(self.resRaster.metadata.contributors.all().count(), 0)

        # there should be no coverage element
        self.assertEqual(self.resRaster.metadata.coverages.all().count(), 0)

        # there should be no format element
        self.assertEqual(self.resRaster.metadata.formats.all().count(), 0)

        # there should be no subject element
        self.assertEqual(self.resRaster.metadata.subjects.all().count(), 0)

        # testing extended metadata elements - there should be no extended metadata elements
        # at this point
        self.assertEqual(self.resRaster.metadata.originalCoverage, None)
        self.assertEqual(self.resRaster.metadata.cellInformation, None)
        self.assertEqual(self.resRaster.metadata.bandInformations.count(), 0)

        # test metadata extraction with a valid tif file being added coming from user zone space
        res_add_files = []

        # now necessary in order to test add_process
        utils.resource_file_add_pre_process(resource=self.resRaster,
                                            files=res_add_files,
                                            user=self.user,
                                            source_names=[fed_test_file_full_path])

        # file validation and metadata extraction happen during post file add signal handler
        utils.resource_file_add_process(resource=self.resRaster,
                                        files=res_add_files,
                                        user=self.user,
                                        source_names=[fed_test_file_full_path])

        super(TestRasterMetaData, self).raster_metadata_extraction()

        # test metadata deletion when deleting a resource in user zone space
        self.assertEqual(CoreMetaData.objects.all().count(), 1)

        # delete resource
        hydroshare.delete_resource(self.resRaster.short_id)

        # resource core metadata is deleted after resource deletion
        self.assertEqual(CoreMetaData.objects.all().count(), 0)

        # test adding file from user zone to existing empty resource in hydroshare zone
        # even there is no file uploaded to resource initially, there are default extended
        # automatically metadata created
        self.resRaster = hydroshare.create_resource(
            resource_type='RasterResource',
            owner=self.user,
            title='My Test Raster Resource'
        )
        # test metadata extraction with a valid tif file being added coming from user zone space
        # file validation and metadata extraction happen during post file add signal handler
        utils.resource_file_add_process(resource=self.resRaster,
                                        files=[],
                                        user=self.user,
                                        source_names=[fed_test_file_full_path])
        super(TestRasterMetaData, self).raster_metadata_extraction()

        # there should be 2 content file: tif file and vrt file at this point
        self.assertEqual(self.resRaster.files.all().count(), 2)
        # delete resource
        hydroshare.delete_resource(self.resRaster.short_id)
        # resource core metadata is deleted after resource deletion
        self.assertEqual(CoreMetaData.objects.all().count(), 0)
Пример #10
0
    def test_update_netcdf_file(self):
        # create a netcdf resource
        files = [
            UploadedFile(file=self.netcdf_file_obj, name=self.netcdf_file_name)
        ]
        _, _, metadata, _ = utils.resource_pre_create_actions(
            resource_type='NetcdfResource',
            resource_title='Untitled resource',
            page_redirect_url_key=None,
            files=files,
            metadata=None,
        )

        self.resNetcdf = hydroshare.create_resource('NetcdfResource',
                                                    self.john,
                                                    'Untitled resource',
                                                    files=files,
                                                    metadata=metadata)

        utils.resource_post_create_actions(self.resNetcdf, self.john, metadata)
        res_metadata = self.resNetcdf.metadata

        # update title for setting flag
        self.assertFalse(res_metadata.is_dirty)
        element = res_metadata.title
        res_metadata.update_element('title', element.id, value='new title')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # create/update temporal coverage for setting flag
        res_metadata.is_dirty = False
        res_metadata.save()

        element = res_metadata.create_element('coverage',
                                              type='period',
                                              value={
                                                  'start': '01/01/2000',
                                                  'end': '12/12/2010'
                                              })
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.update_element('coverage',
                                    element.id,
                                    type='period',
                                    value={
                                        'start': '01/02/2000',
                                        'end': '01/03/2000'
                                    })
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # create/update spatial coverage for setting flag
        res_metadata.is_dirty = False
        res_metadata.save()

        element = res_metadata.create_element('coverage',
                                              type='box',
                                              value={
                                                  'northlimit': 12,
                                                  'eastlimit': 12,
                                                  'southlimit': 1,
                                                  'westlimit': 1,
                                                  'units': 'Decimal degree',
                                                  'projection': 'WGS84'
                                              })
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.update_element('coverage',
                                    element.id,
                                    type='box',
                                    value={
                                        'northlimit': '13',
                                        'eastlimit': '13',
                                        'southlimit': '2',
                                        'westlimit': '2',
                                        'units': 'Decimal degree',
                                        'projection': 'WGS84'
                                    })
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # create/update description for setting flag
        res_metadata.is_dirty = False
        res_metadata.save()

        element = res_metadata.create_element('description',
                                              abstract='new abstract')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.update_element('description',
                                    element.id,
                                    abstract='update abstract')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # create subject for setting flag
        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.create_element('subject', value='new keyword2')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # create/update/delete source for setting flag
        res_metadata.is_dirty = False
        res_metadata.save()

        element = res_metadata.create_element('source',
                                              derived_from='new source')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.update_element('source',
                                    element.id,
                                    abstract='update source')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.delete_element('source', element.id)
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # create/update/delete relation for setting flag
        res_metadata.is_dirty = False
        res_metadata.save()

        element_1 = res_metadata.create_element('relation',
                                                type='isHostedBy',
                                                value='new host')
        res_metadata.refresh_from_db()
        self.assertFalse(res_metadata.is_dirty)
        element_2 = res_metadata.create_element('relation',
                                                type='cites',
                                                value='new reference')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.update_element('relation',
                                    element_1.id,
                                    type='isHostedBy',
                                    value='update host')
        res_metadata.refresh_from_db()
        self.assertFalse(res_metadata.is_dirty)

        res_metadata.update_element('relation',
                                    element_2.id,
                                    type='cites',
                                    value='update reference')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.delete_element('relation', element_2.id)
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # update creator
        res_metadata.is_dirty = False
        res_metadata.save()

        element = res_metadata.creators.all().first()
        res_metadata.update_element('creator', element.id, name='update name')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # create/update/delete contributor
        res_metadata.is_dirty = False
        res_metadata.save()

        element = res_metadata.create_element('contributor', name='new name')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.update_element('contributor',
                                    element.id,
                                    name='update name')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.delete_element('contributor', element.id)
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # update variable
        res_metadata.is_dirty = False
        res_metadata.save()

        element = res_metadata.variables.all().first()
        res_metadata.update_element('variable',
                                    element.id,
                                    name=element.name,
                                    unit='update unit',
                                    type=element.type,
                                    shape=element.shape,
                                    missing_value='1',
                                    descriptive_name='update long name',
                                    method='update method')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # check file content update request
        url = reverse("update_netcdf_resfile",
                      kwargs={'resource_id': self.resNetcdf.short_id})
        request = self.factory.post(url)
        request.user = self.john
        self._set_request_message_attributes(request)
        request.META['HTTP_REFERER'] = "/some_url/"
        response = update_netcdf_file(request,
                                      resource_id=self.resNetcdf.short_id)
        self.assertEqual(response.status_code, status.HTTP_302_FOUND)

        # check file update content
        nc_dump_res_file = None
        for f in self.resNetcdf.files.all():
            if f.extension == ".txt":
                nc_dump_res_file = f
                break
        self.assertNotEqual(nc_dump_res_file, None)
        self.assertIn('title = "new title"',
                      nc_dump_res_file.resource_file.read())
        res_metadata.refresh_from_db()
        self.assertFalse(res_metadata.is_dirty)

        # test extra metadata update for setting flag
        self.assertEqual(self.resNetcdf.extra_metadata, {})

        url_params = {'shortkey': self.resNetcdf.short_id}
        post_data = {'key1': 'key-1', 'value1': 'value-1'}
        url = reverse('update_key_value_metadata', kwargs=url_params)
        request = self.factory.post(url, data=post_data)
        request.user = self.john

        # make it a ajax request
        request.META['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
        self._set_request_message_attributes(request)
        response = update_key_value_metadata(request,
                                             shortkey=self.resNetcdf.short_id)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)
    def test_update_netcdf_file(self):
        # create a netcdf resource
        files = [UploadedFile(file=self.netcdf_file_obj, name=self.netcdf_file_name)]
        _, _, metadata, _ = utils.resource_pre_create_actions(
            resource_type='NetcdfResource',
            resource_title='Untitled resource',
            page_redirect_url_key=None,
            files=files,
            metadata=None,)

        self.resNetcdf = hydroshare.create_resource(
            'NetcdfResource',
            self.john,
            'Untitled resource',
            files=files,
            metadata=metadata
            )

        utils.resource_post_create_actions(self.resNetcdf, self.john, metadata)
        res_metadata = self.resNetcdf.metadata

        # update title for setting flag
        self.assertFalse(res_metadata.is_dirty)
        element = res_metadata.title
        res_metadata.update_element('title', element.id, value='new title')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # create/update temporal coverage for setting flag
        res_metadata.is_dirty = False
        res_metadata.save()

        element = res_metadata.create_element('coverage',
                                              type='period',
                                              value={'start': '01/01/2000',
                                                     'end': '12/12/2010'})
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.update_element('coverage', element.id, type='period',
                                    value={'start': '01/02/2000', 'end': '01/03/2000'})
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # create/update spatial coverage for setting flag
        res_metadata.is_dirty = False
        res_metadata.save()

        element = res_metadata.create_element('coverage',
                                              type='box',
                                              value={'northlimit': 12,
                                                     'eastlimit': 12,
                                                     'southlimit': 1,
                                                     'westlimit': 1,
                                                     'units': 'Decimal degree',
                                                     'projection': 'WGS84'}
                                              )
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.update_element('coverage', element.id, type='box',
                                    value={'northlimit': '13',
                                           'eastlimit': '13',
                                           'southlimit': '2',
                                           'westlimit': '2',
                                           'units': 'Decimal degree',
                                           'projection': 'WGS84'}
                                    )
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # create/update description for setting flag
        res_metadata.is_dirty = False
        res_metadata.save()

        element = res_metadata.create_element('description', abstract='new abstract')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.update_element('description', element.id, abstract='update abstract')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # create subject for setting flag
        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.create_element('subject', value='new keyword2')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # create/update/delete source for setting flag
        res_metadata.is_dirty = False
        res_metadata.save()

        element = res_metadata.create_element('source',
                                              derived_from='new source')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.update_element('source', element.id, abstract='update source')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.delete_element('source', element.id)
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # create/update/delete relation for setting flag
        res_metadata.is_dirty = False
        res_metadata.save()

        element_1 = res_metadata.create_element('relation',
                                                type='isHostedBy',
                                                value='new host')
        res_metadata.refresh_from_db()
        self.assertFalse(res_metadata.is_dirty)
        element_2 = res_metadata.create_element('relation',
                                                type='cites',
                                                value='new reference')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.update_element('relation', element_1.id, type='isHostedBy',
                                    value='update host')
        res_metadata.refresh_from_db()
        self.assertFalse(res_metadata.is_dirty)

        res_metadata.update_element('relation', element_2.id, type='cites',
                                    value='update reference')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.delete_element('relation', element_2.id)
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # update creator
        res_metadata.is_dirty = False
        res_metadata.save()

        element = res_metadata.creators.all().first()
        res_metadata.update_element('creator', element.id, name='update name')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # create/update/delete contributor
        res_metadata.is_dirty = False
        res_metadata.save()

        element = res_metadata.create_element('contributor',
                                              name='new name')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.update_element('contributor', element.id, name='update name')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        res_metadata.is_dirty = False
        res_metadata.save()

        res_metadata.delete_element('contributor', element.id)
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # update variable
        res_metadata.is_dirty = False
        res_metadata.save()

        element = res_metadata.variables.all().first()
        res_metadata.update_element('variable',
                                    element.id,
                                    name=element.name,
                                    unit='update unit',
                                    type=element.type,
                                    shape=element.shape,
                                    missing_value='1',
                                    descriptive_name='update long name',
                                    method='update method')
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)

        # check file content update request
        url = reverse("update_netcdf_resfile", kwargs={'resource_id': self.resNetcdf.short_id})
        request = self.factory.post(url)
        request.user = self.john
        self._set_request_message_attributes(request)
        request.META['HTTP_REFERER'] = "/some_url/"
        response = update_netcdf_file(request, resource_id=self.resNetcdf.short_id)
        self.assertEqual(response.status_code, status.HTTP_302_FOUND)

        # check file update content
        nc_dump_res_file = None
        for f in self.resNetcdf.files.all():
            if f.extension == ".txt":
                nc_dump_res_file = f
                break
        self.assertNotEqual(nc_dump_res_file, None)
        self.assertIn('title = "new title"',
                      nc_dump_res_file.resource_file.read())
        res_metadata.refresh_from_db()
        self.assertFalse(res_metadata.is_dirty)

        # test extra metadata update for setting flag
        self.assertEqual(self.resNetcdf.extra_metadata, {})

        url_params = {'shortkey': self.resNetcdf.short_id}
        post_data = {'key1': 'key-1', 'value1': 'value-1'}
        url = reverse('update_key_value_metadata', kwargs=url_params)
        request = self.factory.post(url, data=post_data)
        request.user = self.john

        # make it a ajax request
        request.META['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
        self._set_request_message_attributes(request)
        response = update_key_value_metadata(request, shortkey=self.resNetcdf.short_id)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        res_metadata.refresh_from_db()
        self.assertTrue(res_metadata.is_dirty)
    def test_metadata_in_user_zone(self):
        # only do federation testing when REMOTE_USE_IRODS is True and irods docker containers
        # are set up properly
        super(TestNetcdfMetaData, self).assert_federated_irods_available()

        # test metadata extraction with resource creation with nc file coming from user zone space
        fed_test_file_full_path = '/{zone}/home/{username}/{fname}'.format(
            zone=settings.HS_USER_IRODS_ZONE, username=self.user.username,
            fname=self.netcdf_file_name)
        res_upload_files = []
        _, _, metadata, fed_res_path = utils.resource_pre_create_actions(
            resource_type='NetcdfResource',
            resource_title='Snow water equivalent estimation at TWDEF site from Oct 2009 to June '
                           '2010',
            page_redirect_url_key=None,
            files=res_upload_files,
            source_names=[fed_test_file_full_path])
        self.resNetcdf = hydroshare.create_resource(
            'NetcdfResource',
            self.user,
            'Snow water equivalent estimation at TWDEF site from Oct 2009 to June 2010',
            files=res_upload_files,
            source_names=[fed_test_file_full_path],
            fed_res_path=fed_res_path[0] if len(fed_res_path) == 1 else '',
            move=False,
            metadata=metadata)
        utils.resource_post_create_actions(self.resNetcdf, self.user, metadata)
        super(TestNetcdfMetaData, self).netcdf_metadata_extraction()

        # test metadata is deleted after content file is deleted in user zone space
        # there should be 2 content files at this point
        self.assertEqual(self.resNetcdf.files.all().count(), 2)

        # there should be 2 format elements
        self.assertEqual(self.resNetcdf.metadata.formats.all().count(), 2)

        # delete content file now
        hydroshare.delete_resource_file(self.resNetcdf.short_id, self.netcdf_file_name, self.user)

        # there should no content file
        self.assertEqual(self.resNetcdf.files.all().count(), 0)

        # there should be a title element
        self.assertNotEqual(self.resNetcdf.metadata.title, None)

        # there should be abstract element
        self.assertNotEqual(self.resNetcdf.metadata.description, None)

        # there should be 1 creator element (based on the extracted metadata)
        self.assertEqual(self.resNetcdf.metadata.creators.all().count(), 1)

        # there should be 1 contributor element
        self.assertEqual(self.resNetcdf.metadata.contributors.all().count(), 1)

        # there should be no coverage element
        self.assertEqual(self.resNetcdf.metadata.coverages.all().count(), 0)

        # there should be no format element
        self.assertEqual(self.resNetcdf.metadata.formats.all().count(), 0)

        # there should be subject element
        self.assertNotEqual(self.resNetcdf.metadata.subjects.all().count(), 0)

        # testing extended metadata elements
        self.assertEqual(self.resNetcdf.metadata.ori_coverage.all().count(), 0)
        self.assertEqual(self.resNetcdf.metadata.variables.all().count(), 0)

        # test metadata extraction with a valid nc file being added coming from user zone space
        res_add_files = []
        utils.resource_file_add_pre_process(resource=self.resNetcdf,
                                            files=res_add_files,
                                            user=self.user,
                                            source_names=[fed_test_file_full_path])
        utils.resource_file_add_process(resource=self.resNetcdf,
                                        files=res_add_files,
                                        user=self.user,
                                        source_names=[fed_test_file_full_path])

        super(TestNetcdfMetaData, self).netcdf_metadata_extraction()
        self.assertEqual(CoreMetaData.objects.all().count(), 1)
        # delete resource
        hydroshare.delete_resource(self.resNetcdf.short_id)
        self.assertEqual(CoreMetaData.objects.all().count(), 0)