Browse Source

Python 3.5 code fixes

Use range from six instead of xrange
Convert strings to bytes when needed and vice versa.
Functions from django.utils.encoding are used in most of cases since
they assume utf-8 by default, unlike Python 2's decode() and encode()
methods.
NeKit 9 years ago
parent
commit
ca8f97ff16

+ 2 - 1
misago/admin/views/index.py

@@ -4,6 +4,7 @@ import requests
 from requests.exceptions import RequestException
 
 from django.http import Http404, JsonResponse
+from django.utils.six.moves import range
 from django.utils.translation import ugettext as _
 
 from misago import __version__
@@ -48,7 +49,7 @@ def check_version(request):
             latest = [int(v) for v in latest_version.split(".")]
             current = [int(v) for v in __version__.split(".")]
 
-            for i in xrange(3):
+            for i in range(3):
                 if latest[i] > current[i]:
                     message = _("Outdated: %(current)s < %(latest)s")
                     formats = {

+ 2 - 1
misago/core/exceptionhandler.py

@@ -1,6 +1,7 @@
 from django.core.exceptions import PermissionDenied
 from django.core.urlresolvers import reverse
 from django.http import Http404, HttpResponsePermanentRedirect, JsonResponse
+from django.utils import six
 from django.utils.translation import gettext as _
 
 from rest_framework.views import exception_handler as rest_exception_handler
@@ -18,7 +19,7 @@ def is_misago_exception(exception):
 
 
 def handle_ajax_error(request, exception):
-    json = {'is_error': 1, 'message': unicode(exception.message)}
+    json = {'is_error': 1, 'message': six.text_type(exception.message)}
     return JsonResponse(json, status=exception.code)
 
 

+ 2 - 1
misago/faker/management/commands/createfakebans.py

@@ -6,6 +6,7 @@ from faker import Factory
 
 from django.core.management.base import BaseCommand
 from django.utils import timezone
+from django.utils.six.moves import range
 
 from misago.core.management.progressbar import show_progress
 from misago.users.models import BAN_EMAIL, BAN_IP, BAN_USERNAME, Ban
@@ -97,7 +98,7 @@ class Command(BaseCommand):
 
         created_count = 0
         show_progress(self, created_count, fake_bans_to_create)
-        for i in xrange(fake_bans_to_create):
+        for i in range(fake_bans_to_create):
             ban = Ban(check_type=random.randint(BAN_USERNAME, BAN_IP))
             ban.banned_value = create_fake_test(fake, ban.check_type)
 

+ 2 - 1
misago/faker/management/commands/createfakecategories.py

@@ -2,6 +2,7 @@ import random
 import sys
 import time
 
+from django.utils.six.moves import range
 from faker import Factory
 
 from django.core.management.base import BaseCommand
@@ -46,7 +47,7 @@ class Command(BaseCommand):
         created_count = 0
         start_time = time.time()
         show_progress(self, created_count, fake_cats_to_create)
-        for i in xrange(fake_cats_to_create):
+        for i in range(fake_cats_to_create):
             parent = random.choice(categories)
 
             new_category = Category()

+ 4 - 3
misago/faker/management/commands/createfakethreads.py

@@ -8,6 +8,7 @@ from django.core.management.base import BaseCommand
 from django.db.transaction import atomic
 from django.template.defaultfilters import linebreaks_filter
 from django.utils import timezone
+from django.utils.six.moves import range
 
 from misago.categories.models import Category
 from misago.core.management.progressbar import show_progress
@@ -41,7 +42,7 @@ class Command(BaseCommand):
         created_threads = 0
         start_time = time.time()
         show_progress(self, created_threads, fake_threads_to_create)
-        for i in xrange(fake_threads_to_create):
+        for i in range(fake_threads_to_create):
             with atomic():
                 datetime = timezone.now()
                 category = random.choice(categories)
@@ -98,7 +99,7 @@ class Command(BaseCommand):
                 else:
                     thread_replies = random.randint(0, 10)
 
-                for x in xrange(thread_replies):
+                for x in range(thread_replies):
                     datetime = timezone.now()
                     user = User.objects.order_by('?')[:1][0]
                     fake_message = "\n\n".join(fake.paragraphs())
@@ -137,7 +138,7 @@ class Command(BaseCommand):
 
         pinned_threads = random.randint(0, int(created_threads * 0.025)) or 1
         self.stdout.write('\nPinning %s threads...' % pinned_threads)
-        for i in xrange(0, pinned_threads):
+        for i in range(0, pinned_threads):
             thread = Thread.objects.order_by('?')[:1][0]
             if random.randint(0, 100) > 75:
                 thread.weight = 2

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

@@ -8,6 +8,7 @@ from django.contrib.auth import get_user_model
 from django.core.exceptions import ValidationError
 from django.core.management.base import BaseCommand
 from django.db import IntegrityError
+from django.utils.six.moves import range
 
 from misago.core.management.progressbar import show_progress
 from misago.users.avatars import dynamic, gallery, get_avatar_hash
@@ -39,7 +40,7 @@ class Command(BaseCommand):
         created_count = 0
         start_time = time.time()
         show_progress(self, created_count, fake_users_to_create)
-        for i in xrange(fake_users_to_create):
+        for i in range(fake_users_to_create):
             try:
                 kwargs = {
                     'rank': random.choice(ranks),

+ 2 - 1
misago/legal/views.py

@@ -2,6 +2,7 @@ from hashlib import md5
 
 from django.http import Http404
 from django.shortcuts import redirect, render
+from django.utils.encoding import force_bytes
 from django.utils.translation import gettext as _
 
 from misago.conf import settings
@@ -15,7 +16,7 @@ def get_parsed_content(request, setting_name):
 
     unparsed_content = settings.get_lazy_setting(setting_name)
 
-    checksum_source = '%s:%s' % (unparsed_content, settings.SECRET_KEY)
+    checksum_source = force_bytes('%s:%s' % (unparsed_content, settings.SECRET_KEY))
     unparsed_checksum = md5(checksum_source).hexdigest()
 
     if cached_content and cached_content.get('checksum') == unparsed_checksum:

+ 2 - 1
misago/markup/checksums.py

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

+ 2 - 1
misago/markup/pipeline.py

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

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

@@ -55,7 +55,7 @@ def threads_merge_endpoint(request):
 
 def clean_threads_for_merge(request):
     try:
-        threads_ids = map(int, request.data.get('threads', []))
+        threads_ids = list(map(int, request.data.get('threads', [])))
     except (ValueError, TypeError):
         raise MergeError(_("One or more thread ids received were invalid."))
 

+ 2 - 1
misago/threads/checksums.py

@@ -1,4 +1,5 @@
 from misago.markup import checksums
+from django.utils import six
 
 
 def is_post_valid(post):
@@ -7,7 +8,7 @@ def is_post_valid(post):
 
 
 def make_post_checksum(post):
-    post_seeds = [unicode(v) for v in (post.id, post.poster_ip)]
+    post_seeds = [six.text_type(v) for v in (post.id, post.poster_ip)]
     return checksums.make_checksum(post.parsed, post_seeds)
 
 

+ 1 - 1
misago/users/avatars/dynamic.py

@@ -44,7 +44,7 @@ COLOR_WHEEL_LEN = len(COLOR_WHEEL)
 def draw_avatar_bg(user, image):
     image_size = image.size
 
-    color_index = user.pk - COLOR_WHEEL_LEN * (user.pk / COLOR_WHEEL_LEN)
+    color_index = user.pk - COLOR_WHEEL_LEN * (user.pk // COLOR_WHEEL_LEN)
     main_color = COLOR_WHEEL[color_index]
 
     rgb = ImageColor.getrgb(main_color)

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

@@ -1,4 +1,4 @@
-from six import StringIO
+from io import BytesIO
 
 import requests
 from PIL import Image
@@ -27,7 +27,7 @@ def set_avatar(user):
             raise NoGravatarAvailable(
                 'gravatar is not available for this e-mail')
 
-        image = Image.open(StringIO(r.content))
+        image = Image.open(BytesIO(r.content))
         store.store_new_avatar(user, image)
     except requests.exceptions.RequestException:
         raise GravatarError('failed to connect to gravatar servers')

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

@@ -1,6 +1,8 @@
 import os
 from hashlib import md5
 
+from django.utils.encoding import force_bytes
+
 from path import Path
 from PIL import Image
 
@@ -60,8 +62,8 @@ def get_user_avatar_tokens(user):
     token_seeds = (user.email, user.avatar_hash, settings.SECRET_KEY)
 
     tokens = {
-        'org': md5('org:%s:%s:%s' % token_seeds).hexdigest()[:8],
-        'tmp': md5('tmp:%s:%s:%s' % token_seeds).hexdigest()[:8],
+        'org': md5(force_bytes('org:%s:%s:%s' % token_seeds)).hexdigest()[:8],
+        'tmp': md5(force_bytes('tmp:%s:%s:%s' % token_seeds)).hexdigest()[:8],
     }
 
     tokens.update({

+ 5 - 3
misago/users/credentialchange.py

@@ -6,7 +6,8 @@ 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
 from misago.core import serializer
 
 
@@ -52,7 +53,8 @@ def _make_change_token(user, token_type):
         user.password,
         user.last_login.replace(microsecond=0, tzinfo=None),
         settings.SECRET_KEY,
-        unicode(token_type)
+        six.text_type(token_type)
     )
 
-    return sha256('+'.join([unicode(s) for s in seeds])).hexdigest()
+    return sha256(
+        force_bytes('+'.join([six.text_type(s) for s in seeds]))).hexdigest()

+ 8 - 4
misago/users/tokens.py

@@ -3,6 +3,8 @@ 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
 
 
 """
@@ -18,7 +20,7 @@ def make(user, token_type):
     user_hash = _make_hash(user, token_type)
     creation_day = _days_since_epoch()
 
-    obfuscated = base64.b64encode('%s%s' % (user_hash, creation_day))
+    obfuscated = base64.b64encode(force_bytes('%s%s' % (user_hash, creation_day))).decode()
     obfuscated = obfuscated.rstrip('=')
     checksum = _make_checksum(obfuscated)
 
@@ -32,7 +34,7 @@ def is_valid(user, token_type, token):
     if checksum != _make_checksum(obfuscated):
         return False
 
-    unobfuscated = base64.b64decode(obfuscated + '=' * (-len(obfuscated) % 4))
+    unobfuscated = base64.b64decode(obfuscated + '=' * (-len(obfuscated) % 4)).decode()
     user_hash = unobfuscated[:8]
 
     if user_hash != _make_hash(user, token_type):
@@ -52,7 +54,8 @@ def _make_hash(user, token_type):
         settings.SECRET_KEY,
     )
 
-    return sha256('+'.join([unicode(s) for s in seeds])).hexdigest()[:8]
+    return sha256(force_bytes(
+        '+'.join([six.text_type(s) for s in seeds]))).hexdigest()[:8]
 
 
 def _days_since_epoch():
@@ -60,7 +63,8 @@ def _days_since_epoch():
 
 
 def _make_checksum(obfuscated):
-    return sha256('%s:%s' % (settings.SECRET_KEY, obfuscated)).hexdigest()[:8]
+    return sha256(force_bytes(
+        '%s:%s' % (settings.SECRET_KEY, obfuscated))).hexdigest()[:8]
 
 
 """

+ 2 - 1
misago/users/validators.py

@@ -7,6 +7,7 @@ import requests
 from django.contrib.auth import get_user_model
 from django.core.exceptions import PermissionDenied, ValidationError
 from django.core.validators import validate_email as validate_email_content
+from django.utils.encoding import force_str
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ungettext
 
@@ -131,7 +132,7 @@ def _real_validate_with_sfs(ip, email):
     try:
         r = requests.get(SFS_API_URL % {'email': email, 'ip': ip},
                          timeout=3)
-        api_response = json.loads(r.content)
+        api_response = json.loads(force_str(r.content))
         ip_score = api_response.get('ip', {}).get('confidence', 0)
         email_score = api_response.get('email', {}).get('confidence', 0)
 

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

@@ -43,7 +43,7 @@ def serve_user_avatar_source(request, pk, secret, hash):
     fallback_avatar = get_blank_avatar_file(min(settings.MISAGO_AVATARS_SIZES))
     User = get_user_model()
 
-    if pk > 0:
+    if int(pk) > 0:
         try:
             user = User.objects.get(pk=pk)
 

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

@@ -7,6 +7,7 @@ from django.db.transaction import atomic
 from django.http import Http404, JsonResponse
 from django.shortcuts import render as django_render
 from django.shortcuts import redirect
+from django.utils import six
 from django.utils.translation import ugettext as _
 
 from misago.acl import add_acl
@@ -62,7 +63,7 @@ def render(request, template, context):
 
     for section in context['sections']:
         request.frontend_context['PROFILE_PAGES'].append({
-            'name': unicode(section['name']),
+            'name': six.text_type(section['name']),
             'icon': section['icon'],
             'meta': section.get('metadata'),
             'component': section['component'],

+ 1 - 1
misago/users/warnings.py

@@ -25,7 +25,7 @@ def fetch_user_valid_warnings(user):
 
     # expire levels
     active_warnings = []
-    for length, level in enumerate(levels.values()[1:]):
+    for length, level in enumerate(list(levels.values())[1:]):
         length += 1
         level_warnings = []
         if level.length_in_minutes: