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