Browse Source

move user constants under User model

Rafał Pitoń 8 years ago
parent
commit
9246d037fc

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

@@ -3,6 +3,7 @@ import json
 import requests
 import requests
 from requests.exceptions import RequestException
 from requests.exceptions import RequestException
 
 
+from django.contrib.auth import get_user_model
 from django.http import Http404, JsonResponse
 from django.http import Http404, JsonResponse
 from django.utils.six.moves import range
 from django.utils.six.moves import range
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
@@ -10,21 +11,22 @@ from django.utils.translation import ugettext as _
 from misago import __version__
 from misago import __version__
 from misago.core.cache import cache
 from misago.core.cache import cache
 from misago.threads.models import Post, Thread
 from misago.threads.models import Post, Thread
-from misago.users.models import ACTIVATION_REQUIRED_NONE, User
 
 
 from . import render
 from . import render
 
 
-
 VERSION_CHECK_CACHE_KEY = "misago_version_check"
 VERSION_CHECK_CACHE_KEY = "misago_version_check"
 
 
+UserModel = get_user_model()
+
 
 
 def admin_index(request):
 def admin_index(request):
-    inactive_users = {'requires_activation__gt': ACTIVATION_REQUIRED_NONE}
     db_stats = {
     db_stats = {
         'threads': Thread.objects.count(),
         'threads': Thread.objects.count(),
         'posts': Post.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', {
     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 . import PostingEndpoint, PostingMiddleware
 from ...models import Subscription
 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):
 class SubscribeMiddleware(PostingMiddleware):
     def use_this_middleware(self):
     def use_this_middleware(self):
         return self.mode != PostingEndpoint.EDIT
         return self.mode != PostingEndpoint.EDIT
@@ -16,20 +22,20 @@ class SubscribeMiddleware(PostingMiddleware):
         if self.mode != PostingEndpoint.START:
         if self.mode != PostingEndpoint.START:
             return
             return
 
 
-        if self.user.subscribe_to_started_threads == AUTO_SUBSCRIBE_NONE:
+        if self.user.subscribe_to_started_threads == SUBSCRIBE_NONE:
             return
             return
 
 
         self.user.subscription_set.create(
         self.user.subscription_set.create(
             category=self.thread.category,
             category=self.thread.category,
             thread=self.thread,
             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):
     def subscribe_replied_thread(self):
         if self.mode != PostingEndpoint.REPLY:
         if self.mode != PostingEndpoint.REPLY:
             return
             return
 
 
-        if self.user.subscribe_to_replied_threads == AUTO_SUBSCRIBE_NONE:
+        if self.user.subscribe_to_replied_threads == SUBSCRIBE_NONE:
             return
             return
 
 
         try:
         try:
@@ -45,5 +51,5 @@ class SubscribeMiddleware(PostingMiddleware):
         self.user.subscription_set.create(
         self.user.subscription_set.create(
             category=self.thread.category,
             category=self.thread.category,
             thread=self.thread,
             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.acl.testutils import override_acl
 from misago.categories.models import Category
 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 misago.users.testutils import AuthenticatedUserTestCase
 
 
 from ..models import Thread, ThreadParticipant
 from ..models import Thread, ThreadParticipant
@@ -194,7 +193,10 @@ class StartPrivateThreadTests(AuthenticatedUserTestCase):
 
 
     def test_cant_invite_followers_only(self):
     def test_cant_invite_followers_only(self):
         """api validates that you cant invite followers-only user to thread"""
         """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()
         self.other_user.save()
 
 
         response = self.client.post(self.api_link, data={
         response = self.client.post(self.api_link, data={
@@ -245,7 +247,10 @@ class StartPrivateThreadTests(AuthenticatedUserTestCase):
 
 
     def test_cant_invite_anyone(self):
     def test_cant_invite_anyone(self):
         """api validates that you cant invite nobody user to thread"""
         """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()
         self.other_user.save()
 
 
         response = self.client.post(self.api_link, data={
         response = self.client.post(self.api_link, data={

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

@@ -1,16 +1,19 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
+from django.contrib.auth import get_user_model
 from django.urls import reverse
 from django.urls import reverse
 
 
 from misago.acl.testutils import override_acl
 from misago.acl.testutils import override_acl
 from misago.categories.models import Category
 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 misago.users.testutils import AuthenticatedUserTestCase
 
 
 from .. import testutils
 from .. import testutils
 
 
 
 
+UserModel = get_user_model()
+
+
 class SubscriptionMiddlewareTestCase(AuthenticatedUserTestCase):
 class SubscriptionMiddlewareTestCase(AuthenticatedUserTestCase):
     def setUp(self):
     def setUp(self):
         super(SubscriptionMiddlewareTestCase, self).setUp()
         super(SubscriptionMiddlewareTestCase, self).setUp()
@@ -37,8 +40,8 @@ class SubscribeStartedThreadTests(SubscriptionMiddlewareTestCase):
 
 
     def test_dont_subscribe(self):
     def test_dont_subscribe(self):
         """middleware makes no subscription to thread"""
         """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()
         self.user.save()
 
 
         response = self.client.post(self.api_link, data={
         response = self.client.post(self.api_link, data={
@@ -53,7 +56,7 @@ class SubscribeStartedThreadTests(SubscriptionMiddlewareTestCase):
 
 
     def test_subscribe(self):
     def test_subscribe(self):
         """middleware subscribes thread"""
         """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()
         self.user.save()
 
 
         response = self.client.post(self.api_link, data={
         response = self.client.post(self.api_link, data={
@@ -72,7 +75,7 @@ class SubscribeStartedThreadTests(SubscriptionMiddlewareTestCase):
 
 
     def test_email_subscribe(self):
     def test_email_subscribe(self):
         """middleware subscribes thread with an email"""
         """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()
         self.user.save()
 
 
         response = self.client.post(self.api_link, data={
         response = self.client.post(self.api_link, data={
@@ -100,8 +103,8 @@ class SubscribeRepliedThreadTests(SubscriptionMiddlewareTestCase):
 
 
     def test_dont_subscribe(self):
     def test_dont_subscribe(self):
         """middleware makes no subscription to thread"""
         """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()
         self.user.save()
 
 
         response = self.client.post(self.api_link, data={
         response = self.client.post(self.api_link, data={
@@ -114,7 +117,7 @@ class SubscribeRepliedThreadTests(SubscriptionMiddlewareTestCase):
 
 
     def test_subscribe(self):
     def test_subscribe(self):
         """middleware subscribes thread"""
         """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()
         self.user.save()
 
 
         response = self.client.post(self.api_link, data={
         response = self.client.post(self.api_link, data={
@@ -130,7 +133,7 @@ class SubscribeRepliedThreadTests(SubscriptionMiddlewareTestCase):
 
 
     def test_email_subscribe(self):
     def test_email_subscribe(self):
         """middleware subscribes thread with an email"""
         """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()
         self.user.save()
 
 
         response = self.client.post(self.api_link, data={
         response = self.client.post(self.api_link, data={
@@ -146,7 +149,7 @@ class SubscribeRepliedThreadTests(SubscriptionMiddlewareTestCase):
 
 
     def test_dont_subscribe_replied(self):
     def test_dont_subscribe_replied(self):
         """middleware omits threads user already replied"""
         """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()
         self.user.save()
 
 
         response = self.client.post(self.api_link, data={
         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
 from ..subscriptions import make_subscription_aware
 
 
 
 
+UserModel = get_user_model()
+
+
 class SubscriptionsTests(TestCase):
 class SubscriptionsTests(TestCase):
     def setUp(self):
     def setUp(self):
         self.category = list(Category.objects.all_categories()[:1])[0]
         self.category = list(Category.objects.all_categories()[:1])[0]
         self.thread = self.post_thread(timezone.now() - timedelta(days=10))
         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()
         self.anon = AnonymousUser()
 
 
     def post_thread(self, datetime):
     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 ... import captcha
 from ...forms.register import RegisterForm
 from ...forms.register import RegisterForm
-from ...models import ACTIVATION_REQUIRED_ADMIN, ACTIVATION_REQUIRED_USER
 from ...serializers import AuthenticatedUserSerializer
 from ...serializers import AuthenticatedUserSerializer
 from ...tokens import make_activation_token
 from ...tokens import make_activation_token
 
 
 
 
+UserModel = get_user_model()
+
+
 @csrf_protect
 @csrf_protect
 def create_endpoint(request):
 def create_endpoint(request):
     if settings.account_activation == 'closed':
     if settings.account_activation == 'closed':
@@ -34,15 +36,14 @@ def create_endpoint(request):
     activation_kwargs = {}
     activation_kwargs = {}
     if settings.account_activation == 'user':
     if settings.account_activation == 'user':
         activation_kwargs = {
         activation_kwargs = {
-            'requires_activation': ACTIVATION_REQUIRED_USER
+            'requires_activation': UserModel.ACTIVATION_REQUIRED_USER
         }
         }
     elif settings.account_activation == 'admin':
     elif settings.account_activation == 'admin':
         activation_kwargs = {
         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['username'],
         form.cleaned_data['email'],
         form.cleaned_data['email'],
         form.cleaned_data['password'],
         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.forms import IsoDateTimeField, YesNoSwitch
 from misago.core.validators import validate_sluggable
 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
 from ..validators import validate_email, validate_username
 
 
 
 
@@ -164,18 +161,18 @@ class EditUserForm(UserBaseForm):
     limits_private_thread_invites_to = forms.TypedChoiceField(
     limits_private_thread_invites_to = forms.TypedChoiceField(
         label=_("Who can add user to private threads"),
         label=_("Who can add user to private threads"),
         coerce=int,
         coerce=int,
-        choices=PRIVATE_THREAD_INVITES_LIMITS_CHOICES
+        choices=User.PRIVATE_THREAD_INVITES_LIMITS_CHOICES
     )
     )
 
 
     subscribe_to_started_threads = forms.TypedChoiceField(
     subscribe_to_started_threads = forms.TypedChoiceField(
         label=_("Started threads"),
         label=_("Started threads"),
         coerce=int,
         coerce=int,
-        choices=AUTO_SUBSCRIBE_CHOICES
+        choices=User.AUTO_SUBSCRIBE_CHOICES
     )
     )
     subscribe_to_replied_threads = forms.TypedChoiceField(
     subscribe_to_replied_threads = forms.TypedChoiceField(
         label=_("Replid threads"),
         label=_("Replid threads"),
         coerce=int,
         coerce=int,
-        choices=AUTO_SUBSCRIBE_CHOICES
+        choices=User.AUTO_SUBSCRIBE_CHOICES
     )
     )
 
 
     class Meta:
     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.conf import settings
 from misago.core.forms import YesNoSwitch
 from misago.core.forms import YesNoSwitch
 
 
-from ..models import AUTO_SUBSCRIBE_CHOICES, PRIVATE_THREAD_INVITES_LIMITS_CHOICES
 from ..validators import validate_email
 from ..validators import validate_email
 
 
 
 
+UserModel = get_user_model()
+
+
 class ForumOptionsForm(forms.ModelForm):
 class ForumOptionsForm(forms.ModelForm):
     is_hiding_presence = YesNoSwitch()
     is_hiding_presence = YesNoSwitch()
 
 
     limits_private_thread_invites_to = forms.TypedChoiceField(
     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(
     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(
     subscribe_to_replied_threads = forms.TypedChoiceField(
-        coerce=int, choices=AUTO_SUBSCRIBE_CHOICES)
+        choices=UserModel.AUTO_SUBSCRIBE_CHOICES,
+        coerce=int,
+    )
 
 
     class Meta:
     class Meta:
-        model = get_user_model()
+        model = UserModel
         fields = [
         fields = [
             'is_hiding_presence',
             'is_hiding_presence',
             'limits_private_thread_invites_to',
             'limits_private_thread_invites_to',
@@ -37,7 +43,7 @@ class EditSignatureForm(forms.ModelForm):
     signature = forms.CharField(required=False)
     signature = forms.CharField(required=False)
 
 
     class Meta:
     class Meta:
-        model = get_user_model()
+        model = UserModel
         fields = ['signature']
         fields = ['signature']
 
 
     def clean(self):
     def clean(self):

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

@@ -24,20 +24,6 @@ from .rank import Rank
 
 
 
 
 __all__ = [
 __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',
     'AnonymousUser',
     'User',
     'User',
     'UsernameChange',
     '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):
 class UserManager(BaseUserManager):
     @transaction.atomic
     @transaction.atomic
     def create_user(self, username, email, password=None, set_default_avatar=False, **extra_fields):
     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'
             extra_fields['joined_from_ip'] = '127.0.0.1'
 
 
         WATCH_DICT = {
         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:
         if not 'subscribe_to_started_threads' in extra_fields:
@@ -185,6 +143,30 @@ class UserManager(BaseUserManager):
 
 
 
 
 class User(AbstractBaseUser, PermissionsMixin):
 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.
     Note that "username" field is purely for shows.
     When searching users by their names, always use lowercased string
     When searching users by their names, always use lowercased string
@@ -332,26 +314,26 @@ class User(AbstractBaseUser, PermissionsMixin):
 
 
     @property
     @property
     def requires_activation_by_admin(self):
     def requires_activation_by_admin(self):
-        return self.requires_activation == ACTIVATION_REQUIRED_ADMIN
+        return self.requires_activation == User.ACTIVATION_REQUIRED_ADMIN
 
 
     @property
     @property
     def requires_activation_by_user(self):
     def requires_activation_by_user(self):
-        return self.requires_activation == ACTIVATION_REQUIRED_USER
+        return self.requires_activation == User.ACTIVATION_REQUIRED_USER
 
 
     @property
     @property
     def can_be_messaged_by_everyone(self):
     def can_be_messaged_by_everyone(self):
         preference = self.limits_private_thread_invites_to
         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
     @property
     def can_be_messaged_by_followed(self):
     def can_be_messaged_by_followed(self):
         preference = self.limits_private_thread_invites_to
         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
     @property
     def can_be_messaged_by_nobody(self):
     def can_be_messaged_by_nobody(self):
         preference = self.limits_private_thread_invites_to
         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
     @property
     def has_valid_signature(self):
     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 ..bans import get_user_ban
 from ..decorators import deny_authenticated, deny_banned_ips
 from ..decorators import deny_authenticated, deny_banned_ips
-from ..models import ACTIVATION_REQUIRED_NONE
 from ..tokens import is_activation_token_valid
 from ..tokens import is_activation_token_valid
 
 
 
 
@@ -66,7 +65,7 @@ def activate_by_token(request, pk, token):
                 'message': e.args[0],
                 'message': e.args[0],
             }, status=400)
             }, status=400)
 
 
-    inactive_user.requires_activation = ACTIVATION_REQUIRED_NONE
+    inactive_user.requires_activation = User.ACTIVATION_REQUIRED_NONE
     inactive_user.save(update_fields=['requires_activation'])
     inactive_user.save(update_fields=['requires_activation'])
 
 
     message = _("%(user)s, your account has been activated!")
     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 (
 from ...forms.admin import (
     BanUsersForm, NewUserForm, SearchUsersForm,
     BanUsersForm, NewUserForm, SearchUsersForm,
     EditUserForm, EditUserFormFactory)
     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 ...models.ban import BAN_EMAIL, BAN_IP, BAN_USERNAME
 from ...signatures import set_user_signature
 from ...signatures import set_user_signature
 
 
@@ -108,7 +108,7 @@ class UsersList(UserAdmin, generic.ListView):
         else:
         else:
             activated_users_pks = [u.pk for u in inactive_users]
             activated_users_pks = [u.pk for u in inactive_users]
             queryset = User.objects.filter(pk__in=activated_users_pks)
             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")
             subject = _("Your account on %(forum_name)s forums has been activated")
             mail_subject = subject % {
             mail_subject = subject % {