From 02f36057a475e2416066fd3910c87320907e8a6d Mon Sep 17 00:00:00 2001 From: Yohan Boniface Date: Wed, 13 Sep 2023 18:57:48 +0200 Subject: [PATCH] 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. --- umap/forms.py | 4 ++-- umap/models.py | 14 ++++++-------- .../integration/test_anonymous_owned_map.py | 2 +- umap/tests/integration/test_owned_map.py | 2 +- umap/tests/test_datalayer.py | 16 ++++++++-------- umap/tests/test_datalayer_views.py | 14 +++++++------- umap/tests/test_map.py | 8 -------- umap/views.py | 2 +- 8 files changed, 26 insertions(+), 36 deletions(-) diff --git a/umap/forms.py b/umap/forms.py index 636013eb..a0ad8ed2 100644 --- a/umap/forms.py +++ b/umap/forms.py @@ -53,8 +53,8 @@ class DataLayerPermissionsForm(forms.ModelForm): class AnonymousDataLayerPermissionsForm(forms.ModelForm): STATUS = ( - (Map.ANONYMOUS, _("Everyone can edit")), - (Map.OWNER, _("Only editable with secret edit link")), + (DataLayer.OPEN, _("Everyone can edit")), + (DataLayer.RESTRICTED, _("Only editable with secret edit link")), ) edit_status = forms.ChoiceField(choices=STATUS) diff --git a/umap/models.py b/umap/models.py index 40d7afb4..75a36850 100644 --- a/umap/models.py +++ b/umap/models.py @@ -41,7 +41,7 @@ def get_default_share_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): @@ -300,13 +300,11 @@ class DataLayer(NamedModel): Layer to store Features in. """ - ANONYMOUS = 1 - EDITORS = 2 - OWNER = 3 + OPEN = 1 + RESTRICTED = 2 EDIT_STATUS = ( - (ANONYMOUS, _("Everyone")), - (EDITORS, _("Editors only")), - (OWNER, _("Owner only")), + (OPEN, _("Everyone")), + (RESTRICTED, _("Restricted to editors")), ) map = models.ForeignKey(Map, on_delete=models.CASCADE) @@ -428,7 +426,7 @@ class DataLayer(NamedModel): if can: # Owner or editor, no need for further checks. return can - if self.edit_status == self.ANONYMOUS: + if self.edit_status == self.OPEN: can = True return can diff --git a/umap/tests/integration/test_anonymous_owned_map.py b/umap/tests/integration/test_anonymous_owned_map.py index 8cf377e3..aae1d1e0 100644 --- a/umap/tests/integration/test_anonymous_owned_map.py +++ b/umap/tests/integration/test_anonymous_owned_map.py @@ -45,7 +45,7 @@ def test_map_load_with_anonymous(anonymap, live_server, page): def test_map_load_with_anonymous_but_editable_layer( anonymap, live_server, page, datalayer ): - datalayer.edit_status = DataLayer.ANONYMOUS + datalayer.edit_status = DataLayer.OPEN datalayer.save() page.goto(f"{live_server.url}{anonymap.get_absolute_url()}") map_el = page.locator("#map") diff --git a/umap/tests/integration/test_owned_map.py b/umap/tests/integration/test_owned_map.py index 5938c6eb..5a5b07cb 100644 --- a/umap/tests/integration/test_owned_map.py +++ b/umap/tests/integration/test_owned_map.py @@ -57,7 +57,7 @@ def test_map_update_with_anonymous(map, live_server, page): def test_map_update_with_anonymous_but_editable_datalayer( map, datalayer, live_server, page ): - datalayer.edit_status = DataLayer.ANONYMOUS + datalayer.edit_status = DataLayer.OPEN datalayer.save() page.goto(f"{live_server.url}{map.get_absolute_url()}") map_el = page.locator("#map") diff --git a/umap/tests/test_datalayer.py b/umap/tests/test_datalayer.py index b026e50e..57f2835d 100644 --- a/umap/tests/test_datalayer.py +++ b/umap/tests/test_datalayer.py @@ -83,13 +83,13 @@ def test_should_remove_old_versions_on_save(datalayer, map, settings): def test_anonymous_cannot_edit_in_editors_mode(datalayer): - datalayer.edit_status = DataLayer.EDITORS + datalayer.edit_status = DataLayer.RESTRICTED datalayer.save() assert not datalayer.can_edit() def test_owner_can_edit_in_editors_mode(datalayer, user): - datalayer.edit_status = DataLayer.EDITORS + datalayer.edit_status = DataLayer.RESTRICTED datalayer.save() 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.editors.add(user) map.save() - datalayer.edit_status = DataLayer.EDITORS + datalayer.edit_status = DataLayer.RESTRICTED datalayer.save() assert datalayer.can_edit(user) def test_anonymous_can_edit_in_public_mode(datalayer): - datalayer.edit_status = DataLayer.ANONYMOUS + datalayer.edit_status = DataLayer.OPEN datalayer.save() assert datalayer.can_edit() def test_owner_can_edit_in_public_mode(datalayer, user): - datalayer.edit_status = DataLayer.ANONYMOUS + datalayer.edit_status = DataLayer.OPEN datalayer.save() 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.editors.add(user) map.save() - datalayer.edit_status = DataLayer.ANONYMOUS + datalayer.edit_status = DataLayer.OPEN datalayer.save() assert datalayer.can_edit(user) def test_anonymous_cannot_edit_in_anonymous_owner_mode(datalayer): - datalayer.edit_status = DataLayer.OWNER + datalayer.edit_status = DataLayer.RESTRICTED datalayer.save() map = datalayer.map 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): - datalayer.edit_status = DataLayer.ANONYMOUS + datalayer.edit_status = DataLayer.OPEN datalayer.save() map = datalayer.map map.owner = None diff --git a/umap/tests/test_datalayer_views.py b/umap/tests/test_datalayer_views.py index b0f536da..0e26459a 100644 --- a/umap/tests/test_datalayer_views.py +++ b/umap/tests/test_datalayer_views.py @@ -191,7 +191,7 @@ def test_update_readonly(client, datalayer, map, post_data, settings): def test_anonymous_owner_can_edit_in_anonymous_owner_mode( datalayer, cookieclient, anonymap, post_data ): - datalayer.edit_status = DataLayer.OWNER + datalayer.edit_status = DataLayer.RESTRICTED datalayer.save() url = reverse("datalayer_update", args=(anonymap.pk, datalayer.pk)) 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( datalayer, client, anonymap, post_data ): - datalayer.edit_status = DataLayer.ANONYMOUS + datalayer.edit_status = DataLayer.OPEN datalayer.save() url = reverse("datalayer_update", args=(anonymap.pk, datalayer.pk)) 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( datalayer, client, anonymap, post_data ): - datalayer.edit_status = DataLayer.OWNER + datalayer.edit_status = DataLayer.RESTRICTED datalayer.save() url = reverse("datalayer_update", args=(anonymap.pk, datalayer.pk)) 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): - datalayer.edit_status = DataLayer.OWNER + datalayer.edit_status = DataLayer.RESTRICTED datalayer.save() url = reverse("datalayer_update", args=(map.pk, datalayer.pk)) 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): - datalayer.edit_status = DataLayer.ANONYMOUS + datalayer.edit_status = DataLayer.OPEN datalayer.save() url = reverse("datalayer_update", args=(map.pk, datalayer.pk)) 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): client.login(username=map.owner.username, password="123123") - datalayer.edit_status = DataLayer.OWNER + datalayer.edit_status = DataLayer.RESTRICTED datalayer.save() url = reverse("datalayer_update", args=(map.pk, datalayer.pk)) 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): client.login(username=map.owner.username, password="123123") - datalayer.edit_status = DataLayer.EDITORS + datalayer.edit_status = DataLayer.RESTRICTED datalayer.save() url = reverse("datalayer_update", args=(map.pk, datalayer.pk)) name = "new name" diff --git a/umap/tests/test_map.py b/umap/tests/test_map.py index bc1283c3..2e0aa2a8 100644 --- a/umap/tests/test_map.py +++ b/umap/tests/test_map.py @@ -86,14 +86,6 @@ def test_publicmanager_should_get_only_public_maps(map, user, licence): 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): map = MapFactory(owner=user) assert map.share_status == Map.PUBLIC diff --git a/umap/views.py b/umap/views.py index 8fce635d..2651867a 100644 --- a/umap/views.py +++ b/umap/views.py @@ -460,7 +460,7 @@ class MapDetailMixin: } if getattr(self, "object", None) and self.object.owner: properties["edit_statuses"] = [ - (i, str(label)) for i, label in Map.EDIT_STATUS + (i, str(label)) for i, label in DataLayer.EDIT_STATUS ] else: properties["edit_statuses"] = [