80 lines
3.0 KiB
Python
80 lines
3.0 KiB
Python
from django.core.exceptions import PermissionDenied
|
|
from django.shortcuts import get_object_or_404
|
|
|
|
from wagtail.admin.forms.collections import CollectionViewRestrictionForm
|
|
from wagtail.admin.modal_workflow import render_modal_workflow
|
|
from wagtail.models import Collection, CollectionViewRestriction
|
|
from wagtail.permissions import collection_permission_policy
|
|
|
|
|
|
def set_privacy(request, collection_id):
|
|
collection = get_object_or_404(Collection, id=collection_id)
|
|
if not collection_permission_policy.user_has_permission(request.user, "change"):
|
|
raise PermissionDenied
|
|
|
|
# fetch restriction records in depth order so that ancestors appear first
|
|
restrictions = collection.get_view_restrictions().order_by("collection__depth")
|
|
if restrictions:
|
|
restriction = restrictions[0]
|
|
restriction_exists_on_ancestor = restriction.collection != collection
|
|
else:
|
|
restriction = None
|
|
restriction_exists_on_ancestor = False
|
|
|
|
if request.method == "POST":
|
|
form = CollectionViewRestrictionForm(request.POST, instance=restriction)
|
|
if form.is_valid() and not restriction_exists_on_ancestor:
|
|
if form.cleaned_data["restriction_type"] == CollectionViewRestriction.NONE:
|
|
# remove any existing restriction
|
|
if restriction:
|
|
restriction.delete()
|
|
else:
|
|
restriction = form.save(commit=False)
|
|
restriction.collection = collection
|
|
form.save()
|
|
|
|
return render_modal_workflow(
|
|
request,
|
|
None,
|
|
None,
|
|
None,
|
|
json_data={
|
|
"step": "set_privacy_done",
|
|
"is_public": (form.cleaned_data["restriction_type"] == "none"),
|
|
},
|
|
)
|
|
|
|
else: # request is a GET
|
|
if not restriction_exists_on_ancestor:
|
|
if restriction:
|
|
form = CollectionViewRestrictionForm(instance=restriction)
|
|
else:
|
|
# no current view restrictions on this collection
|
|
form = CollectionViewRestrictionForm(
|
|
initial={"restriction_type": "none"}
|
|
)
|
|
|
|
if restriction_exists_on_ancestor:
|
|
# display a message indicating that there is a restriction at ancestor level -
|
|
# do not provide the form for setting up new restrictions
|
|
return render_modal_workflow(
|
|
request,
|
|
"wagtailadmin/collection_privacy/ancestor_privacy.html",
|
|
None,
|
|
{
|
|
"collection_with_restriction": restriction.collection,
|
|
},
|
|
)
|
|
else:
|
|
# no restriction set at ancestor level - can set restrictions here
|
|
return render_modal_workflow(
|
|
request,
|
|
"wagtailadmin/collection_privacy/set_privacy.html",
|
|
None,
|
|
{
|
|
"collection": collection,
|
|
"form": form,
|
|
},
|
|
json_data={"step": "set_privacy"},
|
|
)
|