Browse Source

added isort for automatic sorting of imports

Rafał Pitoń 9 years ago
parent
commit
5ac973fbd7
260 changed files with 471 additions and 473 deletions
  1. 9 0
      .isort.cfg
  2. 2 2
      misago/acl/admin.py
  3. 2 3
      misago/acl/api.py
  4. 1 2
      misago/acl/forms.py
  5. 1 1
      misago/acl/migrations/0001_initial.py
  6. 1 1
      misago/acl/migrations/0002_acl_version_tracker.py
  7. 1 2
      misago/acl/models.py
  8. 1 0
      misago/acl/panels.py
  9. 1 0
      misago/acl/tests/test_acl_algebra.py
  10. 1 2
      misago/acl/tests/test_api.py
  11. 0 1
      misago/acl/tests/test_providers.py
  12. 1 2
      misago/acl/tests/test_roleadmin_views.py
  13. 2 1
      misago/acl/testutils.py
  14. 1 2
      misago/acl/views.py
  15. 2 1
      misago/admin/auth.py
  16. 1 0
      misago/admin/tests/test_admin_hierarchy.py
  17. 1 1
      misago/admin/urlpatterns.py
  18. 1 1
      misago/admin/urls.py
  19. 3 4
      misago/admin/views/auth.py
  20. 2 2
      misago/admin/views/errorpages.py
  21. 1 0
      misago/admin/views/generic/base.py
  22. 2 3
      misago/admin/views/generic/list.py
  23. 3 5
      misago/admin/views/index.py
  24. 14 2
      misago/categories/admin.py
  25. 3 3
      misago/categories/forms.py
  26. 2 1
      misago/categories/management/commands/synchronizecategories.py
  27. 4 3
      misago/categories/migrations/0001_initial.py
  28. 1 1
      misago/categories/migrations/0002_default_categories.py
  29. 1 1
      misago/categories/migrations/0003_categories_roles.py
  30. 1 1
      misago/categories/migrations/0004_category_last_thread.py
  31. 3 3
      misago/categories/models.py
  32. 1 3
      misago/categories/permissions.py
  33. 2 2
      misago/categories/serializers.py
  34. 5 4
      misago/categories/signals.py
  35. 2 1
      misago/categories/tests/test_categories_admin_views.py
  36. 1 2
      misago/categories/tests/test_category_model.py
  37. 0 1
      misago/categories/tests/test_permissions_admin_views.py
  38. 1 2
      misago/categories/tests/test_prunecategories.py
  39. 1 2
      misago/categories/tests/test_synchronizecategories.py
  40. 3 4
      misago/categories/tests/test_utils.py
  41. 3 4
      misago/categories/tests/test_views.py
  42. 1 0
      misago/categories/urls/api.py
  43. 2 3
      misago/categories/utils.py
  44. 1 2
      misago/categories/views/categoriesadmin.py
  45. 2 3
      misago/categories/views/permsadmin.py
  46. 1 0
      misago/conf/admin.py
  47. 2 1
      misago/conf/context_processors.py
  48. 2 0
      misago/conf/defaults.py
  49. 3 1
      misago/conf/forms.py
  50. 1 0
      misago/conf/gateway.py
  51. 1 1
      misago/conf/migrations/0001_initial.py
  52. 2 3
      misago/conf/migrationutils.py
  53. 1 2
      misago/conf/models.py
  54. 0 1
      misago/conf/tests/test_admin_views.py
  55. 1 2
      misago/conf/tests/test_context_processors.py
  56. 1 1
      misago/conf/tests/test_hydrators.py
  57. 1 2
      misago/conf/tests/test_migrationutils.py
  58. 1 0
      misago/conf/tests/test_models.py
  59. 3 4
      misago/conf/tests/test_settings.py
  60. 0 1
      misago/conf/views.py
  61. 2 1
      misago/core/apipaginator.py
  62. 1 2
      misago/core/apirouter.py
  63. 2 2
      misago/core/cache.py
  64. 1 0
      misago/core/cachebuster.py
  65. 1 1
      misago/core/errorpages.py
  66. 1 2
      misago/core/exceptionhandler.py
  67. 1 2
      misago/core/management/commands/misagodbrelations.py
  68. 1 1
      misago/core/migrations/0001_initial.py
  69. 1 1
      misago/core/migrations/0002_basic_settings.py
  70. 1 0
      misago/core/momentjs.py
  71. 1 2
      misago/core/pgutils.py
  72. 4 1
      misago/core/serializer.py
  73. 1 1
      misago/core/setup.py
  74. 1 0
      misago/core/shortcuts.py
  75. 2 1
      misago/core/templatetags/misago_pagetitle.py
  76. 1 1
      misago/core/templatetags/misago_stringutils.py
  77. 3 2
      misago/core/testproject/urls.py
  78. 0 1
      misago/core/testproject/views.py
  79. 1 0
      misago/core/tests/test_apipaginator.py
  80. 1 1
      misago/core/tests/test_apipatch.py
  81. 1 0
      misago/core/tests/test_context_processors.py
  82. 1 3
      misago/core/tests/test_errorpages.py
  83. 1 2
      misago/core/tests/test_exceptionhandler_middleware.py
  84. 1 2
      misago/core/tests/test_exceptionhandlers.py
  85. 1 0
      misago/core/tests/test_forms.py
  86. 1 0
      misago/core/tests/test_frontendcontext_middleware.py
  87. 1 1
      misago/core/tests/test_momentjs.py
  88. 1 0
      misago/core/tests/test_page.py
  89. 1 1
      misago/core/tests/test_serializer.py
  90. 1 0
      misago/core/tests/test_setup.py
  91. 1 1
      misago/core/tests/test_shortcuts.py
  92. 1 1
      misago/core/tests/test_threadstore.py
  93. 7 3
      misago/core/tests/test_utils.py
  94. 2 1
      misago/core/testutils.py
  95. 3 2
      misago/core/utils.py
  96. 1 0
      misago/core/validators.py
  97. 1 2
      misago/core/views.py
  98. 4 4
      misago/faker/management/commands/createfakebans.py
  99. 4 4
      misago/faker/management/commands/createfakecategories.py
  100. 2 2
      misago/faker/management/commands/createfakethreads.py
  101. 3 3
      misago/faker/management/commands/createfakeusers.py
  102. 1 0
      misago/legal/context_processors.py
  103. 1 1
      misago/legal/migrations/0001_initial.py
  104. 0 1
      misago/legal/tests.py
  105. 1 0
      misago/legal/urls.py
  106. 2 2
      misago/markup/parser.py
  107. 1 0
      misago/markup/pipeline.py
  108. 1 0
      misago/project_template/manage.py
  109. 3 3
      misago/project_template/project_name/settings.py
  110. 6 5
      misago/project_template/project_name/urls.py
  111. 4 1
      misago/project_template/project_name/wsgi.py
  112. 1 3
      misago/readtracker/categoriestracker.py
  113. 1 0
      misago/readtracker/dates.py
  114. 1 1
      misago/readtracker/migrations/0001_initial.py
  115. 1 1
      misago/readtracker/signals.py
  116. 1 2
      misago/readtracker/tests/test_readtracker.py
  117. 1 2
      misago/threads/api/threadendpoints/list.py
  118. 4 4
      misago/threads/api/threadendpoints/merge.py
  119. 1 3
      misago/threads/api/threadendpoints/patch.py
  120. 0 1
      misago/threads/api/threadposts.py
  121. 2 2
      misago/threads/api/threads.py
  122. 1 1
      misago/threads/counts.py
  123. 1 0
      misago/threads/events.py
  124. 0 1
      misago/threads/management/commands/synchronizethreads.py
  125. 4 4
      misago/threads/migrations/0001_initial.py
  126. 1 1
      misago/threads/migrations/0002_threads_settings.py
  127. 1 2
      misago/threads/models/post.py
  128. 2 1
      misago/threads/models/subscription.py
  129. 1 0
      misago/threads/models/threadparticipant.py
  130. 0 1
      misago/threads/participants.py
  131. 4 4
      misago/threads/permissions/threads.py
  132. 2 2
      misago/threads/serializers/moderation.py
  133. 2 2
      misago/threads/serializers/post.py
  134. 1 1
      misago/threads/serializers/thread.py
  135. 7 9
      misago/threads/signals.py
  136. 1 1
      misago/threads/subscriptions.py
  137. 2 4
      misago/threads/tests/-test_floodprotection_middleware.py
  138. 1 3
      misago/threads/tests/test_events.py
  139. 8 4
      misago/threads/tests/test_participants.py
  140. 1 2
      misago/threads/tests/test_post_model.py
  141. 2 3
      misago/threads/tests/test_posts_moderation.py
  142. 1 2
      misago/threads/tests/test_subscriptions.py
  143. 0 1
      misago/threads/tests/test_synchronizethreads.py
  144. 1 2
      misago/threads/tests/test_thread_model.py
  145. 0 1
      misago/threads/tests/test_thread_patch_api.py
  146. 1 3
      misago/threads/tests/test_threadparticipant_model.py
  147. 1 2
      misago/threads/tests/test_threads_api.py
  148. 1 2
      misago/threads/tests/test_threads_merge_api.py
  149. 2 3
      misago/threads/tests/test_threads_moderation.py
  150. 1 2
      misago/threads/tests/test_threadslists.py
  151. 1 2
      misago/threads/tests/test_threadview.py
  152. 1 0
      misago/threads/tests/test_typestree.py
  153. 1 2
      misago/threads/tests/test_utils.py
  154. 0 1
      misago/threads/tests/test_validators.py
  155. 1 2
      misago/threads/testutils.py
  156. 1 0
      misago/threads/threadtypes/privatethread.py
  157. 1 0
      misago/threads/threadtypes/thread.py
  158. 2 1
      misago/threads/validators.py
  159. 2 3
      misago/threads/viewmodels/category.py
  160. 1 2
      misago/threads/viewmodels/posts.py
  161. 0 1
      misago/threads/viewmodels/thread.py
  162. 2 2
      misago/threads/viewmodels/threads.py
  163. 1 1
      misago/threads/views/list.py
  164. 1 1
      misago/threads/views/thread.py
  165. 1 0
      misago/urls.py
  166. 1 2
      misago/users/activepostersranking.py
  167. 25 9
      misago/users/admin.py
  168. 2 3
      misago/users/api/auth.py
  169. 1 1
      misago/users/api/ranks.py
  170. 1 2
      misago/users/api/userendpoints/avatar.py
  171. 1 2
      misago/users/api/userendpoints/changeemail.py
  172. 1 2
      misago/users/api/userendpoints/changepassword.py
  173. 1 3
      misago/users/api/userendpoints/create.py
  174. 1 2
      misago/users/api/userendpoints/list.py
  175. 0 1
      misago/users/api/userendpoints/signature.py
  176. 2 3
      misago/users/api/userendpoints/username.py
  177. 1 2
      misago/users/api/usernamechanges.py
  178. 9 12
      misago/users/api/users.py
  179. 2 1
      misago/users/apps.py
  180. 2 3
      misago/users/avatars/dynamic.py
  181. 1 2
      misago/users/avatars/gravatar.py
  182. 1 2
      misago/users/avatars/store.py
  183. 0 1
      misago/users/avatars/uploaded.py
  184. 2 3
      misago/users/context_processors.py
  185. 2 0
      misago/users/credentialchange.py
  186. 1 2
      misago/users/decorators.py
  187. 12 7
      misago/users/forms/admin.py
  188. 3 5
      misago/users/forms/auth.py
  189. 2 2
      misago/users/forms/moderation.py
  190. 3 4
      misago/users/forms/options.py
  191. 1 0
      misago/users/forms/rename.py
  192. 0 1
      misago/users/management/commands/bansmaintenance.py
  193. 2 1
      misago/users/management/commands/buildactivepostersranking.py
  194. 2 3
      misago/users/management/commands/createsuperuser.py
  195. 2 1
      misago/users/management/commands/populateonlinetracker.py
  196. 1 1
      misago/users/management/commands/synchronizeusers.py
  197. 0 1
      misago/users/middleware.py
  198. 2 2
      misago/users/migrations/0001_initial.py
  199. 1 1
      misago/users/migrations/0002_users_settings.py
  200. 2 1
      misago/users/migrations/0003_bans_version_tracker.py
  201. 1 1
      misago/users/migrations/0004_default_ranks.py
  202. 5 7
      misago/users/models/user.py
  203. 1 0
      misago/users/namechanges.py
  204. 1 0
      misago/users/online/tracker.py
  205. 1 1
      misago/users/online/utils.py
  206. 2 1
      misago/users/permissions/delete.py
  207. 0 1
      misago/users/permissions/moderation.py
  208. 1 2
      misago/users/permissions/profiles.py
  209. 0 1
      misago/users/permissions/warnings.py
  210. 3 4
      misago/users/rest_permissions.py
  211. 3 3
      misago/users/serializers/ban.py
  212. 1 0
      misago/users/serializers/rank.py
  213. 2 2
      misago/users/serializers/user.py
  214. 4 3
      misago/users/signals.py
  215. 1 1
      misago/users/tests/test_activation_views.py
  216. 2 4
      misago/users/tests/test_activepostersranking.py
  217. 2 3
      misago/users/tests/test_auth_api.py
  218. 1 2
      misago/users/tests/test_avatars.py
  219. 2 1
      misago/users/tests/test_ban_model.py
  220. 0 1
      misago/users/tests/test_banadmin_views.py
  221. 10 4
      misago/users/tests/test_bans.py
  222. 1 0
      misago/users/tests/test_captcha_api.py
  223. 1 1
      misago/users/tests/test_decorators.py
  224. 2 1
      misago/users/tests/test_djangoadmin_auth.py
  225. 1 1
      misago/users/tests/test_djangoadmin_user.py
  226. 1 1
      misago/users/tests/test_forgottenpassword_views.py
  227. 0 1
      misago/users/tests/test_lists_views.py
  228. 1 0
      misago/users/tests/test_options_views.py
  229. 1 1
      misago/users/tests/test_populateonlinetracker.py
  230. 0 1
      misago/users/tests/test_profile_views.py
  231. 2 2
      misago/users/tests/test_rankadmin_views.py
  232. 1 0
      misago/users/tests/test_realip_middleware.py
  233. 1 1
      misago/users/tests/test_rest_permissions.py
  234. 3 2
      misago/users/tests/test_testutils.py
  235. 2 2
      misago/users/tests/test_user_avatar_api.py
  236. 1 0
      misago/users/tests/test_user_changeemail_api.py
  237. 1 0
      misago/users/tests/test_user_changepassword_api.py
  238. 0 1
      misago/users/tests/test_user_create_api.py
  239. 0 1
      misago/users/tests/test_user_signature_api.py
  240. 1 2
      misago/users/tests/test_user_username_api.py
  241. 0 1
      misago/users/tests/test_useradmin_views.py
  242. 0 1
      misago/users/tests/test_usernamechanges_api.py
  243. 3 4
      misago/users/tests/test_users_api.py
  244. 1 0
      misago/users/tests/test_utils.py
  245. 13 12
      misago/users/tests/test_validators.py
  246. 0 1
      misago/users/tests/test_warningadmin_views.py
  247. 1 2
      misago/users/tests/test_warnings.py
  248. 0 1
      misago/users/testutils.py
  249. 1 2
      misago/users/urls/api.py
  250. 4 4
      misago/users/validators.py
  251. 1 2
      misago/users/views/activation.py
  252. 1 2
      misago/users/views/admin/bans.py
  253. 1 2
      misago/users/views/admin/ranks.py
  254. 3 6
      misago/users/views/admin/users.py
  255. 1 2
      misago/users/views/admin/warnings.py
  256. 0 1
      misago/users/views/auth.py
  257. 0 1
      misago/users/views/avatarserver.py
  258. 0 1
      misago/users/views/forgottenpassword.py
  259. 3 3
      misago/users/views/lists.py
  260. 6 6
      misago/users/views/profile.py

+ 9 - 0
.isort.cfg

@@ -0,0 +1,9 @@
+[settings]
+line_length=120
+lines_after_imports=2
+known_django=django
+known_first_party=misago
+known_restframework=rest_framework
+sections=FUTURE,STDLIB,THIRDPARTY,DJANGO,RESTFRAMEWORK,FIRSTPARTY,LOCALFOLDER
+multi_line_output=3
+verbose=true

+ 2 - 2
misago/acl/admin.py

@@ -1,7 +1,7 @@
 from django.conf.urls import url
 from django.conf.urls import url
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
-from misago.acl.views import (RolesList, NewRole, EditRole, RoleUsers,
-                              DeleteRole)
+
+from misago.acl.views import DeleteRole, EditRole, NewRole, RolesList, RoleUsers
 
 
 
 
 class MisagoAdminExtension(object):
 class MisagoAdminExtension(object):

+ 2 - 3
misago/acl/api.py

@@ -12,12 +12,11 @@ import copy
 
 
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
 
 
-from misago.core import threadstore
-from misago.core.cache import cache
-
 from misago.acl import version
 from misago.acl import version
 from misago.acl.builder import build_acl
 from misago.acl.builder import build_acl
 from misago.acl.providers import providers
 from misago.acl.providers import providers
+from misago.core import threadstore
+from misago.core.cache import cache
 
 
 
 
 def get_user_acl(user):
 def get_user_acl(user):

+ 1 - 2
misago/acl/forms.py

@@ -1,9 +1,8 @@
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 
 
-from misago.core import forms
-
 from misago.acl.models import Role
 from misago.acl.models import Role
 from misago.acl.providers import providers
 from misago.acl.providers import providers
+from misago.core import forms
 
 
 
 
 class RoleForm(forms.ModelForm):
 class RoleForm(forms.ModelForm):

+ 1 - 1
misago/acl/migrations/0001_initial.py

@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
-from django.db import models, migrations
+from django.db import migrations, models
 
 
 
 
 class Migration(migrations.Migration):
 class Migration(migrations.Migration):

+ 1 - 1
misago/acl/migrations/0002_acl_version_tracker.py

@@ -2,7 +2,7 @@
 #pylint: skip-file
 #pylint: skip-file
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
-from django.db import models, migrations
+from django.db import migrations, models
 
 
 from misago.core.migrationutils import cachebuster_register_cache
 from misago.core.migrationutils import cachebuster_register_cache
 
 

+ 1 - 2
misago/acl/models.py

@@ -2,9 +2,8 @@
 from django.db import models
 from django.db import models
 from django.dispatch import receiver
 from django.dispatch import receiver
 
 
-from misago.core import serializer
-
 from misago.acl import version as acl_version
 from misago.acl import version as acl_version
+from misago.core import serializer
 from misago.core.signals import secret_key_changed
 from misago.core.signals import secret_key_changed
 
 
 
 

+ 1 - 0
misago/acl/panels.py

@@ -1,4 +1,5 @@
 from debug_toolbar.panels import Panel
 from debug_toolbar.panels import Panel
+
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 
 
 
 

+ 1 - 0
misago/acl/tests/test_acl_algebra.py

@@ -1,4 +1,5 @@
 from django.test import TestCase
 from django.test import TestCase
+
 from misago.acl import algebra
 from misago.acl import algebra
 
 
 
 

+ 1 - 2
misago/acl/tests/test_api.py

@@ -1,8 +1,7 @@
 from django.test import TestCase
 from django.test import TestCase
 
 
-from misago.users.models import User, AnonymousUser
-
 from misago.acl.api import get_user_acl
 from misago.acl.api import get_user_acl
+from misago.users.models import AnonymousUser, User
 
 
 
 
 class GetUserACLTests(TestCase):
 class GetUserACLTests(TestCase):

+ 0 - 1
misago/acl/tests/test_providers.py

@@ -82,4 +82,3 @@ class PermissionProvidersTests(TestCase):
         providers.acl_serializer(TestType, test_serializer)
         providers.acl_serializer(TestType, test_serializer)
         serializers_list = providers.get_type_serializers(TestType())
         serializers_list = providers.get_type_serializers(TestType())
         self.assertEqual(serializers_list[0], test_serializer)
         self.assertEqual(serializers_list[0], test_serializer)
-

+ 1 - 2
misago/acl/tests/test_roleadmin_views.py

@@ -1,9 +1,8 @@
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 
 
-from misago.admin.testutils import AdminTestCase
-
 from misago.acl.models import Role
 from misago.acl.models import Role
 from misago.acl.testutils import fake_post_data
 from misago.acl.testutils import fake_post_data
+from misago.admin.testutils import AdminTestCase
 
 
 
 
 def fake_data(data_dict):
 def fake_data(data_dict):

+ 2 - 1
misago/acl/testutils.py

@@ -1,7 +1,8 @@
 # pylint: disable=protected-access
 # pylint: disable=protected-access
 from hashlib import md5
 from hashlib import md5
-from misago.core import threadstore
+
 from misago.acl.forms import get_permissions_forms
 from misago.acl.forms import get_permissions_forms
+from misago.core import threadstore
 
 
 
 
 def fake_post_data(target, data_dict):
 def fake_post_data(target, data_dict):

+ 1 - 2
misago/acl/views.py

@@ -3,10 +3,9 @@ from django.core.urlresolvers import reverse
 from django.shortcuts import redirect
 from django.shortcuts import redirect
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 
 
-from misago.admin.views import generic
-
 from misago.acl.forms import RoleForm, get_permissions_forms
 from misago.acl.forms import RoleForm, get_permissions_forms
 from misago.acl.models import Role
 from misago.acl.models import Role
+from misago.admin.views import generic
 
 
 
 
 class RoleAdmin(generic.AdminBaseMixin):
 class RoleAdmin(generic.AdminBaseMixin):

+ 2 - 1
misago/admin/auth.py

@@ -2,7 +2,8 @@ from hashlib import md5
 from time import time
 from time import time
 
 
 from django.conf import settings
 from django.conf import settings
-from django.contrib import auth as dj_auth, messages
+from django.contrib import auth as dj_auth
+from django.contrib import messages
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 
 

+ 1 - 0
misago/admin/tests/test_admin_hierarchy.py

@@ -1,4 +1,5 @@
 from django.test import TestCase
 from django.test import TestCase
+
 from misago.admin.hierarchy import Node
 from misago.admin.hierarchy import Node
 
 
 
 

+ 1 - 1
misago/admin/urlpatterns.py

@@ -1,4 +1,4 @@
-from django.conf.urls import url, include
+from django.conf.urls import include, url
 
 
 
 
 class URLPatterns(object):
 class URLPatterns(object):

+ 1 - 1
misago/admin/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls import patterns, include, url
+from django.conf.urls import include, patterns, url
 
 
 from misago import admin
 from misago import admin
 from misago.admin.views import auth, index
 from misago.admin.views import auth, index

+ 3 - 4
misago/admin/views/auth.py

@@ -1,13 +1,12 @@
 from django.contrib import messages
 from django.contrib import messages
-from django.shortcuts import render, redirect
+from django.shortcuts import redirect, render
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
-from django.views.decorators.debug import sensitive_post_parameters
 from django.views.decorators.cache import never_cache
 from django.views.decorators.cache import never_cache
 from django.views.decorators.csrf import csrf_protect
 from django.views.decorators.csrf import csrf_protect
-
-from misago.users.forms.auth import AdminAuthenticationForm
+from django.views.decorators.debug import sensitive_post_parameters
 
 
 from misago.admin import auth
 from misago.admin import auth
+from misago.users.forms.auth import AdminAuthenticationForm
 
 
 
 
 @sensitive_post_parameters()
 @sensitive_post_parameters()

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

@@ -1,7 +1,7 @@
 from django.shortcuts import redirect
 from django.shortcuts import redirect
+
 from misago.admin.auth import is_admin_session, update_admin_session
 from misago.admin.auth import is_admin_session, update_admin_session
-from misago.admin.views import (render, get_protected_namespace,
-                                protected_admin_view)
+from misago.admin.views import get_protected_namespace, protected_admin_view, render
 
 
 
 
 # Magic error page used by admin
 # Magic error page used by admin

+ 1 - 0
misago/admin/views/generic/base.py

@@ -1,4 +1,5 @@
 from django.views.generic import View
 from django.views.generic import View
+
 from misago.admin.views import render
 from misago.admin.views import render
 
 
 
 

+ 2 - 3
misago/admin/views/generic/list.py

@@ -1,15 +1,14 @@
 from urllib import urlencode
 from urllib import urlencode
 
 
 from django.contrib import messages
 from django.contrib import messages
-from django.core.paginator import Paginator, EmptyPage
+from django.core.paginator import EmptyPage, Paginator
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 from django.db import transaction
 from django.db import transaction
 from django.shortcuts import redirect
 from django.shortcuts import redirect
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 
 
-from misago.core.exceptions import ExplicitFirstPage
-
 from misago.admin.views.generic.base import AdminView
 from misago.admin.views.generic.base import AdminView
+from misago.core.exceptions import ExplicitFirstPage
 
 
 
 
 class MassActionError(Exception):
 class MassActionError(Exception):

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

@@ -7,12 +7,10 @@ from django.http import Http404, JsonResponse
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from misago import __version__
 from misago import __version__
-
-from misago.core.cache import cache
-from misago.threads.models import Thread, Post
-from misago.users.models import User, ACTIVATION_REQUIRED_NONE
-
 from misago.admin.views import render
 from misago.admin.views import render
+from misago.core.cache import cache
+from misago.threads.models import Post, Thread
+from misago.users.models import ACTIVATION_REQUIRED_NONE, User
 
 
 
 
 VERSION_CHECK_CACHE_KEY = "misago_version_check"
 VERSION_CHECK_CACHE_KEY = "misago_version_check"

+ 14 - 2
misago/categories/admin.py

@@ -2,9 +2,21 @@ from django.conf.urls import url
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 
 
 from misago.categories.views.categoriesadmin import (
 from misago.categories.views.categoriesadmin import (
-    CategoriesList, NewCategory, EditCategory, MoveDownCategory, MoveUpCategory, DeleteCategory)
+    CategoriesList,
+    DeleteCategory,
+    EditCategory,
+    MoveDownCategory,
+    MoveUpCategory,
+    NewCategory
+)
 from misago.categories.views.permsadmin import (
 from misago.categories.views.permsadmin import (
-    CategoryRolesList, NewCategoryRole, EditCategoryRole, DeleteCategoryRole, CategoryPermissions, RoleCategoriesACL)
+    CategoryPermissions,
+    CategoryRolesList,
+    DeleteCategoryRole,
+    EditCategoryRole,
+    NewCategoryRole,
+    RoleCategoriesACL
+)
 
 
 
 
 class MisagoAdminExtension(object):
 class MisagoAdminExtension(object):

+ 3 - 3
misago/categories/forms.py

@@ -1,14 +1,14 @@
+from mptt.forms import *  # noqa
+
 from django.db import models
 from django.db import models
 from django.utils.html import conditional_escape, mark_safe
 from django.utils.html import conditional_escape, mark_safe
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
-from mptt.forms import *  # noqa
 
 
+from misago.categories.models import THREADS_ROOT_NAME, Category, CategoryRole
 from misago.core import forms
 from misago.core import forms
 from misago.core.validators import validate_sluggable
 from misago.core.validators import validate_sluggable
 from misago.threads.threadtypes import trees_map
 from misago.threads.threadtypes import trees_map
 
 
-from misago.categories.models import THREADS_ROOT_NAME, Category, CategoryRole
-
 
 
 """
 """
 Fields
 Fields

+ 2 - 1
misago/categories/management/commands/synchronizecategories.py

@@ -1,6 +1,7 @@
 from django.core.management.base import BaseCommand
 from django.core.management.base import BaseCommand
-from misago.core.management.progressbar import show_progress
+
 from misago.categories.models import Category
 from misago.categories.models import Category
+from misago.core.management.progressbar import show_progress
 
 
 
 
 class Command(BaseCommand):
 class Command(BaseCommand):

+ 4 - 3
misago/categories/migrations/0001_initial.py

@@ -1,11 +1,12 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
-from django.conf import settings
-from django.db import models, migrations
-import django.db.models.deletion
 import mptt.fields
 import mptt.fields
 
 
+import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations, models
+
 
 
 class Migration(migrations.Migration):
 class Migration(migrations.Migration):
 
 

+ 1 - 1
misago/categories/migrations/0002_default_categories.py

@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
-from django.db import models, migrations
+from django.db import migrations, models
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from misago.core.utils import slugify
 from misago.core.utils import slugify

+ 1 - 1
misago/categories/migrations/0003_categories_roles.py

@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
-from django.db import models, migrations
+from django.db import migrations, models
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from misago.core import serializer
 from misago.core import serializer

+ 1 - 1
misago/categories/migrations/0004_category_last_thread.py

@@ -1,8 +1,8 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
-from django.db import models, migrations
 import django.db.models.deletion
 import django.db.models.deletion
+from django.db import migrations, models
 
 
 
 
 class Migration(migrations.Migration):
 class Migration(migrations.Migration):

+ 3 - 3
misago/categories/models.py

@@ -1,17 +1,17 @@
 from urlparse import urlparse
 from urlparse import urlparse
 
 
+from mptt.managers import TreeManager
+from mptt.models import MPTTModel, TreeForeignKey
+
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 from django.db import models
 from django.db import models
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
-from mptt.managers import TreeManager
-from mptt.models import MPTTModel, TreeForeignKey
 
 
 from misago.acl import version as acl_version
 from misago.acl import version as acl_version
 from misago.acl.models import BaseRole
 from misago.acl.models import BaseRole
 from misago.conf import settings
 from misago.conf import settings
 from misago.core.cache import cache
 from misago.core.cache import cache
 from misago.core.utils import slugify
 from misago.core.utils import slugify
-
 from misago.threads.threadtypes import trees_map
 from misago.threads.threadtypes import trees_map
 
 
 
 

+ 1 - 3
misago/categories/permissions.py

@@ -3,14 +3,12 @@ from django.core.exceptions import PermissionDenied
 from django.http import Http404
 from django.http import Http404
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 
 
-
 from misago.acl import algebra
 from misago.acl import algebra
 from misago.acl.decorators import return_boolean
 from misago.acl.decorators import return_boolean
+from misago.categories.models import Category, CategoryRole, RoleCategoryACL
 from misago.core import forms
 from misago.core import forms
 from misago.users.models import AnonymousUser
 from misago.users.models import AnonymousUser
 
 
-from misago.categories.models import Category, RoleCategoryACL, CategoryRole
-
 
 
 """
 """
 Admin Permissions Form
 Admin Permissions Form

+ 2 - 2
misago/categories/serializers.py

@@ -1,9 +1,9 @@
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
-from rest_framework import serializers
 
 
-from misago.core.utils import format_plaintext_for_html
+from rest_framework import serializers
 
 
 from misago.categories.models import Category
 from misago.categories.models import Category
+from misago.core.utils import format_plaintext_for_html
 
 
 
 
 __all__ = [
 __all__ = [

+ 5 - 4
misago/categories/signals.py

@@ -1,6 +1,9 @@
-from django.dispatch import receiver, Signal
-from misago.core import serializer
+from django.dispatch import Signal, receiver
+
 from misago.categories.models import Category, CategoryRole
 from misago.categories.models import Category, CategoryRole
+from misago.core import serializer
+from misago.core.signals import secret_key_changed
+from misago.users.signals import username_changed
 
 
 
 
 delete_category_content = Signal()
 delete_category_content = Signal()
@@ -10,7 +13,6 @@ move_category_content = Signal(providing_args=["new_category"])
 """
 """
 Signal handlers
 Signal handlers
 """
 """
-from misago.core.signals import secret_key_changed
 @receiver(secret_key_changed)
 @receiver(secret_key_changed)
 def update_roles_pickles(sender, **kwargs):
 def update_roles_pickles(sender, **kwargs):
     for role in CategoryRole.objects.iterator():
     for role in CategoryRole.objects.iterator():
@@ -20,7 +22,6 @@ def update_roles_pickles(sender, **kwargs):
             role.save(update_fields=['pickled_permissions'])
             role.save(update_fields=['pickled_permissions'])
 
 
 
 
-from misago.users.signals import username_changed
 @receiver(username_changed)
 @receiver(username_changed)
 def update_usernames(sender, **kwargs):
 def update_usernames(sender, **kwargs):
     Category.objects.filter(last_poster=sender).update(
     Category.objects.filter(last_poster=sender).update(

+ 2 - 1
misago/categories/tests/test_categories_admin_views.py

@@ -1,4 +1,5 @@
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
+
 from misago.admin.testutils import AdminTestCase
 from misago.admin.testutils import AdminTestCase
 from misago.categories.models import Category
 from misago.categories.models import Category
 
 
@@ -323,4 +324,4 @@ class CategoryAdminDeleteViewTests(AdminTestCase):
                 'move_threads_to': '',
                 'move_threads_to': '',
             })
             })
         self.assertEqual(response.status_code, 302)
         self.assertEqual(response.status_code, 302)
-        self.assertEqual(Category.objects.all_categories().count(), 6)
+        self.assertEqual(Category.objects.all_categories().count(), 6)

+ 1 - 2
misago/categories/tests/test_category_model.py

@@ -1,11 +1,10 @@
 from django.utils import timezone
 from django.utils import timezone
 
 
+from misago.categories.models import THREADS_ROOT_NAME, Category
 from misago.core.testutils import MisagoTestCase
 from misago.core.testutils import MisagoTestCase
 from misago.threads import testutils
 from misago.threads import testutils
 from misago.threads.threadtypes import trees_map
 from misago.threads.threadtypes import trees_map
 
 
-from misago.categories.models import THREADS_ROOT_NAME, Category
-
 
 
 class CategoryManagerTests(MisagoTestCase):
 class CategoryManagerTests(MisagoTestCase):
     def test_private_threads(self):
     def test_private_threads(self):

+ 0 - 1
misago/categories/tests/test_permissions_admin_views.py

@@ -3,7 +3,6 @@ from django.core.urlresolvers import reverse
 from misago.acl.models import Role
 from misago.acl.models import Role
 from misago.acl.testutils import fake_post_data
 from misago.acl.testutils import fake_post_data
 from misago.admin.testutils import AdminTestCase
 from misago.admin.testutils import AdminTestCase
-
 from misago.categories.models import Category, CategoryRole
 from misago.categories.models import Category, CategoryRole
 
 
 
 

+ 1 - 2
misago/categories/tests/test_prunecategories.py

@@ -4,10 +4,9 @@ from django.test import TestCase
 from django.utils import timezone
 from django.utils import timezone
 from django.utils.six import StringIO
 from django.utils.six import StringIO
 
 
-from misago.threads import testutils
-
 from misago.categories.management.commands import prunecategories
 from misago.categories.management.commands import prunecategories
 from misago.categories.models import Category
 from misago.categories.models import Category
+from misago.threads import testutils
 
 
 
 
 class PruneCategoriesTests(TestCase):
 class PruneCategoriesTests(TestCase):

+ 1 - 2
misago/categories/tests/test_synchronizecategories.py

@@ -1,10 +1,9 @@
 from django.test import TestCase
 from django.test import TestCase
 from django.utils.six import StringIO
 from django.utils.six import StringIO
 
 
-from misago.threads import testutils
-
 from misago.categories.management.commands import synchronizecategories
 from misago.categories.management.commands import synchronizecategories
 from misago.categories.models import Category
 from misago.categories.models import Category
+from misago.threads import testutils
 
 
 
 
 class SynchronizeCategoriesTests(TestCase):
 class SynchronizeCategoriesTests(TestCase):

+ 3 - 4
misago/categories/tests/test_utils.py

@@ -1,10 +1,9 @@
 from misago.acl.testutils import override_acl
 from misago.acl.testutils import override_acl
+from misago.categories.models import Category
+from misago.categories.utils import get_categories_tree, get_category_path
 from misago.core import threadstore
 from misago.core import threadstore
 from misago.users.testutils import AuthenticatedUserTestCase
 from misago.users.testutils import AuthenticatedUserTestCase
 
 
-from misago.categories.utils import get_categories_tree, get_category_path
-from misago.categories.models import Category
-
 
 
 class CategoriesUtilsTests(AuthenticatedUserTestCase):
 class CategoriesUtilsTests(AuthenticatedUserTestCase):
     def setUp(self):
     def setUp(self):
@@ -98,4 +97,4 @@ class CategoriesUtilsTests(AuthenticatedUserTestCase):
         """get_categories_tree returns all children of root nodes"""
         """get_categories_tree returns all children of root nodes"""
         for node in get_categories_tree(self.user):
         for node in get_categories_tree(self.user):
             parent_nodes = len(get_category_path(node))
             parent_nodes = len(get_category_path(node))
-            self.assertEqual(parent_nodes, node.level)
+            self.assertEqual(parent_nodes, node.level)

+ 3 - 4
misago/categories/tests/test_views.py

@@ -1,10 +1,9 @@
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 
 
 from misago.acl.testutils import override_acl
 from misago.acl.testutils import override_acl
-from misago.users.testutils import AuthenticatedUserTestCase
-
-from misago.categories.utils import get_categories_tree
 from misago.categories.models import Category
 from misago.categories.models import Category
+from misago.categories.utils import get_categories_tree
+from misago.users.testutils import AuthenticatedUserTestCase
 
 
 
 
 class CategoryViewsTests(AuthenticatedUserTestCase):
 class CategoryViewsTests(AuthenticatedUserTestCase):
@@ -92,4 +91,4 @@ class CategoryAPIViewsTests(AuthenticatedUserTestCase):
         for node in get_categories_tree(self.user):
         for node in get_categories_tree(self.user):
             self.assertNotIn(node.name, response.content)
             self.assertNotIn(node.name, response.content)
             if node.level > 1:
             if node.level > 1:
-                self.assertNotIn(node.get_absolute_url(), response.content)
+                self.assertNotIn(node.get_absolute_url(), response.content)

+ 1 - 0
misago/categories/urls/api.py

@@ -1,4 +1,5 @@
 from django.conf.urls import url
 from django.conf.urls import url
+
 from misago.categories.views import api
 from misago.categories.views import api
 
 
 
 

+ 2 - 3
misago/categories/utils.py

@@ -1,9 +1,8 @@
 from misago.acl import add_acl
 from misago.acl import add_acl
+from misago.categories.models import Category
 from misago.core import threadstore
 from misago.core import threadstore
 from misago.readtracker import categoriestracker
 from misago.readtracker import categoriestracker
 
 
-from misago.categories.models import Category
-
 
 
 __all__ = [
 __all__ = [
     'get_categories_tree',
     'get_categories_tree',
@@ -84,4 +83,4 @@ def get_category_path(category):
     while category and category.level > 0:
     while category and category.level > 0:
         category_path.append(category)
         category_path.append(category)
         category = category.parent
         category = category.parent
-    return [f for f in reversed(category_path)]
+    return [f for f in reversed(category_path)]

+ 1 - 2
misago/categories/views/categoriesadmin.py

@@ -4,10 +4,9 @@ from django.utils.translation import ugettext_lazy as _
 
 
 from misago.acl import version as acl_version
 from misago.acl import version as acl_version
 from misago.admin.views import generic
 from misago.admin.views import generic
-from misago.threads.threadtypes import trees_map
-
 from misago.categories.forms import CategoryFormFactory, DeleteFormFactory
 from misago.categories.forms import CategoryFormFactory, DeleteFormFactory
 from misago.categories.models import THREADS_ROOT_NAME, Category, RoleCategoryACL
 from misago.categories.models import THREADS_ROOT_NAME, Category, RoleCategoryACL
+from misago.threads.threadtypes import trees_map
 
 
 
 
 class CategoryAdmin(generic.AdminBaseMixin):
 class CategoryAdmin(generic.AdminBaseMixin):

+ 2 - 3
misago/categories/views/permsadmin.py

@@ -2,15 +2,14 @@ from django.contrib import messages
 from django.shortcuts import redirect
 from django.shortcuts import redirect
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 
 
-from misago.admin.views import generic
 from misago.acl import version as acl_version
 from misago.acl import version as acl_version
 from misago.acl.forms import get_permissions_forms
 from misago.acl.forms import get_permissions_forms
 from misago.acl.models import Role
 from misago.acl.models import Role
 from misago.acl.views import RoleAdmin, RolesList
 from misago.acl.views import RoleAdmin, RolesList
-
+from misago.admin.views import generic
 from misago.categories.forms import CategoryRoleForm, CategoryRolesACLFormFactory, RoleCategoryACLFormFactory
 from misago.categories.forms import CategoryRoleForm, CategoryRolesACLFormFactory, RoleCategoryACLFormFactory
-from misago.categories.views.categoriesadmin import CategoryAdmin, CategoriesList
 from misago.categories.models import Category, CategoryRole, RoleCategoryACL
 from misago.categories.models import Category, CategoryRole, RoleCategoryACL
+from misago.categories.views.categoriesadmin import CategoriesList, CategoryAdmin
 
 
 
 
 class CategoryRoleAdmin(generic.AdminBaseMixin):
 class CategoryRoleAdmin(generic.AdminBaseMixin):

+ 1 - 0
misago/conf/admin.py

@@ -1,5 +1,6 @@
 from django.conf.urls import url
 from django.conf.urls import url
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
+
 from misago.conf import views
 from misago.conf import views
 
 
 
 

+ 2 - 1
misago/conf/context_processors.py

@@ -1,7 +1,8 @@
 import json
 import json
 
 
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
-from misago.conf.gateway import dj_settings, db_settings  # noqa
+
+from misago.conf.gateway import db_settings, dj_settings  # noqa
 
 
 
 
 def settings(request):
 def settings(request):

+ 2 - 0
misago/conf/defaults.py

@@ -28,6 +28,8 @@ INSTALLED_APPS = (
 
 
 # Build paths inside the project like this: os.path.join(MISAGO_BASE_DIR, ...)
 # Build paths inside the project like this: os.path.join(MISAGO_BASE_DIR, ...)
 import os
 import os
+
+
 MISAGO_BASE_DIR = os.path.dirname(os.path.dirname(__file__))
 MISAGO_BASE_DIR = os.path.dirname(os.path.dirname(__file__))
 
 
 
 

+ 3 - 1
misago/conf/forms.py

@@ -1,4 +1,6 @@
-from django.utils.translation import ugettext as _, ungettext
+from django.utils.translation import ugettext as _
+from django.utils.translation import ungettext
+
 from misago.core import forms
 from misago.core import forms
 
 
 
 

+ 1 - 0
misago/conf/gateway.py

@@ -1,4 +1,5 @@
 from django.conf import settings as dj_settings
 from django.conf import settings as dj_settings
+
 from misago.conf.dbsettings import db_settings
 from misago.conf.dbsettings import db_settings
 
 
 
 

+ 1 - 1
misago/conf/migrations/0001_initial.py

@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
-from django.db import models, migrations
+from django.db import migrations, models
 
 
 
 
 class Migration(migrations.Migration):
 class Migration(migrations.Migration):

+ 2 - 3
misago/conf/migrationutils.py

@@ -1,8 +1,7 @@
-from misago.core import serializer
-from misago.core.cache import cache as default_cache
-
 from misago.conf.dbsettings import CACHE_KEY
 from misago.conf.dbsettings import CACHE_KEY
 from misago.conf.hydrators import dehydrate_value
 from misago.conf.hydrators import dehydrate_value
+from misago.core import serializer
+from misago.core.cache import cache as default_cache
 
 
 
 
 def get_group(SettingsGroup, group_key):
 def get_group(SettingsGroup, group_key):

+ 1 - 2
misago/conf/models.py

@@ -1,11 +1,10 @@
 from django.db import models
 from django.db import models
 from django.dispatch import receiver
 from django.dispatch import receiver
 
 
+from misago.conf import hydrators
 from misago.core import serializer
 from misago.core import serializer
 from misago.core.signals import secret_key_changed
 from misago.core.signals import secret_key_changed
 
 
-from misago.conf import hydrators
-
 
 
 class SettingsGroupsManager(models.Manager):
 class SettingsGroupsManager(models.Manager):
     def ordered_alphabetically(self):
     def ordered_alphabetically(self):

+ 0 - 1
misago/conf/tests/test_admin_views.py

@@ -1,7 +1,6 @@
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 
 
 from misago.admin.testutils import AdminTestCase
 from misago.admin.testutils import AdminTestCase
-
 from misago.conf.models import SettingsGroup
 from misago.conf.models import SettingsGroup
 
 
 
 

+ 1 - 2
misago/conf/tests/test_context_processors.py

@@ -1,9 +1,8 @@
 from django.test import TestCase
 from django.test import TestCase
 
 
-from misago.core import threadstore
-
 from misago.conf.context_processors import settings
 from misago.conf.context_processors import settings
 from misago.conf.dbsettings import db_settings
 from misago.conf.dbsettings import db_settings
+from misago.core import threadstore
 
 
 
 
 class MockRequest(object):
 class MockRequest(object):

+ 1 - 1
misago/conf/tests/test_hydrators.py

@@ -1,6 +1,6 @@
 from django.test import TestCase
 from django.test import TestCase
 
 
-from misago.conf.hydrators import hydrate_value, dehydrate_value
+from misago.conf.hydrators import dehydrate_value, hydrate_value
 from misago.conf.models import Setting
 from misago.conf.models import Setting
 
 
 
 

+ 1 - 2
misago/conf/tests/test_migrationutils.py

@@ -1,10 +1,9 @@
 from django.apps import apps
 from django.apps import apps
 from django.test import TestCase
 from django.test import TestCase
 
 
-from misago.core import threadstore
-
 from misago.conf import migrationutils
 from misago.conf import migrationutils
 from misago.conf.models import SettingsGroup
 from misago.conf.models import SettingsGroup
+from misago.core import threadstore
 
 
 
 
 class DBConfMigrationUtilsTests(TestCase):
 class DBConfMigrationUtilsTests(TestCase):

+ 1 - 0
misago/conf/tests/test_models.py

@@ -1,4 +1,5 @@
 from django.test import TestCase
 from django.test import TestCase
+
 from misago.conf.models import Setting
 from misago.conf.models import Setting
 
 
 
 

+ 3 - 4
misago/conf/tests/test_settings.py

@@ -2,12 +2,11 @@ from django.apps import apps
 from django.conf import settings as dj_settings
 from django.conf import settings as dj_settings
 from django.test import TestCase
 from django.test import TestCase
 
 
-from misago.core import threadstore
-from misago.core.cache import cache
-
-from misago.conf.gateway import settings as gateway
 from misago.conf.dbsettings import db_settings
 from misago.conf.dbsettings import db_settings
+from misago.conf.gateway import settings as gateway
 from misago.conf.migrationutils import migrate_settings_group
 from misago.conf.migrationutils import migrate_settings_group
+from misago.core import threadstore
+from misago.core.cache import cache
 
 
 
 
 class DBSettingsTests(TestCase):
 class DBSettingsTests(TestCase):

+ 0 - 1
misago/conf/views.py

@@ -3,7 +3,6 @@ from django.shortcuts import redirect
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from misago.admin.views import render as mi_render
 from misago.admin.views import render as mi_render
-
 from misago.conf import db_settings
 from misago.conf import db_settings
 from misago.conf.forms import ChangeSettingsForm
 from misago.conf.forms import ChangeSettingsForm
 from misago.conf.models import SettingsGroup
 from misago.conf.models import SettingsGroup

+ 2 - 1
misago/core/apipaginator.py

@@ -1,4 +1,5 @@
-from django.core.paginator import InvalidPage, Paginator as DjangoPaginator
+from django.core.paginator import Paginator as DjangoPaginator
+from django.core.paginator import InvalidPage
 from django.utils import six
 from django.utils import six
 
 
 from rest_framework.exceptions import NotFound
 from rest_framework.exceptions import NotFound

+ 1 - 2
misago/core/apirouter.py

@@ -1,5 +1,4 @@
-from rest_framework.routers import (
-    DefaultRouter, Route, DynamicDetailRoute, DynamicListRoute)
+from rest_framework.routers import DefaultRouter, DynamicDetailRoute, DynamicListRoute, Route
 
 
 
 
 class MisagoApiRouter(DefaultRouter):
 class MisagoApiRouter(DefaultRouter):

+ 2 - 2
misago/core/cache.py

@@ -1,5 +1,5 @@
-from django.core.cache import (
-    caches, cache as default_cache, InvalidCacheBackendError)
+from django.core.cache import cache as default_cache
+from django.core.cache import InvalidCacheBackendError, caches
 
 
 
 
 try:
 try:

+ 1 - 0
misago/core/cachebuster.py

@@ -1,4 +1,5 @@
 from django.db.models import F
 from django.db.models import F
+
 from misago.core import threadstore
 from misago.core import threadstore
 
 
 
 

+ 1 - 1
misago/core/errorpages.py

@@ -2,8 +2,8 @@ from django.http import JsonResponse
 from django.shortcuts import render
 from django.shortcuts import render
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
+from misago.admin.views.errorpages import admin_csrf_failure, admin_error_page
 from misago.core.utils import is_request_to_misago
 from misago.core.utils import is_request_to_misago
-from misago.admin.views.errorpages import admin_error_page, admin_csrf_failure
 
 
 
 
 def _ajax_error(code=406, message=None):
 def _ajax_error(code=406, message=None):

+ 1 - 2
misago/core/exceptionhandler.py

@@ -6,8 +6,7 @@ from django.utils.translation import gettext as _
 from rest_framework.views import exception_handler as rest_exception_handler
 from rest_framework.views import exception_handler as rest_exception_handler
 
 
 from misago.core import errorpages
 from misago.core import errorpages
-from misago.core.exceptions import (
-    AjaxError, Banned, ExplicitFirstPage, OutdatedSlug)
+from misago.core.exceptions import AjaxError, Banned, ExplicitFirstPage, OutdatedSlug
 
 
 
 
 HANDLED_EXCEPTIONS = (AjaxError, Banned, ExplicitFirstPage, Http404,
 HANDLED_EXCEPTIONS = (AjaxError, Banned, ExplicitFirstPage, Http404,

+ 1 - 2
misago/core/management/commands/misagodbrelations.py

@@ -1,7 +1,6 @@
 from django.apps import apps
 from django.apps import apps
 from django.core.management.base import BaseCommand
 from django.core.management.base import BaseCommand
-from django.db.models.fields.related import (ForeignKey, OneToOneField,
-                                             ManyToManyField)
+from django.db.models.fields.related import ForeignKey, ManyToManyField, OneToOneField
 
 
 
 
 class Command(BaseCommand):
 class Command(BaseCommand):

+ 1 - 1
misago/core/migrations/0001_initial.py

@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
-from django.db import models, migrations
+from django.db import migrations, models
 
 
 
 
 class Migration(migrations.Migration):
 class Migration(migrations.Migration):

+ 1 - 1
misago/core/migrations/0002_basic_settings.py

@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
-from django.db import models, migrations
+from django.db import migrations, models
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from misago.conf.migrationutils import migrate_settings_group
 from misago.conf.migrationutils import migrate_settings_group

+ 1 - 0
misago/core/momentjs.py

@@ -1,4 +1,5 @@
 import os
 import os
+
 from path import Path
 from path import Path
 
 
 
 

+ 1 - 2
misago/core/pgutils.py

@@ -1,6 +1,5 @@
-from django.db.migrations.operations import RunSQL
-
 from django.core.paginator import Paginator
 from django.core.paginator import Paginator
+from django.db.migrations.operations import RunSQL
 
 
 
 
 class CreatePartialIndex(RunSQL):
 class CreatePartialIndex(RunSQL):

+ 4 - 1
misago/core/serializer.py

@@ -1,11 +1,14 @@
 import base64
 import base64
 from hashlib import sha256
 from hashlib import sha256
+
+from django.conf import settings
+
+
 try:
 try:
     import cPickle as pickle
     import cPickle as pickle
 except ImportError:
 except ImportError:
     import pickle
     import pickle
 
 
-from django.conf import settings
 
 
 
 
 def _checksum(base):
 def _checksum(base):

+ 1 - 1
misago/core/setup.py

@@ -1,5 +1,5 @@
-import re
 import os
 import os
+import re
 from optparse import OptionParser
 from optparse import OptionParser
 
 
 from django.core import management
 from django.core import management

+ 1 - 0
misago/core/shortcuts.py

@@ -1,4 +1,5 @@
 from collections import OrderedDict
 from collections import OrderedDict
+
 from django.http import Http404
 from django.http import Http404
 from django.shortcuts import *  # noqa
 from django.shortcuts import *  # noqa
 
 

+ 2 - 1
misago/core/templatetags/misago_pagetitle.py

@@ -1,5 +1,6 @@
 from django import template
 from django import template
 from django.utils.translation import gettext as _
 from django.utils.translation import gettext as _
+
 from misago.conf import settings
 from misago.conf import settings
 
 
 
 
@@ -14,4 +15,4 @@ def pagetitle(title, **kwargs):
     if 'parent' in kwargs:
     if 'parent' in kwargs:
         title += u" | %s" % kwargs['parent']
         title += u" | %s" % kwargs['parent']
 
 
-    return title
+    return title

+ 1 - 1
misago/core/templatetags/misago_stringutils.py

@@ -7,4 +7,4 @@ register = template.Library()
 @register.filter
 @register.filter
 def isdescriptionshort(string):
 def isdescriptionshort(string):
     string_lowered = string.lower()
     string_lowered = string.lower()
-    return string_lowered.count('<p') == 1 and not string_lowered.count('<br')
+    return string_lowered.count('<p') == 1 and not string_lowered.count('<br')

+ 3 - 2
misago/core/testproject/urls.py

@@ -1,14 +1,15 @@
 from django.conf.urls import include, url
 from django.conf.urls import include, url
-
 # Setup Django admin to work with Misago auth
 # Setup Django admin to work with Misago auth
 from django.contrib import admin
 from django.contrib import admin
+
+from misago.core.testproject import views
 from misago.users.forms.auth import AdminAuthenticationForm
 from misago.users.forms.auth import AdminAuthenticationForm
 
 
+
 admin.autodiscover()
 admin.autodiscover()
 admin.site.login_form = AdminAuthenticationForm
 admin.site.login_form = AdminAuthenticationForm
 
 
 
 
-from misago.core.testproject import views
 
 
 urlpatterns = [
 urlpatterns = [
     url(r'^forum/', include('misago.urls', namespace='misago')),
     url(r'^forum/', include('misago.urls', namespace='misago')),

+ 0 - 1
misago/core/testproject/views.py

@@ -8,7 +8,6 @@ from misago.core.exceptions import Banned
 from misago.core.shortcuts import paginate, validate_slug
 from misago.core.shortcuts import paginate, validate_slug
 from misago.core.testproject.models import Model
 from misago.core.testproject.models import Model
 from misago.core.views import home_redirect
 from misago.core.views import home_redirect
-
 from misago.users.models import Ban
 from misago.users.models import Ban
 
 
 
 

+ 1 - 0
misago/core/tests/test_apipaginator.py

@@ -1,4 +1,5 @@
 from django.test import TestCase
 from django.test import TestCase
+
 from misago.core.apipaginator import ApiPaginator
 from misago.core.apipaginator import ApiPaginator
 
 
 
 

+ 1 - 1
misago/core/tests/test_apipatch.py

@@ -237,4 +237,4 @@ class ApiPatchTests(TestCase):
         self.assertEqual(
         self.assertEqual(
             response.data['detail'][3], "yo ain't doing that!")
             response.data['detail'][3], "yo ain't doing that!")
         self.assertEqual(response.data['id'], 13)
         self.assertEqual(response.data['id'], 13)
-        self.assertEqual(response.data['value'], 18)
+        self.assertEqual(response.data['value'], 18)

+ 1 - 0
misago/core/tests/test_context_processors.py

@@ -1,4 +1,5 @@
 from django.test import TestCase
 from django.test import TestCase
+
 from misago.core import context_processors
 from misago.core import context_processors
 
 
 
 

+ 1 - 3
misago/core/tests/test_errorpages.py

@@ -2,11 +2,9 @@ from django.core.urlresolvers import reverse
 from django.test import Client, TestCase
 from django.test import Client, TestCase
 from django.test.client import RequestFactory
 from django.test.client import RequestFactory
 
 
+from misago.core.testproject.views import mock_custom_403_error_page, mock_custom_404_error_page
 from misago.users.models import AnonymousUser
 from misago.users.models import AnonymousUser
 
 
-from misago.core.testproject.views import (mock_custom_403_error_page,
-                                           mock_custom_404_error_page)
-
 
 
 class CSRFErrorViewTests(TestCase):
 class CSRFErrorViewTests(TestCase):
     def test_csrf_failure(self):
     def test_csrf_failure(self):

+ 1 - 2
misago/core/tests/test_exceptionhandler_middleware.py

@@ -3,9 +3,8 @@ from django.http import Http404
 from django.test import TestCase
 from django.test import TestCase
 from django.test.client import RequestFactory
 from django.test.client import RequestFactory
 
 
-from misago.users.models import AnonymousUser
-
 from misago.core.middleware.exceptionhandler import ExceptionHandlerMiddleware
 from misago.core.middleware.exceptionhandler import ExceptionHandlerMiddleware
+from misago.users.models import AnonymousUser
 
 
 
 
 class ExceptionHandlerMiddlewareTests(TestCase):
 class ExceptionHandlerMiddlewareTests(TestCase):

+ 1 - 2
misago/core/tests/test_exceptionhandlers.py

@@ -3,10 +3,9 @@ from django.core.exceptions import PermissionDenied
 from django.http import Http404
 from django.http import Http404
 from django.test import TestCase
 from django.test import TestCase
 
 
-from misago.users.models import Ban
-
 from misago.core import exceptionhandler
 from misago.core import exceptionhandler
 from misago.core.exceptions import Banned
 from misago.core.exceptions import Banned
+from misago.users.models import Ban
 
 
 
 
 INVALID_EXCEPTIONS = (
 INVALID_EXCEPTIONS = (

+ 1 - 0
misago/core/tests/test_forms.py

@@ -1,4 +1,5 @@
 from django.test import TestCase
 from django.test import TestCase
+
 from misago.core import forms
 from misago.core import forms
 
 
 
 

+ 1 - 0
misago/core/tests/test_frontendcontext_middleware.py

@@ -1,4 +1,5 @@
 from django.test import TestCase
 from django.test import TestCase
+
 from misago.core.middleware.frontendcontext import FrontendContextMiddleware
 from misago.core.middleware.frontendcontext import FrontendContextMiddleware
 
 
 
 

+ 1 - 1
misago/core/tests/test_momentjs.py

@@ -1,7 +1,7 @@
 from django.conf import settings
 from django.conf import settings
 from django.test import TestCase
 from django.test import TestCase
 
 
-from misago.core.momentjs import list_available_locales, get_locale_path
+from misago.core.momentjs import get_locale_path, list_available_locales
 
 
 
 
 class MomentJSTests(TestCase):
 class MomentJSTests(TestCase):

+ 1 - 0
misago/core/tests/test_page.py

@@ -1,4 +1,5 @@
 from django.test import TestCase
 from django.test import TestCase
+
 from misago.core.page import Page
 from misago.core.page import Page
 
 
 
 

+ 1 - 1
misago/core/tests/test_serializer.py

@@ -1,4 +1,5 @@
 from django.test import TestCase
 from django.test import TestCase
+
 from misago.core import serializer
 from misago.core import serializer
 
 
 
 
@@ -21,4 +22,3 @@ class SerializerTests(TestCase):
             dry = serializer.dumps(wet)
             dry = serializer.dumps(wet)
             self.assertFalse(dry.endswith('='))
             self.assertFalse(dry.endswith('='))
             self.assertEqual(wet, serializer.loads(dry))
             self.assertEqual(wet, serializer.loads(dry))
-

+ 1 - 0
misago/core/tests/test_setup.py

@@ -1,6 +1,7 @@
 import os
 import os
 
 
 from django.test import TestCase
 from django.test import TestCase
+
 from misago.core import setup
 from misago.core import setup
 
 
 
 

+ 1 - 1
misago/core/tests/test_shortcuts.py

@@ -85,4 +85,4 @@ class GetIntOr404(TestCase):
 
 
         for value in INVALID_VALUES:
         for value in INVALID_VALUES:
             with self.assertRaises(Http404):
             with self.assertRaises(Http404):
-                get_int_or_404(value)
+                get_int_or_404(value)

+ 1 - 1
misago/core/tests/test_threadstore.py

@@ -2,8 +2,8 @@ from django.core.urlresolvers import reverse
 from django.test import TestCase
 from django.test import TestCase
 from django.test.client import RequestFactory
 from django.test.client import RequestFactory
 
 
-from misago.core.middleware.threadstore import ThreadStoreMiddleware
 from misago.core import threadstore
 from misago.core import threadstore
+from misago.core.middleware.threadstore import ThreadStoreMiddleware
 
 
 
 
 class ThreadStoreTests(TestCase):
 class ThreadStoreTests(TestCase):

+ 7 - 3
misago/core/tests/test_utils.py

@@ -4,9 +4,13 @@ from django.test import TestCase
 from django.test.client import RequestFactory
 from django.test.client import RequestFactory
 from django.utils import timezone
 from django.utils import timezone
 
 
-from misago.core.utils import (clean_return_path, is_request_to_misago,
-                               slugify, is_referer_local,
-                               format_plaintext_for_html)
+from misago.core.utils import (
+    clean_return_path,
+    format_plaintext_for_html,
+    is_referer_local,
+    is_request_to_misago,
+    slugify
+)
 
 
 
 
 VALID_PATHS = (
 VALID_PATHS = (

+ 2 - 1
misago/core/testutils.py

@@ -1,4 +1,5 @@
 from django.test import TestCase
 from django.test import TestCase
+
 from misago.core import threadstore
 from misago.core import threadstore
 from misago.core.cache import cache
 from misago.core.cache import cache
 
 
@@ -17,4 +18,4 @@ class MisagoTestCase(TestCase):
 
 
     def tearDown(self):
     def tearDown(self):
         self.clear_state()
         self.clear_state()
-        super(MisagoTestCase, self).tearDown()
+        super(MisagoTestCase, self).tearDown()

+ 3 - 2
misago/core/utils.py

@@ -2,11 +2,12 @@ from datetime import timedelta
 
 
 from unidecode import unidecode
 from unidecode import unidecode
 
 
-from django.http import Http404
 from django.core.urlresolvers import resolve, reverse
 from django.core.urlresolvers import resolve, reverse
+from django.http import Http404
 from django.template.defaultfilters import slugify as django_slugify
 from django.template.defaultfilters import slugify as django_slugify
 from django.utils import html, timezone
 from django.utils import html, timezone
-from django.utils.translation import ugettext_lazy as _, ungettext_lazy
+from django.utils.translation import ugettext_lazy as _
+from django.utils.translation import ungettext_lazy
 
 
 
 
 def slugify(string):
 def slugify(string):

+ 1 - 0
misago/core/validators.py

@@ -1,5 +1,6 @@
 from django.core.exceptions import ValidationError
 from django.core.exceptions import ValidationError
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
+
 from misago.core.utils import slugify
 from misago.core.utils import slugify
 
 
 
 

+ 1 - 2
misago/core/views.py

@@ -3,8 +3,8 @@ from django.shortcuts import redirect, render
 from django.utils import timezone
 from django.utils import timezone
 from django.utils.translation import get_language
 from django.utils.translation import get_language
 from django.views import i18n
 from django.views import i18n
-from django.views.decorators.http import last_modified
 from django.views.decorators.cache import cache_page
 from django.views.decorators.cache import cache_page
+from django.views.decorators.http import last_modified
 
 
 from misago.core import momentjs
 from misago.core import momentjs
 
 
@@ -35,4 +35,3 @@ def momentjs_catalog(request):
         locale = "";
         locale = "";
     return HttpResponse(
     return HttpResponse(
         locale, content_type='application/javascript; charset=utf-8')
         locale, content_type='application/javascript; charset=utf-8')
-

+ 4 - 4
misago/faker/management/commands/createfakebans.py

@@ -1,14 +1,14 @@
-from datetime import timedelta
 import random
 import random
 import sys
 import sys
+from datetime import timedelta
+
+from faker import Factory
 
 
 from django.core.management.base import BaseCommand
 from django.core.management.base import BaseCommand
 from django.utils import timezone
 from django.utils import timezone
 
 
-from faker import Factory
-
 from misago.core.management.progressbar import show_progress
 from misago.core.management.progressbar import show_progress
-from misago.users.models import Ban, BAN_USERNAME, BAN_EMAIL, BAN_IP
+from misago.users.models import BAN_EMAIL, BAN_IP, BAN_USERNAME, Ban
 
 
 
 
 def fake_username_ban(fake):
 def fake_username_ban(fake):

+ 4 - 4
misago/faker/management/commands/createfakecategories.py

@@ -2,13 +2,13 @@ import random
 import sys
 import sys
 import time
 import time
 
 
-from django.core.management.base import BaseCommand
 from faker import Factory
 from faker import Factory
 
 
-from misago.acl import version as acl_version
-from misago.core.management.progressbar import show_progress
+from django.core.management.base import BaseCommand
 
 
+from misago.acl import version as acl_version
 from misago.categories.models import Category, RoleCategoryACL
 from misago.categories.models import Category, RoleCategoryACL
+from misago.core.management.progressbar import show_progress
 
 
 
 
 class Command(BaseCommand):
 class Command(BaseCommand):
@@ -85,4 +85,4 @@ class Command(BaseCommand):
 
 
         total_time = time.time() - start_time
         total_time = time.time() - start_time
         total_humanized = time.strftime('%H:%M:%S', time.gmtime(total_time))
         total_humanized = time.strftime('%H:%M:%S', time.gmtime(total_time))
-        self.stdout.write(message % (created_count, total_humanized))
+        self.stdout.write(message % (created_count, total_humanized))

+ 2 - 2
misago/faker/management/commands/createfakethreads.py

@@ -9,10 +9,10 @@ from django.db.transaction import atomic
 from django.template.defaultfilters import linebreaks_filter
 from django.template.defaultfilters import linebreaks_filter
 from django.utils import timezone
 from django.utils import timezone
 
 
-from misago.core.management.progressbar import show_progress
 from misago.categories.models import Category
 from misago.categories.models import Category
+from misago.core.management.progressbar import show_progress
 from misago.threads.checksums import update_post_checksum
 from misago.threads.checksums import update_post_checksum
-from misago.threads.models import Thread, Post
+from misago.threads.models import Post, Thread
 
 
 
 
 class Command(BaseCommand):
 class Command(BaseCommand):

+ 3 - 3
misago/faker/management/commands/createfakeusers.py

@@ -2,16 +2,16 @@ import random
 import sys
 import sys
 import time
 import time
 
 
+from faker import Factory
+
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
 from django.core.exceptions import ValidationError
 from django.core.exceptions import ValidationError
 from django.core.management.base import BaseCommand
 from django.core.management.base import BaseCommand
 from django.db import IntegrityError
 from django.db import IntegrityError
 
 
-from faker import Factory
-
 from misago.core.management.progressbar import show_progress
 from misago.core.management.progressbar import show_progress
-from misago.users.models import Rank
 from misago.users.avatars import dynamic, gallery, get_avatar_hash
 from misago.users.avatars import dynamic, gallery, get_avatar_hash
+from misago.users.models import Rank
 
 
 
 
 class Command(BaseCommand):
 class Command(BaseCommand):

+ 1 - 0
misago/legal/context_processors.py

@@ -1,4 +1,5 @@
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
+
 from misago.conf import settings
 from misago.conf import settings
 
 
 
 

+ 1 - 1
misago/legal/migrations/0001_initial.py

@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
-from django.db import models, migrations
+from django.db import migrations, models
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from misago.conf.migrationutils import migrate_settings_group
 from misago.conf.migrationutils import migrate_settings_group

+ 0 - 1
misago/legal/tests.py

@@ -2,7 +2,6 @@ from django.core.urlresolvers import reverse
 from django.test import TestCase
 from django.test import TestCase
 
 
 from misago.conf import settings
 from misago.conf import settings
-
 from misago.legal.context_processors import legal_links
 from misago.legal.context_processors import legal_links
 
 
 
 

+ 1 - 0
misago/legal/urls.py

@@ -1,4 +1,5 @@
 from django.conf.urls import url
 from django.conf.urls import url
+
 from misago.legal.views import privacy_policy, terms_of_service
 from misago.legal.views import privacy_policy, terms_of_service
 
 
 
 

+ 2 - 2
misago/markup/parser.py

@@ -1,9 +1,9 @@
 import bleach
 import bleach
+import markdown
 from bs4 import BeautifulSoup
 from bs4 import BeautifulSoup
 from htmlmin.minify import html_minify
 from htmlmin.minify import html_minify
-import markdown
 
 
-from misago.markup.bbcode import inline, blocks
+from misago.markup.bbcode import blocks, inline
 from misago.markup.md.shortimgs import ShortImagesExtension
 from misago.markup.md.shortimgs import ShortImagesExtension
 from misago.markup.pipeline import pipeline
 from misago.markup.pipeline import pipeline
 
 

+ 1 - 0
misago/markup/pipeline.py

@@ -1,6 +1,7 @@
 from importlib import import_module
 from importlib import import_module
 
 
 from bs4 import BeautifulSoup
 from bs4 import BeautifulSoup
+
 from django.conf import settings
 from django.conf import settings
 
 
 
 

+ 1 - 0
misago/project_template/manage.py

@@ -2,6 +2,7 @@
 import os
 import os
 import sys
 import sys
 
 
+
 if __name__ == "__main__":
 if __name__ == "__main__":
     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")
     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")
 
 

+ 3 - 3
misago/project_template/project_name/settings.py

@@ -8,12 +8,12 @@ For the full list of settings and their values, see
 https://docs.djangoproject.com/en/{{ docs_version }}/ref/settings/
 https://docs.djangoproject.com/en/{{ docs_version }}/ref/settings/
 """
 """
 
 
-# Import Misago defaults for overriding
+# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
+import os
+
 from misago.conf.defaults import *
 from misago.conf.defaults import *
 
 
 
 
-# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
-import os
 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 
 
 
 

+ 6 - 5
misago/project_template/project_name/urls.py

@@ -1,16 +1,19 @@
 from django.conf import settings
 from django.conf import settings
 from django.conf.urls import include, url
 from django.conf.urls import include, url
-
+# Serve static and media files in development
+from django.conf.urls.static import static
 # Setup Django admin to work with Misago auth
 # Setup Django admin to work with Misago auth
 from django.contrib import admin
 from django.contrib import admin
+
+# Register default views
+from misago.core.views import javascript_catalog, momentjs_catalog
 from misago.users.forms.auth import AdminAuthenticationForm
 from misago.users.forms.auth import AdminAuthenticationForm
 
 
+
 admin.autodiscover()
 admin.autodiscover()
 admin.site.login_form = AdminAuthenticationForm
 admin.site.login_form = AdminAuthenticationForm
 
 
 
 
-# Register default views
-from misago.core.views import javascript_catalog, momentjs_catalog
 
 
 urlpatterns = [
 urlpatterns = [
     url(r'^', include('misago.urls', namespace='misago')),
     url(r'^', include('misago.urls', namespace='misago')),
@@ -27,8 +30,6 @@ urlpatterns = [
 ]
 ]
 
 
 
 
-# Serve static and media files in development
-from django.conf.urls.static import static
 
 
 urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
 urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
 urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
 urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

+ 4 - 1
misago/project_template/project_name/wsgi.py

@@ -8,7 +8,10 @@ https://docs.djangoproject.com/en/{{ docs_version }}/howto/deployment/wsgi/
 """
 """
 
 
 import os
 import os
-os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")
 
 
 from django.core.wsgi import get_wsgi_application
 from django.core.wsgi import get_wsgi_application
+
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")
+
 application = get_wsgi_application()
 application = get_wsgi_application()

+ 1 - 3
misago/readtracker/categoriestracker.py

@@ -1,11 +1,10 @@
 from django.db.models import F
 from django.db.models import F
 from django.utils import timezone
 from django.utils import timezone
 
 
-from misago.threads.permissions import exclude_invisible_threads
-
 from misago.readtracker import signals
 from misago.readtracker import signals
 from misago.readtracker.dates import is_date_tracked
 from misago.readtracker.dates import is_date_tracked
 from misago.readtracker.models import CategoryRead
 from misago.readtracker.models import CategoryRead
+from misago.threads.permissions import exclude_invisible_threads
 
 
 
 
 __all__ = ['make_read_aware', 'sync_record']
 __all__ = ['make_read_aware', 'sync_record']
@@ -114,4 +113,3 @@ def read_category(user, category):
         CategoryRead.objects.bulk_create(new_reads)
         CategoryRead.objects.bulk_create(new_reads)
 
 
     signals.category_read.send(sender=user, category=category)
     signals.category_read.send(sender=user, category=category)
-

+ 1 - 0
misago/readtracker/dates.py

@@ -1,4 +1,5 @@
 from datetime import timedelta
 from datetime import timedelta
+
 from django.conf import settings
 from django.conf import settings
 from django.utils import timezone
 from django.utils import timezone
 
 

+ 1 - 1
misago/readtracker/migrations/0001_initial.py

@@ -1,8 +1,8 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
-from django.db import models, migrations
 from django.conf import settings
 from django.conf import settings
+from django.db import migrations, models
 
 
 
 
 class Migration(migrations.Migration):
 class Migration(migrations.Migration):

+ 1 - 1
misago/readtracker/signals.py

@@ -1,4 +1,4 @@
-from django.dispatch import receiver, Signal
+from django.dispatch import Signal, receiver
 
 
 from misago.categories.signals import move_category_content
 from misago.categories.signals import move_category_content
 from misago.threads.signals import move_thread, remove_thread_participant
 from misago.threads.signals import move_thread, remove_thread_participant

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

@@ -6,11 +6,10 @@ from django.utils import timezone
 
 
 from misago.acl import add_acl
 from misago.acl import add_acl
 from misago.categories.models import Category
 from misago.categories.models import Category
+from misago.readtracker import categoriestracker, threadstracker
 from misago.threads import testutils
 from misago.threads import testutils
 from misago.users.models import AnonymousUser
 from misago.users.models import AnonymousUser
 
 
-from misago.readtracker import categoriestracker, threadstracker
-
 
 
 class ReadTrackerTests(TestCase):
 class ReadTrackerTests(TestCase):
     def setUp(self):
     def setUp(self):

+ 1 - 2
misago/threads/api/threadendpoints/list.py

@@ -1,8 +1,7 @@
 from rest_framework.response import Response
 from rest_framework.response import Response
 
 
 from misago.core.shortcuts import get_int_or_404
 from misago.core.shortcuts import get_int_or_404
-
-from misago.threads.viewmodels.category import ThreadsRootCategory, ThreadsCategory
+from misago.threads.viewmodels.category import ThreadsCategory, ThreadsRootCategory
 from misago.threads.viewmodels.threads import ForumThreads
 from misago.threads.viewmodels.threads import ForumThreads
 
 
 
 

+ 4 - 4
misago/threads/api/threadendpoints/merge.py

@@ -1,17 +1,17 @@
 from django.core.exceptions import PermissionDenied
 from django.core.exceptions import PermissionDenied
 from django.db import transaction
 from django.db import transaction
-from django.utils.translation import gettext as _, ungettext
+from django.utils.translation import gettext as _
+from django.utils.translation import ungettext
 
 
 from rest_framework.response import Response
 from rest_framework.response import Response
 
 
 from misago.acl import add_acl
 from misago.acl import add_acl
 from misago.categories.models import THREADS_ROOT_NAME, Category
 from misago.categories.models import THREADS_ROOT_NAME, Category
-from misago.categories.permissions import can_see_category, can_browse_category
-
+from misago.categories.permissions import can_browse_category, can_see_category
 from misago.threads.events import record_event
 from misago.threads.events import record_event
 from misago.threads.models import Thread
 from misago.threads.models import Thread
 from misago.threads.permissions import can_see_thread
 from misago.threads.permissions import can_see_thread
-from misago.threads.serializers import ThreadListSerializer, MergeThreadsSerializer
+from misago.threads.serializers import MergeThreadsSerializer, ThreadListSerializer
 from misago.threads.threadtypes import trees_map
 from misago.threads.threadtypes import trees_map
 from misago.threads.utils import add_categories_to_threads
 from misago.threads.utils import add_categories_to_threads
 
 

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

@@ -3,12 +3,10 @@ from django.utils.translation import gettext as _
 
 
 from misago.acl import add_acl
 from misago.acl import add_acl
 from misago.categories.models import Category
 from misago.categories.models import Category
-from misago.categories.permissions import (
-    allow_see_category, allow_browse_category)
+from misago.categories.permissions import allow_browse_category, allow_see_category
 from misago.categories.serializers import CategorySerializer
 from misago.categories.serializers import CategorySerializer
 from misago.core.apipatch import ApiPatch
 from misago.core.apipatch import ApiPatch
 from misago.core.shortcuts import get_int_or_404, get_object_or_404
 from misago.core.shortcuts import get_int_or_404, get_object_or_404
-
 from misago.threads.moderation import threads as moderation
 from misago.threads.moderation import threads as moderation
 from misago.threads.permissions import allow_start_thread
 from misago.threads.permissions import allow_start_thread
 from misago.threads.utils import add_categories_to_threads
 from misago.threads.utils import add_categories_to_threads

+ 0 - 1
misago/threads/api/threadposts.py

@@ -2,7 +2,6 @@ from rest_framework import viewsets
 from rest_framework.response import Response
 from rest_framework.response import Response
 
 
 from misago.core.shortcuts import get_int_or_404
 from misago.core.shortcuts import get_int_or_404
-
 from misago.threads.viewmodels.posts import ThreadPosts
 from misago.threads.viewmodels.posts import ThreadPosts
 from misago.threads.viewmodels.thread import ForumThread
 from misago.threads.viewmodels.thread import ForumThread
 
 

+ 2 - 2
misago/threads/api/threads.py

@@ -1,16 +1,16 @@
 from django.core.exceptions import PermissionDenied
 from django.core.exceptions import PermissionDenied
 from django.db import transaction
 from django.db import transaction
 from django.utils.translation import gettext as _
 from django.utils.translation import gettext as _
+
 from rest_framework import viewsets
 from rest_framework import viewsets
 from rest_framework.decorators import detail_route, list_route
 from rest_framework.decorators import detail_route, list_route
 from rest_framework.response import Response
 from rest_framework.response import Response
 
 
 from misago.acl import add_acl
 from misago.acl import add_acl
 from misago.categories.models import THREADS_ROOT_NAME, Category
 from misago.categories.models import THREADS_ROOT_NAME, Category
-from misago.categories.permissions import allow_see_category, allow_browse_category
+from misago.categories.permissions import allow_browse_category, allow_see_category
 from misago.core.shortcuts import get_int_or_404, get_object_or_404
 from misago.core.shortcuts import get_int_or_404, get_object_or_404
 from misago.readtracker.categoriestracker import read_category
 from misago.readtracker.categoriestracker import read_category
-
 from misago.threads.api.threadendpoints.list import threads_list_endpoint
 from misago.threads.api.threadendpoints.list import threads_list_endpoint
 from misago.threads.api.threadendpoints.merge import threads_merge_endpoint
 from misago.threads.api.threadendpoints.merge import threads_merge_endpoint
 from misago.threads.api.threadendpoints.patch import thread_patch_endpoint
 from misago.threads.api.threadendpoints.patch import thread_patch_endpoint

+ 1 - 1
misago/threads/counts.py

@@ -9,4 +9,4 @@ def sync_user_unread_private_threads_count(user):
     user.save(update_fields=[
     user.save(update_fields=[
         'unread_private_threads',
         'unread_private_threads',
         'sync_unread_private_threads'
         'sync_unread_private_threads'
-    ])
+    ])

+ 1 - 0
misago/threads/events.py

@@ -1,4 +1,5 @@
 from django.utils import timezone
 from django.utils import timezone
+
 from misago.threads.models import Post
 from misago.threads.models import Post
 
 
 
 

+ 0 - 1
misago/threads/management/commands/synchronizethreads.py

@@ -4,7 +4,6 @@ from django.core.management.base import BaseCommand
 
 
 from misago.core.management.progressbar import show_progress
 from misago.core.management.progressbar import show_progress
 from misago.core.pgutils import batch_update
 from misago.core.pgutils import batch_update
-
 from misago.threads.models import Thread
 from misago.threads.models import Thread
 
 
 
 

+ 4 - 4
misago/threads/migrations/0001_initial.py

@@ -1,13 +1,13 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
-from django.conf import settings
-from django.contrib.postgres.fields import JSONField
-from django.db import models, migrations
 import django.db.models.deletion
 import django.db.models.deletion
 import django.utils.timezone
 import django.utils.timezone
+from django.conf import settings
+from django.contrib.postgres.fields import JSONField
+from django.db import migrations, models
 
 
-from misago.core.pgutils import CreatePartialIndex, CreatePartialCompositeIndex
+from misago.core.pgutils import CreatePartialCompositeIndex, CreatePartialIndex
 
 
 
 
 class Migration(migrations.Migration):
 class Migration(migrations.Migration):

+ 1 - 1
misago/threads/migrations/0002_threads_settings.py

@@ -2,7 +2,7 @@
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
 from django.conf import settings
 from django.conf import settings
-from django.db import models, migrations
+from django.db import migrations, models
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from misago.conf.migrationutils import migrate_settings_group
 from misago.conf.migrationutils import migrate_settings_group

+ 1 - 2
misago/threads/models/post.py

@@ -5,9 +5,8 @@ from django.dispatch import receiver
 from django.utils import timezone
 from django.utils import timezone
 
 
 from misago.conf import settings
 from misago.conf import settings
-
 from misago.threads import threadtypes
 from misago.threads import threadtypes
-from misago.threads.checksums import update_post_checksum, is_post_valid
+from misago.threads.checksums import is_post_valid, update_post_checksum
 
 
 
 
 class Post(models.Model):
 class Post(models.Model):

+ 2 - 1
misago/threads/models/subscription.py

@@ -1,5 +1,6 @@
 from django.db import models
 from django.db import models
 from django.utils import timezone
 from django.utils import timezone
+
 from misago.conf import settings
 from misago.conf import settings
 
 
 
 
@@ -9,4 +10,4 @@ class Subscription(models.Model):
     category = models.ForeignKey('misago_categories.Category')
     category = models.ForeignKey('misago_categories.Category')
 
 
     last_read_on = models.DateTimeField(default=timezone.now)
     last_read_on = models.DateTimeField(default=timezone.now)
-    send_email = models.BooleanField(default=False)
+    send_email = models.BooleanField(default=False)

+ 1 - 0
misago/threads/models/threadparticipant.py

@@ -1,4 +1,5 @@
 from django.db import models
 from django.db import models
+
 from misago.conf import settings
 from misago.conf import settings
 
 
 
 

+ 0 - 1
misago/threads/participants.py

@@ -1,7 +1,6 @@
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from misago.core.mail import mail_user
 from misago.core.mail import mail_user
-
 from misago.threads.models import ThreadParticipant
 from misago.threads.models import ThreadParticipant
 from misago.threads.signals import remove_thread_participant
 from misago.threads.signals import remove_thread_participant
 
 

+ 4 - 4
misago/threads/permissions/threads.py

@@ -2,16 +2,16 @@ from django.core.exceptions import PermissionDenied
 from django.db.models import Q
 from django.db.models import Q
 from django.http import Http404
 from django.http import Http404
 from django.utils import timezone
 from django.utils import timezone
-from django.utils.translation import ungettext, ugettext_lazy as _
+from django.utils.translation import ugettext_lazy as _
+from django.utils.translation import ungettext
 
 
 from misago.acl import add_acl, algebra
 from misago.acl import add_acl, algebra
 from misago.acl.decorators import return_boolean
 from misago.acl.decorators import return_boolean
 from misago.acl.models import Role
 from misago.acl.models import Role
-from misago.categories.models import Category, RoleCategoryACL, CategoryRole
+from misago.categories.models import Category, CategoryRole, RoleCategoryACL
 from misago.categories.permissions import get_categories_roles
 from misago.categories.permissions import get_categories_roles
 from misago.core import forms
 from misago.core import forms
-
-from misago.threads.models import Thread, Post
+from misago.threads.models import Post, Thread
 
 
 
 
 __all__ = [
 __all__ = [

+ 2 - 2
misago/threads/serializers/moderation.py

@@ -1,11 +1,11 @@
 from django.forms import ValidationError
 from django.forms import ValidationError
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
+
 from rest_framework import serializers
 from rest_framework import serializers
 
 
 from misago.acl import add_acl
 from misago.acl import add_acl
 from misago.categories.models import THREADS_ROOT_NAME, Category
 from misago.categories.models import THREADS_ROOT_NAME, Category
-from misago.categories.permissions import can_see_category, can_browse_category
-
+from misago.categories.permissions import can_browse_category, can_see_category
 from misago.threads.models import THREAD_WEIGHT_DEFAULT, THREAD_WEIGHT_GLOBAL
 from misago.threads.models import THREAD_WEIGHT_DEFAULT, THREAD_WEIGHT_GLOBAL
 from misago.threads.permissions import allow_start_thread
 from misago.threads.permissions import allow_start_thread
 from misago.threads.threadtypes import trees_map
 from misago.threads.threadtypes import trees_map

+ 2 - 2
misago/threads/serializers/post.py

@@ -1,9 +1,9 @@
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
-from rest_framework import serializers
 
 
-from misago.users.serializers import UserSerializer
+from rest_framework import serializers
 
 
 from misago.threads.models import Post
 from misago.threads.models import Post
+from misago.users.serializers import UserSerializer
 
 
 
 
 __all__ = [
 __all__ = [

+ 1 - 1
misago/threads/serializers/thread.py

@@ -1,8 +1,8 @@
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
+
 from rest_framework import serializers
 from rest_framework import serializers
 
 
 from misago.categories.serializers import BasicCategorySerializer
 from misago.categories.serializers import BasicCategorySerializer
-
 from misago.threads.models import Thread
 from misago.threads.models import Thread
 
 
 
 

+ 7 - 9
misago/threads/signals.py

@@ -1,10 +1,13 @@
+from django.contrib.auth import get_user_model
 from django.db import transaction
 from django.db import transaction
-from django.dispatch import receiver, Signal
+from django.db.models.signals import pre_delete
+from django.dispatch import Signal, receiver
 
 
 from misago.categories.models import Category
 from misago.categories.models import Category
-from misago.core.pgutils import batch_update, batch_delete
-
-from misago.threads.models import Thread, Post
+from misago.categories.signals import delete_category_content, move_category_content
+from misago.core.pgutils import batch_delete, batch_update
+from misago.threads.models import Post, Thread
+from misago.users.signals import delete_user_content, username_changed
 
 
 
 
 delete_post = Signal()
 delete_post = Signal()
@@ -30,8 +33,6 @@ def move_thread_content(sender, **kwargs):
     sender.post_set.update(category=sender.category)
     sender.post_set.update(category=sender.category)
 
 
 
 
-from misago.categories.signals import (delete_category_content,
-                                       move_category_content)
 @receiver(delete_category_content)
 @receiver(delete_category_content)
 def delete_category_threads(sender, **kwargs):
 def delete_category_threads(sender, **kwargs):
     sender.thread_set.all().delete()
     sender.thread_set.all().delete()
@@ -46,7 +47,6 @@ def move_category_threads(sender, **kwargs):
     Post.objects.filter(category=sender).update(category=new_category)
     Post.objects.filter(category=sender).update(category=new_category)
 
 
 
 
-from misago.users.signals import delete_user_content, username_changed
 @receiver(delete_user_content)
 @receiver(delete_user_content)
 def delete_user_threads(sender, **kwargs):
 def delete_user_threads(sender, **kwargs):
     recount_categories = set()
     recount_categories = set()
@@ -95,8 +95,6 @@ def update_usernames(sender, **kwargs):
     )
     )
 
 
 
 
-from django.contrib.auth import get_user_model
-from django.db.models.signals import pre_delete
 @receiver(pre_delete, sender=get_user_model())
 @receiver(pre_delete, sender=get_user_model())
 def remove_unparticipated_private_threads(sender, **kwargs):
 def remove_unparticipated_private_threads(sender, **kwargs):
     threads_qs = kwargs['instance'].private_thread_set.all()
     threads_qs = kwargs['instance'].private_thread_set.all()

+ 1 - 1
misago/threads/subscriptions.py

@@ -39,4 +39,4 @@ def make_thread_subscription_aware(user, thread):
         try:
         try:
             thread.subscription = user.subscription_set.get(thread=thread)
             thread.subscription = user.subscription_set.get(thread=thread)
         except Subscription.DoesNotExist:
         except Subscription.DoesNotExist:
-            thread.subscription = None
+            thread.subscription = None

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

@@ -2,11 +2,9 @@ from datetime import timedelta
 
 
 from django.utils import timezone
 from django.utils import timezone
 
 
-from misago.users.testutils import AuthenticatedUserTestCase
-
 from misago.threads.posting import PostingInterrupt
 from misago.threads.posting import PostingInterrupt
-from misago.threads.posting.floodprotection import (
-    MIN_POSTING_PAUSE, FloodProtectionMiddleware)
+from misago.threads.posting.floodprotection import MIN_POSTING_PAUSE, FloodProtectionMiddleware
+from misago.users.testutils import AuthenticatedUserTestCase
 
 
 
 
 class FloodProtectionMiddlewareTests(AuthenticatedUserTestCase):
 class FloodProtectionMiddlewareTests(AuthenticatedUserTestCase):

+ 1 - 3
misago/threads/tests/test_events.py

@@ -7,9 +7,8 @@ from django.utils import timezone
 
 
 from misago.acl import add_acl
 from misago.acl import add_acl
 from misago.categories.models import Category
 from misago.categories.models import Category
-
 from misago.threads.events import record_event
 from misago.threads.events import record_event
-from misago.threads.models import Thread, Post
+from misago.threads.models import Post, Thread
 from misago.threads.testutils import reply_thread
 from misago.threads.testutils import reply_thread
 
 
 
 
@@ -58,4 +57,3 @@ class EventsAPITests(TestCase):
         self.assertEqual(event_post.event_context, context)
         self.assertEqual(event_post.event_context, context)
         self.assertEqual(event_post.poster_id, request.user.pk)
         self.assertEqual(event_post.poster_id, request.user.pk)
         self.assertEqual(event_post.poster_ip, request.user_ip)
         self.assertEqual(event_post.poster_ip, request.user_ip)
-

+ 8 - 4
misago/threads/tests/test_participants.py

@@ -3,11 +3,15 @@ from django.test import TestCase
 from django.utils import timezone
 from django.utils import timezone
 
 
 from misago.categories.models import Category
 from misago.categories.models import Category
-
-from misago.threads.models import Thread, ThreadParticipant, Post
+from misago.threads.models import Post, Thread, ThreadParticipant
 from misago.threads.participants import (
 from misago.threads.participants import (
-    thread_has_participants, make_thread_participants_aware, set_thread_owner,
-    set_user_unread_private_threads_sync, add_owner, remove_participant)
+    add_owner,
+    make_thread_participants_aware,
+    remove_participant,
+    set_thread_owner,
+    set_user_unread_private_threads_sync,
+    thread_has_participants
+)
 
 
 
 
 class ParticipantsTests(TestCase):
 class ParticipantsTests(TestCase):

+ 1 - 2
misago/threads/tests/test_post_model.py

@@ -5,9 +5,8 @@ from django.test import TestCase
 from django.utils import timezone
 from django.utils import timezone
 
 
 from misago.categories.models import Category
 from misago.categories.models import Category
-
 from misago.threads.checksums import update_post_checksum
 from misago.threads.checksums import update_post_checksum
-from misago.threads.models import Thread, Post
+from misago.threads.models import Post, Thread
 
 
 
 
 class PostModelTests(TestCase):
 class PostModelTests(TestCase):

+ 2 - 3
misago/threads/tests/test_posts_moderation.py

@@ -1,8 +1,7 @@
 from misago.categories.models import Category
 from misago.categories.models import Category
-from misago.users.testutils import AuthenticatedUserTestCase
-
 from misago.threads import moderation, testutils
 from misago.threads import moderation, testutils
-from misago.threads.models import Thread, Post
+from misago.threads.models import Post, Thread
+from misago.users.testutils import AuthenticatedUserTestCase
 
 
 
 
 class PostsModerationTests(AuthenticatedUserTestCase):
 class PostsModerationTests(AuthenticatedUserTestCase):

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

@@ -6,9 +6,8 @@ from django.utils import timezone
 
 
 from misago.categories.models import Category
 from misago.categories.models import Category
 from misago.threads import testutils
 from misago.threads import testutils
-from misago.users.models import AnonymousUser
-
 from misago.threads.subscriptions import make_subscription_aware
 from misago.threads.subscriptions import make_subscription_aware
+from misago.users.models import AnonymousUser
 
 
 
 
 class SubscriptionsTests(TestCase):
 class SubscriptionsTests(TestCase):

+ 0 - 1
misago/threads/tests/test_synchronizethreads.py

@@ -2,7 +2,6 @@ from django.test import TestCase
 from django.utils.six import StringIO
 from django.utils.six import StringIO
 
 
 from misago.categories.models import Category
 from misago.categories.models import Category
-
 from misago.threads import testutils
 from misago.threads import testutils
 from misago.threads.management.commands import synchronizethreads
 from misago.threads.management.commands import synchronizethreads
 
 

+ 1 - 2
misago/threads/tests/test_thread_model.py

@@ -5,8 +5,7 @@ from django.test import TestCase
 from django.utils import timezone
 from django.utils import timezone
 
 
 from misago.categories.models import Category
 from misago.categories.models import Category
-
-from misago.threads.models import Thread, ThreadParticipant, Post
+from misago.threads.models import Post, Thread, ThreadParticipant
 
 
 
 
 class ThreadModelTests(TestCase):
 class ThreadModelTests(TestCase):

+ 0 - 1
misago/threads/tests/test_thread_patch_api.py

@@ -2,7 +2,6 @@ import json
 
 
 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.threads.tests.test_threads_api import ThreadsApiTestCase
 from misago.threads.tests.test_threads_api import ThreadsApiTestCase
 
 
 
 

+ 1 - 3
misago/threads/tests/test_threadparticipant_model.py

@@ -3,8 +3,7 @@ from django.test import TestCase
 from django.utils import timezone
 from django.utils import timezone
 
 
 from misago.categories.models import Category
 from misago.categories.models import Category
-
-from misago.threads.models import Thread, ThreadParticipant, Post
+from misago.threads.models import Post, Thread, ThreadParticipant
 
 
 
 
 class ThreadParticipantTests(TestCase):
 class ThreadParticipantTests(TestCase):
@@ -98,4 +97,3 @@ class ThreadParticipantTests(TestCase):
         participation = ThreadParticipant.objects.get(
         participation = ThreadParticipant.objects.get(
             thread=self.thread, user=user)
             thread=self.thread, user=user)
         self.assertFalse(participation.is_owner)
         self.assertFalse(participation.is_owner)
-

+ 1 - 2
misago/threads/tests/test_threads_api.py

@@ -1,12 +1,11 @@
 import json
 import json
 
 
 from misago.acl.testutils import override_acl
 from misago.acl.testutils import override_acl
-from misago.users.testutils import AuthenticatedUserTestCase
 from misago.categories.models import THREADS_ROOT_NAME, Category
 from misago.categories.models import THREADS_ROOT_NAME, Category
-
 from misago.threads import testutils
 from misago.threads import testutils
 from misago.threads.models import Thread
 from misago.threads.models import Thread
 from misago.threads.threadtypes import trees_map
 from misago.threads.threadtypes import trees_map
+from misago.users.testutils import AuthenticatedUserTestCase
 
 
 
 
 class ThreadsApiTestCase(AuthenticatedUserTestCase):
 class ThreadsApiTestCase(AuthenticatedUserTestCase):

+ 1 - 2
misago/threads/tests/test_threads_merge_api.py

@@ -5,10 +5,9 @@ from django.core.urlresolvers import reverse
 from misago.acl import add_acl
 from misago.acl import add_acl
 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.threads import testutils
 from misago.threads import testutils
 from misago.threads.api.threadendpoints.merge import MERGE_LIMIT
 from misago.threads.api.threadendpoints.merge import MERGE_LIMIT
-from misago.threads.models import Thread, Post
+from misago.threads.models import Post, Thread
 from misago.threads.serializers import ThreadListSerializer
 from misago.threads.serializers import ThreadListSerializer
 from misago.threads.tests.test_threads_api import ThreadsApiTestCase
 from misago.threads.tests.test_threads_api import ThreadsApiTestCase
 
 

+ 2 - 3
misago/threads/tests/test_threads_moderation.py

@@ -1,8 +1,7 @@
 from misago.categories.models import Category
 from misago.categories.models import Category
-from misago.users.testutils import AuthenticatedUserTestCase
-
 from misago.threads import moderation, testutils
 from misago.threads import moderation, testutils
-from misago.threads.models import Thread, Post
+from misago.threads.models import Post, Thread
+from misago.users.testutils import AuthenticatedUserTestCase
 
 
 
 
 class MockRequest(object):
 class MockRequest(object):

+ 1 - 2
misago/threads/tests/test_threadslists.py

@@ -9,9 +9,8 @@ from misago.categories.models import Category
 from misago.core import threadstore
 from misago.core import threadstore
 from misago.core.cache import cache
 from misago.core.cache import cache
 from misago.readtracker import categoriestracker, threadstracker
 from misago.readtracker import categoriestracker, threadstracker
-from misago.users.testutils import AuthenticatedUserTestCase
-
 from misago.threads import testutils
 from misago.threads import testutils
+from misago.users.testutils import AuthenticatedUserTestCase
 
 
 
 
 LISTS_URLS = (
 LISTS_URLS = (

+ 1 - 2
misago/threads/tests/test_threadview.py

@@ -1,9 +1,8 @@
 from misago.acl.testutils import override_acl
 from misago.acl.testutils import override_acl
-from misago.users.testutils import AuthenticatedUserTestCase
 from misago.categories.models import Category
 from misago.categories.models import Category
-
 from misago.threads import testutils
 from misago.threads import testutils
 from misago.threads.models import Thread
 from misago.threads.models import Thread
+from misago.users.testutils import AuthenticatedUserTestCase
 
 
 
 
 class ThreadViewTestCase(AuthenticatedUserTestCase):
 class ThreadViewTestCase(AuthenticatedUserTestCase):

+ 1 - 0
misago/threads/tests/test_typestree.py

@@ -1,4 +1,5 @@
 from django.test import TestCase
 from django.test import TestCase
+
 from misago.categories.models import Category
 from misago.categories.models import Category
 from misago.threads.threadtypes import TreesMap
 from misago.threads.threadtypes import TreesMap
 
 

+ 1 - 2
misago/threads/tests/test_utils.py

@@ -1,6 +1,5 @@
-from misago.core.testutils import MisagoTestCase
 from misago.categories.models import Category
 from misago.categories.models import Category
-
+from misago.core.testutils import MisagoTestCase
 from misago.threads import testutils
 from misago.threads import testutils
 from misago.threads.utils import add_categories_to_threads
 from misago.threads.utils import add_categories_to_threads
 
 

+ 0 - 1
misago/threads/tests/test_validators.py

@@ -2,7 +2,6 @@ from django.core.exceptions import ValidationError
 from django.test import TestCase
 from django.test import TestCase
 
 
 from misago.conf import settings
 from misago.conf import settings
-
 from misago.threads.validators import validate_title
 from misago.threads.validators import validate_title
 
 
 
 

+ 1 - 2
misago/threads/testutils.py

@@ -3,8 +3,7 @@ from datetime import timedelta
 from django.utils import timezone
 from django.utils import timezone
 
 
 from misago.core.utils import slugify
 from misago.core.utils import slugify
-
-from misago.threads.models import Thread, Post
+from misago.threads.models import Post, Thread
 
 
 
 
 def post_thread(category, title='Test thread', poster='Tester',
 def post_thread(category, title='Test thread', poster='Tester',

+ 1 - 0
misago/threads/threadtypes/privatethread.py

@@ -1,5 +1,6 @@
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
+
 from misago.threads.threadtypes import ThreadType
 from misago.threads.threadtypes import ThreadType
 
 
 
 

+ 1 - 0
misago/threads/threadtypes/thread.py

@@ -1,5 +1,6 @@
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
+
 from misago.threads.threadtypes import ThreadType
 from misago.threads.threadtypes import ThreadType
 
 
 
 

+ 2 - 1
misago/threads/validators.py

@@ -1,5 +1,6 @@
 from django.core.exceptions import ValidationError
 from django.core.exceptions import ValidationError
-from django.utils.translation import ugettext_lazy as _, ungettext
+from django.utils.translation import ugettext_lazy as _
+from django.utils.translation import ungettext
 
 
 from misago.conf import settings
 from misago.conf import settings
 from misago.core.validators import validate_sluggable
 from misago.core.validators import validate_sluggable

+ 2 - 3
misago/threads/viewmodels/category.py

@@ -1,11 +1,10 @@
 from django.http import Http404
 from django.http import Http404
 
 
 from misago.acl import add_acl
 from misago.acl import add_acl
-from misago.core.shortcuts import validate_slug
-
 from misago.categories.models import Category
 from misago.categories.models import Category
-from misago.categories.permissions import allow_see_category, allow_browse_category
+from misago.categories.permissions import allow_browse_category, allow_see_category
 from misago.categories.serializers import BasicCategorySerializer
 from misago.categories.serializers import BasicCategorySerializer
+from misago.core.shortcuts import validate_slug
 
 
 
 
 class ViewModel(object):
 class ViewModel(object):

+ 1 - 2
misago/threads/viewmodels/posts.py

@@ -3,10 +3,9 @@ from django.conf import settings
 from misago.acl import add_acl
 from misago.acl import add_acl
 from misago.core.shortcuts import paginate, pagination_dict
 from misago.core.shortcuts import paginate, pagination_dict
 from misago.readtracker.threadstracker import make_posts_read_aware
 from misago.readtracker.threadstracker import make_posts_read_aware
-from misago.users.online.utils import make_users_status_aware
-
 from misago.threads.permissions.threads import exclude_invisible_posts
 from misago.threads.permissions.threads import exclude_invisible_posts
 from misago.threads.serializers import ThreadPostSerializer
 from misago.threads.serializers import ThreadPostSerializer
+from misago.users.online.utils import make_users_status_aware
 
 
 
 
 class ViewModel(object):
 class ViewModel(object):

+ 0 - 1
misago/threads/viewmodels/thread.py

@@ -5,7 +5,6 @@ from misago.acl import add_acl
 from misago.categories.models import Category
 from misago.categories.models import Category
 from misago.core.shortcuts import validate_slug
 from misago.core.shortcuts import validate_slug
 from misago.readtracker.threadstracker import make_read_aware
 from misago.readtracker.threadstracker import make_read_aware
-
 from misago.threads.models import Thread
 from misago.threads.models import Thread
 from misago.threads.permissions.threads import allow_see_thread
 from misago.threads.permissions.threads import allow_see_thread
 from misago.threads.serializers import ThreadSerializer
 from misago.threads.serializers import ThreadSerializer

+ 2 - 2
misago/threads/viewmodels/threads.py

@@ -5,12 +5,12 @@ from django.core.exceptions import PermissionDenied
 from django.db.models import F, Q
 from django.db.models import F, Q
 from django.http import Http404
 from django.http import Http404
 from django.utils import timezone
 from django.utils import timezone
-from django.utils.translation import ugettext as _, ugettext_lazy
+from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy
 
 
 from misago.acl import add_acl
 from misago.acl import add_acl
 from misago.core.shortcuts import paginate, pagination_dict
 from misago.core.shortcuts import paginate, pagination_dict
 from misago.readtracker import threadstracker
 from misago.readtracker import threadstracker
-
 from misago.threads.models import Thread
 from misago.threads.models import Thread
 from misago.threads.permissions import exclude_invisible_threads
 from misago.threads.permissions import exclude_invisible_threads
 from misago.threads.serializers import ThreadListSerializer
 from misago.threads.serializers import ThreadListSerializer

+ 1 - 1
misago/threads/views/list.py

@@ -4,7 +4,7 @@ from django.http import Http404
 from django.shortcuts import render
 from django.shortcuts import render
 from django.views.generic import View
 from django.views.generic import View
 
 
-from misago.threads.viewmodels.category import ThreadsRootCategory, ThreadsCategory, PrivateThreadsCategory
+from misago.threads.viewmodels.category import PrivateThreadsCategory, ThreadsCategory, ThreadsRootCategory
 from misago.threads.viewmodels.threads import ForumThreads, PrivateThreads
 from misago.threads.viewmodels.threads import ForumThreads, PrivateThreads
 
 
 
 

+ 1 - 1
misago/threads/views/thread.py

@@ -2,8 +2,8 @@ from django.core.urlresolvers import reverse
 from django.shortcuts import render
 from django.shortcuts import render
 from django.views.generic import View
 from django.views.generic import View
 
 
-from misago.threads.viewmodels.thread import ForumThread
 from misago.threads.viewmodels.posts import ThreadPosts
 from misago.threads.viewmodels.posts import ThreadPosts
+from misago.threads.viewmodels.thread import ForumThread
 
 
 
 
 class ThreadBase(View):
 class ThreadBase(View):

+ 1 - 0
misago/urls.py

@@ -1,5 +1,6 @@
 from django.conf import settings
 from django.conf import settings
 from django.conf.urls import include, url
 from django.conf.urls import include, url
+
 from misago.core.views import forum_index
 from misago.core.views import forum_index
 
 
 
 

+ 1 - 2
misago/users/activepostersranking.py

@@ -6,7 +6,6 @@ from django.db.models import Count
 from django.utils import timezone
 from django.utils import timezone
 
 
 from misago.categories.models import Category
 from misago.categories.models import Category
-
 from misago.users.models import ActivityRanking
 from misago.users.models import ActivityRanking
 
 
 
 
@@ -43,4 +42,4 @@ def build_active_posters_ranking():
         ActivityRanking.objects.create(
         ActivityRanking.objects.create(
             user=ranking,
             user=ranking,
             score=ranking.score
             score=ranking.score
-        )
+        )

+ 25 - 9
misago/users/admin.py

@@ -2,18 +2,34 @@ from django.conf.urls import url
 from django.contrib import admin as djadmin
 from django.contrib import admin as djadmin
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 
 
-from misago.users.views.admin.bans import BansList, NewBan, EditBan, DeleteBan
+from misago.users.djangoadmin import User, UserAdminModel
+from misago.users.views.admin.bans import BansList, DeleteBan, EditBan, NewBan
 from misago.users.views.admin.ranks import (
 from misago.users.views.admin.ranks import (
-    RanksList, NewRank, EditRank, DeleteRank, MoveDownRank, MoveUpRank,
-    DefaultRank, RankUsers)
+    DefaultRank,
+    DeleteRank,
+    EditRank,
+    MoveDownRank,
+    MoveUpRank,
+    NewRank,
+    RanksList,
+    RankUsers
+)
 from misago.users.views.admin.users import (
 from misago.users.views.admin.users import (
-    UsersList, NewUser, EditUser, DeleteThreadsStep, DeletePostsStep,
-    DeleteAccountStep)
+    DeleteAccountStep,
+    DeletePostsStep,
+    DeleteThreadsStep,
+    EditUser,
+    NewUser,
+    UsersList
+)
 from misago.users.views.admin.warnings import (
 from misago.users.views.admin.warnings import (
-    WarningsList, NewWarning, EditWarning, MoveDownWarning, MoveUpWarning,
-    DeleteWarning)
-from misago.users.djangoadmin import User
-from misago.users.djangoadmin import UserAdminModel
+    DeleteWarning,
+    EditWarning,
+    MoveDownWarning,
+    MoveUpWarning,
+    NewWarning,
+    WarningsList
+)
 
 
 
 
 # register misago user model in django admin panel
 # register misago user model in django admin panel

+ 2 - 3
misago/users/api/auth.py

@@ -9,12 +9,11 @@ from rest_framework.response import Response
 
 
 from misago.conf import settings
 from misago.conf import settings
 from misago.core.mail import mail_user
 from misago.core.mail import mail_user
-
 from misago.users.bans import get_user_ban
 from misago.users.bans import get_user_ban
 from misago.users.forms.auth import AuthenticationForm, ResendActivationForm, ResetPasswordForm
 from misago.users.forms.auth import AuthenticationForm, ResendActivationForm, ResetPasswordForm
 from misago.users.rest_permissions import UnbannedAnonOnly, UnbannedOnly
 from misago.users.rest_permissions import UnbannedAnonOnly, UnbannedOnly
-from misago.users.serializers import AuthenticatedUserSerializer, AnonymousUserSerializer
-from misago.users.tokens import make_activation_token, make_password_change_token, is_password_change_token_valid
+from misago.users.serializers import AnonymousUserSerializer, AuthenticatedUserSerializer
+from misago.users.tokens import is_password_change_token_valid, make_activation_token, make_password_change_token
 from misago.users.validators import validate_password
 from misago.users.validators import validate_password
 
 
 
 

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

@@ -1,4 +1,4 @@
-from rest_framework import viewsets, mixins
+from rest_framework import mixins, viewsets
 
 
 from misago.users.models import Rank
 from misago.users.models import Rank
 from misago.users.serializers import RankSerializer
 from misago.users.serializers import RankSerializer

+ 1 - 2
misago/users/api/userendpoints/avatar.py

@@ -8,7 +8,6 @@ from rest_framework.response import Response
 
 
 from misago.conf import settings
 from misago.conf import settings
 from misago.core.utils import format_plaintext_for_html
 from misago.core.utils import format_plaintext_for_html
-
 from misago.users import avatars
 from misago.users import avatars
 from misago.users.forms.moderation import ModerateAvatarForm
 from misago.users.forms.moderation import ModerateAvatarForm
 
 
@@ -214,4 +213,4 @@ def moderate_avatar_endpoint(request, profile):
             'is_avatar_locked': int(profile.is_avatar_locked),
             'is_avatar_locked': int(profile.is_avatar_locked),
             'avatar_lock_user_message': profile.avatar_lock_user_message,
             'avatar_lock_user_message': profile.avatar_lock_user_message,
             'avatar_lock_staff_message': profile.avatar_lock_staff_message,
             'avatar_lock_staff_message': profile.avatar_lock_staff_message,
-        })
+        })

+ 1 - 2
misago/users/api/userendpoints/changeemail.py

@@ -5,9 +5,8 @@ from rest_framework.response import Response
 
 
 from misago.conf import settings
 from misago.conf import settings
 from misago.core.mail import mail_user
 from misago.core.mail import mail_user
-
-from misago.users.forms.options import ChangeEmailForm
 from misago.users.credentialchange import store_new_credential
 from misago.users.credentialchange import store_new_credential
+from misago.users.forms.options import ChangeEmailForm
 
 
 
 
 def change_email_endpoint(request, pk=None):
 def change_email_endpoint(request, pk=None):

+ 1 - 2
misago/users/api/userendpoints/changepassword.py

@@ -5,9 +5,8 @@ from rest_framework.response import Response
 
 
 from misago.conf import settings
 from misago.conf import settings
 from misago.core.mail import mail_user
 from misago.core.mail import mail_user
-
-from misago.users.forms.options import ChangePasswordForm
 from misago.users.credentialchange import store_new_credential
 from misago.users.credentialchange import store_new_credential
+from misago.users.forms.options import ChangePasswordForm
 
 
 
 
 def change_password_endpoint(request, pk=None):
 def change_password_endpoint(request, pk=None):

+ 1 - 3
misago/users/api/userendpoints/create.py

@@ -9,12 +9,10 @@ from rest_framework.response import Response
 from misago.conf import settings
 from misago.conf import settings
 from misago.core import forms
 from misago.core import forms
 from misago.core.mail import mail_user
 from misago.core.mail import mail_user
-
 from misago.users import captcha
 from misago.users import captcha
 from misago.users.bans import ban_ip
 from misago.users.bans import ban_ip
 from misago.users.forms.register import RegisterForm
 from misago.users.forms.register import RegisterForm
-from misago.users.models import (ACTIVATION_REQUIRED_USER,
-                                 ACTIVATION_REQUIRED_ADMIN)
+from misago.users.models import ACTIVATION_REQUIRED_ADMIN, ACTIVATION_REQUIRED_USER
 from misago.users.serializers import AuthenticatedUserSerializer
 from misago.users.serializers import AuthenticatedUserSerializer
 from misago.users.tokens import make_activation_token
 from misago.users.tokens import make_activation_token
 from misago.users.validators import validate_new_registration
 from misago.users.validators import validate_new_registration

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

@@ -11,11 +11,10 @@ from misago.conf import settings
 from misago.core.apipaginator import ApiPaginator
 from misago.core.apipaginator import ApiPaginator
 from misago.core.cache import cache
 from misago.core.cache import cache
 from misago.core.shortcuts import get_int_or_404, get_object_or_404
 from misago.core.shortcuts import get_int_or_404, get_object_or_404
-
 from misago.users.activepostersranking import get_active_posters_ranking
 from misago.users.activepostersranking import get_active_posters_ranking
 from misago.users.models import Rank
 from misago.users.models import Rank
 from misago.users.online.utils import make_users_status_aware
 from misago.users.online.utils import make_users_status_aware
-from misago.users.serializers import UserSerializer, ScoredUserSerializer
+from misago.users.serializers import ScoredUserSerializer, UserSerializer
 
 
 
 
 Paginator = ApiPaginator(settings.MISAGO_USERS_PER_PAGE, 4)
 Paginator = ApiPaginator(settings.MISAGO_USERS_PER_PAGE, 4)

+ 0 - 1
misago/users/api/userendpoints/signature.py

@@ -6,7 +6,6 @@ from rest_framework.response import Response
 
 
 from misago.conf import settings
 from misago.conf import settings
 from misago.core.utils import format_plaintext_for_html
 from misago.core.utils import format_plaintext_for_html
-
 from misago.users.forms.options import EditSignatureForm
 from misago.users.forms.options import EditSignatureForm
 from misago.users.signatures import is_user_signature_valid, set_user_signature
 from misago.users.signatures import is_user_signature_valid, set_user_signature
 
 

+ 2 - 3
misago/users/api/userendpoints/username.py

@@ -5,9 +5,8 @@ from rest_framework import status
 from rest_framework.response import Response
 from rest_framework.response import Response
 
 
 from misago.conf import settings
 from misago.conf import settings
-
-from misago.users.namechanges import UsernameChanges
 from misago.users.forms.rename import ChangeUsernameForm
 from misago.users.forms.rename import ChangeUsernameForm
+from misago.users.namechanges import UsernameChanges
 
 
 
 
 def username_endpoint(request):
 def username_endpoint(request):
@@ -85,4 +84,4 @@ def moderate_username_endpoint(request, profile):
         return Response({
         return Response({
             'length_min': settings.username_length_min,
             'length_min': settings.username_length_min,
             'length_max': settings.username_length_max,
             'length_max': settings.username_length_max,
-        })
+        })

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

@@ -3,12 +3,11 @@ from django.core.exceptions import PermissionDenied
 from django.db.models import Q
 from django.db.models import Q
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
-from rest_framework import status, viewsets, mixins
+from rest_framework import mixins, status, viewsets
 from rest_framework.response import Response
 from rest_framework.response import Response
 
 
 from misago.core.apipaginator import ApiPaginator
 from misago.core.apipaginator import ApiPaginator
 from misago.core.shortcuts import get_int_or_404, get_object_or_404
 from misago.core.shortcuts import get_int_or_404, get_object_or_404
-
 from misago.users.models import UsernameChange
 from misago.users.models import UsernameChange
 from misago.users.rest_permissions import BasePermission
 from misago.users.rest_permissions import BasePermission
 from misago.users.serializers.usernamechange import UsernameChangeSerializer
 from misago.users.serializers.usernamechange import UsernameChangeSerializer

+ 9 - 12
misago/users/api/users.py

@@ -16,24 +16,21 @@ from misago.core.cache import cache
 from misago.core.shortcuts import get_int_or_404, get_object_or_404
 from misago.core.shortcuts import get_int_or_404, get_object_or_404
 from misago.threads.moderation.posts import hide_post
 from misago.threads.moderation.posts import hide_post
 from misago.threads.moderation.threads import hide_thread
 from misago.threads.moderation.threads import hide_thread
-
+from misago.users.api.userendpoints.avatar import avatar_endpoint, moderate_avatar_endpoint
+from misago.users.api.userendpoints.changeemail import change_email_endpoint
+from misago.users.api.userendpoints.changepassword import change_password_endpoint
+from misago.users.api.userendpoints.create import create_endpoint
+from misago.users.api.userendpoints.list import list_endpoint
+from misago.users.api.userendpoints.signature import signature_endpoint
+from misago.users.api.userendpoints.username import moderate_username_endpoint, username_endpoint
 from misago.users.bans import get_user_ban
 from misago.users.bans import get_user_ban
 from misago.users.forms.options import ForumOptionsForm
 from misago.users.forms.options import ForumOptionsForm
 from misago.users.online.utils import get_user_status
 from misago.users.online.utils import get_user_status
 from misago.users.permissions.delete import allow_delete_user
 from misago.users.permissions.delete import allow_delete_user
-from misago.users.permissions.moderation import allow_rename_user, allow_moderate_avatar
+from misago.users.permissions.moderation import allow_moderate_avatar, allow_rename_user
 from misago.users.permissions.profiles import allow_browse_users_list, allow_follow_user, allow_see_ban_details
 from misago.users.permissions.profiles import allow_browse_users_list, allow_follow_user, allow_see_ban_details
-
 from misago.users.rest_permissions import BasePermission, IsAuthenticatedOrReadOnly, UnbannedAnonOnly
 from misago.users.rest_permissions import BasePermission, IsAuthenticatedOrReadOnly, UnbannedAnonOnly
-from misago.users.serializers import UserSerializer, UserProfileSerializer, BanDetailsSerializer
-
-from misago.users.api.userendpoints.list import list_endpoint
-from misago.users.api.userendpoints.avatar import avatar_endpoint, moderate_avatar_endpoint
-from misago.users.api.userendpoints.create import create_endpoint
-from misago.users.api.userendpoints.signature import signature_endpoint
-from misago.users.api.userendpoints.username import username_endpoint, moderate_username_endpoint
-from misago.users.api.userendpoints.changeemail import change_email_endpoint
-from misago.users.api.userendpoints.changepassword import change_password_endpoint
+from misago.users.serializers import BanDetailsSerializer, UserProfileSerializer, UserSerializer
 
 
 
 
 class UserViewSetPermission(BasePermission):
 class UserViewSetPermission(BasePermission):

+ 2 - 1
misago/users/apps.py

@@ -1,6 +1,7 @@
 from django.apps import AppConfig
 from django.apps import AppConfig
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
-from misago.users.pages import usercp, users_list, user_profile
+
+from misago.users.pages import user_profile, usercp, users_list
 
 
 
 
 class MisagoUsersConfig(AppConfig):
 class MisagoUsersConfig(AppConfig):

+ 2 - 3
misago/users/avatars/dynamic.py

@@ -1,11 +1,10 @@
-from importlib import import_module
 import math
 import math
 import os
 import os
+from importlib import import_module
 
 
-from PIL import Image, ImageDraw, ImageColor, ImageFont, ImageFilter
+from PIL import Image, ImageColor, ImageDraw, ImageFilter, ImageFont
 
 
 from misago.conf import settings
 from misago.conf import settings
-
 from misago.users.avatars import store
 from misago.users.avatars import store
 
 
 
 

+ 1 - 2
misago/users/avatars/gravatar.py

@@ -1,10 +1,9 @@
 from StringIO import StringIO
 from StringIO import StringIO
 
 
-from PIL import Image
 import requests
 import requests
+from PIL import Image
 
 
 from misago.conf import settings
 from misago.conf import settings
-
 from misago.users.avatars import store
 from misago.users.avatars import store
 
 
 
 

+ 1 - 2
misago/users/avatars/store.py

@@ -1,11 +1,10 @@
-from hashlib import md5
 import os
 import os
+from hashlib import md5
 
 
 from path import Path
 from path import Path
 from PIL import Image
 from PIL import Image
 
 
 from misago.conf import settings
 from misago.conf import settings
-
 from misago.users.avatars.paths import AVATARS_STORE
 from misago.users.avatars.paths import AVATARS_STORE
 
 
 
 

+ 0 - 1
misago/users/avatars/uploaded.py

@@ -8,7 +8,6 @@ from django.core.exceptions import ValidationError
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from misago.conf import settings
 from misago.conf import settings
-
 from misago.users.avatars import store
 from misago.users.avatars import store
 
 
 
 

+ 2 - 3
misago/users/context_processors.py

@@ -1,8 +1,7 @@
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 
 
-from misago.users.pages import usercp, users_list, user_profile
-from misago.users.serializers import (
-    AuthenticatedUserSerializer, AnonymousUserSerializer)
+from misago.users.pages import user_profile, usercp, users_list
+from misago.users.serializers import AnonymousUserSerializer, AuthenticatedUserSerializer
 
 
 
 
 def user_links(request):
 def user_links(request):

+ 2 - 0
misago/users/credentialchange.py

@@ -4,7 +4,9 @@ Changed credentials service
 Stores new e-mail and password in cache
 Stores new e-mail and password in cache
 """
 """
 from hashlib import sha256
 from hashlib import sha256
+
 from django.conf import settings
 from django.conf import settings
+
 from misago.core import serializer
 from misago.core import serializer
 
 
 
 

+ 1 - 2
misago/users/decorators.py

@@ -3,9 +3,8 @@ from django.shortcuts import redirect
 from django.utils.translation import gettext as _
 from django.utils.translation import gettext as _
 
 
 from misago.core.exceptions import Banned
 from misago.core.exceptions import Banned
-
 from misago.users.bans import get_request_ip_ban
 from misago.users.bans import get_request_ip_ban
-from misago.users.models import Ban, BAN_IP
+from misago.users.models import BAN_IP, Ban
 
 
 
 
 def deny_authenticated(f):
 def deny_authenticated(f):

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

@@ -1,16 +1,21 @@
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
-from django.utils.translation import ugettext_lazy as _, ungettext
+from django.utils.translation import ugettext_lazy as _
+from django.utils.translation import ungettext
 
 
+from misago.acl.models import Role
 from misago.conf import settings
 from misago.conf import settings
 from misago.core import forms, threadstore
 from misago.core import forms, threadstore
 from misago.core.validators import validate_sluggable
 from misago.core.validators import validate_sluggable
-from misago.acl.models import Role
-
 from misago.users.models import (
 from misago.users.models import (
-    AUTO_SUBSCRIBE_CHOICES, PRIVATE_THREAD_INVITES_LIMITS_CHOICES,
-    BANS_CHOICES, RESTRICTIONS_CHOICES, Ban, Rank, WarningLevel)
-from misago.users.validators import (
-    validate_username, validate_email, validate_password)
+    AUTO_SUBSCRIBE_CHOICES,
+    BANS_CHOICES,
+    PRIVATE_THREAD_INVITES_LIMITS_CHOICES,
+    RESTRICTIONS_CHOICES,
+    Ban,
+    Rank,
+    WarningLevel
+)
+from misago.users.validators import validate_email, validate_password, validate_username
 
 
 
 
 """
 """

+ 3 - 5
misago/users/forms/auth.py

@@ -1,12 +1,10 @@
-from django.core.exceptions import ValidationError
 from django.contrib.auth import authenticate, get_user_model
 from django.contrib.auth import authenticate, get_user_model
-from django.contrib.auth.forms import (AuthenticationForm as
-                                       BaseAuthenticationForm)
-from django.utils.translation import ugettext_lazy as _
+from django.contrib.auth.forms import AuthenticationForm as BaseAuthenticationForm
+from django.core.exceptions import ValidationError
 from django.core.validators import validate_email
 from django.core.validators import validate_email
+from django.utils.translation import ugettext_lazy as _
 
 
 from misago.core import forms
 from misago.core import forms
-
 from misago.users.bans import get_user_ban
 from misago.users.bans import get_user_ban
 from misago.users.validators import validate_password
 from misago.users.validators import validate_password
 
 

+ 2 - 2
misago/users/forms/moderation.py

@@ -1,12 +1,12 @@
 from datetime import timedelta
 from datetime import timedelta
 
 
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
-from django.utils.translation import ugettext_lazy as _, ungettext
 from django.utils import timezone
 from django.utils import timezone
+from django.utils.translation import ugettext_lazy as _
+from django.utils.translation import ungettext
 
 
 from misago.conf import settings
 from misago.conf import settings
 from misago.core import forms
 from misago.core import forms
-
 from misago.users.bans import ban_user
 from misago.users.bans import ban_user
 
 
 
 

+ 3 - 4
misago/users/forms/options.py

@@ -1,11 +1,10 @@
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
-from django.utils.translation import ugettext_lazy as _, ungettext
+from django.utils.translation import ugettext_lazy as _
+from django.utils.translation import ungettext
 
 
 from misago.conf import settings
 from misago.conf import settings
 from misago.core import forms
 from misago.core import forms
-
-from misago.users.models import (AUTO_SUBSCRIBE_CHOICES,
-                                 PRIVATE_THREAD_INVITES_LIMITS_CHOICES)
+from misago.users.models import AUTO_SUBSCRIBE_CHOICES, PRIVATE_THREAD_INVITES_LIMITS_CHOICES
 from misago.users.validators import validate_email, validate_password
 from misago.users.validators import validate_email, validate_password
 
 
 
 

+ 1 - 0
misago/users/forms/rename.py

@@ -1,4 +1,5 @@
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
+
 from misago.core import forms
 from misago.core import forms
 from misago.users.validators import validate_username
 from misago.users.validators import validate_username
 
 

+ 0 - 1
misago/users/management/commands/bansmaintenance.py

@@ -2,7 +2,6 @@ from django.core.management.base import BaseCommand
 from django.utils import timezone
 from django.utils import timezone
 
 
 from misago.core import cachebuster
 from misago.core import cachebuster
-
 from misago.users.models import Ban, BanCache
 from misago.users.models import Ban, BanCache
 
 
 
 

+ 2 - 1
misago/users/management/commands/buildactivepostersranking.py

@@ -1,4 +1,5 @@
 from django.core.management.base import BaseCommand
 from django.core.management.base import BaseCommand
+
 from misago.core.management.progressbar import show_progress
 from misago.core.management.progressbar import show_progress
 from misago.users.activepostersranking import build_active_posters_ranking
 from misago.users.activepostersranking import build_active_posters_ranking
 
 
@@ -9,4 +10,4 @@ class Command(BaseCommand):
     def handle(self, *args, **options):
     def handle(self, *args, **options):
         self.stdout.write('\n\nBuilding active posters ranking...')
         self.stdout.write('\n\nBuilding active posters ranking...')
         build_active_posters_ranking()
         build_active_posters_ranking()
-        self.stdout.write('Done!')
+        self.stdout.write('Done!')

+ 2 - 3
misago/users/management/commands/createsuperuser.py

@@ -2,9 +2,9 @@
 Misago-native rehash of Django's createsuperuser command that
 Misago-native rehash of Django's createsuperuser command that
 works with double authentication fields on user model
 works with double authentication fields on user model
 """
 """
+import sys
 from getpass import getpass
 from getpass import getpass
 from optparse import make_option
 from optparse import make_option
-import sys
 
 
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
 from django.core.exceptions import ValidationError
 from django.core.exceptions import ValidationError
@@ -13,8 +13,7 @@ from django.db import DEFAULT_DB_ALIAS, IntegrityError
 from django.utils.encoding import force_str
 from django.utils.encoding import force_str
 from django.utils.six.moves import input
 from django.utils.six.moves import input
 
 
-from misago.users.validators import (validate_email, validate_username,
-                                     validate_password)
+from misago.users.validators import validate_email, validate_password, validate_username
 
 
 
 
 class NotRunningInTTYException(Exception):
 class NotRunningInTTYException(Exception):

+ 2 - 1
misago/users/management/commands/populateonlinetracker.py

@@ -1,5 +1,6 @@
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
 from django.core.management.base import BaseCommand
 from django.core.management.base import BaseCommand
+
 from misago.users.models import Online
 from misago.users.models import Online
 
 
 
 
@@ -19,4 +20,4 @@ class Command(BaseCommand):
             )
             )
             entries_created += 1
             entries_created += 1
 
 
-        self.stdout.write('Tracker entries created: %s' % entries_created)
+        self.stdout.write('Tracker entries created: %s' % entries_created)

+ 1 - 1
misago/users/management/commands/synchronizeusers.py

@@ -37,4 +37,4 @@ class Command(BaseCommand):
             synchronized_count += 1
             synchronized_count += 1
             show_progress(self, synchronized_count, users_to_sync, start_time)
             show_progress(self, synchronized_count, users_to_sync, start_time)
 
 
-        self.stdout.write(message % synchronized_count)
+        self.stdout.write(message % synchronized_count)

+ 0 - 1
misago/users/middleware.py

@@ -5,7 +5,6 @@ from django.contrib.auth.models import AnonymousUser as DjAnonymousUser
 from django.core.urlresolvers import resolve
 from django.core.urlresolvers import resolve
 
 
 from misago.conf import settings
 from misago.conf import settings
-
 from misago.users.bans import get_request_ip_ban, get_user_ban
 from misago.users.bans import get_request_ip_ban, get_user_ban
 from misago.users.models import AnonymousUser, Online
 from misago.users.models import AnonymousUser, Online
 from misago.users.online import tracker
 from misago.users.online import tracker

+ 2 - 2
misago/users/migrations/0001_initial.py

@@ -1,10 +1,10 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
-from django.db import models, migrations
-import django.utils.timezone
 import django.db.models.deletion
 import django.db.models.deletion
+import django.utils.timezone
 from django.conf import settings
 from django.conf import settings
+from django.db import migrations, models
 
 
 from misago.core.pgutils import CreatePartialIndex
 from misago.core.pgutils import CreatePartialIndex
 
 

+ 1 - 1
misago/users/migrations/0002_users_settings.py

@@ -2,7 +2,7 @@
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
 from django.conf import settings
 from django.conf import settings
-from django.db import models, migrations
+from django.db import migrations, models
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from misago.conf.migrationutils import migrate_settings_group
 from misago.conf.migrationutils import migrate_settings_group

+ 2 - 1
misago/users/migrations/0003_bans_version_tracker.py

@@ -1,7 +1,8 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
-from django.db import models, migrations
+from django.db import migrations, models
+
 from misago.core.migrationutils import cachebuster_register_cache
 from misago.core.migrationutils import cachebuster_register_cache
 
 
 
 

+ 1 - 1
misago/users/migrations/0004_default_ranks.py

@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 from __future__ import unicode_literals
 
 
-from django.db import models, migrations
+from django.db import migrations, models
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from misago.core.utils import slugify
 from misago.core.utils import slugify

+ 5 - 7
misago/users/models/user.py

@@ -1,8 +1,8 @@
 from hashlib import md5
 from hashlib import md5
 
 
-from django.contrib.auth.models import (
-    AbstractBaseUser, PermissionsMixin, UserManager as BaseUserManager,
-    AnonymousUser as DjangoAnonymousUser)
+from django.contrib.auth.models import AnonymousUser as DjangoAnonymousUser
+from django.contrib.auth.models import UserManager as BaseUserManager
+from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
 from django.core.mail import send_mail
 from django.core.mail import send_mail
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 from django.db import IntegrityError, models, transaction
 from django.db import IntegrityError, models, transaction
@@ -14,11 +14,9 @@ from misago.acl import get_user_acl
 from misago.acl.models import Role
 from misago.acl.models import Role
 from misago.conf import settings
 from misago.conf import settings
 from misago.core.utils import slugify
 from misago.core.utils import slugify
-
-from misago.users.models.rank import Rank
 from misago.users import avatars
 from misago.users import avatars
-from misago.users.signatures import (is_user_signature_valid,
-                                     make_signature_checksum)
+from misago.users.models.rank import Rank
+from misago.users.signatures import is_user_signature_valid, make_signature_checksum
 from misago.users.utils import hash_email
 from misago.users.utils import hash_email
 
 
 
 

+ 1 - 0
misago/users/namechanges.py

@@ -4,6 +4,7 @@ Service for tracking namechanges
 from datetime import timedelta
 from datetime import timedelta
 
 
 from django.utils import timezone
 from django.utils import timezone
+
 from misago.users.models import UsernameChange
 from misago.users.models import UsernameChange
 
 
 
 

+ 1 - 0
misago/users/online/tracker.py

@@ -1,4 +1,5 @@
 from django.utils import timezone
 from django.utils import timezone
+
 from misago.users.models import Online
 from misago.users.models import Online
 
 
 
 

+ 1 - 1
misago/users/online/utils.py

@@ -3,7 +3,7 @@ from datetime import timedelta
 from django.utils import timezone
 from django.utils import timezone
 
 
 from misago.users.bans import get_user_ban
 from misago.users.bans import get_user_ban
-from misago.users.models import Online, BanCache
+from misago.users.models import BanCache, Online
 
 
 
 
 ACTIVITY_CUTOFF = timedelta(minutes=2)
 ACTIVITY_CUTOFF = timedelta(minutes=2)

+ 2 - 1
misago/users/permissions/delete.py

@@ -3,7 +3,8 @@ from datetime import timedelta
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
 from django.core.exceptions import PermissionDenied
 from django.core.exceptions import PermissionDenied
 from django.utils import timezone
 from django.utils import timezone
-from django.utils.translation import ugettext_lazy as _, ungettext
+from django.utils.translation import ugettext_lazy as _
+from django.utils.translation import ungettext
 
 
 from misago.acl import algebra
 from misago.acl import algebra
 from misago.acl.decorators import return_boolean
 from misago.acl.decorators import return_boolean

+ 0 - 1
misago/users/permissions/moderation.py

@@ -10,7 +10,6 @@ from misago.acl import algebra
 from misago.acl.decorators import return_boolean
 from misago.acl.decorators import return_boolean
 from misago.acl.models import Role
 from misago.acl.models import Role
 from misago.core import forms
 from misago.core import forms
-
 from misago.users.bans import get_user_ban
 from misago.users.bans import get_user_ban
 
 
 
 

+ 1 - 2
misago/users/permissions/profiles.py

@@ -6,7 +6,6 @@ from misago.acl import algebra
 from misago.acl.decorators import return_boolean
 from misago.acl.decorators import return_boolean
 from misago.acl.models import Role
 from misago.acl.models import Role
 from misago.core import forms
 from misago.core import forms
-
 from misago.users.permissions.decorators import authenticated_only
 from misago.users.permissions.decorators import authenticated_only
 
 
 
 
@@ -156,4 +155,4 @@ can_block_user = return_boolean(allow_block_user)
 def allow_see_ban_details(user, target):
 def allow_see_ban_details(user, target):
     if not user.acl['can_see_ban_details']:
     if not user.acl['can_see_ban_details']:
         raise PermissionDenied(_("You can't see users bans details."))
         raise PermissionDenied(_("You can't see users bans details."))
-can_see_ban_details = return_boolean(allow_see_ban_details)
+can_see_ban_details = return_boolean(allow_see_ban_details)

+ 0 - 1
misago/users/permissions/warnings.py

@@ -6,7 +6,6 @@ from misago.acl import algebra
 from misago.acl.decorators import return_boolean
 from misago.acl.decorators import return_boolean
 from misago.acl.models import Role
 from misago.acl.models import Role
 from misago.core import forms
 from misago.core import forms
-
 from misago.users.models import UserWarning
 from misago.users.models import UserWarning
 from misago.users.permissions.decorators import authenticated_only
 from misago.users.permissions.decorators import authenticated_only
 
 

+ 3 - 4
misago/users/rest_permissions.py

@@ -1,12 +1,11 @@
-from rest_framework.permissions import BasePermission, AllowAny, SAFE_METHODS
-
 from django.core.exceptions import PermissionDenied
 from django.core.exceptions import PermissionDenied
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
-from misago.core.exceptions import Banned
+from rest_framework.permissions import SAFE_METHODS, AllowAny, BasePermission
 
 
+from misago.core.exceptions import Banned
 from misago.users.bans import get_request_ip_ban
 from misago.users.bans import get_request_ip_ban
-from misago.users.models import Ban, BAN_IP
+from misago.users.models import BAN_IP, Ban
 
 
 
 
 __all__ = [
 __all__ = [

+ 3 - 3
misago/users/serializers/ban.py

@@ -1,9 +1,9 @@
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
+
 from rest_framework import serializers
 from rest_framework import serializers
 
 
 from misago.core.utils import format_plaintext_for_html
 from misago.core.utils import format_plaintext_for_html
-
-from misago.users.models import Ban, BAN_IP
+from misago.users.models import BAN_IP, Ban
 
 
 
 
 __all__ = [
 __all__ = [
@@ -52,4 +52,4 @@ class BanDetailsSerializer(serializers.ModelSerializer):
         return serialize_message(obj.user_message)
         return serialize_message(obj.user_message)
 
 
     def get_staff_message(self, obj):
     def get_staff_message(self, obj):
-        return serialize_message(obj.staff_message)
+        return serialize_message(obj.staff_message)

+ 1 - 0
misago/users/serializers/rank.py

@@ -1,4 +1,5 @@
 from rest_framework import serializers
 from rest_framework import serializers
+
 from misago.core.utils import format_plaintext_for_html
 from misago.core.utils import format_plaintext_for_html
 from misago.users.models import Rank
 from misago.users.models import Rank
 
 

+ 2 - 2
misago/users/serializers/user.py

@@ -1,9 +1,9 @@
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
+
 from rest_framework import serializers
 from rest_framework import serializers
 
 
 from misago.acl import serialize_acl
 from misago.acl import serialize_acl
-
 from misago.users.serializers import RankSerializer
 from misago.users.serializers import RankSerializer
 
 
 
 
@@ -244,4 +244,4 @@ class UserProfileSerializer(UserSerializer):
             'moderate_username': reverse(
             'moderate_username': reverse(
                 'misago:api:user-moderate-username',kwargs={'pk': obj.pk}),
                 'misago:api:user-moderate-username',kwargs={'pk': obj.pk}),
             'delete': reverse('misago:api:user-delete', kwargs={'pk': obj.pk}),
             'delete': reverse('misago:api:user-delete', kwargs={'pk': obj.pk}),
-        }
+        }

+ 4 - 3
misago/users/signals.py

@@ -1,5 +1,7 @@
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
-from django.dispatch import receiver, Signal
+from django.dispatch import Signal, receiver
+
+from misago.core.signals import secret_key_changed
 
 
 
 
 delete_user_content = Signal()
 delete_user_content = Signal()
@@ -18,7 +20,6 @@ def handle_name_change(sender, **kwargs):
                                     canceler_slug=sender.slug)
                                     canceler_slug=sender.slug)
 
 
 
 
-from misago.core.signals import secret_key_changed
 @receiver(secret_key_changed)
 @receiver(secret_key_changed)
 def update_signatures_checksums(sender, **kwargs):
 def update_signatures_checksums(sender, **kwargs):
     User = get_user_model()
     User = get_user_model()
@@ -27,4 +28,4 @@ def update_signatures_checksums(sender, **kwargs):
         if user.signature:
         if user.signature:
             new_checksum = make_signature_checksum(user.signature_parsed, user)
             new_checksum = make_signature_checksum(user.signature_parsed, user)
             user.signature_checksum = new_checksum
             user.signature_checksum = new_checksum
-            user.save(update_fields=['signature_checksum'])
+            user.save(update_fields=['signature_checksum'])

+ 1 - 1
misago/users/tests/test_activation_views.py

@@ -2,7 +2,7 @@ from django.contrib.auth import get_user_model
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 from django.test import TestCase
 from django.test import TestCase
 
 
-from misago.users.models import Ban, BAN_USERNAME
+from misago.users.models import BAN_USERNAME, Ban
 from misago.users.tokens import make_activation_token
 from misago.users.tokens import make_activation_token
 
 
 
 

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

@@ -4,10 +4,8 @@ from misago.categories.models import Category
 from misago.core import threadstore
 from misago.core import threadstore
 from misago.core.cache import cache
 from misago.core.cache import cache
 from misago.threads.testutils import post_thread
 from misago.threads.testutils import post_thread
-
+from misago.users.activepostersranking import build_active_posters_ranking, get_active_posters_ranking
 from misago.users.testutils import AuthenticatedUserTestCase
 from misago.users.testutils import AuthenticatedUserTestCase
-from misago.users.activepostersranking import (
-    get_active_posters_ranking, build_active_posters_ranking)
 
 
 
 
 class TestActivePostersRanking(AuthenticatedUserTestCase):
 class TestActivePostersRanking(AuthenticatedUserTestCase):
@@ -63,4 +61,4 @@ class TestActivePostersRanking(AuthenticatedUserTestCase):
         self.assertEqual(ranking['users_count'], 2)
         self.assertEqual(ranking['users_count'], 2)
 
 
         self.assertEqual(ranking['users'][0].score, 2)
         self.assertEqual(ranking['users'][0].score, 2)
-        self.assertEqual(ranking['users'][1].score, 1)
+        self.assertEqual(ranking['users'][1].score, 1)

+ 2 - 3
misago/users/tests/test_auth_api.py

@@ -4,9 +4,8 @@ from django.contrib.auth import get_user_model
 from django.core import mail
 from django.core import mail
 from django.test import TestCase
 from django.test import TestCase
 
 
-from misago.users.models import Ban, BAN_USERNAME
-from misago.users.tokens import (make_activation_token,
-                                 make_password_change_token)
+from misago.users.models import BAN_USERNAME, Ban
+from misago.users.tokens import make_activation_token, make_password_change_token
 
 
 
 
 class GatewayTests(TestCase):
 class GatewayTests(TestCase):

+ 1 - 2
misago/users/tests/test_avatars.py

@@ -6,8 +6,7 @@ from django.core.exceptions import ValidationError
 from django.test import TestCase
 from django.test import TestCase
 
 
 from misago.conf import settings
 from misago.conf import settings
-
-from misago.users.avatars import store, dynamic, gallery, gravatar, uploaded
+from misago.users.avatars import dynamic, gallery, gravatar, store, uploaded
 
 
 
 
 class AvatarsStoreTests(TestCase):
 class AvatarsStoreTests(TestCase):

+ 2 - 1
misago/users/tests/test_ban_model.py

@@ -1,6 +1,7 @@
 #-*- coding: utf-8 -*-
 #-*- coding: utf-8 -*-
 from django.test import TestCase
 from django.test import TestCase
-from misago.users.models import Ban, BAN_USERNAME, BAN_EMAIL, BAN_IP
+
+from misago.users.models import BAN_EMAIL, BAN_IP, BAN_USERNAME, Ban
 
 
 
 
 class BansManagerTests(TestCase):
 class BansManagerTests(TestCase):

+ 0 - 1
misago/users/tests/test_banadmin_views.py

@@ -3,7 +3,6 @@ from datetime import date, datetime, timedelta
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 
 
 from misago.admin.testutils import AdminTestCase
 from misago.admin.testutils import AdminTestCase
-
 from misago.users.models import Ban
 from misago.users.models import Ban
 
 
 
 

+ 10 - 4
misago/users/tests/test_bans.py

@@ -4,10 +4,16 @@ from django.contrib.auth import get_user_model
 from django.test import TestCase
 from django.test import TestCase
 from django.utils import timezone
 from django.utils import timezone
 
 
-from misago.users.bans import (get_username_ban, get_email_ban, get_ip_ban,
-                               get_user_ban, get_request_ip_ban,
-                               ban_user, ban_ip)
-from misago.users.models import Ban, BAN_USERNAME, BAN_EMAIL, BAN_IP
+from misago.users.bans import (
+    ban_ip,
+    ban_user,
+    get_email_ban,
+    get_ip_ban,
+    get_request_ip_ban,
+    get_user_ban,
+    get_username_ban
+)
+from misago.users.models import BAN_EMAIL, BAN_IP, BAN_USERNAME, Ban
 
 
 
 
 class GetBanTests(TestCase):
 class GetBanTests(TestCase):

+ 1 - 0
misago/users/tests/test_captcha_api.py

@@ -5,6 +5,7 @@ from django.test import TestCase
 
 
 from misago.conf import settings
 from misago.conf import settings
 
 
+
 class AuthenticateAPITests(TestCase):
 class AuthenticateAPITests(TestCase):
     def setUp(self):
     def setUp(self):
         self.api_link = reverse('misago:api:captcha-question')
         self.api_link = reverse('misago:api:captcha-question')

+ 1 - 1
misago/users/tests/test_decorators.py

@@ -1,6 +1,6 @@
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 
 
-from misago.users.models import Ban, BAN_IP
+from misago.users.models import BAN_IP, Ban
 from misago.users.testutils import UserTestCase
 from misago.users.testutils import UserTestCase
 
 
 
 

+ 2 - 1
misago/users/tests/test_djangoadmin_auth.py

@@ -1,4 +1,5 @@
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
+
 from misago.admin.testutils import AdminTestCase
 from misago.admin.testutils import AdminTestCase
 
 
 
 
@@ -39,4 +40,4 @@ class DjangoAdminAuthTests(AdminTestCase):
         # user was signed out
         # user was signed out
         response = self.client.get(reverse('admin:index'))
         response = self.client.get(reverse('admin:index'))
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.status_code, 200)
-        self.assertNotIn(self.user.username, response.content)
+        self.assertNotIn(self.user.username, response.content)

+ 1 - 1
misago/users/tests/test_djangoadmin_user.py

@@ -1,5 +1,5 @@
-from django.contrib.auth.models import Permission
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
+from django.contrib.auth.models import Permission
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 from django.utils import formats
 from django.utils import formats
 
 

+ 1 - 1
misago/users/tests/test_forgottenpassword_views.py

@@ -1,7 +1,7 @@
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 
 
-from misago.users.models import Ban, BAN_USERNAME
+from misago.users.models import BAN_USERNAME, Ban
 from misago.users.testutils import UserTestCase
 from misago.users.testutils import UserTestCase
 from misago.users.tokens import make_password_change_token
 from misago.users.tokens import make_password_change_token
 
 

+ 0 - 1
misago/users/tests/test_lists_views.py

@@ -2,7 +2,6 @@ from django.contrib.auth import get_user_model
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 
 
 from misago.acl.testutils import override_acl
 from misago.acl.testutils import override_acl
-
 from misago.users.models import Rank
 from misago.users.models import Rank
 from misago.users.testutils import AuthenticatedUserTestCase
 from misago.users.testutils import AuthenticatedUserTestCase
 
 

+ 1 - 0
misago/users/tests/test_options_views.py

@@ -1,5 +1,6 @@
 from django.core import mail
 from django.core import mail
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
+
 from misago.users.testutils import AuthenticatedUserTestCase
 from misago.users.testutils import AuthenticatedUserTestCase
 
 
 
 

+ 1 - 1
misago/users/tests/test_populateonlinetracker.py

@@ -21,4 +21,4 @@ class PopulateOnlineTrackerTests(TestCase):
         command_output = out.getvalue().splitlines()[0].strip()
         command_output = out.getvalue().splitlines()[0].strip()
 
 
         self.assertEqual(command_output, 'Tracker entries created: 1')
         self.assertEqual(command_output, 'Tracker entries created: 1')
-        self.assertEqual(Online.objects.filter(user=test_user).count(), 1)
+        self.assertEqual(Online.objects.filter(user=test_user).count(), 1)

+ 0 - 1
misago/users/tests/test_profile_views.py

@@ -2,7 +2,6 @@ from django.contrib.auth import get_user_model
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 
 
 from misago.acl.testutils import override_acl
 from misago.acl.testutils import override_acl
-
 from misago.users.models import Ban
 from misago.users.models import Ban
 from misago.users.testutils import AuthenticatedUserTestCase
 from misago.users.testutils import AuthenticatedUserTestCase
 
 

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

@@ -1,7 +1,7 @@
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 
 
-from misago.admin.testutils import AdminTestCase
 from misago.acl.models import Role
 from misago.acl.models import Role
+from misago.admin.testutils import AdminTestCase
 from misago.users.models import Rank
 from misago.users.models import Rank
 
 
 
 
@@ -255,4 +255,4 @@ class RankAdminViewsTests(AdminTestCase):
                 'roles': [test_role_a.pk],
                 'roles': [test_role_a.pk],
             })
             })
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.status_code, 200)
-        self.assertIn("This name collides with other rank.", response.content)
+        self.assertIn("This name collides with other rank.", response.content)

+ 1 - 0
misago/users/tests/test_realip_middleware.py

@@ -1,4 +1,5 @@
 from django.test import TestCase
 from django.test import TestCase
+
 from misago.users.middleware import RealIPMiddleware
 from misago.users.middleware import RealIPMiddleware
 
 
 
 

+ 1 - 1
misago/users/tests/test_rest_permissions.py

@@ -1,6 +1,6 @@
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 
 
-from misago.users.models import Ban, BAN_IP
+from misago.users.models import BAN_IP, Ban
 from misago.users.testutils import UserTestCase
 from misago.users.testutils import UserTestCase
 
 
 
 

+ 3 - 2
misago/users/tests/test_testutils.py

@@ -1,7 +1,8 @@
 import json
 import json
+
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
-from misago.users.testutils import (
-    UserTestCase, AuthenticatedUserTestCase, SuperUserTestCase)
+
+from misago.users.testutils import AuthenticatedUserTestCase, SuperUserTestCase, UserTestCase
 
 
 
 
 class UserTestCaseTests(UserTestCase):
 class UserTestCaseTests(UserTestCase):

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

@@ -1,4 +1,5 @@
 import json
 import json
+
 from path import Path
 from path import Path
 
 
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
@@ -6,7 +7,6 @@ from django.core.urlresolvers import reverse
 
 
 from misago.acl.testutils import override_acl
 from misago.acl.testutils import override_acl
 from misago.conf import settings
 from misago.conf import settings
-
 from misago.users.avatars import store
 from misago.users.avatars import store
 from misago.users.testutils import AuthenticatedUserTestCase
 from misago.users.testutils import AuthenticatedUserTestCase
 
 
@@ -328,4 +328,4 @@ class UserAvatarModerationTests(AuthenticatedUserTestCase):
 
 
         response = self.client.get(
         response = self.client.get(
             '/api/users/%s/moderate-avatar/' % self.user.pk)
             '/api/users/%s/moderate-avatar/' % self.user.pk)
-        self.assertEqual(response.status_code, 200)
+        self.assertEqual(response.status_code, 200)

+ 1 - 0
misago/users/tests/test_user_changeemail_api.py

@@ -1,5 +1,6 @@
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
 from django.core import mail
 from django.core import mail
+
 from misago.users.testutils import AuthenticatedUserTestCase
 from misago.users.testutils import AuthenticatedUserTestCase
 
 
 
 

+ 1 - 0
misago/users/tests/test_user_changepassword_api.py

@@ -1,5 +1,6 @@
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
 from django.core import mail
 from django.core import mail
+
 from misago.users.testutils import AuthenticatedUserTestCase
 from misago.users.testutils import AuthenticatedUserTestCase
 
 
 
 

+ 0 - 1
misago/users/tests/test_user_create_api.py

@@ -3,7 +3,6 @@ from django.core import mail
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 
 
 from misago.conf import settings
 from misago.conf import settings
-
 from misago.users.models import Online
 from misago.users.models import Online
 from misago.users.testutils import UserTestCase
 from misago.users.testutils import UserTestCase
 
 

+ 0 - 1
misago/users/tests/test_user_signature_api.py

@@ -4,7 +4,6 @@ from django.contrib.auth import get_user_model
 
 
 from misago.acl.testutils import override_acl
 from misago.acl.testutils import override_acl
 from misago.conf import settings
 from misago.conf import settings
-
 from misago.users.testutils import AuthenticatedUserTestCase
 from misago.users.testutils import AuthenticatedUserTestCase
 
 
 
 

+ 1 - 2
misago/users/tests/test_user_username_api.py

@@ -4,7 +4,6 @@ from django.contrib.auth import get_user_model
 
 
 from misago.acl.testutils import override_acl
 from misago.acl.testutils import override_acl
 from misago.conf import settings
 from misago.conf import settings
-
 from misago.users.testutils import AuthenticatedUserTestCase
 from misago.users.testutils import AuthenticatedUserTestCase
 
 
 
 
@@ -214,4 +213,4 @@ class UserUsernameModerationTests(AuthenticatedUserTestCase):
 
 
         response = self.client.get(
         response = self.client.get(
             '/api/users/%s/moderate-username/' % self.user.pk)
             '/api/users/%s/moderate-username/' % self.user.pk)
-        self.assertEqual(response.status_code, 200)
+        self.assertEqual(response.status_code, 200)

+ 0 - 1
misago/users/tests/test_useradmin_views.py

@@ -8,7 +8,6 @@ from misago.acl.models import Role
 from misago.admin.testutils import AdminTestCase
 from misago.admin.testutils import AdminTestCase
 from misago.categories.models import Category
 from misago.categories.models import Category
 from misago.threads.testutils import post_thread, reply_thread
 from misago.threads.testutils import post_thread, reply_thread
-
 from misago.users.models import Ban, Rank
 from misago.users.models import Ban, Rank
 
 
 
 

+ 0 - 1
misago/users/tests/test_usernamechanges_api.py

@@ -1,7 +1,6 @@
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
 
 
 from misago.acl.testutils import override_acl
 from misago.acl.testutils import override_acl
-
 from misago.users.testutils import AuthenticatedUserTestCase
 from misago.users.testutils import AuthenticatedUserTestCase
 
 
 
 

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

@@ -1,5 +1,5 @@
-from datetime import timedelta
 import json
 import json
+from datetime import timedelta
 
 
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
 
 
@@ -8,11 +8,10 @@ from misago.categories.models import Category
 from misago.conf import settings
 from misago.conf import settings
 from misago.core import threadstore
 from misago.core import threadstore
 from misago.core.cache import cache
 from misago.core.cache import cache
-from misago.threads.models import Thread, Post
+from misago.threads.models import Post, Thread
 from misago.threads.testutils import post_thread
 from misago.threads.testutils import post_thread
-
 from misago.users.activepostersranking import build_active_posters_ranking
 from misago.users.activepostersranking import build_active_posters_ranking
-from misago.users.models import Ban, BAN_USERNAME, Rank
+from misago.users.models import BAN_USERNAME, Ban, Rank
 from misago.users.testutils import AuthenticatedUserTestCase
 from misago.users.testutils import AuthenticatedUserTestCase
 
 
 
 

+ 1 - 0
misago/users/tests/test_utils.py

@@ -1,4 +1,5 @@
 from django.test import TestCase
 from django.test import TestCase
+
 from misago.users.utils import hash_email
 from misago.users.utils import hash_email
 
 
 
 

+ 13 - 12
misago/users/tests/test_validators.py

@@ -4,18 +4,19 @@ from django.core.exceptions import PermissionDenied, ValidationError
 from django.test import TestCase
 from django.test import TestCase
 
 
 from misago.conf import settings
 from misago.conf import settings
-
-from misago.users.models import Ban, BAN_USERNAME, BAN_EMAIL
-from misago.users.validators import (validate_email,
-                                     validate_email_available,
-                                     validate_email_banned,
-                                     validate_password,
-                                     validate_username,
-                                     validate_username_available,
-                                     validate_username_banned,
-                                     validate_username_content,
-                                     validate_username_length,
-                                     validate_gmail_email)
+from misago.users.models import BAN_EMAIL, BAN_USERNAME, Ban
+from misago.users.validators import (
+    validate_email,
+    validate_email_available,
+    validate_email_banned,
+    validate_gmail_email,
+    validate_password,
+    validate_username,
+    validate_username_available,
+    validate_username_banned,
+    validate_username_content,
+    validate_username_length
+)
 
 
 
 
 class ValidateEmailAvailableTests(TestCase):
 class ValidateEmailAvailableTests(TestCase):

+ 0 - 1
misago/users/tests/test_warningadmin_views.py

@@ -1,7 +1,6 @@
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 
 
 from misago.admin.testutils import AdminTestCase
 from misago.admin.testutils import AdminTestCase
-
 from misago.users.models import WarningLevel
 from misago.users.models import WarningLevel
 
 
 
 

+ 1 - 2
misago/users/tests/test_warnings.py

@@ -6,9 +6,8 @@ from django.utils import timezone
 
 
 from misago.core import threadstore
 from misago.core import threadstore
 from misago.core.cache import cache
 from misago.core.cache import cache
-
 from misago.users import warnings
 from misago.users import warnings
-from misago.users.models import WarningLevel, UserWarning
+from misago.users.models import UserWarning, WarningLevel
 
 
 
 
 class WarningsTests(TestCase):
 class WarningsTests(TestCase):

+ 0 - 1
misago/users/testutils.py

@@ -2,7 +2,6 @@ from django.contrib.auth import get_user_model
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 
 
 from misago.core.testutils import MisagoTestCase
 from misago.core.testutils import MisagoTestCase
-
 from misago.users.models import AnonymousUser
 from misago.users.models import AnonymousUser
 
 
 
 

+ 1 - 2
misago/users/urls/api.py

@@ -1,11 +1,10 @@
 from django.conf.urls import url
 from django.conf.urls import url
 
 
 from misago.core.apirouter import MisagoApiRouter
 from misago.core.apirouter import MisagoApiRouter
-
 from misago.users.api import auth, captcha
 from misago.users.api import auth, captcha
 from misago.users.api.ranks import RanksViewSet
 from misago.users.api.ranks import RanksViewSet
-from misago.users.api.users import UserViewSet
 from misago.users.api.usernamechanges import UsernameChangesViewSet
 from misago.users.api.usernamechanges import UsernameChangesViewSet
+from misago.users.api.users import UserViewSet
 
 
 
 
 urlpatterns = [
 urlpatterns = [

+ 4 - 4
misago/users/validators.py

@@ -1,16 +1,16 @@
-from importlib import import_module
 import json
 import json
 import re
 import re
+from importlib import import_module
 
 
 import requests
 import requests
 
 
+from django.contrib.auth import get_user_model
 from django.core.exceptions import PermissionDenied, ValidationError
 from django.core.exceptions import PermissionDenied, ValidationError
 from django.core.validators import validate_email as validate_email_content
 from django.core.validators import validate_email as validate_email_content
-from django.utils.translation import ungettext, ugettext_lazy as _
-from django.contrib.auth import get_user_model
+from django.utils.translation import ugettext_lazy as _
+from django.utils.translation import ungettext
 
 
 from misago.conf import settings
 from misago.conf import settings
-
 from misago.users.bans import get_email_ban, get_username_ban
 from misago.users.bans import get_email_ban, get_username_ban
 
 
 
 

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

@@ -4,9 +4,8 @@ from django.shortcuts import get_object_or_404, render
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from misago.conf import settings
 from misago.conf import settings
-from misago.core.mail import mail_user
 from misago.core.exceptions import Banned
 from misago.core.exceptions import Banned
-
+from misago.core.mail import mail_user
 from misago.users.bans import get_user_ban
 from misago.users.bans import get_user_ban
 from misago.users.decorators import deny_authenticated, deny_banned_ips
 from misago.users.decorators import deny_authenticated, deny_banned_ips
 from misago.users.models import ACTIVATION_REQUIRED_NONE
 from misago.users.models import ACTIVATION_REQUIRED_NONE

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

@@ -2,9 +2,8 @@ from django.contrib import messages
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 
 
 from misago.admin.views import generic
 from misago.admin.views import generic
-
+from misago.users.forms.admin import BanForm, SearchBansForm
 from misago.users.models import Ban
 from misago.users.models import Ban
-from misago.users.forms.admin import SearchBansForm, BanForm
 
 
 
 
 class BanAdmin(generic.AdminBaseMixin):
 class BanAdmin(generic.AdminBaseMixin):

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

@@ -4,9 +4,8 @@ from django.shortcuts import redirect
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 
 
 from misago.admin.views import generic
 from misago.admin.views import generic
-
-from misago.users.models import Rank
 from misago.users.forms.admin import RankForm
 from misago.users.forms.admin import RankForm
+from misago.users.models import Rank
 
 
 
 
 class RankAdmin(generic.AdminBaseMixin):
 class RankAdmin(generic.AdminBaseMixin):

+ 3 - 6
misago/users/views/admin/users.py

@@ -12,13 +12,10 @@ from misago.conf import settings
 from misago.core.mail import mail_users
 from misago.core.mail import mail_users
 from misago.core.pgutils import batch_update
 from misago.core.pgutils import batch_update
 from misago.threads.models import Thread
 from misago.threads.models import Thread
-
 from misago.users.avatars.dynamic import set_avatar as set_dynamic_avatar
 from misago.users.avatars.dynamic import set_avatar as set_dynamic_avatar
-from misago.users.forms.admin import (StaffFlagUserFormFactory, NewUserForm,
-                                      EditUserForm, SearchUsersForm,
-                                      BanUsersForm)
-from misago.users.models import ACTIVATION_REQUIRED_NONE, User, Ban
-from misago.users.models.ban import BAN_USERNAME, BAN_EMAIL, BAN_IP
+from misago.users.forms.admin import BanUsersForm, EditUserForm, NewUserForm, SearchUsersForm, StaffFlagUserFormFactory
+from misago.users.models import ACTIVATION_REQUIRED_NONE, Ban, User
+from misago.users.models.ban import BAN_EMAIL, BAN_IP, BAN_USERNAME
 from misago.users.signatures import set_user_signature
 from misago.users.signatures import set_user_signature
 
 
 
 

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

@@ -2,9 +2,8 @@ from django.contrib import messages
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ugettext_lazy as _
 
 
 from misago.admin.views import generic
 from misago.admin.views import generic
-
-from misago.users.models import WarningLevel
 from misago.users.forms.admin import WarningLevelForm
 from misago.users.forms.admin import WarningLevelForm
+from misago.users.models import WarningLevel
 
 
 
 
 class WarningsAdmin(generic.AdminBaseMixin):
 class WarningsAdmin(generic.AdminBaseMixin):

+ 0 - 1
misago/users/views/auth.py

@@ -3,7 +3,6 @@ from django.contrib import auth
 from django.shortcuts import redirect
 from django.shortcuts import redirect
 from django.utils.http import is_safe_url
 from django.utils.http import is_safe_url
 from django.utils.six.moves.urllib.parse import urlparse
 from django.utils.six.moves.urllib.parse import urlparse
-
 from django.views.decorators.cache import never_cache
 from django.views.decorators.cache import never_cache
 from django.views.decorators.csrf import csrf_protect
 from django.views.decorators.csrf import csrf_protect
 from django.views.decorators.debug import sensitive_post_parameters
 from django.views.decorators.debug import sensitive_post_parameters

+ 0 - 1
misago/users/views/avatarserver.py

@@ -7,7 +7,6 @@ from django.contrib.auth import get_user_model
 from django.views.decorators.cache import cache_control, never_cache
 from django.views.decorators.cache import cache_control, never_cache
 
 
 from misago.core.fileserver import make_file_response
 from misago.core.fileserver import make_file_response
-
 from misago.users.avatars import store
 from misago.users.avatars import store
 
 
 
 

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

@@ -4,7 +4,6 @@ from django.shortcuts import get_object_or_404, render
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from misago.core.exceptions import Banned
 from misago.core.exceptions import Banned
-
 from misago.users.bans import get_user_ban
 from misago.users.bans import get_user_ban
 from misago.users.decorators import deny_banned_ips
 from misago.users.decorators import deny_banned_ips
 from misago.users.tokens import is_password_change_token_valid
 from misago.users.tokens import is_password_change_token_valid

+ 3 - 3
misago/users/views/lists.py

@@ -1,16 +1,16 @@
 from django.conf import settings
 from django.conf import settings
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
-from django.shortcuts import redirect, render as django_render
+from django.shortcuts import render as django_render
+from django.shortcuts import redirect
 
 
 from misago.core.shortcuts import get_object_or_404, paginate, pagination_dict
 from misago.core.shortcuts import get_object_or_404, paginate, pagination_dict
 from misago.core.utils import format_plaintext_for_html
 from misago.core.utils import format_plaintext_for_html
-
 from misago.users.activepostersranking import get_active_posters_ranking
 from misago.users.activepostersranking import get_active_posters_ranking
 from misago.users.models import Rank
 from misago.users.models import Rank
 from misago.users.pages import users_list
 from misago.users.pages import users_list
 from misago.users.permissions.profiles import allow_browse_users_list
 from misago.users.permissions.profiles import allow_browse_users_list
-from misago.users.serializers import UserSerializer, ScoredUserSerializer
+from misago.users.serializers import ScoredUserSerializer, UserSerializer
 
 
 
 
 def render(request, template, context):
 def render(request, template, context):

+ 6 - 6
misago/users/views/profile.py

@@ -5,7 +5,8 @@ from django.core.exceptions import PermissionDenied
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
 from django.db.transaction import atomic
 from django.db.transaction import atomic
 from django.http import Http404, JsonResponse
 from django.http import Http404, JsonResponse
-from django.shortcuts import redirect, render as django_render
+from django.shortcuts import render as django_render
+from django.shortcuts import redirect
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from misago.acl import add_acl
 from misago.acl import add_acl
@@ -13,15 +14,14 @@ from misago.core.decorators import require_POST
 from misago.core.shortcuts import get_object_or_404, paginate, pagination_dict, validate_slug
 from misago.core.shortcuts import get_object_or_404, paginate, pagination_dict, validate_slug
 from misago.core.utils import clean_return_path
 from misago.core.utils import clean_return_path
 from misago.threads.permissions import allow_message_user
 from misago.threads.permissions import allow_message_user
-
 from misago.users.bans import get_user_ban
 from misago.users.bans import get_user_ban
 from misago.users.decorators import deny_guests
 from misago.users.decorators import deny_guests
 from misago.users.online.utils import get_user_status
 from misago.users.online.utils import get_user_status
 from misago.users.pages import user_profile
 from misago.users.pages import user_profile
-from misago.users.permissions.profiles import allow_follow_user, allow_block_user
-from misago.users.serializers import UserSerializer, UserProfileSerializer, BanDetailsSerializer
-from misago.users.serializers.usernamechange import  UsernameChangeSerializer
-from misago.users.warnings import get_warning_levels, get_user_warning_level, get_user_warning_obj
+from misago.users.permissions.profiles import allow_block_user, allow_follow_user
+from misago.users.serializers import BanDetailsSerializer, UserProfileSerializer, UserSerializer
+from misago.users.serializers.usernamechange import UsernameChangeSerializer
+from misago.users.warnings import get_user_warning_level, get_user_warning_obj, get_warning_levels
 
 
 
 
 def profile_view(f):
 def profile_view(f):