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

Refactored API calls to use new api. #147

Ralfp 12 лет назад
Родитель
Сommit
04b01bb090
49 измененных файлов с 511 добавлено и 488 удалено
  1. 7 7
      misago/apps/activation/views.py
  2. 10 7
      misago/apps/admin/forums/views.py
  3. 0 15
      misago/apps/admin/home.py
  4. 11 8
      misago/apps/admin/index.py
  5. 10 7
      misago/apps/admin/newsletters/views.py
  6. 16 15
      misago/apps/admin/pruneusers/views.py
  7. 20 19
      misago/apps/admin/settings/views.py
  8. 19 14
      misago/apps/admin/stats/views.py
  9. 35 34
      misago/apps/admin/widgets.py
  10. 7 6
      misago/apps/alerts.py
  11. 7 6
      misago/apps/category.py
  12. 16 16
      misago/apps/errors.py
  13. 4 5
      misago/apps/forummap.py
  14. 7 6
      misago/apps/newsfeed.py
  15. 8 7
      misago/apps/newthreads.py
  16. 8 7
      misago/apps/popularthreads.py
  17. 5 5
      misago/apps/profiles/details/views.py
  18. 9 9
      misago/apps/profiles/followers/views.py
  19. 9 9
      misago/apps/profiles/follows/views.py
  20. 9 8
      misago/apps/profiles/posts/views.py
  21. 9 8
      misago/apps/profiles/threads/views.py
  22. 14 13
      misago/apps/profiles/views.py
  23. 8 7
      misago/apps/register/views.py
  24. 7 6
      misago/apps/resetpswd/views.py
  25. 4 3
      misago/apps/search/views.py
  26. 11 10
      misago/apps/signin/views.py
  27. 26 25
      misago/apps/threadtype/changelog.py
  28. 21 20
      misago/apps/threadtype/details.py
  29. 22 21
      misago/apps/threadtype/list/moderation.py
  30. 13 12
      misago/apps/threadtype/list/views.py
  31. 16 15
      misago/apps/threadtype/posting/base.py
  32. 23 22
      misago/apps/threadtype/thread/moderation/posts.py
  33. 11 10
      misago/apps/threadtype/thread/moderation/thread.py
  34. 20 19
      misago/apps/threadtype/thread/views.py
  35. 3 2
      misago/apps/tos.py
  36. 25 29
      misago/apps/usercp/avatar/views.py
  37. 6 6
      misago/apps/usercp/credentials/views.py
  38. 6 6
      misago/apps/usercp/options/views.py
  39. 9 10
      misago/apps/usercp/signature/views.py
  40. 9 9
      misago/apps/usercp/username/views.py
  41. 10 9
      misago/apps/watchedthreads/views.py
  42. 2 1
      misago/firewalls.py
  43. 2 2
      misago/middleware/firewalls.py
  44. 1 1
      misago/middleware/theme.py
  45. 8 3
      misago/models/usermodel.py
  46. 3 0
      misago/settings_base.py
  47. 1 0
      misago/shortcuts.py
  48. 4 0
      misago/template/theme.py
  49. 0 9
      misago/utils/views.py

+ 7 - 7
misago/apps/activation/views.py

@@ -6,7 +6,7 @@ from misago.decorators import block_authenticated, block_banned, block_crawlers,
 from misago.forms import FormLayout
 from misago.messages import Message
 from misago.models import Ban, User
-from misago.utils.views import redirect_message
+from misago.shortcuts import redirect_message, render_to_response
 from misago.apps.activation.forms import UserSendActivationMailForm
 
 @block_crawlers
@@ -40,12 +40,12 @@ def form(request):
             message = Message(form.non_field_errors()[0], 'error')
     else:
         form = UserSendActivationMailForm(request=request)
-    return request.theme.render_to_response('resend_activation.html',
-                                            {
-                                             'message': message,
-                                             'form': FormLayout(form),
-                                            },
-                                            context_instance=RequestContext(request));
+    return render_to_response('resend_activation.html',
+                              {
+                               'message': message,
+                               'form': FormLayout(form),
+                              },
+                              context_instance=RequestContext(request));
 
 
 @block_banned

+ 10 - 7
misago/apps/admin/forums/views.py

@@ -9,6 +9,7 @@ from mptt.forms import TreeNodeChoiceField
 from misago.admin import site
 from misago.apps.admin.widgets import *
 from misago.models import Forum
+from misago.shortcuts import render_to_response
 from misago.utils.strings import slugify
 from misago.apps.admin.forums.forms import NewNodeForm, CategoryForm, ForumForm, RedirectForm, DeleteForm
 
@@ -108,13 +109,15 @@ def resync_forums(request, forum=0, progress=0):
         return redirect(django_reverse('admin_forums_resync'))
 
     # Render Progress
-    response = request.theme.render_to_response('processing.html', {
-            'task_name': _('Resynchronizing Forums'),
-            'target_name': forum.name,
-            'message': _('Resynchronized %(progress)s from %(total)s threads') % {'progress': progress, 'total': threads_total},
-            'progress': progress * 100 / threads_total,
-            'cancel_url': reverse('admin_forums'),
-        }, context_instance=RequestContext(request));
+    response = render_to_response('processing.html',
+                                  {
+                                   'task_name': _('Resynchronizing Forums'),
+                                   'target_name': forum.name,
+                                   'message': _('Resynchronized %(progress)s from %(total)s threads') % {'progress': progress, 'total': threads_total},
+                                   'progress': progress * 100 / threads_total,
+                                   'cancel_url': reverse('admin_forums'),
+                                   },
+                                  context_instance=RequestContext(request));
 
     # Redirect where to?
     if progress >= threads_total:

+ 0 - 15
misago/apps/admin/home.py

@@ -1,15 +0,0 @@
-from django.template import RequestContext
-from misago.models import Session
-
-def home(request):
-    return request.theme.render_to_response('home.html', {
-        'users': request.monitor['users'],
-        'users_inactive': request.monitor['users_inactive'],
-        'threads': request.monitor['threads'],
-        'posts': request.monitor['posts'],
-        'admins': Session.objects.filter(user__isnull=False).filter(admin=1).order_by('user__username_slug').select_related('user'),
-        }, context_instance=RequestContext(request));
-
-
-def todo(request):
-    return request.theme.render_to_response('todo.html', context_instance=RequestContext(request));

+ 11 - 8
misago/apps/admin/index.py

@@ -1,15 +1,18 @@
 from django.template import RequestContext
 from misago.models import Session
+from misago.shortcuts import render_to_response
 
 def index(request):
-    return request.theme.render_to_response('index.html', {
-        'users': request.monitor['users'],
-        'users_inactive': request.monitor['users_inactive'],
-        'threads': request.monitor['threads'],
-        'posts': request.monitor['posts'],
-        'admins': Session.objects.filter(user__isnull=False).filter(admin=1).order_by('user__username_slug').select_related('user'),
-        }, context_instance=RequestContext(request));
+    return render_to_response('index.html',
+                              {
+                               'users': request.monitor['users'],
+                               'users_inactive': request.monitor['users_inactive'],
+                               'threads': request.monitor['threads'],
+                               'posts': request.monitor['posts'],
+                               'admins': Session.objects.filter(user__isnull=False).filter(admin=1).order_by('user__username_slug').select_related('user'),
+                              },
+                              context_instance=RequestContext(request));
 
 
 def todo(request, *args, **kwargs):
-    return request.theme.render_to_response('todo.html', context_instance=RequestContext(request));
+    return render_to_response('todo.html', context_instance=RequestContext(request));

+ 10 - 7
misago/apps/admin/newsletters/views.py

@@ -7,6 +7,7 @@ from django.utils.translation import ugettext as _
 from misago.admin import site
 from misago.apps.admin.widgets import *
 from misago.models import Newsletter, User
+from misago.shortcuts import render_to_response
 from misago.apps.admin.newsletters.forms import NewsletterForm, SearchNewslettersForm
 
 def reverse(route, target=None):
@@ -185,13 +186,15 @@ def send(request, target, token):
             return redirect(reverse('admin_newsletters'))
 
         # Render Progress
-        response = request.theme.render_to_response('processing.html', {
-                'task_name': _('Sending Newsletter'),
-                'target_name': newsletter.name,
-                'message': _('Sent to %(progress)s from %(total)s users') % {'progress': newsletter.progress, 'total': recipients_total},
-                'progress': newsletter.progress * 100 / recipients_total,
-                'cancel_url': reverse('admin_newsletters'),
-            }, context_instance=RequestContext(request));
+        response = render_to_response('processing.html',
+                                      {
+                                      'task_name': _('Sending Newsletter'),
+                                      'target_name': newsletter.name,
+                                      'message': _('Sent to %(progress)s from %(total)s users') % {'progress': newsletter.progress, 'total': recipients_total},
+                                      'progress': newsletter.progress * 100 / recipients_total,
+                                      'cancel_url': reverse('admin_newsletters'),
+                                      },
+                                      context_instance=RequestContext(request));
         response['refresh'] = '2;url=%s' % reverse('admin_newsletters_send', newsletter)
         return response
     except Newsletter.DoesNotExist:

+ 16 - 15
misago/apps/admin/pruneusers/views.py

@@ -5,6 +5,7 @@ from misago.admin import site
 from misago.apps.admin.widgets import *
 from misago.forms import Form
 from misago.models import PruningPolicy, User
+from misago.shortcuts import render_to_response
 from misago.apps.admin.pruneusers.forms import PolicyForm
 
 def reverse(route, target=None):
@@ -195,18 +196,18 @@ class Apply(FormWidget):
             else:
                 message = Message(_("Request authorization is invalid. Please resubmit your form."), 'error')
 
-        return request.theme.render_to_response(self.get_template(),
-                                                {
-                                                 'admin': self.admin,
-                                                 'action': self,
-                                                 'request': request,
-                                                 'url': self.get_url(model),
-                                                 'fallback': self.get_fallback_url(),
-                                                 'messages': request.messages.get_messages(self.admin.id),
-                                                 'message': message,
-                                                 'tabbed': self.tabbed,
-                                                 'total_users': total_users,
-                                                 'target': self.get_target_name(original_model),
-                                                 'target_model': original_model,
-                                                },
-                                                context_instance=RequestContext(request));
+        return render_to_response(self.get_template(),
+                                  {
+                                  'admin': self.admin,
+                                  'action': self,
+                                  'request': request,
+                                  'url': self.get_url(model),
+                                  'fallback': self.get_fallback_url(),
+                                  'messages': request.messages.get_messages(self.admin.id),
+                                  'message': message,
+                                  'tabbed': self.tabbed,
+                                  'total_users': total_users,
+                                  'target': self.get_target_name(original_model),
+                                  'target_model': original_model,
+                                  },
+                                  context_instance=RequestContext(request));

+ 20 - 19
misago/apps/admin/settings/views.py

@@ -7,6 +7,7 @@ from misago.forms import Form, FormLayout, FormFields
 from misago.messages import Message
 from misago.search import SearchQuery, SearchException
 from misago.models import SettingsGroup, Setting
+from misago.shortcuts import render_to_response
 from misago.apps.errors import error404
 from misago.apps.admin.settings.forms import SearchForm
 
@@ -59,16 +60,16 @@ def settings(request, group_id=None, group_slug=None):
         form = SettingsGroupForm(request=request)
 
     # Display settings group form      
-    return request.theme.render_to_response('settings/settings.html',
-                                            {
-                                            'message': message,
-                                            'groups': settings_groups,
-                                            'active_group': active_group,
-                                            'search_form': FormFields(SearchForm(request=request)),
-                                            'form': FormLayout(form),
-                                            'raw_form': form,
-                                            },
-                                            context_instance=RequestContext(request));
+    return render_to_response('settings/settings.html',
+                              {
+                              'message': message,
+                              'groups': settings_groups,
+                              'active_group': active_group,
+                              'search_form': FormFields(SearchForm(request=request)),
+                              'form': FormLayout(form),
+                              'raw_form': form,
+                              },
+                              context_instance=RequestContext(request));
 
 
 def settings_search(request):
@@ -105,12 +106,12 @@ def settings_search(request):
             raise SearchException(_('Search query is invalid.'))
     except SearchException as e:
         message = Message(unicode(e), 'error')
-    return request.theme.render_to_response('settings/search_results.html',
-                                    {
-                                    'message': message,
-                                    'groups': settings_groups,
-                                    'active_group': None,
-                                    'found_settings': found_settings,
-                                    'search_form': FormFields(form),
-                                    },
-                                    context_instance=RequestContext(request));
+    return render_to_response('settings/search_results.html',
+                              {
+                              'message': message,
+                              'groups': settings_groups,
+                              'active_group': None,
+                              'found_settings': found_settings,
+                              'search_form': FormFields(form),
+                              },
+                              context_instance=RequestContext(request));

+ 19 - 14
misago/apps/admin/stats/views.py

@@ -8,6 +8,7 @@ from django.utils import timezone
 from django.utils.translation import ugettext as _
 from misago.forms import FormLayout
 from misago.messages import Message
+from misago.shortcuts import render_to_response
 from misago.apps.admin.stats.forms import GenerateStatisticsForm
 from misago.apps.errors import error404
 
@@ -30,8 +31,8 @@ def form(request):
         Something went FUBAR - Misago ships with some stats providers out of box
         If those providers cant be found, this means Misago filesystem is corrupted
         """
-        return request.theme.render_to_response('stats/not_available.html',
-                                                context_instance=RequestContext(request));
+        return render_to_response('stats/not_available.html',
+                                  context_instance=RequestContext(request));
 
     message = None
     if request.method == 'POST':
@@ -62,10 +63,12 @@ def form(request):
     else:
         form = GenerateStatisticsForm(provider_choices=statistics_providers, request=request)
 
-    return request.theme.render_to_response('stats/form.html', {
-                                            'form': FormLayout(form),
-                                            'message': message,
-                                            }, context_instance=RequestContext(request));
+    return render_to_response('stats/form.html',
+                              {
+                              'form': FormLayout(form),
+                              'message': message,
+                              },
+                              context_instance=RequestContext(request));
 
 
 def graph(request, model, date_start, date_end, precision):
@@ -93,8 +96,8 @@ def graph(request, model, date_start, date_end, precision):
 
     if not statistics_providers:
         # Like before, q.q on lack of models
-        return request.theme.render_to_response('stats/not_available.html',
-                                                context_instance=RequestContext(request));
+        return render_to_response('stats/not_available.html',
+                                  context_instance=RequestContext(request));
 
     if not model in models_map or check_dates(date_start, date_end, precision):
         # Bad model name or graph data!
@@ -104,12 +107,14 @@ def graph(request, model, date_start, date_end, precision):
                                   provider_choices=statistics_providers,
                                   request=request,
                                   initial={'provider_model': model, 'date_start': date_start, 'date_end': date_end, 'stats_precision': precision})
-    return request.theme.render_to_response('stats/graph.html', {
-                                            'title': models_map[model].statistics_name,
-                                            'graph': build_graph(models_map[model], date_start, date_end, precision),
-                                            'form': FormLayout(form),
-                                            'message': request.messages.get_message('admin_stats'),
-                                            }, context_instance=RequestContext(request));
+    return render_to_response('stats/graph.html',
+                              {
+                              'title': models_map[model].statistics_name,
+                              'graph': build_graph(models_map[model], date_start, date_end, precision),
+                              'form': FormLayout(form),
+                              'message': request.messages.get_message('admin_stats'),
+                              },
+                              context_instance=RequestContext(request));
 
 
 def check_dates(date_start, date_end, precision):

+ 35 - 34
misago/apps/admin/widgets.py

@@ -9,6 +9,7 @@ from jinja2 import TemplateNotFound
 import math
 from misago.forms import Form, FormLayout, FormFields, FormFieldsets
 from misago.messages import Message
+from misago.shortcuts import render_to_response
 from misago.utils.pagination import make_pagination
 
 """
@@ -352,25 +353,25 @@ class ListWidget(BaseWidget):
             items_total = items_shown
 
         # Render list
-        return request.theme.render_to_response(self.get_template(),
-                                                self.add_template_variables({
-                                                 'admin': self.admin,
-                                                 'action': self,
-                                                 'request': request,
-                                                 'url': self.get_url(),
-                                                 'messages_log': request.messages.get_messages(self.admin.id),
-                                                 'message': message,
-                                                 'sorting': self.sortables,
-                                                 'sorting_method': sorting_method,
-                                                 'pagination': paginating_method,
-                                                 'list_form': FormLayout(list_form) if list_form else None,
-                                                 'search_form': FormLayout(search_form) if search_form else None,
-                                                 'table_form': FormFields(table_form).fields if table_form else None,
-                                                 'items': items,
-                                                 'items_total': items_total,
-                                                 'items_shown': items_shown,
-                                                }),
-                                                context_instance=RequestContext(request));
+        return render_to_response(self.get_template(),
+                                  self.add_template_variables({
+                                   'admin': self.admin,
+                                   'action': self,
+                                   'request': request,
+                                   'url': self.get_url(),
+                                   'messages_log': request.messages.get_messages(self.admin.id),
+                                   'message': message,
+                                   'sorting': self.sortables,
+                                   'sorting_method': sorting_method,
+                                   'pagination': paginating_method,
+                                   'list_form': FormLayout(list_form) if list_form else None,
+                                   'search_form': FormLayout(search_form) if search_form else None,
+                                   'table_form': FormFields(table_form).fields if table_form else None,
+                                   'items': items,
+                                   'items_total': items_total,
+                                   'items_shown': items_shown,
+                                  }),
+                                  context_instance=RequestContext(request));
 
 
 class FormWidget(BaseWidget):
@@ -461,21 +462,21 @@ class FormWidget(BaseWidget):
             form = self.get_form_instance(FormType, model, self.get_initial_data(model))
 
         # Render form
-        return request.theme.render_to_response(self.get_template(),
-                                                self.add_template_variables({
-                                                 'admin': self.admin,
-                                                 'action': self,
-                                                 'request': request,
-                                                 'url': self.get_url(model),
-                                                 'fallback': self.get_fallback_url(),
-                                                 'messages_log': request.messages.get_messages(self.admin.id),
-                                                 'message': message,
-                                                 'tabbed': self.tabbed,
-                                                 'target': self.get_target_name(original_model),
-                                                 'target_model': original_model,
-                                                 'form': FormLayout(form, self.get_layout(form, target)),
-                                                }),
-                                                context_instance=RequestContext(request));
+        return render_to_response(self.get_template(),
+                                  self.add_template_variables({
+                                   'admin': self.admin,
+                                   'action': self,
+                                   'request': request,
+                                   'url': self.get_url(model),
+                                   'fallback': self.get_fallback_url(),
+                                   'messages_log': request.messages.get_messages(self.admin.id),
+                                   'message': message,
+                                   'tabbed': self.tabbed,
+                                   'target': self.get_target_name(original_model),
+                                   'target_model': original_model,
+                                   'form': FormLayout(form, self.get_layout(form, target)),
+                                  }),
+                                  context_instance=RequestContext(request));
 
 
 class ButtonWidget(BaseWidget):

+ 7 - 6
misago/apps/alerts.py

@@ -5,6 +5,7 @@ from django.utils import timezone
 from django.utils.timezone import localtime
 from django.utils.translation import ugettext as _
 from misago.decorators import block_guest
+from misago.shortcuts import render_to_response
 
 @block_guest
 def alerts(request):
@@ -48,9 +49,9 @@ def alerts(request):
     request.user.alerts = 0
     request.user.alerts_date = now
     request.user.save(force_update=True)
-    return request.theme.render_to_response('alerts.html',
-                                            {
-                                             'new_alerts': new_alerts,
-                                             'alerts': alerts,
-                                             },
-                                            context_instance=RequestContext(request))
+    return render_to_response('alerts.html',
+                              {
+                              'new_alerts': new_alerts,
+                              'alerts': alerts,
+                              },
+                              context_instance=RequestContext(request))

+ 7 - 6
misago/apps/category.py

@@ -2,6 +2,7 @@ from django.template import RequestContext
 from misago.apps.errors import error403, error404
 from misago.models import Forum
 from misago.readstrackers import ForumsTracker
+from misago.shortcuts import render_to_response
 
 def category(request, forum, slug):
     if not request.acl.forums.can_see(forum):
@@ -14,9 +15,9 @@ def category(request, forum, slug):
         return error404(request)
 
     forum.subforums = Forum.objects.treelist(request.acl.forums, forum, tracker=ForumsTracker(request.user))
-    return request.theme.render_to_response('category.html',
-                                            {
-                                             'category': forum,
-                                             'parents': Forum.objects.forum_parents(forum.pk),
-                                             },
-                                            context_instance=RequestContext(request));
+    return render_to_response('category.html',
+                              {
+                              'category': forum,
+                              'parents': Forum.objects.forum_parents(forum.pk),
+                              },
+                              context_instance=RequestContext(request));

+ 16 - 16
misago/apps/errors.py

@@ -1,6 +1,6 @@
 from django.template import RequestContext
 from django.utils.translation import ugettext as _
-from misago.utils.views import json_response
+from misago.shortcuts import render_to_response, json_response
 
 def error_not_implemented(request, *args, **kwargs):
     """Generic "NOT IMPLEMENTED!" Error"""
@@ -17,13 +17,13 @@ def error_view(request, error, message=None):
             if error == 403:
                 message = _("You don't have permission to see requested page.")
         return json_response(request, status=error, message=message)
-    response = request.theme.render_to_response(('error%s.html' % error),
-                                                {
-                                                 'message': message,
-                                                 'hide_signin': True,
-                                                 'exception_response': True,
-                                                 },
-                                                context_instance=RequestContext(request));
+    response = render_to_response(('error%s.html' % error),
+                                  {
+                                  'message': message,
+                                  'hide_signin': True,
+                                  'exception_response': True,
+                                  },
+                                  context_instance=RequestContext(request));
     response.status_code = error
     return response
 
@@ -41,13 +41,13 @@ def error_banned(request, user=None, ban=None):
         ban = request.ban
     if request.is_ajax():
         return json_response(request, status=403, message=_("You are banned."))
-    response = request.theme.render_to_response('error403_banned.html',
-                                                {
-                                                 'banned_user': user,
-                                                 'ban': ban,
-                                                 'hide_signin': True,
-                                                 'exception_response': True,
-                                                 },
-                                                context_instance=RequestContext(request));
+    response = render_to_response('error403_banned.html',
+                                  {
+                                  'banned_user': user,
+                                  'ban': ban,
+                                  'hide_signin': True,
+                                  'exception_response': True,
+                                  },
+                                  context_instance=RequestContext(request));
     response.status_code = 403
     return response

+ 4 - 5
misago/apps/forummap.py

@@ -1,9 +1,8 @@
 from django.template import RequestContext
 from misago.models import Forum
+from misago.shortcuts import render_to_response
 
 def forum_map(request):
-    return request.theme.render_to_response('forum_map.html',
-                                            {
-                                             'forums': Forum.objects.treelist(request.acl.forums),
-                                             },
-                                            context_instance=RequestContext(request));
+    return render_to_response('forum_map.html',
+                              {'forums': Forum.objects.treelist(request.acl.forums),},
+                              context_instance=RequestContext(request));

+ 7 - 6
misago/apps/newsfeed.py

@@ -1,6 +1,7 @@
 from django.template import RequestContext
 from misago.decorators import block_guest
 from misago.models import Forum, Post
+from misago.shortcuts import render_to_response
 
 @block_guest
 def newsfeed(request):
@@ -14,9 +15,9 @@ def newsfeed(request):
         queryset = queryset.filter(user_id__in=follows)
         queryset = queryset.prefetch_related('thread', 'forum', 'user').order_by('-id')
         queryset = queryset[:18]
-    return request.theme.render_to_response('newsfeed.html',
-                                            {
-                                             'follows': follows,
-                                             'posts': queryset,
-                                             },
-                                            context_instance=RequestContext(request))
+    return render_to_response('newsfeed.html',
+                              {
+                              'follows': follows,
+                              'posts': queryset,
+                              },
+                              context_instance=RequestContext(request))

+ 8 - 7
misago/apps/newthreads.py

@@ -5,6 +5,7 @@ from django.shortcuts import redirect
 from django.template import RequestContext
 from django.utils import timezone
 from misago.models import Forum, Thread
+from misago.shortcuts import render_to_response
 from misago.utils.pagination import make_pagination
 
 def new_threads(request, page=0):
@@ -19,10 +20,10 @@ def new_threads(request, page=0):
     if request.settings['avatars_on_threads_list']:
         queryset = queryset.prefetch_related('start_poster', 'last_poster')
 
-    return request.theme.render_to_response('new_threads.html',
-                                            {
-                                             'items_total': items_total,
-                                             'threads': Thread.objects.with_reads(queryset, request.user),
-                                             'pagination': pagination,
-                                             },
-                                            context_instance=RequestContext(request));
+    return render_to_response('new_threads.html',
+                              {
+                              'items_total': items_total,
+                              'threads': Thread.objects.with_reads(queryset, request.user),
+                              'pagination': pagination,
+                              },
+                              context_instance=RequestContext(request));

+ 8 - 7
misago/apps/popularthreads.py

@@ -5,6 +5,7 @@ from django.shortcuts import redirect
 from django.template import RequestContext
 from django.utils import timezone
 from misago.models import Forum, Thread
+from misago.shortcuts import render_to_response
 from misago.utils.pagination import make_pagination
 
 def popular_threads(request, page=0):
@@ -19,10 +20,10 @@ def popular_threads(request, page=0):
     if request.settings['avatars_on_threads_list']:
         queryset = queryset.prefetch_related('start_poster', 'last_poster')
 
-    return request.theme.render_to_response('popular_threads.html',
-                                            {
-                                             'items_total': items_total,
-                                             'threads': Thread.objects.with_reads(queryset, request.user),
-                                             'pagination': pagination,
-                                             },
-                                            context_instance=RequestContext(request));
+    return render_to_response('popular_threads.html',
+                              {
+                              'items_total': items_total,
+                              'threads': Thread.objects.with_reads(queryset, request.user),
+                              'pagination': pagination,
+                              },
+                              context_instance=RequestContext(request));

+ 5 - 5
misago/apps/profiles/details/views.py

@@ -1,10 +1,10 @@
+from misago.shortcuts import render_to_response
 from misago.apps.profiles.decorators import profile_view
 from misago.apps.profiles.template import RequestContext
 
 @profile_view('user_details')
 def details(request, user):
-    return request.theme.render_to_response('profiles/details.html',
-                                            context_instance=RequestContext(request, {
-                                             'profile': user,
-                                             'tab': 'details',
-                                             }));
+    return render_to_response('profiles/details.html',
+                              context_instance=RequestContext(request, {
+                                'profile': user,
+                                'tab': 'details',}));

+ 9 - 9
misago/apps/profiles/followers/views.py

@@ -1,9 +1,10 @@
 from django.core.urlresolvers import reverse
 from django.http import Http404
 from django.shortcuts import redirect
+from misago.shortcuts import render_to_response
+from misago.utils.pagination import make_pagination
 from misago.apps.profiles.decorators import profile_view
 from misago.apps.profiles.template import RequestContext
-from misago.utils.pagination import make_pagination
 
 @profile_view('user_followers')
 def followers(request, user, page=0):
@@ -14,11 +15,10 @@ def followers(request, user, page=0):
     except Http404:
         return redirect(reverse('user_followers', kwargs={'user': user.id, 'username': user.username_slug}))
     
-    return request.theme.render_to_response('profiles/followers.html',
-                                            context_instance=RequestContext(request, {
-                                             'profile': user,
-                                             'tab': 'followers',
-                                             'items_total': count,
-                                             'items': queryset[pagination['start']:pagination['stop']],
-                                             'pagination': pagination,
-                                             }));
+    return render_to_response('profiles/followers.html',
+                              context_instance=RequestContext(request, {
+                                  'profile': user,
+                                  'tab': 'followers',
+                                  'items_total': count,
+                                  'items': queryset[pagination['start']:pagination['stop']],
+                                  'pagination': pagination,}));

+ 9 - 9
misago/apps/profiles/follows/views.py

@@ -1,9 +1,10 @@
 from django.core.urlresolvers import reverse
 from django.http import Http404
 from django.shortcuts import redirect
+from misago.shortcuts import render_to_response
+from misago.utils.pagination import make_pagination
 from misago.apps.profiles.decorators import profile_view
 from misago.apps.profiles.template import RequestContext
-from misago.utils.pagination import make_pagination
 
 @profile_view('user_follows')
 def follows(request, user, page=0):
@@ -14,11 +15,10 @@ def follows(request, user, page=0):
     except Http404:
         return redirect(reverse('user_follows', kwargs={'user': user.id, 'username': user.username_slug}))
 
-    return request.theme.render_to_response('profiles/follows.html',
-                                            context_instance=RequestContext(request, {
-                                             'profile': user,
-                                             'tab': 'follows',
-                                             'items_total': count,
-                                             'items': queryset[pagination['start']:pagination['stop']],
-                                             'pagination': pagination,
-                                             }));
+    return render_to_response('profiles/follows.html',
+                              context_instance=RequestContext(request, {
+                                  'profile': user,
+                                  'tab': 'follows',
+                                  'items_total': count,
+                                  'items': queryset[pagination['start']:pagination['stop']],
+                                  'pagination': pagination,}));

+ 9 - 8
misago/apps/profiles/posts/views.py

@@ -4,6 +4,7 @@ from django.shortcuts import redirect
 from misago.apps.profiles.decorators import profile_view
 from misago.apps.profiles.template import RequestContext
 from misago.models import Forum
+from misago.shortcuts import render_to_response
 from misago.utils.pagination import make_pagination
 
 @profile_view('user_posts')
@@ -15,11 +16,11 @@ def posts(request, user, page=0):
     except Http404:
         return redirect(reverse('user_posts', kwargs={'user': user.id, 'username': user.username_slug}))
     
-    return request.theme.render_to_response('profiles/posts.html',
-                                            context_instance=RequestContext(request, {
-                                             'profile': user,
-                                             'tab': 'posts',
-                                             'items_total': count,
-                                             'items': queryset[pagination['start']:pagination['stop']],
-                                             'pagination': pagination,
-                                             }));
+    return render_to_response('profiles/posts.html',
+                              context_instance=RequestContext(request, {
+                                  'profile': user,
+                                  'tab': 'posts',
+                                  'items_total': count,
+                                  'items': queryset[pagination['start']:pagination['stop']],
+                                  'pagination': pagination,
+                                  }));

+ 9 - 8
misago/apps/profiles/threads/views.py

@@ -4,6 +4,7 @@ from django.shortcuts import redirect
 from misago.apps.profiles.decorators import profile_view
 from misago.apps.profiles.template import RequestContext
 from misago.models import Forum
+from misago.shortcuts import render_to_response
 from misago.utils.pagination import make_pagination
 
 @profile_view('user_threads')
@@ -15,11 +16,11 @@ def threads(request, user, page=0):
     except Http404:
         return redirect(reverse('user_threads', kwargs={'user': user.id, 'username': user.username_slug}))
     
-    return request.theme.render_to_response('profiles/threads.html',
-                                            context_instance=RequestContext(request, {
-                                             'profile': user,
-                                             'tab': 'threads',
-                                             'items_total': count,
-                                             'items': queryset[pagination['start']:pagination['stop']],
-                                             'pagination': pagination,
-                                             }));
+    return render_to_response('profiles/threads.html',
+                              context_instance=RequestContext(request, {
+                                  'profile': user,
+                                  'tab': 'threads',
+                                  'items_total': count,
+                                  'items': queryset[pagination['start']:pagination['stop']],
+                                  'pagination': pagination,
+                                  }));

+ 14 - 13
misago/apps/profiles/views.py

@@ -7,6 +7,7 @@ from misago.apps.errors import error403, error404
 from misago.forms import FormFields
 from misago.messages import Message
 from misago.models import Rank, User
+from misago.shortcuts import render_to_response
 from misago.utils.strings import slugify
 from misago.utils.pagination import make_pagination
 from misago.apps.profiles.forms import QuickFindUserForm
@@ -89,16 +90,16 @@ def list(request, slug=None, page=0):
                 users = users.select_related(*settings.PROFILE_EXTENSIONS_PRELOAD)
             users = users.order_by('username_slug')[pagination['start']:pagination['stop']]
 
-    return request.theme.render_to_response('profiles/list.html',
-                                        {
-                                         'message': message,
-                                         'search_form': FormFields(search_form).fields,
-                                         'in_search': in_search,
-                                         'active_rank': active_rank,
-                                         'default_rank': default_rank,
-                                         'items_total': items_total,
-                                         'ranks': ranks,
-                                         'users': users,
-                                         'pagination': pagination,
-                                        },
-                                        context_instance=RequestContext(request));
+    return render_to_response('profiles/list.html',
+                              {
+                              'message': message,
+                              'search_form': FormFields(search_form).fields,
+                              'in_search': in_search,
+                              'active_rank': active_rank,
+                              'default_rank': default_rank,
+                              'items_total': items_total,
+                              'ranks': ranks,
+                              'users': users,
+                              'pagination': pagination,
+                              },
+                              context_instance=RequestContext(request));

+ 8 - 7
misago/apps/register/views.py

@@ -8,6 +8,7 @@ from misago.decorators import block_authenticated, block_banned, block_crawlers,
 from misago.forms import FormLayout
 from misago.messages import Message
 from misago.models import SignInAttempt, User
+from misago.shortcuts import render_to_response
 from misago.utils.views import redirect_message
 from misago.apps.register.forms import UserRegisterForm
 
@@ -75,10 +76,10 @@ def form(request):
                 return redirect(reverse('register'))
     else:
         form = UserRegisterForm(request=request)
-    return request.theme.render_to_response('register.html',
-                                            {
-                                             'message': message,
-                                             'form': FormLayout(form),
-                                             'hide_signin': True, 
-                                            },
-                                            context_instance=RequestContext(request));
+    return render_to_response('register.html',
+                              {
+                              'message': message,
+                              'form': FormLayout(form),
+                              'hide_signin': True, 
+                              },
+                              context_instance=RequestContext(request));

+ 7 - 6
misago/apps/resetpswd/views.py

@@ -5,6 +5,7 @@ from misago.decorators import block_authenticated, block_banned, block_crawlers,
 from misago.forms import FormLayout
 from misago.messages import Message
 from misago.models import Ban, Session, Token, User
+from misago.shortcuts import render_to_response
 from misago.utils.strings import random_string
 from misago.utils.views import redirect_message
 from misago.apps.resetpswd.forms import UserResetPasswordForm
@@ -41,12 +42,12 @@ def form(request):
             message = Message(form.non_field_errors()[0], 'error')
     else:
         form = UserResetPasswordForm(request=request)
-    return request.theme.render_to_response('reset_password.html',
-                                            {
-                                             'message': message,
-                                             'form': FormLayout(form),
-                                            },
-                                            context_instance=RequestContext(request));
+    return render_to_response('reset_password.html',
+                              {
+                              'message': message,
+                              'form': FormLayout(form),
+                              },
+                              context_instance=RequestContext(request));
 
 
 @block_banned

+ 4 - 3
misago/apps/search/views.py

@@ -11,6 +11,7 @@ from misago.decorators import block_crawlers
 from misago.forms import FormFields
 from misago.models import Forum, Thread, Post, User
 from misago.search import SearchException
+from misago.shortcuts import render_to_response
 from misago.utils.pagination import make_pagination
 from misago.apps.errors import error403, error404
 from misago.apps.profiles.views import list as users_list
@@ -64,9 +65,9 @@ class ViewBase(object):
             context['search_thread'] = self.thread_clean
         except AttributeError:
             pass
-        return self.request.theme.render_to_response('search/%s.html' % template,
-                                                     context,
-                                                     context_instance=RequestContext(self.request))
+        return render_to_response('search/%s.html' % template,
+                                  context,
+                                  context_instance=RequestContext(self.request))
 
     def __new__(cls, request, **kwargs):
         obj = super(ViewBase, cls).__new__(cls)

+ 11 - 10
misago/apps/signin/views.py

@@ -12,6 +12,7 @@ from misago.auth import AuthException, auth_admin, auth_forum, sign_user_in
 from misago.decorators import (block_authenticated, block_banned, block_crawlers,
                             block_guest, block_jammed, check_csrf)
 from misago.models import SignInAttempt, Token
+from misago.shortcuts import render_to_response
 from misago.utils.strings import random_string
 from misago.apps.signin.forms import SignInForm
 
@@ -86,16 +87,16 @@ def signin(request):
                           show_remember_me=not request.firewall.admin and request.settings['remember_me_allow'],
                           request=request
                           )
-    return request.theme.render_to_response('signin.html',
-                                            {
-                                             'message': message,
-                                             'bad_password': bad_password,
-                                             'banned_account': banned_account,
-                                             'not_active': not_active,
-                                             'form': FormLayout(form),
-                                             'hide_signin': True,
-                                             },
-                                            context_instance=RequestContext(request));
+    return render_to_response('signin.html',
+                              {
+                              'message': message,
+                              'bad_password': bad_password,
+                              'banned_account': banned_account,
+                              'not_active': not_active,
+                              'form': FormLayout(form),
+                              'hide_signin': True,
+                              },
+                              context_instance=RequestContext(request));
 
 
 @block_crawlers

+ 26 - 25
misago/apps/threadtype/changelog.py

@@ -8,6 +8,7 @@ from misago.apps.errors import error403, error404
 from misago.markdown import post_markdown
 from misago.messages import Message
 from misago.models import Forum, Thread, Post, Change
+from misago.shortcuts import render_to_response
 from misago.utils.datesformats import reldate
 from misago.utils.strings import slugify
 from misago.apps.threadtype.base import ViewBase
@@ -51,16 +52,16 @@ class ChangelogBaseView(ViewBase):
 
 class ChangelogChangesBaseView(ChangelogBaseView):
     def dispatch(self, request, **kwargs):
-        return request.theme.render_to_response('%ss/changelog.html' % self.type_prefix,
-                                                self.template_vars({
-                                                 'type_prefix': self.type_prefix,
-                                                 'forum': self.forum,
-                                                 'parents': self.parents,
-                                                 'thread': self.thread,
-                                                 'post': self.post,
-                                                 'edits': self.post.change_set.prefetch_related('user').order_by('-id')
-                                                 }),
-                                                context_instance=RequestContext(request))
+        return render_to_response('%ss/changelog.html' % self.type_prefix,
+                                  self.template_vars({
+                                      'type_prefix': self.type_prefix,
+                                      'forum': self.forum,
+                                      'parents': self.parents,
+                                      'thread': self.thread,
+                                      'post': self.post,
+                                      'edits': self.post.change_set.prefetch_related('user').order_by('-id')
+                                      }),
+                                  context_instance=RequestContext(request))
 
 
 class ChangelogDiffBaseView(ChangelogBaseView):
@@ -78,21 +79,21 @@ class ChangelogDiffBaseView(ChangelogBaseView):
         except IndexError:
             prev = None
         self.forum.closed = self.proxy.closed
-        return request.theme.render_to_response('%ss/changelog_diff.html' % self.type_prefix,
-                                                self.template_vars({
-                                                 'type_prefix': self.type_prefix,
-                                                 'forum': self.forum,
-                                                 'parents': self.parents,
-                                                 'thread': self.thread,
-                                                 'post': self.post,
-                                                 'change': self.change,
-                                                 'next': next,
-                                                 'prev': prev,
-                                                 'message': request.messages.get_message('changelog'),
-                                                 'l': 1,
-                                                 'diff': difflib.ndiff(self.change.post_content.splitlines(), self.post.post.splitlines()),
-                                                 }),
-                                                context_instance=RequestContext(request))
+        return render_to_response('%ss/changelog_diff.html' % self.type_prefix,
+                                  self.template_vars({
+                                      'type_prefix': self.type_prefix,
+                                      'forum': self.forum,
+                                      'parents': self.parents,
+                                      'thread': self.thread,
+                                      'post': self.post,
+                                      'change': self.change,
+                                      'next': next,
+                                      'prev': prev,
+                                      'message': request.messages.get_message('changelog'),
+                                      'l': 1,
+                                      'diff': difflib.ndiff(self.change.post_content.splitlines(), self.post.post.splitlines()),
+                                      }),
+                                  context_instance=RequestContext(request))
 
 
 class ChangelogRevertBaseView(ChangelogDiffBaseView):

+ 21 - 20
misago/apps/threadtype/details.py

@@ -2,6 +2,7 @@ from django.template import RequestContext
 from misago.acl.exceptions import ACLError403, ACLError404
 from misago.apps.errors import error403, error404
 from misago.models import Forum, Thread, Post
+from misago.shortcuts import render_to_response
 from misago.apps.threadtype.base import ViewBase
 
 class ExtraBaseView(ViewBase):
@@ -44,15 +45,15 @@ class DetailsBaseView(ExtraBaseView):
         self.request.acl.users.allow_details_view()
 
     def response(self):
-        return self.request.theme.render_to_response('%ss/details.html' % self.type_prefix,
-                                                     self.template_vars({
-                                                      'type_prefix': self.type_prefix,
-                                                      'forum': self.forum,
-                                                      'parents': self.parents,
-                                                      'thread': self.thread,
-                                                      'post': self.post,
-                                                     }),
-                                                     context_instance=RequestContext(self.request))
+        return render_to_response('%ss/details.html' % self.type_prefix,
+                                  self.template_vars({
+                                      'type_prefix': self.type_prefix,
+                                      'forum': self.forum,
+                                      'parents': self.parents,
+                                      'thread': self.thread,
+                                      'post': self.post,
+                                      }),
+                                  context_instance=RequestContext(self.request))
 
 
 class KarmaVotesBaseView(ExtraBaseView):
@@ -60,14 +61,14 @@ class KarmaVotesBaseView(ExtraBaseView):
         self.request.acl.threads.allow_post_votes_view(self.forum)
 
     def response(self):
-        return self.request.theme.render_to_response('%ss/karmas.html' % self.type_prefix,
-                                                     self.template_vars({
-                                                      'type_prefix': self.type_prefix,
-                                                      'forum': self.forum,
-                                                      'parents': self.parents,
-                                                      'thread': self.thread,
-                                                      'post': self.post,
-                                                      'upvotes': self.post.karma_set.filter(score=1),
-                                                      'downvotes': self.post.karma_set.filter(score=-1),
-                                                      }),
-                                                     context_instance=RequestContext(self.request))
+        return render_to_response('%ss/karmas.html' % self.type_prefix,
+                                  self.template_vars({
+                                      'type_prefix': self.type_prefix,
+                                      'forum': self.forum,
+                                      'parents': self.parents,
+                                      'thread': self.thread,
+                                      'post': self.post,
+                                      'upvotes': self.post.karma_set.filter(score=1),
+                                      'downvotes': self.post.karma_set.filter(score=-1),
+                                      }),
+                                  context_instance=RequestContext(self.request))

+ 22 - 21
misago/apps/threadtype/list/moderation.py

@@ -5,6 +5,7 @@ from django.utils.translation import ugettext as _
 from misago.forms import FormLayout
 from misago.messages import Message
 from misago.models import Forum, Thread, Post
+from misago.shortcuts import render_to_response
 from misago.apps.threadtype.list.forms import MoveThreadsForm, MergeThreadsForm
 from misago.utils.strings import slugify
 
@@ -113,16 +114,16 @@ class ThreadsListModeration(object):
             self.message = Message(form.non_field_errors()[0], 'error')
         else:
             form = MoveThreadsForm(request=self.request, forum=self.forum)
-        return self.request.theme.render_to_response('%ss/move_threads.html' % self.type_prefix,
-                                                     {
-                                                      'type_prefix': self.type_prefix,
-                                                      'message': self.message,
-                                                      'forum': self.forum,
-                                                      'parents': self.parents,
-                                                      'threads': threads,
-                                                      'form': FormLayout(form),
-                                                      },
-                                                     context_instance=RequestContext(self.request));
+        return render_to_response('%ss/move_threads.html' % self.type_prefix,
+                                  {
+                                  'type_prefix': self.type_prefix,
+                                  'message': self.message,
+                                  'forum': self.forum,
+                                  'parents': self.parents,
+                                  'threads': threads,
+                                  'form': FormLayout(form),
+                                  },
+                                  context_instance=RequestContext(self.request));
 
     def action_merge(self, ids):
         if len(ids) < 2:
@@ -169,17 +170,17 @@ class ThreadsListModeration(object):
             else:
                 lookback = thread.last_post_id
 
-        return self.request.theme.render_to_response(('%ss/merge.html' % self.type_prefix),
-                                                     {
-                                                      'type_prefix': self.type_prefix,
-                                                      'message': self.message,
-                                                      'warning': warning,
-                                                      'forum': self.forum,
-                                                      'parents': self.parents,
-                                                      'threads': threads,
-                                                      'form': FormLayout(form),
-                                                      },
-                                                     context_instance=RequestContext(self.request));
+        return render_to_response('%ss/merge.html' % self.type_prefix,
+                                  {
+                                  'type_prefix': self.type_prefix,
+                                  'message': self.message,
+                                  'warning': warning,
+                                  'forum': self.forum,
+                                  'parents': self.parents,
+                                  'threads': threads,
+                                  'form': FormLayout(form),
+                                  },
+                                  context_instance=RequestContext(self.request));
 
     def action_open(self, ids):
         if self._action_open(ids):

+ 13 - 12
misago/apps/threadtype/list/views.py

@@ -10,6 +10,7 @@ from misago.forms import Form, FormFields
 from misago.messages import Message
 from misago.models import Forum, Thread, Post
 from misago.readstrackers import ForumsTracker
+from misago.shortcuts import render_to_response
 from misago.apps.threadtype.base import ViewBase
 
 class ThreadsListBaseView(ViewBase):
@@ -117,15 +118,15 @@ class ThreadsListBaseView(ViewBase):
         # Merge proxy into forum
         self.forum.closed = self.proxy.closed
 
-        return request.theme.render_to_response('%ss/%s.html' % (self.type_prefix, self.template),
-                                                self.template_vars({
-                                                 'type_prefix': self.type_prefix,
-                                                 'message': self.message,
-                                                 'forum': self.forum,
-                                                 'parents': self.parents,
-                                                 'count': self.count,
-                                                 'list_form': FormFields(self.form).fields if self.form else None,
-                                                 'threads': self.threads,
-                                                 'pagination': self.pagination,
-                                                 }),
-                                                context_instance=RequestContext(request));
+        return render_to_response('%ss/%s.html' % (self.type_prefix, self.template),
+                                  self.template_vars({
+                                      'type_prefix': self.type_prefix,
+                                      'message': self.message,
+                                      'forum': self.forum,
+                                      'parents': self.parents,
+                                      'count': self.count,
+                                      'list_form': FormFields(self.form).fields if self.form else None,
+                                      'threads': self.threads,
+                                      'pagination': self.pagination,
+                                      }),
+                                  context_instance=RequestContext(request));

+ 16 - 15
misago/apps/threadtype/posting/base.py

@@ -6,6 +6,7 @@ from misago.forms import FormLayout
 from misago.markdown import emojis, post_markdown
 from misago.messages import Message
 from misago.models import Forum, Thread, Post, WatchedThread
+from misago.shortcuts import render_to_response
 from misago.utils.translation import ugettext_lazy
 from misago.apps.threadtype.base import ViewBase
 from misago.apps.threadtype.thread.forms import QuickReplyForm
@@ -147,18 +148,18 @@ class PostingBaseView(ViewBase):
         except ACLError404 as e:
             return error404(request, unicode(e))
 
-        return request.theme.render_to_response(('%ss/posting.html' % self.type_prefix),
-                                                self.template_vars({
-                                                 'type_prefix': self.type_prefix,
-                                                 'action': self.action,
-                                                 'message': self.message,
-                                                 'forum': self.forum,
-                                                 'thread': self.thread,
-                                                 'quote': self.quote,
-                                                 'post': self.post,
-                                                 'parents': self.parents,
-                                                 'preview': post_preview,
-                                                 'form': FormLayout(form),
-                                                 'emojis': emojis(),
-                                                 }),
-                                                context_instance=RequestContext(request));
+        return render_to_response('%ss/posting.html' % self.type_prefix,
+                                  self.template_vars({
+                                      'type_prefix': self.type_prefix,
+                                      'action': self.action,
+                                      'message': self.message,
+                                      'forum': self.forum,
+                                      'thread': self.thread,
+                                      'quote': self.quote,
+                                      'post': self.post,
+                                      'parents': self.parents,
+                                      'preview': post_preview,
+                                      'form': FormLayout(form),
+                                      'emojis': emojis(),
+                                      }),
+                                  context_instance=RequestContext(request));

+ 23 - 22
misago/apps/threadtype/thread/moderation/posts.py

@@ -7,6 +7,7 @@ from django.utils.translation import ugettext as _
 from misago.forms import FormLayout
 from misago.markdown import post_markdown
 from misago.messages import Message
+from misago.shortcuts import render_to_response
 from misago.utils.strings import slugify
 from misago.apps.threadtype.thread.moderation.forms import SplitThreadForm, MovePostsForm
 
@@ -88,17 +89,17 @@ class PostsModeration(object):
                                                                   'thread_name': _('[Split] %s') % self.thread.name,
                                                                   'thread_forum': self.forum,
                                                                   })
-        return self.request.theme.render_to_response('%ss/split.html' % self.type_prefix,
-                                                     {
-                                                      'type_prefix': self.type_prefix,
-                                                      'message': message,
-                                                      'forum': self.forum,
-                                                      'parents': self.parents,
-                                                      'thread': self.thread,
-                                                      'posts': ids,
-                                                      'form': FormLayout(form),
-                                                      },
-                                                     context_instance=RequestContext(self.request));
+        return render_to_response('%ss/split.html' % self.type_prefix,
+                                  {
+                                  'type_prefix': self.type_prefix,
+                                  'message': message,
+                                  'forum': self.forum,
+                                  'parents': self.parents,
+                                  'thread': self.thread,
+                                  'posts': ids,
+                                  'form': FormLayout(form),
+                                  },
+                                  context_instance=RequestContext(self.request));
 
     def post_action_move(self, ids):
         message = None
@@ -127,17 +128,17 @@ class PostsModeration(object):
             message = Message(form.non_field_errors()[0], 'error')
         else:
             form = MovePostsForm(request=self.request)
-        return self.request.theme.render_to_response('%ss/move_posts.html' % self.type_prefix,
-                                                     {
-                                                      'type_prefix': self.type_prefix,
-                                                      'message': message,
-                                                      'forum': self.forum,
-                                                      'parents': self.parents,
-                                                      'thread': self.thread,
-                                                      'posts': ids,
-                                                      'form': FormLayout(form),
-                                                      },
-                                                     context_instance=RequestContext(self.request));
+        return render_to_response('%ss/move_posts.html' % self.type_prefix,
+                                  {
+                                  'type_prefix': self.type_prefix,
+                                  'message': message,
+                                  'forum': self.forum,
+                                  'parents': self.parents,
+                                  'thread': self.thread,
+                                  'posts': ids,
+                                  'form': FormLayout(form),
+                                  },
+                                  context_instance=RequestContext(self.request));
 
     def post_action_protect(self, ids):
         protected = 0

+ 11 - 10
misago/apps/threadtype/thread/moderation/thread.py

@@ -2,6 +2,7 @@ from django.template import RequestContext
 from django.utils.translation import ugettext as _
 from misago.forms import Form, FormLayout
 from misago.messages import Message
+from misago.shortcuts import render_to_response
 from misago.apps.threadtype.list.forms import MoveThreadsForm
 
 class ThreadModeration(object):
@@ -72,16 +73,16 @@ class ThreadModeration(object):
             message = Message(form.non_field_errors()[0], 'error')
         else:
             form = MoveThreadsForm(request=self.request, forum=self.forum)
-        return self.request.theme.render_to_response('%ss/move_thread.html' % self.type_prefix,
-                                                     {
-                                                      'type_prefix': self.type_prefix,
-                                                      'message': message,
-                                                      'forum': self.forum,
-                                                      'parents': self.parents,
-                                                      'thread': self.thread,
-                                                      'form': FormLayout(form),
-                                                      },
-                                                     context_instance=RequestContext(self.request));
+        return render_to_response('%ss/move_thread.html' % self.type_prefix,
+                                  {
+                                  'type_prefix': self.type_prefix,
+                                  'message': message,
+                                  'forum': self.forum,
+                                  'parents': self.parents,
+                                  'thread': self.thread,
+                                  'form': FormLayout(form),
+                                  },
+                                  context_instance=RequestContext(self.request));
 
     def thread_action_open(self):
         self.thread.closed = False

+ 20 - 19
misago/apps/threadtype/thread/views.py

@@ -13,6 +13,7 @@ from misago.markdown import emojis
 from misago.messages import Message
 from misago.models import Forum, Thread, Post, Karma, WatchedThread
 from misago.readstrackers import ThreadsTracker
+from misago.shortcuts import render_to_response
 from misago.utils.pagination import make_pagination
 from misago.apps.threadtype.base import ViewBase
 from misago.apps.threadtype.thread.forms import QuickReplyForm
@@ -206,22 +207,22 @@ class ThreadBaseView(ViewBase):
         # Merge proxy into forum
         self.forum.closed = self.proxy.closed
 
-        return request.theme.render_to_response('%ss/thread.html' % self.type_prefix,
-                                                self.template_vars({
-                                                 'type_prefix': self.type_prefix,
-                                                 'message': self.message,
-                                                 'forum': self.forum,
-                                                 'parents': self.parents,
-                                                 'thread': self.thread,
-                                                 'is_read': self.tracker.is_read(self.thread),
-                                                 'count': self.count,
-                                                 'posts': self.posts,
-                                                 'ignored_posts': self.ignored,
-                                                 'watcher': self.watcher,
-                                                 'pagination': self.pagination,
-                                                 'emojis': emojis(),
-                                                 'quick_reply': FormFields(QuickReplyForm(request=request)).fields,
-                                                 'thread_form': FormFields(self.thread_form).fields if self.thread_form else None,
-                                                 'posts_form': FormFields(self.posts_form).fields if self.posts_form else None,
-                                                 }),
-                                                context_instance=RequestContext(request));
+        return render_to_response('%ss/thread.html' % self.type_prefix,
+                                  self.template_vars({
+                                      'type_prefix': self.type_prefix,
+                                      'message': self.message,
+                                      'forum': self.forum,
+                                      'parents': self.parents,
+                                      'thread': self.thread,
+                                      'is_read': self.tracker.is_read(self.thread),
+                                      'count': self.count,
+                                      'posts': self.posts,
+                                      'ignored_posts': self.ignored,
+                                      'watcher': self.watcher,
+                                      'pagination': self.pagination,
+                                      'emojis': emojis(),
+                                      'quick_reply': FormFields(QuickReplyForm(request=request)).fields,
+                                      'thread_form': FormFields(self.thread_form).fields if self.thread_form else None,
+                                      'posts_form': FormFields(self.posts_form).fields if self.posts_form else None,
+                                      }),
+                                  context_instance=RequestContext(request));

+ 3 - 2
misago/apps/tos.py

@@ -1,8 +1,9 @@
 from django.template import RequestContext
+from misago.shortcuts import render_to_response
 from misago.apps.errors import error404
 
 def tos(request):
     if request.settings.tos_url or not request.settings.tos_content:
         return error404(request)
-    return request.theme.render_to_response('forum_tos.html',
-                                            context_instance=RequestContext(request));
+    return render_to_response('forum_tos.html',
+                              context_instance=RequestContext(request));

+ 25 - 29
misago/apps/usercp/avatar/views.py

@@ -11,6 +11,7 @@ from misago.apps.errors import error404
 from misago.decorators import block_guest
 from misago.forms import FormLayout
 from misago.messages import Message
+from misago.shortcuts import render_to_response
 from misago.utils.strings import random_string
 from misago.utils.avatars import resizeimage
 from misago.apps.usercp.template import RequestContext
@@ -20,10 +21,9 @@ def avatar_view(f):
     def decorator(*args, **kwargs):
         request = args[0]
         if request.user.avatar_ban:
-            return request.theme.render_to_response('usercp/avatar_banned.html',
-                                                    context_instance=RequestContext(request, {
-                                                     'tab': 'avatar',
-                                                     }));
+            return render_to_response('usercp/avatar_banned.html',
+                                      context_instance=RequestContext(request, {
+                                          'tab': 'avatar'}));
         return f(*args, **kwargs)
     return decorator
 
@@ -32,11 +32,10 @@ def avatar_view(f):
 @avatar_view
 def avatar(request):
     message = request.messages.get_message('usercp_avatar')
-    return request.theme.render_to_response('usercp/avatar.html',
-                                            context_instance=RequestContext(request, {
-                                             'message': message,
-                                             'tab': 'avatar',
-                                             }));
+    return render_to_response('usercp/avatar.html',
+                              context_instance=RequestContext(request, {
+                                  'message': message,
+                                  'tab': 'avatar'}));
 
 
 @block_guest
@@ -94,12 +93,11 @@ def gallery(request):
         else:
             message = Message(_("Request authorisation is invalid."), 'error')
 
-    return request.theme.render_to_response('usercp/avatar_gallery.html',
-                                            context_instance=RequestContext(request, {
-                                             'message': message,
-                                             'galleries': galleries,
-                                             'tab': 'avatar',
-                                             }));
+    return render_to_response('usercp/avatar_gallery.html',
+                              context_instance=RequestContext(request, {
+                                  'message': message,
+                                  'galleries': galleries,
+                                  'tab': 'avatar'}));
 
 
 @block_guest
@@ -162,12 +160,11 @@ def upload(request):
     else:
         form = UploadAvatarForm(request=request)
 
-    return request.theme.render_to_response('usercp/avatar_upload.html',
-                                            context_instance=RequestContext(request, {
-                                             'message': message,
-                                             'form': FormLayout(form),
-                                             'tab': 'avatar',
-                                             }));
+    return render_to_response('usercp/avatar_upload.html',
+                              context_instance=RequestContext(request, {
+                                  'message': message,
+                                  'form': FormLayout(form),
+                                  'tab': 'avatar'}));
 
 
 @block_guest
@@ -223,11 +220,10 @@ def crop(request, upload=False):
             message = Message(_("Request authorisation is invalid."), 'error')
 
 
-    return request.theme.render_to_response('usercp/avatar_crop.html',
-                                            context_instance=RequestContext(request, {
-                                             'message': message,
-                                             'after_upload': upload,
-                                             'avatar_size': settings.AVATAR_SIZES[0],
-                                             'source': 'avatars/%s' % (request.user.avatar_temp if upload else request.user.avatar_original),
-                                             'tab': 'avatar',
-                                             }));
+    return render_to_response('usercp/avatar_crop.html',
+                              context_instance=RequestContext(request, {
+                                  'message': message,
+                                  'after_upload': upload,
+                                  'avatar_size': settings.AVATAR_SIZES[0],
+                                  'source': 'avatars/%s' % (request.user.avatar_temp if upload else request.user.avatar_original),
+                                  'tab': 'avatar'}));

+ 6 - 6
misago/apps/usercp/credentials/views.py

@@ -6,6 +6,7 @@ from misago.apps.errors import error404
 from misago.decorators import block_guest
 from misago.forms import FormLayout
 from misago.messages import Message
+from misago.shortcuts import render_to_response
 from misago.utils.strings import random_string
 from misago.apps.usercp.template import RequestContext
 from misago.apps.usercp.credentials.forms import CredentialsChangeForm
@@ -39,12 +40,11 @@ def credentials(request):
     else:
         form = CredentialsChangeForm(request=request)
 
-    return request.theme.render_to_response('usercp/credentials.html',
-                                            context_instance=RequestContext(request, {
-                                             'message': message,
-                                             'form': FormLayout(form),
-                                             'tab': 'credentials',
-                                             }));
+    return render_to_response('usercp/credentials.html',
+                              context_instance=RequestContext(request, {
+                                  'message': message,
+                                  'form': FormLayout(form),
+                                  'tab': 'credentials'}));
 
 
 @block_guest

+ 6 - 6
misago/apps/usercp/options/views.py

@@ -4,6 +4,7 @@ from django.utils.translation import ugettext as _
 from misago.decorators import block_guest
 from misago.forms import FormLayout
 from misago.messages import Message
+from misago.shortcuts import render_to_response
 from misago.apps.usercp.options.forms import UserForumOptionsForm
 from misago.apps.usercp.template import RequestContext
 
@@ -33,9 +34,8 @@ def options(request):
                                                              'subscribe_reply': request.user.subscribe_reply,
                                                              })
 
-    return request.theme.render_to_response('usercp/options.html',
-                                            context_instance=RequestContext(request, {
-                                             'message': message,
-                                             'tab': 'options',
-                                             'form': FormLayout(form)
-                                             }));
+    return render_to_response('usercp/options.html',
+                              context_instance=RequestContext(request, {
+                                  'message': message,
+                                  'tab': 'options',
+                                  'form': FormLayout(form)}));

+ 9 - 10
misago/apps/usercp/signature/views.py

@@ -6,6 +6,7 @@ from misago.decorators import block_guest
 from misago.forms import FormLayout
 from misago.markdown import signature_markdown
 from misago.messages import Message
+from misago.shortcuts import render_to_response
 from misago.apps.usercp.template import RequestContext
 from misago.apps.usercp.signature.forms import SignatureForm
 
@@ -15,10 +16,9 @@ def signature(request):
     if not request.acl.usercp.can_use_signature():
         return error403(request)
     if request.user.signature_ban:
-        return request.theme.render_to_response('usercp/signature_banned.html',
-                                                context_instance=RequestContext(request, {
-                                                 'tab': 'signature',
-                                                 }));
+        return render_to_response('usercp/signature_banned.html',
+                                  context_instance=RequestContext(request, {
+                                      'tab': 'signature'}));
 
     siggy_text = ''
     message = request.messages.get_message('usercp_signature')
@@ -39,9 +39,8 @@ def signature(request):
     else:
         form = SignatureForm(request=request, initial={'signature': request.user.signature})
 
-    return request.theme.render_to_response('usercp/signature.html',
-                                            context_instance=RequestContext(request, {
-                                             'message': message,
-                                             'tab': 'signature',
-                                             'form': FormLayout(form),
-                                             }));
+    return render_to_response('usercp/signature.html',
+                              context_instance=RequestContext(request, {
+                                  'message': message,
+                                  'tab': 'signature',
+                                  'form': FormLayout(form)}));

+ 9 - 9
misago/apps/usercp/username/views.py

@@ -9,6 +9,7 @@ from misago.decorators import block_guest
 from misago.forms import FormLayout
 from misago.messages import Message
 from misago.models import Alert, User, UsernameChange
+from misago.shortcuts import render_to_response
 from misago.utils.translation import ugettext_lazy
 from misago.apps.usercp.template import RequestContext
 from misago.apps.usercp.username.forms import UsernameChangeForm
@@ -60,12 +61,11 @@ def username(request):
     else:
         form = UsernameChangeForm(request=request)
 
-    return request.theme.render_to_response('usercp/username.html',
-                                            context_instance=RequestContext(request, {
-                                             'message': message,
-                                             'changes_left': changes_left,
-                                             'form': FormLayout(form),
-                                             'next_change': next_change,
-                                             'changes_history': request.user.namechanges.order_by('-date')[:10],
-                                             'tab': 'username',
-                                             }));
+    return render_to_response('usercp/username.html',
+                              context_instance=RequestContext(request, {
+                                  'message': message,
+                                  'changes_left': changes_left,
+                                  'form': FormLayout(form),
+                                  'next_change': next_change,
+                                  'changes_history': request.user.namechanges.order_by('-date')[:10],
+                                  'tab': 'username'}));

+ 10 - 9
misago/apps/watchedthreads/views.py

@@ -9,6 +9,7 @@ from misago.decorators import block_guest
 from misago.forms import Form, FormLayout, FormFields
 from misago.messages import Message
 from misago.models import Forum, WatchedThread
+from misago.shortcuts import render_to_response
 from misago.utils.pagination import make_pagination
 
 @block_guest
@@ -40,12 +41,12 @@ def watched_threads(request, page=0, new=False):
         threads.append(thread.thread)
             
     # Display page
-    return request.theme.render_to_response('watched.html',
-                                            {
-                                             'items_total': count,
-                                             'pagination': pagination,
-                                             'new': new,
-                                             'threads': threads,
-                                             'message': request.messages.get_message('threads'),
-                                             },
-                                            context_instance=RequestContext(request))
+    return render_to_response('watched.html',
+                              {
+                              'items_total': count,
+                              'pagination': pagination,
+                              'new': new,
+                              'threads': threads,
+                              'message': request.messages.get_message('threads'),
+                              },
+                              context_instance=RequestContext(request))

+ 2 - 1
misago/firewalls.py

@@ -2,6 +2,7 @@ from django.conf import settings
 from django.utils.translation import ugettext_lazy as _
 from misago.admin import ADMIN_PATH
 from misago.messages import Message
+from misago.template.theme import reset_theme
 from misago.apps.errors import error403, error404
 from misago.apps.signin.views import signin
 
@@ -26,7 +27,7 @@ class FirewallAdmin(FirewallForum):
     def process_view(self, request, callback, callback_args, callback_kwargs):
         # Block all crawlers with 403
         if request.user.is_crawler():
-            request.theme.reset_theme()
+            reset_theme()
             return error403(request)
         else:
             # If we are not authenticated or not admin, force us to sign in right way

+ 2 - 2
misago/middleware/firewalls.py

@@ -1,6 +1,6 @@
 from django.conf import settings
 from misago.firewalls import *
-from misago.theme import Theme
+from misago.template.theme import activate_theme
 
 class FirewallMiddleware(object):
     firewall_admin = FirewallAdmin()
@@ -9,7 +9,7 @@ class FirewallMiddleware(object):
     def process_request(self, request):
         if settings.ADMIN_PATH and self.firewall_admin.behind_firewall(request.path_info):
             request.firewall = self.firewall_admin
-            request.theme.set_theme('admin')
+            activate_theme('admin')
         else:
             request.firewall = self.firewall_forum
 

+ 1 - 1
misago/middleware/theme.py

@@ -1,7 +1,7 @@
 from urlparse import urlparse
 from django.conf import settings
 from django.core.cache import cache
-from misago.template.theme import activate_theme, active_theme
+from misago.template.theme import activate_theme
 
 class ThemeMiddleware(object):
     def process_request(self, request):

+ 8 - 3
misago/models/usermodel.py

@@ -15,6 +15,7 @@ from django.utils import timezone as tz_util
 from django.utils.translation import ugettext_lazy as _
 from misago.acl.builder import acl
 from misago.signals import delete_user_content, rename_user, sync_user_profile
+from misago.template.loader import render_to_string
 from misago.utils.avatars import avatar_size
 from misago.utils.strings import random_string, slugify
 from misago.validators import validate_username, validate_password, validate_email
@@ -475,11 +476,15 @@ class User(models.Model):
         return ''
 
     def email_user(self, request, template, subject, context={}):
-        templates = request.theme.get_email_templates(template)
         context = RequestContext(request, context)
         context['author'] = context['user']
         context['user'] = self
 
+        email_html = render_to_string('_email/%s.html' % template,
+                                      context_instance=context)
+        email_text = render_to_string('_email/%s.txt' % template,
+                                      context_instance=context)
+
         # Set message recipient
         if settings.DEBUG and settings.CATCH_ALL_EMAIL_ADDRESS:
             recipient = settings.CATCH_ALL_EMAIL_ADDRESS
@@ -487,8 +492,8 @@ class User(models.Model):
             recipient = self.email
 
         # Build message and add it to queue
-        email = EmailMultiAlternatives(subject, templates[0].render(context), settings.EMAIL_HOST_USER, [recipient])
-        email.attach_alternative(templates[1].render(context), "text/html")
+        email = EmailMultiAlternatives(subject, email_text, settings.EMAIL_HOST_USER, [recipient])
+        email.attach_alternative(email_html, "text/html")
         request.mails_queue.append(email)
 
     def get_activation(self):

+ 3 - 0
misago/settings_base.py

@@ -77,6 +77,9 @@ TEMPLATE_LOADERS = (
     'django_jinja.loaders.FileSystemLoader',
 )
 
+# Template extensions that will cause Jinja2 to be used
+DEFAULT_JINJA2_TEMPLATE_EXTENSION = ('.html', '.txt')
+
 # Context processors
 TEMPLATE_CONTEXT_PROCESSORS = (
     'django.core.context_processors.debug',

+ 1 - 0
misago/shortcuts.py

@@ -2,6 +2,7 @@ from django.shortcuts import (redirect, render as django_render,
                               render_to_response as django_render_to_response)
 from misago.template.middlewares import process_context
 from misago.template.theme import prefix_templates
+from misago.utils.views import redirect_message, json_response
 
 def render(request, template_name, dictionary=None, **kwargs):
     dictionary = process_context(template_name, dictionary, kwargs.pop('context_instance', None))

+ 4 - 0
misago/template/theme.py

@@ -19,6 +19,10 @@ def activate_theme(theme):
     _thread_local.misago_template_mutex = False
 
 
+def reset_theme():
+    _thread_local.misago_theme = settings.INSTALLED_THEMES[0];
+
+
 def active_theme():
     try:
         return _thread_local.misago_theme

+ 0 - 9
misago/utils/views.py

@@ -14,12 +14,3 @@ def json_response(request, json=None, status=200, message=None):
     json.update({'code': status, 'message': unicode(message)})
     response = json_dumps(json, sort_keys=True,  ensure_ascii=False)
     return HttpResponse(response, content_type='application/json', status=status)
-
-
-def ajax_response(request, template=None, macro=None, vars=None, json=None, status=200, message=None):
-    html = ''
-    vars = vars or {}    
-    json = json or {}
-    if macro:
-        html = request.theme.macro(template, macro, vars, context_instance=RequestContext(request));
-    return json_response(request, json.update({'html': html}), status, message)