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

fix #749: moved module imports from string to django util

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

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

@@ -8,7 +8,7 @@ from django.utils import six
 
 from misago.core.utils import (
     clean_return_path, format_plaintext_for_html, is_referer_local, is_request_to_misago,
-    parse_iso8601_string, resolve_slugify, slugify)
+    parse_iso8601_string, slugify)
 
 
 VALID_PATHS = ("/", "/threads/", )
@@ -41,33 +41,6 @@ class IsRequestToMisagoTests(TestCase):
 
 
 class SlugifyTests(TestCase):
-    def test_resolve_invalid_module(self):
-        """resolve_slugify raises import error for invalid module"""
-        with self.assertRaises(ImportError):
-            resolve_slugify('some.invalid.path')
-
-        try:
-            resolve_slugify('some.invalid.path')
-        except ImportError as e:
-            error_message = six.text_type(e)
-            self.assertEqual(error_message, 'module some.invalid does not exist')
-
-    def test_resolve_nonexistant_name(self):
-        """resolve_slugify raises import error for invalid name"""
-        with self.assertRaises(ImportError):
-            resolve_slugify('misago.threads.invalidname')
-
-        try:
-            resolve_slugify('misago.threads.invalidname')
-        except ImportError as e:
-            error_message = six.text_type(e)
-            self.assertEqual(error_message, 'name invalidname not found in misago.threads module')
-
-    def test_resolve_valid_name(self):
-        """resolve_slugify resolves valid paths"""
-        resolved_slugify = resolve_slugify('misago.core.slugify.default')
-        self.assertEqual(resolved_slugify, slugify)
-
     def test_valid_slugify_output(self):
         """Misago's slugify correctly slugifies string"""
         test_cases = [

+ 2 - 14
misago/core/utils.py

@@ -1,29 +1,17 @@
 from datetime import datetime, timedelta
-from importlib import import_module
 
 from django.conf import settings
 from django.http import Http404
 from django.urls import resolve, reverse
 from django.utils import html, timezone
 from django.utils.encoding import force_text
+from django.utils.module_loading import import_string
 
 
 MISAGO_SLUGIFY = getattr(settings, 'MISAGO_SLUGIFY', 'misago.core.slugify.default')
 
 
-def resolve_slugify(path):
-    path_bits = path.split('.')
-    module, name = '.'.join(path_bits[:-1]), path_bits[-1]
-
-    try:
-        return getattr(import_module(module), name)
-    except AttributeError:
-        raise ImportError("name {} not found in {} module".format(name, module))
-    except ImportError:
-        raise ImportError("module {} does not exist".format(module))
-
-
-slugify = resolve_slugify(MISAGO_SLUGIFY)
+slugify = import_string(MISAGO_SLUGIFY)
 
 
 def format_plaintext_for_html(string):

+ 2 - 16
misago/search/searchproviders.py

@@ -1,6 +1,5 @@
-from importlib import import_module
-
 from django.core.exceptions import PermissionDenied
+from django.utils.module_loading import import_string
 
 from misago.conf import settings
 
@@ -17,20 +16,7 @@ class SearchProviders(object):
             return
         self._initialized = True
 
-        for modulename in self.providers:
-            classname = modulename.split('.')[-1]
-            module_path = '.'.join(modulename.split('.')[:-1])
-
-            try:
-                module = import_module(module_path)
-            except ImportError:
-                raise ImportError('search module %s could not be imported' % modulename)
-
-            try:
-                classdef = getattr(module, classname)
-                self._providers.append(classdef)
-            except AttributeError:
-                raise ImportError('search module %s could not be imported' % modulename)
+        self._providers = map(import_string, self.providers)
 
     def get_providers(self, request):
         if not self._initialized:

+ 2 - 7
misago/threads/api/postingendpoint/__init__.py

@@ -1,7 +1,6 @@
-from importlib import import_module
-
 from django.core.exceptions import PermissionDenied
 from django.utils import timezone
+from django.utils.module_loading import import_string
 
 from misago.conf import settings
 
@@ -56,11 +55,7 @@ class PostingEndpoint(object):
 
         middlewares = []
         for middleware in settings.MISAGO_POSTING_MIDDLEWARES:
-            module_name = '.'.join(middleware.split('.')[:-1])
-            class_name = middleware.split('.')[-1]
-
-            middleware_module = import_module(module_name)
-            middleware_class = getattr(middleware_module, class_name)
+            middleware_class = import_string(middleware)
 
             try:
                 middleware_obj = middleware_class(prefix=middleware, **kwargs)

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

@@ -3,33 +3,7 @@ from django.test import TestCase
 
 from misago.conf import settings
 from misago.core.testproject.validators import test_post_validator
-from misago.threads.validators import load_post_validators, validate_post_length, validate_title
-
-
-class LoadPostValidatorsTests(TestCase):
-    def test_empty_list(self):
-        """empty validator list returns no validators"""
-        self.assertEqual(load_post_validators([]), [])
-
-    def test_load_validator(self):
-        """function loads validator from list"""
-        validators = load_post_validators([
-            'misago.core.testproject.validators.test_post_validator',
-        ])
-
-        self.assertEqual(validators, [test_post_validator])
-
-    def test_load_nonexistant_validator(self):
-        """nonexistant validator raises"""
-        with self.assertRaises(ImportError):
-            load_post_validators([
-                'misago.core.yaddayadda.yaddayadda',
-            ])
-
-        with self.assertRaises(AttributeError):
-            load_post_validators([
-                'misago.core.yaddayadda',
-            ])
+from misago.threads.validators import validate_post_length, validate_title
 
 
 class ValidatePostLengthTests(TestCase):

+ 2 - 3
misago/threads/threadtypes/treesmap.py

@@ -1,4 +1,4 @@
-from importlib import import_module
+from django.utils.module_loading import import_string
 
 from misago.conf import settings
 
@@ -19,8 +19,7 @@ class TreesMap(object):
     def load_types(self, types_modules):
         loaded_types = {}
         for path in types_modules:
-            module = import_module('.'.join(path.split('.')[:-1]))
-            type_cls = getattr(module, path.split('.')[-1])
+            type_cls = import_string(path)
             loaded_types[type_cls.root_name] = type_cls()
         return loaded_types
 

+ 2 - 11
misago/threads/validators.py

@@ -1,6 +1,5 @@
-from importlib import import_module
-
 from django.core.exceptions import ValidationError
+from django.utils.module_loading import import_string
 from django.utils.translation import ugettext as _
 from django.utils.translation import ungettext
 
@@ -108,16 +107,8 @@ def validate_post_length(post):
 
 
 # Post validation framework
-def load_post_validators(validators):
-    loaded_validators = []
-    for path in validators:
-        module = import_module('.'.join(path.split('.')[:-1]))
-        loaded_validators.append(getattr(module, path.split('.')[-1]))
-    return loaded_validators
-
-
 validators_list = settings.MISAGO_POST_VALIDATORS
-POST_VALIDATORS = load_post_validators(validators_list)
+POST_VALIDATORS = map(import_string, validators_list)
 
 
 def validate_post(context, data, validators=None):

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

@@ -1,8 +1,9 @@
 import os
-from importlib import import_module
 
 from PIL import Image, ImageColor, ImageDraw, ImageFont
 
+from django.utils.module_loading import import_string
+
 from misago.conf import settings
 
 from . import store
@@ -18,11 +19,7 @@ FONT_FILE = os.path.join(os.path.dirname(__file__), 'font.ttf')
 
 
 def set_avatar(user):
-    name_bits = settings.MISAGO_DYNAMIC_AVATAR_DRAWER.split('.')
-
-    drawer_module = '.'.join(name_bits[:-1])
-    drawer_module = import_module(drawer_module)
-    drawer_function = getattr(drawer_module, name_bits[-1])
+    drawer_function = import_string(settings.MISAGO_DYNAMIC_AVATAR_DRAWER)
 
     image = drawer_function(user)
     store.store_new_avatar(user, image)

+ 2 - 10
misago/users/validators.py

@@ -1,6 +1,5 @@
 import json
 import re
-from importlib import import_module
 
 import requests
 
@@ -8,6 +7,7 @@ from django.contrib.auth import get_user_model
 from django.core.exceptions import ValidationError
 from django.core.validators import validate_email as validate_email_content
 from django.utils.encoding import force_str
+from django.utils.module_loading import import_string
 from django.utils.translation import ugettext_lazy as _
 from django.utils.translation import ungettext
 
@@ -137,16 +137,8 @@ def validate_gmail_email(request, form, cleaned_data):
 
 
 # Registration validation
-def load_registration_validators(validators):
-    loaded_validators = []
-    for path in validators:
-        module = import_module('.'.join(path.split('.')[:-1]))
-        loaded_validators.append(getattr(module, path.split('.')[-1]))
-    return loaded_validators
-
-
 validators_list = settings.MISAGO_NEW_REGISTRATIONS_VALIDATORS
-REGISTRATION_VALIDATORS = load_registration_validators(validators_list)
+REGISTRATION_VALIDATORS = map(import_string, validators_list)
 
 
 def validate_new_registration(request, form, cleaned_data, validators=None):