Просмотр исходного кода

move user constants under User model

Rafał Pitoń 8 лет назад
Родитель
Сommit
9246d037fc

+ 7 - 5
misago/admin/views/index.py

@@ -3,6 +3,7 @@ import json
 import requests
 from requests.exceptions import RequestException
 
+from django.contrib.auth import get_user_model
 from django.http import Http404, JsonResponse
 from django.utils.six.moves import range
 from django.utils.translation import ugettext as _
@@ -10,21 +11,22 @@ from django.utils.translation import ugettext as _
 from misago import __version__
 from misago.core.cache import cache
 from misago.threads.models import Post, Thread
-from misago.users.models import ACTIVATION_REQUIRED_NONE, User
 
 from . import render
 
-
 VERSION_CHECK_CACHE_KEY = "misago_version_check"
 
+UserModel = get_user_model()
+
 
 def admin_index(request):
-    inactive_users = {'requires_activation__gt': ACTIVATION_REQUIRED_NONE}
     db_stats = {
         'threads': Thread.objects.count(),
         'posts': Post.objects.count(),
-        'users': User.objects.count(),
-        'inactive_users': User.objects.filter(**inactive_users).count()
+        'users': UserModel.objects.count(),
+        'inactive_users': UserModel.objects.exclude(
+            requires_activation=UserModel.ACTIVATION_REQUIRED_NONE
+        ).count()
     }
 
     return render(request, 'misago/admin/index.html', {

+ 11 - 5
misago/threads/api/postingendpoint/subscribe.py

@@ -1,9 +1,15 @@
-from misago.users.models import AUTO_SUBSCRIBE_NONE, AUTO_SUBSCRIBE_NOTIFY, AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL
+from django.contrib.auth import get_user_model
 
 from . import PostingEndpoint, PostingMiddleware
 from ...models import Subscription
 
 
+UserModel = get_user_model()
+
+SUBSCRIBE_NONE = UserModel.AUTO_SUBSCRIBE_NONE
+SUBSCRIBE_ALL = UserModel.AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL
+
+
 class SubscribeMiddleware(PostingMiddleware):
     def use_this_middleware(self):
         return self.mode != PostingEndpoint.EDIT
@@ -16,20 +22,20 @@ class SubscribeMiddleware(PostingMiddleware):
         if self.mode != PostingEndpoint.START:
             return
 
-        if self.user.subscribe_to_started_threads == AUTO_SUBSCRIBE_NONE:
+        if self.user.subscribe_to_started_threads == SUBSCRIBE_NONE:
             return
 
         self.user.subscription_set.create(
             category=self.thread.category,
             thread=self.thread,
-            send_email=self.user.subscribe_to_started_threads == AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL
+            send_email=self.user.subscribe_to_started_threads == SUBSCRIBE_ALL
         )
 
     def subscribe_replied_thread(self):
         if self.mode != PostingEndpoint.REPLY:
             return
 
-        if self.user.subscribe_to_replied_threads == AUTO_SUBSCRIBE_NONE:
+        if self.user.subscribe_to_replied_threads == SUBSCRIBE_NONE:
             return
 
         try:
@@ -45,5 +51,5 @@ class SubscribeMiddleware(PostingMiddleware):
         self.user.subscription_set.create(
             category=self.thread.category,
             thread=self.thread,
-            send_email=self.user.subscribe_to_replied_threads == AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL
+            send_email=self.user.subscribe_to_replied_threads == SUBSCRIBE_ALL
         )

+ 8 - 3
misago/threads/tests/test_privatethread_start_api.py

@@ -10,7 +10,6 @@ from django.utils.encoding import smart_str
 
 from misago.acl.testutils import override_acl
 from misago.categories.models import Category
-from misago.users.models import LIMITS_PRIVATE_THREAD_INVITES_TO_FOLLOWED, LIMITS_PRIVATE_THREAD_INVITES_TO_NOBODY
 from misago.users.testutils import AuthenticatedUserTestCase
 
 from ..models import Thread, ThreadParticipant
@@ -194,7 +193,10 @@ class StartPrivateThreadTests(AuthenticatedUserTestCase):
 
     def test_cant_invite_followers_only(self):
         """api validates that you cant invite followers-only user to thread"""
-        self.other_user.limits_private_thread_invites_to = LIMITS_PRIVATE_THREAD_INVITES_TO_FOLLOWED
+        User = get_user_model()
+
+        user_constant = User.LIMITS_PRIVATE_THREAD_INVITES_TO_FOLLOWED
+        self.other_user.limits_private_thread_invites_to = user_constant
         self.other_user.save()
 
         response = self.client.post(self.api_link, data={
@@ -245,7 +247,10 @@ class StartPrivateThreadTests(AuthenticatedUserTestCase):
 
     def test_cant_invite_anyone(self):
         """api validates that you cant invite nobody user to thread"""
-        self.other_user.limits_private_thread_invites_to = LIMITS_PRIVATE_THREAD_INVITES_TO_NOBODY
+        User = get_user_model()
+
+        user_constant = User.LIMITS_PRIVATE_THREAD_INVITES_TO_NOBODY
+        self.other_user.limits_private_thread_invites_to = user_constant
         self.other_user.save()
 
         response = self.client.post(self.api_link, data={

+ 13 - 10
misago/threads/tests/test_subscription_middleware.py

@@ -1,16 +1,19 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 
+from django.contrib.auth import get_user_model
 from django.urls import reverse
 
 from misago.acl.testutils import override_acl
 from misago.categories.models import Category
-from misago.users.models import AUTO_SUBSCRIBE_NONE, AUTO_SUBSCRIBE_NOTIFY, AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL
 from misago.users.testutils import AuthenticatedUserTestCase
 
 from .. import testutils
 
 
+UserModel = get_user_model()
+
+
 class SubscriptionMiddlewareTestCase(AuthenticatedUserTestCase):
     def setUp(self):
         super(SubscriptionMiddlewareTestCase, self).setUp()
@@ -37,8 +40,8 @@ class SubscribeStartedThreadTests(SubscriptionMiddlewareTestCase):
 
     def test_dont_subscribe(self):
         """middleware makes no subscription to thread"""
-        self.user.subscribe_to_started_threads = AUTO_SUBSCRIBE_NONE
-        self.user.subscribe_to_replied_threads = AUTO_SUBSCRIBE_NOTIFY
+        self.user.subscribe_to_started_threads = UserModel.AUTO_SUBSCRIBE_NONE
+        self.user.subscribe_to_replied_threads = UserModel.AUTO_SUBSCRIBE_NOTIFY
         self.user.save()
 
         response = self.client.post(self.api_link, data={
@@ -53,7 +56,7 @@ class SubscribeStartedThreadTests(SubscriptionMiddlewareTestCase):
 
     def test_subscribe(self):
         """middleware subscribes thread"""
-        self.user.subscribe_to_started_threads = AUTO_SUBSCRIBE_NOTIFY
+        self.user.subscribe_to_started_threads = UserModel.AUTO_SUBSCRIBE_NOTIFY
         self.user.save()
 
         response = self.client.post(self.api_link, data={
@@ -72,7 +75,7 @@ class SubscribeStartedThreadTests(SubscriptionMiddlewareTestCase):
 
     def test_email_subscribe(self):
         """middleware subscribes thread with an email"""
-        self.user.subscribe_to_started_threads = AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL
+        self.user.subscribe_to_started_threads = UserModel.AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL
         self.user.save()
 
         response = self.client.post(self.api_link, data={
@@ -100,8 +103,8 @@ class SubscribeRepliedThreadTests(SubscriptionMiddlewareTestCase):
 
     def test_dont_subscribe(self):
         """middleware makes no subscription to thread"""
-        self.user.subscribe_to_started_threads = AUTO_SUBSCRIBE_NOTIFY
-        self.user.subscribe_to_replied_threads = AUTO_SUBSCRIBE_NONE
+        self.user.subscribe_to_started_threads = UserModel.AUTO_SUBSCRIBE_NOTIFY
+        self.user.subscribe_to_replied_threads = UserModel.AUTO_SUBSCRIBE_NONE
         self.user.save()
 
         response = self.client.post(self.api_link, data={
@@ -114,7 +117,7 @@ class SubscribeRepliedThreadTests(SubscriptionMiddlewareTestCase):
 
     def test_subscribe(self):
         """middleware subscribes thread"""
-        self.user.subscribe_to_replied_threads = AUTO_SUBSCRIBE_NOTIFY
+        self.user.subscribe_to_replied_threads = UserModel.AUTO_SUBSCRIBE_NOTIFY
         self.user.save()
 
         response = self.client.post(self.api_link, data={
@@ -130,7 +133,7 @@ class SubscribeRepliedThreadTests(SubscriptionMiddlewareTestCase):
 
     def test_email_subscribe(self):
         """middleware subscribes thread with an email"""
-        self.user.subscribe_to_replied_threads = AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL
+        self.user.subscribe_to_replied_threads = UserModel.AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL
         self.user.save()
 
         response = self.client.post(self.api_link, data={
@@ -146,7 +149,7 @@ class SubscribeRepliedThreadTests(SubscriptionMiddlewareTestCase):
 
     def test_dont_subscribe_replied(self):
         """middleware omits threads user already replied"""
-        self.user.subscribe_to_replied_threads = AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL
+        self.user.subscribe_to_replied_threads = UserModel.AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL
         self.user.save()
 
         response = self.client.post(self.api_link, data={

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

@@ -12,13 +12,16 @@ from .. import testutils
 from ..subscriptions import make_subscription_aware
 
 
+UserModel = get_user_model()
+
+
 class SubscriptionsTests(TestCase):
     def setUp(self):
         self.category = list(Category.objects.all_categories()[:1])[0]
         self.thread = self.post_thread(timezone.now() - timedelta(days=10))
 
-        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):

+ 6 - 5
misago/users/api/userendpoints/create.py

@@ -11,11 +11,13 @@ from misago.core.mail import mail_user
 
 from ... import captcha
 from ...forms.register import RegisterForm
-from ...models import ACTIVATION_REQUIRED_ADMIN, ACTIVATION_REQUIRED_USER
 from ...serializers import AuthenticatedUserSerializer
 from ...tokens import make_activation_token
 
 
+UserModel = get_user_model()
+
+
 @csrf_protect
 def create_endpoint(request):
     if settings.account_activation == 'closed':
@@ -34,15 +36,14 @@ def create_endpoint(request):
     activation_kwargs = {}
     if settings.account_activation == 'user':
         activation_kwargs = {
-            'requires_activation': ACTIVATION_REQUIRED_USER
+            'requires_activation': UserModel.ACTIVATION_REQUIRED_USER
         }
     elif settings.account_activation == 'admin':
         activation_kwargs = {
-            'requires_activation': ACTIVATION_REQUIRED_ADMIN
+            'requires_activation': UserModel.ACTIVATION_REQUIRED_ADMIN
         }
 
-    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['password'],

+ 4 - 7
misago/users/forms/admin.py

@@ -10,10 +10,7 @@ from misago.core import threadstore
 from misago.core.forms import IsoDateTimeField, YesNoSwitch
 from misago.core.validators import validate_sluggable
 
-from ..models import (
-    AUTO_SUBSCRIBE_CHOICES, BANS_CHOICES, PRIVATE_THREAD_INVITES_LIMITS_CHOICES,
-    Ban, Rank
-)
+from ..models import BANS_CHOICES, Ban, Rank, User
 from ..validators import validate_email, validate_username
 
 
@@ -164,18 +161,18 @@ class EditUserForm(UserBaseForm):
     limits_private_thread_invites_to = forms.TypedChoiceField(
         label=_("Who can add user to private threads"),
         coerce=int,
-        choices=PRIVATE_THREAD_INVITES_LIMITS_CHOICES
+        choices=User.PRIVATE_THREAD_INVITES_LIMITS_CHOICES
     )
 
     subscribe_to_started_threads = forms.TypedChoiceField(
         label=_("Started threads"),
         coerce=int,
-        choices=AUTO_SUBSCRIBE_CHOICES
+        choices=User.AUTO_SUBSCRIBE_CHOICES
     )
     subscribe_to_replied_threads = forms.TypedChoiceField(
         label=_("Replid threads"),
         coerce=int,
-        choices=AUTO_SUBSCRIBE_CHOICES
+        choices=User.AUTO_SUBSCRIBE_CHOICES
     )
 
     class Meta:

+ 14 - 8
misago/users/forms/options.py

@@ -7,24 +7,30 @@ from django.utils.translation import ungettext
 from misago.conf import settings
 from misago.core.forms import YesNoSwitch
 
-from ..models import AUTO_SUBSCRIBE_CHOICES, PRIVATE_THREAD_INVITES_LIMITS_CHOICES
 from ..validators import validate_email
 
 
+UserModel = get_user_model()
+
+
 class ForumOptionsForm(forms.ModelForm):
     is_hiding_presence = YesNoSwitch()
 
     limits_private_thread_invites_to = forms.TypedChoiceField(
-        coerce=int, choices=PRIVATE_THREAD_INVITES_LIMITS_CHOICES)
-
+        choices=UserModel.PRIVATE_THREAD_INVITES_LIMITS_CHOICES,
+        coerce=int,
+    )
     subscribe_to_started_threads = forms.TypedChoiceField(
-        coerce=int, choices=AUTO_SUBSCRIBE_CHOICES)
-
+        choices=UserModel.AUTO_SUBSCRIBE_CHOICES,
+        coerce=int,
+    )
     subscribe_to_replied_threads = forms.TypedChoiceField(
-        coerce=int, choices=AUTO_SUBSCRIBE_CHOICES)
+        choices=UserModel.AUTO_SUBSCRIBE_CHOICES,
+        coerce=int,
+    )
 
     class Meta:
-        model = get_user_model()
+        model = UserModel
         fields = [
             'is_hiding_presence',
             'limits_private_thread_invites_to',
@@ -37,7 +43,7 @@ class EditSignatureForm(forms.ModelForm):
     signature = forms.CharField(required=False)
 
     class Meta:
-        model = get_user_model()
+        model = UserModel
         fields = ['signature']
 
     def clean(self):

+ 32 - 50
misago/users/models/user.py

@@ -24,20 +24,6 @@ from .rank import Rank
 
 
 __all__ = [
-    'ACTIVATION_REQUIRED_NONE',
-    'ACTIVATION_REQUIRED_USER',
-    'ACTIVATION_REQUIRED_ADMIN',
-
-    'AUTO_SUBSCRIBE_NONE',
-    'AUTO_SUBSCRIBE_NOTIFY',
-    'AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL',
-    'AUTO_SUBSCRIBE_CHOICES',
-
-    'LIMITS_PRIVATE_THREAD_INVITES_TO_NONE',
-    'LIMITS_PRIVATE_THREAD_INVITES_TO_FOLLOWED',
-    'LIMITS_PRIVATE_THREAD_INVITES_TO_NOBODY',
-    'PRIVATE_THREAD_INVITES_LIMITS_CHOICES',
-
     'AnonymousUser',
     'User',
     'UsernameChange',
@@ -45,34 +31,6 @@ __all__ = [
 ]
 
 
-ACTIVATION_REQUIRED_NONE = 0
-ACTIVATION_REQUIRED_USER = 1
-ACTIVATION_REQUIRED_ADMIN = 2
-
-
-AUTO_SUBSCRIBE_NONE = 0
-AUTO_SUBSCRIBE_NOTIFY = 1
-AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL = 2
-
-AUTO_SUBSCRIBE_CHOICES = (
-    (AUTO_SUBSCRIBE_NONE, _("No")),
-    (AUTO_SUBSCRIBE_NOTIFY, _("Notify")),
-    (AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL,
-     _("Notify with e-mail"))
-)
-
-
-LIMITS_PRIVATE_THREAD_INVITES_TO_NONE = 0
-LIMITS_PRIVATE_THREAD_INVITES_TO_FOLLOWED = 1
-LIMITS_PRIVATE_THREAD_INVITES_TO_NOBODY = 2
-
-PRIVATE_THREAD_INVITES_LIMITS_CHOICES = (
-    (LIMITS_PRIVATE_THREAD_INVITES_TO_NONE, _("Everybody")),
-    (LIMITS_PRIVATE_THREAD_INVITES_TO_FOLLOWED, _("Users I follow")),
-    (LIMITS_PRIVATE_THREAD_INVITES_TO_NOBODY, _("Nobody")),
-)
-
-
 class UserManager(BaseUserManager):
     @transaction.atomic
     def create_user(self, username, email, password=None, set_default_avatar=False, **extra_fields):
@@ -90,9 +48,9 @@ class UserManager(BaseUserManager):
             extra_fields['joined_from_ip'] = '127.0.0.1'
 
         WATCH_DICT = {
-            'no': AUTO_SUBSCRIBE_NONE,
-            'watch': AUTO_SUBSCRIBE_NOTIFY,
-            'watch_email': AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL,
+            'no':  self.model.AUTO_SUBSCRIBE_NONE,
+            'watch':  self.model.AUTO_SUBSCRIBE_NOTIFY,
+            'watch_email':  self.model.AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL,
         }
 
         if not 'subscribe_to_started_threads' in extra_fields:
@@ -185,6 +143,30 @@ class UserManager(BaseUserManager):
 
 
 class User(AbstractBaseUser, PermissionsMixin):
+    ACTIVATION_REQUIRED_NONE = 0
+    ACTIVATION_REQUIRED_USER = 1
+    ACTIVATION_REQUIRED_ADMIN = 2
+
+    AUTO_SUBSCRIBE_NONE = 0
+    AUTO_SUBSCRIBE_NOTIFY = 1
+    AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL = 2
+
+    LIMITS_PRIVATE_THREAD_INVITES_TO_NONE = 0
+    LIMITS_PRIVATE_THREAD_INVITES_TO_FOLLOWED = 1
+    LIMITS_PRIVATE_THREAD_INVITES_TO_NOBODY = 2
+
+    AUTO_SUBSCRIBE_CHOICES = (
+        (AUTO_SUBSCRIBE_NONE, _("No")),
+        (AUTO_SUBSCRIBE_NOTIFY, _("Notify")),
+        (AUTO_SUBSCRIBE_NOTIFY_AND_EMAIL, _("Notify with e-mail"))
+    )
+
+    PRIVATE_THREAD_INVITES_LIMITS_CHOICES = (
+        (LIMITS_PRIVATE_THREAD_INVITES_TO_NONE, _("Everybody")),
+        (LIMITS_PRIVATE_THREAD_INVITES_TO_FOLLOWED, _("Users I follow")),
+        (LIMITS_PRIVATE_THREAD_INVITES_TO_NOBODY, _("Nobody")),
+    )
+
     """
     Note that "username" field is purely for shows.
     When searching users by their names, always use lowercased string
@@ -332,26 +314,26 @@ class User(AbstractBaseUser, PermissionsMixin):
 
     @property
     def requires_activation_by_admin(self):
-        return self.requires_activation == ACTIVATION_REQUIRED_ADMIN
+        return self.requires_activation == User.ACTIVATION_REQUIRED_ADMIN
 
     @property
     def requires_activation_by_user(self):
-        return self.requires_activation == ACTIVATION_REQUIRED_USER
+        return self.requires_activation == User.ACTIVATION_REQUIRED_USER
 
     @property
     def can_be_messaged_by_everyone(self):
         preference = self.limits_private_thread_invites_to
-        return preference == LIMITS_PRIVATE_THREAD_INVITES_TO_NONE
+        return preference == User.LIMITS_PRIVATE_THREAD_INVITES_TO_NONE
 
     @property
     def can_be_messaged_by_followed(self):
         preference = self.limits_private_thread_invites_to
-        return preference == LIMITS_PRIVATE_THREAD_INVITES_TO_FOLLOWED
+        return preference == User.LIMITS_PRIVATE_THREAD_INVITES_TO_FOLLOWED
 
     @property
     def can_be_messaged_by_nobody(self):
         preference = self.limits_private_thread_invites_to
-        return preference == LIMITS_PRIVATE_THREAD_INVITES_TO_NOBODY
+        return preference == User.LIMITS_PRIVATE_THREAD_INVITES_TO_NOBODY
 
     @property
     def has_valid_signature(self):

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

@@ -9,7 +9,6 @@ from misago.core.mail import mail_user
 
 from ..bans import get_user_ban
 from ..decorators import deny_authenticated, deny_banned_ips
-from ..models import ACTIVATION_REQUIRED_NONE
 from ..tokens import is_activation_token_valid
 
 
@@ -66,7 +65,7 @@ def activate_by_token(request, pk, token):
                 'message': e.args[0],
             }, status=400)
 
-    inactive_user.requires_activation = ACTIVATION_REQUIRED_NONE
+    inactive_user.requires_activation = User.ACTIVATION_REQUIRED_NONE
     inactive_user.save(update_fields=['requires_activation'])
 
     message = _("%(user)s, your account has been activated!")

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

@@ -17,7 +17,7 @@ from ...avatars.dynamic import set_avatar as set_dynamic_avatar
 from ...forms.admin import (
     BanUsersForm, NewUserForm, SearchUsersForm,
     EditUserForm, EditUserFormFactory)
-from ...models import ACTIVATION_REQUIRED_NONE, Ban, User
+from ...models import Ban, User
 from ...models.ban import BAN_EMAIL, BAN_IP, BAN_USERNAME
 from ...signatures import set_user_signature
 
@@ -108,7 +108,7 @@ class UsersList(UserAdmin, generic.ListView):
         else:
             activated_users_pks = [u.pk for u in inactive_users]
             queryset = User.objects.filter(pk__in=activated_users_pks)
-            queryset.update(requires_activation=ACTIVATION_REQUIRED_NONE)
+            queryset.update(requires_activation=User.ACTIVATION_REQUIRED_NONE)
 
             subject = _("Your account on %(forum_name)s forums has been activated")
             mail_subject = subject % {