Skip to content

Commit

Permalink
[Fixes #10251] improve feedback to the user and UI experience of batc…
Browse files Browse the repository at this point in the history
…h 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
  • Loading branch information
mattiagiupponi authored Nov 9, 2022
1 parent 8cff81e commit 314d208
Show file tree
Hide file tree
Showing 6 changed files with 89 additions and 11 deletions.
2 changes: 1 addition & 1 deletion geonode/base/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
})
Expand Down
23 changes: 18 additions & 5 deletions geonode/base/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
32 changes: 31 additions & 1 deletion geonode/base/templates/base/user_and_group_permissions.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,42 @@
{% block body_class %}batch edit{% endblock %}

{% block body %}
<!-- Required to make select2 fields work for autocomplete -->
<link href="{% static "vendor/select2/dist/css/select2.css" %}" type="text/css" media="screen" rel="stylesheet" />
<link href="{% static "autocomplete_light/select2.css" %}" type="text/css" media="screen" rel="stylesheet" />
<script type="text/javascript" src="{% static "admin/js/vendor/jquery/jquery.js" %}"></script>
<script type="text/javascript" src="{% static "autocomplete_light/jquery.init.js" %}"></script>
<script type="text/javascript" src="{% static "vendor/select2/dist/js/select2.full.js" %}"></script>
<script type="text/javascript" src="{% static "vendor/select2/dist/js/i18n/en.js" %}"></script>
<script type="text/javascript" src="{% static "autocomplete_light/autocomplete.init.js" %}"></script>
<script type="text/javascript" src="{% static "autocomplete_light/forward.js" %}"></script>
<script type="text/javascript" src="{% static "autocomplete_light/select2.js" %}"></script>
<script type="text/javascript" src="{% static "autocomplete_light/jquery.post-setup.js" %}"></script>

<script src="{% static "geonode/js/crop_widget/crop_widget_es5.js" %}"></script>
<link rel="stylesheet" href="{% static "geonode/css/crop_widget.css" %}">

<div class="page-header">
<h2 class="page-title">{% trans "Batch Edit" %}</h2>
</div>
<form action="/{{ model|lower }}/dataset/permission/" method="post">
{% csrf_token %}
{{ form|as_bootstrap }}
<div id="layers_multi_select">
<span><label for="{{ form.layers.label }}">{{ form.layers.label }}</label></span>
{{ form.layers }}
</div>
<br>
<div id="perms_multi_select">
<span><label for="{{ form.permission_type.label }}">{{ form.permission_type.label }}</label></span>
{{ form.permission_type }}
</div>
<div id="set_multi_select">
<span><label for="{{ form.mode.label }}">{{ form.mode.label }}</label></span>
{{ form.mode }}
</div>
<div id="id_multi_select">
{{ form.ids }}
</div>
<div>
<input class="btn" type="submit" name="cancel" value="{% trans "Cancel" %}" />
<input class="btn btn-primary" type="submit" value="{% trans "Submit" %}" />
Expand Down
6 changes: 6 additions & 0 deletions geonode/base/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from django.conf.urls import url, include

from .views import (
DatasetsAutocomplete,
resource_clone,
RegionAutocomplete,
ThesaurusAvailable,
Expand Down Expand Up @@ -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<pk>\d+)$',
OwnerRightsRequestView.as_view(),
Expand Down
35 changes: 32 additions & 3 deletions geonode/base/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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(
Expand All @@ -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(
Expand Down Expand Up @@ -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})
Expand Down Expand Up @@ -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):

Expand Down
2 changes: 1 addition & 1 deletion geonode/people/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down

0 comments on commit 314d208

Please sign in to comment.