Skip to content

Commit 30c1453

Browse files
author
Alessio Fabiani
authored
[Fixes GeoNode#6918] Removal of QGIS support (GeoNode#6919)
* [Cleanup and Refactor] Remove QGIS server backend dependencies * [Cleanup and Refactor] Remove QGIS server backend dependencies * - Fix LGTM issues
1 parent 9f49bd3 commit 30c1453

Some content is hidden

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

77 files changed

+103
-7813
lines changed

.dockerignore

-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
geonode/uploaded
2-
geonode/qgis_layer
3-
geonode/qgis_tiles
42
geonode/static_root
53
geonode/static/.components
64
geonode/static/node_modules

.gitignore

-2
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ geonode/local_settings.py
3232

3333
# Uploaded files
3434
geonode/uploaded
35-
geonode/qgis_layer
36-
geonode/qgis_tiles
3735

3836
#Testing output
3937
.coverage

.travis.yml

-60
Original file line numberDiff line numberDiff line change
@@ -71,40 +71,6 @@ jobs:
7171
- MONITORING_ENABLED: 'False'
7272
- SESSION_EXPIRED_CONTROL_ENABLED: 'True'
7373

74-
- stage: unit-tests
75-
name: "QGis Server-backend Core Modules Smoke Tests"
76-
virtualenv:
77-
system_site_packages: false
78-
env:
79-
- BACKEND: 'geonode.qgis_server'
80-
- DJANGO_SETTINGS_MODULE: 'geonode.local_settings'
81-
- DOCKER_COMPOSE_VERSION: 1.19.0
82-
- QGIS_SERVER_URL: http://localhost:9000/
83-
- SITEURL: http://localhost:8000/
84-
- QGIS_SERVER_PORT: 9000
85-
- ON_TRAVIS: 'True'
86-
- TEST_RUN_CORE: 'True'
87-
- MONITORING_ENABLED: 'False'
88-
- SESSION_EXPIRED_CONTROL_ENABLED: 'True'
89-
- CELERY_ALWAYS_EAGER: 'True'
90-
91-
- stage: unit-tests
92-
name: "QGis Server-backend Contrib Apps Smoke Tests"
93-
virtualenv:
94-
system_site_packages: false
95-
env:
96-
- BACKEND: 'geonode.qgis_server'
97-
- DJANGO_SETTINGS_MODULE: 'geonode.local_settings'
98-
- DOCKER_COMPOSE_VERSION: 1.19.0
99-
- QGIS_SERVER_URL: http://localhost:9000/
100-
- SITEURL: http://localhost:8000/
101-
- QGIS_SERVER_PORT: 9000
102-
- ON_TRAVIS: 'True'
103-
- TEST_RUN_INTERNAL_APPS: 'True'
104-
- MONITORING_ENABLED: 'False'
105-
- SESSION_EXPIRED_CONTROL_ENABLED: 'True'
106-
- CELERY_ALWAYS_EAGER: 'True'
107-
10874
- stage: integration-tests
10975
name: "Backend Integration Tests"
11076
virtualenv:
@@ -150,27 +116,6 @@ jobs:
150116
- GEODATABASE_URL: 'postgis://geonode:geonode@localhost:5432/upload_test'
151117
- DEFAULT_BACKEND_DATASTORE: 'datastore'
152118

153-
- stage: integration-tests
154-
name: "QGis Server Integration Tests"
155-
virtualenv:
156-
system_site_packages: false
157-
env:
158-
- BACKEND: 'geonode.qgis_server'
159-
- DJANGO_SETTINGS_MODULE: 'geonode.local_settings'
160-
- DOCKER_COMPOSE_VERSION: 1.19.0
161-
- QGIS_SERVER_URL: http://localhost:9000/
162-
- SITEURL: http://localhost:8000/
163-
- QGIS_SERVER_PORT: 9000
164-
- ON_TRAVIS: 'True'
165-
- TEST_RUNNER_KEEPDB: 'True'
166-
- TEST_RUN_INTEGRATION: 'True'
167-
- TEST_RUN_INTEGRATION_SERVER: 'True'
168-
- MONITORING_ENABLED: 'False'
169-
- SESSION_EXPIRED_CONTROL_ENABLED: 'True'
170-
- CELERY_ALWAYS_EAGER: 'True'
171-
- DATABASE_URL: 'postgis://geonode:geonode@localhost:5432/upload_test'
172-
- GEONODE_CLIENT_LAYER_PREVIEW_LIBRARY: 'leaflet'
173-
174119
- stage: frontend-tests
175120
name: "BDD Tests"
176121
virtualenv:
@@ -215,7 +160,6 @@ before_install:
215160
sudo apt-get update;
216161
mkdir -p $HOME/buildout-cache/{eggs,downloads};
217162
scripts/misc/geoserver_server_setup.sh before_install;
218-
scripts/misc/qgis_server_setup.sh before_install;
219163
sudo apt-get autoremove sqlite3;
220164
sudo sed -i 's/port = 5433/port = 5432/' /etc/postgresql/12/main/postgresql.conf;
221165
sudo sed -i 's/peer/trust/' /etc/postgresql/12/main/pg_hba.conf;
@@ -268,8 +212,6 @@ before_script:
268212
scripts/misc/create_dbs_travis.sh before_script;
269213
echo "For GeoServer Server Travis steps";
270214
scripts/misc/geoserver_server_setup.sh before_script;
271-
echo "For QGIS Server Travis steps";
272-
scripts/misc/qgis_server_setup.sh before_script;
273215
echo "Start NGINX server";
274216
sudo nginx -s stop;
275217
sudo nginx -c `pwd`/scripts/misc/nginx_integration.conf;
@@ -296,8 +238,6 @@ after_script:
296238
else
297239
echo "For GeoServer Server Travis steps";
298240
scripts/misc/geoserver_server_setup.sh after_script;
299-
echo "For QGIS Server Travis steps";
300-
scripts/misc/qgis_server_setup.sh after_script;
301241
echo "Stop NGINX server";
302242
sudo nginx -c `pwd`/scripts/misc/nginx_integration.conf -s stop;
303243
echo "Cleanup";

docker-compose-qgis-server.yml

-22
This file was deleted.

geonode/api/api.py

+2-183
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,14 @@
3030
from django.contrib.contenttypes.models import ContentType
3131
from django.conf import settings
3232
from django.db.models import Count
33-
from django.http.response import HttpResponse
34-
from django.template.response import TemplateResponse
3533
from django.utils.translation import get_language
3634

3735
from avatar.templatetags.avatar_tags import avatar_url
38-
from tastypie import http
39-
from tastypie.exceptions import BadRequest
4036

41-
from geonode import qgis_server, geoserver
37+
from geonode import geoserver
4238
from geonode.api.paginator import CrossSiteXHRPaginator
4339
from geonode.api.authorization import GeoNodeStyleAuthorization, ApiLockdownAuthorization, \
4440
GroupAuthorization, GroupProfileAuthorization
45-
from geonode.qgis_server.models import QGISServerStyle
4641
from guardian.shortcuts import get_objects_for_user
4742
from tastypie.bundle import Bundle
4843

@@ -600,178 +595,6 @@ class Meta:
600595
authorization = ApiLockdownAuthorization()
601596

602597

603-
class QGISStyleResource(ModelResource):
604-
"""Styles API for QGIS Server backend."""
605-
606-
body = fields.CharField(attribute='body', use_in='detail')
607-
name = fields.CharField(attribute='name')
608-
title = fields.CharField(attribute='title')
609-
layer = fields.ForeignKey(
610-
'geonode.api.resourcebase_api.LayerResource',
611-
attribute='layer',
612-
null=True)
613-
style_url = fields.CharField(attribute='style_url')
614-
type = fields.CharField(attribute='type')
615-
616-
class Meta:
617-
paginator_class = CrossSiteXHRPaginator
618-
queryset = QGISServerStyle.objects.all()
619-
resource_name = 'styles'
620-
detail_uri_name = 'id'
621-
allowed_methods = ['get', 'post', 'delete']
622-
authorization = GeoNodeStyleAuthorization()
623-
filtering = {
624-
'id': ALL,
625-
'title': ALL,
626-
'name': ALL,
627-
'layer': ALL_WITH_RELATIONS
628-
}
629-
630-
def populate_object(self, style):
631-
"""Populate results with necessary fields
632-
633-
:param style: Style objects
634-
:type style: QGISServerStyle
635-
:return:
636-
"""
637-
try:
638-
qgis_layer = style.layer_styles.first()
639-
""":type: geonode.qgis_server.QGISServerLayer"""
640-
style.layer = qgis_layer.layer
641-
style.type = 'qml'
642-
except Exception:
643-
pass
644-
return style
645-
646-
def build_filters(self, filters=None, **kwargs):
647-
"""Apply custom filters for layer."""
648-
filters = super(QGISStyleResource, self).build_filters(
649-
filters, **kwargs)
650-
# Convert layer__ filters into layer_styles__layer__
651-
updated_filters = {}
652-
for key, value in filters.items():
653-
key = key.replace('layer__', 'layer_styles__layer__')
654-
updated_filters[key] = value
655-
return updated_filters
656-
657-
def build_bundle(self, obj=None, data=None, request=None, **kwargs):
658-
"""Override build_bundle method to add additional info."""
659-
660-
if obj is None and self._meta.object_class:
661-
obj = self._meta.object_class()
662-
663-
elif obj:
664-
obj = self.populate_object(obj)
665-
666-
return Bundle(
667-
obj=obj,
668-
data=data,
669-
request=request,
670-
**kwargs)
671-
672-
def post_list(self, request, **kwargs):
673-
"""Attempt to redirect to QGIS Server Style management.
674-
675-
A post method should have the following field:
676-
677-
name: Slug name of style
678-
title: Title of style
679-
style: the style file uploaded
680-
681-
Also, should have kwargs:
682-
683-
layername or layer__name: The layer name associated with the style
684-
685-
or
686-
687-
layer__id: The layer id associated with the style
688-
689-
"""
690-
from geonode.qgis_server.views import qml_style
691-
692-
# Extract layer name information
693-
POST = request.POST
694-
FILES = request.FILES
695-
layername = POST.get('layername') or POST.get('layer__name')
696-
if not layername:
697-
layer_id = POST.get('layer__id')
698-
layer = Layer.objects.get(id=layer_id)
699-
layername = layer.name
700-
701-
# move style file
702-
FILES['qml'] = FILES['style']
703-
704-
response = qml_style(request, layername)
705-
706-
if isinstance(response, TemplateResponse):
707-
if response.status_code == 201:
708-
obj = QGISServerStyle.objects.get(
709-
layer_styles__layer__name=layername,
710-
name=POST['name'])
711-
updated_bundle = self.build_bundle(obj=obj, request=request)
712-
location = self.get_resource_uri(updated_bundle)
713-
714-
if not self._meta.always_return_data:
715-
return http.HttpCreated(location=location)
716-
else:
717-
updated_bundle = self.full_dehydrate(updated_bundle)
718-
updated_bundle = self.alter_detail_data_to_serialize(
719-
request, updated_bundle)
720-
return self.create_response(
721-
request, updated_bundle,
722-
response_class=http.HttpCreated,
723-
location=location)
724-
else:
725-
context = response.context_data
726-
# Check form valid
727-
style_upload_form = context['style_upload_form']
728-
if not style_upload_form.is_valid():
729-
raise BadRequest(style_upload_form.errors.as_text())
730-
alert_message = context['alert_message']
731-
raise BadRequest(alert_message)
732-
elif isinstance(response, HttpResponse):
733-
response_class = None
734-
if response.status_code == 403:
735-
response_class = http.HttpForbidden
736-
return self.error_response(
737-
request, response.content,
738-
response_class=response_class)
739-
740-
def delete_detail(self, request, **kwargs):
741-
"""Attempt to redirect to QGIS Server Style management."""
742-
from geonode.qgis_server.views import qml_style
743-
style_id = kwargs.get('id')
744-
745-
qgis_style = QGISServerStyle.objects.get(id=style_id)
746-
layername = qgis_style.layer_styles.first().layer.name
747-
748-
response = qml_style(request, layername, style_name=qgis_style.name)
749-
750-
if isinstance(response, TemplateResponse):
751-
if response.status_code == 200:
752-
# style deleted
753-
return http.HttpNoContent()
754-
else:
755-
context = response.context_data
756-
# Check form valid
757-
style_upload_form = context['style_upload_form']
758-
if not style_upload_form.is_valid():
759-
raise BadRequest(style_upload_form.errors.as_text())
760-
alert_message = context['alert_message']
761-
raise BadRequest(alert_message)
762-
elif isinstance(response, HttpResponse):
763-
response_class = None
764-
if response.status_code == 403:
765-
response_class = http.HttpForbidden
766-
return self.error_response(
767-
request, response.content,
768-
response_class=response_class)
769-
770-
def delete_list(self, request, **kwargs):
771-
"""Do not allow delete list"""
772-
return http.HttpForbidden()
773-
774-
775598
class GeoserverStyleResource(ModelResource):
776599
"""Styles API for Geoserver backend."""
777600
body = fields.CharField(
@@ -844,11 +667,7 @@ def build_bundle(self, obj=None, data=None, request=None, **kwargs):
844667
**kwargs)
845668

846669

847-
if check_ogc_backend(qgis_server.BACKEND_PACKAGE):
848-
class StyleResource(QGISStyleResource):
849-
"""Wrapper for Generic Style Resource"""
850-
pass
851-
elif check_ogc_backend(geoserver.BACKEND_PACKAGE):
670+
if check_ogc_backend(geoserver.BACKEND_PACKAGE):
852671
class StyleResource(GeoserverStyleResource):
853672
"""Wrapper for Generic Style Resource"""
854673
pass

geonode/api/authorization.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
from django.conf import settings
3030

31-
from geonode import geoserver, qgis_server
31+
from geonode import geoserver
3232
from geonode.utils import check_ogc_backend
3333

3434

@@ -133,9 +133,6 @@ def filter_by_resource_ids(self, object_list, permitted_ids):
133133
"""Filter Style queryset by permitted resource ids."""
134134
if check_ogc_backend(geoserver.BACKEND_PACKAGE):
135135
return object_list.filter(layer_styles__id__in=permitted_ids)
136-
elif check_ogc_backend(qgis_server.BACKEND_PACKAGE):
137-
return object_list.filter(
138-
layer_styles__layer__id__in=permitted_ids)
139136

140137
def read_list(self, object_list, bundle):
141138
permitted_ids = get_objects_for_user(

0 commit comments

Comments
 (0)