From 01ff5555cbf0f0b8be7fdff16ea3aba8cd241c43 Mon Sep 17 00:00:00 2001 From: Mattia Giupponi Date: Tue, 16 Mar 2021 10:07:29 +0100 Subject: [PATCH 1/6] Task #47: add gitignore .gitignore --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2d2a837 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.idea/ +.vscode/ +.pytest_cache/ +*.pyc +*.egg-info \ No newline at end of file From 05ca14b839e629240f71d7c7216867d0ba456276 Mon Sep 17 00:00:00 2001 From: Mattia Giupponi Date: Tue, 16 Mar 2021 10:08:08 +0100 Subject: [PATCH 2/6] Task #47: fix README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6da5175..27c6d2b 100644 --- a/README.md +++ b/README.md @@ -23,12 +23,12 @@ Geonode-csw_services is a Django App to let GeoNode handle some service metadata 1. To customize the metadata document, use your own service template: - CATALOG_SERVICE_METADATA_TEMPLATE = 'xml/template-service.xml' + CATALOG_SERVICE_METADATA_TEMPLATE = 'xml/service-template.xml' ## Tests -In order to run tests (NOTE: must be in geonode venv), run ``python -m unittest -v`` to create the models. +In order to run tests (NOTE: must be in geonode venv), run ``python -m unittest -v``. ## Uninstalling From 64053017b005d606ab60a410fdb510dcf2fad79c Mon Sep 17 00:00:00 2001 From: Mattia Giupponi Date: Tue, 16 Mar 2021 10:08:45 +0100 Subject: [PATCH 3/6] Task #47: commented code removed --- csw_services/models.py | 152 ----------------------------------------- 1 file changed, 152 deletions(-) diff --git a/csw_services/models.py b/csw_services/models.py index 02260e7..eb5d5c0 100644 --- a/csw_services/models.py +++ b/csw_services/models.py @@ -37,37 +37,6 @@ class CswService(ResourceBase): choices=ServiceType.choices(), null=False) - # uuid = models.CharField(max_length=64, null=False) - # - # title = models.CharField( - # _('title'), - # max_length=255, - # help_text=_('name by which the cited resource is known'), - # ) - # - # abstract = models.TextField( - # _('abstract'), - # max_length=2000, - # blank=True, - # help_text=ResourceBase.abstract_help_text, - # ) - # - # poc = models.ForeignKey( - # settings.AUTH_USER_MODEL, - # blank=True, - # null=False, - # related_name='owned_resource', - # verbose_name=_("Point of Contact"), - # ) - # - # owner = models.ForeignKey( - # settings.AUTH_USER_MODEL, - # blank=True, - # null=False, - # related_name='owned_resource', - # verbose_name=_("Owner"), - # ) - class Meta(ResourceBase.Meta): pass @@ -79,15 +48,6 @@ def get_upload_session(self): def pre_save_service(instance, sender, **kwargs): - # if kwargs.get('raw', False): - # try: - # _resourcebase_ptr = instance.resourcebase_ptr - # instance.owner = _resourcebase_ptr.owner - # instance.uuid = _resourcebase_ptr.uuid - # instance.bbox_polygon = _resourcebase_ptr.bbox_polygon - # instance.srid = _resourcebase_ptr.srid - # except Exception as e: - # LOGGER.exception(e) instance.csw_type = 'service' @@ -96,123 +56,18 @@ def pre_save_service(instance, sender, **kwargs): if instance.title == '' or instance.title is None: instance.title = instance.name - # # Set a default user for accountstream to work correctly. - # if instance.owner is None: - # instance.owner = get_valid_user() - - # logger.debug("handling UUID In pre_save_layer") - # if hasattr(settings, 'LAYER_UUID_HANDLER') and settings.LAYER_UUID_HANDLER != '': - # logger.debug("using custom uuid handler In pre_save_layer") - # from geonode.layers.utils import get_uuid_handler - # instance.uuid = get_uuid_handler()(instance).create_uuid() - # else: - # if instance.uuid == '': - # instance.uuid = str(uuid.uuid1()) - - # logger.debug("In pre_save_layer") - # if instance.alternate is None: - # instance.alternate = _get_alternate_name(instance) - # logger.debug("instance.alternate is: {}".format(instance.alternate)) - - # base_file, info = instance.get_base_file() - - # if info: - # instance.info = info - # - # if base_file is not None: - # extension = '.%s' % base_file.name - # if extension in vec_exts: - # instance.storeType = 'dataStore' - # elif extension in cov_exts: - # instance.storeType = 'coverageStore' - if instance.bbox_polygon is None: instance.set_bbox_polygon((-180, -90, 180, 90), 'EPSG:4326') instance.set_bounds_from_bbox( instance.bbox_polygon, instance.bbox_polygon.srid ) - # # Send a notification when a layer is created - # if instance.pk is None and instance.title: - # # Resource Created - # notice_type_label = '%s_created' % instance.class_name.lower() - # recipients = get_notification_recipients(notice_type_label, resource=instance) - # send_notification(recipients, notice_type_label, {'resource': instance}) - def pre_delete_service(instance, sender, **kwargs): remove_object_permissions(instance) - # """ - # Remove any associated style to the layer, if it is not used by other layers. - # Default style will be deleted in post_delete_layer - # """ - # if instance.remote_service is not None and instance.remote_service.method == INDEXED: - # # we need to delete the maplayers here because in the post save layer.remote_service is not available anymore - # # REFACTOR - # from geonode.maps.models import MapLayer - # logger.debug( - # "Going to delete associated maplayers for [%s]", - # instance.alternate) - # MapLayer.objects.filter( - # name=instance.alternate, - # ows_url=instance.ows_url).delete() - # return - # - # LOGGER.debug( - # "Going to delete the styles associated for [%s]", - # instance.alternate) - # ct = ContentType.objects.get_for_model(instance) - # OverallRating.objects.filter( - # content_type=ct, - # object_id=instance.id).delete() - # - # default_style = instance.default_style - # for style in instance.styles.all(): - # if style.layer_styles.all().count() == 1: - # if style != default_style: - # style.delete() - # - # # Delete object permissions - # remove_object_permissions(instance) - - def post_delete_service(instance, sender, **kwargs): pass - # """ - # Removed the layer from any associated map, if any. - # Remove the layer default style. - # """ - # if instance.remote_service is not None and instance.remote_service.method == INDEXED: - # return - # - # from geonode.maps.models import MapLayer - # logger.debug( - # "Going to delete associated maplayers for [%s]", instance.name) - # MapLayer.objects.filter( - # name=instance.alternate, - # ows_url=instance.ows_url).delete() - # - # logger.debug( - # "Going to delete the default style for [%s]", instance.name) - # - # if instance.default_style and Layer.objects.filter( - # default_style__id=instance.default_style.id).count() == 0: - # instance.default_style.delete() - # - # try: - # if instance.upload_session: - # for lf in instance.upload_session.layerfile_set.all(): - # lf.file.delete() - # instance.upload_session.delete() - # except UploadSession.DoesNotExist: - # pass - - -# def catalogue_pre_delete(instance, sender, **kwargs): -# """Removes the layer from the catalogue""" -# catalogue = get_catalogue() -# catalogue.remove_record(instance.uuid) def post_save_service(instance, sender, **kwargs): @@ -261,10 +116,6 @@ def create_metadata_document(instance, template): 'service': instance, 'SITEURL': site_url, } - # 'LICENSES_METADATA': getattr(settings, - # 'LICENSES', - # dict()).get('METADATA', - # 'never')} md_doc = tpl.render(context=ctx) return md_doc @@ -272,6 +123,3 @@ def create_metadata_document(instance, template): if 'geonode.catalogue' in settings.INSTALLED_APPS: signals.pre_save.connect(pre_save_service, sender=CswService) signals.post_save.connect(post_save_service, sender=CswService) - # signals.pre_delete.connect(catalogue_pre_delete, sender=Service) - # signals.pre_delete.connect(catalogue_pre_delete, sender=Document) - From b2a677c4eb72d8eabca43bce4589cf96b6b578ca Mon Sep 17 00:00:00 2001 From: Mattia Giupponi Date: Tue, 16 Mar 2021 10:10:46 +0100 Subject: [PATCH 4/6] Task #47: Add workflow permissions and check if resource exists before accessing it --- csw_services/models.py | 65 +++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/csw_services/models.py b/csw_services/models.py index eb5d5c0..563db28 100644 --- a/csw_services/models.py +++ b/csw_services/models.py @@ -74,39 +74,44 @@ def post_save_service(instance, sender, **kwargs): """Get information from catalogue""" resources = ResourceBase.objects.filter(id=instance.resourcebase_ptr.id) LOGGER.warn(f'*** POST SAVING SERVICE "{instance.uuid}"') - - # Update the Catalog - try: - catalogue = get_catalogue() - catalogue.create_record(instance) - record = catalogue.get_record(instance.uuid) - except EnvironmentError as err: - if err.errno == errno.ECONNREFUSED: - LOGGER.warning(f'Could not connect to catalogue to save information for layer "{instance.name}"', err) + if resources.exists() and resources.count() == 1: + # Update the Catalog + try: + catalogue = get_catalogue() + catalogue.create_record(instance) + record = catalogue.get_record(instance.uuid) + except EnvironmentError as err: + if err.errno == errno.ECONNREFUSED: + LOGGER.warning(f'Could not connect to catalogue to save information for layer "{instance.name}"', err) + return + else: + raise err + + if not record: + LOGGER.exception(f'Metadata record for service {instance.title} does not exist, check the catalogue signals.') return - else: - raise err - if not record: - LOGGER.exception(f'Metadata record for service {instance.title} does not exist, check the catalogue signals.') - return - - # generate an XML document - if instance.metadata_uploaded and instance.metadata_uploaded_preserve: - md_doc = etree.tostring(dlxml.fromstring(instance.metadata_xml)) + # generate an XML document + if instance.metadata_uploaded and instance.metadata_uploaded_preserve: + md_doc = etree.tostring(dlxml.fromstring(instance.metadata_xml)) + else: + LOGGER.info(f'Rebuilding metadata document for "{instance.uuid}"') + template = getattr(settings, 'CATALOG_SERVICE_METADATA_TEMPLATE', 'xml/service-template.xml') + md_doc = create_metadata_document(instance, template) + try: + csw_anytext = catalogue.catalogue.csw_gen_anytext(md_doc) + except Exception as e: + LOGGER.exception(e) + csw_anytext = '' + + r = resources.get() + r.set_workflow_perms(approved=True, published=True) + + resources.update( + metadata_xml=md_doc, + csw_anytext=csw_anytext) else: - LOGGER.info(f'Rebuilding metadata document for "{instance.uuid}"') - template = getattr(settings, 'CATALOG_SERVICE_METADATA_TEMPLATE', 'xml/service-template.xml') - md_doc = create_metadata_document(instance, template) - try: - csw_anytext = catalogue.catalogue.csw_gen_anytext(md_doc) - except Exception as e: - LOGGER.exception(e) - csw_anytext = '' - - resources.update( - metadata_xml=md_doc, - csw_anytext=csw_anytext) + LOGGER.warn(f'*** The resource selected does not exists or or more than one is selected "{instance.uuid}"') def create_metadata_document(instance, template): From ada4128e28278752ea443aa2adbb5b7fee20c125 Mon Sep 17 00:00:00 2001 From: Mattia Giupponi Date: Tue, 16 Mar 2021 10:15:46 +0100 Subject: [PATCH 5/6] Task #47: Add workflow permissions and check if resource exists before accessing it --- csw_services/models.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/csw_services/models.py b/csw_services/models.py index 563db28..da37bc6 100644 --- a/csw_services/models.py +++ b/csw_services/models.py @@ -74,7 +74,7 @@ def post_save_service(instance, sender, **kwargs): """Get information from catalogue""" resources = ResourceBase.objects.filter(id=instance.resourcebase_ptr.id) LOGGER.warn(f'*** POST SAVING SERVICE "{instance.uuid}"') - if resources.exists() and resources.count() == 1: + if resources.exists(): # Update the Catalog try: catalogue = get_catalogue() @@ -104,8 +104,8 @@ def post_save_service(instance, sender, **kwargs): LOGGER.exception(e) csw_anytext = '' - r = resources.get() - r.set_workflow_perms(approved=True, published=True) + for r in resources: + r.set_workflow_perms(approved=True, published=True) resources.update( metadata_xml=md_doc, From dda88700cabe41faf6ccca1cd977f16cab00563e Mon Sep 17 00:00:00 2001 From: Mattia Giupponi Date: Wed, 17 Mar 2021 10:57:00 +0100 Subject: [PATCH 6/6] Task #47 add instance is_published --- csw_services/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csw_services/models.py b/csw_services/models.py index da37bc6..b2c3b4e 100644 --- a/csw_services/models.py +++ b/csw_services/models.py @@ -105,7 +105,7 @@ def post_save_service(instance, sender, **kwargs): csw_anytext = '' for r in resources: - r.set_workflow_perms(approved=True, published=True) + r.set_workflow_perms(published=instance.is_published) resources.update( metadata_xml=md_doc,