Set up members app with models, migrations, permissions, and rules integration; updated dependencies and settings
This commit is contained in:
48
members/migrations/0001_initial.py
Normal file
48
members/migrations/0001_initial.py
Normal 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),
|
||||
),
|
||||
]
|
||||
23
members/migrations/0002_member_family.py
Normal file
23
members/migrations/0002_member_family.py
Normal 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",
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -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
9
members/rules.py
Normal 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')
|
||||
Reference in New Issue
Block a user