Extend members app: add fields to Member model, update migrations, and configure admin display

This commit is contained in:
2026-01-04 22:42:54 +01:00
parent a38a813865
commit 769f18dac8
8 changed files with 169 additions and 3 deletions

View File

@@ -1,3 +1,28 @@
from django.contrib import admin
from django.utils.translation import gettext_lazy as _
# Register your models here.
from .models import Member
@admin.register(Member)
class MemberAdmin(admin.ModelAdmin):
def family_member_count(self, obj):
return obj.family_members.count()
def show_user_is_active(self, obj):
return obj.user.is_active
show_user_is_active.boolean = True
show_user_is_active.short_description = _("active?")
list_display = ["__str__", "user__email", "show_user_is_active", "family_member_count", "birthday", "created", "updated"]
date_hierarchy = "birthday"
list_filter = ["user__is_superuser", "user__is_active"]
readonly_fields = ["created", "updated", "access_token"]
filter_horizontal = ["family_members"]
raw_id_fields = ["user"]
fieldsets = [
("GENERAL INFORMATION", {"fields": ["user", "family_members", "birthday", "license", "access_token"]}),
("CONTACT_INFORMATION", {"fields": ["phone_number", "emergency_phone_number"]}),
("METADATA", {"fields": ["created", "updated"]}),
]

View File

@@ -0,0 +1,36 @@
# Generated by Django 6.0 on 2026-01-03 12:00
import django.utils.timezone
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("members", "0002_member_family"),
]
operations = [
migrations.AddField(
model_name="member",
name="created",
field=models.DateTimeField(
auto_now_add=True,
default=django.utils.timezone.now,
verbose_name="created",
),
preserve_default=False,
),
migrations.AddField(
model_name="member",
name="updated",
field=models.DateTimeField(auto_now=True, verbose_name="updated"),
),
migrations.AlterField(
model_name="member",
name="family",
field=models.ManyToManyField(
blank=True, to="members.member", verbose_name="family"
),
),
]

View File

@@ -0,0 +1,55 @@
# Generated by Django 6.0 on 2026-01-03 12:12
import phonenumber_field.modelfields
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("members", "0003_member_created_member_updated_alter_member_family"),
]
operations = [
migrations.AddField(
model_name="member",
name="access_token",
field=models.CharField(
blank=True, max_length=255, null=True, verbose_name="access token"
),
),
migrations.AddField(
model_name="member",
name="birthday",
field=models.DateField(blank=True, null=True, verbose_name="birthday"),
),
migrations.AddField(
model_name="member",
name="emergency_phone_number",
field=phonenumber_field.modelfields.PhoneNumberField(
blank=True,
max_length=128,
null=True,
region=None,
verbose_name="emergency phone number",
),
),
migrations.AddField(
model_name="member",
name="license",
field=models.CharField(
blank=True, max_length=20, null=True, verbose_name="license"
),
),
migrations.AddField(
model_name="member",
name="phone_number",
field=phonenumber_field.modelfields.PhoneNumberField(
blank=True,
max_length=128,
null=True,
region=None,
verbose_name="phone number",
),
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 6.0 on 2026-01-03 12:20
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("members", "0004_member_access_token_member_birthday_and_more"),
]
operations = [
migrations.RemoveField(
model_name="member",
name="family",
),
migrations.AddField(
model_name="member",
name="family_members",
field=models.ManyToManyField(
blank=True, to="members.member", verbose_name="family members"
),
),
]

View File

@@ -1,15 +1,34 @@
from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _
from phonenumber_field.modelfields import PhoneNumberField
from rules import is_superuser
from rules.contrib.models import RulesModel
from members.rules import is_member_manager
class MemberManager(models.Manager):
def get_queryset(self) -> models.QuerySet:
return super().get_queryset().select_related("user")
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"))
family_members = models.ManyToManyField("self", symmetrical=True, blank=True, verbose_name=_("family members"))
birthday = models.DateField(_("birthday"), blank=True, null=True)
license = models.CharField(_("license"), max_length=20, blank=True, null=True)
phone_number = PhoneNumberField(_("phone number"), blank=True, null=True)
emergency_phone_number = PhoneNumberField(_("emergency phone number"), blank=True, null=True)
access_token = models.CharField(_("access token"), max_length=255, blank=True, null=True)
created = models.DateTimeField(auto_now_add=True, verbose_name=_("created"))
updated = models.DateTimeField(auto_now=True, verbose_name=_("updated"))
objects = MemberManager()
class Meta:
verbose_name = _("member")