Browse Source

#931: reorganized frontend context object

Rafał Pitoń 7 years ago
parent
commit
27326d103c

+ 2 - 3
misago/categories/views/categorieslist.py

@@ -8,9 +8,8 @@ from misago.categories.utils import get_categories_tree
 def categories(request):
 def categories(request):
     categories_tree = get_categories_tree(request.user, join_posters=True)
     categories_tree = get_categories_tree(request.user, join_posters=True)
 
 
-    request.frontend_context.update({
-        'CATEGORIES': CategorySerializer(categories_tree, many=True).data,
-        'CATEGORIES_API': reverse('misago:api:category-list'),
+    request.frontend_context['store'].update({
+        'categories': CategorySerializer(categories_tree, many=True).data,
     })
     })
 
 
     return render(request, 'misago/categories/list.html', {
     return render(request, 'misago/categories/list.html', {

+ 11 - 14
misago/conf/context_processors.py

@@ -23,22 +23,19 @@ def settings(request):
 
 
 
 
 def preload_settings_json(request):
 def preload_settings_json(request):
-    preloaded_settings = db_settings.get_public_settings()
-
-    preloaded_settings.update({
-        'LOGIN_API_URL': misago_settings.MISAGO_LOGIN_API_URL,
-        'LOGIN_REDIRECT_URL': reverse(misago_settings.LOGIN_REDIRECT_URL),
-        'LOGIN_URL': reverse(misago_settings.LOGIN_URL),
-        'LOGOUT_URL': reverse(misago_settings.LOGOUT_URL),
+    request.frontend_context['conf'].update(db_settings.get_public_settings())
+    request.frontend_context['conf'].update({
+        'csrf_cookie_name': misago_settings.CSRF_COOKIE_NAME,
+        'threads_on_index': misago_settings.MISAGO_THREADS_ON_INDEX,
     })
     })
 
 
-    request.frontend_context.update({
-        'SETTINGS': preloaded_settings,
-        'MISAGO_PATH': reverse('misago:index'),
-        'BLANK_AVATAR_URL': BLANK_AVATAR_URL,
-        'STATIC_URL': misago_settings.STATIC_URL,
-        'CSRF_COOKIE_NAME': misago_settings.CSRF_COOKIE_NAME,
-        'THREADS_ON_INDEX': misago_settings.MISAGO_THREADS_ON_INDEX,
+    request.frontend_context['url'].update({
+        'index': reverse('misago:index'),
+        'blank_avatar': BLANK_AVATAR_URL,
+        'login_redirect': reverse(misago_settings.LOGIN_REDIRECT_URL),
+        'login': reverse(misago_settings.LOGIN_URL),
+        'logout': reverse(misago_settings.LOGOUT_URL),
+        'static': misago_settings.STATIC_URL,
     })
     })
 
 
     return {}
     return {}

+ 1 - 1
misago/conf/tests/test_context_processors.py

@@ -24,4 +24,4 @@ class ContextProcessorsTests(TestCase):
         """site configuration is preloaded by middleware"""
         """site configuration is preloaded by middleware"""
         response = self.client.get('/')
         response = self.client.get('/')
         self.assertEqual(response.status_code, 200)
         self.assertEqual(response.status_code, 200)
-        self.assertContains(response, '"SETTINGS": {"')
+        self.assertContains(response, '"conf": {"')

+ 0 - 16
misago/core/context_processors.py

@@ -21,22 +21,6 @@ def site_address(request):
     }
     }
 
 
 
 
-def current_link(request):
-    if not request.resolver_match or request.frontend_context.get('CURRENT_LINK'):
-        return {}
-
-    url_name = request.resolver_match.url_name
-    if request.resolver_match.namespaces:
-        namespaces = ':'.join(request.resolver_match.namespaces)
-        link_name = '{}:{}'.format(namespaces, url_name)
-    else:
-        link_name = url_name
-
-    request.frontend_context.update({'CURRENT_LINK': link_name})
-
-    return {}
-
-
 def momentjs_locale(request):
 def momentjs_locale(request):
     return {
     return {
         'MOMENTJS_LOCALE_URL': get_locale_url(get_language()),
         'MOMENTJS_LOCALE_URL': get_locale_url(get_language()),

+ 4 - 7
misago/core/errorpages.py

@@ -15,10 +15,6 @@ def _ajax_error(code, exception=None, default_message=None):
 
 
 @admin_error_page
 @admin_error_page
 def _error_page(request, code, exception=None, default_message=None):
 def _error_page(request, code, exception=None, default_message=None):
-    request.frontend_context.update({
-        'CURRENT_LINK': 'misago:error-%s' % code,
-    })
-
     return render(
     return render(
         request, 'misago/errorpages/%s.html' % code, {
         request, 'misago/errorpages/%s.html' % code, {
             'message': get_exception_message(exception, default_message),
             'message': get_exception_message(exception, default_message),
@@ -29,9 +25,10 @@ def _error_page(request, code, exception=None, default_message=None):
 def banned(request, exception):
 def banned(request, exception):
     ban = exception.ban
     ban = exception.ban
 
 
-    request.frontend_context.update({
-        'MESSAGE': ban.get_serialized_message(),
-        'CURRENT_LINK': 'misago:error-banned',
+    request.frontend_context['store'].update({
+        'error': {
+            'ban': ban.get_serialized_message(),
+        },
     })
     })
 
 
     return render(
     return render(

+ 9 - 1
misago/core/middleware/frontendcontext.py

@@ -1,7 +1,15 @@
+from django.urls import reverse
 from django.utils.deprecation import MiddlewareMixin
 from django.utils.deprecation import MiddlewareMixin
 
 
 
 
 class FrontendContextMiddleware(MiddlewareMixin):
 class FrontendContextMiddleware(MiddlewareMixin):
     def process_request(self, request):
     def process_request(self, request):
         request.include_frontend_context = True
         request.include_frontend_context = True
-        request.frontend_context = {}
+        request.frontend_context = {
+            'auth': {},
+            'conf': {},
+            'store': {},
+
+            'api': '{}api/'.format(reverse('misago:index')),
+            'url': {},
+        }

+ 17 - 6
misago/core/tests/test_errorpages.py

@@ -22,25 +22,21 @@ class ErrorPageViewsTests(TestCase):
     def test_banned_returns_403(self):
     def test_banned_returns_403(self):
         """banned error page has no show-stoppers"""
         """banned error page has no show-stoppers"""
         response = self.client.get(reverse('raise-misago-banned'))
         response = self.client.get(reverse('raise-misago-banned'))
-        self.assertContains(response, "misago:error-banned", status_code=403)
         self.assertContains(response, encode_json_html("<p>Banned for test!</p>"), status_code=403)
         self.assertContains(response, encode_json_html("<p>Banned for test!</p>"), status_code=403)
 
 
     def test_permission_denied_returns_403(self):
     def test_permission_denied_returns_403(self):
         """permission_denied error page has no show-stoppers"""
         """permission_denied error page has no show-stoppers"""
         response = self.client.get(reverse('raise-misago-403'))
         response = self.client.get(reverse('raise-misago-403'))
-        self.assertContains(response, "misago:error-403", status_code=403)
         self.assertContains(response, "Page not available", status_code=403)
         self.assertContains(response, "Page not available", status_code=403)
 
 
     def test_page_not_found_returns_404(self):
     def test_page_not_found_returns_404(self):
         """page_not_found error page has no show-stoppers"""
         """page_not_found error page has no show-stoppers"""
         response = self.client.get(reverse('raise-misago-404'))
         response = self.client.get(reverse('raise-misago-404'))
-        self.assertContains(response, "misago:error-404", status_code=404)
         self.assertContains(response, "Page not found", status_code=404)
         self.assertContains(response, "Page not found", status_code=404)
 
 
     def test_not_allowed_returns_405(self):
     def test_not_allowed_returns_405(self):
         """not allowed error page has no showstoppers"""
         """not allowed error page has no showstoppers"""
         response = self.client.get(reverse('raise-misago-405'))
         response = self.client.get(reverse('raise-misago-405'))
-        self.assertContains(response, "misago:error-405", status_code=405)
         self.assertContains(response, "Wrong way", status_code=405)
         self.assertContains(response, "Wrong way", status_code=405)
 
 
 
 
@@ -56,18 +52,31 @@ class CustomErrorPagesTests(TestCase):
         self.misago_request.include_frontend_context = True
         self.misago_request.include_frontend_context = True
         self.site_request.include_frontend_context = True
         self.site_request.include_frontend_context = True
 
 
-        self.misago_request.frontend_context = {}
-        self.site_request.frontend_context = {}
+        self.misago_request.frontend_context = {
+            'auth': {},
+            'conf': {},
+            'store': {},
+            'url': {},
+        }
+
+        self.site_request.frontend_context = {
+            'auth': {},
+            'conf': {},
+            'store': {},
+            'url': {},
+        }
 
 
     def test_shared_403_decorator(self):
     def test_shared_403_decorator(self):
         """shared_403_decorator calls correct error handler"""
         """shared_403_decorator calls correct error handler"""
         response = self.client.get(reverse('raise-misago-403'))
         response = self.client.get(reverse('raise-misago-403'))
         self.assertEqual(response.status_code, 403)
         self.assertEqual(response.status_code, 403)
+
         response = self.client.get(reverse('raise-403'))
         response = self.client.get(reverse('raise-403'))
         self.assertContains(response, "Custom 403", status_code=403)
         self.assertContains(response, "Custom 403", status_code=403)
 
 
         response = mock_custom_403_error_page(self.misago_request, PermissionDenied())
         response = mock_custom_403_error_page(self.misago_request, PermissionDenied())
         self.assertNotContains(response, "Custom 403", status_code=403)
         self.assertNotContains(response, "Custom 403", status_code=403)
+
         response = mock_custom_403_error_page(self.site_request, PermissionDenied())
         response = mock_custom_403_error_page(self.site_request, PermissionDenied())
         self.assertContains(response, "Custom 403", status_code=403)
         self.assertContains(response, "Custom 403", status_code=403)
 
 
@@ -75,10 +84,12 @@ class CustomErrorPagesTests(TestCase):
         """shared_404_decorator calls correct error handler"""
         """shared_404_decorator calls correct error handler"""
         response = self.client.get(reverse('raise-misago-404'))
         response = self.client.get(reverse('raise-misago-404'))
         self.assertEqual(response.status_code, 404)
         self.assertEqual(response.status_code, 404)
+
         response = self.client.get(reverse('raise-404'))
         response = self.client.get(reverse('raise-404'))
         self.assertContains(response, "Custom 404", status_code=404)
         self.assertContains(response, "Custom 404", status_code=404)
 
 
         response = mock_custom_404_error_page(self.misago_request, Http404())
         response = mock_custom_404_error_page(self.misago_request, Http404())
         self.assertNotContains(response, "Custom 404", status_code=404)
         self.assertNotContains(response, "Custom 404", status_code=404)
+
         response = mock_custom_404_error_page(self.site_request, Http404())
         response = mock_custom_404_error_page(self.site_request, Http404())
         self.assertContains(response, "Custom 404", status_code=404)
         self.assertContains(response, "Custom 404", status_code=404)

+ 6 - 1
misago/core/tests/test_exceptionhandler_middleware.py

@@ -12,7 +12,12 @@ class ExceptionHandlerMiddlewareTests(TestCase):
         self.request = RequestFactory().get(reverse('misago:index'))
         self.request = RequestFactory().get(reverse('misago:index'))
         self.request.user = AnonymousUser()
         self.request.user = AnonymousUser()
         self.request.include_frontend_context = True
         self.request.include_frontend_context = True
-        self.request.frontend_context = {}
+        self.request.frontend_context = {
+            'auth': {},
+            'conf': {},
+            'store': {},
+            'url': {},
+        }
 
 
     def test_middleware_returns_response_for_supported_exception(self):
     def test_middleware_returns_response_for_supported_exception(self):
         """Middleware returns HttpResponse for supported exception"""
         """Middleware returns HttpResponse for supported exception"""

+ 7 - 1
misago/core/tests/test_frontendcontext_middleware.py

@@ -13,4 +13,10 @@ class FrontendContextMiddlewareTests(TestCase):
         request = MockRequest()
         request = MockRequest()
 
 
         FrontendContextMiddleware().process_request(request)
         FrontendContextMiddleware().process_request(request)
-        self.assertEqual(request.frontend_context, {})
+        self.assertEqual(request.frontend_context, {
+            'api': '/api/',
+            'auth': {},
+            'conf': {},
+            'store': {},
+            'url': {}
+        })

+ 13 - 10
misago/legal/context_processors.py

@@ -4,19 +4,22 @@ from misago.conf import settings
 
 
 
 
 def legal_links(request):
 def legal_links(request):
-    legal_context = {}
-
     if settings.terms_of_service_link:
     if settings.terms_of_service_link:
-        legal_context['TERMS_OF_SERVICE_URL'] = settings.terms_of_service_link
+        request.frontend_context['url'].update({
+            'tos': settings.terms_of_service_link,
+        })
     elif settings.terms_of_service:
     elif settings.terms_of_service:
-        legal_context['TERMS_OF_SERVICE_URL'] = reverse('misago:terms-of-service')
+        request.frontend_context['url'].update({
+            'tos': reverse('misago:terms-of-service'),
+        })
 
 
     if settings.privacy_policy_link:
     if settings.privacy_policy_link:
-        legal_context['PRIVACY_POLICY_URL'] = settings.privacy_policy_link
+        request.frontend_context['url'].update({
+            'privacy_policy': settings.privacy_policy_link,
+        })
     elif settings.privacy_policy:
     elif settings.privacy_policy:
-        legal_context['PRIVACY_POLICY_URL'] = reverse('misago:privacy-policy')
-
-    if legal_context:
-        request.frontend_context.update(legal_context)
+        request.frontend_context['url'].update({
+            'privacy_policy': reverse('misago:privacy-policy'),
+        })
 
 
-    return legal_context
+    return {}

+ 36 - 22
misago/legal/tests.py

@@ -8,7 +8,7 @@ from .context_processors import legal_links
 
 
 class MockRequest(object):
 class MockRequest(object):
     def __init__(self):
     def __init__(self):
-        self.frontend_context = {}
+        self.frontend_context = {'url': {}}
 
 
 
 
 class PrivacyPolicyTests(TestCase):
 class PrivacyPolicyTests(TestCase):
@@ -47,34 +47,41 @@ class PrivacyPolicyTests(TestCase):
         self.assertContains(response, 'Lorem ipsum dolor')
         self.assertContains(response, 'Lorem ipsum dolor')
 
 
     def test_context_processor_no_policy(self):
     def test_context_processor_no_policy(self):
-        """context processor has no TOS link"""
-        context_dict = legal_links(MockRequest())
+        """context processor has no privacy policy link"""
+        request = MockRequest()
+
+        context_dict = legal_links(request)
         self.assertFalse(context_dict)
         self.assertFalse(context_dict)
+        self.assertEqual(request.frontend_context['url'], {})
 
 
     def test_context_processor_misago_policy(self):
     def test_context_processor_misago_policy(self):
         """context processor has TOS link to Misago view"""
         """context processor has TOS link to Misago view"""
+        request = MockRequest()
+
         settings.override_setting('privacy_policy', 'Lorem ipsum')
         settings.override_setting('privacy_policy', 'Lorem ipsum')
-        context_dict = legal_links(MockRequest())
+        legal_links(request)
 
 
-        self.assertEqual(context_dict, {
-            'PRIVACY_POLICY_URL': reverse('misago:privacy-policy'),
+        self.assertEqual(request.frontend_context['url'], {
+            'privacy_policy': reverse('misago:privacy-policy'),
         })
         })
 
 
     def test_context_processor_remote_policy(self):
     def test_context_processor_remote_policy(self):
         """context processor has TOS link to remote url"""
         """context processor has TOS link to remote url"""
+        request = MockRequest()
+
         settings.override_setting('privacy_policy_link', 'http://test.com')
         settings.override_setting('privacy_policy_link', 'http://test.com')
-        context_dict = legal_links(MockRequest())
+        legal_links(request)
 
 
-        self.assertEqual(context_dict, {
-            'PRIVACY_POLICY_URL': 'http://test.com',
+        self.assertEqual(request.frontend_context['url'], {
+            'privacy_policy': 'http://test.com',
         })
         })
 
 
         # set misago view too
         # set misago view too
         settings.override_setting('privacy_policy', 'Lorem ipsum')
         settings.override_setting('privacy_policy', 'Lorem ipsum')
-        context_dict = legal_links(MockRequest())
+        legal_links(request)
 
 
-        self.assertEqual(context_dict, {
-            'PRIVACY_POLICY_URL': 'http://test.com',
+        self.assertEqual(request.frontend_context['url'], {
+            'privacy_policy': 'http://test.com',
         })
         })
 
 
 
 
@@ -115,33 +122,40 @@ class TermsOfServiceTests(TestCase):
 
 
     def test_context_processor_no_tos(self):
     def test_context_processor_no_tos(self):
         """context processor has no TOS link"""
         """context processor has no TOS link"""
-        context_dict = legal_links(MockRequest())
+        request = MockRequest()
+
+        context_dict = legal_links(request)
         self.assertFalse(context_dict)
         self.assertFalse(context_dict)
+        self.assertEqual(request.frontend_context['url'], {})
 
 
     def test_context_processor_misago_tos(self):
     def test_context_processor_misago_tos(self):
         """context processor has TOS link to Misago view"""
         """context processor has TOS link to Misago view"""
+        request = MockRequest()
+
         settings.override_setting('terms_of_service', 'Lorem ipsum')
         settings.override_setting('terms_of_service', 'Lorem ipsum')
-        context_dict = legal_links(MockRequest())
+        legal_links(request)
 
 
         self.assertEqual(
         self.assertEqual(
-            context_dict, {
-                'TERMS_OF_SERVICE_URL': reverse('misago:terms-of-service'),
+            request.frontend_context['url'], {
+                'tos': reverse('misago:terms-of-service'),
             }
             }
         )
         )
 
 
     def test_context_processor_remote_tos(self):
     def test_context_processor_remote_tos(self):
         """context processor has TOS link to remote url"""
         """context processor has TOS link to remote url"""
+        request = MockRequest()
+
         settings.override_setting('terms_of_service_link', 'http://test.com')
         settings.override_setting('terms_of_service_link', 'http://test.com')
-        context_dict = legal_links(MockRequest())
+        legal_links(request)
 
 
-        self.assertEqual(context_dict, {
-            'TERMS_OF_SERVICE_URL': 'http://test.com',
+        self.assertEqual(request.frontend_context['url'], {
+            'tos': 'http://test.com',
         })
         })
 
 
         # set misago view too
         # set misago view too
         settings.override_setting('terms_of_service', 'Lorem ipsum')
         settings.override_setting('terms_of_service', 'Lorem ipsum')
-        context_dict = legal_links(MockRequest())
+        legal_links(request)
 
 
-        self.assertEqual(context_dict, {
-            'TERMS_OF_SERVICE_URL': 'http://test.com',
+        self.assertEqual(request.frontend_context['url'], {
+            'tos': 'http://test.com',
         })
         })

+ 0 - 9
misago/markup/context_processors.py

@@ -1,9 +0,0 @@
-from django.urls import reverse
-
-
-def preload_api_url(request):
-    request.frontend_context.update({
-        'PARSE_MARKUP_API': reverse('misago:api:parse-markup'),
-    })
-
-    return {}

+ 0 - 3
misago/project_template/project_name/settings.py

@@ -262,9 +262,6 @@ TEMPLATES = [
 
 
                 # Data preloaders
                 # Data preloaders
                 'misago.conf.context_processors.preload_settings_json',
                 'misago.conf.context_processors.preload_settings_json',
-                'misago.core.context_processors.current_link',
-                'misago.markup.context_processors.preload_api_url',
-                'misago.threads.context_processors.preload_threads_urls',
                 'misago.users.context_processors.preload_user_json',
                 'misago.users.context_processors.preload_user_json',
 
 
                 # Note: keep frontend_context processor last for previous processors
                 # Note: keep frontend_context processor last for previous processors

+ 2 - 6
misago/search/context_processors.py

@@ -18,17 +18,13 @@ def search_providers(request):
         # with non-misago's anonymous user model that has no acl support
         # with non-misago's anonymous user model that has no acl support
         return {}
         return {}
 
 
-    request.frontend_context['SEARCH_URL'] = reverse('misago:search')
-    request.frontend_context['SEARCH_API'] = reverse('misago:api:search')
-    request.frontend_context['SEARCH_PROVIDERS'] = []
+    request.frontend_context['search'] = []
 
 
     for provider in allowed_providers:
     for provider in allowed_providers:
-        request.frontend_context['SEARCH_PROVIDERS'].append({
+        request.frontend_context['search'].append({
             'id': provider.url,
             'id': provider.url,
             'name': six.text_type(provider.name),
             'name': six.text_type(provider.name),
             'icon': provider.icon,
             'icon': provider.icon,
-            'url': reverse('misago:search', kwargs={'search_provider': provider.url}),
-            'api': reverse('misago:api:search', kwargs={'search_provider': provider.url}),
             'results': None,
             'results': None,
             'time': None,
             'time': None,
         })
         })

+ 0 - 3
misago/search/views.py

@@ -29,8 +29,5 @@ def search(request, search_provider):
     else:
     else:
         raise Http404()
         raise Http404()
 
 
-    if 'q' in request.GET:
-        request.frontend_context['SEARCH_QUERY'] = request.GET.get('q')
-
     return render(request, 'misago/search.html')
     return render(request, 'misago/search.html')
 
 

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

@@ -18,7 +18,7 @@ class ThreadsList(object):
         category = self.get_category(request, pk=request.query_params.get('category'))
         category = self.get_category(request, pk=request.query_params.get('category'))
         threads = self.get_threads(request, category, list_type, page)
         threads = self.get_threads(request, category, list_type, page)
 
 
-        return Response(self.get_response_json(request, category, threads)['THREADS'])
+        return Response(self.get_response_json(request, category, threads)['threads'])
 
 
     def get_category(self, request, pk=None):
     def get_category(self, request, pk=None):
         raise NotImplementedError('Threads list has to implement get_category(request, pk=None)')
         raise NotImplementedError('Threads list has to implement get_category(request, pk=None)')

+ 0 - 13
misago/threads/context_processors.py

@@ -1,13 +0,0 @@
-from django.urls import reverse
-
-
-def preload_threads_urls(request):
-    request.frontend_context.update({
-        'ATTACHMENTS_API': reverse('misago:api:attachment-list'),
-        'THREAD_EDITOR_API': reverse('misago:api:thread-editor'),
-        'THREADS_API': reverse('misago:api:thread-list'),
-        'PRIVATE_THREADS_API': reverse('misago:api:private-thread-list'),
-        'PRIVATE_THREADS_URL': reverse('misago:private-threads'),
-    })
-
-    return {}

+ 1 - 1
misago/threads/viewmodels/category.py

@@ -41,7 +41,7 @@ class ViewModel(BaseViewModel):
         return categories[0]
         return categories[0]
 
 
     def get_frontend_context(self):
     def get_frontend_context(self):
-        return {'CATEGORIES': BasicCategorySerializer(self._categories, many=True).data}
+        return {'categories': BasicCategorySerializer(self._categories, many=True).data}
 
 
     def get_template_context(self):
     def get_template_context(self):
         return {'category': self._model, 'subcategories': self._children}
         return {'category': self._model, 'subcategories': self._children}

+ 2 - 2
misago/threads/viewmodels/threads.py

@@ -123,13 +123,13 @@ class ViewModel(object):
 
 
     def get_frontend_context(self):
     def get_frontend_context(self):
         context = {
         context = {
-            'THREADS': {
+            'threads': {
                 'results': ThreadsListSerializer(self.threads, many=True).data,
                 'results': ThreadsListSerializer(self.threads, many=True).data,
                 'subcategories': [c.pk for c in self.category.children],
                 'subcategories': [c.pk for c in self.category.children],
             },
             },
         }
         }
 
 
-        context['THREADS'].update(self.paginator)
+        context['threads'].update(self.paginator)
         return context
         return context
 
 
     def get_template_context(self):
     def get_template_context(self):

+ 1 - 1
misago/threads/views/list.py

@@ -21,7 +21,7 @@ class ThreadsList(View):
         threads = self.get_threads(request, category, list_type, page)
         threads = self.get_threads(request, category, list_type, page)
 
 
         frontend_context = self.get_frontend_context(request, category, threads)
         frontend_context = self.get_frontend_context(request, category, threads)
-        request.frontend_context.update(frontend_context)
+        request.frontend_context['store'].update(frontend_context)
 
 
         template_context = self.get_template_context(request, category, threads)
         template_context = self.get_template_context(request, category, threads)
         return render(request, self.template_name, template_context)
         return render(request, self.template_name, template_context)

+ 3 - 9
misago/threads/views/thread.py

@@ -1,5 +1,4 @@
 from django.shortcuts import render
 from django.shortcuts import render
-from django.urls import reverse
 from django.views import View
 from django.views import View
 
 
 from misago.threads.viewmodels import ForumThread, PrivateThread, ThreadPosts
 from misago.threads.viewmodels import ForumThread, PrivateThread, ThreadPosts
@@ -16,7 +15,7 @@ class ThreadBase(View):
         posts = self.get_posts(request, thread, page)
         posts = self.get_posts(request, thread, page)
 
 
         frontend_context = self.get_frontend_context(request, thread, posts)
         frontend_context = self.get_frontend_context(request, thread, posts)
-        request.frontend_context.update(frontend_context)
+        request.frontend_context['store'].update(frontend_context)
 
 
         template_context = self.get_template_context(request, thread, posts)
         template_context = self.get_template_context(request, thread, posts)
         return render(request, self.template_name, template_context)
         return render(request, self.template_name, template_context)
@@ -42,8 +41,8 @@ class ThreadBase(View):
         context = self.get_default_frontend_context()
         context = self.get_default_frontend_context()
 
 
         context.update({
         context.update({
-            'THREAD': thread.get_frontend_context(),
-            'POSTS': posts.get_frontend_context(),
+            'thread': thread.get_frontend_context(),
+            'posts': posts.get_frontend_context(),
         })
         })
 
 
         return context
         return context
@@ -65,11 +64,6 @@ class ThreadView(ThreadBase):
     thread = ForumThread
     thread = ForumThread
     template_name = 'misago/thread/thread.html'
     template_name = 'misago/thread/thread.html'
 
 
-    def get_default_frontend_context(self):
-        return {
-            'THREADS_API': reverse('misago:api:thread-list'),
-        }
-
 
 
 class PrivateThreadView(ThreadBase):
 class PrivateThreadView(ThreadBase):
     thread = PrivateThread
     thread = PrivateThread

+ 9 - 20
misago/users/context_processors.py

@@ -1,25 +1,8 @@
-from django.urls import reverse
-
 from .pages import user_profile, usercp, users_list
 from .pages import user_profile, usercp, users_list
 from .serializers import AnonymousUserSerializer, AuthenticatedUserSerializer
 from .serializers import AnonymousUserSerializer, AuthenticatedUserSerializer
 
 
 
 
 def user_links(request):
 def user_links(request):
-    if request.include_frontend_context:
-        request.frontend_context.update({
-            'REQUEST_ACTIVATION_URL': reverse('misago:request-activation'),
-            'FORGOTTEN_PASSWORD_URL': reverse('misago:forgotten-password'),
-            'BANNED_URL': reverse('misago:banned'),
-            'USERCP_URL': reverse('misago:options'),
-            'USERS_LIST_URL': reverse('misago:users'),
-            'AUTH_API': reverse('misago:api:auth'),
-            'AUTH_CRITERIA_API': reverse('misago:api:auth-criteria'),
-            'USERS_API': reverse('misago:api:user-list'),
-            'CAPTCHA_API': reverse('misago:api:captcha-question'),
-            'USERNAME_CHANGES_API': reverse('misago:api:usernamechange-list'),
-            'MENTION_API': reverse('misago:api:mention-suggestions'),
-        })
-
     return {
     return {
         'USERCP_URL': usercp.get_default_link(),
         'USERCP_URL': usercp.get_default_link(),
         'USERS_LIST_URL': users_list.get_default_link(),
         'USERS_LIST_URL': users_list.get_default_link(),
@@ -31,13 +14,19 @@ def preload_user_json(request):
     if not request.include_frontend_context:
     if not request.include_frontend_context:
         return {}
         return {}
 
 
-    request.frontend_context.update({
+    request.frontend_context['auth'].update({
+        'id': request.user.id,
+        'isAnonymous': bool(request.user.is_anonymous),
         'isAuthenticated': bool(request.user.is_authenticated),
         'isAuthenticated': bool(request.user.is_authenticated),
     })
     })
 
 
     if request.user.is_authenticated:
     if request.user.is_authenticated:
-        request.frontend_context.update({'user': AuthenticatedUserSerializer(request.user).data})
+        request.frontend_context['store'].update({
+            'auth': AuthenticatedUserSerializer(request.user).data,
+        })
     else:
     else:
-        request.frontend_context.update({'user': AnonymousUserSerializer(request.user).data})
+        request.frontend_context['store'].update({
+            'auth': AnonymousUserSerializer(request.user).data,
+        })
 
 
     return {}
     return {}

+ 0 - 4
misago/users/views/activation.py

@@ -1,6 +1,5 @@
 from django.contrib.auth import get_user_model
 from django.contrib.auth import get_user_model
 from django.shortcuts import get_object_or_404, render
 from django.shortcuts import get_object_or_404, render
-from django.urls import reverse
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from misago.core.exceptions import Banned
 from misago.core.exceptions import Banned
@@ -23,9 +22,6 @@ def activation_view(f):
 
 
 @activation_view
 @activation_view
 def request_activation(request):
 def request_activation(request):
-    request.frontend_context.update({
-        'SEND_ACTIVATION_API': reverse('misago:api:send-activation'),
-    })
     return render(request, 'misago/activation/request.html')
     return render(request, 'misago/activation/request.html')
 
 
 
 

+ 9 - 10
misago/users/views/forgottenpassword.py

@@ -19,9 +19,6 @@ def reset_view(f):
 
 
 @reset_view
 @reset_view
 def request_reset(request):
 def request_reset(request):
-    request.frontend_context.update({
-        'SEND_PASSWORD_RESET_API': reverse('misago:api:send-password-form'),
-    })
     return render(request, 'misago/forgottenpassword/request.html')
     return render(request, 'misago/forgottenpassword/request.html')
 
 
 
 
@@ -52,12 +49,14 @@ def reset_password_form(request, pk, token):
             }, status=400
             }, status=400
         )
         )
 
 
-    api_url = reverse(
-        'misago:api:change-forgotten-password', kwargs={
-            'pk': pk,
-            'token': token,
-        }
-    )
+    request.frontend_context['url'].update({
+        'change_forgotten_password': reverse(
+            'misago:api:change-forgotten-password',
+            kwargs={
+                'pk': pk,
+                'token': token,
+            },
+        ),
+    })
 
 
-    request.frontend_context['CHANGE_PASSWORD_API'] = api_url
     return render(request, 'misago/forgottenpassword/form.html')
     return render(request, 'misago/forgottenpassword/form.html')