Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1import logging
2import os
3import uuid as uuidlib
4from datetime import date
6from actstream import action
7from django.conf import settings
8from django.contrib import messages
9from django.contrib.auth.decorators import login_required
10from django.contrib.contenttypes.models import ContentType
11from django.core.exceptions import (
12 ImproperlyConfigured,
13 PermissionDenied,
14 ValidationError,
15)
16from django.forms.models import inlineformset_factory
17from django.http import FileResponse, Http404, HttpResponse
18from django.shortcuts import get_object_or_404, redirect, render
19from django.utils.translation import gettext as _
20from django_q.tasks import fetch
21from django.utils.safestring import mark_safe
22from guardian.shortcuts import get_objects_for_user, get_users_with_perms
24from discuss_data.core.decorators import dd_tou_accepted
25from discuss_data.core.errors import MetaDataError
26from discuss_data.core.helpers import check_perms, check_perms_403
27from discuss_data.core.models import KeywordTagged, LanguageTagged
28from discuss_data.core.views import (
29 handler403,
30 response403,
31)
32from discuss_data.core.helpers import get_help_texts
33from discuss_data.ddcomments.models import Notification
34from discuss_data.dddatasets.forms import (
35 DataFileUploadForm,
36 DataSetCopyrightForm,
37 DataSetPrivacyRightsForm,
38 DataSetCreatorFormSetHelper,
39 DataSetEditForm,
40 DataSetForm,
41 DataSetImageForm,
42 DataSetIndividualLicenseForm,
43 DataSetPublicationForm,
44 DataSetPublishAccept,
45 DataSubmissionAgreementAcceptForm,
46 DataSubmissionAgreementForm,
47)
48from discuss_data.dddatasets.models import (
49 AnalysisMethodsTagged,
50 Category,
51 CollectionMethodsTagged,
52 DataFile,
53 DataSet,
54 DataSetCreator,
55 DataSetManagementObject,
56 DataSetPublication,
57 DataSubmissionAgreement,
58 DisciplinesTagged,
59 License,
60)
61from discuss_data.dddatasets.utils import (
62 dataset_comments,
63 dataset_edit_comment,
64 get_dataset_fields_from_form,
65 get_man_page,
66)
67from discuss_data.ddpublications.forms import PublicationForm
68from discuss_data.ddpublications.models import Publication
69from discuss_data.ddusers.forms import DariahTermsOfUse
70from discuss_data.ddusers.models import Country, User
71from discuss_data.ddusers.views import user_notifications, user_search
72from discuss_data.dhrep.publisher import Publisher, PublisherError
73from discuss_data.dhrep.token import TokenHelper
74from discuss_data.pages.models import LicensePage
76logger = logging.getLogger(__name__)
79""" prep views
80 TODO: split up further
81"""
84@login_required
85@dd_tou_accepted
86def listing(request):
87 context = dict()
88 user = request.user
89 context["user"] = user
90 dsmo_admin = set(
91 get_objects_for_user(user, "admin_dsmo", DataSetManagementObject).exclude(
92 owner=user
93 )
94 )
95 dsmo_edit = set(
96 get_objects_for_user(user, "edit_dsmo", DataSetManagementObject).exclude(
97 owner=user
98 )
99 )
100 dsmo_view = set(
101 get_objects_for_user(user, "view_dsmo", DataSetManagementObject).exclude(
102 owner=user
103 )
104 )
106 context["dsmo_own"] = DataSetManagementObject.objects.filter(owner=user)
107 context["dsmo_admin"] = dsmo_admin
108 context["dsmo_edit"] = dsmo_edit.difference(dsmo_admin)
109 context["dsmo_view"] = dsmo_view.difference(dsmo_edit)
111 # logger.debug(objects_own)
112 # logger.debug(objects_view)
113 context["manpage"] = get_man_page("dataset-list") # ddataset-edit-description")
114 context["object_type"] = "dataset management object"
115 context["edit_url"] = "dataset_edit"
116 context["add_url"] = "dataset_add"
117 context["delete_url"] = "ic_ds_remove"
119 return render(request, "dddatasets/prep/listing.html", context)
122@login_required
123@dd_tou_accepted
124def add(request):
125 if request.method == "POST":
126 ds = DataSet()
127 form = DataSetEditForm(request.POST, request.FILES, instance=ds)
128 if form.is_valid():
129 ds = form.save(commit=False)
130 ds.owner = request.user
131 try:
132 ds.save()
133 except LicensePage.DoesNotExist as e:
134 messages.error(request, e)
135 logger.error(e)
136 raise Http404(e) from e
137 form.save_m2m()
138 main_category_slug = form.cleaned_data.get("main_category")
139 main_category = Category.objects.get(slug=main_category_slug)
140 ds.dataset_management_object.main_category = main_category
141 ds.dataset_management_object.save()
142 return redirect("dddatasets:prep_edit", ds_uuid=ds.uuid)
143 else:
144 messages.warning(request, form.errors.as_data())
145 else:
146 form = DataSetEditForm()
148 return render(
149 request,
150 "dddatasets/prep/dataset_add.html",
151 {
152 "manpage": get_man_page("data-upload"),
153 "user": request.user,
154 "form": form,
155 "categories_all": Category.objects.all().order_by("name"),
156 "btn_text": _("Add Dataset"),
157 },
158 )
161@login_required
162@dd_tou_accepted
163def remove(request):
164 """
165 Function to delete a dataset which uses ic-delete-from and
166 the DELETE http-method (POST, but translated by django-intercooler-helpers)
167 and form data to send the uuid
168 """
169 # redirect if no intercooler request
170 if not request.is_intercooler():
171 return redirect("dddatasets:prep_listing")
172 if request.method == "DELETE":
173 ds_uuid = request.DELETE["objectid"]
174 ds = get_object_or_404(DataSet, uuid=ds_uuid)
175 if ds.owner != request.user:
176 raise PermissionDenied()
178 if ds.is_frozen():
179 messages.error(
180 request,
181 _(
182 "Deletion of published datasets or currently reviewed datasets is not possible"
183 ),
184 )
185 return edit_versions(request, ds.uuid)
187 dsmo = ds.dataset_management_object
188 ds.delete()
190 topversion = dsmo.get_top_version_dataset()
191 return redirect("dddatasets:prep_edit_versions", ds_uuid=topversion.uuid)
192 else:
193 # redirect Requests other than DELETE
194 return redirect("dddatasets:prep_listing")
197@login_required
198@dd_tou_accepted
199def refresh_header(request, ds_uuid):
200 ds = get_object_or_404(DataSet, uuid=ds_uuid)
201 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
202 return response403("Access denied")
203 return render(request, "dddatasets/prep/_dataset_refresh_header.html", {"ds": ds},)
206@login_required
207@dd_tou_accepted
208def edit(request, ds_uuid):
209 """
210 Prep area tab to edit dataset description
211 TODO: can probably be merged with edit_detail
212 """
213 ds = get_object_or_404(DataSet, uuid=ds_uuid)
215 if ds.is_frozen():
216 if ds.pub_request_pending() and request.user in ds.get_curators():
217 pass
218 else:
219 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
220 else:
221 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
222 return response403("Access denied")
224 context = dict()
225 context["help_texts"] = get_help_texts("edit-dataset-description-add-tags")
226 context["ds"] = ds
228 return render(request, "dddatasets/prep/edit.html", context)
231@login_required
232@dd_tou_accepted
233def edit_image(request, ds_uuid):
234 ds = get_object_or_404(DataSet, uuid=ds_uuid)
235 if ds.is_frozen():
236 if ds.pub_request_pending() and request.user in ds.get_curators():
237 pass
238 else:
239 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
240 else:
241 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
242 return response403("Access denied")
243 err = None
245 if request.method == "POST":
246 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
247 return response403("Access denied")
248 form = DataSetImageForm(request.POST, request.FILES)
249 if form.is_valid():
250 if form.cleaned_data["image"]:
251 ds.image = form.cleaned_data["image"]
252 ds.save()
253 action.send(request.user, verb="edited image of", target=ds, public=False)
254 return HttpResponse("upload successful")
255 else:
256 err = form.errors.as_data()
258 response = render(
259 request, "dddatasets/prep/_dataset_image.html", {"ds": ds, "err": err},
260 )
261 return response
264@login_required
265@dd_tou_accepted
266def edit_detail(request, ds_uuid):
267 """
268 Prep area tab to edit dataset description
269 """
270 updated = False
271 target = "Dataset description"
272 ds = get_object_or_404(DataSet, uuid=ds_uuid)
274 ds_uuid = ds.uuid
275 categories_all = Category.objects.all().order_by("name")
277 if ds.is_frozen():
278 if ds.pub_request_pending() and request.user in ds.get_curators():
279 pass
280 else:
281 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
282 else:
283 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
284 return response403("Access denied")
286 if request.method == "POST":
287 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
288 return response403("Access denied")
290 form = DataSetEditForm(request.POST, request.FILES, instance=ds)
291 if form.is_valid():
292 ds = form.save(commit=False)
293 ds.uuid = ds_uuid
294 ds.save()
295 form.save_m2m()
296 main_category_slug = form.cleaned_data.get("main_category")
297 categories = form.cleaned_data.get("categories")
298 main_category = Category.objects.get(slug=main_category_slug)
299 ds.dataset_management_object.main_category = main_category
300 ds.dataset_management_object.categories.set(categories)
301 ds.dataset_management_object.save()
302 ds.save()
304 err = None
305 updated = True
306 # send an action
307 action.send(
308 request.user, verb="edited description of", target=ds, public=False
309 )
310 else:
311 err = form.errors.as_data()
313 else:
314 # user = request.user
315 err = None
316 form = DataSetEditForm(instance=ds)
318 return render(
319 request,
320 "core/_edit_form.html",
321 {
322 "ds": ds,
323 "form": form,
324 "user": request.user,
325 "updated": updated,
326 "err": err,
327 "target": target,
328 "categories_all": categories_all,
329 "btn_text": _("Save Description"),
330 },
331 )
334@login_required
335@dd_tou_accepted
336def country_tags_list(request, ds_uuid):
337 ds = get_object_or_404(DataSet, uuid=ds_uuid)
338 if ds.is_frozen():
339 if ds.pub_request_pending() and request.user in ds.get_curators():
340 pass
341 else:
342 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
343 else:
344 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
345 return response403("Access denied")
347 all_countries = Country.objects.filter(public=True)
348 countries = list()
349 for ac in all_countries:
350 if ac in ds.get_countries():
351 countries.append((ac, True))
352 else:
353 countries.append((ac, False))
355 return render(
356 request,
357 "dddatasets/prep/_dataset_country_tags_list.html",
358 {"ds": ds, "countries": countries},
359 )
362@login_required
363@dd_tou_accepted
364def object_tags_list(request, object_type):
365 if object_type == "language":
366 qs = LanguageTagged.objects.all()
367 if object_type == "keyword":
368 qs = KeywordTagged.objects.all()
369 if object_type == "disciplines":
370 qs = DisciplinesTagged.objects.all()
371 if object_type == "methods_of_data_collection":
372 qs = CollectionMethodsTagged.objects.all()
373 if object_type == "methods_of_data_analysis":
374 qs = AnalysisMethodsTagged.objects.all()
375 query = None
377 if query:
378 return qs.filter(name__istartswith=query)
379 else:
380 return render(request, "dddatasets/prep/_object_tags_list.html", {"qs": qs})
383@login_required
384@dd_tou_accepted
385def country_tags_edit(request, ds_uuid):
386 # redirect if no intercooler request
387 if not request.is_intercooler():
388 return redirect("dddatasets:prep_edit", ds_uuid)
389 ds = get_object_or_404(DataSet, uuid=ds_uuid)
390 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
391 return response403("Access denied")
393 if request.method == "POST":
394 slug = request.POST.get("country")
395 country = Country.objects.get(slug=slug)
396 if country in ds.get_countries():
397 ds.countries.remove(country)
398 else:
399 ds.countries.add(country)
400 ds.save()
402 return country_tags_list(request, ds_uuid)
405@login_required
406@dd_tou_accepted
407def tag_add(request, ds_uuid, object_type):
408 # redirect if no intercooler request
409 if not request.is_intercooler():
410 return redirect("dddatasets:prep_edit", ds_uuid)
411 ds = get_object_or_404(DataSet, uuid=ds_uuid)
413 if ds.is_frozen():
414 if ds.pub_request_pending() and request.user in ds.get_curators():
415 pass
416 else:
417 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
418 else:
419 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
420 return response403("Access denied")
422 if request.method == "POST":
423 if check_perms("edit_dsmo", request.user, ds.dataset_management_object):
424 tag = request.POST.get("%s-tag" % (object_type,), "").title()
425 if len(tag) > 0:
426 if object_type == "language":
427 ds.languages_of_data.add(tag)
428 elif object_type == "keyword":
429 ds.keywords.add(tag)
430 elif object_type == "disciplines":
431 ds.disciplines.add(tag)
432 elif object_type == "methods_of_data_collection":
433 ds.methods_of_data_collection.add(tag)
434 elif object_type == "methods_of_data_analysis":
435 ds.methods_of_data_analysis.add(tag)
437 if object_type == "language":
438 tags = ds.get_language_tags()
439 elif object_type == "keyword":
440 tags = ds.get_keyword_tags()
441 elif object_type == "disciplines":
442 tags = ds.get_disciplines_tags()
443 elif object_type == "methods_of_data_collection":
444 tags = ds.get_methods_of_data_collection_tags()
445 elif object_type == "methods_of_data_analysis":
446 tags = ds.get_methods_of_data_analysis_tags()
447 else:
448 tags = None
450 return render(
451 request,
452 "dddatasets/prep/_tag_add_control.html",
453 {"user": request.user, "ds": ds, "tags": tags, "object": object_type},
454 )
457@login_required
458@dd_tou_accepted
459def tag_remove(request, ds_uuid, object_type):
460 # redirect if no intercooler request
461 if not request.is_intercooler():
462 return redirect("dddatasets:prep_edit", ds_uuid)
463 ds = get_object_or_404(DataSet, uuid=ds_uuid)
465 if request.method == "POST":
466 tag_pk = request.POST.get("%s-tag-remove" % (object_type,), "")
467 if len(tag_pk) > 0:
468 if object_type == "language":
469 tag = LanguageTagged.objects.get(id=tag_pk)
470 if check_perms("edit_dsmo", request.user, ds.dataset_management_object):
471 ds.languages_of_data.remove(tag)
472 tags = ds.get_language_tags()
473 if object_type == "keyword":
474 tag = KeywordTagged.objects.get(id=tag_pk)
475 if check_perms("edit_dsmo", request.user, ds.dataset_management_object):
476 ds.keywords.remove(tag)
477 tags = ds.get_keyword_tags()
478 if object_type == "disciplines":
479 tag = DisciplinesTagged.objects.get(id=tag_pk)
480 if check_perms("edit_dsmo", request.user, ds.dataset_management_object):
481 ds.disciplines.remove(tag)
482 tags = ds.get_disciplines_tags()
483 if object_type == "methods_of_data_collection":
484 tag = CollectionMethodsTagged.objects.get(id=tag_pk)
485 if check_perms("edit_dsmo", request.user, ds.dataset_management_object):
486 ds.methods_of_data_collection.remove(tag)
487 tags = ds.get_methods_of_data_collection_tags()
488 if object_type == "methods_of_data_analysis":
489 tag = AnalysisMethodsTagged.objects.get(id=tag_pk)
490 if check_perms("edit_dsmo", request.user, ds.dataset_management_object):
491 ds.methods_of_data_analysis.remove(tag)
492 tags = ds.get_methods_of_data_analysis_tags()
494 return render(
495 request,
496 "dddatasets/prep/_tag_add_control.html",
497 {"user": request.user, "ds": ds, "tags": tags, "object": object_type},
498 )
501@login_required
502@dd_tou_accepted
503def edit_metadata(request, ds_uuid):
504 """
505 Prep area tab to edit metadata
506 """
507 updated = False
508 target = "Dataset Metadata"
509 manpage = get_man_page("edit-dataset-metadata")
510 ds = get_object_or_404(DataSet, uuid=ds_uuid)
512 if ds.is_frozen():
513 if ds.pub_request_pending() and request.user in ds.get_curators():
514 pass
515 else:
516 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
517 else:
518 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
519 return handler403(request)
521 ds_creators = DataSetCreator.objects.filter(dataset=ds)
522 next_url = request.session.get(str(ds_uuid) + "wp")
524 if ds_creators.count() == 0:
525 extra = 1
526 else:
527 extra = 0
529 DataSetCreatorFormSet = inlineformset_factory(
530 DataSet,
531 DataSetCreator,
532 fields=["name", "creator_type", "url", "first_name"],
533 extra=extra,
534 can_delete=True,
535 )
537 if request.method == "POST":
538 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
539 return HttpResponse(_("Access denied"))
541 formset = DataSetCreatorFormSet(request.POST, queryset=ds_creators, instance=ds)
542 helper = DataSetCreatorFormSetHelper()
543 form = DataSetForm(request.POST, instance=ds)
544 dsmo = ds.dataset_management_object
545 version = ds.version
546 if form.is_valid():
547 ds = form.save(commit=False)
548 ds.dataset_management_object = dsmo
549 ds.version = version
550 ds.save()
551 form.save_m2m()
552 err = None
553 updated = True
555 if formset.is_valid():
556 formset.save()
557 else:
558 err = formset.errors
559 action.send(
560 request.user, verb="edited metadata of", target=ds, public=False
561 )
562 if next_url:
563 return redirect(next_url)
565 else:
566 err = form.errors.as_data()
568 else:
569 err = None
570 formset = DataSetCreatorFormSet(queryset=ds_creators, instance=ds)
571 helper = DataSetCreatorFormSetHelper()
572 form = DataSetForm(instance=ds)
574 help_texts = get_help_texts(
575 "edit-metadata"
576 ) # needed to populate creators help in form
578 return render(
579 request,
580 "dddatasets/prep/dataset_edit_metadata.html",
581 {
582 "ds": ds,
583 "formset": formset,
584 "helper": helper,
585 "form": form,
586 "user": request.user,
587 "updated": updated,
588 "err": err,
589 "target": target,
590 "manpage": manpage,
591 "help_texts": help_texts,
592 "next_url": next_url,
593 },
594 )
597@login_required
598@dd_tou_accepted
599def edit_collaboration(request, ds_uuid):
600 """
601 Prep area tab to edit collaborators
602 """
603 ds = get_object_or_404(DataSet, uuid=ds_uuid)
604 dsmo = ds.dataset_management_object
605 manpage = get_man_page("edit-collaboration")
607 # check_perms_403('admin_dataset', request.user, dsmo)
608 if check_perms("admin_dsmo", request.user, dsmo):
609 logger.debug("users with perms: %s", get_users_with_perms(dsmo))
610 access = True
611 else:
612 access = False
614 if ds.is_frozen() and request.user not in ds.get_curators():
615 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
617 user_perms = dsmo.get_dsmo_users_with_perms()
619 control_args = {
620 "user_all": dsmo.get_dsmo_users(),
621 "user_admin": user_perms["admin"],
622 "user_edit": user_perms["edit"],
623 "user_view": user_perms["view"],
624 "groups": dsmo.groups.all(),
625 "div_id": "dataset-users",
626 "input_id": "dataset-user",
627 "url_object_search": "ddusers:user_search",
628 "text": "Dataset Users",
629 }
631 return render(
632 request,
633 "dddatasets/prep/dataset_edit_collaboration.html",
634 {"ds": ds, "manpage": manpage, "control_args": control_args, "access": access},
635 )
638@login_required
639@dd_tou_accepted
640def edit_access_user_search(request, ds_uuid):
641 # redirect if no intercooler request
642 if not request.is_intercooler():
643 return redirect("dddatasets:prep_edit_publish_access", ds_uuid)
644 ds = get_object_or_404(DataSet, uuid=ds_uuid)
645 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
646 return HttpResponse(_("Access denied"))
648 term = request.GET.get("q")
649 qs = user_search(term)
651 search_type = "pubaccess_search"
653 return render(
654 request,
655 "ddusers/_search_results.html",
656 {"object_list": qs, "ds": ds, "search_type": search_type},
657 )
660@login_required
661@dd_tou_accepted
662def edit_access_user(request, ds_uuid):
663 ds = get_object_or_404(DataSet, uuid=ds_uuid)
664 if not check_perms("admin_dsmo", request.user, ds.dataset_management_object):
665 return HttpResponse(_("Access denied"))
666 # check_perms_403("admin_dataset", request.user, dsmo)
668 if request.method == "POST":
669 userid = request.POST["userid"]
670 user = User.objects.get(uuid=userid)
671 perm_code = request.POST["perm"]
672 feed = request.POST.get("requestsrc")
674 if perm_code == "clr":
675 logger.debug("clearing perms for %s", user)
676 ds.clear_user_permissions(user)
677 ds.save()
679 action.send(
680 request.user,
681 verb="revoked access",
682 action_object=ds,
683 target=user,
684 public=False,
685 )
687 notification = Notification()
688 notification.text = "access revoked"
689 notification.owner = request.user
690 notification.recipient = user
691 notification.notification_type = Notification.ACCESS_REQUEST
692 notification.content_type = ContentType.objects.get_for_model(ds)
693 notification.object_id = ds.id
694 notification.save()
696 elif perm_code == "acc":
697 access_request = ds.get_access_request(user)
698 logger.debug("assigning perms for %s", user)
699 ds.assign_user_permissions(user, "ra_view_dataset")
700 ds.save()
701 action.send(
702 request.user,
703 verb="granted access",
704 action_object=ds,
705 target=user,
706 public=False,
707 )
709 notification = Notification()
710 notification.text = "access granted"
711 notification.owner = request.user
712 notification.recipient = user
713 notification.notification_type = Notification.ACCESS_REQUEST
714 notification.content_type = ContentType.objects.get_for_model(ds)
715 notification.object_id = ds.id
716 if access_request:
717 notification.parent = access_request.notification
718 notification.save()
720 if access_request:
721 access_request.delete()
723 else:
724 logger.error("requested non existing perm_code: %s", perm_code)
725 if feed:
726 return user_notifications(request)
727 else:
728 return edit_publish_access(request, ds_uuid)
731@login_required
732@dd_tou_accepted
733def edit_collaboration_user_search(request, ds_uuid):
734 ds = get_object_or_404(DataSet, uuid=ds_uuid)
735 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
736 return HttpResponse(_("Access denied"))
738 term = request.GET.get("q")
739 qs = user_search(term)
740 search_type = "collaboration_search"
742 return render(
743 request,
744 "ddusers/_search_results.html",
745 {"object_list": qs, "ds": ds, "search_type": search_type},
746 )
749@login_required
750@dd_tou_accepted
751def edit_collaboration_user(request, ds_uuid):
752 ds = get_object_or_404(DataSet, uuid=ds_uuid)
753 dsmo = ds.dataset_management_object
754 if not check_perms("admin_dsmo", request.user, ds.dataset_management_object):
755 return HttpResponse(_("Access denied"))
756 # check_perms_403("admin_dataset", request.user, dsmo)
758 if request.method == "POST":
759 userid = request.POST["userid"]
760 user = User.objects.get(uuid=userid)
761 perm_code = request.POST["perm"]
763 if perm_code == "clr":
764 dsmo.clear_user_permissions(user)
765 elif perm_code == "v":
766 dsmo.assign_user_permissions(user, "view")
767 elif perm_code == "e":
768 dsmo.assign_user_permissions(user, "edit")
769 elif perm_code == "a":
770 dsmo.assign_user_permissions(user, "admin")
771 else:
772 logger.error("requested non existing perm_code: %s", perm_code)
774 return edit_collaboration(request, ds_uuid)
777@login_required
778@dd_tou_accepted
779def comments(request, ds_uuid):
780 """
781 calls dataset_comments for "prep" comments
782 """
783 response = dataset_comments(request, ds_uuid, "prep")
784 return response
787@login_required
788@dd_tou_accepted
789def edit_comment(request, ds_uuid, co_uuid=None):
790 """
791 calls dataset_edit_comment for a "prep" comment
792 """
793 response = dataset_edit_comment(request, ds_uuid, "prep", co_uuid)
794 return response
797@login_required
798@dd_tou_accepted
799def edit_comment_reply(request, ds_uuid, co_uuid):
800 """
801 calls dataset_edit_comment_reply for a "prep" comment
802 """
803 response = dataset_edit_comment(request, ds_uuid, "prep", co_uuid, reply=True)
804 return response
807@login_required
808@dd_tou_accepted
809def edit_datafiles(request, ds_uuid):
810 """
811 List datafiles
812 """
813 ds = get_object_or_404(DataSet, uuid=ds_uuid)
814 if ds.is_frozen():
815 if ds.pub_request_pending() and request.user in ds.get_curators():
816 pass
817 else:
818 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
819 else:
820 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
821 return handler403(request)
822 manpage = get_man_page("manage-datafiles")
824 next_url = request.session.get(str(ds_uuid) + "wp")
826 return render(
827 request,
828 "dddatasets/prep/dataset_edit_datafiles.html",
829 {"ds": ds, "manpage": manpage, "next_url": next_url},
830 )
833def handle_uploaded_file(file_obj, df_uuid):
834 # construct filePath using DATA_ROOT setting and datasets prefix
835 filePath = settings.DATA_ROOT + os.sep + "datasets" + os.sep + str(df_uuid)
836 with open(filePath, "ab") as destination:
837 for chunk in file_obj.chunks():
838 destination.write(chunk)
839 return filePath
842@login_required
843@dd_tou_accepted
844def edit_datafile(request, ds_uuid, df_uuid=None):
845 """
846 Add, edit, remove datafiles
847 """
848 ds = get_object_or_404(DataSet, uuid=ds_uuid)
850 if ds.is_frozen():
851 if ds.pub_request_pending() and request.user in ds.get_curators():
852 pass
853 else:
854 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
855 else:
856 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
857 return handler403(request)
859 next_url = request.session.get(str(ds_uuid) + "wp")
861 # DELETE
862 if request.method == "DELETE":
863 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
864 return HttpResponse(_("Access denied"))
866 df_uuid = request.DELETE["objectid"]
867 datafile = DataFile.objects.get(uuid=df_uuid)
868 datafile.delete()
869 # TODO: needs a full http get to close the modal
870 return redirect("dddatasets:prep_edit_datafiles", ds_uuid=ds.uuid)
872 if request.method == "POST":
873 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
874 return HttpResponse(_("Access denied"))
876 if df_uuid:
877 # Edit
878 try:
879 datafile = DataFile.objects.get(uuid=df_uuid, dataset=ds)
880 except DataFile.DoesNotExist:
881 datafile = DataFile(uuid=df_uuid, dataset=ds)
883 form = DataFileUploadForm(request.POST, request.FILES, instance=datafile)
884 if form.is_valid():
885 if request.FILES:
886 orig_name = datafile.file.name
887 filePath = handle_uploaded_file(datafile.file, df_uuid)
888 datafile.file = filePath
889 datafile.name = orig_name
891 datafile.data_file_type = form.cleaned_data["data_file_type"]
892 datafile.save()
893 form_err = None
894 updated = True
895 else:
896 updated = False
897 return HttpResponse(form.errors.as_text(), status=500,)
898 else:
899 # POST should always have an df_uuid
900 return edit_datafiles(request, ds_uuid)
901 else:
902 # Get
903 if df_uuid:
904 # Edit
905 datafile = DataFile.objects.get(uuid=df_uuid, dataset=ds)
906 form = DataFileUploadForm(instance=datafile)
907 else:
908 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
909 return HttpResponse(_("Access denied"))
910 # generate datafile uuid to add to form
911 df_uuid = uuidlib.uuid4()
912 form = DataFileUploadForm()
913 updated = False
914 form_err = None
915 return render(
916 request,
917 "dddatasets/prep/_dataset_edit_datafile.html",
918 {
919 "target": "datafile",
920 "ictarget": "ds-content",
921 "form": form,
922 "user": request.user,
923 "form_err": form_err,
924 "updated": updated,
925 "ds_uuid": ds_uuid,
926 "df_uuid": df_uuid,
927 "next_url": next_url,
928 },
929 )
932@login_required
933@dd_tou_accepted
934def edit_publication(request, ds_uuid, ds_pub_uuid=None):
935 """
936 Add, edit, remove publications
937 """
938 ds = get_object_or_404(DataSet, uuid=ds_uuid)
939 check_perms_403("edit_dsmo", request.user, ds.dataset_management_object)
940 # DELETE, remove DatasetPublication object, not Publication
941 if request.method == "DELETE":
942 ds_pub_uuid = request.DELETE["objectid"]
943 ds_pub = DataSetPublication.objects.get(uuid=ds_pub_uuid)
944 ds_pub.delete()
945 return redirect("dddatasets:prep_edit_publications", ds_uuid=ds.uuid)
947 if ds_pub_uuid:
948 ds_pub = DataSetPublication.objects.get(uuid=ds_pub_uuid)
949 publication = ds_pub.publication
950 else:
951 ds_pub = DataSetPublication()
952 publication = Publication()
953 ds_pub.dataset = ds
955 if request.method == "POST":
956 if ds_pub_uuid:
957 # Edit
958 form = PublicationForm(
959 request.POST, instance=publication, prefix="publication"
960 )
961 sub_form = DataSetPublicationForm(
962 request.POST, instance=ds_pub, prefix="ds_pub"
963 )
964 if form.is_valid() and sub_form.is_valid():
965 publication = form.save()
966 ds_pub = sub_form.save()
967 return edit_publications(request, ds_uuid)
968 else:
969 # Add
970 form = PublicationForm(
971 request.POST, instance=publication, prefix="publication"
972 )
973 sub_form = DataSetPublicationForm(
974 request.POST, instance=ds_pub, prefix="ds_pub"
975 )
976 if form.is_valid() and sub_form.is_valid():
977 ds_pub = sub_form.save(commit=False)
978 publication = form.save()
979 ds_pub.publication = publication
980 ds_pub.save()
981 updated = True
982 form_err = None
983 return edit_publications(request, ds_uuid)
984 else:
985 updated = False
986 form_err = form.errors.as_data()
987 else:
988 # Get
989 if ds_pub_uuid:
990 # Edit
991 form = PublicationForm(instance=publication, prefix="publication")
992 sub_form = DataSetPublicationForm(instance=ds_pub, prefix="ds_pub")
993 else:
994 form = PublicationForm(prefix="publication")
995 sub_form = DataSetPublicationForm(prefix="ds_pub")
996 updated = False
997 form_err = None
998 return render(
999 request,
1000 "core/_edit_form.html",
1001 {
1002 "target": "publication",
1003 "ictarget": "ds-content",
1004 "form": form,
1005 "sub_form": sub_form,
1006 "user": request.user,
1007 "form_err": form_err,
1008 "updated": updated,
1009 "next_url": request.session.get(str(ds_uuid) + "wp"),
1010 },
1011 )
1014@login_required
1015@dd_tou_accepted
1016def edit_publications(request, ds_uuid):
1017 """Display a list of :class:`discuss_data.dddatasets.Publications` connected to a :class:`discuss_data.dddatasets.DataSet`.
1019 **Context**
1021 ``ds``
1022 An instance of :class:`discuss_data.dddatasets.DataSet`.
1024 **Template:**
1026 :file:`dddatasets/prep/dataset_edit_publications.html`
1027 """
1028 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1029 if ds.is_frozen():
1030 if ds.pub_request_pending() and request.user in ds.get_curators():
1031 pass
1032 else:
1033 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
1034 else:
1035 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
1036 return handler403(request)
1038 manpage = get_man_page("edit-related-publications")
1039 control_args = {
1040 "title": "Publications related to this Data Set",
1041 "type": "publication",
1042 "edit_url": "dddatasets:prep_edit_publication",
1043 "add_url": "dddatasets:prep_edit_publication",
1044 "list_url": "dddatasets:prep_edit_publications",
1045 "delete_url": "dddatasets:prep_edit_publication",
1046 "outer_panel": True,
1047 "add_text": "Add new publication related to this data set...",
1048 }
1050 return render(
1051 request,
1052 "dddatasets/prep/dataset_edit_publications.html",
1053 {
1054 "ds": ds,
1055 "control_args": control_args,
1056 "manpage": manpage,
1057 "next_url": request.session.get(str(ds_uuid) + "wp"),
1058 },
1059 )
1062@login_required
1063@dd_tou_accepted
1064def dsa_pdf(request, ds_uuid):
1065 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1066 check_perms_403("edit_dsmo", request.user, ds.dataset_management_object)
1067 # Creating http response
1068 response = FileResponse(ds.dsa.pdf)
1069 response["Content-Disposition"] = 'inline; filename="{}"'.format(ds.dsa.pdf.name)
1070 response["Content-Transfer-Encoding"] = "binary"
1071 return response
1074@login_required
1075@dd_tou_accepted
1076def edit_dsa(request, ds_uuid):
1077 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1078 check_perms_403("admin_dsmo", request.user, ds.dataset_management_object)
1080 if not ds.dsa:
1081 ds.dsa = DataSubmissionAgreement()
1083 if request.method == "POST":
1084 form = DataSubmissionAgreementForm(request.POST, instance=ds.dsa)
1085 if form.is_valid():
1086 ds.dsa = form.save()
1087 ds.save()
1088 updated = True
1089 form_err = None
1090 ds.generate_dsa()
1091 return edit_versions(request, ds_uuid)
1092 else:
1093 updated = False
1094 form_err = form.errors.as_data()
1095 else:
1096 # GET
1097 form = DataSubmissionAgreementForm(instance=ds.dsa)
1098 updated = False
1099 form_err = None
1101 return render(
1102 request,
1103 "core/_edit_form.html",
1104 {
1105 "target": "data submission agreement",
1106 "ictarget": "ds-content",
1107 "form": form,
1108 "user": request.user,
1109 "form_err": form_err,
1110 "updated": updated,
1111 "next_url": request.session.get(str(ds_uuid) + "wp"),
1112 },
1113 )
1116@login_required
1117@dd_tou_accepted
1118def edit_versions(request, ds_uuid):
1119 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1120 dsmo = ds.dataset_management_object
1122 if ds.pub_request_pending() and request.user not in ds.get_curators():
1123 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
1124 return handler403(request)
1126 if request.user == dsmo.owner:
1127 publish_right = True
1128 else:
1129 publish_right = False
1131 manpage = get_man_page("edit-dataset-versions")
1132 manpage_dsa = get_man_page("data-submission-agreement")
1134 control_args = {
1135 "publish_right": publish_right,
1136 "title": "Files",
1137 "type": "datafile",
1138 "outer_panel": False,
1139 "edit_url": "dddatasets:prep_edit",
1140 "view_url": "dddatasets:detail",
1141 "add_url": "dddatasets:prep_edit_versions_add",
1142 "list_url": "dddatasets:prep_edit_versions",
1143 "delete_url": "dddatasets:prep_remove",
1144 "object_id": ds.uuid,
1145 "add_text": "Add new version...",
1146 "object_type": "version",
1147 "object_text": "Add version",
1148 "objects": ds.get_versions(),
1149 }
1151 return render(
1152 request,
1153 "dddatasets/prep/dataset_edit_versions.html",
1154 {
1155 "ds": ds,
1156 "control_args": control_args,
1157 "manpage": manpage,
1158 "manpage_dsa": manpage_dsa,
1159 "next_url": request.session.get(str(ds_uuid) + "wp"),
1160 },
1161 )
1164@login_required
1165@dd_tou_accepted
1166def edit_versions_add(request, ds_uuid):
1167 # TODO: this should be done via POST
1168 # user = User.objects.get(id=request.user.id)
1169 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1170 logger.debug("creating new dataset version, checking permissions")
1171 if not check_perms("edit_dsmo", request.user, ds.dataset_management_object):
1172 return HttpResponse(_("Access denied"))
1174 logger.debug("creating new dataset version")
1175 dsnv = ds.create_new_version()
1176 dsnv.uuid = uuidlib.uuid4()
1177 dsnv.save()
1178 messages.success(request, "New version added.")
1179 # send an action
1180 action.send(
1181 request.user,
1182 verb="created new version {} of".format(dsnv.version),
1183 target=ds,
1184 public=False,
1185 )
1186 return edit_versions(request, dsnv.uuid)
1189@login_required
1190@dd_tou_accepted
1191def edit_overview(request, ds_uuid):
1192 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1193 manpage = get_man_page("dataset-overview")
1194 if not check_perms("admin_dsmo", request.user, ds.dataset_management_object):
1195 return HttpResponse(_("Access denied"))
1196 # check_perms_403("admin_dataset", request.user, ds.dataset_management_object)
1198 metadata = get_dataset_fields_from_form(ds, DataSetForm(instance=ds))
1199 detail = get_dataset_fields_from_form(ds, DataSetEditForm(instance=ds))
1200 fullpage = True
1202 return render(
1203 request,
1204 "dddatasets/prep/dataset_edit_preview.html",
1205 {
1206 "ds": ds,
1207 "manpage": manpage,
1208 "metadata": metadata,
1209 "detail": detail,
1210 "fullpage": fullpage,
1211 },
1212 )
1215@login_required
1216@dd_tou_accepted
1217def edit_publish_start(request, ds_uuid):
1218 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1219 manpage = get_man_page("dataset-publish")
1220 if not check_perms("admin_dsmo", request.user, ds.dataset_management_object):
1221 return HttpResponse(_("Access denied"))
1222 # check_perms_403("admin_dataset", request.user, ds.dataset_management_object)
1223 if ds.is_frozen():
1224 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
1226 return render(
1227 request,
1228 "dddatasets/prep/_dataset_edit_publish_start.html",
1229 {"ds": ds, "manpage": manpage},
1230 )
1233@login_required
1234@dd_tou_accepted
1235def edit_publish_check(request, ds_uuid):
1236 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1237 manpage = get_man_page("dataset-publish-check")
1238 if not check_perms("admin_dsmo", request.user, ds.dataset_management_object):
1239 return HttpResponse(_("Access denied"))
1240 # check_perms_403("admin_dataset", request.user, ds.dataset_management_object)
1241 if ds.is_frozen():
1242 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
1244 request.session[str(ds_uuid) + "wp"] = request.path
1246 # validate dataset fields
1247 errors = list()
1248 try:
1249 ds.full_clean()
1250 except ValidationError as error:
1251 errors.append(error)
1253 # check if creator(s) are attached to dataset
1254 creators = DataSetCreator.objects.filter(dataset=ds)
1255 if creators.count() < 1:
1256 try:
1257 raise ValidationError({"creators": ["This field cannot be blank."]})
1258 except ValidationError as error:
1259 errors.append(error)
1261 return render(
1262 request,
1263 "dddatasets/prep/_dataset_edit_publish_check.html",
1264 {"ds": ds, "manpage": manpage, "errors": errors},
1265 )
1268@login_required
1269@dd_tou_accepted
1270def edit_publish_datafiles(request, ds_uuid):
1271 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1272 manpage = get_man_page("dataset-publish-datafiles")
1273 if not check_perms("admin_dsmo", request.user, ds.dataset_management_object):
1274 return HttpResponse(_("Access denied"))
1275 # check_perms_403("admin_dataset", request.user, ds.dataset_management_object)
1276 if ds.is_frozen():
1277 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
1279 request.session[str(ds_uuid) + "wp"] = request.path
1281 return render(
1282 request,
1283 "dddatasets/prep/_dataset_edit_publish_datafiles.html",
1284 {"ds": ds, "manpage": manpage},
1285 )
1288@login_required
1289@dd_tou_accepted
1290def edit_publish_license(request, ds_uuid):
1291 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1292 manpage = get_man_page("dataset-publish-license")
1293 if not check_perms("admin_dsmo", request.user, ds.dataset_management_object):
1294 return HttpResponse(_("Access denied"))
1295 # check_perms_403("admin_dataset", request.user, ds.dataset_management_object)
1297 request.session[str(ds_uuid) + "wp"] = request.path
1299 return render(
1300 request,
1301 "dddatasets/prep/_dataset_edit_publish_license.html",
1302 {"ds": ds, "manpage": manpage},
1303 )
1306@login_required
1307@dd_tou_accepted
1308def edit_publish_copyright(request, ds_uuid):
1309 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1310 manpage = get_man_page("dataset-publish-copyright")
1311 if not check_perms("admin_dsmo", request.user, ds.dataset_management_object):
1312 return HttpResponse(_("Access denied"))
1313 # check_perms_403("admin_dataset", request.user, ds.dataset_management_object)
1314 if ds.is_frozen():
1315 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
1317 request.session[str(ds_uuid) + "wp"] = request.path
1318 copyright_declaration_page = get_man_page("dataset-copyright-declaration")
1319 privacy_rights_declaration_page = get_man_page("privacy-rights-declaration")
1321 target = _("Dataset Copyright Declaration")
1322 err = None
1323 updated = False
1325 if request.method == "POST":
1326 sub_form_copyright = DataSetCopyrightForm(request.POST, instance=ds)
1327 sub_form_privacy_rights = DataSetPrivacyRightsForm(request.POST, instance=ds)
1328 form = DataSubmissionAgreementAcceptForm(request.POST, instance=ds.dsa)
1329 if (
1330 form.is_valid()
1331 and sub_form_copyright.is_valid()
1332 and sub_form_privacy_rights.is_valid()
1333 ):
1334 form.save()
1335 sub_form_copyright.save()
1336 sub_form_privacy_rights.save()
1337 ds.dsa.dsa_accepted_date = date.today()
1338 updated = True
1339 else:
1340 err = form.errors.as_data()
1341 err += sub_form_copyright.errors.as_data()
1342 err += sub_form_privacy_rights.errors.as_data()
1343 else:
1344 sub_form_copyright = DataSetCopyrightForm(instance=ds)
1345 sub_form_privacy_rights = DataSetPrivacyRightsForm(instance=ds)
1346 form = DataSubmissionAgreementAcceptForm(instance=ds.dsa)
1348 return render(
1349 request,
1350 "dddatasets/prep/_dataset_edit_publish_copyright.html",
1351 {
1352 "ds": ds,
1353 "manpage": manpage,
1354 "form": form,
1355 "sub_form_copyright": sub_form_copyright,
1356 "sub_form_privacy_rights": sub_form_privacy_rights,
1357 "target": target,
1358 "err": err,
1359 "updated": updated,
1360 "copyright_declaration_page": copyright_declaration_page,
1361 "privacy_rights_declaration_page": privacy_rights_declaration_page,
1362 },
1363 )
1366@login_required
1367@dd_tou_accepted
1368def edit_publish_final_fetch(request, ds_uuid, task):
1369 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1370 if not check_perms("admin_dsmo", request.user, ds.dataset_management_object):
1371 return HttpResponse(_("Access denied"))
1372 # check_perms_403("admin_dataset", request.user, ds.dataset_management_object)
1374 # check if ds is published NOT frozen
1375 if ds.published:
1376 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
1378 request.session[str(ds_uuid) + "wp"] = request.path
1380 collectionCreated = fetch(task).success
1382 response = render(
1383 request,
1384 "dddatasets/prep/_dataset_edit_publish_final_fetch.html",
1385 {"isFetched": collectionCreated, "ds_uuid": str(ds_uuid)},
1386 )
1387 if collectionCreated:
1388 messages.success(request, "Collection created successfully.")
1389 response["X-IC-CancelPolling"] = "true"
1390 return response
1393@login_required
1394@dd_tou_accepted
1395def edit_publish_final_upload(request, ds_uuid):
1396 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1397 if not check_perms("admin_dsmo", request.user, ds.dataset_management_object):
1398 return HttpResponse(_("Access denied"))
1399 # check_perms_403("admin_dataset", request.user, ds.dataset_management_object)
1401 request.session[str(ds_uuid) + "wp"] = request.path
1402 # check if ds is published NOT frozen
1403 if ds.published:
1404 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
1406 th = TokenHelper()
1407 t = th.get_token_from_session(request)
1408 publisher = Publisher(t, ds)
1409 # get collection from session
1410 collection = request.session.get("collection", None)
1411 status = publisher.upload_status(collection)
1412 logger.debug("UPLOAD_STATUS: %s", status)
1413 upload_complete = True
1414 task_exists = True
1415 for file in status.keys():
1416 if not status[file]:
1417 upload_complete = False
1419 files = collection.get("files")
1420 for file in files:
1421 task_exists = collection["files"][file].get("task_id", False)
1423 if not upload_complete and not task_exists:
1424 tasks = publisher.upload(collection)
1425 # put task id into collection
1426 for file in files:
1427 task_id = tasks[files[file]["df_uuid"]]
1428 collection["files"][file]["task_id"] = task_id
1429 # save collection in session
1430 request.session["collection"] = collection
1432 response = render(
1433 request,
1434 "dddatasets/prep/_dataset_edit_publish_final_upload.html",
1435 {"status": status, "upload_complete": upload_complete, "ds_uuid": str(ds_uuid)},
1436 )
1437 if upload_complete:
1438 response["X-IC-CancelPolling"] = "true"
1439 return response
1442@login_required
1443@dd_tou_accepted
1444def edit_publish_final_pubdd(request, ds_uuid):
1445 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1446 if not check_perms("admin_dsmo", request.user, ds.dataset_management_object):
1447 return HttpResponse(_("Access denied"))
1448 # check_perms_403("admin_dataset", request.user, ds.dataset_management_object)
1450 # check if ds is published NOT frozen
1451 if ds.published:
1452 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
1454 # publish dataset in discuss data (non-dariah)
1455 try:
1456 ds.publish(request.user)
1457 except ImproperlyConfigured:
1458 messages.error(
1459 request,
1460 "This instance of Discuss Data is not properly configured to register DataCite DOIs.",
1461 )
1462 except MetaDataError:
1463 messages.error(request, "Missing or malformed metadata.")
1464 # TODO: remove success message from template; messages are supposed to be delivered by messages interface only!!!
1465 return render(
1466 request, "dddatasets/prep/_dataset_edit_publish_final_pubdd.html", {"ds": ds},
1467 )
1470@login_required
1471@dd_tou_accepted
1472def edit_publish_final_publish(request, ds_uuid):
1473 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1474 if not check_perms("admin_dsmo", request.user, ds.dataset_management_object):
1475 logger.debug("[DHREP PUBLISHER] access denied")
1476 return HttpResponse(_("Access denied"))
1477 # check_perms_403("admin_dataset", request.user, ds.dataset_management_object)
1478 # check if ds is published NOT frozen
1479 if ds.published:
1480 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
1482 th = TokenHelper()
1483 t = th.get_token_from_session(request)
1484 publisher = Publisher(t, ds)
1485 # get collection from session
1486 collection = request.session.get("collection", {})
1487 logger.debug("[DHREP PUBLISHER] collection: %s", str(collection))
1488 status = publisher.publish_status(collection)
1489 logger.debug("[DHREP PUBLISHER] status: %s", status)
1491 # an API implementation flaw makes the "processStatus" entry missing sometimes; i suppose this is in the state of QUEUING
1492 try:
1493 process_status = status["publishStatus"]["processStatus"]
1494 except KeyError as e:
1495 logger.error(e)
1496 process_status = "QUEUED"
1498 progress = status["publishStatus"]["progress"]
1500 # create response here to cancel polling on success and failed
1501 response = render(
1502 request,
1503 "dddatasets/prep/_dataset_edit_publish_final_publish.html",
1504 {
1505 "ds_uuid": str(ds_uuid),
1506 "status": process_status,
1507 "progress": progress,
1508 "ds": ds,
1509 },
1510 )
1512 # problem: it may take more than 5 seconds for a publishjob to begin to run after being triggered
1513 if process_status == "NOT_QUEUED":
1514 try:
1515 resp = publisher.publish(collection)
1516 except PublisherError as e:
1517 logger.error(e)
1518 else:
1519 logger.debug(resp.text)
1520 elif process_status == "FINISHED":
1521 response["X-IC-CancelPolling"] = "true"
1522 # the status dictionary contains the DOIs after the process has been finished;
1523 request.session.pop("collection")
1524 publisher.update_dataset(collection, status)
1525 # also, make DD publication when finished
1526 logger.debug("[DHREP PUBLISHER] finished, starting ds.publish: %s", status)
1527 ds.publish(request.user)
1528 messages.success(
1529 request,
1530 _(
1531 "Success! The dataset has been published to Discuss Data and the Dariah Repository."
1532 ),
1533 )
1535 if process_status == "FAILED":
1536 response["X-IC-CancelPolling"] = "true"
1537 logger.error("[DHREP PUBLISHER] FAILED: %s", status)
1538 messages.error(
1539 request, _("An Error occured. The dataset has not been published.")
1540 )
1541 return response
1544@login_required
1545@dd_tou_accepted
1546def edit_publish_final(request, ds_uuid):
1547 # TODO: check for valid ds_uuid
1548 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1549 manpage = get_man_page("dataset-publish-final")
1550 if not check_perms("admin_dsmo", request.user, ds.dataset_management_object):
1551 return HttpResponse(_("Access denied"))
1552 # check_perms_403("admin_dataset", request.user, ds.dataset_management_object)
1553 # check if ds is published NOT frozen
1554 if ds.published:
1555 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
1557 # define context variables
1558 requestUri = None
1559 isTokenValid = False
1560 form = None
1561 err = None
1562 updated = False
1563 target = _("DARIAH Terms of Use Declaration")
1564 turtle_task = None
1565 publish_message = None
1566 # run checks
1567 check_error, check_list = ds.perform_checks()
1568 if check_error:
1569 error_string = _("Errors ocurred, please fix: ") + " ".join(check_list)
1570 messages.error(request, error_string)
1571 publish_message = error_string
1572 else:
1573 # no token evaluation if not open access
1574 if ds.data_access == ds.OPEN_ACCESS:
1575 th = TokenHelper()
1576 t = th.get_token_from_session(request)
1577 collection = {}
1579 if t:
1580 if t.check():
1581 isTokenValid = True
1583 messages.success(
1584 request, "Token " + t.access_token + " is " + t.info()
1585 )
1586 publisher = Publisher(t, ds)
1587 # create a job for the dataset and return the collection as a dictionary
1588 collection = publisher.create_collection()
1589 # save collection in session
1590 request.session["collection"] = collection
1591 else:
1592 isTokenValid = False
1593 messages.error(
1594 request, "Token " + t.access_token + " is " + t.info()
1595 )
1596 request.session.pop("token")
1597 request.session["ds_uuid"] = str(ds_uuid)
1598 else:
1599 isTokenValid = False
1600 messages.warning(request, "No Token provided.")
1601 request.session["ds_uuid"] = str(ds_uuid)
1602 logger.debug(isTokenValid)
1603 # return render(request, "dhrep/_getToken.html", {"requestUri": th.request_url})
1604 # wenn token nicht gültig, ist collection = {}
1605 turtle_task = collection.get("turtle_task", None)
1606 requestUri = th.request_url
1607 publish_message = None
1609 if request.method == "POST":
1610 form = DariahTermsOfUse(request.POST, instance=request.user)
1611 if form.is_valid():
1612 form.save()
1613 updated = True
1614 else:
1615 err = form.errors.as_data()
1616 else:
1617 form = DariahTermsOfUse(instance=request.user)
1619 return render(
1620 request,
1621 "dddatasets/prep/_dataset_edit_publish_final.html",
1622 {
1623 "requestUri": requestUri,
1624 "isTokenValid": isTokenValid,
1625 "ds": ds,
1626 "form": form,
1627 "updated": updated,
1628 "err": err,
1629 "target": target,
1630 "manpage": manpage,
1631 "publish_message": publish_message,
1632 "turtle_task": turtle_task,
1633 },
1634 )
1637@login_required
1638@dd_tou_accepted
1639def edit_publish_request(request, ds_uuid):
1640 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1641 manpage = get_man_page("dataset-publish-request")
1642 if not check_perms("admin_dsmo", request.user, ds.dataset_management_object):
1643 logger.error("access denied")
1644 return HttpResponse(_("Access denied"))
1645 # check_perms_403("admin_dataset", request.user, ds.dataset_management_object)
1646 if ds.is_frozen():
1647 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
1649 if request.method == "POST":
1650 # run checks
1651 logger.debug("POST publish request")
1652 check_error, check_list = ds.perform_checks()
1653 logger.error(check_error)
1654 if check_error:
1655 error_string = _("Errors ocurred, please fix: ") + " ".join(check_list)
1656 publish_message = error_string
1657 logger.error(error_string)
1658 messages.error(request, error_string)
1659 else:
1660 logger.debug("start request_publication")
1661 publish_message = ds.request_publication(request.user)
1662 logger.debug("end request_publication")
1663 return edit_versions(request, ds_uuid)
1664 else:
1665 publish_message = None
1667 return render(
1668 request,
1669 "dddatasets/prep/_dataset_edit_publish_request.html",
1670 {"ds": ds, "manpage": manpage, "publish_message": publish_message},
1671 )
1674@login_required
1675@dd_tou_accepted
1676def edit_publish_access(request, ds_uuid):
1677 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1678 manpage = get_man_page("dataset_publish")
1680 search_type = "pubaccess"
1682 form = DataSetIndividualLicenseForm(instance=ds.license)
1684 publish_right = check_perms(
1685 "admin_dsmo", request.user, ds.dataset_management_object
1686 )
1688 return render(
1689 request,
1690 "dddatasets/prep/dataset_edit_publish_access.html",
1691 {
1692 "ds": ds,
1693 "publish_right": publish_right,
1694 "manpage": manpage,
1695 "search_type": search_type,
1696 "form": form,
1697 "next_url": request.session.get(str(ds_uuid) + "wp"),
1698 },
1699 )
1702@login_required
1703@dd_tou_accepted
1704def edit_publish_access_select(request, ds_uuid):
1705 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1706 if not check_perms("admin_dsmo", request.user, ds.dataset_management_object):
1707 return HttpResponse(_("Access denied"))
1708 # check_perms_403("admin_dataset", request.user, ds.dataset_management_object)
1710 if request.method == "POST":
1711 if not ds.is_frozen():
1712 pubaccess = request.POST["pubaccess"]
1713 ds.data_access = pubaccess
1714 ds.save()
1715 return edit_publish_access(request, ds_uuid)
1716 else:
1717 return edit_publish_access(request, ds_uuid)
1720@login_required
1721@dd_tou_accepted
1722def edit_publish_license_select(request, ds_uuid):
1723 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1724 if not check_perms("admin_dsmo", request.user, ds.dataset_management_object):
1725 return HttpResponse(_("Access denied"))
1726 # check_perms_403("admin_dataset", request.user, ds.dataset_management_object)
1727 if ds.is_frozen():
1728 return redirect("dddatasets:prep_edit_versions", ds_uuid=ds.uuid,)
1730 if request.method == "POST":
1731 license_name = request.POST["licensename"]
1732 if license_name == "individual":
1733 if not ds.license or ds.license.license_type != License.INDIVIDUAL:
1734 ds.license = License.objects.create()
1735 ds.license.license_type = License.INDIVIDUAL
1736 form = DataSetIndividualLicenseForm(request.POST, instance=ds.license)
1737 if form.is_valid():
1738 ds.license = form.save()
1739 ds.license.save()
1740 else:
1741 # if form is invalid: do not save, show error message
1742 logger.info("Individual License Form INVALID")
1743 messages.error(
1744 request,
1745 _("Error in editing Individual License: {}").format(
1746 form.errors.as_text()
1747 ),
1748 )
1749 elif license_name == "nolicense":
1750 ds.license = None
1751 else:
1752 ds.license = License.objects.get(license_name=license_name)
1753 standard_license = LicensePage.objects.get(name=license_name)
1754 ds.license.license_type = License.STANDARD
1755 ds.license.standard_license = standard_license
1756 ds.license.save()
1757 ds.save()
1758 return edit_publish_access(request, ds_uuid)
1761@login_required
1762@dd_tou_accepted
1763def curation(request, ds_uuid):
1764 ds = get_object_or_404(DataSet, uuid=ds_uuid)
1765 if ds.pub_request_pending() and request.user not in ds.get_curators():
1766 raise PermissionDenied
1768 manpage = get_man_page("dataset_curation")
1770 if request.method == "POST":
1771 form = DataSetPublishAccept(request.POST)
1772 if form.is_valid():
1773 decision = form.cleaned_data.get("decision")
1774 message = form.cleaned_data.get("message")
1775 if decision == "accept":
1776 ds.accept_publication(request.user, message)
1777 messages.success(request, _("Dataset publication request accepted"))
1778 return edit_versions(request, ds_uuid)
1779 else:
1780 ds.deny_publication(request.user, message)
1781 messages.success(request, _("Dataset publication request denied"))
1782 return edit_versions(request, ds_uuid)
1783 else:
1784 messages.warning(request, form.errors.as_data())
1786 else:
1787 pass
1788 return render(
1789 request,
1790 "dddatasets/prep/dataset_curation.html",
1791 {
1792 "ds": ds,
1793 "manpage": manpage,
1794 # "form": form,
1795 },
1796 )