From d296f7a8e20e3c3d34300011aa05b31e66c351da Mon Sep 17 00:00:00 2001 From: Giovanni Allegri <giohappy@gmail.com> Date: Fri, 31 May 2024 15:06:36 +0200 Subject: [PATCH 1/9] Bump to dev deps (#12303) --- geonode/__init__.py | 2 +- requirements.txt | 4 ++-- setup.cfg | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/geonode/__init__.py b/geonode/__init__.py index d8d6c353488..54866022b5b 100644 --- a/geonode/__init__.py +++ b/geonode/__init__.py @@ -19,7 +19,7 @@ import os -__version__ = (4, 3, 0, "post", 1) +__version__ = (4, 3, 1, "dev", 0) def get_version(): diff --git a/requirements.txt b/requirements.txt index 963c190eaa6..16237c7484d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -85,8 +85,8 @@ Markdown==3.6 geonode-pinax-notifications==6.0.0.2 # GeoNode org maintained apps. -django-geonode-mapstore-client==4.3.0 -geonode-importer==1.0.9 +git+https://github.com/GeoNode/geonode-mapstore-client.git@4.3.x#egg=django_geonode_mapstore_client +git+https://github.com/GeoNode/geonode-importer.git@1.0.x#egg=geonode-importer django-avatar==8.0.0 geonode-oauth-toolkit==2.2.2.2 geonode-user-messages==2.0.2.2 diff --git a/setup.cfg b/setup.cfg index 7c337939658..3b077344d45 100644 --- a/setup.cfg +++ b/setup.cfg @@ -111,8 +111,8 @@ install_requires = geonode-pinax-notifications==6.0.0.2 # GeoNode org maintained apps. - django-geonode-mapstore-client==4.3.0 - geonode-importer==1.0.9 + django-geonode-mapstore-client>=4.3.0,<5.0.0 + geonode-importer>=1.0.9 django-avatar==8.0.0 geonode-oauth-toolkit==2.2.2.2 geonode-user-messages==2.0.2.2 From 7197e76e905ad2ead4e790889cd72e87f999338c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 13:55:11 +0200 Subject: [PATCH 2/9] [Fixes #12361] Fix captcha field visualization in signup page (#12392) (#12393) * Fix captcha field visualization in signup page * fix formatting (cherry picked from commit d3686f86aee56cb3be5b71601237a5542fed7bdb) Co-authored-by: Giovanni Allegri <giohappy@gmail.com> --- geonode/people/forms.py | 2 +- geonode/people/views.py | 4 ++++ geonode/templates/account/signup.html | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/geonode/people/forms.py b/geonode/people/forms.py index b158ae74136..9fbdf4ae638 100644 --- a/geonode/people/forms.py +++ b/geonode/people/forms.py @@ -34,7 +34,7 @@ class AllauthReCaptchaSignupForm(forms.Form): - captcha = ReCaptchaField() + captcha = ReCaptchaField(label=False) def signup(self, request, user): """Required, or else it thorws deprecation warnings""" diff --git a/geonode/people/views.py b/geonode/people/views.py index f7f68a027e9..3abfae18fcf 100644 --- a/geonode/people/views.py +++ b/geonode/people/views.py @@ -50,6 +50,10 @@ class CustomSignupView(SignupView): def get_context_data(self, **kwargs): ret = super().get_context_data(**kwargs) ret.update({"account_geonode_local_signup": settings.SOCIALACCOUNT_WITH_GEONODE_LOCAL_SINGUP}) + # Push captcha field at the end + form = ret["form"] + form.field_order = [f for f in form.fields.keys() if f != "captcha"] + ["captcha"] + form.order_fields(form.field_order) return ret diff --git a/geonode/templates/account/signup.html b/geonode/templates/account/signup.html index 7d897580cdd..f0752becf6e 100644 --- a/geonode/templates/account/signup.html +++ b/geonode/templates/account/signup.html @@ -44,6 +44,7 @@ <h2>{% trans "Sign up" %}</h2> <script type="text/javascript"> $(document).ready(function() { $('#id_username').focus(); - }); + $('#id_captcha').removeClass('form-control'); + }); </script> {% endblock %} From 5ebe7fc45d60b3471ae1055cfe54a1c6d4c8918b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 15:06:10 +0200 Subject: [PATCH 3/9] Move create_tile_layers to backup.sh (#12394) (#12395) (cherry picked from commit 7a99ec8fec9fe54f4bf7ebeb48d8d8732540ca90) Co-authored-by: Giovanni Allegri <giohappy@gmail.com> --- geonode/br/management/commands/restore.py | 1 - 1 file changed, 1 deletion(-) diff --git a/geonode/br/management/commands/restore.py b/geonode/br/management/commands/restore.py index 95ee228d955..e8b48ba8287 100755 --- a/geonode/br/management/commands/restore.py +++ b/geonode/br/management/commands/restore.py @@ -304,7 +304,6 @@ def execute_restore(self, **options): self.restore_geoserver_vector_data(config, settings, target_folder, soft_reset) self.restore_geoserver_externals(config, settings, target_folder) logger.info("*** Recreate GWC tile layers") - call_command("create_tile_layers") except Exception as e: logger.warning(f"*** GeoServer Restore failed: {e}", exc_info=e) if recovery_file: From 750457b995ad10fe9985eb14e91fdc50fdeacb0a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 17:56:12 +0200 Subject: [PATCH 4/9] [Fixes #12369] Create a command to regenerate the XML metadata (#12396) (#12401) (cherry picked from commit cc3816da2d332a1eda338706c94585209b28802f) Co-authored-by: Emanuele Tajariol <etj@geo-solutions.it> --- geonode/base/management/command_utils.py | 34 +++++ geonode/catalogue/management/__init__.py | 0 .../catalogue/management/commands/__init__.py | 0 .../management/commands/regenerate_xml.py | 126 ++++++++++++++++++ geonode/catalogue/models.py | 7 +- 5 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 geonode/base/management/command_utils.py create mode 100644 geonode/catalogue/management/__init__.py create mode 100644 geonode/catalogue/management/commands/__init__.py create mode 100644 geonode/catalogue/management/commands/regenerate_xml.py diff --git a/geonode/base/management/command_utils.py b/geonode/base/management/command_utils.py new file mode 100644 index 00000000000..9d70f22d49e --- /dev/null +++ b/geonode/base/management/command_utils.py @@ -0,0 +1,34 @@ +import logging +from django.conf import settings + +DEFAULT_COMMAND_LOGGER_NAME = "geonode.commands" + + +def setup_logger(logger_name=DEFAULT_COMMAND_LOGGER_NAME, formatter_name="command", handler_name="command"): + if logger_name not in settings.LOGGING["loggers"]: + format = "%(levelname)-7s %(asctime)s %(message)s" + + settings.LOGGING["formatters"][formatter_name] = { + "format": format + } + settings.LOGGING["handlers"][handler_name] = { + "level": "DEBUG", + "class": "logging.StreamHandler", + "formatter": formatter_name + } + settings.LOGGING["loggers"][logger_name] = { + "handlers": [handler_name], + "level": "INFO", + "propagate": False + } + + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter(fmt=format)) + handler.setLevel(logging.DEBUG) + + logger = logging.getLogger(logger_name) + logger.addHandler(handler) + logger.setLevel(logging.INFO) + logger.propagate = False + + return logger diff --git a/geonode/catalogue/management/__init__.py b/geonode/catalogue/management/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/geonode/catalogue/management/commands/__init__.py b/geonode/catalogue/management/commands/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/geonode/catalogue/management/commands/regenerate_xml.py b/geonode/catalogue/management/commands/regenerate_xml.py new file mode 100644 index 00000000000..ce89abdaaa7 --- /dev/null +++ b/geonode/catalogue/management/commands/regenerate_xml.py @@ -0,0 +1,126 @@ +# -*- coding: utf-8 -*- +######################################################################### +# +# Copyright (C) 2023 OSGeo +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# +######################################################################### + +import logging + +from django.core.management.base import BaseCommand + +from geonode.base.management import command_utils +from geonode.base.models import ResourceBase +from geonode.layers.models import Dataset + + +logger = logging.getLogger(__name__) + + +class Command(BaseCommand): + help = "Re-create XML metadata documents" + + def add_arguments(self, parser): + parser.add_argument( + '-l', + '--layer', + dest="layers", + action='append', + help="Only process specified layers ") + + parser.add_argument( + "--skip-logger-setup", + action="store_false", + dest="setup_logger", + help='Skips setup of the "geonode.br" logger, "br" handler and "br" format if not present in settings', + ) + parser.add_argument( + '-d', + '--dry-run', + dest="dry-run", + action='store_true', + help="Do not actually perform any change") + + def handle(self, **options): + requested_layers = options.get('layers') + dry_run = options.get('dry-run') + + if options.get("setup_logger"): + logger = command_utils.setup_logger() + + logger.info(f"==== Running command {__name__}") + logger.info(f"{self.help}") + logger.info("") + + logger.debug(f"DRY-RUN is {dry_run}") + logger.debug(f"LAYERS is {requested_layers}") + + try: + + layers = Dataset.objects.all() + tot = len(layers) + logger.info(f"Total layers in GeoNode: {tot}") + i = 0 + cnt_ok = 0 + cnt_bad = 0 + cnt_skip = 0 + + instance: ResourceBase + for instance in layers: + i += 1 + logger.info(f"- {i}/{tot} Processing layer {instance.id} [{instance.typename}] '{instance.title}'") + + if requested_layers and instance.typename not in requested_layers: + logger.info(" - Layer filtered out by args") + cnt_skip += 1 + continue + + if instance.metadata_uploaded and instance.metadata_uploaded_preserve: + logger.info(" - Layer filtered out since it uses custom XML") + cnt_skip += 1 + continue + + try: + good = None + if not dry_run: + try: + try: + # the save() method triggers the metadata regeneration + instance.save() + good = True + except Exception as e: + logger.error(f"Error saving instance '{instance.title}': {e}") + raise e + + except Exception as e: + logger.exception(f"Error processing '{instance.title}': {e}", e) + + if dry_run or good: + logger.info(f" - Done {instance.name}") + cnt_ok += 1 + else: + logger.warning(f"Metadata couldn't be regenerated for instance '{instance.title}' ") + cnt_bad += 1 + + except Exception as e: + raise e + except Exception as e: + raise e + + logger.info("Work completed" + (" [DRYRUN]" if dry_run else "")) + logger.info(f"- Metadata regenerated : {cnt_ok}") + logger.info(f"- Metadata in error : {cnt_bad}") + logger.info(f"- Resources skipped : {cnt_skip}") diff --git a/geonode/catalogue/models.py b/geonode/catalogue/models.py index caebd2fe42e..e575be179e6 100644 --- a/geonode/catalogue/models.py +++ b/geonode/catalogue/models.py @@ -80,11 +80,14 @@ def catalogue_post_save(instance, sender, **kwargs): resource=resources.get(), url=metadata_url, extension="xml", link_type="metadata" ).update(**_d) - # generate an XML document (GeoNode's default is ISO) if instance.metadata_uploaded and instance.metadata_uploaded_preserve: md_doc = etree.tostring(dlxml.fromstring(instance.metadata_xml)) else: - md_doc = catalogue.catalogue.csw_gen_xml(instance, settings.CATALOG_METADATA_TEMPLATE) + # generate an XML document (GeoNode's default is ISO) + raw_xml = catalogue.catalogue.csw_gen_xml(instance, settings.CATALOG_METADATA_TEMPLATE) + md_obj = dlxml.fromstring(raw_xml, parser=etree.XMLParser(remove_blank_text=True)) + md_doc = etree.tostring(md_obj, pretty_print=True, encoding="unicode") + try: csw_anytext = catalogue.catalogue.csw_gen_anytext(md_doc) except Exception as e: From 5ac36014f5505f55897f4ef97aa4a06ff4af3422 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 21:29:47 +0200 Subject: [PATCH 5/9] [Fixes #12402] Adopt strict-origin-when-cross-origin Referrer Policy as default (#12403) (#12404) * Referre poicy strict-origin-when-cross-origin as default * adapt proxy tests to adapt to new referrer policy (cherry picked from commit 8bb5eda741b4ec6e5a3c5ed652ffff97a72fde03) Co-authored-by: Giovanni Allegri <giohappy@gmail.com> --- geonode/proxy/tests.py | 4 ++-- geonode/settings.py | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/geonode/proxy/tests.py b/geonode/proxy/tests.py index 2f094488ee0..ce2c966dc00 100644 --- a/geonode/proxy/tests.py +++ b/geonode/proxy/tests.py @@ -214,7 +214,7 @@ class Response: "Vary": "Authorization, Accept-Language, Cookie, origin", "X-Content-Type-Options": "nosniff", "X-XSS-Protection": "1; mode=block", - "Referrer-Policy": "same-origin", + "Referrer-Policy": "strict-origin-when-cross-origin", "Cross-Origin-Opener-Policy": "same-origin", "X-Frame-Options": "SAMEORIGIN", "Content-Language": "en", @@ -236,7 +236,7 @@ class Response: "Vary": "Authorization, Accept-Language, Cookie, origin", "X-Content-Type-Options": "nosniff", "X-XSS-Protection": "1; mode=block", - "Referrer-Policy": "same-origin", + "Referrer-Policy": "strict-origin-when-cross-origin", "X-Frame-Options": "SAMEORIGIN", "Content-Language": "en-us", "Content-Length": "119", diff --git a/geonode/settings.py b/geonode/settings.py index c2a2660a4f3..70651fb21ba 100644 --- a/geonode/settings.py +++ b/geonode/settings.py @@ -848,6 +848,7 @@ SECURE_SSL_REDIRECT = ast.literal_eval(os.environ.get("SECURE_SSL_REDIRECT", "False")) SECURE_HSTS_SECONDS = int(os.getenv("SECURE_HSTS_SECONDS", "3600")) SECURE_HSTS_INCLUDE_SUBDOMAINS = ast.literal_eval(os.environ.get("SECURE_HSTS_INCLUDE_SUBDOMAINS", "True")) +SECURE_REFERRER_POLICY = os.environ.get("SECURE_REFERRER_POLICY", "strict-origin-when-cross-origin") # Replacement of the default authentication backend in order to support # permissions per object. From bb7827548039c16c83d483bc99702a99b58a4602 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 11 Jul 2024 14:57:33 +0200 Subject: [PATCH 6/9] Add missing "m" in "Request permission" (#12266) (#12410) Add missing "m" in "Request permission" (cherry picked from commit dd0000612fbf0d022707cf74949c09be660418e9) Co-authored-by: Sylvain POULAIN <kikislater@users.noreply.github.com> --- geonode/templates/owner_rights_request.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/geonode/templates/owner_rights_request.html b/geonode/templates/owner_rights_request.html index feb09faafd4..00e2ed189f6 100644 --- a/geonode/templates/owner_rights_request.html +++ b/geonode/templates/owner_rights_request.html @@ -3,7 +3,7 @@ {% load i18n %} {% load bootstrap_tags %} -{% block title %}{% trans "Request perission" %} {% endblock %} +{% block title %}{% trans "Request permission" %} {% endblock %} {% block body %} <h3>{% trans "Request editing for resource: " %} {{ resource.title }}</h3> <a href="{{ resource.get_absolute_url }}" class="btn btn-primary" type="button">{% trans "Back to resource" %}</a> @@ -16,4 +16,4 @@ <h3>{% trans "Request editing for resource: " %} {{ resource.title }}</h3> <input type="submit" value="{% trans "Send request" %}" class="btn btn-primary" type="button"/> </div> </form> -{% endblock %} \ No newline at end of file +{% endblock %} From 8a2eaa5d3930b33dfbfd6b4095a268b3d031ee4c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 12 Jul 2024 17:46:00 +0200 Subject: [PATCH 7/9] [Fixes #12413] Group filter autocomplete does not work (#12414) (#12415) (cherry picked from commit 0c827f565336e8f0a60d76a44fa0b218b1f6a574) Co-authored-by: mattiagiupponi <51856725+mattiagiupponi@users.noreply.github.com> --- geonode/facets/providers/group.py | 3 +++ geonode/facets/tests.py | 25 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/geonode/facets/providers/group.py b/geonode/facets/providers/group.py index d93404337f4..c8de489b461 100644 --- a/geonode/facets/providers/group.py +++ b/geonode/facets/providers/group.py @@ -62,6 +62,9 @@ def get_facet_items( logger.debug("Filtering by keys %r", keys) filters["group__id__in"] = keys + if topic_contains: + filters["group__name__icontains"] = topic_contains + visible_groups = get_user_visible_groups(user=kwargs["user"]) q = ( diff --git a/geonode/facets/tests.py b/geonode/facets/tests.py index 9bce8fc6a96..5cd6cba1b57 100644 --- a/geonode/facets/tests.py +++ b/geonode/facets/tests.py @@ -669,3 +669,28 @@ def test_group_facet_api_call(self): self.assertDictEqual(expected_response_filtered, response_dict_filtered) self.assertDictEqual(expected_response_base, response_dict_base) + + def test_group_facets_are_filtered_by_words(self): + # there are some groups and the facets return them + url = f"{reverse('get_facet',args=['group'])}" + + response = self.client.get(url) + self.assertEqual(200, response.status_code, response.json()) + + self.assertTrue(response.json().get("topics", {}).get("total", 0) > 0) + + # topic_contains with real name should return 1 + url = f"{reverse('get_facet',args=['group'])}?topic_contains=UserAdmin" + response = self.client.get(url) + + self.assertEqual(200, response.status_code, response.json()) + + self.assertEqual(1, response.json().get("topics", {}).get("total", 0)) + + # topic_contains with a random string to be searched for should be 0 + url = f"{reverse('get_facet',args=['group'])}?topic_contains=abc123scfuqbrwefbasascgiu" + response = self.client.get(url) + + self.assertEqual(200, response.status_code, response.json()) + + self.assertEqual(0, response.json().get("topics", {}).get("total", 0)) From 2dc0df0b13cdf740a7dae230a04c5db0e962b169 Mon Sep 17 00:00:00 2001 From: Giovanni Allegri <giohappy@gmail.com> Date: Fri, 19 Jul 2024 16:26:35 +0200 Subject: [PATCH 8/9] Upgrade to Geoserver 2.24.4 (#12426) --- docker-compose-dev.yml | 4 ++-- docker-compose-test.yml | 4 ++-- docker-compose.yml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml index fb4aac94f86..65c1c9b2b36 100644 --- a/docker-compose-dev.yml +++ b/docker-compose-dev.yml @@ -79,7 +79,7 @@ services: # Geoserver backend geoserver: - image: geonode/geoserver:2.24.3-v1 + image: geonode/geoserver:2.24.4-v1 container_name: geoserver4${COMPOSE_PROJECT_NAME} healthcheck: test: "curl -m 10 --fail --silent --write-out 'HTTP CODE : %{http_code}\n' --output /dev/null http://geoserver:8080/geoserver/ows" @@ -105,7 +105,7 @@ services: condition: service_healthy data-dir-conf: - image: geonode/geoserver_data:2.24.3-v1 + image: geonode/geoserver_data:2.24.4-v1 container_name: gsconf4${COMPOSE_PROJECT_NAME} entrypoint: sleep infinity volumes: diff --git a/docker-compose-test.yml b/docker-compose-test.yml index 5f1ea57d6ab..0194bcb559a 100644 --- a/docker-compose-test.yml +++ b/docker-compose-test.yml @@ -92,7 +92,7 @@ services: # Geoserver backend geoserver: - image: geonode/geoserver:2.24.3-v1 + image: geonode/geoserver:2.24.4-v1 container_name: geoserver4${COMPOSE_PROJECT_NAME} healthcheck: test: "curl -m 10 --fail --silent --write-out 'HTTP CODE : %{http_code}\n' --output /dev/null http://geoserver:8080/geoserver/ows" @@ -118,7 +118,7 @@ services: condition: service_healthy data-dir-conf: - image: geonode/geoserver_data:2.24.3-v1 + image: geonode/geoserver_data:2.24.4-v1 container_name: gsconf4${COMPOSE_PROJECT_NAME} entrypoint: sleep infinity volumes: diff --git a/docker-compose.yml b/docker-compose.yml index 3e3ca03578a..709ddc3b147 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -91,7 +91,7 @@ services: # Geoserver backend geoserver: - image: geonode/geoserver:2.24.3-v1 + image: geonode/geoserver:2.24.4-v1 container_name: geoserver4${COMPOSE_PROJECT_NAME} healthcheck: test: "curl -m 10 --fail --silent --write-out 'HTTP CODE : %{http_code}\n' --output /dev/null http://geoserver:8080/geoserver/ows" @@ -117,7 +117,7 @@ services: condition: service_healthy data-dir-conf: - image: geonode/geoserver_data:2.24.3-v1 + image: geonode/geoserver_data:2.24.4-v1 container_name: gsconf4${COMPOSE_PROJECT_NAME} entrypoint: sleep infinity volumes: From 46f27dc5b52daa5d8dffa81afa4b9100fd7246e5 Mon Sep 17 00:00:00 2001 From: "G. Allegri" <giohappy@gmail.com> Date: Fri, 19 Jul 2024 16:27:57 +0200 Subject: [PATCH 9/9] Bump to 4.3.1 --- docker-compose.yml | 2 +- geonode/__init__.py | 2 +- requirements.txt | 4 ++-- setup.cfg | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 709ddc3b147..354010dcff6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ version: '3.9' # Common Django template for GeoNode and Celery services below x-common-django: &default-common-django - image: geonode/geonode:4.3.0 + image: geonode/geonode:4.3.1 #build: # context: ./ # dockerfile: Dockerfile diff --git a/geonode/__init__.py b/geonode/__init__.py index 54866022b5b..52dca5d04bd 100644 --- a/geonode/__init__.py +++ b/geonode/__init__.py @@ -19,7 +19,7 @@ import os -__version__ = (4, 3, 1, "dev", 0) +__version__ = (4, 3, 1, 'final', 0) def get_version(): diff --git a/requirements.txt b/requirements.txt index 16237c7484d..e56405e86ae 100644 --- a/requirements.txt +++ b/requirements.txt @@ -85,8 +85,8 @@ Markdown==3.6 geonode-pinax-notifications==6.0.0.2 # GeoNode org maintained apps. -git+https://github.com/GeoNode/geonode-mapstore-client.git@4.3.x#egg=django_geonode_mapstore_client -git+https://github.com/GeoNode/geonode-importer.git@1.0.x#egg=geonode-importer +django-geonode-mapstore-client==4.3.1 +geonode-importer==1.0.10 django-avatar==8.0.0 geonode-oauth-toolkit==2.2.2.2 geonode-user-messages==2.0.2.2 diff --git a/setup.cfg b/setup.cfg index 3b077344d45..c7c7d0555eb 100644 --- a/setup.cfg +++ b/setup.cfg @@ -111,8 +111,8 @@ install_requires = geonode-pinax-notifications==6.0.0.2 # GeoNode org maintained apps. - django-geonode-mapstore-client>=4.3.0,<5.0.0 - geonode-importer>=1.0.9 + django-geonode-mapstore-client==4.3.1 + geonode-importer==1.0.10 django-avatar==8.0.0 geonode-oauth-toolkit==2.2.2.2 geonode-user-messages==2.0.2.2