Browse Source

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

Rafał Pitoń 8 years ago
parent
commit
5693d86046

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

@@ -8,7 +8,7 @@ from django.utils import six
 
 
 from misago.core.utils import (
 from misago.core.utils import (
     clean_return_path, format_plaintext_for_html, is_referer_local, is_request_to_misago,
     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/", )
 VALID_PATHS = ("/", "/threads/", )
@@ -41,33 +41,6 @@ class IsRequestToMisagoTests(TestCase):
 
 
 
 
 class SlugifyTests(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):
     def test_valid_slugify_output(self):
         """Misago's slugify correctly slugifies string"""
         """Misago's slugify correctly slugifies string"""
         test_cases = [
         test_cases = [

+ 2 - 14
misago/core/utils.py

@@ -1,29 +1,17 @@
 from datetime import datetime, timedelta
 from datetime import datetime, timedelta
-from importlib import import_module
 
 
 from django.conf import settings
 from django.conf import settings
 from django.http import Http404
 from django.http import Http404
 from django.urls import resolve, reverse
 from django.urls import resolve, reverse
 from django.utils import html, timezone
 from django.utils import html, timezone
 from django.utils.encoding import force_text
 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')
 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):
 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.core.exceptions import PermissionDenied
+from django.utils.module_loading import import_string
 
 
 from misago.conf import settings
 from misago.conf import settings
 
 
@@ -17,20 +16,7 @@ class SearchProviders(object):
             return
             return
         self._initialized = True
         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):
     def get_providers(self, request):
         if not self._initialized:
         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.core.exceptions import PermissionDenied
 from django.utils import timezone
 from django.utils import timezone
+from django.utils.module_loading import import_string
 
 
 from misago.conf import settings
 from misago.conf import settings
 
 
@@ -56,11 +55,7 @@ class PostingEndpoint(object):
 
 
         middlewares = []
         middlewares = []
         for middleware in settings.MISAGO_POSTING_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:
             try:
                 middleware_obj = middleware_class(prefix=middleware, **kwargs)
                 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.conf import settings
 from misago.core.testproject.validators import test_post_validator
 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):
 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
 from misago.conf import settings
 
 
@@ -19,8 +19,7 @@ class TreesMap(object):
     def load_types(self, types_modules):
     def load_types(self, types_modules):
         loaded_types = {}
         loaded_types = {}
         for path in types_modules:
         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()
             loaded_types[type_cls.root_name] = type_cls()
         return loaded_types
         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.core.exceptions import ValidationError
+from django.utils.module_loading import import_string
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 from django.utils.translation import ungettext
 from django.utils.translation import ungettext
 
 
@@ -108,16 +107,8 @@ def validate_post_length(post):
 
 
 
 
 # Post validation framework
 # 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
 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):
 def validate_post(context, data, validators=None):

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

@@ -1,8 +1,9 @@
 import os
 import os
-from importlib import import_module
 
 
 from PIL import Image, ImageColor, ImageDraw, ImageFont
 from PIL import Image, ImageColor, ImageDraw, ImageFont
 
 
+from django.utils.module_loading import import_string
+
 from misago.conf import settings
 from misago.conf import settings
 
 
 from . import store
 from . import store
@@ -18,11 +19,7 @@ FONT_FILE = os.path.join(os.path.dirname(__file__), 'font.ttf')
 
 
 
 
 def set_avatar(user):
 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)
     image = drawer_function(user)
     store.store_new_avatar(user, image)
     store.store_new_avatar(user, image)

+ 2 - 10
misago/users/validators.py

@@ -1,6 +1,5 @@
 import json
 import json
 import re
 import re
-from importlib import import_module
 
 
 import requests
 import requests
 
 
@@ -8,6 +7,7 @@ from django.contrib.auth import get_user_model
 from django.core.exceptions import ValidationError
 from django.core.exceptions import 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.encoding import force_str
 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 ugettext_lazy as _
 from django.utils.translation import ungettext
 from django.utils.translation import ungettext
 
 
@@ -137,16 +137,8 @@ def validate_gmail_email(request, form, cleaned_data):
 
 
 
 
 # Registration validation
 # 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
 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):
 def validate_new_registration(request, form, cleaned_data, validators=None):