Skip to content

Commit

Permalink
- Allow registered users to manage Remote Services
Browse files Browse the repository at this point in the history
  • Loading branch information
afabiani committed May 16, 2018
1 parent c46fcc5 commit bdf6624
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 20 deletions.
10 changes: 10 additions & 0 deletions geonode/geoserver/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,13 @@ def layer_style(request, layername):
s for s in layer.styles if s.name != style_name] + [old_default]
layer.save()

# Invalidate GeoWebCache for the updated resource
try:
_stylefilterparams_geowebcache_layer(layer.alternate)
_invalidate_geowebcache_layer(layer.alternate)
except:
pass

return HttpResponse(
"Default style for %s changed to %s" %
(layer.name, style_name), status=200)
Expand Down Expand Up @@ -188,12 +195,14 @@ def respond(*args, **kw):
except ConflictingDataError:
return respond(errors="""A layer with this name exists. Select
the update option if you want to update.""")

# Invalidate GeoWebCache for the updated resource
try:
_stylefilterparams_geowebcache_layer(layer.alternate)
_invalidate_geowebcache_layer(layer.alternate)
except:
pass

return respond(
body={
'success': True,
Expand Down Expand Up @@ -314,6 +323,7 @@ def layer_style_manage(request, layername):
_invalidate_geowebcache_layer(layer.alternate)
except:
pass

return HttpResponseRedirect(
reverse(
'layer_detail',
Expand Down
12 changes: 6 additions & 6 deletions geonode/services/templates/services/service_detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -133,19 +133,19 @@ <h3>{% trans "Service Resources" %} <span class="badge">{{ total_resources }}</s

{% get_obj_perms request.user for service as "resource_perms" %}

{% if "change_service" in resource_perms or "remove_service" in resource_perms or "change_service_permissions" in resource_perms %}
{% comment %}{% if "change_service" in resource_perms or "remove_service" in resource_perms or "change_service_permissions" in resource_perms %}{% endcomment %}
<ul class="list-group">
<li class="list-group-item"><h3>{% trans "Manage" %}</h3></li>

{% if "change_service" in resource_perms %}
{% comment %}{% if "change_service" in resource_perms %}{% endcomment %}
<li class="list-group-item"><a class="btn btn-default btn-md btn-block" href="{% url "edit_service" service.id %}">{% trans "Edit Service Metadata" %}</a></li>
<li class="list-group-item"><a id="harvestResources" class="btn btn-default btn-md btn-block" href="{% url "harvest_resources" service.id %}">{% trans "Import Service Resources" %}</a></li>
{% endif %}
{% if "remove_service" or "delete_service" in resource_perms %}
{% comment %}{% endif %}{% endcomment %}
{% comment %}{% if "remove_service" or "delete_service" in resource_perms %}{% endcomment %}
<li class="list-group-item"><a class="btn btn-default btn-md btn-block" href="{% url "remove_service" service.id %}">{% trans "Remove Service" %}</a></li>
{% endif %}
{% comment %}{% endif %}{% endcomment %}
</ul>
{% endif %}
{% comment %}{% endif %}{% endcomment %}
{% endblock %}
{% block extra_script %}
{{ block.super }}
Expand Down
62 changes: 56 additions & 6 deletions geonode/services/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,17 @@

from unittest import TestCase as StandardTestCase

from django.core.urlresolvers import reverse
from django.contrib.auth import get_user_model
from django.template.defaultfilters import slugify
import mock
from owslib.map.wms111 import ContentMetadata

from . import enumerations
from .serviceprocessors import base
from .serviceprocessors import handler
from .serviceprocessors import wms
from . import enumerations, forms
from .models import Service
from .serviceprocessors import (base,
handler,
wms)
from .serviceprocessors.wms import WebMapService
from owslib.wms import WebMapService as OwsWebMapService

Expand Down Expand Up @@ -133,8 +135,16 @@ def setUp(self):
mock_layer_meta.name: mock_layer_meta,
}
self.parsed_wms = mock_parsed_wms
self.test_user = get_user_model().objects.create_user(
"serviceowner", "usermail@fake.mail", "somepassword")

self.test_user, created = get_user_model().objects.get_or_create(username="serviceowner")
if created:
self.test_user.set_password("somepassword")
self.test_user.save()

self.local_user, created = get_user_model().objects.get_or_create(username="serviceuser")
if created:
self.local_user.set_password("somepassword")
self.local_user.save()

@mock.patch("geonode.services.serviceprocessors.wms.WebMapService",
autospec=True)
Expand Down Expand Up @@ -273,3 +283,43 @@ def test_get_store(self, mock_get_gs_cascading_store, mock_wms):
user=mock_catalog.username,
password=mock_catalog.password
)

# @mock.patch("geonode.services.serviceprocessors.handler.WmsServiceHandler",
# autospec=True)
# def test_local_user_cant_delete_service(self, mock_wms_handler):
def test_local_user_cant_delete_service(self):
self.client.logout()
response = self.client.get(reverse('register_service'))
self.failUnlessEqual(response.status_code, 302)

# self.client.login(username='serviceowner', password='somepassword')
# response = self.client.get(reverse('register_service'))
# self.failUnlessEqual(response.status_code, 200)

url = 'https://demo.geo-solutions.it/geoserver/ows?service=wms&version=1.3.0&request=GetCapabilities'
# url = "http://fake"
service_type = enumerations.WMS
form_data = {
'url': url,
'type': service_type
}

form = forms.CreateServiceForm(form_data)
self.assertTrue(form.is_valid())

self.client.login(username='serviceowner', password='somepassword')
response = self.client.post(reverse('register_service'), data=form_data)

s = Service.objects.all().first()
self.failUnlessEqual(len(Service.objects.all()), 1)
self.assertEqual(s.owner, self.test_user)

self.client.login(username='serviceuser', password='somepassword')
response = self.client.post(reverse('remove_service', args=(s.id,)))
self.failUnlessEqual(response.status_code, 401)
self.failUnlessEqual(len(Service.objects.all()), 1)

self.client.login(username='serviceowner', password='somepassword')
response = self.client.post(reverse('remove_service', args=(s.id,)))

self.failUnlessEqual(len(Service.objects.all()), 0)
17 changes: 9 additions & 8 deletions geonode/services/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
from django.utils.translation import ugettext as _
from django.views.decorators.csrf import requires_csrf_token
from django.views.decorators.cache import cache_control
from geonode.decorators import superuser_only
from django.contrib.auth.decorators import login_required
from geonode.security.views import _perms_info_json
from geonode.layers.models import Layer
from geonode.proxy.views import proxy
Expand Down Expand Up @@ -73,7 +73,7 @@ def services(request):
)


@superuser_only
@login_required
def register_service(request):
service_register_template = "services/service_register.html"
if request.method == "POST":
Expand Down Expand Up @@ -126,7 +126,7 @@ def _get_service_handler(request, service):
return service_handler


@superuser_only
@login_required
def harvest_resources(request, service_id):
service = get_object_or_404(Service, pk=service_id)
try:
Expand Down Expand Up @@ -201,7 +201,7 @@ def harvest_resources(request, service_id):
return result


@superuser_only
@login_required
def harvest_single_resource(request, service_id, resource_id):
service = get_object_or_404(Service, pk=service_id)
handler = _get_service_handler(request, service)
Expand Down Expand Up @@ -237,7 +237,7 @@ def _gen_harvestable_ids(requested_ids, available_resources):
yield identifier


@superuser_only
@login_required
def rescan_service(request, service_id):
service = get_object_or_404(Service, pk=service_id)
try:
Expand All @@ -255,6 +255,7 @@ def rescan_service(request, service_id):
reverse("harvest_resources", kwargs={"service_id": service_id}))


@login_required
def service_detail(request, service_id):
"""This view shows the details of a service"""
service = get_object_or_404(Service, pk=service_id)
Expand Down Expand Up @@ -308,7 +309,7 @@ def service_detail(request, service_id):
)


@superuser_only
@login_required
def edit_service(request, service_id):
"""
Edit an existing Service
Expand All @@ -334,11 +335,11 @@ def edit_service(request, service_id):
context={"service": service_obj, "service_form": service_form})


@superuser_only
@login_required
def remove_service(request, service_id):
"""Delete a service and its constituent layers"""
service = get_object_or_404(Service, pk=service_id)
if not request.user.has_perm('maps.delete_service', obj=service):
if request.user != service.owner and not request.user.has_perm('delete_service', obj=service):
return HttpResponse(
loader.render_to_string(
'401.html', context={
Expand Down

0 comments on commit bdf6624

Please sign in to comment.