Merge OWNER and EDITORS into RESTRICTED level

At Map level, there is no more distinction between owner
and editors, they all share the same rights (but the right
to delete the map, but there is no level to control it).

So having this distinction at DataLayer level does not
make sense anymore, in my opinion.

This is not retrocompatible, as the change at Map level, but
it goes in the sense of permissions management more targetted
to real uMap usage while keeping the system simple.
This commit is contained in:
Yohan Boniface 2023-09-13 18:57:48 +02:00
parent af5459f75f
commit 02f36057a4
8 changed files with 26 additions and 36 deletions

View file

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

View file

@ -41,7 +41,7 @@ def get_default_share_status():
def get_default_edit_status(): def get_default_edit_status():
return settings.UMAP_DEFAULT_EDIT_STATUS or Map.OWNER return settings.UMAP_DEFAULT_EDIT_STATUS or DataLayer.RESTRICTED
class NamedModel(models.Model): class NamedModel(models.Model):
@ -300,13 +300,11 @@ class DataLayer(NamedModel):
Layer to store Features in. Layer to store Features in.
""" """
ANONYMOUS = 1 OPEN = 1
EDITORS = 2 RESTRICTED = 2
OWNER = 3
EDIT_STATUS = ( EDIT_STATUS = (
(ANONYMOUS, _("Everyone")), (OPEN, _("Everyone")),
(EDITORS, _("Editors only")), (RESTRICTED, _("Restricted to editors")),
(OWNER, _("Owner only")),
) )
map = models.ForeignKey(Map, on_delete=models.CASCADE) map = models.ForeignKey(Map, on_delete=models.CASCADE)
@ -428,7 +426,7 @@ class DataLayer(NamedModel):
if can: if can:
# Owner or editor, no need for further checks. # Owner or editor, no need for further checks.
return can return can
if self.edit_status == self.ANONYMOUS: if self.edit_status == self.OPEN:
can = True can = True
return can return can

View file

@ -45,7 +45,7 @@ def test_map_load_with_anonymous(anonymap, live_server, page):
def test_map_load_with_anonymous_but_editable_layer( def test_map_load_with_anonymous_but_editable_layer(
anonymap, live_server, page, datalayer anonymap, live_server, page, datalayer
): ):
datalayer.edit_status = DataLayer.ANONYMOUS datalayer.edit_status = DataLayer.OPEN
datalayer.save() datalayer.save()
page.goto(f"{live_server.url}{anonymap.get_absolute_url()}") page.goto(f"{live_server.url}{anonymap.get_absolute_url()}")
map_el = page.locator("#map") map_el = page.locator("#map")

View file

@ -57,7 +57,7 @@ def test_map_update_with_anonymous(map, live_server, page):
def test_map_update_with_anonymous_but_editable_datalayer( def test_map_update_with_anonymous_but_editable_datalayer(
map, datalayer, live_server, page map, datalayer, live_server, page
): ):
datalayer.edit_status = DataLayer.ANONYMOUS datalayer.edit_status = DataLayer.OPEN
datalayer.save() datalayer.save()
page.goto(f"{live_server.url}{map.get_absolute_url()}") page.goto(f"{live_server.url}{map.get_absolute_url()}")
map_el = page.locator("#map") map_el = page.locator("#map")

View file

@ -83,13 +83,13 @@ def test_should_remove_old_versions_on_save(datalayer, map, settings):
def test_anonymous_cannot_edit_in_editors_mode(datalayer): def test_anonymous_cannot_edit_in_editors_mode(datalayer):
datalayer.edit_status = DataLayer.EDITORS datalayer.edit_status = DataLayer.RESTRICTED
datalayer.save() datalayer.save()
assert not datalayer.can_edit() assert not datalayer.can_edit()
def test_owner_can_edit_in_editors_mode(datalayer, user): def test_owner_can_edit_in_editors_mode(datalayer, user):
datalayer.edit_status = DataLayer.EDITORS datalayer.edit_status = DataLayer.RESTRICTED
datalayer.save() datalayer.save()
assert datalayer.can_edit(datalayer.map.owner) assert datalayer.can_edit(datalayer.map.owner)
@ -98,19 +98,19 @@ def test_editor_can_edit_in_editors_mode(datalayer, user):
map = datalayer.map map = datalayer.map
map.editors.add(user) map.editors.add(user)
map.save() map.save()
datalayer.edit_status = DataLayer.EDITORS datalayer.edit_status = DataLayer.RESTRICTED
datalayer.save() datalayer.save()
assert datalayer.can_edit(user) assert datalayer.can_edit(user)
def test_anonymous_can_edit_in_public_mode(datalayer): def test_anonymous_can_edit_in_public_mode(datalayer):
datalayer.edit_status = DataLayer.ANONYMOUS datalayer.edit_status = DataLayer.OPEN
datalayer.save() datalayer.save()
assert datalayer.can_edit() assert datalayer.can_edit()
def test_owner_can_edit_in_public_mode(datalayer, user): def test_owner_can_edit_in_public_mode(datalayer, user):
datalayer.edit_status = DataLayer.ANONYMOUS datalayer.edit_status = DataLayer.OPEN
datalayer.save() datalayer.save()
assert datalayer.can_edit(datalayer.map.owner) assert datalayer.can_edit(datalayer.map.owner)
@ -119,13 +119,13 @@ def test_editor_can_edit_in_public_mode(datalayer, user):
map = datalayer.map map = datalayer.map
map.editors.add(user) map.editors.add(user)
map.save() map.save()
datalayer.edit_status = DataLayer.ANONYMOUS datalayer.edit_status = DataLayer.OPEN
datalayer.save() datalayer.save()
assert datalayer.can_edit(user) assert datalayer.can_edit(user)
def test_anonymous_cannot_edit_in_anonymous_owner_mode(datalayer): def test_anonymous_cannot_edit_in_anonymous_owner_mode(datalayer):
datalayer.edit_status = DataLayer.OWNER datalayer.edit_status = DataLayer.RESTRICTED
datalayer.save() datalayer.save()
map = datalayer.map map = datalayer.map
map.owner = None map.owner = None
@ -134,7 +134,7 @@ def test_anonymous_cannot_edit_in_anonymous_owner_mode(datalayer):
def test_anonymous_can_edit_in_anonymous_owner_but_public_mode(datalayer): def test_anonymous_can_edit_in_anonymous_owner_but_public_mode(datalayer):
datalayer.edit_status = DataLayer.ANONYMOUS datalayer.edit_status = DataLayer.OPEN
datalayer.save() datalayer.save()
map = datalayer.map map = datalayer.map
map.owner = None map.owner = None

View file

@ -191,7 +191,7 @@ def test_update_readonly(client, datalayer, map, post_data, settings):
def test_anonymous_owner_can_edit_in_anonymous_owner_mode( def test_anonymous_owner_can_edit_in_anonymous_owner_mode(
datalayer, cookieclient, anonymap, post_data datalayer, cookieclient, anonymap, post_data
): ):
datalayer.edit_status = DataLayer.OWNER datalayer.edit_status = DataLayer.RESTRICTED
datalayer.save() datalayer.save()
url = reverse("datalayer_update", args=(anonymap.pk, datalayer.pk)) url = reverse("datalayer_update", args=(anonymap.pk, datalayer.pk))
name = "new name" name = "new name"
@ -206,7 +206,7 @@ def test_anonymous_owner_can_edit_in_anonymous_owner_mode(
def test_anonymous_can_edit_in_anonymous_owner_but_public_mode( def test_anonymous_can_edit_in_anonymous_owner_but_public_mode(
datalayer, client, anonymap, post_data datalayer, client, anonymap, post_data
): ):
datalayer.edit_status = DataLayer.ANONYMOUS datalayer.edit_status = DataLayer.OPEN
datalayer.save() datalayer.save()
url = reverse("datalayer_update", args=(anonymap.pk, datalayer.pk)) url = reverse("datalayer_update", args=(anonymap.pk, datalayer.pk))
name = "new name" name = "new name"
@ -221,7 +221,7 @@ def test_anonymous_can_edit_in_anonymous_owner_but_public_mode(
def test_anonymous_cannot_edit_in_anonymous_owner_mode( def test_anonymous_cannot_edit_in_anonymous_owner_mode(
datalayer, client, anonymap, post_data datalayer, client, anonymap, post_data
): ):
datalayer.edit_status = DataLayer.OWNER datalayer.edit_status = DataLayer.RESTRICTED
datalayer.save() datalayer.save()
url = reverse("datalayer_update", args=(anonymap.pk, datalayer.pk)) url = reverse("datalayer_update", args=(anonymap.pk, datalayer.pk))
name = "new name" name = "new name"
@ -231,7 +231,7 @@ def test_anonymous_cannot_edit_in_anonymous_owner_mode(
def test_anonymous_cannot_edit_in_owner_mode(datalayer, client, map, post_data): def test_anonymous_cannot_edit_in_owner_mode(datalayer, client, map, post_data):
datalayer.edit_status = DataLayer.OWNER datalayer.edit_status = DataLayer.RESTRICTED
datalayer.save() datalayer.save()
url = reverse("datalayer_update", args=(map.pk, datalayer.pk)) url = reverse("datalayer_update", args=(map.pk, datalayer.pk))
name = "new name" name = "new name"
@ -241,7 +241,7 @@ def test_anonymous_cannot_edit_in_owner_mode(datalayer, client, map, post_data):
def test_anonymous_can_edit_in_owner_but_public_mode(datalayer, client, map, post_data): def test_anonymous_can_edit_in_owner_but_public_mode(datalayer, client, map, post_data):
datalayer.edit_status = DataLayer.ANONYMOUS datalayer.edit_status = DataLayer.OPEN
datalayer.save() datalayer.save()
url = reverse("datalayer_update", args=(map.pk, datalayer.pk)) url = reverse("datalayer_update", args=(map.pk, datalayer.pk))
name = "new name" name = "new name"
@ -254,7 +254,7 @@ def test_anonymous_can_edit_in_owner_but_public_mode(datalayer, client, map, pos
def test_owner_can_edit_in_owner_mode(datalayer, client, map, post_data): def test_owner_can_edit_in_owner_mode(datalayer, client, map, post_data):
client.login(username=map.owner.username, password="123123") client.login(username=map.owner.username, password="123123")
datalayer.edit_status = DataLayer.OWNER datalayer.edit_status = DataLayer.RESTRICTED
datalayer.save() datalayer.save()
url = reverse("datalayer_update", args=(map.pk, datalayer.pk)) url = reverse("datalayer_update", args=(map.pk, datalayer.pk))
name = "new name" name = "new name"
@ -267,7 +267,7 @@ def test_owner_can_edit_in_owner_mode(datalayer, client, map, post_data):
def test_editor_can_edit_in_editors_mode(datalayer, client, map, post_data): def test_editor_can_edit_in_editors_mode(datalayer, client, map, post_data):
client.login(username=map.owner.username, password="123123") client.login(username=map.owner.username, password="123123")
datalayer.edit_status = DataLayer.EDITORS datalayer.edit_status = DataLayer.RESTRICTED
datalayer.save() datalayer.save()
url = reverse("datalayer_update", args=(map.pk, datalayer.pk)) url = reverse("datalayer_update", args=(map.pk, datalayer.pk))
name = "new name" name = "new name"

View file

@ -86,14 +86,6 @@ def test_publicmanager_should_get_only_public_maps(map, user, licence):
assert private_map not in Map.public.all() assert private_map not in Map.public.all()
def test_can_change_default_edit_status(user, settings):
map = MapFactory(owner=user)
assert map.edit_status == Map.OWNER
settings.UMAP_DEFAULT_EDIT_STATUS = Map.EDITORS
map = MapFactory(owner=user)
assert map.edit_status == Map.EDITORS
def test_can_change_default_share_status(user, settings): def test_can_change_default_share_status(user, settings):
map = MapFactory(owner=user) map = MapFactory(owner=user)
assert map.share_status == Map.PUBLIC assert map.share_status == Map.PUBLIC

View file

@ -460,7 +460,7 @@ class MapDetailMixin:
} }
if getattr(self, "object", None) and self.object.owner: if getattr(self, "object", None) and self.object.owner:
properties["edit_statuses"] = [ properties["edit_statuses"] = [
(i, str(label)) for i, label in Map.EDIT_STATUS (i, str(label)) for i, label in DataLayer.EDIT_STATUS
] ]
else: else:
properties["edit_statuses"] = [ properties["edit_statuses"] = [