Set up an abstract PermissionsModel for DataLayer

Curiously the auto-generated migration adds (existing) fields to the map too.

Refs #584
This commit is contained in:
David Larlet 2023-05-30 20:57:18 -04:00
parent 0b76ebb259
commit 53a0946336
No known key found for this signature in database
GPG key ID: 3E2953A359E7E7BD
2 changed files with 138 additions and 37 deletions

View file

@ -0,0 +1,90 @@
# Generated by Django 4.1.7 on 2023-05-31 00:54
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("umap", "0009_star"),
]
operations = [
migrations.AddField(
model_name="datalayer",
name="edit_status",
field=models.SmallIntegerField(
choices=[
(1, "Everyone can edit"),
(2, "Only editors can edit"),
(3, "Only owner can edit"),
],
default=3,
verbose_name="edit status",
),
),
migrations.AddField(
model_name="datalayer",
name="editors",
field=models.ManyToManyField(
blank=True,
related_name="%(app_label)s_%(class)s_editors_related",
related_query_name="%(app_label)s_%(class)ss",
to=settings.AUTH_USER_MODEL,
verbose_name="editors",
),
),
migrations.AddField(
model_name="datalayer",
name="owner",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.PROTECT,
related_name="%(app_label)s_%(class)s_owner_related",
related_query_name="%(app_label)s_%(class)ss",
to=settings.AUTH_USER_MODEL,
verbose_name="owner",
),
),
migrations.AddField(
model_name="datalayer",
name="share_status",
field=models.SmallIntegerField(
choices=[
(1, "everyone (public)"),
(2, "anyone with link"),
(3, "editors only"),
(9, "blocked"),
],
default=1,
verbose_name="share status",
),
),
migrations.AlterField(
model_name="map",
name="editors",
field=models.ManyToManyField(
blank=True,
related_name="%(app_label)s_%(class)s_editors_related",
related_query_name="%(app_label)s_%(class)ss",
to=settings.AUTH_USER_MODEL,
verbose_name="editors",
),
),
migrations.AlterField(
model_name="map",
name="owner",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.PROTECT,
related_name="%(app_label)s_%(class)s_owner_related",
related_query_name="%(app_label)s_%(class)ss",
to=settings.AUTH_USER_MODEL,
verbose_name="owner",
),
),
]

View file

@ -12,6 +12,52 @@ from django.core.files.base import File
from .managers import PublicManager
class PermissionsModel(models.Model):
ANONYMOUS = 1
EDITORS = 2
OWNER = 3
PUBLIC = 1
OPEN = 2
PRIVATE = 3
BLOCKED = 9
EDIT_STATUS = (
(ANONYMOUS, _("Everyone can edit")),
(EDITORS, _("Only editors can edit")),
(OWNER, _("Only owner can edit")),
)
SHARE_STATUS = (
(PUBLIC, _("everyone (public)")),
(OPEN, _("anyone with link")),
(PRIVATE, _("editors only")),
(BLOCKED, _("blocked")),
)
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
blank=True,
null=True,
verbose_name=_("owner"),
on_delete=models.PROTECT,
related_name="%(app_label)s_%(class)s_owner_related",
related_query_name="%(app_label)s_%(class)ss",
)
editors = models.ManyToManyField(
settings.AUTH_USER_MODEL,
blank=True,
verbose_name=_("editors"),
related_name="%(app_label)s_%(class)s_editors_related",
related_query_name="%(app_label)s_%(class)ss",
)
edit_status = models.SmallIntegerField(
choices=EDIT_STATUS, default=OWNER, verbose_name=_("edit status")
)
share_status = models.SmallIntegerField(
choices=SHARE_STATUS, default=PUBLIC, verbose_name=_("share status")
)
class Meta:
abstract = True
class NamedModel(models.Model):
name = models.CharField(max_length=200, verbose_name=_("name"))
@ -94,29 +140,11 @@ class TileLayer(NamedModel):
ordering = ("rank", "name")
class Map(NamedModel):
class Map(NamedModel, PermissionsModel):
"""
A single thematical map.
"""
ANONYMOUS = 1
EDITORS = 2
OWNER = 3
PUBLIC = 1
OPEN = 2
PRIVATE = 3
BLOCKED = 9
EDIT_STATUS = (
(ANONYMOUS, _("Everyone can edit")),
(EDITORS, _("Only editors can edit")),
(OWNER, _("Only owner can edit")),
)
SHARE_STATUS = (
(PUBLIC, _("everyone (public)")),
(OPEN, _("anyone with link")),
(PRIVATE, _("editors only")),
(BLOCKED, _("blocked")),
)
slug = models.SlugField(db_index=True)
description = models.TextField(blank=True, null=True, verbose_name=_("description"))
center = models.PointField(geography=True, verbose_name=_("center"))
@ -132,23 +160,6 @@ class Map(NamedModel):
default=get_default_licence,
)
modified_at = models.DateTimeField(auto_now=True)
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
blank=True,
null=True,
related_name="owned_maps",
verbose_name=_("owner"),
on_delete=models.PROTECT,
)
editors = models.ManyToManyField(
settings.AUTH_USER_MODEL, blank=True, verbose_name=_("editors")
)
edit_status = models.SmallIntegerField(
choices=EDIT_STATUS, default=OWNER, verbose_name=_("edit status")
)
share_status = models.SmallIntegerField(
choices=SHARE_STATUS, default=PUBLIC, verbose_name=_("share status")
)
settings = models.JSONField(
blank=True, null=True, verbose_name=_("settings"), default=dict
)
@ -261,7 +272,7 @@ def upload_to(instance, filename):
return os.path.join(instance.storage_root(), name)
class DataLayer(NamedModel):
class DataLayer(NamedModel, PermissionsModel):
"""
Layer to store Features in.
"""