Browse Source

Remove six from codebase

rafalp 6 years ago
parent
commit
eb1e4db51a
40 changed files with 103 additions and 146 deletions
  1. 2 3
      misago/acl/tests/test_providers.py
  2. 1 2
      misago/categories/models.py
  3. 3 4
      misago/conf/hydrators.py
  4. 1 2
      misago/core/exceptionhandler.py
  5. 1 3
      misago/core/shortcuts.py
  6. 1 2
      misago/core/slugify.py
  7. 1 2
      misago/core/tests/test_deprecations.py
  8. 0 1
      misago/core/tests/test_utils.py
  9. 1 3
      misago/markup/checksums.py
  10. 1 2
      misago/markup/mentions.py
  11. 1 2
      misago/markup/parser.py
  12. 1 3
      misago/markup/pipeline.py
  13. 1 2
      misago/search/api.py
  14. 1 2
      misago/search/context_processors.py
  15. 2 3
      misago/search/tests/test_api.py
  16. 0 1
      misago/search/views.py
  17. 0 1
      misago/threads/api/postendpoints/split.py
  18. 2 4
      misago/threads/api/postingendpoint/participants.py
  19. 1 2
      misago/threads/api/threadendpoints/merge.py
  20. 2 3
      misago/threads/api/threadendpoints/patch.py
  21. 1 3
      misago/threads/checksums.py
  22. 4 4
      misago/threads/models/post.py
  23. 1 2
      misago/threads/serializers/moderation.py
  24. 6 7
      misago/threads/tests/test_attachments_api.py
  25. 2 2
      misago/threads/tests/test_thread_patch_api.py
  26. 2 3
      misago/threads/tests/test_treesmap.py
  27. 1 2
      misago/threads/utils.py
  28. 2 3
      misago/users/credentialchange.py
  29. 3 4
      misago/users/datadownloads/dataarchive.py
  30. 3 4
      misago/users/profilefields/basefields.py
  31. 4 5
      misago/users/tests/test_bio_profilefield.py
  32. 6 7
      misago/users/tests/test_gender_profilefield.py
  33. 2 3
      misago/users/tests/test_joinip_profilefield.py
  34. 3 4
      misago/users/tests/test_profilefields.py
  35. 6 7
      misago/users/tests/test_twitter_profilefield.py
  36. 30 31
      misago/users/tests/test_useradmin_views.py
  37. 1 2
      misago/users/tokens.py
  38. 1 2
      misago/users/views/lists.py
  39. 1 2
      misago/users/views/options.py
  40. 1 2
      misago/users/views/profile.py

+ 2 - 3
misago/acl/tests/test_providers.py

@@ -1,7 +1,6 @@
 from types import ModuleType
 
 from django.test import TestCase
-from django.utils import six
 
 from misago.acl.providers import PermissionProviders
 from misago.conf import settings
@@ -58,7 +57,7 @@ class PermissionProvidersTests(TestCase):
         self.assertEqual(len(providers_list), len(providers_setting))
 
         for extension, module in providers_list:
-            self.assertTrue(isinstance(extension, six.string_types))
+            self.assertTrue(isinstance(extension, str))
             self.assertEqual(type(module), ModuleType)
 
     def test_dict(self):
@@ -77,7 +76,7 @@ class PermissionProvidersTests(TestCase):
         self.assertEqual(len(providers_dict), len(providers_setting))
 
         for extension, module in providers_dict.items():
-            self.assertTrue(isinstance(extension, six.string_types))
+            self.assertTrue(isinstance(extension, str))
             self.assertEqual(type(module), ModuleType)
 
     def test_annotators(self):

+ 1 - 2
misago/categories/models.py

@@ -2,7 +2,6 @@ from mptt.managers import TreeManager
 from mptt.models import MPTTModel, TreeForeignKey
 
 from django.db import models
-from django.utils import six
 
 from misago.acl import version as acl_version
 from misago.acl.models import BaseRole
@@ -108,7 +107,7 @@ class Category(MPTTModel):
     objects = CategoryManager()
 
     def __str__(self):
-        return six.text_type(self.thread_type.get_category_name(self))
+        return str(self.thread_type.get_category_name(self))
 
     @property
     def thread_type(self):

+ 3 - 4
misago/conf/hydrators.py

@@ -1,8 +1,7 @@
-import six
-
+# fixme: rename this moduleto serialize
 
 def hydrate_string(dry_value):
-    return six.text_type(dry_value) if dry_value else ''
+    return str(dry_value) if dry_value else ''
 
 
 def dehydrate_string(wet_value):
@@ -22,7 +21,7 @@ def hydrate_int(dry_value):
 
 
 def dehydrate_int(wet_value):
-    return six.text_type(wet_value)
+    return str(wet_value)
 
 
 def hydrate_list(dry_value):

+ 1 - 2
misago/core/exceptionhandler.py

@@ -3,7 +3,6 @@ from rest_framework.views import exception_handler as rest_exception_handler
 from django.core.exceptions import PermissionDenied
 from django.http import Http404, HttpResponsePermanentRedirect, JsonResponse
 from django.urls import reverse
-from django.utils import six
 from social_core.exceptions import SocialAuthBaseException
 from social_core.utils import social_logger
 
@@ -29,7 +28,7 @@ def is_misago_exception(exception):
 def handle_ajax_error(request, exception):
     json = {
         'is_error': 1,
-        'message': six.text_type(exception.message),
+        'message': str(exception.message),
     }
     return JsonResponse(json, status=exception.code)
 

+ 1 - 3
misago/core/shortcuts.py

@@ -2,8 +2,6 @@ from rest_framework.response import Response
 
 from django.http import Http404
 
-import six
-
 
 def paginate(
         object_list,
@@ -82,7 +80,7 @@ def validate_slug(model, slug):
 
 
 def get_int_or_404(value):
-    if six.text_type(value).isdigit():
+    if str(value).isdigit():
         return int(value)
     else:
         raise Http404()

+ 1 - 2
misago/core/slugify.py

@@ -1,10 +1,9 @@
 from unidecode import unidecode
 
 from django.template.defaultfilters import slugify as django_slugify
-from django.utils import six
 
 
 def default(string):
-    string = six.text_type(string)
+    string = str(string)
     string = unidecode(string)
     return django_slugify(string.replace('_', ' ').strip())

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

@@ -1,7 +1,6 @@
 import warnings
 
 from django.test import TestCase
-from django.utils import six
 
 from misago.core.deprecations import RemovedInMisagoWarning, warn
 
@@ -13,5 +12,5 @@ class DeprecationsTests(TestCase):
             warn("test warning")
 
             self.assertEqual(len(warning), 1)
-            self.assertEqual(six.text_type(warning[0].message), "test warning")
+            self.assertEqual(str(warning[0].message), "test warning")
             self.assertTrue(issubclass(warning[0].category, RemovedInMisagoWarning))

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

@@ -2,7 +2,6 @@ from django.core.exceptions import PermissionDenied
 from django.test import TestCase
 from django.test.client import RequestFactory
 from django.urls import reverse
-from django.utils import six
 
 from misago.core.utils import (
     clean_return_path, format_plaintext_for_html, is_referer_local, is_request_to_misago,

+ 1 - 3
misago/markup/checksums.py

@@ -22,12 +22,10 @@ in char fields with max_length=64
 """
 from hashlib import sha256
 
-from django.utils import six
-
 
 def make_checksum(parsed, unique_values=None):
     unique_values = unique_values or []
-    seeds = [parsed] + [six.text_type(v) for v in unique_values]
+    seeds = [parsed] + [str(v) for v in unique_values]
 
     return sha256('+'.join(seeds).encode("utf-8")).hexdigest()
 

+ 1 - 2
misago/markup/mentions.py

@@ -3,7 +3,6 @@ import re
 from bs4 import BeautifulSoup
 
 from django.contrib.auth import get_user_model
-from django.utils import six
 
 
 SUPPORTED_TAGS = ('h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'p')
@@ -26,7 +25,7 @@ def add_mentions(request, result):
     for element in elements:
         add_mentions_to_element(request, element, mentions_dict)
 
-    result['parsed_text'] = six.text_type(soup.body)[6:-7].strip()
+    result['parsed_text'] = str(soup.body)[6:-7].strip()
     result['mentions'] = list(filter(bool, mentions_dict.values()))
 
 

+ 1 - 2
misago/markup/parser.py

@@ -8,7 +8,6 @@ from markdown.extensions.fenced_code import FencedCodeExtension
 
 from django.http import Http404
 from django.urls import resolve
-from django.utils import six
 
 from misago.conf import settings
 
@@ -186,7 +185,7 @@ def clean_links(request, result, force_shva=False):
             img['src'] = assert_link_prefix(img['src'])
 
     # [6:-7] trims <body></body> wrap
-    result['parsed_text'] = six.text_type(soup.body)[6:-7]
+    result['parsed_text'] = str(soup.body)[6:-7]
 
 
 def is_internal_link(link, host):

+ 1 - 3
misago/markup/pipeline.py

@@ -2,8 +2,6 @@ from importlib import import_module
 
 from bs4 import BeautifulSoup
 
-from django.utils import six
-
 from misago.conf import settings
 
 
@@ -26,7 +24,7 @@ class MarkupPipeline(object):
                 hook = getattr(module, 'clean_parsed')
                 hook.process_result(result, soup)
 
-        souped_text = six.text_type(soup.body).strip()[6:-7]
+        souped_text = str(soup.body).strip()[6:-7]
         result['parsed_text'] = souped_text.strip()
         return result
 

+ 1 - 2
misago/search/api.py

@@ -5,7 +5,6 @@ from rest_framework.response import Response
 
 from django.core.exceptions import PermissionDenied
 from django.urls import reverse
-from django.utils import six
 from django.utils.translation import ugettext as _
 
 from misago.core.shortcuts import get_int_or_404
@@ -24,7 +23,7 @@ def search(request, search_provider=None):
     for provider in allowed_providers:
         provider_data = {
             'id': provider.url,
-            'name': six.text_type(provider.name),
+            'name': str(provider.name),
             'icon': provider.icon,
             'url': reverse('misago:search', kwargs={'search_provider': provider.url}),
             'api': reverse('misago:api:search', kwargs={'search_provider': provider.url}),

+ 1 - 2
misago/search/context_processors.py

@@ -1,6 +1,5 @@
 from django.core.exceptions import PermissionDenied
 from django.urls import reverse
-from django.utils import six
 
 from .searchproviders import searchproviders
 
@@ -25,7 +24,7 @@ def search_providers(request):
     for provider in allowed_providers:
         request.frontend_context['SEARCH_PROVIDERS'].append({
             'id': provider.url,
-            'name': six.text_type(provider.name),
+            'name': str(provider.name),
             'icon': provider.icon,
             'url': reverse('misago:search', kwargs={'search_provider': provider.url}),
             'api': reverse('misago:api:search', kwargs={'search_provider': provider.url}),

+ 2 - 3
misago/search/tests/test_api.py

@@ -1,5 +1,4 @@
 from django.urls import reverse
-from django.utils import six
 
 from misago.acl.testutils import override_acl
 from misago.search.searchproviders import searchproviders
@@ -34,7 +33,7 @@ class SearchApiTests(AuthenticatedUserTestCase):
             )
             self.assertEqual(provider_api, provider['api'])
 
-            self.assertEqual(six.text_type(providers[i].name), provider['name'])
+            self.assertEqual(str(providers[i].name), provider['name'])
             self.assertEqual(provider['results']['results'], [])
             self.assertEqual(int(provider['time']), 0)
 
@@ -51,6 +50,6 @@ class SearchApiTests(AuthenticatedUserTestCase):
             )
             self.assertEqual(provider_api, provider['api'])
 
-            self.assertEqual(six.text_type(providers[i].name), provider['name'])
+            self.assertEqual(str(providers[i].name), provider['name'])
             self.assertEqual(provider['results']['results'], [])
             self.assertEqual(int(provider['time']), 0)

+ 0 - 1
misago/search/views.py

@@ -2,7 +2,6 @@ from django.core.exceptions import PermissionDenied
 from django.http import Http404
 from django.shortcuts import redirect, render
 from django.urls import reverse
-from django.utils import six
 from django.utils.translation import ugettext as _
 
 from .searchproviders import searchproviders

+ 0 - 1
misago/threads/api/postendpoints/split.py

@@ -1,7 +1,6 @@
 from rest_framework.response import Response
 
 from django.core.exceptions import PermissionDenied
-from django.utils import six
 from django.utils.translation import ugettext as _
 
 from misago.threads.models import Thread

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

@@ -2,9 +2,7 @@ from rest_framework import serializers
 
 from django.contrib.auth import get_user_model
 from django.core.exceptions import PermissionDenied
-from django.utils import six
-from django.utils.translation import ugettext as _
-from django.utils.translation import ungettext
+from django.utils.translation import ugettext as _, ungettext
 
 from misago.categories import PRIVATE_THREADS_ROOT_NAME
 from misago.threads.participants import add_participants, set_owner
@@ -75,7 +73,7 @@ class ParticipantsSerializer(serializers.Serializer):
             try:
                 allow_message_user(self.context['user'], user)
             except PermissionDenied as e:
-                raise serializers.ValidationError(six.text_type(e))
+                raise serializers.ValidationError(str(e))
             users.append(user)
 
         if len(usernames) != len(users):

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

@@ -2,7 +2,6 @@ from rest_framework.exceptions import ValidationError
 from rest_framework.response import Response
 
 from django.core.exceptions import PermissionDenied
-from django.utils.six import text_type
 from django.utils.translation import ugettext as _
 
 from misago.acl import add_acl
@@ -114,7 +113,7 @@ def threads_merge_endpoint(request):
             invalid_threads.append({
                 'id': thread.pk,
                 'title': thread.title,
-                'errors': [text_type(e)]
+                'errors': [str(e)]
             })
 
     if invalid_threads:

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

@@ -5,7 +5,6 @@ from django.contrib.auth import get_user_model
 from django.core.exceptions import PermissionDenied, ValidationError
 from django.http import Http404
 from django.shortcuts import get_object_or_404
-from django.utils import six
 from django.utils.translation import ugettext as _
 
 from misago.acl import add_acl
@@ -49,7 +48,7 @@ thread_patch_dispatcher.add('acl', patch_acl)
 
 def patch_title(request, thread, value):
     try:
-        value_cleaned = six.text_type(value).strip()
+        value_cleaned = str(value).strip()
     except (TypeError, ValueError):
         raise PermissionDenied(_('Not a valid string.'))
 
@@ -272,7 +271,7 @@ def patch_add_participant(request, thread, value):
     allow_add_participants(request.user, thread)
 
     try:
-        username = six.text_type(value).strip().lower()
+        username = str(value).strip().lower()
         if not username:
             raise PermissionDenied(_("You have to enter new participant's username."))
         participant = UserModel.objects.get(slug=username)

+ 1 - 3
misago/threads/checksums.py

@@ -1,5 +1,3 @@
-from django.utils import six
-
 from misago.markup import checksums
 
 
@@ -9,7 +7,7 @@ def is_post_valid(post):
 
 
 def make_post_checksum(post):
-    post_seeds = [six.text_type(v) for v in (post.id, str(post.posted_on.date()))]
+    post_seeds = [str(v) for v in (post.id, str(post.posted_on.date()))]
     return checksums.make_checksum(post.parsed, post_seeds)
 
 

+ 4 - 4
misago/threads/models/post.py

@@ -4,7 +4,7 @@ from django.contrib.postgres.indexes import GinIndex
 from django.contrib.postgres.fields import JSONField
 from django.contrib.postgres.search import SearchVector, SearchVectorField
 from django.db import models
-from django.utils import six, timezone
+from django.utils import timezone
 
 from misago.conf import settings
 from misago.core.pgutils import PgPartialIndex
@@ -132,8 +132,8 @@ class Post(models.Model):
         if self.pk == other_post.pk:
             raise ValueError("post can't be merged with itself")
 
-        other_post.original = six.text_type('\n\n').join((other_post.original, self.original))
-        other_post.parsed = six.text_type('\n').join((other_post.parsed, self.parsed))
+        other_post.original = str('\n\n').join((other_post.original, self.original))
+        other_post.parsed = str('\n').join((other_post.parsed, self.parsed))
         update_post_checksum(other_post)
 
         if self.is_protected:
@@ -213,7 +213,7 @@ class Post(models.Model):
     def short(self):
         if self.is_valid:
             if len(self.original) > 150:
-                return six.text_type('%s...') % self.original[:150].strip()
+                return str('%s...') % self.original[:150].strip()
             else:
                 return self.original
         else:

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

@@ -2,7 +2,6 @@ from rest_framework import serializers
 
 from django.core.exceptions import PermissionDenied, ValidationError
 from django.http import Http404
-from django.utils import six
 from django.utils.translation import ugettext as _, ugettext_lazy, ungettext
 
 from misago.acl import add_acl
@@ -398,7 +397,7 @@ class DeleteThreadsSerializer(serializers.Serializer):
                         'id': thread.id,
                         'title': thread.title
                     },
-                    'error': six.text_type(e)
+                    'error': str(e)
                 })
             except Http404 as e:
                 pass # skip invisible threads

+ 6 - 7
misago/threads/tests/test_attachments_api.py

@@ -3,7 +3,6 @@ import os
 from PIL import Image
 
 from django.urls import reverse
-from django.utils import six
 
 from misago.acl.models import Role
 from misago.acl.testutils import override_acl
@@ -218,7 +217,7 @@ class AttachmentsApiTestCase(AuthenticatedUserTestCase):
         self.assertTrue(not attachment.image)
         self.assertTrue(not attachment.thumbnail)
 
-        self.assertTrue(six.text_type(attachment.file).endswith('document.pdf'))
+        self.assertTrue(str(attachment.file).endswith('document.pdf'))
 
         self.assertIsNone(response_json['post'])
         self.assertEqual(response_json['uploader_name'], self.user.username)
@@ -261,7 +260,7 @@ class AttachmentsApiTestCase(AuthenticatedUserTestCase):
         self.assertIsNotNone(attachment.image)
         self.assertTrue(not attachment.thumbnail)
 
-        self.assertTrue(six.text_type(attachment.image).endswith('small.jpg'))
+        self.assertTrue(str(attachment.image).endswith('small.jpg'))
 
         self.assertIsNone(response_json['post'])
         self.assertEqual(response_json['uploader_name'], self.user.username)
@@ -300,8 +299,8 @@ class AttachmentsApiTestCase(AuthenticatedUserTestCase):
         self.assertIsNotNone(attachment.image)
         self.assertIsNotNone(attachment.thumbnail)
 
-        self.assertTrue(six.text_type(attachment.image).endswith('large.png'))
-        self.assertTrue(six.text_type(attachment.thumbnail).endswith('large.png'))
+        self.assertTrue(str(attachment.image).endswith('large.png'))
+        self.assertTrue(str(attachment.thumbnail).endswith('large.png'))
 
         self.assertIsNone(response_json['post'])
         self.assertEqual(response_json['uploader_name'], self.user.username)
@@ -355,8 +354,8 @@ class AttachmentsApiTestCase(AuthenticatedUserTestCase):
         self.assertIsNotNone(attachment.image)
         self.assertIsNotNone(attachment.thumbnail)
 
-        self.assertTrue(six.text_type(attachment.image).endswith('animated.gif'))
-        self.assertTrue(six.text_type(attachment.thumbnail).endswith('animated.gif'))
+        self.assertTrue(str(attachment.image).endswith('animated.gif'))
+        self.assertTrue(str(attachment.thumbnail).endswith('animated.gif'))
 
         self.assertIsNone(response_json['post'])
         self.assertEqual(response_json['uploader_name'], self.user.username)

+ 2 - 2
misago/threads/tests/test_thread_patch_api.py

@@ -1,7 +1,7 @@
 import json
 from datetime import timedelta
 
-from django.utils import six, timezone
+from django.utils import timezone
 
 from misago.acl.testutils import override_acl
 from misago.categories.models import Category
@@ -1388,7 +1388,7 @@ class ThreadSubscribeApiTests(ThreadPatchApiTestCase):
     def test_subscribe_nonexistant_thread(self):
         """api makes it impossible to subscribe nonexistant thread"""
         bad_api_link = self.api_link.replace(
-            six.text_type(self.thread.pk), six.text_type(self.thread.pk + 9)
+            str(self.thread.pk), str(self.thread.pk + 9)
         )
 
         response = self.patch(

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

@@ -1,5 +1,4 @@
 from django.test import TestCase
-from django.utils import six
 
 from misago.categories.models import Category
 from misago.threads.threadtypes.treesmap import TreesMap
@@ -82,7 +81,7 @@ class TreesMapTests(TestCase):
         except KeyError as e:
             self.assertIn(
                 "tree id has no type defined",
-                six.text_type(e), "invalid exception message as given"
+                str(e), "invalid exception message as given"
             )
 
     def test_get_tree_id_for_root(self):
@@ -101,5 +100,5 @@ class TreesMapTests(TestCase):
         except KeyError as e:
             self.assertIn(
                 '"hurr_durr" root has no tree defined',
-                six.text_type(e), "invalid exception message as given"
+                str(e), "invalid exception message as given"
             )

+ 1 - 2
misago/threads/utils.py

@@ -1,7 +1,6 @@
 from urllib.parse import urlparse
 
 from django.urls import resolve
-from django.utils import six
 
 from .models import PostLike
 
@@ -41,7 +40,7 @@ SUPPORTED_THREAD_ROUTES = {
 
 def get_thread_id_from_url(request, url):
     try:
-        clean_url = six.text_type(url).strip()
+        clean_url = str(url).strip()
         bits = urlparse(clean_url)
     except:
         return None

+ 2 - 3
misago/users/credentialchange.py

@@ -6,7 +6,6 @@ Stores new e-mail and password in cache
 from hashlib import sha256
 
 from django.conf import settings
-from django.utils import six
 from django.utils.encoding import force_bytes
 
 
@@ -45,7 +44,7 @@ def read_new_credential(request, credential_type, link_token):
 def _make_change_token(user, token_type):
     seeds = (
         user.pk, user.email, user.password, user.last_login.replace(microsecond=0, tzinfo=None),
-        settings.SECRET_KEY, six.text_type(token_type)
+        settings.SECRET_KEY, str(token_type)
     )
 
-    return sha256(force_bytes('+'.join([six.text_type(s) for s in seeds]))).hexdigest()
+    return sha256(force_bytes('+'.join([str(s) for s in seeds]))).hexdigest()

+ 3 - 4
misago/users/datadownloads/dataarchive.py

@@ -4,7 +4,6 @@ import shutil
 from django.core.files import File
 from django.utils import timezone
 from django.utils.crypto import get_random_string
-from django.utils import six
 
 from misago.core.utils import slugify
 
@@ -78,7 +77,7 @@ class DataArchive(object):
         file_dir_path = self.make_final_path(date=date, directory=directory)
         file_path = os.path.join(file_dir_path, '{}.txt'.format(clean_filename))
         with open(file_path, 'w') as fp:
-            fp.write(six.text_type(value))
+            fp.write(str(value))
             return file_path
 
     def add_dict(self, name, value, date=None, directory=None):
@@ -120,13 +119,13 @@ class DataArchive(object):
             final_path = data_dir_path
             path_items = [date.strftime('%Y'), date.strftime('%m'), date.strftime('%d')]
             for path_item in path_items:
-                final_path = os.path.join(final_path, six.text_type(path_item))
+                final_path = os.path.join(final_path, str(path_item))
                 if not os.path.isdir(final_path):
                     os.mkdir(final_path)
             return final_path
 
         if directory:
-            final_path = os.path.join(data_dir_path, six.text_type(directory))
+            final_path = os.path.join(data_dir_path, str(directory))
             if not os.path.isdir(final_path):
                 os.mkdir(final_path)
             return final_path

+ 3 - 4
misago/users/profilefields/basefields.py

@@ -1,7 +1,6 @@
 from django import forms
 from django.db.models import Q
 from django.utils import html
-from django.utils.six import text_type
 
 from misago.core.utils import format_plaintext_for_html
 
@@ -67,7 +66,7 @@ class ProfileField(object):
 
         data.update({
             'fieldname': self.fieldname,
-            'name': text_type(self.get_label(user)),
+            'name': str(self.get_label(user)),
         })
 
         return data
@@ -124,7 +123,7 @@ class ChoiceProfileField(ProfileField):
         for key, name in self.get_choices():
             if key == value:
                 return {
-                    'text': text_type(name),
+                    'text': str(name),
                 }
         return None
 
@@ -135,7 +134,7 @@ class ChoiceProfileField(ProfileField):
         })
 
         for key, choice in self.get_choices():
-            if key and criteria.lower() in text_type(choice).lower():
+            if key and criteria.lower() in str(choice).lower():
                 q_obj = q_obj | Q(**{
                     'profile_fields__{}'.format(self.fieldname): key
                 })

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

@@ -1,6 +1,5 @@
 from django.contrib.auth import get_user_model
 from django.urls import reverse
-from django.utils import six
 
 from misago.admin.testutils import AdminTestCase
 
@@ -36,8 +35,8 @@ class BioProfileFieldTests(AdminTestCase):
             self.test_link,
             data={
                 'username': 'Edited',
-                'rank': six.text_type(self.user.rank_id),
-                'roles': six.text_type(self.user.roles.all()[0].pk),
+                'rank': str(self.user.rank_id),
+                'roles': str(self.user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'new_password': '',
                 'signature': '',
@@ -61,8 +60,8 @@ class BioProfileFieldTests(AdminTestCase):
             self.test_link,
             data={
                 'username': 'Edited',
-                'rank': six.text_type(self.user.rank_id),
-                'roles': six.text_type(self.user.roles.all()[0].pk),
+                'rank': str(self.user.rank_id),
+                'roles': str(self.user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'bio': 'Edited field!',
                 'new_password': '',

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

@@ -1,6 +1,5 @@
 from django.contrib.auth import get_user_model
 from django.urls import reverse
-from django.utils import six
 
 from misago.admin.testutils import AdminTestCase
 
@@ -36,8 +35,8 @@ class GenderProfileFieldTests(AdminTestCase):
             self.test_link,
             data={
                 'username': 'Edited',
-                'rank': six.text_type(self.user.rank_id),
-                'roles': six.text_type(self.user.roles.all()[0].pk),
+                'rank': str(self.user.rank_id),
+                'roles': str(self.user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'new_password': '',
                 'signature': '',
@@ -61,8 +60,8 @@ class GenderProfileFieldTests(AdminTestCase):
             self.test_link,
             data={
                 'username': 'Edited',
-                'rank': six.text_type(self.user.rank_id),
-                'roles': six.text_type(self.user.roles.all()[0].pk),
+                'rank': str(self.user.rank_id),
+                'roles': str(self.user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'gender': 'attackcopter',
                 'new_password': '',
@@ -85,8 +84,8 @@ class GenderProfileFieldTests(AdminTestCase):
             self.test_link,
             data={
                 'username': 'Edited',
-                'rank': six.text_type(self.user.rank_id),
-                'roles': six.text_type(self.user.roles.all()[0].pk),
+                'rank': str(self.user.rank_id),
+                'roles': str(self.user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'gender': 'female',
                 'new_password': '',

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

@@ -1,6 +1,5 @@
 from django.contrib.auth import get_user_model
 from django.urls import reverse
-from django.utils import six
 
 from misago.admin.testutils import AdminTestCase
 from misago.acl.testutils import override_acl
@@ -33,8 +32,8 @@ class JoinIpProfileFieldTests(AdminTestCase):
             self.test_link,
             data={
                 'username': 'Edited',
-                'rank': six.text_type(self.user.rank_id),
-                'roles': six.text_type(self.user.roles.all()[0].pk),
+                'rank': str(self.user.rank_id),
+                'roles': str(self.user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'join_ip': '127.0.0.1',
                 'new_password': '',

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

@@ -1,6 +1,5 @@
 from django.contrib.auth import get_user_model
 from django.test import TestCase
-from django.utils.six import text_type
 
 from misago.users.profilefields import ProfileFields
 
@@ -46,7 +45,7 @@ class ProfileFieldsLoadTests(TestCase):
         try:
             profilefields.load()
         except ValueError as e:
-            error = text_type(e)
+            error = str(e)
 
             self.assertIn('misago.users.tests.testfiles.profilefields.NofieldnameField', error)
             self.assertIn('profile field has to specify fieldname attribute', error)
@@ -74,7 +73,7 @@ class ProfileFieldsLoadTests(TestCase):
         try:
             profilefields.load()
         except ValueError as e:
-            error = text_type(e)
+            error = str(e)
 
             self.assertIn('misago.users.profilefields.default.TwitterHandleField', error)
             self.assertIn('profile field has been specified twice', error)
@@ -102,7 +101,7 @@ class ProfileFieldsLoadTests(TestCase):
         try:
             profilefields.load()
         except ValueError as e:
-            error = text_type(e)
+            error = str(e)
 
             self.assertIn('misago.users.tests.testfiles.profilefields.FieldnameField', error)
             self.assertIn('misago.users.tests.testfiles.profilefields.RepeatedFieldnameField', error)

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

@@ -1,6 +1,5 @@
 from django.contrib.auth import get_user_model
 from django.urls import reverse
-from django.utils import six
 
 from misago.admin.testutils import AdminTestCase
 
@@ -36,8 +35,8 @@ class TwitterProfileFieldTests(AdminTestCase):
             self.test_link,
             data={
                 'username': 'Edited',
-                'rank': six.text_type(self.user.rank_id),
-                'roles': six.text_type(self.user.roles.all()[0].pk),
+                'rank': str(self.user.rank_id),
+                'roles': str(self.user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'new_password': '',
                 'signature': '',
@@ -61,8 +60,8 @@ class TwitterProfileFieldTests(AdminTestCase):
             self.test_link,
             data={
                 'username': 'Edited',
-                'rank': six.text_type(self.user.rank_id),
-                'roles': six.text_type(self.user.roles.all()[0].pk),
+                'rank': str(self.user.rank_id),
+                'roles': str(self.user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'twitter': 'lorem!ipsum',
                 'new_password': '',
@@ -85,8 +84,8 @@ class TwitterProfileFieldTests(AdminTestCase):
             self.test_link,
             data={
                 'username': 'Edited',
-                'rank': six.text_type(self.user.rank_id),
-                'roles': six.text_type(self.user.roles.all()[0].pk),
+                'rank': str(self.user.rank_id),
+                'roles': str(self.user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'twitter': 'lorem_ipsum',
                 'new_password': '',

+ 30 - 31
misago/users/tests/test_useradmin_views.py

@@ -1,7 +1,6 @@
 from django.contrib.auth import get_user_model
 from django.core import mail
 from django.urls import reverse
-from django.utils import six
 
 from misago.acl.models import Role
 from misago.admin.testutils import AdminTestCase
@@ -453,8 +452,8 @@ class UserAdminViewsTests(AdminTestCase):
             reverse('misago:admin:users:accounts:new'),
             data={
                 'username': 'Bawww',
-                'rank': six.text_type(default_rank.pk),
-                'roles': six.text_type(authenticated_role.pk),
+                'rank': str(default_rank.pk),
+                'roles': str(authenticated_role.pk),
                 'email': 'reg@stered.com',
                 'new_password': 'pass123',
                 'staff_level': '0',
@@ -479,8 +478,8 @@ class UserAdminViewsTests(AdminTestCase):
             reverse('misago:admin:users:accounts:new'),
             data={
                 'username': 'Bawww',
-                'rank': six.text_type(default_rank.pk),
-                'roles': six.text_type(authenticated_role.pk),
+                'rank': str(default_rank.pk),
+                'roles': str(authenticated_role.pk),
                 'email': 'reg@stered.com',
                 'new_password': ' pass123 ',
                 'staff_level': '0',
@@ -509,8 +508,8 @@ class UserAdminViewsTests(AdminTestCase):
             test_link,
             data={
                 'username': 'Bawww',
-                'rank': six.text_type(test_user.rank_id),
-                'roles': six.text_type(test_user.roles.all()[0].pk),
+                'rank': str(test_user.rank_id),
+                'roles': str(test_user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'new_password': 'newpass123',
                 'staff_level': '0',
@@ -554,8 +553,8 @@ class UserAdminViewsTests(AdminTestCase):
             test_link,
             data={
                 'username': 'Bob',
-                'rank': six.text_type(test_user.rank_id),
-                'roles': six.text_type(test_user.roles.all()[0].pk),
+                'rank': str(test_user.rank_id),
+                'roles': str(test_user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'new_password': 'pass123',
                 'signature': 'Hello world!',
@@ -591,8 +590,8 @@ class UserAdminViewsTests(AdminTestCase):
             test_link,
             data={
                 'username': 'Bawww',
-                'rank': six.text_type(test_user.rank_id),
-                'roles': six.text_type(test_user.roles.all()[0].pk),
+                'rank': str(test_user.rank_id),
+                'roles': str(test_user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'new_password': ' newpass123 ',
                 'staff_level': '0',
@@ -633,8 +632,8 @@ class UserAdminViewsTests(AdminTestCase):
             test_link,
             data={
                 'username': 'Bawww',
-                'rank': six.text_type(test_user.rank_id),
-                'roles': six.text_type(test_user.roles.all()[0].pk),
+                'rank': str(test_user.rank_id),
+                'roles': str(test_user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'new_password': 'pass123',
                 'is_staff': '1',
@@ -672,8 +671,8 @@ class UserAdminViewsTests(AdminTestCase):
             test_link,
             data={
                 'username': 'Bawww',
-                'rank': six.text_type(test_user.rank_id),
-                'roles': six.text_type(test_user.roles.all()[0].pk),
+                'rank': str(test_user.rank_id),
+                'roles': str(test_user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'new_password': 'pass123',
                 'is_staff': '0',
@@ -718,8 +717,8 @@ class UserAdminViewsTests(AdminTestCase):
             test_link,
             data={
                 'username': 'Bawww',
-                'rank': six.text_type(test_user.rank_id),
-                'roles': six.text_type(test_user.roles.all()[0].pk),
+                'rank': str(test_user.rank_id),
+                'roles': str(test_user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'new_password': 'pass123',
                 'is_staff': '0',
@@ -760,8 +759,8 @@ class UserAdminViewsTests(AdminTestCase):
             test_link,
             data={
                 'username': 'Bawww',
-                'rank': six.text_type(test_user.rank_id),
-                'roles': six.text_type(test_user.roles.all()[0].pk),
+                'rank': str(test_user.rank_id),
+                'roles': str(test_user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'new_password': 'pass123',
                 'is_staff': '1',
@@ -802,8 +801,8 @@ class UserAdminViewsTests(AdminTestCase):
             test_link,
             data={
                 'username': 'Bawww',
-                'rank': six.text_type(test_user.rank_id),
-                'roles': six.text_type(test_user.roles.all()[0].pk),
+                'rank': str(test_user.rank_id),
+                'roles': str(test_user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'new_password': 'pass123',
                 'is_staff': '0',
@@ -850,8 +849,8 @@ class UserAdminViewsTests(AdminTestCase):
             test_link,
             data={
                 'username': 'Bawww',
-                'rank': six.text_type(test_user.rank_id),
-                'roles': six.text_type(test_user.roles.all()[0].pk),
+                'rank': str(test_user.rank_id),
+                'roles': str(test_user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'new_password': 'pass123',
                 'is_staff': '1',
@@ -898,8 +897,8 @@ class UserAdminViewsTests(AdminTestCase):
             test_link,
             data={
                 'username': 'Bawww',
-                'rank': six.text_type(test_user.rank_id),
-                'roles': six.text_type(test_user.roles.all()[0].pk),
+                'rank': str(test_user.rank_id),
+                'roles': str(test_user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'new_password': 'pass123',
                 'is_staff': '1',
@@ -941,8 +940,8 @@ class UserAdminViewsTests(AdminTestCase):
             test_link,
             data={
                 'username': 'Bawww',
-                'rank': six.text_type(test_user.rank_id),
-                'roles': six.text_type(test_user.roles.all()[0].pk),
+                'rank': str(test_user.rank_id),
+                'roles': str(test_user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'new_password': 'pass123',
                 'is_staff': '1',
@@ -982,8 +981,8 @@ class UserAdminViewsTests(AdminTestCase):
             test_link,
             data={
                 'username': 'Bawww',
-                'rank': six.text_type(test_user.rank_id),
-                'roles': six.text_type(test_user.roles.all()[0].pk),
+                'rank': str(test_user.rank_id),
+                'roles': str(test_user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'new_password': 'pass123',
                 'is_staff': '1',
@@ -1022,8 +1021,8 @@ class UserAdminViewsTests(AdminTestCase):
             test_link,
             data={
                 'username': 'Bawww',
-                'rank': six.text_type(test_user.rank_id),
-                'roles': six.text_type(test_user.roles.all()[0].pk),
+                'rank': str(test_user.rank_id),
+                'roles': str(test_user.roles.all()[0].pk),
                 'email': 'reg@stered.com',
                 'is_staff': '1',
                 'is_superuser': '0',

+ 1 - 2
misago/users/tokens.py

@@ -12,7 +12,6 @@ from hashlib import sha256
 from time import time
 
 from django.conf import settings
-from django.utils import six
 from django.utils.encoding import force_bytes
 
 
@@ -54,7 +53,7 @@ def _make_hash(user, token_type):
         settings.SECRET_KEY,
     ]
 
-    return sha256(force_bytes('+'.join([six.text_type(s) for s in seeds]))).hexdigest()[:8]
+    return sha256(force_bytes('+'.join([str(s) for s in seeds]))).hexdigest()[:8]
 
 
 def _days_since_epoch():

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

@@ -1,6 +1,5 @@
 from django.shortcuts import get_object_or_404, redirect, render
 from django.urls import reverse
-from django.utils import six
 from django.views import View
 
 from misago.core.utils import format_plaintext_for_html
@@ -24,7 +23,7 @@ class ListView(View):
         for page in sections:
             page['reversed_link'] = reverse(page['link'])
             request.frontend_context['USERS_LISTS'].append({
-                'name': six.text_type(page['name']),
+                'name': str(page['name']),
                 'component': page['component'],
             })
 

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

@@ -1,7 +1,6 @@
 from django.contrib.auth import update_session_auth_hash
 from django.db import IntegrityError
 from django.shortcuts import render
-from django.utils import six
 from django.utils.translation import ugettext as _
 
 from misago.users.credentialchange import read_new_credential
@@ -14,7 +13,7 @@ def index(request, *args, **kwargs):
     user_options = []
     for section in usercp.get_sections(request):
         user_options.append({
-            'name': six.text_type(section['name']),
+            'name': str(section['name']),
             'icon': section['icon'],
             'component': section['component'],
         })

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

@@ -1,7 +1,6 @@
 from django.contrib.auth import get_user_model
 from django.http import Http404
 from django.shortcuts import get_object_or_404, redirect, render
-from django.utils import six
 from django.views import View
 
 from misago.acl import add_acl
@@ -61,7 +60,7 @@ class ProfileView(View):
         request.frontend_context['PROFILE_PAGES'] = []
         for section in sections:
             request.frontend_context['PROFILE_PAGES'].append({
-                'name': six.text_type(section['name']),
+                'name': str(section['name']),
                 'icon': section['icon'],
                 'meta': section.get('metadata'),
                 'component': section['component'],