Set up members app with models, migrations, permissions, and rules integration; updated dependencies and settings

This commit is contained in:
2026-01-03 13:00:06 +01:00
parent 63ad906557
commit a38a813865
7 changed files with 129 additions and 31 deletions

View File

@@ -0,0 +1,48 @@
# Generated by Django 6.0 on 2026-01-03 11:53
import django.db.models.deletion
import rules.contrib.models
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name="Member",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"user",
models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE,
related_name="member",
to=settings.AUTH_USER_MODEL,
verbose_name="user",
),
),
],
options={
"verbose_name": "member",
"verbose_name_plural": "members",
"ordering": ["user__last_name", "user__first_name"],
"permissions": [("member_manager", "Can manage members")],
},
bases=(rules.contrib.models.RulesModelMixin, models.Model),
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 6.0 on 2026-01-03 11:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("members", "0001_initial"),
]
operations = [
migrations.AddField(
model_name="member",
name="family",
field=models.ManyToManyField(
blank=True,
related_name="family",
to="members.member",
verbose_name="family",
),
),
]

View File

@@ -1,3 +1,27 @@
from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _
from rules import is_superuser
from rules.contrib.models import RulesModel
# Create your models here.
from members.rules import is_member_manager
class Member(RulesModel):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="member", verbose_name=_("user"))
family = models.ManyToManyField("self", symmetrical=True, blank=True, verbose_name=_("family"))
class Meta:
verbose_name = _("member")
verbose_name_plural = _("members")
ordering = ["user__last_name", "user__first_name"]
permissions = [("member_manager", _("Can manage members"))]
rules_permissions = {
"add": is_superuser | is_member_manager,
"change": is_superuser | is_member_manager,
"delete": is_superuser | is_member_manager,
"view": is_superuser | is_member_manager,
}
def __str__(self):
return self.user.get_full_name()

9
members/rules.py Normal file
View File

@@ -0,0 +1,9 @@
from typing import Optional
import rules
from django.contrib.auth.models import AbstractUser
@rules.predicate
def is_member_manager(user: Optional[AbstractUser]) -> bool:
return user.has_perm('members.member_manager')