From bf9b500ccd36c0895eacab0bb2343a0e683cf4bf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 1 Feb 2024 12:40:57 +0100 Subject: [PATCH 1/5] update version action (#11916) (#11917) (cherry picked from commit 372eb21945172865b2f7cb22718dda352083e573) Co-authored-by: mattiagiupponi <51856725+mattiagiupponi@users.noreply.github.com> --- .github/workflows/flake8.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/flake8.yml b/.github/workflows/flake8.yml index a8304f8a1ac..b1b3db4a52e 100644 --- a/.github/workflows/flake8.yml +++ b/.github/workflows/flake8.yml @@ -27,7 +27,7 @@ jobs: python-version: ${{matrix.python-version}} - name: Install flake8 & black - run: pip install flake8 black + run: pip install --upgrade $(grep 'flake8\|black' requirements.txt) - name: "Check: flake8" run: | From 5a97c34399c980109145faf0f55253ff5a34fbdc Mon Sep 17 00:00:00 2001 From: Giovanni Allegri Date: Thu, 1 Feb 2024 12:49:18 +0100 Subject: [PATCH 2/5] Reformatting for latest Black (#11915) --- create-envfile.py | 6 ++--- geonode/api/resourcebase_api.py | 6 ----- geonode/api/tests.py | 1 - geonode/base/api/permissions.py | 5 ---- geonode/base/api/serializers.py | 2 +- geonode/base/api/tests.py | 6 ++--- geonode/base/forms.py | 1 - geonode/base/tests.py | 1 - geonode/catalogue/metadataxsl/tests.py | 1 - geonode/context_processors.py | 18 +++++++------- geonode/documents/forms.py | 1 - geonode/documents/models.py | 1 - geonode/documents/views.py | 8 ++++--- geonode/geoapps/models.py | 1 - geonode/geoapps/tests.py | 1 - geonode/geoapps/views.py | 8 ++++--- geonode/geoserver/createlayer/tests.py | 1 - geonode/geoserver/tests/integration.py | 2 -- .../harvesting/harvesters/geonodeharvester.py | 24 +++++++++---------- geonode/layers/models.py | 4 ---- geonode/layers/tests.py | 1 - geonode/layers/views.py | 8 ++++--- geonode/maps/models.py | 2 -- geonode/maps/tests.py | 1 - geonode/maps/views.py | 8 ++++--- geonode/monitoring/models.py | 3 --- geonode/security/middleware.py | 1 - geonode/security/models.py | 1 - geonode/security/oauth2_grant_types.py | 1 - geonode/security/oauth2_servers.py | 1 - geonode/security/oauth2_validators.py | 1 - geonode/security/tests.py | 1 - geonode/services/models.py | 1 - geonode/tests/utils.py | 2 -- geonode/upload/upload.py | 1 - geonode/upload/utils.py | 1 - geonode/utils.py | 2 -- 37 files changed, 48 insertions(+), 86 deletions(-) diff --git a/create-envfile.py b/create-envfile.py index c910e912618..88604088ef4 100644 --- a/create-envfile.py +++ b/create-envfile.py @@ -92,9 +92,7 @@ def _get_vals_to_replace(args): _vals_to_replace["letsencrypt_mode"] = ( "disabled" if not _vals_to_replace.get("https_host") - else "staging" - if _jsfile.get("env_type", args.env_type) in ["test"] - else "production" + else "staging" if _jsfile.get("env_type", args.env_type) in ["test"] else "production" ) _vals_to_replace["debug"] = False if _jsfile.get("env_type", args.env_type) in ["prod", "test"] else True _vals_to_replace["email"] = _jsfile.get("email", args.email) @@ -124,7 +122,7 @@ def _get_vals_to_replace(args): prog="ENV file builder", description="Tool for generate environment file automatically. The information can be passed or via CLI or via JSON file ( --file /path/env.json)", usage="python create-envfile.py localhost -f /path/to/json/file.json", - allow_abbrev=False + allow_abbrev=False, ) parser.add_argument( "--noinput", diff --git a/geonode/api/resourcebase_api.py b/geonode/api/resourcebase_api.py index d3a17d08c8a..794a29c884e 100644 --- a/geonode/api/resourcebase_api.py +++ b/geonode/api/resourcebase_api.py @@ -593,7 +593,6 @@ def hydrate_title(self, bundle): class ResourceBaseResource(CommonModelApi): - """ResourceBase api""" class Meta(CommonMetaApi): @@ -607,7 +606,6 @@ class Meta(CommonMetaApi): class FeaturedResourceBaseResource(CommonModelApi): - """Only the featured resourcebases""" class Meta(CommonMetaApi): @@ -620,7 +618,6 @@ class Meta(CommonMetaApi): class LayerResource(CommonModelApi): - """Dataset API""" links = fields.ListField(attribute="links", null=True, use_in="all", default=[]) @@ -756,7 +753,6 @@ class Meta(CommonMetaApi): class MapResource(CommonModelApi): - """Maps API""" def build_filters(self, filters=None, ignore_bad_filters=False, **kwargs): @@ -822,7 +818,6 @@ class Meta(CommonMetaApi): class GeoAppResource(CommonModelApi): - """GeoApps API""" def format_objects(self, objects): @@ -874,7 +869,6 @@ class Meta(CommonMetaApi): class DocumentResource(CommonModelApi): - """Documents API""" def build_filters(self, filters=None, ignore_bad_filters=False, **kwargs): diff --git a/geonode/api/tests.py b/geonode/api/tests.py index 39a428c21fb..61c9214a2c5 100644 --- a/geonode/api/tests.py +++ b/geonode/api/tests.py @@ -386,7 +386,6 @@ def test_tags_lockdown(self): class SearchApiTests(ResourceTestCaseMixin, GeoNodeBaseTestSupport): - """Test the search""" # loading test thesausuri and initial data diff --git a/geonode/base/api/permissions.py b/geonode/base/api/permissions.py index 5dff5b1d33b..75d19ea36d3 100644 --- a/geonode/base/api/permissions.py +++ b/geonode/base/api/permissions.py @@ -41,7 +41,6 @@ class IsSelf(permissions.BasePermission): - """Grant permission only if the current instance is the request user. Used to allow users to edit their own account, nothing to others (even superusers). @@ -62,7 +61,6 @@ def has_object_permission(self, request, view, obj): class IsSelfOrReadOnly(IsSelf): - """Grant permissions if instance *IS* the request user, or read-only. Used to allow users to edit their own account, and others to read. """ @@ -75,7 +73,6 @@ def has_object_permission(self, request, view, obj): class IsSelfOrAdmin(IsSelf): - """Grant R/W to self and superusers/staff members. Deny others.""" def has_permission(self, request, view): @@ -94,7 +91,6 @@ def has_object_permission(self, request, view, obj): class IsSelfOrAdminOrReadOnly(IsSelfOrAdmin): - """Grant R/W to self and superusers/staff members, R/O to others.""" def has_permission(self, request, view): @@ -111,7 +107,6 @@ def has_object_permission(self, request, view, obj): class IsSelfOrAdminOrAuthenticatedReadOnly(IsSelfOrAdmin): - """Grant R/W to self and superusers/staff members, R/O to auth.""" def has_object_permission(self, request, view, obj): diff --git a/geonode/base/api/serializers.py b/geonode/base/api/serializers.py index 01887f4fe4e..eba681a69a1 100644 --- a/geonode/base/api/serializers.py +++ b/geonode/base/api/serializers.py @@ -655,7 +655,7 @@ class Meta: "is_copyable", "blob", "metadata", - "executions" + "executions", # TODO # csw_typename, csw_schema, csw_mdsource, csw_insert_date, csw_type, csw_anytext, csw_wkt_geometry, # metadata_uploaded, metadata_uploaded_preserve, metadata_xml, diff --git a/geonode/base/api/tests.py b/geonode/base/api/tests.py index 4833a955484..fa534cc2bbd 100644 --- a/geonode/base/api/tests.py +++ b/geonode/base/api/tests.py @@ -1951,10 +1951,10 @@ def test_set_resource_thumbnail(self): self.assertEqual(response.json(), "The url must be of an image with format (png, jpeg or jpg)") # using Base64 data as an ASCII byte string - data[ - "file" - ] = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABHNCSVQICAgI\ + data["file"] = ( + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABHNCSVQICAgI\ fAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AAAANSURBVAiZYzAxMfkPAALYAZzx61+bAAAAAElFTkSuQmCC" + ) with patch("geonode.base.models.is_monochromatic_image") as _mck: _mck.return_value = False response = self.client.put(url, data=data, format="json") diff --git a/geonode/base/forms.py b/geonode/base/forms.py index 8c6bd6bd816..8152da290e5 100644 --- a/geonode/base/forms.py +++ b/geonode/base/forms.py @@ -412,7 +412,6 @@ def build_attrs(self, base_attrs=None, extra_attrs=None, **kwargs): class ResourceBaseForm(TranslationModelForm, LinkedResourceForm): - """Base form for metadata, should be inherited by childres classes of ResourceBase""" abstract = forms.CharField(label=_("Abstract"), required=False, widget=TinyMCE()) diff --git a/geonode/base/tests.py b/geonode/base/tests.py index f3741425074..bcadaa07931 100644 --- a/geonode/base/tests.py +++ b/geonode/base/tests.py @@ -166,7 +166,6 @@ def test_add_missing_metadata_author_or_poc(self): class TestCreationOfContactRolesByDifferentInputTypes(ThumbnailTests): - """ Test that contact roles can be set as people profile """ diff --git a/geonode/catalogue/metadataxsl/tests.py b/geonode/catalogue/metadataxsl/tests.py index e09c1291a5f..bce9b262c6e 100644 --- a/geonode/catalogue/metadataxsl/tests.py +++ b/geonode/catalogue/metadataxsl/tests.py @@ -25,7 +25,6 @@ class MetadataXSLTest(GeoNodeBaseTestSupport): - """ Tests geonode.catalogue.metadataxsl app/module """ diff --git a/geonode/context_processors.py b/geonode/context_processors.py index e4ce5757521..1230a20cbf8 100644 --- a/geonode/context_processors.py +++ b/geonode/context_processors.py @@ -86,15 +86,17 @@ def resource_urls(request): EXIF_ENABLED=getattr(settings, "EXIF_ENABLED", False), FAVORITE_ENABLED=getattr(settings, "FAVORITE_ENABLED", False), SEARCH_FILTERS=getattr(settings, "SEARCH_FILTERS", False), - THESAURI_FILTERS=[ - t["name"] - for t in [ - settings.THESAURUS, + THESAURI_FILTERS=( + [ + t["name"] + for t in [ + settings.THESAURUS, + ] + if t.get("filter") ] - if t.get("filter") - ] - if hasattr(settings, "THESAURUS") - else [t.identifier for t in thesaurus], + if hasattr(settings, "THESAURUS") + else [t.identifier for t in thesaurus] + ), MAP_CLIENT_USE_CROSS_ORIGIN_CREDENTIALS=getattr(settings, "MAP_CLIENT_USE_CROSS_ORIGIN_CREDENTIALS", False), SHOW_PROFILE_EMAIL=getattr(settings, "SHOW_PROFILE_EMAIL", False), OGC_SERVER=getattr(settings, "OGC_SERVER", None), diff --git a/geonode/documents/forms.py b/geonode/documents/forms.py index 42671e98172..7568dc6863b 100644 --- a/geonode/documents/forms.py +++ b/geonode/documents/forms.py @@ -117,7 +117,6 @@ class DocumentDescriptionForm(forms.Form): class DocumentCreateForm(TranslationModelForm): - """ The document upload form. """ diff --git a/geonode/documents/models.py b/geonode/documents/models.py index d7650f5b0ae..e4815dc8da9 100644 --- a/geonode/documents/models.py +++ b/geonode/documents/models.py @@ -37,7 +37,6 @@ class Document(ResourceBase): - """ A document is any kind of information that can be attached to a map such as pdf, images, videos, xls... """ diff --git a/geonode/documents/views.py b/geonode/documents/views.py index ca72be2f6a4..49a4c605b1b 100644 --- a/geonode/documents/views.py +++ b/geonode/documents/views.py @@ -322,9 +322,11 @@ def document_metadata( category_form = CategoryForm( request.POST, prefix="category_choice_field", - initial=int(request.POST["category_choice_field"]) - if "category_choice_field" in request.POST and request.POST["category_choice_field"] - else None, + initial=( + int(request.POST["category_choice_field"]) + if "category_choice_field" in request.POST and request.POST["category_choice_field"] + else None + ), ) if hasattr(settings, "THESAURUS"): diff --git a/geonode/geoapps/models.py b/geonode/geoapps/models.py index db57d96f3e3..a3edfff60e1 100644 --- a/geonode/geoapps/models.py +++ b/geonode/geoapps/models.py @@ -31,7 +31,6 @@ class GeoApp(ResourceBase): - """ A GeoApp it is a generic container for every client applications the user might want to create or define. diff --git a/geonode/geoapps/tests.py b/geonode/geoapps/tests.py index c42c1733af6..c4566d604e2 100644 --- a/geonode/geoapps/tests.py +++ b/geonode/geoapps/tests.py @@ -31,7 +31,6 @@ class GeoAppTests(GeoNodeBaseTestSupport): - """Tests geonode.geoapps module""" fixtures = ["initial_data.json", "group_test_data.json", "default_oauth_apps.json"] diff --git a/geonode/geoapps/views.py b/geonode/geoapps/views.py index f83457ae67e..6cb6814bb25 100644 --- a/geonode/geoapps/views.py +++ b/geonode/geoapps/views.py @@ -216,9 +216,11 @@ def geoapp_metadata( category_form = CategoryForm( request.POST, prefix="category_choice_field", - initial=int(request.POST["category_choice_field"]) - if "category_choice_field" in request.POST and request.POST["category_choice_field"] - else None, + initial=( + int(request.POST["category_choice_field"]) + if "category_choice_field" in request.POST and request.POST["category_choice_field"] + else None + ), ) if hasattr(settings, "THESAURUS"): diff --git a/geonode/geoserver/createlayer/tests.py b/geonode/geoserver/createlayer/tests.py index 87d40a4d56d..eb18bc45b34 100644 --- a/geonode/geoserver/createlayer/tests.py +++ b/geonode/geoserver/createlayer/tests.py @@ -33,7 +33,6 @@ class CreateLayerCoreTest(GeoNodeBaseTestSupport): - """ Test createlayer application. """ diff --git a/geonode/geoserver/tests/integration.py b/geonode/geoserver/tests/integration.py index 7fd155210ca..39d8040e80f 100644 --- a/geonode/geoserver/tests/integration.py +++ b/geonode/geoserver/tests/integration.py @@ -56,7 +56,6 @@ def _log(msg, *args): @override_settings(SITEURL="http://localhost:8001/") class GeoNodeGeoServerSync(GeoNodeLiveTestSupport): - """ Tests GeoNode/GeoServer syncronization """ @@ -104,7 +103,6 @@ def test_set_attributes_from_geoserver(self): @override_settings(SITEURL="http://localhost:8002/") class GeoNodeGeoServerCapabilities(GeoNodeLiveTestSupport): - """ Tests GeoNode/GeoServer GetCapabilities per layer, user, category and map """ diff --git a/geonode/harvesting/harvesters/geonodeharvester.py b/geonode/harvesting/harvesters/geonodeharvester.py index 0f9de873476..dad1571b920 100644 --- a/geonode/harvesting/harvesters/geonodeharvester.py +++ b/geonode/harvesting/harvesters/geonodeharvester.py @@ -433,14 +433,14 @@ def _get_resource_list_params(self, offset: typing.Optional[int] = 0) -> typing. result["filter{title.icontains}"] = self.resource_title_filter if self.start_date_filter is not None: start_date = dateutil.parser.parse(self.start_date_filter) - result[ - "filter{date.gte}" - ] = f"{start_date.astimezone(dt.timezone.utc).replace(microsecond=0).isoformat().split('+')[0]}Z" + result["filter{date.gte}"] = ( + f"{start_date.astimezone(dt.timezone.utc).replace(microsecond=0).isoformat().split('+')[0]}Z" + ) if self.end_date_filter is not None: end_date = dateutil.parser.parse(self.end_date_filter) - result[ - "filter{date.lte}" - ] = f"{end_date.astimezone(dt.timezone.utc).replace(microsecond=0).isoformat().split('+')[0]}Z" + result["filter{date.lte}"] = ( + f"{end_date.astimezone(dt.timezone.utc).replace(microsecond=0).isoformat().split('+')[0]}Z" + ) if self.keywords_filter is not None: result["filter{keywords.slug.in}"] = self.keywords_filter if self.categories_filter is not None: @@ -738,14 +738,14 @@ def _get_resource_list_params(self, offset: typing.Optional[int] = 0) -> typing. result["title__icontains"] = self.resource_title_filter if self.start_date_filter is not None: start_date = dateutil.parser.parse(self.start_date_filter) - result[ - "date__gte" - ] = f"{start_date.astimezone(dt.timezone.utc).replace(microsecond=0).isoformat().split('+')[0]}Z" + result["date__gte"] = ( + f"{start_date.astimezone(dt.timezone.utc).replace(microsecond=0).isoformat().split('+')[0]}Z" + ) if self.end_date_filter is not None: end_date = dateutil.parser.parse(self.end_date_filter) - result[ - "date__lte" - ] = f"{end_date.astimezone(dt.timezone.utc).replace(microsecond=0).isoformat().split('+')[0]}Z" + result["date__lte"] = ( + f"{end_date.astimezone(dt.timezone.utc).replace(microsecond=0).isoformat().split('+')[0]}Z" + ) if self.keywords_filter is not None: result["keywords__slug__in"] = ",".join(self.keywords_filter) if self.categories_filter is not None: diff --git a/geonode/layers/models.py b/geonode/layers/models.py index 22eb2eff0cd..bed803f7220 100644 --- a/geonode/layers/models.py +++ b/geonode/layers/models.py @@ -61,7 +61,6 @@ class Style(models.Model, PermissionLevelMixin): - """Model for storing styles.""" name = models.CharField(_("style name"), max_length=255, unique=True) @@ -103,7 +102,6 @@ def __init__(self): class Dataset(ResourceBase): - """ Dataset (inherits ResourceBase fields) """ @@ -376,7 +374,6 @@ def view_count_up(self, user, do_local=False): class AttributeManager(models.Manager): - """Helper class to access filtered attributes""" def visible(self): @@ -384,7 +381,6 @@ def visible(self): class Attribute(models.Model): - """ Auxiliary model for storing layer attributes. diff --git a/geonode/layers/tests.py b/geonode/layers/tests.py index c4d0bf88f0b..bc7d6ff27b6 100644 --- a/geonode/layers/tests.py +++ b/geonode/layers/tests.py @@ -90,7 +90,6 @@ class DatasetsTest(GeoNodeBaseTestSupport): - """Tests geonode.layers app/module""" type = "dataset" diff --git a/geonode/layers/views.py b/geonode/layers/views.py index f7729d2ce09..8b0c585af9c 100644 --- a/geonode/layers/views.py +++ b/geonode/layers/views.py @@ -414,9 +414,11 @@ def dataset_metadata( category_form = CategoryForm( request.POST, prefix="category_choice_field", - initial=int(request.POST["category_choice_field"]) - if "category_choice_field" in request.POST and request.POST["category_choice_field"] - else None, + initial=( + int(request.POST["category_choice_field"]) + if "category_choice_field" in request.POST and request.POST["category_choice_field"] + else None + ), ) if not category_form.is_valid(): logger.error(f"Dataset Category form is not valid: {category_form.errors}") diff --git a/geonode/maps/models.py b/geonode/maps/models.py index 546b71fb8ce..ad7630abc99 100644 --- a/geonode/maps/models.py +++ b/geonode/maps/models.py @@ -37,7 +37,6 @@ class Map(ResourceBase): - """ A Map aggregates several layers together and annotates them with a viewport configuration. @@ -231,7 +230,6 @@ class Meta(ResourceBase.Meta): class MapLayer(models.Model): - """ The MapLayer model represents a layer included in a map. This doesn't just identify the dataset, but also extra options such as which style to load diff --git a/geonode/maps/tests.py b/geonode/maps/tests.py index fdb5d74bb42..9d0748a8db2 100644 --- a/geonode/maps/tests.py +++ b/geonode/maps/tests.py @@ -79,7 +79,6 @@ class MapsTest(NotificationsTestsHelper): - """Tests geonode.maps app/module""" fixtures = ["initial_data.json", "group_test_data.json", "default_oauth_apps.json"] diff --git a/geonode/maps/views.py b/geonode/maps/views.py index bc4271b8799..a82c1741e74 100644 --- a/geonode/maps/views.py +++ b/geonode/maps/views.py @@ -107,9 +107,11 @@ def map_metadata( category_form = CategoryForm( request.POST, prefix="category_choice_field", - initial=int(request.POST["category_choice_field"]) - if "category_choice_field" in request.POST and request.POST["category_choice_field"] - else None, + initial=( + int(request.POST["category_choice_field"]) + if "category_choice_field" in request.POST and request.POST["category_choice_field"] + else None + ), ) if hasattr(settings, "THESAURUS"): diff --git a/geonode/monitoring/models.py b/geonode/monitoring/models.py index 18f302c73dc..dd28350f81a 100644 --- a/geonode/monitoring/models.py +++ b/geonode/monitoring/models.py @@ -69,7 +69,6 @@ def get_geoip(): class Host(models.Model): - """ Describes one physical instance """ @@ -83,7 +82,6 @@ def __str__(self): class ServiceType(models.Model): - """ Service Type list """ @@ -129,7 +127,6 @@ def is_system_monitor(self): class Service(models.Model): - """ Service is a entity describing deployed processes. """ diff --git a/geonode/security/middleware.py b/geonode/security/middleware.py index 07fa80ed745..82bdc6ea9b3 100644 --- a/geonode/security/middleware.py +++ b/geonode/security/middleware.py @@ -70,7 +70,6 @@ class LoginRequiredMiddleware(MiddlewareMixin): - """ Requires a user to be logged in to access any page that is not white-listed. diff --git a/geonode/security/models.py b/geonode/security/models.py index b89a00c2782..2a878368827 100644 --- a/geonode/security/models.py +++ b/geonode/security/models.py @@ -57,7 +57,6 @@ class PermissionLevelError(Exception): class PermissionLevelMixin: - """ Mixin for adding "Permission Level" methods to a model class -- eg role systems where a diff --git a/geonode/security/oauth2_grant_types.py b/geonode/security/oauth2_grant_types.py index 63b865269a6..7ab3575fca1 100644 --- a/geonode/security/oauth2_grant_types.py +++ b/geonode/security/oauth2_grant_types.py @@ -76,7 +76,6 @@ def code_challenge_method_plain(verifier, challenge): class OAuth2AuthorizationCodeGrant(GrantTypeBase): - """`Authorization Code Grant`_ The authorization code grant type is used to obtain both access diff --git a/geonode/security/oauth2_servers.py b/geonode/security/oauth2_servers.py index ead8a714e5b..5a1890aefd6 100644 --- a/geonode/security/oauth2_servers.py +++ b/geonode/security/oauth2_servers.py @@ -46,7 +46,6 @@ class OIDCServer( AuthorizationEndpoint, IntrospectEndpoint, TokenEndpoint, ResourceEndpoint, RevocationEndpoint, UserInfoEndpoint ): - """An all-in-one endpoint featuring all four major grant types.""" def __init__( diff --git a/geonode/security/oauth2_validators.py b/geonode/security/oauth2_validators.py index 0b93b6ed0c6..c5b0bfea230 100644 --- a/geonode/security/oauth2_validators.py +++ b/geonode/security/oauth2_validators.py @@ -34,7 +34,6 @@ class OIDCValidator(OAuth2Validator): - """e.g. Check username and password correspond to a valid and active User, if fails try Facebook token authentication diff --git a/geonode/security/tests.py b/geonode/security/tests.py index f80a0ef8a52..433f4aa6de7 100644 --- a/geonode/security/tests.py +++ b/geonode/security/tests.py @@ -104,7 +104,6 @@ def write(self, buf): class SecurityTests(ResourceTestCaseMixin, GeoNodeBaseTestSupport): - """ Tests for the Geonode security app. """ diff --git a/geonode/services/models.py b/geonode/services/models.py index db56adba495..c6ccf3874b4 100644 --- a/geonode/services/models.py +++ b/geonode/services/models.py @@ -118,7 +118,6 @@ class Meta: class ServiceProfileRole(models.Model): - """ ServiceProfileRole is an intermediate model to bind Profiles and Services and apply roles. """ diff --git a/geonode/tests/utils.py b/geonode/tests/utils.py index 4466f76a6e2..b861f2a0e8a 100644 --- a/geonode/tests/utils.py +++ b/geonode/tests/utils.py @@ -62,7 +62,6 @@ def upload_step(step=None): class Client(DjangoTestClient): - """client for making http requests""" def __init__(self, url, user, passwd, *args, **kwargs): @@ -310,7 +309,6 @@ def check_dataset(uploaded): from pinax.notifications.models import NoticeQueueBatch class NotificationsTestsHelper(GeoNodeBaseTestSupport): - """ Helper class for notification tests This provides: diff --git a/geonode/upload/upload.py b/geonode/upload/upload.py index 0777cb83d3a..4a3feb25d7b 100644 --- a/geonode/upload/upload.py +++ b/geonode/upload/upload.py @@ -39,7 +39,6 @@ class UploaderSession: - """All objects held must be able to survive a good pickling""" # the gsimporter session object diff --git a/geonode/upload/utils.py b/geonode/upload/utils.py index d81f63e9ba5..ea8189e47b9 100644 --- a/geonode/upload/utils.py +++ b/geonode/upload/utils.py @@ -111,7 +111,6 @@ def _log(msg, *args, level="error"): class JSONResponse(HttpResponse): - """JSON response class.""" def __init__(self, obj="", json_opts=None, content_type="application/json", *args, **kwargs): diff --git a/geonode/utils.py b/geonode/utils.py index d15dafe3162..ffa931c3cf4 100755 --- a/geonode/utils.py +++ b/geonode/utils.py @@ -137,7 +137,6 @@ class ServerDoesNotExist(Exception): class OGC_Server(object): # LGTM: @property will not work in old-style classes - """ OGC Server object. """ @@ -211,7 +210,6 @@ def __str__(self): class OGC_Servers_Handler: - """ OGC Server Settings Convenience dict. """ From c4c52c18405885a1f2699e3b8723b8760026605b Mon Sep 17 00:00:00 2001 From: Giovanni Allegri Date: Thu, 1 Feb 2024 13:29:25 +0100 Subject: [PATCH 3/5] =?UTF-8?q?[Backport=204.2.x=20]=20[Fixes=20#11912]=20?= =?UTF-8?q?GWC=20layers=20only=20cache=20default=20style=20after=20B/R=20r?= =?UTF-8?q?estore=20=E2=80=A6=20(#11914)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Fixes #11912] GWC layers only cache default style after B/R restore (#11913) Co-authored-by: G. Allegri * Reformatting for latest Black --------- Co-authored-by: Emanuele Tajariol --- .../management/commands/create_tile_layers.py | 73 +++++++++++++++---- 1 file changed, 60 insertions(+), 13 deletions(-) diff --git a/geonode/br/management/commands/create_tile_layers.py b/geonode/br/management/commands/create_tile_layers.py index eb5d2cfc12b..57b81d805aa 100644 --- a/geonode/br/management/commands/create_tile_layers.py +++ b/geonode/br/management/commands/create_tile_layers.py @@ -42,12 +42,12 @@ application/json;type=utfgrid + image/gif + image/jpeg image/png + image/png8 image/vnd.jpeg-png - image/jpeg image/vnd.jpeg-png8 - image/gif - image/png8 @@ -66,6 +66,11 @@ EPSG:900913 + 0 + 0 + true + 0 + """ @@ -73,9 +78,36 @@ class Command(BaseCommand): help = "Create missing TileLayers in GWC" def add_arguments(self, parser): - pass + parser.add_argument( + '-f', + '--force', + dest="force", + action='store_true', + help="Force tile layer re-creation also if it already exists in GWC") + + parser.add_argument( + '-l', + '--layer', + dest="layers", + action='append', + help="Only process specified layers ") + + parser.add_argument( + '-d', + '--dry-run', + dest="dry-run", + action='store_true', + help="Do not actually perform any change on GWC") def handle(self, **options): + force = options.get('force') + requested_layers = options.get('layers') + dry_run = options.get('dry-run') + + logger.debug(f"FORCE is {force}") + logger.debug(f"DRY-RUN is {dry_run}") + logger.debug(f"LAYERS is {requested_layers}") + try: baseurl = settings.OGC_SERVER["default"]["LOCATION"] user = settings.OGC_SERVER["default"]["USER"] @@ -91,24 +123,38 @@ def handle(self, **options): cnt_old = 0 cnt_new = 0 cnt_bad = 0 + cnt_skip = 0 + cnt_force = 0 for layer in layers: i += 1 logger.info(f"- {i}/{tot} Processing layer: {layer.typename}") + + if requested_layers and layer.typename not in requested_layers: + logger.info(" - Layer filtered out by args") + cnt_skip += 1 + continue + r = requests.get(f"{baseurl}gwc/rest/layers/{layer.typename}.xml", auth=HTTPBasicAuth(user, passwd)) if r.status_code == 200: - logger.info(" - Layer already configured") - cnt_old += 1 - continue + if force: + logger.info(" - Forcing layer configuration in GWC") + cnt_force += 1 + else: + logger.info(" - Layer already configured in GWC") + cnt_old += 1 + continue try: data = REQ_TEMPLATE.format(layer.name) url = f"{baseurl}gwc/rest/layers/{layer.typename}.xml" logger.info(" - Configuring...") - response = requests.put( - url, data=data, headers={"Content-Type": "text/xml"}, auth=HTTPBasicAuth(user, passwd) - ) - if response.status_code == 200: + if not dry_run: + response = requests.put( + url, data=data, headers={"Content-Type": "text/xml"}, auth=HTTPBasicAuth(user, passwd) + ) + + if dry_run or response.status_code == 200: logger.info(f" - Done {layer.name}") cnt_new += 1 else: @@ -121,6 +167,7 @@ def handle(self, **options): raise e logger.info("Work completed") - logger.info(f"- TileLayers configured: {cnt_new}") + logger.info(f"- TileLayers configured: {cnt_new}" + (f" (forced {cnt_force})" if cnt_force else "")) logger.info(f"- TileLayers in error : {cnt_bad}") - logger.info(f"- TileLayers found : {cnt_old}") + logger.info(f"- TileLayers untouched : {cnt_old}") + logger.info(f"- TileLayers skipped : {cnt_skip}") From 3f382b28053c4d2e8d97fe803efc83a1f67ae0a9 Mon Sep 17 00:00:00 2001 From: Giovanni Allegri Date: Fri, 2 Feb 2024 16:17:14 +0100 Subject: [PATCH 4/5] Upgrade Geoserver with fix for oauth2 (#11929) * Upgrade Geoserver with fix for oauth2 * fixes to black formaating --- docker-compose-dev.yml | 2 +- docker-compose-test.yml | 2 +- docker-compose.yml | 2 +- geonode/base/api/tests.py | 6 ++--- .../harvesting/harvesters/geonodeharvester.py | 24 +++++++++---------- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml index f77b69a506f..19b81b0985a 100644 --- a/docker-compose-dev.yml +++ b/docker-compose-dev.yml @@ -79,7 +79,7 @@ services: # Geoserver backend geoserver: - image: geonode/geoserver:2.23.3-v1 + image: geonode/geoserver:2.23.3-v2 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" diff --git a/docker-compose-test.yml b/docker-compose-test.yml index 276523a3a4d..a0da45aafa0 100644 --- a/docker-compose-test.yml +++ b/docker-compose-test.yml @@ -92,7 +92,7 @@ services: # Geoserver backend geoserver: - image: geonode/geoserver:2.23.3-v1 + image: geonode/geoserver:2.23.3-v2 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" diff --git a/docker-compose.yml b/docker-compose.yml index 9c241372858..d073b1cbbcf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -91,7 +91,7 @@ services: # Geoserver backend geoserver: - image: geonode/geoserver:2.23.3-v1 + image: geonode/geoserver:2.23.3-v2 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" diff --git a/geonode/base/api/tests.py b/geonode/base/api/tests.py index fa534cc2bbd..4833a955484 100644 --- a/geonode/base/api/tests.py +++ b/geonode/base/api/tests.py @@ -1951,10 +1951,10 @@ def test_set_resource_thumbnail(self): self.assertEqual(response.json(), "The url must be of an image with format (png, jpeg or jpg)") # using Base64 data as an ASCII byte string - data["file"] = ( - "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABHNCSVQICAgI\ + data[ + "file" + ] = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABHNCSVQICAgI\ fAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AAAANSURBVAiZYzAxMfkPAALYAZzx61+bAAAAAElFTkSuQmCC" - ) with patch("geonode.base.models.is_monochromatic_image") as _mck: _mck.return_value = False response = self.client.put(url, data=data, format="json") diff --git a/geonode/harvesting/harvesters/geonodeharvester.py b/geonode/harvesting/harvesters/geonodeharvester.py index dad1571b920..0f9de873476 100644 --- a/geonode/harvesting/harvesters/geonodeharvester.py +++ b/geonode/harvesting/harvesters/geonodeharvester.py @@ -433,14 +433,14 @@ def _get_resource_list_params(self, offset: typing.Optional[int] = 0) -> typing. result["filter{title.icontains}"] = self.resource_title_filter if self.start_date_filter is not None: start_date = dateutil.parser.parse(self.start_date_filter) - result["filter{date.gte}"] = ( - f"{start_date.astimezone(dt.timezone.utc).replace(microsecond=0).isoformat().split('+')[0]}Z" - ) + result[ + "filter{date.gte}" + ] = f"{start_date.astimezone(dt.timezone.utc).replace(microsecond=0).isoformat().split('+')[0]}Z" if self.end_date_filter is not None: end_date = dateutil.parser.parse(self.end_date_filter) - result["filter{date.lte}"] = ( - f"{end_date.astimezone(dt.timezone.utc).replace(microsecond=0).isoformat().split('+')[0]}Z" - ) + result[ + "filter{date.lte}" + ] = f"{end_date.astimezone(dt.timezone.utc).replace(microsecond=0).isoformat().split('+')[0]}Z" if self.keywords_filter is not None: result["filter{keywords.slug.in}"] = self.keywords_filter if self.categories_filter is not None: @@ -738,14 +738,14 @@ def _get_resource_list_params(self, offset: typing.Optional[int] = 0) -> typing. result["title__icontains"] = self.resource_title_filter if self.start_date_filter is not None: start_date = dateutil.parser.parse(self.start_date_filter) - result["date__gte"] = ( - f"{start_date.astimezone(dt.timezone.utc).replace(microsecond=0).isoformat().split('+')[0]}Z" - ) + result[ + "date__gte" + ] = f"{start_date.astimezone(dt.timezone.utc).replace(microsecond=0).isoformat().split('+')[0]}Z" if self.end_date_filter is not None: end_date = dateutil.parser.parse(self.end_date_filter) - result["date__lte"] = ( - f"{end_date.astimezone(dt.timezone.utc).replace(microsecond=0).isoformat().split('+')[0]}Z" - ) + result[ + "date__lte" + ] = f"{end_date.astimezone(dt.timezone.utc).replace(microsecond=0).isoformat().split('+')[0]}Z" if self.keywords_filter is not None: result["keywords__slug__in"] = ",".join(self.keywords_filter) if self.categories_filter is not None: From 6128b84993e6f58cf2b9ce031a7cb337e363fe0a Mon Sep 17 00:00:00 2001 From: "G. Allegri" Date: Mon, 5 Feb 2024 10:41:06 +0100 Subject: [PATCH 5/5] Prepare release 4.2.2 --- 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 9b1e32fbb4d..95d5717c446 100644 --- a/geonode/__init__.py +++ b/geonode/__init__.py @@ -19,7 +19,7 @@ import os -__version__ = (4, 2, 0, "dev", 0) +__version__ = (4, 2, 2, "final", 0) default_app_config = "geonode.apps.AppConfig" diff --git a/requirements.txt b/requirements.txt index 4ea6cf81017..124910335d9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -88,8 +88,8 @@ pinax-notifications==6.0.0 pinax-ratings==4.0.0 # GeoNode org maintained apps. --e git+https://github.com/GeoNode/geonode-mapstore-client.git@4.2.x#egg=django_geonode_mapstore_client --e git+https://github.com/GeoNode/geonode-importer.git@master#egg=geonode-importer +django-geonode-mapstore-client==4.2.0 +geonode-importer==1.0.6 django-avatar==7.1.1 geonode-oauth-toolkit==2.2.2 geonode-user-messages==2.0.2 diff --git a/setup.cfg b/setup.cfg index 79feeaeb61d..5e24e8fd6be 100644 --- a/setup.cfg +++ b/setup.cfg @@ -114,8 +114,8 @@ install_requires = pinax-ratings==4.0.0 # GeoNode org maintained apps. - django-geonode-mapstore-client>=4.1.1,<5.0.0 - geonode-importer>=1.0.6 + django-geonode-mapstore-client==4.2.0 + geonode-importer==1.0.6 django-avatar==7.1.1 geonode-oauth-toolkit==2.2.2 geonode-user-messages==2.0.2