Browse Source

fix #727: the grand get_user_model cleanup

Rafał Pitoń 8 years ago
parent
commit
32980c25d0
75 changed files with 508 additions and 480 deletions
  1. 7 8
      misago/admin/tests/test_admin_views.py
  2. 5 6
      misago/core/testproject/views.py
  3. 9 8
      misago/core/tests/test_mailer.py
  4. 3 2
      misago/datamover/views.py
  5. 7 5
      misago/faker/management/commands/createfakefollowers.py
  6. 8 5
      misago/faker/management/commands/createfakethreads.py
  7. 4 2
      misago/faker/management/commands/createfakeusers.py
  8. 4 4
      misago/markup/mentions.py
  9. 4 2
      misago/markup/tests/test_parser.py
  10. 5 2
      misago/readtracker/tests/test_readtracker.py
  11. 4 1
      misago/threads/api/postingendpoint/participants.py
  12. 4 3
      misago/threads/api/threadendpoints/patch.py
  13. 4 2
      misago/threads/participants.py
  14. 4 1
      misago/threads/tests/test_emailnotification_middleware.py
  15. 5 2
      misago/threads/tests/test_events.py
  16. 25 31
      misago/threads/tests/test_participants.py
  17. 8 8
      misago/threads/tests/test_post_mentions.py
  18. 5 4
      misago/threads/tests/test_post_model.py
  19. 28 41
      misago/threads/tests/test_privatethread_patch_api.py
  20. 6 5
      misago/threads/tests/test_privatethread_reply_api.py
  21. 7 10
      misago/threads/tests/test_privatethread_start_api.py
  22. 4 2
      misago/threads/tests/test_sync_unread_private_threads.py
  23. 11 9
      misago/threads/tests/test_thread_model.py
  24. 5 4
      misago/threads/tests/test_thread_pollvotes_api.py
  25. 9 9
      misago/threads/tests/test_threadparticipant_model.py
  26. 7 4
      misago/threads/testutils.py
  27. 4 1
      misago/users/activepostersranking.py
  28. 2 2
      misago/users/admin.py
  29. 5 4
      misago/users/api/auth.py
  30. 4 1
      misago/users/api/userendpoints/list.py
  31. 4 1
      misago/users/api/usernamechanges.py
  32. 4 1
      misago/users/api/users.py
  33. 3 3
      misago/users/authbackends.py
  34. 3 4
      misago/users/djangoadmin.py
  35. 6 4
      misago/users/forms/auth.py
  36. 3 1
      misago/users/forms/register.py
  37. 6 6
      misago/users/management/commands/createsuperuser.py
  38. 4 3
      misago/users/management/commands/populateonlinetracker.py
  39. 5 2
      misago/users/management/commands/synchronizeusers.py
  40. 3 2
      misago/users/search.py
  41. 16 17
      misago/users/tests/test_activation_views.py
  42. 5 3
      misago/users/tests/test_activepostersranking.py
  43. 13 19
      misago/users/tests/test_auth_api.py
  44. 2 2
      misago/users/tests/test_auth_backend.py
  45. 8 7
      misago/users/tests/test_avatars.py
  46. 4 2
      misago/users/tests/test_avatarserver_views.py
  47. 7 6
      misago/users/tests/test_bans.py
  48. 4 2
      misago/users/tests/test_commands.py
  49. 4 1
      misago/users/tests/test_createsuperuser.py
  50. 4 2
      misago/users/tests/test_credentialchange.py
  51. 4 3
      misago/users/tests/test_djangoadmin_user.py
  52. 7 8
      misago/users/tests/test_forgottenpassword_views.py
  53. 5 4
      misago/users/tests/test_invalidatebans.py
  54. 7 8
      misago/users/tests/test_lists_views.py
  55. 3 1
      misago/users/tests/test_misagoavatars_tags.py
  56. 4 2
      misago/users/tests/test_namechanges.py
  57. 4 3
      misago/users/tests/test_populateonlinetracker.py
  58. 19 18
      misago/users/tests/test_profile_views.py
  59. 4 2
      misago/users/tests/test_search.py
  60. 4 2
      misago/users/tests/test_signatures.py
  61. 5 4
      misago/users/tests/test_tokens.py
  62. 6 8
      misago/users/tests/test_user_avatar_api.py
  63. 4 2
      misago/users/tests/test_user_changeemail_api.py
  64. 9 9
      misago/users/tests/test_user_create_api.py
  65. 5 4
      misago/users/tests/test_user_username_api.py
  66. 38 56
      misago/users/tests/test_useradmin_views.py
  67. 19 27
      misago/users/tests/test_users_api.py
  68. 6 6
      misago/users/tests/test_validators.py
  69. 6 7
      misago/users/testutils.py
  70. 6 6
      misago/users/validators.py
  71. 5 3
      misago/users/views/activation.py
  72. 7 7
      misago/users/views/admin/users.py
  73. 11 9
      misago/users/views/avatarserver.py
  74. 1 2
      misago/users/views/forgottenpassword.py
  75. 4 3
      misago/users/views/profile.py

+ 7 - 8
misago/admin/tests/test_admin_views.py

@@ -9,6 +9,9 @@ from ..testutils import AdminTestCase
 from ..views import get_protected_namespace
 
 
+UserModel = get_user_model()
+
+
 class FakeRequest(object):
     def __init__(self, path):
         self.path = path
@@ -64,8 +67,7 @@ class AdminLoginViewTests(TestCase):
 
     def test_login_denies_non_staff_non_superuser(self):
         """login rejects user thats non staff and non superuser"""
-        User = get_user_model()
-        user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
+        user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
 
         user.is_staff = False
         user.is_superuser = False
@@ -79,8 +81,7 @@ class AdminLoginViewTests(TestCase):
 
     def test_login_denies_non_staff_superuser(self):
         """login rejects user thats non staff and superuser"""
-        User = get_user_model()
-        user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
+        user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
 
         user.is_staff = False
         user.is_superuser = True
@@ -94,8 +95,7 @@ class AdminLoginViewTests(TestCase):
 
     def test_login_signs_in_staff_non_superuser(self):
         """login passess user thats staff and non superuser"""
-        User = get_user_model()
-        user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
+        user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
 
         user.is_staff = True
         user.is_superuser = False
@@ -109,8 +109,7 @@ class AdminLoginViewTests(TestCase):
 
     def test_login_signs_in_staff_superuser(self):
         """login passess user thats staff and superuser"""
-        User = get_user_model()
-        user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
+        user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
 
         user.is_staff = True
         user.is_superuser = True

+ 5 - 6
misago/core/testproject/views.py

@@ -15,10 +15,11 @@ from .models import Model
 from .serializers import MockSerializer
 
 
-def test_mail_user(request):
-    User = get_user_model()
+UserModel = get_user_model()
+
 
-    test_user = User.objects.all().first()
+def test_mail_user(request):
+    test_user = UserModel.objects.all().first()
     mail.mail_user(request,
                    test_user,
                    "Misago Test Mail",
@@ -28,10 +29,8 @@ def test_mail_user(request):
 
 
 def test_mail_users(request):
-    User = get_user_model()
-
     mail.mail_users(request,
-                    User.objects.iterator(),
+                    UserModel.objects.iterator(),
                     "Misago Test Spam",
                     "misago/emails/base")
 

+ 9 - 8
misago/core/tests/test_mailer.py

@@ -4,12 +4,14 @@ from django.test import TestCase, override_settings
 from django.urls import reverse
 
 
+UserModel = get_user_model()
+
+
 @override_settings(ROOT_URLCONF='misago.core.testproject.urls')
 class MisagoMailerTests(TestCase):
     def test_mail_user(self):
         """mail_user sets message in backend"""
-        User = get_user_model()
-        user = User.objects.create_user('Bob', 'bob@bob.com', 'pass123')
+        user = UserModel.objects.create_user('Bob', 'bob@bob.com', 'pass123')
 
         response = self.client.get(reverse('test-mail-user'))
         self.assertEqual(response.status_code, 200)
@@ -27,13 +29,12 @@ class MisagoMailerTests(TestCase):
 
     def test_mail_users(self):
         """mail_users sets messages in backend"""
-        User = get_user_model()
         test_users = (
-            User.objects.create_user('Alpha', 'alpha@test.com', 'pass123'),
-            User.objects.create_user('Beta', 'beta@test.com', 'pass123'),
-            User.objects.create_user('Niner', 'niner@test.com', 'pass123'),
-            User.objects.create_user('Foxtrot', 'foxtrot@test.com', 'pass123'),
-            User.objects.create_user('Uniform', 'uniform@test.com', 'pass123'),
+            UserModel.objects.create_user('Alpha', 'alpha@test.com', 'pass123'),
+            UserModel.objects.create_user('Beta', 'beta@test.com', 'pass123'),
+            UserModel.objects.create_user('Niner', 'niner@test.com', 'pass123'),
+            UserModel.objects.create_user('Foxtrot', 'foxtrot@test.com', 'pass123'),
+            UserModel.objects.create_user('Uniform', 'uniform@test.com', 'pass123'),
         )
 
         response = self.client.get(reverse('test-mail-users'))

+ 3 - 2
misago/datamover/views.py

@@ -7,6 +7,9 @@ from misago.threads.viewmodels import (
 from .models import OldIdRedirect
 
 
+UserModel = get_user_model()
+
+
 def category_redirect(request, **kwargs):
     category_pk = get_new_id_or_404(OldIdRedirect.CATEGORY, kwargs['forum'])
     category = ThreadsCategory(request, pk=category_pk)
@@ -39,8 +42,6 @@ def private_thread_redirect(request, **kwargs):
 
 def user_redirect(request, **kwargs):
     user_pk = get_new_id_or_404(OldIdRedirect.USER, kwargs['user'])
-
-    UserModel = get_user_model()
     user = get_object_or_404(UserModel, pk=user_pk)
 
     return redirect(user.get_absolute_url(), permanent=True)

+ 7 - 5
misago/faker/management/commands/createfakefollowers.py

@@ -7,12 +7,14 @@ from django.core.management.base import BaseCommand
 from misago.core.management.progressbar import show_progress
 
 
+UserModel = get_user_model()
+
+
 class Command(BaseCommand):
     help = 'Adds random followers for testing purposes'
 
     def handle(self, *args, **options):
-        User = get_user_model()
-        total_users = User.objects.count()
+        total_users = UserModel.objects.count()
 
         message = 'Adding fake followers to %s users...\n'
         self.stdout.write(message % total_users)
@@ -24,7 +26,7 @@ class Command(BaseCommand):
 
         start_time = time.time()
         show_progress(self, processed_count, total_users)
-        for user in User.objects.iterator():
+        for user in UserModel.objects.iterator():
             user.followed_by.clear()
 
             if random.randint(1, 100) > 10:
@@ -33,7 +35,7 @@ class Command(BaseCommand):
                 continue # 10% active users
 
             users_to_add = random.randint(1, total_users / 5)
-            random_queryset = User.objects.exclude(id=user.id).order_by('?')
+            random_queryset = UserModel.objects.exclude(id=user.id).order_by('?')
             while users_to_add > 0:
                 new_follower = random_queryset[:1][0]
                 if not new_follower.is_following(user):
@@ -45,7 +47,7 @@ class Command(BaseCommand):
             show_progress(self, processed_count, total_users)
 
         self.stdout.write('\nSyncing models...')
-        for user in User.objects.iterator():
+        for user in UserModel.objects.iterator():
             user.followers = user.followed_by.count()
             user.following = user.follows.count()
             user.save(update_fields=['followers', 'following'])

+ 8 - 5
misago/faker/management/commands/createfakethreads.py

@@ -21,6 +21,10 @@ from ...englishcorpus import EnglishCorpus
 
 PLACEKITTEN_URL = 'https://placekitten.com/g/%s/%s'
 
+
+UserModel = get_user_model()
+
+
 corpus = EnglishCorpus()
 corpus_short = EnglishCorpus(max_length=150)
 
@@ -44,8 +48,7 @@ class Command(BaseCommand):
 
         fake = Factory.create()
 
-        User = get_user_model()
-        total_users = User.objects.count()
+        total_users = UserModel.objects.count()
 
         self.stdout.write('Creating fake threads...\n')
 
@@ -59,7 +62,7 @@ class Command(BaseCommand):
             with atomic():
                 datetime = timezone.now()
                 category = random.choice(categories)
-                user = User.objects.order_by('?')[:1][0]
+                user = UserModel.objects.order_by('?')[:1][0]
 
                 thread_is_unapproved = random.randint(0, 100) > 90
                 thread_is_hidden = random.randint(0, 100) > 90
@@ -115,7 +118,7 @@ class Command(BaseCommand):
 
                 for x in range(thread_replies):
                     datetime = timezone.now()
-                    user = User.objects.order_by('?')[:1][0]
+                    user = UserModel.objects.order_by('?')[:1][0]
 
                     original, parsed = self.fake_post_content()
 
@@ -143,7 +146,7 @@ class Command(BaseCommand):
                         post.is_hidden = True
 
                         if random.randint(0, 100) < 80:
-                            user = User.objects.order_by('?')[:1][0]
+                            user = UserModel.objects.order_by('?')[:1][0]
                             post.hidden_by = user
                             post.hidden_by_name = user.username
                             post.hidden_by_slug = user.username

+ 4 - 2
misago/faker/management/commands/createfakeusers.py

@@ -15,6 +15,9 @@ from misago.users.avatars import dynamic, gallery
 from misago.users.models import Rank
 
 
+UserModel = get_user_model()
+
+
 class Command(BaseCommand):
     help = "Creates fake users for dev and testing purposes."
 
@@ -31,7 +34,6 @@ class Command(BaseCommand):
         items_to_create = options['users']
 
         fake = Factory.create()
-        User = get_user_model()
 
         ranks = [r for r in Rank.objects.all()]
 
@@ -50,7 +52,7 @@ class Command(BaseCommand):
                     'rank': random.choice(ranks),
                 }
 
-                user = User.objects.create_user(
+                user = UserModel.objects.create_user(
                     fake.first_name(), fake.email(), 'pass123',
                     set_default_avatar=False, **kwargs)
 

+ 4 - 4
misago/markup/mentions.py

@@ -40,6 +40,8 @@ def add_mentions_to_element(request, element, mentions_dict):
 
 
 def parse_string(request, element, mentions_dict):
+    UserModel = get_user_model()
+
     def replace_mentions(matchobj):
         if len(mentions_dict) >= MENTIONS_LIMIT:
             return matchobj.group(0)
@@ -50,11 +52,9 @@ def parse_string(request, element, mentions_dict):
             if username == request.user.slug:
                 mentions_dict[username] = request.user
             else:
-                User = get_user_model()
-
                 try:
-                    mentions_dict[username] = User.objects.get(slug=username)
-                except User.DoesNotExist:
+                    mentions_dict[username] = UserModel.objects.get(slug=username)
+                except UserModel.DoesNotExist:
                     mentions_dict[username] = None
 
         if mentions_dict[username]:

+ 4 - 2
misago/markup/tests/test_parser.py

@@ -7,6 +7,9 @@ from django.test import TestCase
 from ..parser import parse
 
 
+UserModel = get_user_model()
+
+
 class MockRequest(object):
     scheme = 'http'
 
@@ -108,8 +111,7 @@ Lorem ipsum.
 
     def test_complex_paragraph(self):
         """parser minifies complex paragraph"""
-        User = get_user_model()
-        user = User.objects.create_user('Bob', 'bob@test.com', 'Pass123')
+        user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass123')
 
         test_text = """
 Hey there @{}, how's going?

+ 5 - 2
misago/readtracker/tests/test_readtracker.py

@@ -12,13 +12,16 @@ from misago.users.models import AnonymousUser
 from .. import categoriestracker, threadstracker
 
 
+UserModel = get_user_model()
+
+
 class ReadTrackerTests(TestCase):
     def setUp(self):
         self.categories = list(Category.objects.all_categories()[:1])
         self.category = self.categories[0]
 
-        User = get_user_model()
-        self.user = User.objects.create_user("Bob", "bob@test.com", "Pass.123")
+        self.user = UserModel.objects.create_user(
+            "Bob", "bob@test.com", "Pass.123")
         self.anon = AnonymousUser()
 
     def post_thread(self, datetime):

+ 4 - 1
misago/threads/api/postingendpoint/participants.py

@@ -13,6 +13,9 @@ from ...participants import add_participants, set_owner
 from ...permissions import allow_message_user
 
 
+UserModel = get_user_model()
+
+
 class ParticipantsMiddleware(PostingMiddleware):
     def use_this_middleware(self):
         if self.mode == PostingEndpoint.START:
@@ -69,7 +72,7 @@ class ParticipantsSerializer(serializers.Serializer):
 
     def get_users(self, usernames):
         users = []
-        for user in get_user_model().objects.filter(slug__in=usernames):
+        for user in UserModel.objects.filter(slug__in=usernames):
             try:
                 allow_message_user(self.context['user'], user)
             except PermissionDenied as e:

+ 4 - 3
misago/threads/api/threadendpoints/patch.py

@@ -23,6 +23,8 @@ from ...utils import add_categories_to_items
 from ...validators import validate_title
 
 
+UserModel = get_user_model()
+
 thread_patch_dispatcher = ApiPatch()
 
 
@@ -203,14 +205,13 @@ thread_patch_dispatcher.replace('subscription', patch_subscription)
 def patch_add_participant(request, thread, value):
     allow_add_participants(request.user, thread)
 
-    User = get_user_model()
     try:
         username = six.text_type(value).strip().lower()
         if not username:
             raise PermissionDenied(
                 _("You have to enter new participant's username."))
-        participant = User.objects.get(slug=username)
-    except User.DoesNotExist:
+        participant = UserModel.objects.get(slug=username)
+    except UserModel.DoesNotExist:
         raise PermissionDenied(_("No user with such name exists."))
 
     if participant in [p.user for p in thread.participants_list]:

+ 4 - 2
misago/threads/participants.py

@@ -8,6 +8,9 @@ from .events import record_event
 from .models import ThreadParticipant
 
 
+UserModel = get_user_model()
+
+
 def has_participants(thread):
     return thread.threadparticipant_set.exists()
 
@@ -62,8 +65,7 @@ def set_users_unread_private_threads_sync(
     if not users_ids:
         return
 
-    User = get_user_model()
-    User.objects.filter(id__in=set(users_ids)).update(
+    UserModel.objects.filter(id__in=set(users_ids)).update(
         sync_unread_private_threads=True
     )
 

+ 4 - 1
misago/threads/tests/test_emailnotification_middleware.py

@@ -17,6 +17,9 @@ from misago.users.testutils import AuthenticatedUserTestCase
 from .. import testutils
 
 
+UserModel = get_user_model()
+
+
 class EmailNotificationTests(AuthenticatedUserTestCase):
     def setUp(self):
         super(EmailNotificationTests, self).setUp()
@@ -32,7 +35,7 @@ class EmailNotificationTests(AuthenticatedUserTestCase):
             'thread_pk': self.thread.pk
         })
 
-        self.other_user = get_user_model().objects.create_user(
+        self.other_user = UserModel.objects.create_user(
             'Bob', 'bob@boberson.com', 'pass123')
 
     def override_acl(self):

+ 5 - 2
misago/threads/tests/test_events.py

@@ -13,6 +13,9 @@ from ..models import Post, Thread
 from ..testutils import reply_thread
 
 
+UserModel = get_user_model()
+
+
 class MockRequest(object):
     def __init__(self, user):
         self.user = user
@@ -21,8 +24,8 @@ class MockRequest(object):
 
 class EventsAPITests(TestCase):
     def setUp(self):
-        User = get_user_model()
-        self.user = User.objects.create_user("Bob", "bob@bob.com", "Pass.123")
+        self.user = UserModel.objects.create_user(
+            "Bob", "bob@bob.com", "Pass.123")
 
         datetime = timezone.now()
 

+ 25 - 31
misago/threads/tests/test_participants.py

@@ -13,6 +13,9 @@ from ..participants import (
 )
 
 
+UserModel = get_user_model()
+
+
 class ParticipantsTests(TestCase):
     def setUp(self):
         datetime = timezone.now()
@@ -49,10 +52,9 @@ class ParticipantsTests(TestCase):
 
     def test_has_participants(self):
         """has_participants returns true if thread has participants"""
-        User = get_user_model()
         users = [
-            User.objects.create_user("Bob", "bob@boberson.com", "Pass.123"),
-            User.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123"),
+            UserModel.objects.create_user("Bob", "bob@boberson.com", "Pass.123"),
+            UserModel.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123"),
         ]
 
         self.assertFalse(has_participants(self.thread))
@@ -68,9 +70,8 @@ class ParticipantsTests(TestCase):
         make_participants_aware sets participants_list and participant
         annotations on list of threads
         """
-        User = get_user_model()
-        user = User.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
-        other_user = User.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123")
+        user = UserModel.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
+        other_user = UserModel.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123")
 
         self.assertFalse(hasattr(self.thread, 'participants_list'))
         self.assertFalse(hasattr(self.thread, 'participant'))
@@ -94,9 +95,8 @@ class ParticipantsTests(TestCase):
         make_participants_aware sets participants_list and participant
         annotations on thread model
         """
-        User = get_user_model()
-        user = User.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
-        other_user = User.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123")
+        user = UserModel.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
+        other_user = UserModel.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123")
 
         self.assertFalse(hasattr(self.thread, 'participants_list'))
         self.assertFalse(hasattr(self.thread, 'participant'))
@@ -123,8 +123,7 @@ class ParticipantsTests(TestCase):
 
     def test_set_owner(self):
         """set_owner sets user as thread owner"""
-        User = get_user_model()
-        user = User.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
+        user = UserModel.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
 
         set_owner(self.thread, user)
 
@@ -136,70 +135,65 @@ class ParticipantsTests(TestCase):
         set_users_unread_private_threads_sync sets sync_unread_private_threads
         flag on users provided to true
         """
-        User = get_user_model()
         users = [
-            User.objects.create_user("Bob1", "bob1@boberson.com", "Pass.123"),
-            User.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123"),
+            UserModel.objects.create_user("Bob1", "bob1@boberson.com", "Pass.123"),
+            UserModel.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123"),
         ]
 
         set_users_unread_private_threads_sync(users=users)
         for user in users:
-            User.objects.get(pk=user.pk, sync_unread_private_threads=True)
+            UserModel.objects.get(pk=user.pk, sync_unread_private_threads=True)
 
     def test_set_participants_unread_private_threads_sync(self):
         """
         set_users_unread_private_threads_sync sets sync_unread_private_threads
         flag on participants provided to true
         """
-        User = get_user_model()
         users = [
-            User.objects.create_user("Bob1", "bob1@boberson.com", "Pass.123"),
-            User.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123"),
+            UserModel.objects.create_user("Bob1", "bob1@boberson.com", "Pass.123"),
+            UserModel.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123"),
         ]
 
         participants = [ThreadParticipant(user=u) for u in users]
 
         set_users_unread_private_threads_sync(participants=participants)
         for user in users:
-            User.objects.get(pk=user.pk, sync_unread_private_threads=True)
+            UserModel.objects.get(pk=user.pk, sync_unread_private_threads=True)
 
     def test_set_participants_users_unread_private_threads_sync(self):
         """
         set_users_unread_private_threads_sync sets sync_unread_private_threads
         flag on users and participants provided to true
         """
-        User = get_user_model()
         users = [
-            User.objects.create_user("Bob1", "bob1@boberson.com", "Pass.123"),
+            UserModel.objects.create_user("Bob1", "bob1@boberson.com", "Pass.123"),
         ]
 
         participants = [ThreadParticipant(user=u) for u in users]
 
-        users.append(User.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123"))
+        users.append(UserModel.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123"))
 
         set_users_unread_private_threads_sync(users=users, participants=participants)
         for user in users:
-            User.objects.get(pk=user.pk, sync_unread_private_threads=True)
+            UserModel.objects.get(pk=user.pk, sync_unread_private_threads=True)
 
     def test_set_users_unread_private_threads_sync_exclude_user(self):
         """exclude_user kwarg works"""
-        User = get_user_model()
         users = [
-            User.objects.create_user("Bob1", "bob1@boberson.com", "Pass.123"),
-            User.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123")
+            UserModel.objects.create_user("Bob1", "bob1@boberson.com", "Pass.123"),
+            UserModel.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123")
         ]
 
         set_users_unread_private_threads_sync(users=users, exclude_user=users[0])
 
-        self.assertFalse(User.objects.get(pk=users[0].pk).sync_unread_private_threads)
-        self.assertTrue(User.objects.get(pk=users[1].pk).sync_unread_private_threads)
+        self.assertFalse(UserModel.objects.get(pk=users[0].pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=users[1].pk).sync_unread_private_threads)
 
     def test_set_users_unread_private_threads_sync_noop(self):
         """excluding only user is noop"""
-        User = get_user_model()
-        user = User.objects.create_user("Bob1", "bob1@boberson.com", "Pass.123")
+        user = UserModel.objects.create_user("Bob1", "bob1@boberson.com", "Pass.123")
 
         with self.assertNumQueries(0):
             set_users_unread_private_threads_sync(users=[user], exclude_user=user)
 
-        self.assertFalse(User.objects.get(pk=user.pk).sync_unread_private_threads)
+        self.assertFalse(UserModel.objects.get(pk=user.pk).sync_unread_private_threads)

+ 8 - 8
misago/threads/tests/test_post_mentions.py

@@ -13,6 +13,9 @@ from misago.users.testutils import AuthenticatedUserTestCase
 from .. import testutils
 
 
+UserModel = get_user_model()
+
+
 class PostMentionsTests(AuthenticatedUserTestCase):
     def setUp(self):
         super(PostMentionsTests, self).setUp()
@@ -77,9 +80,8 @@ class PostMentionsTests(AuthenticatedUserTestCase):
         """endpoint mentions limits mentions to 24 users"""
         users = []
 
-        User = get_user_model()
         for i in range(MENTIONS_LIMIT + 5):
-            users.append(User.objects.create_user(
+            users.append(UserModel.objects.create_user(
                 'Mention{}'.format(i),
                 'mention{}@bob.com'.format(i),
                 'pass123'
@@ -98,9 +100,8 @@ class PostMentionsTests(AuthenticatedUserTestCase):
 
     def test_mention_update(self):
         """edit post endpoint updates mentions"""
-        User = get_user_model()
-        user_a = User.objects.create_user('Mention', 'mention@test.com', 'pass123')
-        user_b = User.objects.create_user('MentionB', 'mentionb@test.com', 'pass123')
+        user_a = UserModel.objects.create_user('Mention', 'mention@test.com', 'pass123')
+        user_b = UserModel.objects.create_user('MentionB', 'mentionb@test.com', 'pass123')
 
         response = self.client.post(self.post_link, data={
             'post': "This is test response, @{}!".format(user_a)
@@ -149,9 +150,8 @@ class PostMentionsTests(AuthenticatedUserTestCase):
 
     def test_mentions_merge(self):
         """posts merge sums mentions"""
-        User = get_user_model()
-        user_a = User.objects.create_user('Mention', 'mention@test.com', 'pass123')
-        user_b = User.objects.create_user('MentionB', 'mentionb@test.com', 'pass123')
+        user_a = UserModel.objects.create_user('Mention', 'mention@test.com', 'pass123')
+        user_b = UserModel.objects.create_user('MentionB', 'mentionb@test.com', 'pass123')
 
         response = self.client.post(self.post_link, data={
             'post': "This is test response, @{}!".format(user_a)

+ 5 - 4
misago/threads/tests/test_post_model.py

@@ -10,10 +10,12 @@ from ..checksums import update_post_checksum
 from ..models import Post, Thread
 
 
+UserModel = get_user_model()
+
+
 class PostModelTests(TestCase):
     def setUp(self):
-        User = get_user_model()
-        self.user = User.objects.create_user("Bob", "bob@bob.com", "Pass.123")
+        self.user = UserModel.objects.create_user("Bob", "bob@bob.com", "Pass.123")
 
         datetime = timezone.now()
 
@@ -57,8 +59,7 @@ class PostModelTests(TestCase):
         with self.assertRaises(ValueError):
             self.post.merge(self.post)
 
-        User = get_user_model()
-        other_user = User.objects.create_user("Jeff", "Je@ff.com", "Pass.123")
+        other_user = UserModel.objects.create_user("Jeff", "Je@ff.com", "Pass.123")
 
         other_thread = Thread.objects.create(
             category=self.category,

+ 28 - 41
misago/threads/tests/test_privatethread_patch_api.py

@@ -10,6 +10,9 @@ from ..models import Thread, ThreadParticipant
 from .test_privatethreads import PrivateThreadsTestCase
 
 
+UserModel = get_user_model()
+
+
 class PrivateThreadPatchApiTestCase(PrivateThreadsTestCase):
     def setUp(self):
         super(PrivateThreadPatchApiTestCase, self).setUp()
@@ -17,8 +20,7 @@ class PrivateThreadPatchApiTestCase(PrivateThreadsTestCase):
         self.thread = testutils.post_thread(self.category, poster=self.user)
         self.api_link = self.thread.get_api_url()
 
-        User = get_user_model()
-        self.other_user = User.objects.create_user(
+        self.other_user = UserModel.objects.create_user(
             'BobBoberson', 'bob@boberson.com', 'pass123')
 
     def patch(self, api_link, ops):
@@ -99,9 +101,8 @@ class PrivateThreadAddParticipantApiTests(PrivateThreadPatchApiTestCase):
         """can't add user that is already participant"""
         ThreadParticipant.objects.set_owner(self.thread, self.user)
 
-        User = get_user_model()
         for i in range(self.user.acl['max_private_thread_participants']):
-            user = User.objects.create_user(
+            user = UserModel.objects.create_user(
                 'User{}'.format(i), 'user{}@example.com'.format(i), 'Pass.123')
             ThreadParticipant.objects.add_participants(self.thread, [user])
 
@@ -281,9 +282,8 @@ class PrivateThreadRemoveParticipantApiTests(PrivateThreadPatchApiTestCase):
         self.assertTrue(event.event_type, 'participant_left')
 
         # valid users were flagged for sync
-        User = get_user_model()
-        self.assertTrue(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
-        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
 
         # user was removed from participation
         self.assertEqual(self.thread.participants.count(), 1)
@@ -316,9 +316,8 @@ class PrivateThreadRemoveParticipantApiTests(PrivateThreadPatchApiTestCase):
         self.assertTrue(event.event_type, 'participant_left')
 
         # valid users were flagged for sync
-        User = get_user_model()
-        self.assertTrue(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
-        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
 
         # user was removed from participation
         self.assertEqual(self.thread.participants.count(), 1)
@@ -326,8 +325,7 @@ class PrivateThreadRemoveParticipantApiTests(PrivateThreadPatchApiTestCase):
 
     def test_moderator_remove_user(self):
         """api allows moderator to remove other user"""
-        User = get_user_model()
-        removed_user = User.objects.create_user(
+        removed_user = UserModel.objects.create_user(
             'Vigilante', 'test@test.com', 'pass123')
 
         ThreadParticipant.objects.set_owner(self.thread, self.other_user)
@@ -353,10 +351,9 @@ class PrivateThreadRemoveParticipantApiTests(PrivateThreadPatchApiTestCase):
         self.assertTrue(event.event_type, 'participant_removed')
 
         # valid users were flagged for sync
-        User = get_user_model()
-        self.assertTrue(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
-        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
-        self.assertTrue(User.objects.get(pk=removed_user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=removed_user.pk).sync_unread_private_threads)
 
         # user was removed from participation
         self.assertEqual(self.thread.participants.count(), 2)
@@ -383,9 +380,8 @@ class PrivateThreadRemoveParticipantApiTests(PrivateThreadPatchApiTestCase):
         self.assertTrue(event.event_type, 'participant_removed')
 
         # valid users were flagged for sync
-        User = get_user_model()
-        self.assertTrue(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
-        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
 
         # user was removed from participation
         self.assertEqual(self.thread.participants.count(), 1)
@@ -412,9 +408,8 @@ class PrivateThreadRemoveParticipantApiTests(PrivateThreadPatchApiTestCase):
         self.assertTrue(event.event_type, 'owner_left')
 
         # valid users were flagged for sync
-        User = get_user_model()
-        self.assertTrue(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
-        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
 
         # user was removed from participation
         self.assertEqual(self.thread.participants.count(), 1)
@@ -436,8 +431,7 @@ class PrivateThreadRemoveParticipantApiTests(PrivateThreadPatchApiTestCase):
             Thread.objects.get(pk=self.thread.pk)
 
         # valid users were flagged for sync
-        User = get_user_model()
-        self.assertTrue(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=self.user.pk).sync_unread_private_threads)
 
 
 class PrivateThreadTakeOverApiTests(PrivateThreadPatchApiTestCase):
@@ -521,10 +515,8 @@ class PrivateThreadTakeOverApiTests(PrivateThreadPatchApiTestCase):
         self.assertEqual(response.status_code, 200)
 
         # valid users were flagged for sync
-        User = get_user_model()
-
-        self.assertFalse(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
-        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
+        self.assertFalse(UserModel.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
 
         # ownership was transfered
         self.assertEqual(self.thread.participants.count(), 2)
@@ -538,8 +530,7 @@ class PrivateThreadTakeOverApiTests(PrivateThreadPatchApiTestCase):
 
     def test_moderator_change_owner(self):
         """moderator can change thread owner to other user"""
-        User = get_user_model()
-        new_owner = User.objects.create_user(
+        new_owner = UserModel.objects.create_user(
             'NewOwner', 'new@owner.com', 'pass123')
 
         ThreadParticipant.objects.set_owner(self.thread, self.other_user)
@@ -556,9 +547,9 @@ class PrivateThreadTakeOverApiTests(PrivateThreadPatchApiTestCase):
         self.assertEqual(response.status_code, 200)
 
         # valid users were flagged for sync
-        self.assertTrue(User.objects.get(pk=new_owner.pk).sync_unread_private_threads)
-        self.assertFalse(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
-        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=new_owner.pk).sync_unread_private_threads)
+        self.assertFalse(UserModel.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
 
         # ownership was transfered
         self.assertEqual(self.thread.participants.count(), 3)
@@ -587,10 +578,8 @@ class PrivateThreadTakeOverApiTests(PrivateThreadPatchApiTestCase):
         self.assertEqual(response.status_code, 200)
 
         # valid users were flagged for sync
-        User = get_user_model()
-
-        self.assertFalse(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
-        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
+        self.assertFalse(UserModel.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
 
         # ownership was transfered
         self.assertEqual(self.thread.participants.count(), 2)
@@ -621,10 +610,8 @@ class PrivateThreadTakeOverApiTests(PrivateThreadPatchApiTestCase):
         self.assertEqual(response.status_code, 200)
 
         # valid users were flagged for sync
-        User = get_user_model()
-
-        self.assertFalse(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
-        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
+        self.assertFalse(UserModel.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
 
         # ownership was transfered
         self.assertEqual(self.thread.participants.count(), 2)

+ 6 - 5
misago/threads/tests/test_privatethread_reply_api.py

@@ -7,6 +7,9 @@ from ..models import ThreadParticipant
 from .test_privatethreads import PrivateThreadsTestCase
 
 
+UserModel = get_user_model()
+
+
 class PrivateThreadReplyApiTestCase(PrivateThreadsTestCase):
     def setUp(self):
         super(PrivateThreadReplyApiTestCase, self).setUp()
@@ -14,8 +17,7 @@ class PrivateThreadReplyApiTestCase(PrivateThreadsTestCase):
         self.thread = testutils.post_thread(self.category, poster=self.user)
         self.api_link = self.thread.get_posts_api_url()
 
-        User = get_user_model()
-        self.other_user = User.objects.create_user(
+        self.other_user = UserModel.objects.create_user(
             'BobBoberson', 'bob@boberson.com', 'pass123')
 
     def test_reply_private_thread(self):
@@ -34,6 +36,5 @@ class PrivateThreadReplyApiTestCase(PrivateThreadsTestCase):
         self.assertEqual(self.user.posts, 0)
 
         # valid user was flagged to sync
-        User = get_user_model()
-        self.assertFalse(User.objects.get(pk=self.user.pk).sync_unread_private_threads)
-        self.assertTrue(User.objects.get(pk=self.other_user.pk).sync_unread_private_threads)
+        self.assertFalse(UserModel.objects.get(pk=self.user.pk).sync_unread_private_threads)
+        self.assertTrue(UserModel.objects.get(pk=self.other_user.pk).sync_unread_private_threads)

+ 7 - 10
misago/threads/tests/test_privatethread_start_api.py

@@ -15,6 +15,9 @@ from misago.users.testutils import AuthenticatedUserTestCase
 from ..models import Thread, ThreadParticipant
 
 
+UserModel = get_user_model()
+
+
 class StartPrivateThreadTests(AuthenticatedUserTestCase):
     def setUp(self):
         super(StartPrivateThreadTests, self).setUp()
@@ -22,8 +25,7 @@ class StartPrivateThreadTests(AuthenticatedUserTestCase):
         self.category = Category.objects.private_threads()
         self.api_link = reverse('misago:api:private-thread-list')
 
-        User = get_user_model()
-        self.other_user = get_user_model().objects.create_user(
+        self.other_user = UserModel.objects.create_user(
             'BobBoberson', 'bob@boberson.com', 'pass123')
 
     def test_cant_start_thread_as_guest(self):
@@ -193,9 +195,7 @@ class StartPrivateThreadTests(AuthenticatedUserTestCase):
 
     def test_cant_invite_followers_only(self):
         """api validates that you cant invite followers-only user to thread"""
-        User = get_user_model()
-
-        user_constant = User.LIMIT_INVITES_TO_FOLLOWED
+        user_constant = UserModel.LIMIT_INVITES_TO_FOLLOWED
         self.other_user.limits_private_thread_invites_to = user_constant
         self.other_user.save()
 
@@ -247,9 +247,7 @@ class StartPrivateThreadTests(AuthenticatedUserTestCase):
 
     def test_cant_invite_anyone(self):
         """api validates that you cant invite nobody user to thread"""
-        User = get_user_model()
-
-        user_constant = User.LIMIT_INVITES_TO_NOBODY
+        user_constant = UserModel.LIMIT_INVITES_TO_NOBODY
         self.other_user.limits_private_thread_invites_to = user_constant
         self.other_user.save()
 
@@ -339,8 +337,7 @@ class StartPrivateThreadTests(AuthenticatedUserTestCase):
         )
 
         # other user has sync_unread_private_threads flag
-        User = get_user_model()
-        user_to_sync = User.objects.get(sync_unread_private_threads=True)
+        user_to_sync = UserModel.objects.get(sync_unread_private_threads=True)
         self.assertEqual(user_to_sync, self.other_user)
 
         # notification about new private thread was sent to other user

+ 4 - 2
misago/threads/tests/test_sync_unread_private_threads.py

@@ -5,12 +5,14 @@ from ..models import ThreadParticipant
 from .test_privatethreads import PrivateThreadsTestCase
 
 
+UserModel = get_user_model()
+
+
 class SyncUnreadPrivateThreadsTestCase(PrivateThreadsTestCase):
     def setUp(self):
         super(SyncUnreadPrivateThreadsTestCase, self).setUp()
 
-        User = get_user_model()
-        self.other_user = User.objects.create_user(
+        self.other_user = UserModel.objects.create_user(
             'BobBoberson', 'bob@boberson.com', 'pass123')
 
         self.thread = testutils.post_thread(self.category, poster=self.user)

+ 11 - 9
misago/threads/tests/test_thread_model.py

@@ -9,6 +9,9 @@ from misago.categories.models import Category
 from ..models import Poll, Post, Thread, ThreadParticipant
 
 
+UserModel = get_user_model()
+
+
 class ThreadModelTests(TestCase):
     def setUp(self):
         datetime = timezone.now()
@@ -45,8 +48,8 @@ class ThreadModelTests(TestCase):
 
     def test_synchronize(self):
         """synchronize method updates thread data to reflect its contents"""
-        User = get_user_model()
-        user = User.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
+        user = UserModel.objects.create_user(
+            "Bob", "bob@boberson.com", "Pass.123")
 
         self.assertEqual(self.thread.replies, 0)
 
@@ -232,8 +235,8 @@ class ThreadModelTests(TestCase):
 
     def test_set_first_post(self):
         """set_first_post sets first post and poster data on thread"""
-        User = get_user_model()
-        user = User.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
+        user = UserModel.objects.create_user(
+            "Bob", "bob@boberson.com", "Pass.123")
 
         datetime = timezone.now() + timedelta(5)
 
@@ -259,8 +262,8 @@ class ThreadModelTests(TestCase):
 
     def test_set_last_post(self):
         """set_last_post sets first post and poster data on thread"""
-        User = get_user_model()
-        user = User.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
+        user = UserModel.objects.create_user(
+            "Bob", "bob@boberson.com", "Pass.123")
 
         datetime = timezone.now() + timedelta(5)
 
@@ -350,10 +353,9 @@ class ThreadModelTests(TestCase):
         private thread gets deleted automatically
         when there are no participants left in it
         """
-        User = get_user_model()
-        user_a = User.objects.create_user(
+        user_a = UserModel.objects.create_user(
             "Bob", "bob@boberson.com", "Pass.123")
-        user_b = User.objects.create_user(
+        user_b = UserModel.objects.create_user(
             "Weebl", "weebl@weeblson.com", "Pass.123")
 
         ThreadParticipant.objects.add_participants(self.thread, [user_a, user_b])

+ 5 - 4
misago/threads/tests/test_thread_pollvotes_api.py

@@ -8,6 +8,9 @@ from ..models import Poll
 from .test_thread_poll_api import ThreadPollApiTestCase
 
 
+UserModel = get_user_model()
+
+
 class ThreadGetVotesTests(ThreadPollApiTestCase):
     def setUp(self):
         super(ThreadGetVotesTests, self).setUp()
@@ -105,8 +108,7 @@ class ThreadGetVotesTests(ThreadPollApiTestCase):
 
         self.assertEqual([[v['username'] for v in c['voters']] for c in response_json][0][0], 'bob')
 
-        User = get_user_model()
-        user =  User.objects.get(slug='bob')
+        user = UserModel.objects.get(slug='bob')
 
         self.assertEqual(
             [[v['url'] for v in c['voters']] for c in response_json][0][0], user.get_absolute_url())
@@ -132,8 +134,7 @@ class ThreadGetVotesTests(ThreadPollApiTestCase):
 
         self.assertEqual([[v['username'] for v in c['voters']] for c in response_json][0][0], 'bob')
 
-        User = get_user_model()
-        user =  User.objects.get(slug='bob')
+        user = UserModel.objects.get(slug='bob')
 
         self.assertEqual(
             [[v['url'] for v in c['voters']] for c in response_json][0][0], user.get_absolute_url())

+ 9 - 9
misago/threads/tests/test_threadparticipant_model.py

@@ -7,6 +7,9 @@ from misago.categories.models import Category
 from ..models import Post, Thread, ThreadParticipant
 
 
+UserModel = get_user_model()
+
+
 class ThreadParticipantTests(TestCase):
     def setUp(self):
         datetime = timezone.now()
@@ -43,9 +46,8 @@ class ThreadParticipantTests(TestCase):
 
     def test_set_owner(self):
         """set_owner makes user thread owner"""
-        User = get_user_model()
-        user = User.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
-        other_user = User.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123")
+        user = UserModel.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
+        other_user = UserModel.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123")
 
         ThreadParticipant.objects.set_owner(self.thread, user)
         self.assertEqual(self.thread.participants.count(), 1)
@@ -65,10 +67,9 @@ class ThreadParticipantTests(TestCase):
 
     def test_add_participants(self):
         """add_participant adds participant to thread"""
-        User = get_user_model()
         users = [
-            User.objects.create_user("Bob", "bob@boberson.com", "Pass.123"),
-            User.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123"),
+            UserModel.objects.create_user("Bob", "bob@boberson.com", "Pass.123"),
+            UserModel.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123"),
         ]
 
         ThreadParticipant.objects.add_participants(self.thread, users)
@@ -80,9 +81,8 @@ class ThreadParticipantTests(TestCase):
 
     def test_remove_participant(self):
         """remove_participant deletes participant from thread"""
-        User = get_user_model()
-        user = User.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
-        other_user = User.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123")
+        user = UserModel.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
+        other_user = UserModel.objects.create_user("Bob2", "bob2@boberson.com", "Pass.123")
 
         ThreadParticipant.objects.add_participants(self.thread, [user])
         ThreadParticipant.objects.add_participants(self.thread, [other_user])

+ 7 - 4
misago/threads/testutils.py

@@ -9,6 +9,9 @@ from .checksums import update_post_checksum
 from .models import Poll, Post, Thread
 
 
+UserModel = get_user_model()
+
+
 def post_thread(category, title='Test thread', poster='Tester',
                 is_global=False, is_pinned=False, is_unapproved=False,
                 is_hidden=False, is_closed=False, started_on=None):
@@ -134,11 +137,11 @@ def post_poll(thread, poster):
     )
 
     # one user voted for Alpha choice
-    User = get_user_model()
     try:
-        user = User.objects.get(slug='bob')
-    except User.DoesNotExist:
-        user = User.objects.create_user('bob', 'bob@test.com', 'Pass.123')
+        user = UserModel.objects.get(slug='bob')
+    except UserModel.DoesNotExist:
+        user = UserModel.objects.create_user(
+            'bob', 'bob@test.com', 'Pass.123')
 
     poll.pollvote_set.create(
         category=thread.category,

+ 4 - 1
misago/users/activepostersranking.py

@@ -10,6 +10,9 @@ from misago.conf import settings
 from .models import ActivityRanking
 
 
+UserModel = get_user_model()
+
+
 def get_active_posters_ranking():
     users = []
 
@@ -34,7 +37,7 @@ def build_active_posters_ranking():
     for category in Category.objects.all_categories():
         ranked_categories.append(category.pk)
 
-    queryset = get_user_model().objects.filter(
+    queryset = UserModel.objects.filter(
         is_active=True,
         posts__gt=0
     ).filter(

+ 2 - 2
misago/users/admin.py

@@ -2,7 +2,7 @@ from django.conf.urls import url
 from django.contrib import admin as djadmin
 from django.utils.translation import ugettext_lazy as _
 
-from .djangoadmin import User, UserAdminModel
+from .djangoadmin import UserModel, UserAdmin
 from .views.admin.bans import BansList, DeleteBan, EditBan, NewBan
 from .views.admin.ranks import (
     DefaultRank, DeleteRank, EditRank, MoveDownRank, MoveUpRank, NewRank,
@@ -12,7 +12,7 @@ from .views.admin.users import (
 
 
 # register misago user model in django admin panel
-djadmin.site.register(model_or_iterable=User, admin_class=UserAdminModel)
+djadmin.site.register(model_or_iterable=UserModel, admin_class=UserAdmin)
 
 
 class MisagoAdminExtension(object):

+ 5 - 4
misago/users/api/auth.py

@@ -18,6 +18,9 @@ from ..tokens import is_password_change_token_valid, make_activation_token, make
 from .rest_permissions import UnbannedAnonOnly, UnbannedOnly
 
 
+UserModel = auth.get_user_model()
+
+
 def gateway(request):
     if request.method == 'POST':
         return login(request)
@@ -158,15 +161,13 @@ class PasswordChangeFailed(Exception):
 @permission_classes((UnbannedOnly,))
 @csrf_protect
 def change_forgotten_password(request, pk, token):
-    User = auth.get_user_model()
-
     invalid_message = _("Form link is invalid. Please try again.")
     expired_message = _("Your link has expired. Please request new one.")
 
     try:
         try:
-            user = User.objects.get(pk=pk, is_active=True)
-        except User.DoesNotExist:
+            user = UserModel.objects.get(pk=pk, is_active=True)
+        except UserModel.DoesNotExist:
             raise PasswordChangeFailed(invalid_message)
 
         if request.user.is_authenticated and request.user.id != user.id:

+ 4 - 1
misago/users/api/userendpoints/list.py

@@ -18,6 +18,9 @@ from ...online.utils import make_users_status_aware
 from ...serializers import ScoredUserSerializer, UserSerializer
 
 
+UserModel = get_user_model()
+
+
 def active(request):
     ranking = get_active_posters_ranking()
     make_users_status_aware(request.user, ranking['users'], fetch_state=True)
@@ -35,7 +38,7 @@ def generic(request):
         page = 0 # api allows explicit first page
 
     allow_name_search = True
-    queryset = get_user_model().objects
+    queryset = UserModel.objects
 
     if not request.user.is_staff:
         queryset = queryset.filter(is_active=True)

+ 4 - 1
misago/users/api/usernamechanges.py

@@ -14,6 +14,9 @@ from ..serializers.usernamechange import UsernameChangeSerializer
 from .rest_permissions import BasePermission
 
 
+UserModel = get_user_model()
+
+
 class UsernameChangesViewSetPermission(BasePermission):
     def has_permission(self, request, view):
         try:
@@ -39,7 +42,7 @@ class UsernameChangesViewSet(viewsets.GenericViewSet):
         if self.request.query_params.get('user'):
             user_pk = get_int_or_404(self.request.query_params.get('user'))
             queryset = get_object_or_404(
-                get_user_model().objects, pk=user_pk).namechanges
+                UserModel.objects, pk=user_pk).namechanges
 
         if self.request.query_params.get('search'):
             search_phrase = self.request.query_params.get('search').strip()

+ 4 - 1
misago/users/api/users.py

@@ -37,6 +37,9 @@ from .userendpoints.signature import signature_endpoint
 from .userendpoints.username import moderate_username_endpoint, username_endpoint
 
 
+UserModel = get_user_model()
+
+
 class UserViewSetPermission(BasePermission):
     def has_permission(self, request, view):
         if view.action == 'create':
@@ -56,7 +59,7 @@ def allow_self_only(user, pk, message):
 class UserViewSet(viewsets.GenericViewSet):
     permission_classes = (UserViewSetPermission,)
     parser_classes=(FormParser, JSONParser, MultiPartParser)
-    queryset = get_user_model().objects
+    queryset = UserModel.objects
 
     def get_queryset(self):
         relations = ('rank', 'online_tracker', 'ban_cache')

+ 3 - 3
misago/users/authbackends.py

@@ -2,10 +2,11 @@ from django.contrib.auth import get_user_model
 from django.contrib.auth.backends import ModelBackend
 
 
+UserModel = get_user_model()
+
+
 class MisagoBackend(ModelBackend):
     def authenticate(self, username=None, password=None, **kwargs):
-        UserModel = get_user_model()
-
         if username is None:
             username = kwargs.get(UserModel.USERNAME_FIELD)
 
@@ -20,7 +21,6 @@ class MisagoBackend(ModelBackend):
                 return user
 
     def get_user(self, pk):
-        UserModel = get_user_model()
         try:
             manager = UserModel._default_manager
             relations = ('rank', 'online_tracker', 'ban_cache')

+ 3 - 4
misago/users/djangoadmin.py

@@ -18,7 +18,7 @@ from django.utils.translation import ugettext as _
 
 
 # Misago user model
-User = get_user_model()
+UserModel = get_user_model()
 
 
 class UserAdminForm(forms.ModelForm):
@@ -68,18 +68,17 @@ class UserAdminForm(forms.ModelForm):
         return link_html
 
     class Meta:
-        model = User
+        model = UserModel
         fields = ['edit_from_misago_link']
 
 
-class UserAdminModel(admin.ModelAdmin):
+class UserAdmin(admin.ModelAdmin):
     """
     Redeclare most of the model fields like read-only.
     Prevents new/delete actions (users should use misago admin panel for
     that).
     Replaces default form with custom `UserAdminForm`.
     """
-
     list_display = (
         'username',
         'email',

+ 6 - 4
misago/users/forms/auth.py

@@ -8,6 +8,9 @@ from django.utils.translation import ugettext_lazy as _
 from ..bans import get_user_ban
 
 
+UserModel = get_user_model()
+
+
 class MisagoAuthMixin(object):
     error_messages = {
         'empty_data': _("Fill out both fields."),
@@ -121,12 +124,11 @@ class GetUserForm(MisagoAuthMixin, forms.Form):
                 _("Entered e-mail is invalid."), code='invalid_email')
 
         try:
-            User = get_user_model()
-            user = User.objects.get_by_email(data['email'])
+            user = UserModel.objects.get_by_email(data['email'])
             if not user.is_active:
-                raise User.DoesNotExist()
+                raise UserModel.DoesNotExist()
             self.user_cache = user
-        except User.DoesNotExist:
+        except UserModel.DoesNotExist:
             raise forms.ValidationError(
                 _("No user with this e-mail exists."), code='not_found')
 

+ 3 - 1
misago/users/forms/register.py

@@ -5,6 +5,9 @@ from django.contrib.auth.password_validation import validate_password
 from .. import validators
 
 
+UserModel = get_user_model()
+
+
 class RegisterForm(forms.Form):
     username = forms.CharField(validators=[validators.validate_username])
     email = forms.CharField(validators=[validators.validate_email])
@@ -19,7 +22,6 @@ class RegisterForm(forms.Form):
 
     def full_clean_password(self, cleaned_data):
         if cleaned_data.get('password'):
-            UserModel = get_user_model()
             validate_password(
                 cleaned_data['password'],
                 user=UserModel(

+ 6 - 6
misago/users/management/commands/createsuperuser.py

@@ -16,6 +16,9 @@ from django.utils.six.moves import input
 from ...validators import validate_email, validate_username
 
 
+UserModel = get_user_model()
+
+
 class NotRunningInTTYException(Exception):
     pass
 
@@ -108,12 +111,10 @@ class Command(BaseCommand):
                     except ValidationError as e:
                         self.stderr.write(e.messages[0])
 
-                User = get_user_model()
-
                 while not password:
                     try:
                         raw_value = getpass("Enter password: ").strip()
-                        validate_password(raw_value, user=User(
+                        validate_password(raw_value, user=UserModel(
                             username=username,
                             email=email
                         ))
@@ -141,9 +142,8 @@ class Command(BaseCommand):
 
     def create_superuser(self, username, email, password, verbosity):
         try:
-            User = get_user_model()
-            user = User.objects.create_superuser(username, email, password,
-                                                 set_default_avatar=True)
+            user = UserModel.objects.create_superuser(
+                username, email, password, set_default_avatar=True)
 
             if verbosity >= 1:
                 message = "Superuser #%(pk)s has been created successfully."

+ 4 - 3
misago/users/management/commands/populateonlinetracker.py

@@ -4,14 +4,15 @@ from django.core.management.base import BaseCommand
 from ...models import Online
 
 
+UserModel = get_user_model()
+
+
 class Command(BaseCommand):
     help = 'Populates online tracker for user accounts that lack it.'
 
     def handle(self, *args, **options):
-        User = get_user_model()
-
         entries_created = 0
-        queryset = User.objects.filter(online_tracker__isnull=True)
+        queryset = UserModel.objects.filter(online_tracker__isnull=True)
         for user in queryset.iterator():
             Online.objects.create(
                 user=user,

+ 5 - 2
misago/users/management/commands/synchronizeusers.py

@@ -8,11 +8,14 @@ from misago.core.management.progressbar import show_progress
 from misago.core.pgutils import batch_update
 
 
+UserModel = get_user_model()
+
+
 class Command(BaseCommand):
     help = "Synchronizes users"
 
     def handle(self, *args, **options):
-        users_to_sync = get_user_model().objects.count()
+        users_to_sync = UserModel.objects.count()
 
         if not users_to_sync:
             self.stdout.write("\n\nNo users were found")
@@ -28,7 +31,7 @@ class Command(BaseCommand):
         synchronized_count = 0
         show_progress(self, synchronized_count, users_to_sync)
         start_time = time.time()
-        for user in batch_update(get_user_model().objects.all()):
+        for user in batch_update(UserModel.objects.all()):
             user.threads = user.thread_set.filter(
                 category__in=categories,
                 is_hidden=False,

+ 3 - 2
misago/users/search.py

@@ -10,6 +10,8 @@ from .serializers import UserSerializer
 HEAD_RESULTS = 8
 TAIL_RESULTS = 8
 
+UserModel = get_user_model()
+
 
 class SearchUsers(SearchProvider):
     name = ugettext_lazy("Users")
@@ -36,8 +38,7 @@ class SearchUsers(SearchProvider):
 
 
 def search_users(**filters):
-    User = get_user_model()
-    queryset = User.objects.order_by('slug').select_related(
+    queryset = UserModel.objects.order_by('slug').select_related(
         'rank', 'ban_cache', 'online_tracker')
 
     if not filters.get('search_disabled', False):

+ 16 - 17
misago/users/tests/test_activation_views.py

@@ -8,6 +8,9 @@ from ..models import Ban
 from ..tokens import make_activation_token
 
 
+UserModel = get_user_model()
+
+
 class ActivationViewsTests(TestCase):
     def test_request_view_returns_200(self):
         """request new activation link view returns 200"""
@@ -16,9 +19,8 @@ class ActivationViewsTests(TestCase):
 
     def test_view_activate_banned(self):
         """activate banned user shows error"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123',
-                                             requires_activation=1)
+        test_user = UserModel.objects.create_user(
+            'Bob', 'bob@test.com', 'Pass.123', requires_activation=1)
         Ban.objects.create(
             check_type=Ban.USERNAME,
             banned_value='bob',
@@ -34,14 +36,13 @@ class ActivationViewsTests(TestCase):
         self.assertContains(
             response, encode_json_html("<p>Nope!</p>"), status_code=403)
 
-        test_user = User.objects.get(pk=test_user.pk)
+        test_user = UserModel.objects.get(pk=test_user.pk)
         self.assertEqual(test_user.requires_activation, 1)
 
     def test_view_activate_invalid_token(self):
         """activate with invalid token shows error"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123',
-                                             requires_activation=1)
+        test_user = UserModel.objects.create_user(
+            'Bob', 'bob@test.com', 'Pass.123', requires_activation=1)
 
         activation_token = make_activation_token(test_user)
 
@@ -51,13 +52,12 @@ class ActivationViewsTests(TestCase):
         }))
         self.assertEqual(response.status_code, 400)
 
-        test_user = User.objects.get(pk=test_user.pk)
+        test_user = UserModel.objects.get(pk=test_user.pk)
         self.assertEqual(test_user.requires_activation, 1)
 
     def test_view_activate_disabled(self):
         """activate disabled user shows error"""
-        User = get_user_model()
-        test_user = User.objects.create_user(
+        test_user = UserModel.objects.create_user(
             'Bob', 'bob@test.com', 'Pass.123', is_active=False)
 
         activation_token = make_activation_token(test_user)
@@ -70,8 +70,8 @@ class ActivationViewsTests(TestCase):
 
     def test_view_activate_active(self):
         """activate active user shows error"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
+        test_user = UserModel.objects.create_user(
+            'Bob', 'bob@test.com', 'Pass.123')
 
         activation_token = make_activation_token(test_user)
 
@@ -81,14 +81,13 @@ class ActivationViewsTests(TestCase):
         }))
         self.assertEqual(response.status_code, 200)
 
-        test_user = User.objects.get(pk=test_user.pk)
+        test_user = UserModel.objects.get(pk=test_user.pk)
         self.assertEqual(test_user.requires_activation, 0)
 
     def test_view_activate_inactive(self):
         """activate inactive user passess"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123',
-                                             requires_activation=1)
+        test_user = UserModel.objects.create_user(
+            'Bob', 'bob@test.com', 'Pass.123', requires_activation=1)
 
         activation_token = make_activation_token(test_user)
 
@@ -99,5 +98,5 @@ class ActivationViewsTests(TestCase):
         self.assertEqual(response.status_code, 200)
         self.assertContains(response, "your account has been activated!")
 
-        test_user = User.objects.get(pk=test_user.pk)
+        test_user = UserModel.objects.get(pk=test_user.pk)
         self.assertEqual(test_user.requires_activation, 0)

+ 5 - 3
misago/users/tests/test_activepostersranking.py

@@ -9,6 +9,9 @@ from ..activepostersranking import build_active_posters_ranking, get_active_post
 from ..testutils import AuthenticatedUserTestCase
 
 
+UserModel = get_user_model()
+
+
 class TestActivePostersRanking(AuthenticatedUserTestCase):
     def setUp(self):
         super(TestActivePostersRanking, self).setUp()
@@ -33,8 +36,7 @@ class TestActivePostersRanking(AuthenticatedUserTestCase):
         self.assertEqual(empty_ranking['users_count'], 0)
 
         # other user
-        User = get_user_model()
-        other_user = User.objects.create_user(
+        other_user = UserModel.objects.create_user(
             "OtherUser", "other@user.com", "pass123")
 
         other_user.posts = 1
@@ -65,7 +67,7 @@ class TestActivePostersRanking(AuthenticatedUserTestCase):
         self.assertEqual(ranking['users'][1].score, 1)
 
         # disabled users are not ranked
-        disabled = User.objects.create_user(
+        disabled = UserModel.objects.create_user(
             "DisabledUser", "disabled@user.com", "pass123")
 
         disabled.is_active = False

+ 13 - 19
misago/users/tests/test_auth_api.py

@@ -6,6 +6,9 @@ from ..models import Ban
 from ..tokens import make_password_change_token
 
 
+UserModel = get_user_model()
+
+
 class GatewayTests(TestCase):
     def test_api_invalid_credentials(self):
         """login api returns 400 on invalid POST"""
@@ -23,8 +26,7 @@ class GatewayTests(TestCase):
 
     def test_login(self):
         """api signs user in"""
-        User = get_user_model()
-        user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
+        user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
 
         response = self.client.post('/api/auth/', data={
             'username': 'Bob',
@@ -47,8 +49,7 @@ class GatewayTests(TestCase):
 
     def test_login_banned(self):
         """login api fails to sign banned user in"""
-        User = get_user_model()
-        User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
+        UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
 
         ban = Ban.objects.create(
             check_type=Ban.USERNAME,
@@ -77,8 +78,7 @@ class GatewayTests(TestCase):
 
     def test_login_banned_staff(self):
         """login api signs banned staff member in"""
-        User = get_user_model()
-        user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
+        user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
 
         user.is_staff = True
         user.save()
@@ -104,8 +104,7 @@ class GatewayTests(TestCase):
 
     def test_login_inactive_admin(self):
         """login api fails to sign admin-activated user in"""
-        User = get_user_model()
-        User.objects.create_user(
+        UserModel.objects.create_user(
             'Bob', 'bob@test.com', 'Pass.123', requires_activation=1)
 
         response = self.client.post('/api/auth/', data={
@@ -125,8 +124,7 @@ class GatewayTests(TestCase):
 
     def test_login_inactive_user(self):
         """login api fails to sign user-activated user in"""
-        User = get_user_model()
-        User.objects.create_user(
+        UserModel.objects.create_user(
             'Bob', 'bob@test.com', 'Pass.123', requires_activation=2)
 
         response = self.client.post('/api/auth/', data={
@@ -146,8 +144,7 @@ class GatewayTests(TestCase):
 
     def test_login_disabled_user(self):
         """its impossible to sign in to disabled account"""
-        User = get_user_model()
-        user = User.objects.create_user(
+        user = UserModel.objects.create_user(
             'Bob', 'bob@test.com', 'Pass.123', is_active=False)
 
         user.is_staff = True
@@ -175,8 +172,7 @@ class UserCredentialsTests(TestCase):
 
 class SendActivationAPITests(TestCase):
     def setUp(self):
-        User = get_user_model()
-        self.user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
+        self.user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
         self.user.requires_activation = 1
         self.user.save()
 
@@ -256,8 +252,7 @@ class SendActivationAPITests(TestCase):
 
 class SendPasswordFormAPITests(TestCase):
     def setUp(self):
-        User = get_user_model()
-        self.user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
+        self.user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
 
         self.link = '/api/auth/send-password-form/'
 
@@ -324,8 +319,7 @@ class SendPasswordFormAPITests(TestCase):
 
 class ChangePasswordAPITests(TestCase):
     def setUp(self):
-        User = get_user_model()
-        self.user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
+        self.user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
 
         self.link = '/api/auth/change-password/%s/%s/'
 
@@ -337,7 +331,7 @@ class ChangePasswordAPITests(TestCase):
         ), data={'password': 'n3wp4ss!'})
         self.assertEqual(response.status_code, 200)
 
-        user = get_user_model().objects.get(id=self.user.pk)
+        user = UserModel.objects.get(id=self.user.pk)
         self.assertTrue(user.check_password('n3wp4ss!'))
 
     def test_invalid_token_link(self):

+ 2 - 2
misago/users/tests/test_auth_backend.py

@@ -4,13 +4,13 @@ from django.test import TestCase
 from ..authbackends import MisagoBackend
 
 
+UserModel = get_user_model()
+
 backend = MisagoBackend()
 
 
 class MisagoBackendTests(TestCase):
     def setUp(self):
-        UserModel = get_user_model()
-
         self.password = 'Pass.123'
         self.user = UserModel.objects.create_user(
             'BobBoberson', 'bob@test.com', self.password)

+ 8 - 7
misago/users/tests/test_avatars.py

@@ -13,17 +13,20 @@ from ..avatars import (
 from ..models import Avatar, AvatarGallery
 
 
+UserModel = get_user_model()
+
+
 class AvatarsStoreTests(TestCase):
     def test_store(self):
         """store successfully stores and deletes avatar"""
-        User = get_user_model()
-        user = User.objects.create_user('Bob', 'bob@bob.com', 'pass123')
+        user = UserModel.objects.create_user(
+            'Bob', 'bob@bob.com', 'pass123')
 
         test_image = Image.new("RGBA", (100, 100), 0)
         store.store_new_avatar(user, test_image)
 
         # reload user
-        test_user = User.objects.get(pk=user.pk)
+        test_user = UserModel.objects.get(pk=user.pk)
 
         # assert that avatars were stored in media
         avatars_dict = {}
@@ -84,8 +87,7 @@ class AvatarsStoreTests(TestCase):
 
 class AvatarSetterTests(TestCase):
     def setUp(self):
-        User = get_user_model()
-        self.user = User.objects.create_user(
+        self.user = UserModel.objects.create_user(
             'Bob', 'kontakt@rpiton.com', 'pass123')
 
         self.user.avatars = None
@@ -95,8 +97,7 @@ class AvatarSetterTests(TestCase):
         store.delete_avatar(self.user)
 
     def get_current_user(self):
-        User = get_user_model()
-        return User.objects.get(pk=self.user.pk)
+        return UserModel.objects.get(pk=self.user.pk)
 
     def assertNoAvatarIsSet(self):
         user = self.get_current_user()

+ 4 - 2
misago/users/tests/test_avatarserver_views.py

@@ -5,10 +5,12 @@ from django.urls import reverse
 from misago.conf import settings
 
 
+UserModel = get_user_model()
+
+
 class AvatarServerTests(TestCase):
     def setUp(self):
-        User = get_user_model()
-        self.user = User.objects.create_user('Bob', 'bob@bob.com', 'Pass123')
+        self.user = UserModel.objects.create_user('Bob', 'bob@bob.com', 'Pass123')
 
         self.user.avatars = [
             {

+ 7 - 6
misago/users/tests/test_bans.py

@@ -10,6 +10,9 @@ from ..bans import (
 from ..models import Ban
 
 
+UserModel = get_user_model()
+
+
 class GetBanTests(TestCase):
     def test_get_username_ban(self):
         """get_username_ban returns valid ban"""
@@ -99,10 +102,8 @@ class GetBanTests(TestCase):
 
 class UserBansTests(TestCase):
     def setUp(self):
-        User = get_user_model()
-        self.user = User.objects.create_user('Bob',
-                                             'bob@boberson.com',
-                                             'pass123')
+        self.user = UserModel.objects.create_user(
+            'Bob', 'bob@boberson.com', 'pass123')
 
     def test_no_ban(self):
         """user is not caught by ban"""
@@ -224,8 +225,8 @@ class RequestIPBansTests(TestCase):
 class BanUserTests(TestCase):
     def test_ban_user(self):
         """ban_user utility bans user"""
-        User = get_user_model()
-        user = User.objects.create_user('Bob', 'bob@boberson.com', 'pass123')
+        user = UserModel.objects.create_user(
+            'Bob', 'bob@boberson.com', 'pass123')
 
         ban = ban_user(user, 'User reason', 'Staff reason')
         self.assertEqual(ban.user_message, 'User reason')

+ 4 - 2
misago/users/tests/test_commands.py

@@ -1,7 +1,9 @@
+from django.contrib.auth import get_user_model
 from django.core.management import call_command
 from django.test import TestCase
 
-from ..models import User
+
+UserModel = get_user_model()
 
 
 class CreateSuperUserTests(TestCase):
@@ -17,7 +19,7 @@ class CreateSuperUserTests(TestCase):
 
         call_command('createsuperuser', **opts)
 
-        user = User.objects.get(username=opts['username'])
+        user = UserModel.objects.get(username=opts['username'])
         self.assertEqual(user.username, opts['username'])
         self.assertEqual(user.email, opts['email'])
         self.assertTrue(user.check_password(opts['password']))

+ 4 - 1
misago/users/tests/test_createsuperuser.py

@@ -4,6 +4,9 @@ from django.test import TestCase
 from django.utils.six import StringIO
 
 
+UserModel = get_user_model()
+
+
 class CreateSuperuserTests(TestCase):
     def test_create_superuser(self):
         """command creates superuser"""
@@ -17,7 +20,7 @@ class CreateSuperuserTests(TestCase):
             stdout=out
         )
 
-        new_user = get_user_model().objects.order_by('-id')[:1][0]
+        new_user = UserModel.objects.order_by('-id')[:1][0]
 
         self.assertEqual(
             out.getvalue().splitlines()[-1].strip(),

+ 4 - 2
misago/users/tests/test_credentialchange.py

@@ -4,6 +4,9 @@ from django.test import TestCase
 from .. import credentialchange
 
 
+UserModel = get_user_model()
+
+
 class MockRequest(object):
     def __init__(self, user):
         self.session = {}
@@ -12,8 +15,7 @@ class MockRequest(object):
 
 class CredentialChangeTests(TestCase):
     def setUp(self):
-        User = get_user_model()
-        self.user = User.objects.create_user('Bob', 'bob@bob.com', 'pass123')
+        self.user = UserModel.objects.create_user('Bob', 'bob@bob.com', 'pass123')
 
     def test_valid_token_generation(self):
         """credentialchange module allows for store and read of change token"""

+ 4 - 3
misago/users/tests/test_djangoadmin_user.py

@@ -7,13 +7,14 @@ from django.utils import formats
 from misago.admin.testutils import AdminTestCase
 
 
+UserModel = get_user_model()
+
+
 @override_settings(ROOT_URLCONF='misago.core.testproject.urls')
 class TestDjangoAdminUserForm(AdminTestCase):
     def test_edit_page_content(self):
         """assert that edit-view of `test_user` contains expected content."""
-        User = get_user_model()
-
-        test_user = User.objects.create_user(
+        test_user = UserModel.objects.create_user(
             username='Bob',
             email='bob@test.com',
             password='Pass.123',

+ 7 - 8
misago/users/tests/test_forgottenpassword_views.py

@@ -8,6 +8,9 @@ from ..testutils import UserTestCase
 from ..tokens import make_password_change_token
 
 
+UserModel = get_user_model()
+
+
 class ForgottenPasswordViewsTests(UserTestCase):
     def test_guest_request_view_returns_200(self):
         """request new password view returns 200 for guests"""
@@ -23,8 +26,7 @@ class ForgottenPasswordViewsTests(UserTestCase):
 
     def test_change_password_on_banned(self):
         """change banned user password errors"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
 
         Ban.objects.create(
             check_type=Ban.USERNAME,
@@ -44,8 +46,7 @@ class ForgottenPasswordViewsTests(UserTestCase):
 
     def test_change_password_on_other_user(self):
         """change other user password errors"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
 
         password_token = make_password_change_token(test_user)
 
@@ -60,8 +61,7 @@ class ForgottenPasswordViewsTests(UserTestCase):
 
     def test_change_password_invalid_token(self):
         """invalid form token errors"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
 
         password_token = make_password_change_token(test_user)
 
@@ -74,8 +74,7 @@ class ForgottenPasswordViewsTests(UserTestCase):
 
     def test_change_password_form(self):
         """change user password form displays for valid token"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@test.com', 'Pass.123')
 
         password_token = make_password_change_token(test_user)
 

+ 5 - 4
misago/users/tests/test_invalidatebans.py

@@ -12,6 +12,9 @@ from ..management.commands import invalidatebans
 from ..models import Ban, BanCache
 
 
+UserModel = get_user_model()
+
+
 class InvalidateBansTests(TestCase):
     def test_expired_bans_handling(self):
         """expired bans are flagged as such"""
@@ -35,9 +38,7 @@ class InvalidateBansTests(TestCase):
 
     def test_bans_caches_updates(self):
         """ban caches are updated"""
-        # create user
-        User = get_user_model()
-        user = User.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
+        user = UserModel.objects.create_user("Bob", "bob@boberson.com", "Pass.123")
 
         # ban user
         Ban.objects.create(banned_value="bob")
@@ -70,5 +71,5 @@ class InvalidateBansTests(TestCase):
         self.assertEqual(Ban.objects.filter(is_checked=True).count(), 0)
 
         # see if user is banned anymore
-        user = User.objects.get(id=user.id)
+        user = UserModel.objects.get(id=user.id)
         self.assertIsNone(bans.get_user_ban(user))

+ 7 - 8
misago/users/tests/test_lists_views.py

@@ -11,6 +11,9 @@ from ..models import Rank
 from ..testutils import AuthenticatedUserTestCase
 
 
+UserModel = get_user_model()
+
+
 class UsersListTestCase(AuthenticatedUserTestCase):
     def setUp(self):
         super(UsersListTestCase, self).setUp()
@@ -54,9 +57,8 @@ class ActivePostersTests(UsersListTestCase):
         self.assertEqual(response.status_code, 200)
 
         # Create 50 test users and see if errors appeared
-        User = get_user_model()
         for i in range(50):
-            user = User.objects.create_user(
+            user = UserModel.objects.create_user(
                 'Bob%s' % i, 'm%s@te.com' % i, 'Pass.123', posts=12345)
             post_thread(category, poster=user)
 
@@ -69,8 +71,7 @@ class ActivePostersTests(UsersListTestCase):
 class UsersRankTests(UsersListTestCase):
     def test_ranks(self):
         """ranks lists are handled correctly"""
-        User = get_user_model()
-        rank_user = User.objects.create_user(
+        rank_user = UserModel.objects.create_user(
             'Visible', 'visible@te.com', 'Pass.123')
 
         for rank in Rank.objects.iterator():
@@ -88,8 +89,7 @@ class UsersRankTests(UsersListTestCase):
 
     def test_disabled_users(self):
         """ranks lists excludes disabled accounts"""
-        User = get_user_model()
-        rank_user = User.objects.create_user(
+        rank_user = UserModel.objects.create_user(
             'Visible', 'visible@te.com', 'Pass.123', is_active=False)
 
         for rank in Rank.objects.iterator():
@@ -110,8 +110,7 @@ class UsersRankTests(UsersListTestCase):
         self.user.is_staff = True
         self.user.save()
 
-        User = get_user_model()
-        rank_user = User.objects.create_user(
+        rank_user = UserModel.objects.create_user(
             'Visible', 'visible@te.com', 'Pass.123', is_active=False)
 
         for rank in Rank.objects.iterator():

+ 3 - 1
misago/users/tests/test_misagoavatars_tags.py

@@ -3,10 +3,12 @@ from django.template import Context, Template
 from django.test import TestCase
 
 
+UserModel = get_user_model()
+
+
 class TemplateTagsTests(TestCase):
     def test_user_avatar_filter(self):
         """avatar filter returns url to avatar image"""
-        UserModel = get_user_model()
         user = UserModel.objects.create_user('Bob', 'bob@test.com', 'pass123')
 
         user.avatars = [

+ 4 - 2
misago/users/tests/test_namechanges.py

@@ -4,11 +4,13 @@ from django.test import TestCase
 from ..namechanges import UsernameChanges
 
 
+UserModel = get_user_model()
+
+
 class UsernameChangesTests(TestCase):
     def test_username_changes_helper(self):
         """username changes are tracked correctly"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@bob.com', 'pass123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@bob.com', 'pass123')
 
         namechanges = UsernameChanges(test_user)
         self.assertEqual(namechanges.left, 2)

+ 4 - 3
misago/users/tests/test_populateonlinetracker.py

@@ -7,12 +7,13 @@ from ..management.commands import populateonlinetracker
 from ..models import Online
 
 
+UserModel = get_user_model()
+
+
 class PopulateOnlineTrackerTests(TestCase):
     def test_populate_user_online(self):
         """user account without online tracker gets one"""
-        User = get_user_model()
-
-        test_user = User.objects.create_user('Bob', 'bob@bob.com', 'pass123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@bob.com', 'pass123')
 
         Online.objects.filter(user=test_user).delete()
         self.assertEqual(Online.objects.filter(user=test_user).count(), 0)

+ 19 - 18
misago/users/tests/test_profile_views.py

@@ -10,6 +10,9 @@ from ..models import Ban
 from ..testutils import AuthenticatedUserTestCase
 
 
+UserModel = get_user_model()
+
+
 class UserProfileViewsTests(AuthenticatedUserTestCase):
     def setUp(self):
         super(UserProfileViewsTests, self).setUp()
@@ -33,8 +36,7 @@ class UserProfileViewsTests(AuthenticatedUserTestCase):
         self.user.is_staff = False
         self.user.save()
 
-        User = get_user_model()
-        test_user = User.objects.create_user('Tyrael', 't123@test.com', 'pass123')
+        test_user = UserModel.objects.create_user('Tyrael', 't123@test.com', 'pass123')
 
         test_user.is_active = False
         test_user.save()
@@ -98,8 +100,6 @@ class UserProfileViewsTests(AuthenticatedUserTestCase):
 
     def test_user_followers(self):
         """user profile followers list has no showstoppers"""
-        User = get_user_model()
-
         response = self.client.get(reverse('misago:user-followers',
                                            kwargs=self.link_kwargs))
 
@@ -109,7 +109,7 @@ class UserProfileViewsTests(AuthenticatedUserTestCase):
         followers = []
         for i in range(10):
             user_data = ("Follower%s" % i, "foll%s@test.com" % i, "Pass.123")
-            followers.append(User.objects.create_user(*user_data))
+            followers.append(UserModel.objects.create_user(*user_data))
             self.user.followed_by.add(followers[-1])
 
         response = self.client.get(reverse('misago:user-followers',
@@ -120,8 +120,6 @@ class UserProfileViewsTests(AuthenticatedUserTestCase):
 
     def test_user_follows(self):
         """user profile follows list has no showstoppers"""
-        User = get_user_model()
-
         response = self.client.get(reverse('misago:user-follows',
                                            kwargs=self.link_kwargs))
 
@@ -131,7 +129,7 @@ class UserProfileViewsTests(AuthenticatedUserTestCase):
         followers = []
         for i in range(10):
             user_data = ("Follower%s" % i, "foll%s@test.com" % i, "Pass.123")
-            followers.append(User.objects.create_user(*user_data))
+            followers.append(UserModel.objects.create_user(*user_data))
             followers[-1].followed_by.add(self.user)
 
         response = self.client.get(reverse('misago:user-follows',
@@ -152,8 +150,9 @@ class UserProfileViewsTests(AuthenticatedUserTestCase):
         self.user.set_username('TestUser')
         self.user.save()
 
-        response = self.client.get(reverse('misago:username-history',
-                                           kwargs=self.link_kwargs))
+        response = self.client.get(
+            reverse('misago:username-history', kwargs=self.link_kwargs))
+
         self.assertEqual(response.status_code, 200)
         self.assertContains(response, "TestUser")
         self.assertContains(response, "RenamedAdmin")
@@ -164,8 +163,7 @@ class UserProfileViewsTests(AuthenticatedUserTestCase):
             'can_see_ban_details': 0,
         })
 
-        User = get_user_model()
-        test_user = User.objects.create_user("Bob", "bob@bob.com", 'pass.123')
+        test_user = UserModel.objects.create_user("Bob", "bob@bob.com", 'pass.123')
         link_kwargs = {'slug': test_user.slug, 'pk': test_user.pk}
 
         response = self.client.get(reverse('misago:user-ban',
@@ -185,13 +183,16 @@ class UserProfileViewsTests(AuthenticatedUserTestCase):
         })
         test_user.ban_cache.delete()
 
-        Ban.objects.create(banned_value=test_user.username,
-                           user_message="User m3ss4ge.",
-                           staff_message="Staff m3ss4ge.",
-                           is_checked=True)
+        Ban.objects.create(
+            banned_value=test_user.username,
+            user_message="User m3ss4ge.",
+            staff_message="Staff m3ss4ge.",
+            is_checked=True
+        )
+
+        response = self.client.get(
+            reverse('misago:user-ban', kwargs=link_kwargs))
 
-        response = self.client.get(reverse('misago:user-ban',
-                                           kwargs=link_kwargs))
         self.assertEqual(response.status_code, 200)
         self.assertContains(response, 'User m3ss4ge')
         self.assertContains(response, 'Staff m3ss4ge')

+ 4 - 2
misago/users/tests/test_search.py

@@ -5,6 +5,9 @@ from misago.acl.testutils import override_acl
 from misago.users.testutils import AuthenticatedUserTestCase
 
 
+UserModel = get_user_model()
+
+
 class SearchApiTests(AuthenticatedUserTestCase):
     def setUp(self):
         super(SearchApiTests, self).setUp()
@@ -101,8 +104,7 @@ class SearchApiTests(AuthenticatedUserTestCase):
 
     def test_search_disabled(self):
         """api respects disabled users visibility"""
-        User = get_user_model()
-        disabled_user = User.objects.create_user(
+        disabled_user = UserModel.objects.create_user(
             'DisabledUser', 'visible@te.com', 'Pass.123', is_active=False)
 
         response = self.client.get('%s?q=DisabledUser' % self.api_link)

+ 4 - 2
misago/users/tests/test_signatures.py

@@ -4,6 +4,9 @@ from django.test import TestCase
 from .. import signatures
 
 
+UserModel = get_user_model()
+
+
 class MockRequest(object):
     scheme = 'http'
 
@@ -14,8 +17,7 @@ class MockRequest(object):
 class SignaturesTests(TestCase):
     def test_signature_change(self):
         """signature module allows for signature change"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@bob.com', 'pass123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@bob.com', 'pass123')
 
         signatures.set_user_signature(MockRequest(), test_user, '')
 

+ 5 - 4
misago/users/tests/test_tokens.py

@@ -4,13 +4,14 @@ from django.test import TestCase
 from .. import tokens
 
 
+UserModel = get_user_model()
+
+
 class TokensTests(TestCase):
     def test_tokens(self):
         """misago.users.tokens implementation works"""
-        User = get_user_model()
-
-        user_a = User.objects.create_user('Bob', 'bob@test.com', 'pass123')
-        user_b = User.objects.create_user('Weebl', 'weebl@test.com', 'pass123')
+        user_a = UserModel.objects.create_user('Bob', 'bob@test.com', 'pass123')
+        user_b = UserModel.objects.create_user('Weebl', 'weebl@test.com', 'pass123')
 
         token_a = tokens.make(user_a, 'test')
         token_b = tokens.make(user_b, 'test')

+ 6 - 8
misago/users/tests/test_user_avatar_api.py

@@ -18,6 +18,8 @@ from ..testutils import AuthenticatedUserTestCase
 TESTFILES_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'testfiles')
 TEST_AVATAR_PATH = os.path.join(TESTFILES_DIR, 'avatar.png')
 
+UserModel = get_user_model()
+
 
 class UserAvatarTests(AuthenticatedUserTestCase):
     """
@@ -28,7 +30,6 @@ class UserAvatarTests(AuthenticatedUserTestCase):
         self.link = '/api/users/%s/avatar/' % self.user.pk
 
     def get_current_user(self):
-        UserModel = get_user_model()
         return UserModel.objects.get(pk=self.user.pk)
 
     def test_avatars_off(self):
@@ -85,8 +86,7 @@ class UserAvatarTests(AuthenticatedUserTestCase):
         response = self.client.get(self.link)
         self.assertContains(response, "You have to sign in", status_code=403)
 
-        User = get_user_model()
-        self.login_user(User.objects.create_user(
+        self.login_user(UserModel.objects.create_user(
             "BobUser", "bob@bob.com", self.USER_PASSWORD))
 
         response = self.client.get(self.link)
@@ -278,8 +278,7 @@ class UserAvatarModerationTests(AuthenticatedUserTestCase):
     def setUp(self):
         super(UserAvatarModerationTests, self).setUp()
 
-        User = get_user_model()
-        self.other_user = User.objects.create_user(
+        self.other_user = UserModel.objects.create_user(
             "OtherUser", "other@user.com", "pass123")
 
         self.link = '/api/users/%s/moderate-avatar/' % self.other_user.pk
@@ -329,8 +328,7 @@ class UserAvatarModerationTests(AuthenticatedUserTestCase):
         content_type="application/json")
         self.assertEqual(response.status_code, 200)
 
-        User = get_user_model()
-        other_user = User.objects.get(pk=self.other_user.pk)
+        other_user = UserModel.objects.get(pk=self.other_user.pk)
 
         options = response.json()
         self.assertEqual(other_user.is_avatar_locked, True)
@@ -360,7 +358,7 @@ class UserAvatarModerationTests(AuthenticatedUserTestCase):
         content_type="application/json")
         self.assertEqual(response.status_code, 200)
 
-        other_user = User.objects.get(pk=self.other_user.pk)
+        other_user = UserModel.objects.get(pk=self.other_user.pk)
 
         options = response.json()
         self.assertEqual(

+ 4 - 2
misago/users/tests/test_user_changeemail_api.py

@@ -4,6 +4,9 @@ from django.core import mail
 from ..testutils import AuthenticatedUserTestCase
 
 
+UserModel = get_user_model()
+
+
 class UserChangeEmailTests(AuthenticatedUserTestCase):
     """
     tests for user change email RPC (/api/users/1/change-email/)
@@ -57,8 +60,7 @@ class UserChangeEmailTests(AuthenticatedUserTestCase):
 
     def test_email_taken(self):
         """api validates email usage"""
-        User = get_user_model()
-        User.objects.create_user('BobBoberson', 'new@email.com', 'Pass.123')
+        UserModel.objects.create_user('BobBoberson', 'new@email.com', 'Pass.123')
 
         response = self.client.post(self.link, data={
             'new_email': 'new@email.com',

+ 9 - 9
misago/users/tests/test_user_create_api.py

@@ -8,6 +8,9 @@ from ..models import Online
 from ..testutils import UserTestCase
 
 
+UserModel = get_user_model()
+
+
 class UserCreateTests(UserTestCase):
     """
     tests for new user registration (POST to /api/users/)
@@ -80,10 +83,9 @@ class UserCreateTests(UserTestCase):
         self.assertContains(response, 'Bob')
         self.assertContains(response, 'bob@bob.com')
 
-        User = get_user_model()
-        User.objects.get_by_username('Bob')
+        UserModel.objects.get_by_username('Bob')
 
-        test_user = User.objects.get_by_email('bob@bob.com')
+        test_user = UserModel.objects.get_by_email('bob@bob.com')
         self.assertEqual(Online.objects.filter(user=test_user).count(), 1)
 
         response = self.client.get(reverse('misago:index'))
@@ -105,9 +107,8 @@ class UserCreateTests(UserTestCase):
         self.assertContains(response, 'Bob')
         self.assertContains(response, 'bob@bob.com')
 
-        User = get_user_model()
-        User.objects.get_by_username('Bob')
-        User.objects.get_by_email('bob@bob.com')
+        UserModel.objects.get_by_username('Bob')
+        UserModel.objects.get_by_email('bob@bob.com')
 
         self.assertIn('Welcome', mail.outbox[0].subject)
 
@@ -125,8 +126,7 @@ class UserCreateTests(UserTestCase):
         self.assertContains(response, 'Bob')
         self.assertContains(response, 'bob@bob.com')
 
-        User = get_user_model()
-        User.objects.get_by_username('Bob')
-        User.objects.get_by_email('bob@bob.com')
+        UserModel.objects.get_by_username('Bob')
+        UserModel.objects.get_by_email('bob@bob.com')
 
         self.assertIn('Welcome', mail.outbox[0].subject)

+ 5 - 4
misago/users/tests/test_user_username_api.py

@@ -10,6 +10,9 @@ from misago.conf import settings
 from ..testutils import AuthenticatedUserTestCase
 
 
+UserModel = get_user_model()
+
+
 class UserUsernameTests(AuthenticatedUserTestCase):
     """
     tests for user change name RPC (POST to /api/users/1/username/)
@@ -106,8 +109,7 @@ class UserUsernameModerationTests(AuthenticatedUserTestCase):
     def setUp(self):
         super(UserUsernameModerationTests, self).setUp()
 
-        User = get_user_model()
-        self.other_user = User.objects.create_user(
+        self.other_user = UserModel.objects.create_user(
             "OtherUser", "other@user.com", "pass123")
 
         self.link = '/api/users/%s/moderate-username/' % self.other_user.pk
@@ -192,8 +194,7 @@ class UserUsernameModerationTests(AuthenticatedUserTestCase):
 
         self.assertEqual(response.status_code, 200)
 
-        User = get_user_model()
-        other_user = User.objects.get(pk=self.other_user.pk)
+        other_user = UserModel.objects.get(pk=self.other_user.pk)
 
         self.assertEqual('BobBoberson', other_user.username)
         self.assertEqual('bobboberson', other_user.slug)

+ 38 - 56
misago/users/tests/test_useradmin_views.py

@@ -15,6 +15,9 @@ from misago.threads.testutils import post_thread, reply_thread
 from ..models import Ban, Rank
 
 
+UserModel = get_user_model()
+
+
 class UserAdminViewsTests(AdminTestCase):
     AJAX_HEADER = {'HTTP_X_REQUESTED_WITH': 'XMLHttpRequest'}
 
@@ -44,10 +47,9 @@ class UserAdminViewsTests(AdminTestCase):
         response = self.client.get(link_base)
         self.assertEqual(response.status_code, 200)
 
-        User = get_user_model()
-        user_a = User.objects.create_user('Tyrael', 't123@test.com', 'pass123')
-        user_b = User.objects.create_user('Tyrion', 't321@test.com', 'pass123')
-        user_c = User.objects.create_user('Karen', 't432@test.com', 'pass123')
+        user_a = UserModel.objects.create_user('Tyrael', 't123@test.com', 'pass123')
+        user_b = UserModel.objects.create_user('Tyrion', 't321@test.com', 'pass123')
+        user_c = UserModel.objects.create_user('Karen', 't432@test.com', 'pass123')
 
         # Search both
         response = self.client.get('%s&username=tyr' % link_base)
@@ -79,11 +81,9 @@ class UserAdminViewsTests(AdminTestCase):
 
     def test_mass_activation(self):
         """users list activates multiple users"""
-        User = get_user_model()
-
         user_pks = []
         for i in range(10):
-            test_user = User.objects.create_user(
+            test_user = UserModel.objects.create_user(
                 'Bob%s' % i,
                 'bob%s@test.com' % i,
                 'pass123',
@@ -96,18 +96,16 @@ class UserAdminViewsTests(AdminTestCase):
             data={'action': 'activate', 'selected_items': user_pks})
         self.assertEqual(response.status_code, 302)
 
-        inactive_qs = User.objects.filter(id__in=user_pks,
+        inactive_qs = UserModel.objects.filter(id__in=user_pks,
                                           requires_activation=1)
         self.assertEqual(inactive_qs.count(), 0)
         self.assertIn("has been activated", mail.outbox[0].subject)
 
     def test_mass_ban(self):
         """users list bans multiple users"""
-        User = get_user_model()
-
         user_pks = []
         for i in range(10):
-            test_user = User.objects.create_user(
+            test_user = UserModel.objects.create_user(
                 'Bob%s' % i,
                 'bob%s@test.com' % i,
                 'pass123',
@@ -136,11 +134,9 @@ class UserAdminViewsTests(AdminTestCase):
 
     def test_mass_delete_accounts(self):
         """users list deletes users"""
-        User = get_user_model()
-
         user_pks = []
         for i in range(10):
-            test_user = User.objects.create_user(
+            test_user = UserModel.objects.create_user(
                 'Bob%s' % i,
                 'bob%s@test.com' % i,
                 'pass123',
@@ -152,15 +148,13 @@ class UserAdminViewsTests(AdminTestCase):
             reverse('misago:admin:users:accounts:index'),
             data={'action': 'delete_accounts', 'selected_items': user_pks})
         self.assertEqual(response.status_code, 302)
-        self.assertEqual(User.objects.count(), 1)
+        self.assertEqual(UserModel.objects.count(), 1)
 
     def test_mass_delete_all(self):
         """users list deletes users and their content"""
-        User = get_user_model()
-
         user_pks = []
         for i in range(10):
-            test_user = User.objects.create_user(
+            test_user = UserModel.objects.create_user(
                 'Bob%s' % i,
                 'bob%s@test.com' % i,
                 'pass123',
@@ -172,7 +166,7 @@ class UserAdminViewsTests(AdminTestCase):
             reverse('misago:admin:users:accounts:index'),
             data={'action': 'delete_accounts', 'selected_items': user_pks})
         self.assertEqual(response.status_code, 302)
-        self.assertEqual(User.objects.count(), 1)
+        self.assertEqual(UserModel.objects.count(), 1)
 
     def test_new_view(self):
         """new user view creates account"""
@@ -194,13 +188,12 @@ class UserAdminViewsTests(AdminTestCase):
             })
         self.assertEqual(response.status_code, 302)
 
-        User = get_user_model()
-        User.objects.get_by_username('Bawww')
+        UserModel.objects.get_by_username('Bawww')
+        UserModel.objects.get_by_email('reg@stered.com')
 
     def test_edit_view(self):
         """edit user view changes account"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'pass123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@test.com', 'pass123')
         test_link = reverse('misago:admin:users:accounts:edit',
                             kwargs={'pk': test_user.pk})
 
@@ -225,13 +218,13 @@ class UserAdminViewsTests(AdminTestCase):
         })
         self.assertEqual(response.status_code, 302)
 
-        updated_user = User.objects.get(pk=test_user.pk)
+        updated_user = UserModel.objects.get(pk=test_user.pk)
         self.assertTrue(updated_user.check_password('newpass123'))
         self.assertEqual(updated_user.username, 'Bawww')
         self.assertEqual(updated_user.slug, 'bawww')
 
-        User.objects.get_by_username('Bawww')
-        User.objects.get_by_email('reg@stered.com')
+        UserModel.objects.get_by_username('Bawww')
+        UserModel.objects.get_by_email('reg@stered.com')
 
     def test_edit_dont_change_username(self):
         """
@@ -239,8 +232,7 @@ class UserAdminViewsTests(AdminTestCase):
 
         This is regression test for issue #640
         """
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'pass123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@test.com', 'pass123')
         test_link = reverse('misago:admin:users:accounts:edit',
                             kwargs={'pk': test_user.pk})
 
@@ -264,15 +256,14 @@ class UserAdminViewsTests(AdminTestCase):
         })
         self.assertEqual(response.status_code, 302)
 
-        updated_user = User.objects.get(pk=test_user.pk)
+        updated_user = UserModel.objects.get(pk=test_user.pk)
         self.assertEqual(updated_user.username, 'Bob')
         self.assertEqual(updated_user.slug, 'bob')
         self.assertEqual(updated_user.namechanges.count(), 0)
 
     def test_edit_make_admin(self):
         """edit user view allows super admin to make other user admin"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'pass123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@test.com', 'pass123')
         test_link = reverse('misago:admin:users:accounts:edit',
                             kwargs={'pk': test_user.pk})
 
@@ -299,14 +290,13 @@ class UserAdminViewsTests(AdminTestCase):
         })
         self.assertEqual(response.status_code, 302)
 
-        updated_user = User.objects.get(pk=test_user.pk)
+        updated_user = UserModel.objects.get(pk=test_user.pk)
         self.assertTrue(updated_user.is_staff)
         self.assertFalse(updated_user.is_superuser)
 
     def test_edit_make_superadmin_admin(self):
         """edit user view allows super admin to make other user super admin"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'pass123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@test.com', 'pass123')
         test_link = reverse('misago:admin:users:accounts:edit',
                             kwargs={'pk': test_user.pk})
 
@@ -333,7 +323,7 @@ class UserAdminViewsTests(AdminTestCase):
         })
         self.assertEqual(response.status_code, 302)
 
-        updated_user = User.objects.get(pk=test_user.pk)
+        updated_user = UserModel.objects.get(pk=test_user.pk)
         self.assertFalse(updated_user.is_staff)
         self.assertTrue(updated_user.is_superuser)
 
@@ -342,8 +332,7 @@ class UserAdminViewsTests(AdminTestCase):
         self.user.is_superuser = False
         self.user.save()
 
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'pass123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@test.com', 'pass123')
         test_link = reverse('misago:admin:users:accounts:edit',
                             kwargs={'pk': test_user.pk})
 
@@ -370,7 +359,7 @@ class UserAdminViewsTests(AdminTestCase):
         })
         self.assertEqual(response.status_code, 302)
 
-        updated_user = User.objects.get(pk=test_user.pk)
+        updated_user = UserModel.objects.get(pk=test_user.pk)
         self.assertFalse(updated_user.is_staff)
         self.assertFalse(updated_user.is_superuser)
 
@@ -379,8 +368,7 @@ class UserAdminViewsTests(AdminTestCase):
         self.user.is_superuser = False
         self.user.save()
 
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'pass123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@test.com', 'pass123')
         test_link = reverse('misago:admin:users:accounts:edit',
                             kwargs={'pk': test_user.pk})
 
@@ -409,7 +397,7 @@ class UserAdminViewsTests(AdminTestCase):
         })
         self.assertEqual(response.status_code, 302)
 
-        updated_user = User.objects.get(pk=test_user.pk)
+        updated_user = UserModel.objects.get(pk=test_user.pk)
         self.assertFalse(updated_user.is_active)
         self.assertEqual(updated_user.is_active_staff_message, "Disabled in test!")
 
@@ -418,8 +406,7 @@ class UserAdminViewsTests(AdminTestCase):
         self.user.is_superuser = True
         self.user.save()
 
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'pass123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@test.com', 'pass123')
 
         test_user.is_staff = True
         test_user.save()
@@ -452,7 +439,7 @@ class UserAdminViewsTests(AdminTestCase):
         })
         self.assertEqual(response.status_code, 302)
 
-        updated_user = User.objects.get(pk=test_user.pk)
+        updated_user = UserModel.objects.get(pk=test_user.pk)
         self.assertFalse(updated_user.is_active)
         self.assertEqual(updated_user.is_active_staff_message, "Disabled in test!")
 
@@ -461,8 +448,7 @@ class UserAdminViewsTests(AdminTestCase):
         self.user.is_superuser = False
         self.user.save()
 
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'pass123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@test.com', 'pass123')
 
         test_user.is_staff = True
         test_user.save()
@@ -495,7 +481,7 @@ class UserAdminViewsTests(AdminTestCase):
         })
         self.assertEqual(response.status_code, 302)
 
-        updated_user = User.objects.get(pk=test_user.pk)
+        updated_user = UserModel.objects.get(pk=test_user.pk)
         self.assertTrue(updated_user.is_active)
         self.assertFalse(updated_user.is_active_staff_message)
 
@@ -504,8 +490,7 @@ class UserAdminViewsTests(AdminTestCase):
         self.user.is_superuser = True
         self.user.save()
 
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'pass123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@test.com', 'pass123')
 
         test_user.is_staff = True
         test_user.save()
@@ -538,14 +523,13 @@ class UserAdminViewsTests(AdminTestCase):
         })
         self.assertEqual(response.status_code, 302)
 
-        updated_user = User.objects.get(pk=test_user.pk)
+        updated_user = UserModel.objects.get(pk=test_user.pk)
         self.assertFalse(updated_user.is_active)
         self.assertEqual(updated_user.is_active_staff_message, "Disabled in test!")
 
     def test_delete_threads_view(self):
         """delete user threads view deletes threads"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'pass123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@test.com', 'pass123')
         test_link = reverse('misago:admin:users:accounts:delete-threads',
                             kwargs={'pk': test_user.pk})
 
@@ -568,8 +552,7 @@ class UserAdminViewsTests(AdminTestCase):
 
     def test_delete_posts_view(self):
         """delete user posts view deletes posts"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'pass123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@test.com', 'pass123')
         test_link = reverse('misago:admin:users:accounts:delete-posts',
                             kwargs={'pk': test_user.pk})
 
@@ -593,8 +576,7 @@ class UserAdminViewsTests(AdminTestCase):
 
     def test_delete_account_view(self):
         """delete user account view deletes user account"""
-        User = get_user_model()
-        test_user = User.objects.create_user('Bob', 'bob@test.com', 'pass123')
+        test_user = UserModel.objects.create_user('Bob', 'bob@test.com', 'pass123')
         test_link = reverse('misago:admin:users:accounts:delete-account',
                             kwargs={'pk': test_user.pk})
 

+ 19 - 27
misago/users/tests/test_users_api.py

@@ -18,6 +18,9 @@ from ..models import Ban, Rank
 from ..testutils import AuthenticatedUserTestCase
 
 
+UserModel = get_user_model()
+
+
 class ActivePostersListTests(AuthenticatedUserTestCase):
     """
     tests for active posters list (GET /users/?list=active)
@@ -86,8 +89,7 @@ class FollowersListTests(AuthenticatedUserTestCase):
 
     def test_filled_list(self):
         """user with followers returns 200"""
-        User = get_user_model()
-        test_follower = User.objects.create_user(
+        test_follower = UserModel.objects.create_user(
             "TestFollower", "test@follower.com", self.USER_PASSWORD)
         self.user.followed_by.add(test_follower)
 
@@ -116,8 +118,7 @@ class FollowsListTests(AuthenticatedUserTestCase):
 
     def test_filled_list(self):
         """user with follows returns 200"""
-        User = get_user_model()
-        test_follower = User.objects.create_user(
+        test_follower = UserModel.objects.create_user(
             "TestFollower", "test@follower.com", self.USER_PASSWORD)
         self.user.follows.add(test_follower)
 
@@ -127,8 +128,7 @@ class FollowsListTests(AuthenticatedUserTestCase):
 
     def test_filled_list_search(self):
         """follows list is searchable"""
-        User = get_user_model()
-        test_follower = User.objects.create_user(
+        test_follower = UserModel.objects.create_user(
             "TestFollower", "test@follower.com", self.USER_PASSWORD)
         self.user.follows.add(test_follower)
 
@@ -195,8 +195,7 @@ class RankListTests(AuthenticatedUserTestCase):
             is_tab=True
         )
 
-        User = get_user_model()
-        test_user = User.objects.create_user(
+        test_user = UserModel.objects.create_user(
             'Visible', 'visible@te.com', 'Pass.123',
             rank=test_rank, is_active=False
         )
@@ -235,8 +234,7 @@ class UserRetrieveTests(AuthenticatedUserTestCase):
     def setUp(self):
         super(UserRetrieveTests, self).setUp()
 
-        User = get_user_model()
-        self.test_user = User.objects.create_user('Tyrael', 't123@test.com', 'pass123')
+        self.test_user = UserModel.objects.create_user('Tyrael', 't123@test.com', 'pass123')
         self.link = reverse('misago:api:user-detail', kwargs={
             'pk': self.test_user.pk
         })
@@ -339,8 +337,7 @@ class UserFollowTests(AuthenticatedUserTestCase):
     def setUp(self):
         super(UserFollowTests, self).setUp()
 
-        User = get_user_model()
-        self.other_user = User.objects.create_user(
+        self.other_user = UserModel.objects.create_user(
             "OtherUser", "other@user.com", "pass123")
 
         self.link = '/api/users/%s/follow/' % self.other_user.pk
@@ -371,15 +368,14 @@ class UserFollowTests(AuthenticatedUserTestCase):
         response = self.client.post(self.link)
         self.assertEqual(response.status_code, 200)
 
-        User = get_user_model()
 
-        user = User.objects.get(pk=self.user.pk)
+        user = UserModel.objects.get(pk=self.user.pk)
         self.assertEqual(user.followers, 0)
         self.assertEqual(user.following, 1)
         self.assertEqual(user.follows.count(), 1)
         self.assertEqual(user.followed_by.count(), 0)
 
-        followed = User.objects.get(pk=self.other_user.pk)
+        followed = UserModel.objects.get(pk=self.other_user.pk)
         self.assertEqual(followed.followers, 1)
         self.assertEqual(followed.following, 0)
         self.assertEqual(followed.follows.count(), 0)
@@ -388,13 +384,13 @@ class UserFollowTests(AuthenticatedUserTestCase):
         response = self.client.post(self.link)
         self.assertEqual(response.status_code, 200)
 
-        user = User.objects.get(pk=self.user.pk)
+        user = UserModel.objects.get(pk=self.user.pk)
         self.assertEqual(user.followers, 0)
         self.assertEqual(user.following, 0)
         self.assertEqual(user.follows.count(), 0)
         self.assertEqual(user.followed_by.count(), 0)
 
-        followed = User.objects.get(pk=self.other_user.pk)
+        followed = UserModel.objects.get(pk=self.other_user.pk)
         self.assertEqual(followed.followers, 0)
         self.assertEqual(followed.following, 0)
         self.assertEqual(followed.follows.count(), 0)
@@ -408,8 +404,7 @@ class UserBanTests(AuthenticatedUserTestCase):
     def setUp(self):
         super(UserBanTests, self).setUp()
 
-        User = get_user_model()
-        self.other_user = User.objects.create_user(
+        self.other_user = UserModel.objects.create_user(
             "OtherUser", "other@user.com", "pass123")
 
         self.link = '/api/users/%s/ban/' % self.other_user.pk
@@ -460,8 +455,7 @@ class UserDeleteTests(AuthenticatedUserTestCase):
     def setUp(self):
         super(UserDeleteTests, self).setUp()
 
-        User = get_user_model()
-        self.other_user = User.objects.create_user(
+        self.other_user = UserModel.objects.create_user(
             "OtherUser", "other@user.com", "pass123")
 
         self.link = '/api/users/%s/delete/' % self.other_user.pk
@@ -579,9 +573,8 @@ class UserDeleteTests(AuthenticatedUserTestCase):
         }), content_type="application/json")
         self.assertEqual(response.status_code, 200)
 
-        User = get_user_model()
-        with self.assertRaises(User.DoesNotExist):
-            User.objects.get(pk=self.other_user.pk)
+        with self.assertRaises(UserModel.DoesNotExist):
+            UserModel.objects.get(pk=self.other_user.pk)
 
         self.assertEqual(Thread.objects.count(), self.threads)
         self.assertEqual(Post.objects.count(), self.posts)
@@ -598,9 +591,8 @@ class UserDeleteTests(AuthenticatedUserTestCase):
         }), content_type="application/json")
         self.assertEqual(response.status_code, 200)
 
-        User = get_user_model()
-        with self.assertRaises(User.DoesNotExist):
-            User.objects.get(pk=self.other_user.pk)
+        with self.assertRaises(UserModel.DoesNotExist):
+            UserModel.objects.get(pk=self.other_user.pk)
 
         self.assertEqual(Thread.objects.count(), self.threads + 1)
         self.assertEqual(Post.objects.count(), self.posts + 2)

+ 6 - 6
misago/users/tests/test_validators.py

@@ -19,12 +19,13 @@ from ..validators import (
 )
 
 
+UserModel = get_user_model()
+
+
 class ValidateEmailAvailableTests(TestCase):
     def setUp(self):
-        User = get_user_model()
-        self.test_user = User.objects.create_user('EricTheFish',
-                                                  'eric@test.com',
-                                                  'pass123')
+        self.test_user = UserModel.objects.create_user(
+            'EricTheFish', 'eric@test.com', 'pass123')
 
     def test_valid_email(self):
         """validate_email_available allows available emails"""
@@ -72,8 +73,7 @@ class ValidateUsernameTests(TestCase):
 
 class ValidateUsernameAvailableTests(TestCase):
     def setUp(self):
-        User = get_user_model()
-        self.test_user = User.objects.create_user(
+        self.test_user = UserModel.objects.create_user(
             'EricTheFish', 'eric@test.com', 'pass123')
 
     def test_valid_name(self):

+ 6 - 7
misago/users/testutils.py

@@ -1,11 +1,13 @@
 from django.contrib.auth import get_user_model
-from django.urls import reverse
 
 from misago.core.testutils import MisagoTestCase
 
 from .models import AnonymousUser, Online
 
 
+UserModel = get_user_model()
+
+
 class UserTestCase(MisagoTestCase):
     USER_PASSWORD = "Pass.123"
 
@@ -20,13 +22,11 @@ class UserTestCase(MisagoTestCase):
         return AnonymousUser()
 
     def get_authenticated_user(self):
-        User = get_user_model()
-        return User.objects.create_user(
+        return UserModel.objects.create_user(
             "TestUser", "test@user.com", self.USER_PASSWORD)
 
     def get_superuser(self):
-        User = get_user_model()
-        return User.objects.create_superuser(
+        return UserModel.objects.create_superuser(
             "TestSuperUser", "test@superuser.com", self.USER_PASSWORD)
 
     def login_user(self, user, password=None):
@@ -44,8 +44,7 @@ class AuthenticatedUserTestCase(UserTestCase):
         self.login_user(self.user)
 
     def reload_user(self):
-        User = get_user_model()
-        self.user = User.objects.get(id=self.user.id)
+        self.user = UserModel.objects.get(id=self.user.id)
 
 
 class SuperUserTestCase(AuthenticatedUserTestCase):

+ 6 - 6
misago/users/validators.py

@@ -18,17 +18,18 @@ from .bans import get_email_ban, get_username_ban
 
 USERNAME_RE = re.compile(r'^[0-9a-z]+$', re.IGNORECASE)
 
+UserModel = get_user_model()
+
 
 """
 Email validators
 """
 def validate_email_available(value, exclude=None):
-    User = get_user_model()
     try:
-        user = User.objects.get_by_email(value)
+        user = UserModel.objects.get_by_email(value)
         if not exclude or user.pk != exclude.pk:
             raise ValidationError(_("This e-mail address is not available."))
-    except User.DoesNotExist:
+    except UserModel.DoesNotExist:
         pass
 
 
@@ -53,12 +54,11 @@ def validate_email(value, exclude=None):
 Username validators
 """
 def validate_username_available(value, exclude=None):
-    User = get_user_model()
     try:
-        user = User.objects.get_by_username(value)
+        user = UserModel.objects.get_by_username(value)
         if not exclude or user.pk != exclude.pk:
             raise ValidationError(_("This username is not available."))
-    except User.DoesNotExist:
+    except UserModel.DoesNotExist:
         pass
 
 

+ 5 - 3
misago/users/views/activation.py

@@ -12,6 +12,9 @@ from ..decorators import deny_authenticated, deny_banned_ips
 from ..tokens import is_activation_token_valid
 
 
+UserModel = get_user_model()
+
+
 def activation_view(f):
     @deny_authenticated
     @deny_banned_ips
@@ -38,8 +41,7 @@ class ActivationError(Exception):
 
 @activation_view
 def activate_by_token(request, pk, token):
-    User = get_user_model()
-    inactive_user = get_object_or_404(User.objects, pk=pk, is_active=True)
+    inactive_user = get_object_or_404(UserModel, pk=pk, is_active=True)
 
     try:
         if not inactive_user.requires_activation:
@@ -65,7 +67,7 @@ def activate_by_token(request, pk, token):
                 'message': e.args[0],
             }, status=400)
 
-    inactive_user.requires_activation = User.ACTIVATION_NONE
+    inactive_user.requires_activation = UserModel.ACTIVATION_NONE
     inactive_user.save(update_fields=['requires_activation'])
 
     message = _("%(user)s, your account has been activated!")

+ 7 - 7
misago/users/views/admin/users.py

@@ -21,12 +21,13 @@ from ...models import Ban, User
 from ...signatures import set_user_signature
 
 
+UserModel = get_user_model()
+
+
 class UserAdmin(generic.AdminBaseMixin):
     root_link = 'misago:admin:users:accounts:index'
     templates_dir = 'misago/admin/users'
-
-    def get_model(self):
-        return get_user_model()
+    Model = UserModel
 
     def create_form_type(self, request, target):
         add_is_active_fields = False
@@ -106,8 +107,8 @@ class UsersList(UserAdmin, generic.ListView):
             raise generic.MassActionError(message)
         else:
             activated_users_pks = [u.pk for u in inactive_users]
-            queryset = User.objects.filter(pk__in=activated_users_pks)
-            queryset.update(requires_activation=User.ACTIVATION_NONE)
+            queryset = UserModel.objects.filter(pk__in=activated_users_pks)
+            queryset.update(requires_activation=UserModel.ACTIVATION_NONE)
 
             subject = _("Your account on %(forum_name)s forums has been activated")
             mail_subject = subject % {
@@ -237,8 +238,7 @@ class NewUser(UserAdmin, generic.ModelFormView):
     message_submit = _('New user "%(user)s" has been registered.')
 
     def handle_form(self, form, request, target):
-        User = get_user_model()
-        new_user = User.objects.create_user(
+        new_user = UserModel.objects.create_user(
             form.cleaned_data['username'],
             form.cleaned_data['email'],
             form.cleaned_data['new_password'],

+ 11 - 9
misago/users/views/avatarserver.py

@@ -5,21 +5,23 @@ from django.shortcuts import redirect
 from misago.conf import settings
 
 
+UserModel = get_user_model()
+
+
 def user_avatar(request, pk, size):
-    User = get_user_model()
     size = int(size)
 
     try:
-        user = User.objects.get(pk=pk)
-
-        found_avatar = user.avatars[0]
-        for avatar in user.avatars:
-            if avatar['size'] >= size:
-                found_avatar = avatar
-        return redirect(found_avatar['url'])
-    except User.DoesNotExist:
+        user = UserModel.objects.get(pk=pk)
+    except UserModel.DoesNotExist:
         return blank_avatar(request)
 
+    found_avatar = user.avatars[0]
+    for avatar in user.avatars:
+        if avatar['size'] >= size:
+            found_avatar = avatar
+    return redirect(found_avatar['url'])
+
 
 def blank_avatar(request):
     return redirect(static(settings.MISAGO_BLANK_AVATAR))

+ 1 - 2
misago/users/views/forgottenpassword.py

@@ -31,8 +31,7 @@ class ResetError(Exception):
 
 @reset_view
 def reset_password_form(request, pk, token):
-    User = get_user_model()
-    requesting_user = get_object_or_404(User.objects, pk=pk)
+    requesting_user = get_object_or_404(get_user_model(), pk=pk)
 
     try:
         if (request.user.is_authenticated and

+ 4 - 3
misago/users/views/profile.py

@@ -26,12 +26,13 @@ from ..serializers.usernamechange import UsernameChangeSerializer
 from ..viewmodels import UserPosts, UserThreads
 
 
+UserModel = get_user_model()
+
+
 def profile_view(f):
     def decorator(request, *args, **kwargs):
-        User = get_user_model()
-
         relations = ('rank', 'online_tracker', 'ban_cache')
-        queryset = User.objects.select_related(*relations)
+        queryset = UserModel.objects.select_related(*relations)
 
         profile = get_object_or_404(queryset, pk=kwargs.pop('pk'))