Respond to review feedback

This commit is contained in:
Neil Martinsen-Burrell 2022-09-26 11:51:15 -05:00
parent 5c3460782e
commit 60f282752b
No known key found for this signature in database
GPG key ID: 6A3C818CC10D0184
12 changed files with 69 additions and 119 deletions

View file

@ -3,12 +3,17 @@ from django.contrib.auth.admin import UserAdmin
from .models import User, UserProfile from .models import User, UserProfile
# edit a user's profile on the user page
class UserProfileInline(admin.StackedInline): class UserProfileInline(admin.StackedInline):
"""Edit a user's profile on the user page."""
model = UserProfile model = UserProfile
class MyUserAdmin(UserAdmin): class MyUserAdmin(UserAdmin):
"""Custom user admin class to use our inlines."""
inlines = [UserProfileInline] inlines = [UserProfileInline]

View file

@ -54,9 +54,6 @@ BASE_DIR = path.resolve().parent.parent
# SECURITY WARNING: don't run with debug turned on in production! # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = env_debug DEBUG = env_debug
# Use our user model instead of the default
AUTH_USER_MODEL = "registrar.User"
# Applications are modular pieces of code. # Applications are modular pieces of code.
# They are provided by Django, by third-parties, or by yourself. # They are provided by Django, by third-parties, or by yourself.
@ -185,6 +182,9 @@ DATABASES = {
# Specify default field type to use for primary keys # Specify default field type to use for primary keys
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
# Use our user model instead of the default
AUTH_USER_MODEL = "registrar.User"
# endregion # endregion
# region: Email-------------------------------------------------------------### # region: Email-------------------------------------------------------------###

View file

@ -4,7 +4,6 @@ For more information see:
https://docs.djangoproject.com/en/4.0/topics/http/urls/ https://docs.djangoproject.com/en/4.0/topics/http/urls/
""" """
from django.conf import settings
from django.contrib import admin from django.contrib import admin
from django.urls import include, path from django.urls import include, path

View file

@ -2,9 +2,20 @@ from django import forms
from .models import UserProfile from .models import UserProfile
class EditProfileForm(forms.ModelForm): class EditProfileForm(forms.ModelForm):
display_name = forms.CharField(widget=forms.TextInput(attrs={'class': 'usa-input'}), label="Display Name")
"""Custom form class for editing a UserProfile.
We can add whatever fields we want to this form and customize how they
are displayed. The form is rendered into a template `profile.html` by a
view called `edit_profile` in `profile.py`.
"""
display_name = forms.CharField(
widget=forms.TextInput(attrs={"class": "usa-input"}), label="Display Name"
)
class Meta: class Meta:
model = UserProfile model = UserProfile
fields = ['display_name'] fields = ["display_name"]

View file

@ -1,4 +1,4 @@
# Generated by Django 4.1.1 on 2022-09-22 16:05 # Generated by Django 4.1.1 on 2022-09-26 15:26
from django.conf import settings from django.conf import settings
import django.contrib.auth.models import django.contrib.auth.models
@ -127,7 +127,9 @@ class Migration(migrations.Migration):
"verbose_name_plural": "users", "verbose_name_plural": "users",
"abstract": False, "abstract": False,
}, },
managers=[("objects", django.contrib.auth.models.UserManager())], managers=[
("objects", django.contrib.auth.models.UserManager()),
],
), ),
migrations.CreateModel( migrations.CreateModel(
name="UserProfile", name="UserProfile",
@ -143,16 +145,16 @@ class Migration(migrations.Migration):
), ),
("created_at", models.DateTimeField(auto_now_add=True)), ("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)), ("updated_at", models.DateTimeField(auto_now=True)),
("street1", models.CharField(max_length=2)), ("street1", models.TextField(blank=True)),
("street2", models.CharField(max_length=2)), ("street2", models.TextField(blank=True)),
("street3", models.CharField(max_length=2)), ("street3", models.TextField(blank=True)),
("city", models.CharField(max_length=2)), ("city", models.TextField(blank=True)),
("sp", models.CharField(max_length=2)), ("sp", models.TextField(blank=True)),
("pc", models.CharField(max_length=2)), ("pc", models.TextField(blank=True)),
("cc", models.CharField(max_length=2)), ("cc", models.TextField(blank=True)),
("voice", models.CharField(max_length=2)), ("voice", models.TextField(blank=True)),
("fax", models.CharField(max_length=2)), ("fax", models.TextField(blank=True)),
("email", models.CharField(max_length=2)), ("email", models.TextField(blank=True)),
("display_name", models.TextField()), ("display_name", models.TextField()),
( (
"user", "user",
@ -163,6 +165,8 @@ class Migration(migrations.Migration):
), ),
), ),
], ],
options={"abstract": False}, options={
"abstract": False,
},
), ),
] ]

View file

@ -1,63 +0,0 @@
# Generated by Django 4.1.1 on 2022-09-22 16:51
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("registrar", "0001_initial"),
]
operations = [
migrations.AlterField(
model_name="userprofile",
name="cc",
field=models.TextField(blank=True),
),
migrations.AlterField(
model_name="userprofile",
name="city",
field=models.TextField(blank=True),
),
migrations.AlterField(
model_name="userprofile",
name="email",
field=models.TextField(blank=True),
),
migrations.AlterField(
model_name="userprofile",
name="fax",
field=models.TextField(blank=True),
),
migrations.AlterField(
model_name="userprofile",
name="pc",
field=models.TextField(blank=True),
),
migrations.AlterField(
model_name="userprofile",
name="sp",
field=models.TextField(blank=True),
),
migrations.AlterField(
model_name="userprofile",
name="street1",
field=models.TextField(),
),
migrations.AlterField(
model_name="userprofile",
name="street2",
field=models.TextField(blank=True),
),
migrations.AlterField(
model_name="userprofile",
name="street3",
field=models.TextField(blank=True),
),
migrations.AlterField(
model_name="userprofile",
name="voice",
field=models.TextField(blank=True),
),
]

View file

@ -1,18 +0,0 @@
# Generated by Django 4.1.1 on 2022-09-22 16:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("registrar", "0002_alter_userprofile_cc_alter_userprofile_city_and_more"),
]
operations = [
migrations.AlterField(
model_name="userprofile",
name="street1",
field=models.TextField(blank=True),
),
]

View file

@ -1,3 +1,3 @@
from .models import User, UserProfile from .models import User, UserProfile
__all__ = [User, UserProfile] __all__ = ["User", "UserProfile"]

View file

@ -1,3 +1,4 @@
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.auth.models import AbstractUser from django.contrib.auth.models import AbstractUser
from django.db import models from django.db import models
@ -9,9 +10,9 @@ class User(AbstractUser):
""" """
def __str__(self): def __str__(self):
if self.userprofile.display_name: try:
return self.userprofile.display_name return self.userprofile.display_name
else: except ObjectDoesNotExist:
return self.username return self.username
@ -78,4 +79,7 @@ class UserProfile(TimeStampedModel, ContactModel, AddressModel):
if self.display_name: if self.display_name:
return self.display_name return self.display_name
else: else:
try:
return self.user.username return self.user.username
except ObjectDoesNotExist:
return "No username"

View file

@ -6,12 +6,19 @@ from .models import UserProfile
@receiver(post_save, sender=User) @receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs): def handle_profile(sender, instance, **kwargs):
if created:
"""Method for when a User is saved.
If the user is being created, then create a matching UserProfile. Otherwise
save an updated profile or create one if it doesn't exist.
"""
if kwargs.get("created", False):
UserProfile.objects.create(user=instance) UserProfile.objects.create(user=instance)
else:
# the user is not being created.
@receiver(post_save, sender=User) if hasattr(instance, "userprofile"):
def save_profile(sender, instance, **kwargs):
# instance is a User, it has a profile from the one-to-one relation
instance.userprofile.save() instance.userprofile.save()
else:
UserProfile.objects.create(user=instance)

View file

@ -15,7 +15,6 @@ class HealthTest(TestCase):
class LoggedInTests(TestCase): class LoggedInTests(TestCase):
def setUp(self): def setUp(self):
username = "test_user" username = "test_user"
first_name = "First" first_name = "First"
@ -24,7 +23,7 @@ class LoggedInTests(TestCase):
self.user = get_user_model().objects.create( self.user = get_user_model().objects.create(
username=username, first_name=first_name, last_name=last_name, email=email username=username, first_name=first_name, last_name=last_name, email=email
) )
profile = UserProfile.objects.create(user=self.user) self.profile = UserProfile.objects.create(user=self.user)
self.client.force_login(self.user) self.client.force_login(self.user)
def test_edit_profile(self): def test_edit_profile(self):

View file

@ -1,4 +1,3 @@
from django.shortcuts import redirect, render from django.shortcuts import redirect, render
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib import messages from django.contrib import messages
@ -8,13 +7,16 @@ from ..forms import EditProfileForm
@login_required @login_required
def edit_profile(request): def edit_profile(request):
"""View for a profile editing page."""
if request.method == "POST": if request.method == "POST":
# post to this view when changes are made # post to this view when changes are made
profile_form = EditProfileForm(request.POST, instance=request.user.userprofile) profile_form = EditProfileForm(request.POST, instance=request.user.userprofile)
if profile_form.is_valid(): if profile_form.is_valid():
profile_form.save() profile_form.save()
messages.success(request, 'Your profile is updated successfully') messages.success(request, "Your profile is updated successfully")
return redirect(to='edit-profile') return redirect(to="edit-profile")
else: else:
profile_form = EditProfileForm(instance=request.user.userprofile) profile_form = EditProfileForm(instance=request.user.userprofile)
return render(request, 'profile.html', {'profile_form': profile_form}) return render(request, "profile.html", {"profile_form": profile_form})