Skip to content

Commit b6a26f3

Browse files
[Fixes #12368] Introduce geonode-importer in geonode-core (#12570)
* [Fixes #12368] Test Include Importer in GeoNode * [Fixes #12368] Removed unused function/deadcode/files * [Fixes #12368] Fix dataset assign for sld and xml * [Fixes #12368] add pre-validation step * [Fixes #12368] fix serializers for overwrite workflow * [Fixes #12368] fix replace * [Fixes #12368] Fix sld serializer
1 parent e54b42c commit b6a26f3

File tree

207 files changed

+14553
-6038
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

207 files changed

+14553
-6038
lines changed

.circleci/config.yml

+8-3
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ workflows:
110110
codecov_name: main_tests
111111
load_docker_cache: false
112112
save_docker_cache: false
113-
test_suite: ./test.sh $(python -c "import sys;from geonode import settings;sys.stdout.write('\'' '\''.join([a+'\''.tests'\'' for a in settings.GEONODE_APPS if '\''security'\'' not in a and '\''geoserver'\'' not in a]))") geonode.thumbs.tests geonode.people.tests geonode.people.socialaccount.providers.geonode_openid_connect.tests
113+
test_suite: ./test.sh $(python -c "import sys;from geonode import settings;sys.stdout.write('\'' '\''.join([a+'\''.tests'\'' for a in settings.GEONODE_APPS if '\''security'\'' not in a and '\''geoserver'\'' not in a and '\''upload'\'' not in a]))") geonode.thumbs.tests geonode.people.tests geonode.people.socialaccount.providers.geonode_openid_connect.tests
114114
- build:
115115
name: geonode_test_security
116116
codecov_name: security_tests
@@ -128,14 +128,19 @@ workflows:
128128
codecov_name: api
129129
load_docker_cache: false
130130
save_docker_cache: false
131-
test_suite: ./test.sh geonode.api.tests geonode.base.api.tests geonode.layers.api.tests geonode.maps.api.tests geonode.documents.api.tests geonode.geoapps.api.tests geonode.upload.api.tests
131+
test_suite: ./test.sh geonode.api.tests geonode.base.api.tests geonode.layers.api.tests geonode.maps.api.tests geonode.documents.api.tests geonode.geoapps.api.tests
132132
- build:
133133
name: geonode_test_csw
134134
codecov_name: csw
135135
load_docker_cache: false
136136
save_docker_cache: false
137137
test_suite: ./test.sh geonode.tests.csw geonode.catalogue.backends.tests
138-
138+
- build:
139+
name: geonode_upload
140+
codecov_name: importer
141+
load_docker_cache: false
142+
save_docker_cache: false
143+
test_suite: ./test.sh geonode.upload
139144
# TODO
140145
# - build:
141146
# name: geonode_test_integration_upload

.env_test

+3-3
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ GEONODE_DB_CONN_TOUT=5
3939
DEFAULT_BACKEND_DATASTORE=datastore
4040
BROKER_URL=amqp://guest:guest@rabbitmq:5672/
4141
CELERY_BEAT_SCHEDULER=celery.beat:PersistentScheduler
42-
ASYNC_SIGNALS=True
42+
ASYNC_SIGNALS=False
4343

4444
SITEURL=http://localhost:8000/
4545

@@ -64,7 +64,7 @@ NGINX_BASE_URL=http://localhost
6464
# port where the server can be reached on HTTPS
6565
HTTP_HOST=localhost
6666
HTTPS_HOST=
67-
67+
POSTGRESQL_MAX_CONNECTIONS=100
6868
HTTP_PORT=8000
6969
HTTPS_PORT=443
7070

@@ -237,4 +237,4 @@ DEFAULT_MAX_PARALLEL_UPLOADS_PER_USER=100
237237
MICROSOFT_TENANT_ID=
238238
AZURE_CLIENT_ID=
239239
AZURE_SECRET_KEY=
240-
AZURE_KEY=
240+
AZURE_KEY=

docker-compose-test.yml

+9-9
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,15 @@ services:
8080
retries: 5
8181
start_period: 30s
8282

83-
# Gets and installs letsencrypt certificates
84-
letsencrypt:
85-
image: geonode/letsencrypt:2.6.0-latest
86-
container_name: letsencrypt4${COMPOSE_PROJECT_NAME}
87-
env_file:
88-
- .env_test
89-
volumes:
90-
- nginx-certificates:/geonode-certificates
91-
restart: unless-stopped
83+
# # Gets and installs letsencrypt certificates
84+
# letsencrypt:
85+
# image: geonode/letsencrypt:2.6.0-latest
86+
# container_name: letsencrypt4${COMPOSE_PROJECT_NAME}
87+
# env_file:
88+
# - .env_test
89+
# volumes:
90+
# - nginx-certificates:/geonode-certificates
91+
# restart: unless-stopped
9292

9393
# Geoserver backend
9494
geoserver:

geonode/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def get_version():
2828
return geonode.version.get_version(__version__)
2929

3030

31-
def main(global_settings, **settings):
31+
def main(_, **settings):
3232
from django.core.wsgi import get_wsgi_application
3333

3434
os.environ.setdefault("DJANGO_SETTINGS_MODULE", settings.get("django_settings"))

geonode/assets/tests.py

+20-1
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,26 @@ def test_download_file(self):
226226
u, _ = get_user_model().objects.get_or_create(username="admin")
227227
self.assertTrue(self.client.login(username="admin", password="admin"), "Login failed")
228228

229-
asset = self._setup_test(u)
229+
asset_handler = asset_handler_registry.get_default_handler()
230+
asset = asset_handler.create(
231+
title="Test Asset",
232+
description="Description of test asset",
233+
type="NeverMind",
234+
owner=u,
235+
files=[ONE_JSON],
236+
clone_files=True,
237+
)
238+
asset.save()
239+
self.assertIsInstance(asset, LocalAsset)
240+
241+
reloaded = LocalAsset.objects.get(pk=asset.pk)
242+
243+
# put two more files in the asset dir
244+
asset_dir = os.path.dirname(reloaded.location[0])
245+
sub_dir = os.path.join(asset_dir, "subdir")
246+
os.mkdir(sub_dir)
247+
shutil.copy(TWO_JSON, asset_dir)
248+
shutil.copy(THREE_JSON, sub_dir)
230249

231250
for path, key in ((None, "one"), ("one.json", "one"), ("two.json", "two"), ("subdir/three.json", "three")):
232251
# args = [asset.pk, path] if path else [asset.pk]

geonode/base/__init__.py

-6
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,3 @@ def register_event(request, event_type, resource):
7272
raise ValueError(f"Invalid resource: {resource}")
7373
if request and hasattr(request, "register_event"):
7474
request.register_event(event_type, resource_type, resource_name, resource_id)
75-
76-
77-
def register_proxy_event(request):
78-
"""
79-
Process request to geoserver proxy. Extract layer and ows type
80-
"""

geonode/base/api/tests.py

+4-12
Original file line numberDiff line numberDiff line change
@@ -2408,17 +2408,9 @@ def test_resource_service_copy_with_perms_doc(self):
24082408

24092409
@override_settings(CELERY_TASK_ALWAYS_EAGER=True)
24102410
def test_resource_service_copy_with_perms_map(self):
2411-
files = os.path.join(gisdata.GOOD_DATA, "vector/single_point.shp")
2412-
files_as_dict, _ = get_files(files)
2413-
resource = Document.objects.create(
2414-
owner=get_user_model().objects.get(username="admin"),
2415-
alternate="geonode:test_copy",
2416-
resource_type="map",
2417-
uuid=str(uuid4()),
2418-
)
2419-
_, _ = create_asset_and_link(
2420-
resource, get_user_model().objects.get(username="admin"), list(files_as_dict.values())
2421-
)
2411+
2412+
resource = create_single_map(name="test_copy")
2413+
24222414
self._assertCloningWithPerms(resource)
24232415

24242416
def _assertCloningWithPerms(self, resource):
@@ -2430,7 +2422,7 @@ def _assertCloningWithPerms(self, resource):
24302422
resource.set_permissions(_perms)
24312423
copy_url = reverse("importer_resource_copy", kwargs={"pk": resource.pk})
24322424
response = self.client.put(copy_url, data={"title": "cloned_resource"})
2433-
self.assertIn(response.status_code, [403, 404])
2425+
self.assertIn(response.status_code, [302, 403, 404])
24342426
# set perms to enable user clone resource
24352427
# bobby can copy the resource since he has all the perms needed
24362428
_perms = {

geonode/base/auth.py

-17
Original file line numberDiff line numberDiff line change
@@ -47,23 +47,6 @@ def extract_user_from_headers(request):
4747
return user
4848

4949

50-
def extract_headers(request):
51-
"""
52-
Extracts headers from the Django request object
53-
:param request: The current django.http.HttpRequest object
54-
:return: a dictionary with OAuthLib needed headers
55-
"""
56-
headers = request.META.copy()
57-
if "wsgi.input" in headers:
58-
del headers["wsgi.input"]
59-
if "wsgi.errors" in headers:
60-
del headers["wsgi.errors"]
61-
if "HTTP_AUTHORIZATION" in headers:
62-
headers["Authorization"] = headers["HTTP_AUTHORIZATION"]
63-
64-
return headers
65-
66-
6750
def make_token_expiration(seconds=86400):
6851
_expire_seconds = getattr(settings, "ACCESS_TOKEN_EXPIRE_SECONDS", seconds)
6952
_expire_time = datetime.datetime.now(timezone.get_current_timezone())

geonode/base/bbox_utils.py

-7
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,6 @@ def as_polygon(self):
6262
return DjangoPolygon.from_bbox((self.xmin, self.ymin, self.xmax, self.ymax))
6363

6464

65-
def normalize_x_value(value):
66-
"""
67-
Normalise x-axis value/longtitude to fall within [-180, 180]
68-
"""
69-
return ((value + 180) % 360) - 180
70-
71-
7265
def polygon_from_bbox(bbox, srid=4326):
7366
"""
7467
Constructs a Polygon object with srid from a provided bbox.

geonode/base/forms.py

-17
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
from django.conf import settings
3030
from django.contrib.auth import get_user_model
3131
from django.contrib.auth.models import Group
32-
from django.core import validators
3332
from django.db.models import Prefetch, Q
3433
from django.forms import models
3534
from django.forms.fields import ChoiceField, MultipleChoiceField
@@ -659,22 +658,6 @@ class Meta:
659658
)
660659

661660

662-
class ValuesListField(forms.Field):
663-
def to_python(self, value):
664-
if value in validators.EMPTY_VALUES:
665-
return []
666-
667-
value = [item.strip() for item in value.split(",") if item.strip()]
668-
669-
return value
670-
671-
def clean(self, value):
672-
value = self.to_python(value)
673-
self.validate(value)
674-
self.run_validators(value)
675-
return value
676-
677-
678661
class BatchEditForm(forms.Form):
679662
LANGUAGES = (("", "--------"),) + ALL_LANGUAGES
680663
group = forms.ModelChoiceField(label=_("Group"), queryset=Group.objects.all(), required=False)

geonode/base/models.py

-9
Original file line numberDiff line numberDiff line change
@@ -617,15 +617,6 @@ def cleanup_uploaded_files(resource_id):
617617
filename = f"{_resource.get_real_instance().resource_type}-{_resource.get_real_instance().uuid}"
618618
remove_thumbs(filename)
619619

620-
# Remove the uploaded sessions, if any
621-
if "geonode.upload" in settings.INSTALLED_APPS:
622-
from geonode.upload.models import Upload
623-
624-
# Need to call delete one by one in order to invoke the
625-
# 'delete' overridden method
626-
for upload in Upload.objects.filter(resource_id=_resource.get_real_instance().id):
627-
upload.delete()
628-
629620

630621
class ResourceBase(PolymorphicModel, PermissionLevelMixin, ItemBase):
631622
"""

geonode/catalogue/views.py

-10
Original file line numberDiff line numberDiff line change
@@ -201,16 +201,6 @@ def fst(value):
201201
return result
202202

203203

204-
# from a resource object, build the corresponding metadata dict
205-
# the aim is to handle the output format (csv, html or pdf) the same structure
206-
def build_md_dict(resource):
207-
md_dict = {
208-
"r_uuid": {"label": "uuid", "value": resource.uuid},
209-
"r_title": {"label": "titre", "value": resource.title},
210-
}
211-
return md_dict
212-
213-
214204
def get_keywords(resource):
215205
content = " "
216206
cursor = connection.cursor()

geonode/client/conf.py

-8
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,6 @@ def load_path_attr(path):
3838
return attr
3939

4040

41-
def is_installed(package):
42-
try:
43-
__import__(package)
44-
return True
45-
except ImportError:
46-
return False
47-
48-
4941
class GeoNodeClientAppConf(AppConf):
5042
LAYER_PREVIEW_LIBRARY = "geonode"
5143
HOOKSET = "geonode.client.hooksets.BaseHookSet"

geonode/decorators.py

-41
Original file line numberDiff line numberDiff line change
@@ -153,29 +153,6 @@ def view_or_apiauth(view, request, test_func, *args, **kwargs):
153153
return response
154154

155155

156-
def has_perm_or_basicauth(perm, realm=""):
157-
"""
158-
This is similar to the above decorator 'logged_in_or_basicauth'
159-
except that it requires the logged in user to have a specific
160-
permission.
161-
162-
Use:
163-
164-
@logged_in_or_basicauth('asforums.view_forumcollection')
165-
def your_view:
166-
...
167-
168-
"""
169-
170-
def view_decorator(func):
171-
def wrapper(request, *args, **kwargs):
172-
return view_or_basicauth(func, request, lambda u: u.has_perm(perm), realm, *args, **kwargs)
173-
174-
return wrapper
175-
176-
return view_decorator
177-
178-
179156
def superuser_only(function):
180157
"""
181158
Limit view to superusers only.
@@ -289,16 +266,6 @@ def wrapper(request, *args, **kwargs):
289266
return view_decorator
290267

291268

292-
def logged_in_or_apiauth():
293-
def view_decorator(func):
294-
def wrapper(request, *args, **kwargs):
295-
return view_or_apiauth(func, request, lambda u: u.is_authenticated, *args, **kwargs)
296-
297-
return wrapper
298-
299-
return view_decorator
300-
301-
302269
def superuser_or_apiauth():
303270
def view_decorator(func):
304271
def wrapper(request, *args, **kwargs):
@@ -307,11 +274,3 @@ def wrapper(request, *args, **kwargs):
307274
return wrapper
308275

309276
return view_decorator
310-
311-
312-
def dump_func_name(func):
313-
def echo_func(*func_args, **func_kwargs):
314-
logger.debug(f"Start func: {func.__name__}")
315-
return func(*func_args, **func_kwargs)
316-
317-
return echo_func

geonode/documents/forms.py

-6
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,6 @@ class Meta(ResourceBaseForm.Meta):
110110
)
111111

112112

113-
class DocumentDescriptionForm(forms.Form):
114-
title = forms.CharField(max_length=300)
115-
abstract = forms.CharField(max_length=2000, widget=forms.Textarea, required=False)
116-
keywords = forms.CharField(max_length=500, required=False)
117-
118-
119113
class DocumentCreateForm(TranslationModelForm):
120114
"""
121115
The document upload form.

geonode/favorite/utils.py

-44
This file was deleted.

0 commit comments

Comments
 (0)