diff --git a/photo/models.py b/photo/models.py index 85d4a52..c40b9b4 100644 --- a/photo/models.py +++ b/photo/models.py @@ -23,6 +23,15 @@ from utils.enums import ContestInternalStates +class NamedUserManager(models.Manager): + def get_queryset(self): + return super().get_queryset().exclude( + models.Q(name_first__isnull=True) | + models.Q(name_first="") | + models.Q(name_last__isnull=True) | + models.Q(name_last="") + ) + class UserManager(BaseUserManager): def create_user(self, email, password=None, **kwargs): if not email: @@ -84,6 +93,7 @@ class User(AbstractUser, SoftDeleteModel): EMAIL_FIELD = "email" REQUIRED_FIELDS = ["first_name", "last_name"] objects = UserManager() + named_users = NamedUserManager() class Meta: constraints = [ diff --git a/photo/tests/test_database/test_user_manager.py b/photo/tests/test_database/test_user_manager.py new file mode 100644 index 0000000..da92069 --- /dev/null +++ b/photo/tests/test_database/test_user_manager.py @@ -0,0 +1,53 @@ +import pytest +from django.test import TestCase + +from photo.models import User + + +class TestNamedUserManager(TestCase): + def setUp(self): + # Create users with different name combinations + self.user1 = User.objects.create_user( + email="user1@example.com", + password="password123", + name_first="John", + name_last="Doe" + ) + self.user2 = User.objects.create_user( + email="user2@example.com", + password="password123", + name_first="", + name_last="Smith" + ) + self.user3 = User.objects.create_user( + email="user3@example.com", + password="password123", + name_first="Jane", + name_last="" + ) + self.user4 = User.objects.create_user( + email="user4@example.com", + password="password123", + name_first=None, + name_last=None + ) + + def test_named_users_manager(self): + # Get all named users + named_users = User.named_users.all() + + # Should only include users with both first and last names + self.assertEqual(named_users.count(), 1) + self.assertIn(self.user1, named_users) + self.assertNotIn(self.user2, named_users) + self.assertNotIn(self.user3, named_users) + self.assertNotIn(self.user4, named_users) + + def test_default_manager_unchanged(self): + # Verify that the default manager still returns all users + all_users = User.objects.all() + self.assertEqual(all_users.count(), 4) + self.assertIn(self.user1, all_users) + self.assertIn(self.user2, all_users) + self.assertIn(self.user3, all_users) + self.assertIn(self.user4, all_users)