Enable member creation functionality: implement MemberAddView, create MemberForm, update routes, templates, and add supporting styles.
This commit is contained in:
@@ -24,5 +24,5 @@ class MemberAdmin(admin.ModelAdmin):
|
||||
fieldsets = [
|
||||
("GENERAL INFORMATION", {"fields": ["user", "family_members", "birthday", "license", "access_token"]}),
|
||||
("CONTACT_INFORMATION", {"fields": ["phone_number", "emergency_phone_number"]}),
|
||||
("METADATA", {"fields": ["created", "updated"]}),
|
||||
("METADATA", {"fields": ["notes", "created", "updated"]}),
|
||||
]
|
||||
|
||||
42
members/forms.py
Normal file
42
members/forms.py
Normal file
@@ -0,0 +1,42 @@
|
||||
from django import forms
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from .models import Member
|
||||
|
||||
class MemberForm(forms.ModelForm):
|
||||
first_name = forms.CharField(label=_("First name"), max_length=250)
|
||||
last_name = forms.CharField(label=_("Last name"), max_length=250)
|
||||
email = forms.EmailField(label=_("Email"))
|
||||
|
||||
admin = forms.BooleanField(label=_("Admin?"), required=False, help_text=_("If checked will mark this user as a site admin granting them all permissions"))
|
||||
|
||||
password = forms.CharField(label=_("Password"), widget=forms.PasswordInput, required=False)
|
||||
password_confirmation = forms.CharField(label=_("Confirm password"), widget=forms.PasswordInput, required=False)
|
||||
|
||||
class Meta:
|
||||
model = Member
|
||||
fields = ["phone_number", "emergency_phone_number", "license", "birthday", "family_members"]
|
||||
localized_fields = fields
|
||||
|
||||
def save(self, commit: bool = True) -> Member:
|
||||
password = None
|
||||
|
||||
if self.cleaned_data["password"] is not None and self.cleaned_data["password"] != "" and self.cleaned_data["password"] == self.cleaned_data["password_confirmation"]:
|
||||
password = self.cleaned_data["password"]
|
||||
|
||||
member = Member.create(first_name=self.cleaned_data["first_name"], last_name=self.cleaned_data["last_name"], email=self.cleaned_data["email"], password=password, member=self.instance)
|
||||
member.phone_number = self.cleaned_data["phone_number"]
|
||||
member.emergency_phone_number = self.cleaned_data["emergency_phone_number"]
|
||||
member.license = self.cleaned_data["license"]
|
||||
member.birthday = self.cleaned_data["birthday"]
|
||||
|
||||
if self.cleaned_data["admin"]:
|
||||
member.user.is_superuser = True
|
||||
member.user.save(update_fields=["is_superuser"])
|
||||
|
||||
member.save(update_fields=["phone_number", "emergency_phone_number", "license", "birthday"])
|
||||
member.family_members.set(self.cleaned_data["family_members"])
|
||||
|
||||
return member
|
||||
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
import secrets
|
||||
import string
|
||||
from typing import Optional
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.db import models
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from phonenumber_field.modelfields import PhoneNumberField
|
||||
@@ -22,6 +27,7 @@ class Member(RulesModel):
|
||||
|
||||
phone_number = PhoneNumberField(_("phone number"), blank=True, null=True)
|
||||
emergency_phone_number = PhoneNumberField(_("emergency phone number"), blank=True, null=True)
|
||||
notes = models.TextField(_("notes"), blank=True, null=True)
|
||||
|
||||
access_token = models.CharField(_("access token"), max_length=255, blank=True, null=True)
|
||||
|
||||
@@ -44,3 +50,57 @@ class Member(RulesModel):
|
||||
|
||||
def __str__(self):
|
||||
return self.user.get_full_name()
|
||||
|
||||
@classmethod
|
||||
def create(cls, first_name: str, last_name: str, email: str, password: Optional[str] = None, member: Optional["Member"] = None) -> "Member":
|
||||
"""Creates a new member based on the provided details"""
|
||||
|
||||
if member is not None and member.pk is not None:
|
||||
member.user.first_name = first_name
|
||||
member.user.last_name = last_name
|
||||
member.user.email = email
|
||||
member.user.username = email
|
||||
|
||||
if password is not None and password != "":
|
||||
member.user.set_password(password)
|
||||
|
||||
else:
|
||||
# First check to see if a user already exists in the system
|
||||
user, created = get_user_model().objects.get_or_create(
|
||||
username=email,
|
||||
defaults={
|
||||
"first_name": first_name,
|
||||
"last_name": last_name,
|
||||
"email": email
|
||||
}
|
||||
)
|
||||
|
||||
if not created:
|
||||
user.first_name = first_name
|
||||
user.last_name = last_name
|
||||
user.email = email
|
||||
user.username = email
|
||||
|
||||
if hasattr(user, "member"):
|
||||
member = user.member
|
||||
if password is not None and password != "":
|
||||
user.set_password(password)
|
||||
else:
|
||||
member = cls()
|
||||
|
||||
initial_password = "".join(secrets.choice(string.ascii_letters + string.digits) for _ in range(20))
|
||||
|
||||
if password is None or password == "":
|
||||
password = initial_password
|
||||
member.notes = f"Initial password: {initial_password}"
|
||||
|
||||
user.set_password(password)
|
||||
member.user = user
|
||||
|
||||
if not member.user.is_active:
|
||||
member.user.is_active = True
|
||||
|
||||
member.user.save()
|
||||
member.save()
|
||||
|
||||
return member
|
||||
Reference in New Issue
Block a user