mirror of
https://github.com/umap-project/umap.git
synced 2025-05-05 22:11:50 +02:00
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:
parent
af5459f75f
commit
02f36057a4
8 changed files with 26 additions and 36 deletions
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"] = [
|
||||||
|
|
Loading…
Reference in a new issue