Add DataLayer.INHERIT edit status option

This commit is contained in:
Yohan Boniface 2023-09-19 08:19:20 +02:00
parent 3cbd6cca40
commit 4e54a93ee0
4 changed files with 117 additions and 7 deletions

View file

@ -66,8 +66,9 @@ class DataLayerPermissionsForm(forms.ModelForm):
class AnonymousDataLayerPermissionsForm(forms.ModelForm): class AnonymousDataLayerPermissionsForm(forms.ModelForm):
STATUS = ( STATUS = (
(Map.OWNER, _("Only editable with secret edit link")), (DataLayer.INHERIT, _("Inherit")),
(Map.ANONYMOUS, _("Everyone can edit")), (DataLayer.OWNER, _("Only editable with secret edit link")),
(DataLayer.ANONYMOUS, _("Everyone can edit")),
) )
edit_status = forms.ChoiceField(choices=STATUS) edit_status = forms.ChoiceField(choices=STATUS)

View file

@ -304,10 +304,12 @@ class DataLayer(NamedModel):
Layer to store Features in. Layer to store Features in.
""" """
INHERIT = 0
ANONYMOUS = 1 ANONYMOUS = 1
EDITORS = 2 EDITORS = 2
OWNER = 3 OWNER = 3
EDIT_STATUS = ( EDIT_STATUS = (
(INHERIT, _("Inherit")),
(ANONYMOUS, _("Everyone")), (ANONYMOUS, _("Everyone")),
(EDITORS, _("Editors only")), (EDITORS, _("Editors only")),
(OWNER, _("Owner only")), (OWNER, _("Owner only")),
@ -327,7 +329,7 @@ class DataLayer(NamedModel):
) )
edit_status = models.SmallIntegerField( edit_status = models.SmallIntegerField(
choices=EDIT_STATUS, choices=EDIT_STATUS,
default=get_default_edit_status, default=INHERIT,
verbose_name=_("edit status"), verbose_name=_("edit status"),
) )
@ -434,6 +436,8 @@ class DataLayer(NamedModel):
Define if a user can edit or not the instance, according to his account Define if a user can edit or not the instance, according to his account
or the request. or the request.
""" """
if self.edit_status == self.INHERIT:
return self.map.can_edit(user, request)
can = False can = False
if not self.map.owner: if not self.map.owner:
if settings.UMAP_ALLOW_ANONYMOUS and self.map.is_anonymous_owner(request): if settings.UMAP_ALLOW_ANONYMOUS and self.map.is_anonymous_owner(request):

View file

@ -4,7 +4,7 @@ import pytest
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from .base import DataLayerFactory, MapFactory from .base import DataLayerFactory, MapFactory
from umap.models import DataLayer from umap.models import DataLayer, Map
pytestmark = pytest.mark.django_db pytestmark = pytest.mark.django_db
@ -136,10 +136,66 @@ def test_anonymous_cannot_edit_in_anonymous_owner_mode(datalayer):
assert not datalayer.can_edit() assert not datalayer.can_edit()
def test_anonymous_can_edit_in_anonymous_owner_but_public_mode(datalayer): def test_owner_can_edit_in_inherit_mode_and_map_in_owner_mode(datalayer):
datalayer.edit_status = DataLayer.ANONYMOUS datalayer.edit_status = DataLayer.INHERIT
datalayer.save() datalayer.save()
map = datalayer.map map = datalayer.map
map.owner = None map.edit_status = Map.OWNER
map.save()
assert datalayer.can_edit(map.owner)
def test_editors_cannot_edit_in_inherit_mode_and_map_in_owner_mode(datalayer, user):
datalayer.edit_status = DataLayer.INHERIT
datalayer.save()
map = datalayer.map
map.editors.add(user)
map.edit_status = Map.OWNER
map.save()
assert not datalayer.can_edit(user)
def test_anonymous_cannot_edit_in_inherit_mode_and_map_in_owner_mode(datalayer):
datalayer.edit_status = DataLayer.INHERIT
datalayer.save()
map = datalayer.map
map.edit_status = Map.OWNER
map.save()
assert not datalayer.can_edit()
def test_owner_can_edit_in_inherit_mode_and_map_in_editors_mode(datalayer):
datalayer.edit_status = DataLayer.INHERIT
datalayer.save()
map = datalayer.map
map.edit_status = Map.EDITORS
map.save()
assert datalayer.can_edit(map.owner)
def test_editors_can_edit_in_inherit_mode_and_map_in_editors_mode(datalayer, user):
datalayer.edit_status = DataLayer.INHERIT
datalayer.save()
map = datalayer.map
map.editors.add(user)
map.edit_status = Map.EDITORS
map.save()
assert datalayer.can_edit(user)
def test_anonymous_cannot_edit_in_inherit_mode_and_map_in_editors_mode(datalayer):
datalayer.edit_status = DataLayer.INHERIT
datalayer.save()
map = datalayer.map
map.edit_status = Map.EDITORS
map.save()
assert not datalayer.can_edit()
def test_anonymous_can_edit_in_inherit_mode_and_map_in_public_mode(datalayer):
datalayer.edit_status = DataLayer.INHERIT
datalayer.save()
map = datalayer.map
map.edit_status = Map.ANONYMOUS
map.save() map.save()
assert datalayer.can_edit() assert datalayer.can_edit()

View file

@ -336,3 +336,52 @@ def test_editor_can_edit_in_editors_mode(datalayer, client, map, post_data):
assert response.status_code == 200 assert response.status_code == 200
modified_datalayer = DataLayer.objects.get(pk=datalayer.pk) modified_datalayer = DataLayer.objects.get(pk=datalayer.pk)
assert modified_datalayer.name == name assert modified_datalayer.name == name
@pytest.mark.usefixtures("allow_anonymous")
def test_anonymous_owner_can_edit_if_inherit_and_map_in_owner_mode(
datalayer, cookieclient, anonymap, post_data
):
anonymap.edit_status = Map.OWNER
anonymap.save()
datalayer.edit_status = DataLayer.INHERIT
datalayer.save()
url = reverse("datalayer_update", args=(anonymap.pk, datalayer.pk))
name = "new name"
post_data["name"] = name
response = cookieclient.post(url, post_data, follow=True)
assert response.status_code == 200
modified_datalayer = DataLayer.objects.get(pk=datalayer.pk)
assert modified_datalayer.name == name
@pytest.mark.usefixtures("allow_anonymous")
def test_anonymous_user_cannot_edit_if_inherit_and_map_in_owner_mode(
datalayer, client, anonymap, post_data
):
anonymap.edit_status = Map.OWNER
anonymap.save()
datalayer.edit_status = DataLayer.INHERIT
datalayer.save()
url = reverse("datalayer_update", args=(anonymap.pk, datalayer.pk))
name = "new name"
post_data["name"] = name
response = client.post(url, post_data, follow=True)
assert response.status_code == 403
@pytest.mark.usefixtures("allow_anonymous")
def test_anonymous_user_can_edit_if_inherit_and_map_in_public_mode(
datalayer, client, anonymap, post_data
):
anonymap.edit_status = Map.ANONYMOUS
anonymap.save()
datalayer.edit_status = DataLayer.INHERIT
datalayer.save()
url = reverse("datalayer_update", args=(anonymap.pk, datalayer.pk))
name = "new name"
post_data["name"] = name
response = client.post(url, post_data, follow=True)
assert response.status_code == 200
modified_datalayer = DataLayer.objects.get(pk=datalayer.pk)
assert modified_datalayer.name == name