Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Apphooks complains no module named 'app_resolver' when integrating with django-decorator-include #5797

Closed
guhuajun opened this issue Dec 10, 2016 · 4 comments

Comments

@guhuajun
Copy link

guhuajun commented Dec 10, 2016

Greetings,

I am developing a corpnet site recently. Authentication is required by default. So I have enabled login/logout and use decorator_include to make sure anonymous user will be redirected to login page.
Here is the line of code.

url(r'^', decorator_include(login_required, 'cms.urls'))

It works fine when Appooks are not enabled. After adding Apphooks, it raises following error. After rolling back to url(r'^', include('cms.urls')), Apphooks works again.

I am using django-cms 3.3.3.

Environment:


Request Method: GET
Request URL: http://localhost:8000/zh-hans/blog/

Django Version: 1.9.12
Python Version: 3.5.1
Installed Applications:
('djangocms_admin_style',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.admin',
 'django.contrib.sites',
 'django.contrib.sitemaps',
 'django.contrib.staticfiles',
 'django.contrib.messages',
 'cms',
 'menus',
 'sekizai',
 'treebeard',
 'djangocms_text_ckeditor',
 'filer',
 'easy_thumbnails',
 'djangocms_column',
 'djangocms_link',
 'cmsplugin_filer_file',
 'cmsplugin_filer_folder',
 'cmsplugin_filer_image',
 'cmsplugin_filer_utils',
 'djangocms_style',
 'djangocms_snippet',
 'djangocms_googlemap',
 'djangocms_video',
 'reversion',
 'cmsdemo',
 'blog')
Installed Middleware:
('cms.middleware.utils.ApphookReloadMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.locale.LocaleMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'cms.middleware.user.CurrentUserMiddleware',
 'cms.middleware.page.CurrentPageMiddleware',
 'cms.middleware.toolbar.ToolbarMiddleware',
 'cms.middleware.language.LanguageCookieMiddleware')



Traceback:

File "c:\codingnet\cmsdemo\env\lib\site-packages\django\core\handlers\base.py" in get_response
  123.                 response = middleware_method(request)

File "c:\codingnet\cmsdemo\env\lib\site-packages\cms\middleware\toolbar.py" in process_request
  112.         request.toolbar = CMSToolbar(request)

File "c:\codingnet\cmsdemo\env\lib\site-packages\cms\toolbar\toolbar.py" in __init__
  72.                 decorator = resolve(self.request.path_info).func

File "c:\codingnet\cmsdemo\env\lib\site-packages\django\core\urlresolvers.py" in resolve
  534.     return get_resolver(urlconf).resolve(path)

File "c:\codingnet\cmsdemo\env\lib\site-packages\django\core\urlresolvers.py" in resolve
  376.                     sub_match = pattern.resolve(new_path)

File "c:\codingnet\cmsdemo\env\lib\site-packages\django\core\urlresolvers.py" in resolve
  376.                     sub_match = pattern.resolve(new_path)

File "c:\codingnet\cmsdemo\env\lib\site-packages\django\core\urlresolvers.py" in resolve
  376.                     sub_match = pattern.resolve(new_path)

File "c:\codingnet\cmsdemo\env\lib\site-packages\django\core\urlresolvers.py" in resolve
  374.             for pattern in self.url_patterns:

File "c:\codingnet\cmsdemo\env\lib\site-packages\django\utils\functional.py" in __get__
  33.         res = instance.__dict__[self.name] = self.func(instance)

File "c:\codingnet\cmsdemo\env\lib\site-packages\django\core\urlresolvers.py" in url_patterns
  417.         patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)

File "c:\codingnet\cmsdemo\env\lib\site-packages\decorator_include\__init__.py" in _get_urlpatterns
  61.             patterns = self.urlconf_module.urlpatterns

File "c:\codingnet\cmsdemo\env\lib\site-packages\decorator_include\__init__.py" in _get_urlconf_module
  69.             self._urlconf_module = import_module(self.urlconf_name)

File "c:\codingnet\cmsdemo\env\lib\importlib\__init__.py" in import_module
  126.     return _bootstrap._gcd_import(name[level:], package, level)

Exception Type: ImportError at /zh-hans/blog/
Exception Value: No module named 'app_resolver'

cms_apps.py is nothing special.

from cms.app_base import CMSApp
from cms.apphook_pool import apphook_pool
from django.utils.translation import ugettext_lazy as _


class BlogApphook(CMSApp):
    app_name = "Blog"
    name = _("Blog Application")

    def get_urls(self, page=None, language=None, **kwargs):
        return ["blog.urls"]


apphook_pool.register(BlogApphook)  # register the application

Basically, it's something about the Apphook url magic in django-cms. So any hint will be appreciated.
decorator_include

@guhuajun guhuajun changed the title No module named 'app_resolver' when using django-decorator-include No module named 'app_resolver' when integrating with django-decorator-include Dec 10, 2016
@guhuajun guhuajun changed the title No module named 'app_resolver' when integrating with django-decorator-include Apphooks complains no module named 'app_resolver' when integrating with django-decorator-include Dec 10, 2016
@jrief
Copy link
Contributor

jrief commented Dec 10, 2016

When reporting bugs, you should always refer to the exact version of django-CMS, you're using.

@guhuajun
Copy link
Author

@jrief Sorry for that. I am using django-cms 3.3.3.

I am not sure if it's a django-cms bug or not. Maybe it should be categorized as an edge case. I am trying to find a workaround before next release date of my project.

@guhuajun
Copy link
Author

Quick update. It's not a django-cms bug.
decorator_include should have some code to handle url_patterns in AppRegexURLResolver.

I am inspired by the fix in following issue.
noirbizarre/django.js#7

@guhuajun
Copy link
Author

You can do something like following.

from decorator_include import DecoratedPatterns

class CmsDecoratedPatterns(DecoratedPatterns):

    def _get_urlpatterns(self):
        try:
            patterns = self.urlconf_module.urlpatterns
        except AttributeError:
            patterns = self.urlconf_module

        results = []
        for pattern in patterns:
            if pattern.__class__.__name__ != 'AppRegexURLResolver':
                results.append(self.decorate_pattern(pattern))
            else:
                for app_urlpattern in pattern.url_patterns:
                    results.append(self.decorate_pattern(app_urlpattern))
        return results
    urlpatterns = property(_get_urlpatterns)

def decorator_include(decorators, arg, namespace=None, app_name=None):
    if isinstance(arg, tuple):
        if namespace:
            raise ImproperlyConfigured(
                'Cannot override the namespace for a dynamic module that provides a namespace'
            )
        urlconf, app_name, namespace = arg
    else:
        urlconf = arg
    decorated_urlconf = CmsDecoratedPatterns(urlconf, decorators)
    return (decorated_urlconf, app_name, namespace)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants