From 0d2c9af058d09d03857f152d28cd7ab7ac828bd3 Mon Sep 17 00:00:00 2001 From: mattiagiupponi <51856725+mattiagiupponi@users.noreply.github.com> Date: Wed, 9 Nov 2022 14:19:36 +0100 Subject: [PATCH] [Fixes #10251] improve feedback to the user and UI experience of batch permisisons assignment (#10281) * [Fixes #10251] improve feedback to the user and UI experience * [Fixes #10251] improve feedback to the user and UI experience * [Fixes #10251] improve feedback to the user and UI experience --- geonode/base/admin.py | 2 +- geonode/base/forms.py | 23 +++++++++--- .../base/user_and_group_permissions.html | 32 ++++++++++++++++- geonode/base/urls.py | 6 ++++ geonode/base/views.py | 35 +++++++++++++++++-- geonode/people/tests.py | 2 +- 6 files changed, 89 insertions(+), 11 deletions(-) diff --git a/geonode/base/admin.py b/geonode/base/admin.py index 4b68a37512f..7a5fc719869 100755 --- a/geonode/base/admin.py +++ b/geonode/base/admin.py @@ -99,7 +99,7 @@ def set_user_and_group_dataset_permission(modeladmin, request, queryset): } form = UserAndGroupPermissionsForm({ - 'permission_type': 'read', + 'permission_type': 'view', 'mode': 'set', 'ids': ids, }) diff --git a/geonode/base/forms.py b/geonode/base/forms.py index b87c84f9009..a3146b6ecd9 100644 --- a/geonode/base/forms.py +++ b/geonode/base/forms.py @@ -630,21 +630,34 @@ class BatchEditForm(forms.Form): ids = forms.CharField(required=False, widget=forms.HiddenInput()) +def get_user_choices(): + try: + return [(x.pk, x.title) for x in Dataset.objects.all().order_by('id')] + except Exception: + return [] + + class UserAndGroupPermissionsForm(forms.Form): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['layers'].label_from_instance = self.label_from_instance - layers = forms.ModelMultipleChoiceField( - queryset=Dataset.objects.all(), - required=False) + layers = MultipleChoiceField( + choices=get_user_choices(), + widget=autocomplete.Select2Multiple( + url='datasets_autocomplete' + ), + label="Datasets", + required=False, + ) + permission_type = forms.ChoiceField( required=True, widget=forms.RadioSelect, choices=( - ('read', 'Read'), + ('view', 'View'), + ('download', 'Download'), ('edit', 'Edit'), - ('download', 'Download') ), ) mode = forms.ChoiceField( diff --git a/geonode/base/templates/base/user_and_group_permissions.html b/geonode/base/templates/base/user_and_group_permissions.html index 14490cbb8c0..216aaf7d0d3 100644 --- a/geonode/base/templates/base/user_and_group_permissions.html +++ b/geonode/base/templates/base/user_and_group_permissions.html @@ -8,12 +8,42 @@ {% block body_class %}batch edit{% endblock %} {% block body %} + + + + + + + + + + + + + + +
{% csrf_token %} - {{ form|as_bootstrap }} +
+ + {{ form.layers }} +
+
+
+ + {{ form.permission_type }} +
+
+ + {{ form.mode }} +
+
+ {{ form.ids }} +
diff --git a/geonode/base/urls.py b/geonode/base/urls.py index c28e4b43522..8eba1fb652b 100644 --- a/geonode/base/urls.py +++ b/geonode/base/urls.py @@ -19,6 +19,7 @@ from django.conf.urls import url, include from .views import ( + DatasetsAutocomplete, resource_clone, RegionAutocomplete, ThesaurusAvailable, @@ -57,6 +58,11 @@ ThesaurusKeywordLabelAutocomplete.as_view(), name='thesaurus_autocomplete', ), + url( + r'^datasets_autocomplete/$', + DatasetsAutocomplete.as_view(), + name='datasets_autocomplete', + ), url( r'^resource_rights/(?P\d+)$', OwnerRightsRequestView.as_view(), diff --git a/geonode/base/views.py b/geonode/base/views.py index 993281cdf4b..fdc21bb80d2 100644 --- a/geonode/base/views.py +++ b/geonode/base/views.py @@ -30,6 +30,7 @@ from django.views.generic import FormView from django.http import HttpResponseRedirect from django.contrib.auth import get_user_model +from django.contrib import messages from django.utils.translation import ugettext as _ from django.core.exceptions import PermissionDenied from django.contrib.auth.decorators import login_required @@ -95,11 +96,14 @@ def user_and_group_permission(request, model): return HttpResponseRedirect( get_url_for_app_model(model, model_class)) + users_usernames = None + groups_names = None + if request.method == 'POST': form = UserAndGroupPermissionsForm(request.POST) ids = ids.split(",") if form.is_valid(): - resources_names = [layer.title for layer in form.cleaned_data.get('layers')] + resources_names = form.cleaned_data.get('layers') users_usernames = [user.username for user in model_class.objects.filter( id__in=ids)] if model == 'profile' else None groups_names = [group_profile.group.name for group_profile in model_class.objects.filter( @@ -123,11 +127,22 @@ def user_and_group_permission(request, model): set_permissions.apply_async( ([permissions_names], resources_names, users_usernames, groups_names, delete_flag)) + messages.add_message( + request, + messages.INFO, + f'The asyncronous permissions {form.cleaned_data.get("mode")} request for {", ".join(users_usernames or groups_names)} has been sent' + ) + else: + messages.add_message( + request, + messages.ERROR, + f'Some error has occured {form.errors}' + ) return HttpResponseRedirect( get_url_for_app_model(model, model_class)) form = UserAndGroupPermissionsForm({ - 'permission_type': 'read', + 'permission_type': 'view', 'mode': 'set', }) return render( @@ -232,7 +247,7 @@ def __init__(self, *args, **kwargs): raise AttributeError("SimpleSelect2View missing required 'filter_arg' argument") def get_queryset(self): - qs = super(views.BaseQuerySetView, self).get_queryset() + qs = super(views.BaseQuerySetView, self).get_queryset().order_by('pk') if self.q: qs = qs.filter(**{self.filter_arg: self.q}) @@ -300,6 +315,20 @@ def get_results(self, context): ] +class DatasetsAutocomplete(SimpleSelect2View): + model = Dataset + filter_arg = 'title__icontains' + + def get_results(self, context): + return [ + { + 'id': self.get_result_value(result), + 'text': self.get_result_label(result.title), + 'selected_text': self.get_selected_result_label(result.title), + } for result in context['object_list'] + ] + + class ThesaurusAvailable(autocomplete.Select2QuerySetView): def get_queryset(self): diff --git a/geonode/people/tests.py b/geonode/people/tests.py index 8f96b70d4cf..4abc3b9f15c 100644 --- a/geonode/people/tests.py +++ b/geonode/people/tests.py @@ -54,7 +54,7 @@ def setUp(self): self.layers = Dataset.objects.all()[:3] self.dataset_ids = [layer.pk for layer in self.layers] self.user_ids = ",".join(str(element.pk) for element in get_user_model().objects.all()[:3]) - self.permission_type = ("read", "download", "edit") + self.permission_type = ("view", "download", "edit") self.groups = Group.objects.all()[:3] self.group_ids = ",".join(str(element.pk) for element in self.groups)