diff --git a/discuss_data/dddatasets/migrations/0015_datasetaccessrequest.py b/discuss_data/dddatasets/migrations/0015_datasetaccessrequest.py new file mode 100644 index 0000000000000000000000000000000000000000..519500f82885ccc821851f77fa6a799c529aaa72 --- /dev/null +++ b/discuss_data/dddatasets/migrations/0015_datasetaccessrequest.py @@ -0,0 +1,27 @@ +# Generated by Django 2.2.12 on 2020-06-01 11:42 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('dddatasets', '0014_auto_20200520_1457'), + ] + + operations = [ + migrations.CreateModel( + name='DataSetAccessRequest', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('dataset', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dddatasets.DataSet')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/discuss_data/dddatasets/models.py b/discuss_data/dddatasets/models.py index d0b033b79f12bf891f51583771f856f814404274..c77e6a565ec46abe2ebd9e944e48be71019929c1 100644 --- a/discuss_data/dddatasets/models.py +++ b/discuss_data/dddatasets/models.py @@ -330,6 +330,19 @@ class DataSetExternalLink(models.Model): return self.site_title +class DataSetAccessRequest(models.Model): + uuid = models.UUIDField(default=uuid.uuid4, editable=False) + dataset = models.ForeignKey("DataSet", on_delete=models.CASCADE) + user = models.ForeignKey(User, on_delete=models.CASCADE) + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + ar_string = "Access request to {} for {} pending since {}".format( + self.dataset, self.user, self.created_at.strftime("%d.%m.%Y, %H:%M:%S") + ) + return _(ar_string) + + class DataSet(models.Model): OPEN_ACCESS = "OA" METADATA_ONLY = "MO" @@ -475,6 +488,12 @@ class DataSet(models.Model): class Meta: permissions = (("ra_view_dataset", "View data set in restricted access mode"),) + def get_all_access_requests(self): + return DataSetAccessRequest.objects.filter(dataset=self) + + def get_access_request(self, user): + return DataSetAccessRequest.objects.filter(dataset=self, user=user).first() + def clear_user_permissions(self, user): for perm in get_perms(user, self): remove_perm(perm, user, self) diff --git a/discuss_data/dddatasets/views.py b/discuss_data/dddatasets/views.py index b95f7c0afb8acbfa9d00fbe78e65ca7163b267ce..ccffa97f7539c2633a9e52332537aebb6d2e8ecf 100644 --- a/discuss_data/dddatasets/views.py +++ b/discuss_data/dddatasets/views.py @@ -31,6 +31,7 @@ from discuss_data.dddatasets.models import ( DataSet, DataSetManagementObject, DataFile, + DataSetAccessRequest, ) from discuss_data.dddatasets.utils import check_published, create_pdf @@ -179,17 +180,27 @@ def dataset_access_request(request, uuid): comment.content_type = ContentType.objects.get_for_model(ds) comment.object_id = ds.id comment.save() + access_request = DataSetAccessRequest(dataset=ds, user=request.user) + access_request.save() return HttpResponse( ''.format( - _("Access request sent to the Datasets administrators") + access_request ) ) else: messages.warning(request, form.errors) else: - initial = {"text": "Please grant me access to this Dataset"} - form = AccessRequestForm(initial=initial) + access_request = ds.get_access_request(request.user) + if access_request: + return HttpResponse( + ''.format( + access_request + ) + ) + else: + initial = {"text": "Please grant me access to this Dataset"} + form = AccessRequestForm(initial=initial) return render( request, "ddcomments/_notification_add.html", diff --git a/discuss_data/dddatasets/views_prep.py b/discuss_data/dddatasets/views_prep.py index 319d57dabf2fa26d54652b3383bf5046a090b660..d5dbd0da8d6fce5eb1932c52d1c53f417148e9d2 100644 --- a/discuss_data/dddatasets/views_prep.py +++ b/discuss_data/dddatasets/views_prep.py @@ -536,8 +536,10 @@ def prep_dataset_edit_access_user(request, ds_uuid): public=False, ) elif perm_code == "acc": + access_request = ds.get_access_request(user) logger.debug("assigning perms for", user) ds.assign_user_permissions(user, "ra_view_dataset") + ds.save() action.send( request.user, verb="granted access", @@ -545,7 +547,9 @@ def prep_dataset_edit_access_user(request, ds_uuid): target=user, public=False, ) - ds.save() + if access_request: + access_request.delete() + else: logger.error("requested non existing perm_code", perm_code, exc_info=1) if feed: diff --git a/discuss_data/templates/ddcomments/_notification_card.html b/discuss_data/templates/ddcomments/_notification_card.html index cc022aebe76a128ea1962a404004d14d6827d7be..f257f81cb48b3aae7f7595d89118a0a38ec2bc8e 100644 --- a/discuss_data/templates/ddcomments/_notification_card.html +++ b/discuss_data/templates/ddcomments/_notification_card.html @@ -7,15 +7,21 @@ {% include 'ddusers/_user-image.html' with user_uuid=comment.owner.uuid user_photo=comment.owner.photo %}
{{ comment.get_notification_type_display }} {{ comment.owner.get_academic_name }} {% if comment.recipient %}{% trans 'to' %} {{ comment.recipient.get_academic_name }} {% endif %} {{ comment.date_added | naturaltime }}
-
{% trans "Grant users access to the published dataset" %}
+ +{% trans 'Access requests' %}
+ {% if ds.get_all_access_requests %} ++ {% for access_request in ds.get_all_access_requests %} +-
+ {{ access_request.user }} {% trans 'requested access to this dataset' %} {{ access_request.created_at | naturaltime }}
+ {% if ds|user_has_restricted_access:access_request.user %}
+
+ {% elif ds|user_has_admin_right:request.user %}
+
+ {% endif %}
+
+ {% endfor %}
+
+ {% else %} +{% trans 'No access requests pending at this time' %} + {% endif %} + +
{% trans 'Search for users' %}