Browse Source

fix patterns, url and BeautifulSoup deprecations

Rafał Pitoń 9 years ago
parent
commit
1e2972b46b

+ 6 - 12
misago/admin/urlpatterns.py

@@ -1,4 +1,4 @@
-from django.conf.urls import patterns, url, include
+from django.conf.urls import url, include
 
 
 class URLPatterns(object):
@@ -16,7 +16,7 @@ class URLPatterns(object):
     def patterns(self, namespace, *urlpatterns):
         self._patterns.append({
             'namespace': namespace,
-            'urlpatterns': patterns('', *urlpatterns),
+            'urlpatterns': urlpatterns,
             })
 
     def get_child_patterns(self, parent):
@@ -27,11 +27,8 @@ class URLPatterns(object):
             if namespace['parent'] == parent:
                 prefixed_namespace = prefix + namespace['namespace']
                 urlpatterns = self.get_child_patterns(prefixed_namespace)
-                included_patterns = include(urlpatterns,
-                                            namespace=namespace['namespace'])
-                namespace_urlpatterns += patterns('',
-                    url(namespace['path'], included_patterns)
-                )
+                included_patterns = include(urlpatterns, namespace=namespace['namespace'])
+                namespace_urlpatterns.append(url(namespace['path'], included_patterns))
 
         return namespace_urlpatterns
 
@@ -49,11 +46,8 @@ class URLPatterns(object):
         for namespace in self._namespaces:
             if not namespace['parent']:
                 urlpatterns = self.get_child_patterns(namespace['namespace'])
-                included_patterns = include(urlpatterns,
-                                            namespace=namespace['namespace'])
-                root_urlpatterns += patterns('',
-                    url(namespace['path'], included_patterns)
-                )
+                included_patterns = include(urlpatterns, namespace=namespace['namespace'])
+                root_urlpatterns.append(url(namespace['path'], included_patterns))
 
         return root_urlpatterns
 

+ 7 - 5
misago/admin/urls.py

@@ -1,15 +1,17 @@
 from django.conf.urls import patterns, include, url
+
 from misago import admin
+from misago.admin.views import auth, index
 
 
-urlpatterns = patterns('misago.admin.views',
+urlpatterns = [
     # "misago:admin:index" link symbolises "root" of Misago admin links space
     # any request with path that falls below this one is assumed to be directed
     # at Misago Admin and will be checked by Misago Admin Middleware
-    url(r'^$', 'index.admin_index', name='index'),
-    url(r'^resolve-version/$', 'index.check_version', name='check-version'),
-    url(r'^logout/$', 'auth.logout', name='logout'),
-)
+    url(r'^$', index.admin_index, name='index'),
+    url(r'^resolve-version/$', index.check_version, name='check-version'),
+    url(r'^logout/$', auth.logout, name='logout'),
+]
 
 
 # Discover admin and register patterns

+ 9 - 9
misago/categories/urls/__init__.py

@@ -1,5 +1,8 @@
 from django.conf import settings
-from django.conf.urls import patterns, url
+from django.conf.urls import url
+
+from misago.core.views import home_redirect
+from misago.categories.views import categories
 
 
 if settings.MISAGO_CATEGORIES_ON_INDEX:
@@ -8,12 +11,9 @@ else:
     URL_PATH = r'^categories/$'
 
 
-urlpatterns = patterns('misago.categories.views',
-    url(URL_PATH, 'categories', name='categories'),
-)
-
+urlpatterns = [
+    url(URL_PATH, categories, name='categories'),
 
-# fallback for after we changed index setting
-urlpatterns += patterns('misago.core.views',
-    url(r'^categories/$', 'home_redirect'),
-)
+    # fallback for after we changed index setting
+    url(r'^categories/$', home_redirect),
+]

+ 5 - 4
misago/categories/urls/api.py

@@ -1,6 +1,7 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
+from misago.categories.views import api
 
 
-urlpatterns = patterns('misago.categories.views',
-    url(r'^categories/$', 'api', name='categories'),
-)
+urlpatterns = [
+    url(r'^categories/$', api, name='categories'),
+]

+ 3 - 2
misago/conf/admin.py

@@ -1,5 +1,6 @@
 from django.conf.urls import url
 from django.utils.translation import ugettext_lazy as _
+from misago.conf import views
 
 
 class MisagoAdminExtension(object):
@@ -7,8 +8,8 @@ class MisagoAdminExtension(object):
         urlpatterns.namespace(r'^settings/', 'settings')
 
         urlpatterns.patterns('settings',
-            url(r'^$', 'misago.conf.views.index', name='index'),
-            url(r'^(?P<key>(\w|-)+)/$', 'misago.conf.views.group', name='group'),
+            url(r'^$', views.index, name='index'),
+            url(r'^(?P<key>(\w|-)+)/$', views.group, name='group'),
         )
 
     def register_navigation_nodes(self, site):

+ 18 - 18
misago/core/testproject/urls.py

@@ -1,4 +1,4 @@
-from django.conf.urls import patterns, include, url
+from django.conf.urls import include, url
 
 # Setup Django admin to work with Misago auth
 from django.contrib import admin
@@ -8,23 +8,23 @@ admin.autodiscover()
 admin.site.login_form = AdminAuthenticationForm
 
 
-urlpatterns = patterns('',
+from misago.core.testproject import views
+
+urlpatterns = [
     url(r'^forum/', include('misago.urls', namespace='misago')),
     url(r'^django-admin/', include(admin.site.urls)),
-)
 
-urlpatterns += patterns('misago.core.testproject.views',
-    url(r'^forum/test-mail-user/$', 'test_mail_user', name='test-mail-user'),
-    url(r'^forum/test-mail-users/$', 'test_mail_users', name='test-mail-users'),
-    url(r'^forum/test-pagination/$', 'test_pagination', name='test-pagination'),
-    url(r'^forum/test-pagination/(?P<page>[1-9][0-9]*)/$', 'test_pagination', name='test-pagination'),
-    url(r'^forum/test-valid-slug/(?P<slug>[a-z0-9\-]+)-(?P<pk>\d+)/$', 'validate_slug_view', name='validate-slug-view'),
-    url(r'^forum/test-banned/$', 'raise_misago_banned', name='raise-misago-banned'),
-    url(r'^forum/test-403/$', 'raise_misago_403', name='raise-misago-403'),
-    url(r'^forum/test-404/$', 'raise_misago_404', name='raise-misago-404'),
-    url(r'^forum/test-405/$', 'raise_misago_405', name='raise-misago-405'),
-    url(r'^test-403/$', 'raise_403', name='raise-403'),
-    url(r'^test-404/$', 'raise_404', name='raise-404'),
-    url(r'^test-redirect/$', 'test_redirect', name='test-redirect'),
-    url(r'^test-require-post/$', 'test_require_post', name='test-require-post'),
-)
+    url(r'^forum/test-mail-user/$', views.test_mail_user, name='test-mail-user'),
+    url(r'^forum/test-mail-users/$', views.test_mail_users, name='test-mail-users'),
+    url(r'^forum/test-pagination/$', views.test_pagination, name='test-pagination'),
+    url(r'^forum/test-pagination/(?P<page>[1-9][0-9]*)/$', views.test_pagination, name='test-pagination'),
+    url(r'^forum/test-valid-slug/(?P<slug>[a-z0-9\-]+)-(?P<pk>\d+)/$', views.validate_slug_view, name='validate-slug-view'),
+    url(r'^forum/test-banned/$', views.raise_misago_banned, name='raise-misago-banned'),
+    url(r'^forum/test-403/$', views.raise_misago_403, name='raise-misago-403'),
+    url(r'^forum/test-404/$', views.raise_misago_404, name='raise-misago-404'),
+    url(r'^forum/test-405/$', views.raise_misago_405, name='raise-misago-405'),
+    url(r'^test-403/$', views.raise_403, name='raise-403'),
+    url(r'^test-404/$', views.raise_404, name='raise-404'),
+    url(r'^test-redirect/$', views.test_redirect, name='test-redirect'),
+    url(r'^test-require-post/$', views.test_require_post, name='test-require-post'),
+]

+ 60 - 61
misago/legal/tests.py

@@ -11,136 +11,135 @@ class MockRequest(object):
         self.frontend_context = {}
 
 
-
-class TermsOfServiceTests(TestCase):
+class PrivacyPolicyTests(TestCase):
     def tearDown(self):
         settings.reset_settings()
 
-    def test_404_on_no_tos(self):
-        """TOS view returns 404 when no TOS is set"""
-        self.assertFalse(settings.terms_of_service_link)
-        self.assertFalse(settings.terms_of_service)
+    def test_404_on_no_policy(self):
+        """policy view returns 404 when no policy is set"""
+        self.assertFalse(settings.privacy_policy_link)
+        self.assertFalse(settings.privacy_policy)
 
-        response = self.client.get(reverse('misago:terms-of-service'))
+        response = self.client.get(reverse('misago:privacy-policy'))
         self.assertEqual(response.status_code, 404)
 
-    def test_301_on_link_tos(self):
-        """TOS view returns 302 redirect when link is set"""
-        settings.override_setting('terms_of_service_link', 'http://test.com')
-        settings.override_setting('terms_of_service', 'Lorem ipsum')
-        self.assertTrue(settings.terms_of_service_link)
-        self.assertTrue(settings.terms_of_service)
+    def test_301_on_link_policy(self):
+        """policy view returns 302 redirect when link is set"""
+        settings.override_setting('privacy_policy_link', 'http://test.com')
+        settings.override_setting('privacy_policy', 'Lorem ipsum')
+        self.assertTrue(settings.privacy_policy_link)
+        self.assertTrue(settings.privacy_policy)
 
-        response = self.client.get(reverse('misago:terms-of-service'))
+        response = self.client.get(reverse('misago:privacy-policy'))
         self.assertEqual(response.status_code, 302)
         self.assertEqual(response['location'], 'http://test.com')
 
-    def test_200_on_link_tos(self):
-        """TOS view returns 200 when custom tos content is set"""
-        settings.override_setting('terms_of_service_title', 'Test ToS')
-        settings.override_setting('terms_of_service', 'Lorem ipsum dolor')
-        self.assertTrue(settings.terms_of_service_title)
-        self.assertTrue(settings.terms_of_service)
+    def test_200_on_link_policy(self):
+        """policy view returns 200 when custom tos content is set"""
+        settings.override_setting('privacy_policy_title', 'Test Policy')
+        settings.override_setting('privacy_policy', 'Lorem ipsum dolor')
+        self.assertTrue(settings.privacy_policy_title)
+        self.assertTrue(settings.privacy_policy)
 
-        response = self.client.get(reverse('misago:terms-of-service'))
+        response = self.client.get(reverse('misago:privacy-policy'))
         self.assertEqual(response.status_code, 200)
-        self.assertIn('Test ToS', response.content)
+        self.assertIn('Test Policy', response.content)
         self.assertIn('Lorem ipsum dolor', response.content)
 
-    def test_context_processor_no_tos(self):
+    def test_context_processor_no_policy(self):
         """context processor has no TOS link"""
         context_dict = legal_links(MockRequest())
         self.assertFalse(context_dict)
 
-    def test_context_processor_misago_tos(self):
+    def test_context_processor_misago_policy(self):
         """context processor has TOS link to Misago view"""
-        settings.override_setting('terms_of_service', 'Lorem ipsum')
+        settings.override_setting('privacy_policy', 'Lorem ipsum')
         context_dict = legal_links(MockRequest())
 
         self.assertEqual(context_dict, {
-            'TERMS_OF_SERVICE_URL': reverse('misago:terms-of-service')
+            'PRIVACY_POLICY_URL': reverse('misago:privacy-policy')
         })
 
-    def test_context_processor_remote_tos(self):
+    def test_context_processor_remote_policy(self):
         """context processor has TOS link to remote url"""
-        settings.override_setting('terms_of_service_link', 'http://test.com')
+        settings.override_setting('privacy_policy_link', 'http://test.com')
         context_dict = legal_links(MockRequest())
 
         self.assertEqual(context_dict, {
-            'TERMS_OF_SERVICE_URL': 'http://test.com'
+            'PRIVACY_POLICY_URL': 'http://test.com'
         })
 
         # set misago view too
-        settings.override_setting('terms_of_service', 'Lorem ipsum')
+        settings.override_setting('privacy_policy', 'Lorem ipsum')
         context_dict = legal_links(MockRequest())
 
         self.assertEqual(context_dict, {
-            'TERMS_OF_SERVICE_URL': 'http://test.com'
+            'PRIVACY_POLICY_URL': 'http://test.com'
         })
 
 
-class PrivacyPolicyTests(TestCase):
+class TermsOfServiceTests(TestCase):
     def tearDown(self):
         settings.reset_settings()
 
-    def test_404_on_no_policy(self):
-        """policy view returns 404 when no policy is set"""
-        self.assertFalse(settings.privacy_policy_link)
-        self.assertFalse(settings.privacy_policy)
+    def test_404_on_no_tos(self):
+        """TOS view returns 404 when no TOS is set"""
+        self.assertFalse(settings.terms_of_service_link)
+        self.assertFalse(settings.terms_of_service)
 
-        response = self.client.get(reverse('misago:privacy-policy'))
+        response = self.client.get(reverse('misago:terms-of-service'))
         self.assertEqual(response.status_code, 404)
 
-    def test_301_on_link_policy(self):
-        """policy view returns 302 redirect when link is set"""
-        settings.override_setting('privacy_policy_link', 'http://test.com')
-        settings.override_setting('privacy_policy', 'Lorem ipsum')
-        self.assertTrue(settings.privacy_policy_link)
-        self.assertTrue(settings.privacy_policy)
+    def test_301_on_link_tos(self):
+        """TOS view returns 302 redirect when link is set"""
+        settings.override_setting('terms_of_service_link', 'http://test.com')
+        settings.override_setting('terms_of_service', 'Lorem ipsum')
+        self.assertTrue(settings.terms_of_service_link)
+        self.assertTrue(settings.terms_of_service)
 
-        response = self.client.get(reverse('misago:privacy-policy'))
+        response = self.client.get(reverse('misago:terms-of-service'))
         self.assertEqual(response.status_code, 302)
         self.assertEqual(response['location'], 'http://test.com')
 
-    def test_200_on_link_policy(self):
-        """policy view returns 200 when custom tos content is set"""
-        settings.override_setting('privacy_policy_title', 'Test Policy')
-        settings.override_setting('privacy_policy', 'Lorem ipsum dolor')
-        self.assertTrue(settings.privacy_policy_title)
-        self.assertTrue(settings.privacy_policy)
+    def test_200_on_link_tos(self):
+        """TOS view returns 200 when custom tos content is set"""
+        settings.override_setting('terms_of_service_title', 'Test ToS')
+        settings.override_setting('terms_of_service', 'Lorem ipsum dolor')
+        self.assertTrue(settings.terms_of_service_title)
+        self.assertTrue(settings.terms_of_service)
 
-        response = self.client.get(reverse('misago:privacy-policy'))
+        response = self.client.get(reverse('misago:terms-of-service'))
         self.assertEqual(response.status_code, 200)
-        self.assertIn('Test Policy', response.content)
+        self.assertIn('Test ToS', response.content)
         self.assertIn('Lorem ipsum dolor', response.content)
 
-    def test_context_processor_no_policy(self):
+    def test_context_processor_no_tos(self):
         """context processor has no TOS link"""
         context_dict = legal_links(MockRequest())
         self.assertFalse(context_dict)
 
-    def test_context_processor_misago_policy(self):
+    def test_context_processor_misago_tos(self):
         """context processor has TOS link to Misago view"""
-        settings.override_setting('privacy_policy', 'Lorem ipsum')
+        settings.override_setting('terms_of_service', 'Lorem ipsum')
         context_dict = legal_links(MockRequest())
 
         self.assertEqual(context_dict, {
-            'PRIVACY_POLICY_URL': reverse('misago:privacy-policy')
+            'TERMS_OF_SERVICE_URL': reverse('misago:terms-of-service')
         })
 
-    def test_context_processor_remote_policy(self):
+    def test_context_processor_remote_tos(self):
         """context processor has TOS link to remote url"""
-        settings.override_setting('privacy_policy_link', 'http://test.com')
+        settings.override_setting('terms_of_service_link', 'http://test.com')
         context_dict = legal_links(MockRequest())
 
         self.assertEqual(context_dict, {
-            'PRIVACY_POLICY_URL': 'http://test.com'
+            'TERMS_OF_SERVICE_URL': 'http://test.com'
         })
 
         # set misago view too
-        settings.override_setting('privacy_policy', 'Lorem ipsum')
+        settings.override_setting('terms_of_service', 'Lorem ipsum')
         context_dict = legal_links(MockRequest())
 
         self.assertEqual(context_dict, {
-            'PRIVACY_POLICY_URL': 'http://test.com'
+            'TERMS_OF_SERVICE_URL': 'http://test.com'
         })

+ 6 - 5
misago/legal/urls.py

@@ -1,7 +1,8 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
+from misago.legal.views import privacy_policy, terms_of_service
 
 
-urlpatterns = patterns('misago.legal.views',
-    url(r'^terms-of-service/$', 'terms_of_service', name='terms-of-service'),
-    url(r'^privacy-policy/$', 'privacy_policy', name='privacy-policy'),
-)
+urlpatterns = [
+    url(r'^privacy-policy/$', privacy_policy, name='privacy-policy'),
+    url(r'^terms-of-service/$', terms_of_service, name='terms-of-service'),
+]

+ 17 - 17
misago/legal/views.py

@@ -30,23 +30,6 @@ def get_parsed_content(request, setting_name):
         return cached_content['parsed']
 
 
-def terms_of_service(request):
-    if not (settings.terms_of_service or settings.terms_of_service_link):
-        raise Http404()
-
-    if settings.terms_of_service_link:
-        return redirect(settings.terms_of_service_link)
-
-    parsed_content = get_parsed_content(request, 'terms_of_service')
-
-    return render(request, 'misago/terms_of_service.html', {
-            'id': 'terms-of-service',
-            'title': settings.terms_of_service_title or _("Terms of service"),
-            'link': settings.terms_of_service_link,
-            'body': parsed_content,
-        })
-
-
 def privacy_policy(request):
     if not (settings.privacy_policy or settings.privacy_policy_link):
         raise Http404()
@@ -62,3 +45,20 @@ def privacy_policy(request):
             'link': settings.privacy_policy_link,
             'body': parsed_content,
         })
+
+
+def terms_of_service(request):
+    if not (settings.terms_of_service or settings.terms_of_service_link):
+        raise Http404()
+
+    if settings.terms_of_service_link:
+        return redirect(settings.terms_of_service_link)
+
+    parsed_content = get_parsed_content(request, 'terms_of_service')
+
+    return render(request, 'misago/terms_of_service.html', {
+            'id': 'terms-of-service',
+            'title': settings.terms_of_service_title or _("Terms of service"),
+            'link': settings.terms_of_service_link,
+            'body': parsed_content,
+        })

+ 7 - 6
misago/markup/parser.py

@@ -23,8 +23,11 @@ def parse(text, request, poster, allow_mentions=True, allow_links=True,
 
     Returns dict object
     """
-    md = md_factory(allow_links=allow_links, allow_images=allow_images,
-                    allow_blocks=allow_blocks)
+    md = md_factory(
+        allow_links=allow_links,
+        allow_images=allow_images,
+        allow_blocks=allow_blocks,
+    )
 
     parsing_result = {
         'original_text': text,
@@ -92,9 +95,7 @@ def md_factory(allow_links=True, allow_images=True, allow_blocks=True):
 
     if allow_blocks:
         # Add [hr] [quote], [spoiler], [list] and [code] blocks
-        md.parser.blockprocessors.add('bb_hr',
-                                      blocks.BBCodeHRProcessor(md.parser),
-                                      '>hr')
+        md.parser.blockprocessors.add('bb_hr', blocks.BBCodeHRProcessor(md.parser), '>hr')
     else:
         # Remove blocks
         del md.parser.blockprocessors['hashheader']
@@ -116,7 +117,7 @@ def linkify_paragraphs(result):
 def clean_links(result, request):
     site_address = '%s://%s' % (request.scheme, request.get_host())
 
-    soup = BeautifulSoup(result['parsed_text'])
+    soup = BeautifulSoup(result['parsed_text'], 'html5lib')
     for link in soup.find_all('a'):
         if link['href'].lower().startswith(site_address):
             result['inside_links'].append(link['href'])

+ 1 - 1
misago/markup/pipeline.py

@@ -17,7 +17,7 @@ class MarkupPipeline(object):
         return md
 
     def process_result(self, result):
-        soup = BeautifulSoup(result['parsed_text'])
+        soup = BeautifulSoup(result['parsed_text'], 'html5lib')
         for extension in settings.MISAGO_MARKUP_EXTENSIONS:
             module = import_module(extension)
             if hasattr(module, 'clean_parsed'):

+ 7 - 5
misago/project_template/project_name/urls.py

@@ -1,5 +1,5 @@
 from django.conf import settings
-from django.conf.urls import patterns, include, url
+from django.conf.urls import include, url
 
 # Setup Django admin to work with Misago auth
 from django.contrib import admin
@@ -9,19 +9,21 @@ admin.autodiscover()
 admin.site.login_form = AdminAuthenticationForm
 
 
-urlpatterns = patterns('',
+from misago.core.views import javascript_catalog, momentjs_catalog
+
+urlpatterns = [
     url(r'^', include('misago.urls', namespace='misago')),
 
     # Javascript translations
-    url(r'^django-i18n.js$', 'misago.core.views.javascript_catalog'),
-    url(r'^moment-i18n.js$', 'misago.core.views.momentjs_catalog'),
+    url(r'^django-i18n.js$', javascript_catalog),
+    url(r'^moment-i18n.js$', momentjs_catalog),
 
     # Uncomment next line if you plan to use Django admin for 3rd party apps
     #url(r'^django-admin/', include(admin.site.urls)),
 
     # Uncomment next line if you plan to use browseable API
     #url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
-)
+]
 
 
 # Serve static and media files in development

+ 20 - 20
misago/urls.py

@@ -1,53 +1,53 @@
 from django.conf import settings
-from django.conf.urls import patterns, include, url
+from django.conf.urls import include, url
+from misago.core.views import forum_index
 
 
 # Register Misago Apps
-urlpatterns = patterns('',
+urlpatterns = [
     url(r'^', include('misago.legal.urls')),
     url(r'^', include('misago.users.urls')),
     url(r'^', include('misago.categories.urls')),
     url(r'^', include('misago.threads.urls')),
-)
 
-urlpatterns += patterns('misago.core.views',
     # "misago:index" link symbolises "root" of Misago links space
     # any request with path that falls below this one is assumed to be directed
     # at Misago and will be handled by misago.views.exceptionhandler if it
     # results in Http404 or PermissionDenied exception
-    url(r'^$', 'forum_index', name='index'),
-)
+    url(r'^$', forum_index, name='index'),
+]
 
 # Register API
-apipatterns = patterns('',
+apipatterns = [
     url(r'^', include('misago.categories.urls.api')),
     url(r'^', include('misago.threads.urls.api')),
     url(r'^', include('misago.users.urls.api')),
-)
+]
 
-urlpatterns += patterns('',
+urlpatterns += [
     url(r'^api/', include(apipatterns, namespace='api')),
-)
+]
 
 
 # Register Misago ACP
 if settings.MISAGO_ADMIN_PATH:
     # Admin patterns recognised by Misago
-    adminpatterns = patterns('',
+    adminpatterns = [
         url(r'^', include('misago.admin.urls')),
-    )
+    ]
 
     admin_prefix = r'^%s/' % settings.MISAGO_ADMIN_PATH
-    urlpatterns += patterns('',
+    urlpatterns += [
         url(admin_prefix, include(adminpatterns, namespace='admin')),
-    )
+    ]
 
 
 # Make error pages accessible casually in DEBUG
 if settings.DEBUG:
-    urlpatterns += patterns('misago.core.errorpages',
-        url(r'^403/$', 'permission_denied'),
-        url(r'^404/$', 'page_not_found'),
-        url(r'^405/$', 'not_allowed'),
-        url(r'^csrf-failure/$', 'csrf_failure'),
-    )
+    from misago.core import errorpages
+    urlpatterns += [
+        url(r'^403/$', errorpages.permission_denied),
+        url(r'^404/$', errorpages.page_not_found),
+        url(r'^405/$', errorpages.not_allowed),
+        url(r'^csrf-failure/$', errorpages.csrf_failure),
+    ]

+ 47 - 54
misago/users/urls/__init__.py

@@ -1,69 +1,62 @@
-from django.conf.urls import include, patterns, url
+from django.conf.urls import include, url
+from misago.core.views import home_redirect
+from misago.users.views import activation, auth, avatarserver, forgottenpassword, lists, options, profile
 
 
-urlpatterns = patterns('misago.core.views',
-    url(r'^banned/$', 'home_redirect', name='banned')
-)
+urlpatterns = [
+    url(r'^banned/$', home_redirect, name='banned'),
 
+    url(r'^login/$', auth.login, name='login'),
+    url(r'^logout/$', auth.logout, name='logout'),
 
-urlpatterns += patterns('misago.users.views.auth',
-    url(r'^login/$', 'login', name='login'),
-    url(r'^logout/$', 'logout', name='logout'),
-)
+    url(r'^request-activation/$', activation.request_activation, name="request-activation"),
+    url(r'^activation/(?P<pk>\d+)/(?P<token>[a-zA-Z0-9]+)/$', activation.activate_by_token, name="activate-by-token"),
 
+    url(r'^forgotten-password/$', forgottenpassword.request_reset, name='forgotten-password'),
+    url(r'^forgotten-password/(?P<pk>\d+)/(?P<token>[a-zA-Z0-9]+)/$', forgottenpassword.reset_password_form, name='forgotten-password-change-form'),
+]
 
-urlpatterns += patterns('misago.users.views.activation',
-    url(r'^request-activation/$', 'request_activation', name="request-activation"),
-    url(r'^activation/(?P<pk>\d+)/(?P<token>[a-zA-Z0-9]+)/$', 'activate_by_token', name="activate-by-token"),
-)
 
+urlpatterns += [
+    url(r'^options/$', options.index, name='options'),
+    url(r'^options/(?P<form_name>[-a-zA-Z]+)/$', options.index, name='options-form'),
 
-urlpatterns += patterns('misago.users.views.forgottenpassword',
-    url(r'^forgotten-password/$', 'request_reset', name='forgotten-password'),
-    url(r'^forgotten-password/(?P<pk>\d+)/(?P<token>[a-zA-Z0-9]+)/$', 'reset_password_form', name='forgotten-password-change-form'),
-)
+    url(r'^options/forum-options/$', options.index, name='usercp-change-forum-options'),
+    url(r'^options/change-username/$', options.index, name='usercp-change-username'),
+    url(r'^options/sign-in-credentials/$', options.index, name='usercp-change-email-password'),
 
+    url(r'^options/change-email/(?P<token>[a-zA-Z0-9]+)/$', options.confirm_email_change, name='options-confirm-email-change'),
+    url(r'^options/change-password/(?P<token>[a-zA-Z0-9]+)/$', options.confirm_password_change, name='options-confirm-password-change'),
+]
 
-urlpatterns += patterns('misago.users.views.options',
-    url(r'^options/$', 'index', name='options'),
-    url(r'^options/(?P<form_name>[-a-zA-Z]+)/$', 'index', name='options-form'),
 
-    url(r'^options/forum-options/$', 'index', name='usercp-change-forum-options'),
-    url(r'^options/change-username/$', 'index', name='usercp-change-username'),
-    url(r'^options/sign-in-credentials/$', 'index', name='usercp-change-email-password'),
+urlpatterns += [
+    url(r'^users/', include([
+        url(r'^$', lists.landing, name="users"),
+        url(r'^active-posters/$', lists.active_posters, name="users-active-posters"),
+        url(r'^(?P<slug>[-a-zA-Z0-9]+)/$', lists.rank, name="users-rank"),
+        url(r'^(?P<slug>[-a-zA-Z0-9]+)/(?P<page>\d+)/$', lists.rank, name="users-rank"),
+    ]))
+]
 
-    url(r'^options/change-email/(?P<token>[a-zA-Z0-9]+)/$', 'confirm_email_change', name='options-confirm-email-change'),
-    url(r'^options/change-password/(?P<token>[a-zA-Z0-9]+)/$', 'confirm_password_change', name='options-confirm-password-change'),
-)
 
+urlpatterns += [
+    url(r'^user/(?P<slug>[a-zA-Z0-9]+)-(?P<pk>\d+)/', include([
+        url(r'^$', profile.landing, name="user"),
+        url(r'^posts/$', profile.posts, name="user-posts"),
+        url(r'^threads/$', profile.threads, name="user-threads"),
+        url(r'^followers/$', profile.followers, name="user-followers"),
+        url(r'^follows/$', profile.follows, name="user-follows"),
+        url(r'^username-history/$', profile.username_history, name="username-history"),
+        url(r'^ban-details/$', profile.user_ban, name="user-ban"),
+    ]))
+]
 
-urlpatterns += patterns('',
-    url(r'^users/', include(patterns('misago.users.views.lists',
-        url(r'^$', 'lander', name="users"),
-        url(r'^active-posters/$', 'active_posters', name="users-active-posters"),
-        url(r'^(?P<slug>[-a-zA-Z0-9]+)/$', 'rank', name="users-rank"),
-        url(r'^(?P<slug>[-a-zA-Z0-9]+)/(?P<page>\d+)/$', 'rank', name="users-rank"),
-    )))
-)
 
-
-urlpatterns += patterns('',
-    url(r'^user/(?P<slug>[a-zA-Z0-9]+)-(?P<pk>\d+)/', include(patterns('misago.users.views.profile',
-        url(r'^$', 'lander', name="user"),
-        url(r'^posts/$', 'posts', name="user-posts"),
-        url(r'^threads/$', 'threads', name="user-threads"),
-        url(r'^followers/$', 'followers', name="user-followers"),
-        url(r'^follows/$', 'follows', name="user-follows"),
-        url(r'^username-history/$', 'username_history', name="username-history"),
-        url(r'^ban-details/$', 'user_ban', name="user-ban"),
-    )))
-)
-
-
-urlpatterns += patterns('',
-    url(r'^user-avatar/', include(patterns('misago.users.views.avatarserver',
-        url(r'^(?P<hash>[a-f0-9]+)/(?P<size>\d+)/(?P<pk>\d+)\.png$', 'serve_user_avatar', name="user-avatar"),
-        url(r'^(?P<secret>[a-f0-9]+):(?P<hash>[a-f0-9]+)/(?P<pk>\d+)\.png$', 'serve_user_avatar_source', name="user-avatar-source"),
-        url(r'^(?P<size>\d+)\.png$', 'serve_blank_avatar', name="blank-avatar"),
-    )))
-)
+urlpatterns += [
+    url(r'^user-avatar/', include([
+        url(r'^(?P<hash>[a-f0-9]+)/(?P<size>\d+)/(?P<pk>\d+)\.png$', avatarserver.serve_user_avatar, name="user-avatar"),
+        url(r'^(?P<secret>[a-f0-9]+):(?P<hash>[a-f0-9]+)/(?P<pk>\d+)\.png$', avatarserver.serve_user_avatar_source, name="user-avatar-source"),
+        url(r'^(?P<size>\d+)\.png$', avatarserver.serve_blank_avatar, name="blank-avatar"),
+    ]))
+]

+ 12 - 10
misago/users/urls/api.py

@@ -1,20 +1,22 @@
-from django.conf.urls import patterns, url
+from django.conf.urls import url
+
 from misago.core.apirouter import MisagoApiRouter
+
+from misago.users.api import auth, captcha
 from misago.users.api.ranks import RanksViewSet
 from misago.users.api.users import UserViewSet
 from misago.users.api.usernamechanges import UsernameChangesViewSet
 
 
-urlpatterns = patterns('misago.users.api.auth',
-    url(r'^auth/$', 'gateway', name='auth'),
-    url(r'^auth/send-activation/$', 'send_activation', name='send-activation'),
-    url(r'^auth/send-password-form/$', 'send_password_form', name='send-password-form'),
-    url(r'^auth/change-password/(?P<pk>\d+)/(?P<token>[a-zA-Z0-9]+)/$', 'change_forgotten_password', name='change-forgotten-password'),
-)
+urlpatterns = [
+    url(r'^auth/$', auth.gateway, name='auth'),
+    url(r'^auth/send-activation/$', auth.send_activation, name='send-activation'),
+    url(r'^auth/send-password-form/$', auth.send_password_form, name='send-password-form'),
+    url(r'^auth/change-password/(?P<pk>\d+)/(?P<token>[a-zA-Z0-9]+)/$', auth.change_forgotten_password, name='change-forgotten-password'),
+
+    url(r'^captcha-question/$', captcha.question, name='captcha-question'),
+]
 
-urlpatterns += patterns('misago.users.api.captcha',
-    url(r'^captcha-question/$', 'question', name='captcha-question'),
-)
 
 router = MisagoApiRouter()
 router.register(r'ranks', RanksViewSet)

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

@@ -68,7 +68,7 @@ def allow_see_list(f):
 
 
 @allow_see_list
-def lander(request):
+def landing(request):
     default = users_list.get_default_link()
     return redirect(default)
 

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

@@ -106,7 +106,7 @@ def render(request, template, context):
 
 
 @profile_view
-def lander(request, profile):
+def landing(request, profile):
     return redirect(user_profile.get_default_link(), slug=profile.slug, pk=profile.pk)