diff --git a/users/migrations/0008_auto_20230308_2245.py b/users/migrations/0008_auto_20230308_2245.py new file mode 100644 index 00000000..47eb0b90 --- /dev/null +++ b/users/migrations/0008_auto_20230308_2245.py @@ -0,0 +1,31 @@ +# Generated by Django 3.2.2 on 2023-03-08 22:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("users", "0007_user_image"), + ] + + operations = [ + migrations.AddField( + model_name="user", + name="claimed", + field=models.BooleanField( + default=True, + help_text="Designates whether this user has been claimed.", + verbose_name="claimed", + ), + ), + migrations.AddField( + model_name="user", + name="valid_email", + field=models.BooleanField( + default=True, + help_text="Designates whether this user's email address is valid, to the best of our knowledge.", + verbose_name="valid_email", + ), + ), + ] diff --git a/users/models.py b/users/models.py index 05f1b759..e1f14dbd 100644 --- a/users/models.py +++ b/users/models.py @@ -58,6 +58,13 @@ class UserManager(BaseUserManager): logger.info("Creating superuser with email='%s'", email) return self._create_user(email, password, **extra_fields) + def create_stub_user(self, email, password=None, claimed=False, **extra_fields): + """Creates a placeholder ("stub") user.""" + extra_fields.setdefault("is_staff", False) + extra_fields.setdefault("is_superuser", False) + logger.info("Creating stub user with email='%s'", email) + return self._create_user(email, password, claimed=claimed, **extra_fields) + def record_login(self, user=None, email=None): """ Record a succesful login to last_login for the user by user @@ -150,6 +157,18 @@ class User(BaseUser): badges = models.ManyToManyField(Badge) github_username = models.CharField(_("github username"), max_length=100, blank=True) image = models.FileField(upload_to="profile-images", null=True, blank=True) + claimed = models.BooleanField( + _("claimed"), + default=True, + help_text=_("Designates whether this user has been claimed."), + ) + valid_email = models.BooleanField( + _("valid_email"), + default=True, + help_text=_( + "Designates whether this user's email address is valid, to the best of our knowledge." + ), + ) def save_image_from_github(self, avatar_url): response = requests.get(avatar_url) diff --git a/users/tests/test_managers.py b/users/tests/test_managers.py index 38d4c25b..092f11c1 100644 --- a/users/tests/test_managers.py +++ b/users/tests/test_managers.py @@ -21,20 +21,37 @@ def test_record_login_user(user): def test_user_creation(db): u = User.objects.create_user("t1@example.com", "t1pass") - assert u.is_active == True - assert u.is_staff == False - assert u.is_superuser == False + assert u.is_active is True + assert u.is_staff is False + assert u.is_superuser is False def test_staff_user_creation(db): u = User.objects.create_staffuser("t2@example.com", "t2pass") - assert u.is_active == True - assert u.is_staff == True - assert u.is_superuser == False + assert u.is_active is True + assert u.is_staff is True + assert u.is_superuser is False def test_super_user_creation(db): u = User.objects.create_superuser("t3@example.com", "t3pass") - assert u.is_active == True - assert u.is_staff == True - assert u.is_superuser == True + assert u.is_active is True + assert u.is_staff is True + assert u.is_superuser is True + + +def test_create_stub_user(db): + u = User.objects.create_stub_user( + "t4@example.com", + None, + first_name="Tester", + last_name="Testerson", + valid_email=False, + ) + assert u.claimed is False + assert u.valid_email is False + assert u.is_active is True + assert u.is_staff is False + assert u.is_superuser is False + assert u.first_name == "Tester" + assert u.last_name == "Testerson"