From 5b951d7db05a103523eaa9a0729ea0f2909127e8 Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Sat, 17 Nov 2012 17:57:09 -0300 Subject: added django-style template loader class and replaced render_into_skin with render --- askbot/deps/django_authopenid/views.py | 21 +++++---- askbot/mail/lamson_handlers.py | 8 ++-- askbot/mail/messages.py | 4 +- .../commands/send_accept_answer_reminders.py | 4 +- .../commands/send_unanswered_question_reminders.py | 4 +- askbot/media/style/style.less | 2 +- askbot/models/__init__.py | 4 +- askbot/models/post.py | 8 ++-- askbot/models/question.py | 2 +- askbot/setup_templates/settings.py.mustache | 5 +- askbot/skins/loaders.py | 54 +++++++--------------- askbot/startup_procedures.py | 29 ++++++++---- askbot/tasks.py | 3 +- askbot/templates/404.html | 49 ++++++++++++++++++-- askbot/templates/404.jinja.html | 44 ------------------ askbot/templates/500.html | 25 ++++++++++ askbot/templates/500.jinja.html | 25 ---------- askbot/templatetags/extra_tags.py | 8 ++-- askbot/tests/email_parsing_tests.py | 2 +- askbot/tests/post_model_tests.py | 2 +- askbot/views/avatar_views.py | 14 ++++-- askbot/views/commands.py | 13 +++--- askbot/views/meta.py | 32 ++++++------- askbot/views/readers.py | 49 ++++++++++++-------- askbot/views/users.py | 38 ++++++++------- askbot/views/widgets.py | 52 ++++++++++++--------- askbot/views/writers.py | 14 +++--- 27 files changed, 260 insertions(+), 255 deletions(-) delete mode 100644 askbot/templates/404.jinja.html create mode 100644 askbot/templates/500.html delete mode 100644 askbot/templates/500.jinja.html diff --git a/askbot/deps/django_authopenid/views.py b/askbot/deps/django_authopenid/views.py index 05e0cdc5..9e383b49 100644 --- a/askbot/deps/django_authopenid/views.py +++ b/askbot/deps/django_authopenid/views.py @@ -41,6 +41,8 @@ from django.contrib.auth.decorators import login_required from django.contrib.auth import authenticate from django.core.urlresolvers import reverse from django.forms.util import ErrorList +from django.shortcuts import render +from django.template.loader import get_template from django.views.decorators import csrf from django.utils.encoding import smart_unicode from django.utils.html import escape @@ -48,7 +50,6 @@ from django.utils.translation import ugettext as _ from django.utils.safestring import mark_safe from askbot.mail import send_mail from recaptcha_works.decorators import fix_recaptcha_remote_ip -from askbot.skins.loaders import render_into_skin, get_template from askbot.deps.django_authopenid.ldap_auth import ldap_create_user from askbot.deps.django_authopenid.ldap_auth import ldap_authenticate from askbot.utils.loading import load_module @@ -169,7 +170,7 @@ def logout_page(request): 'page_class': 'meta', 'have_federated_login_methods': util.have_enabled_federated_login_methods() } - return render_into_skin('authopenid/logout.html', data, request) + return render(request, 'authopenid/logout.html', data) def get_url_host(request): if request.is_secure(): @@ -721,7 +722,7 @@ def show_signin_view( data['major_login_providers'] = major_login_providers.values() data['minor_login_providers'] = minor_login_providers.values() - return render_into_skin(template_name, data, request) + return render(request, template_name, data) @login_required def delete_login_method(request): @@ -993,7 +994,7 @@ def register(request, login_provider_name=None, user_identifier=None): 'login_type':'openid', 'gravatar_faq_url':reverse('faq') + '#gravatar', } - return render_into_skin('authopenid/complete.html', data, request) + return render(request, 'authopenid/complete.html', data) def signin_failure(request, message): """ @@ -1052,7 +1053,7 @@ def verify_email_and_register(request): return HttpResponseRedirect(reverse('index')) else: data = {'page_class': 'validate-email-page'} - return render_into_skin('authopenid/verify_email.html', data, request) + return render(request, 'authopenid/verify_email.html', data) @not_authenticated @decorators.valid_password_login_provider_required @@ -1138,10 +1139,10 @@ def signup_with_password(request): 'minor_login_providers': minor_login_providers.values(), 'login_form': login_form } - return render_into_skin( + return render( + request, 'authopenid/signup_with_password.html', - context_data, - request + context_data ) #what if request is not posted? @@ -1201,7 +1202,7 @@ def send_email_key(email, key, handler_url_name='user_account_recover'): '?validation_code=' + key } template = get_template('authopenid/email_validation.html') - message = template.render(data) + message = template.render(data)#todo: inject language preference send_mail(subject, message, django_settings.DEFAULT_FROM_EMAIL, [email]) def send_user_new_email_key(user): @@ -1273,4 +1274,4 @@ def validation_email_sent(request): 'change_email_url': reverse('user_changeemail'), 'action_type': 'validate' } - return render_into_skin('authopenid/changeemail.html', data, request) + return render(request, 'authopenid/changeemail.html', data) diff --git a/askbot/mail/lamson_handlers.py b/askbot/mail/lamson_handlers.py index d1f0c71d..8bfa86f7 100644 --- a/askbot/mail/lamson_handlers.py +++ b/askbot/mail/lamson_handlers.py @@ -3,13 +3,13 @@ import functools from django.core.files.uploadedfile import SimpleUploadedFile from django.conf import settings as django_settings from django.template import Context +from django.template.loader import get_template from django.utils.translation import ugettext as _ from lamson.routing import route, stateless from lamson.server import Relay from askbot.models import ReplyAddress, Group, Tag from askbot import mail from askbot.conf import settings as askbot_settings -from askbot.skins.loaders import get_template #we might end up needing to use something like this #to distinguish the reply text from the quoted original message @@ -166,7 +166,7 @@ def process_reply(func): if error is not None: template = get_template('email/reply_by_email_error.html') - body_text = template.render(Context({'error':error})) + body_text = template.render(Context({'error':error}))#todo: set lang mail.send_mail( subject_line = "Error posting your reply", body_text = body_text, @@ -243,7 +243,7 @@ def VALIDATE_EMAIL( mail.send_mail( subject_line = _('Re: Welcome to %(site_name)s') % data, - body_text = template.render(Context(data)), + body_text = template.render(Context(data)),#todo: set lang recipient_list = [from_address,] ) except ValueError: @@ -312,6 +312,6 @@ def PROCESS( mail.send_mail( subject_line = _('Re: %s') % subject_line, - body_text = template.render(Context(data)), + body_text = template.render(Context(data)),#todo: set lang recipient_list = [from_address,] ) diff --git a/askbot/mail/messages.py b/askbot/mail/messages.py index 3ab3ff2f..0e888545 100644 --- a/askbot/mail/messages.py +++ b/askbot/mail/messages.py @@ -3,8 +3,8 @@ of email messages for various occasions """ import functools from django.template import Context +from django.template.loader import get_template from askbot.conf import settings as askbot_settings -from askbot.skins.loaders import get_template from askbot.utils import html as html_utils def message(template = None): @@ -16,7 +16,7 @@ def message(template = None): def wrapped(*args, **kwargs): template_object = get_template(template) data = func(*args, **kwargs) - return template_object.render(Context(data)) + return template_object.render(Context(data))#todo: set lang return wrapped return decorate diff --git a/askbot/management/commands/send_accept_answer_reminders.py b/askbot/management/commands/send_accept_answer_reminders.py index 119d7611..2b8b0851 100644 --- a/askbot/management/commands/send_accept_answer_reminders.py +++ b/askbot/management/commands/send_accept_answer_reminders.py @@ -1,6 +1,7 @@ import datetime from django.core.management.base import NoArgsCommand from django.conf import settings as django_settings +from django.template.loader import get_template from askbot import models from askbot import const from askbot.conf import settings as askbot_settings @@ -8,7 +9,6 @@ from django.utils.translation import ugettext as _ from django.utils.translation import ungettext from askbot import mail from askbot.utils.classes import ReminderSchedule -from askbot.skins.loaders import get_template from django.template import Context DEBUG_THIS_COMMAND = False @@ -73,7 +73,7 @@ class Command(NoArgsCommand): } template = get_template('email/accept_answer_reminder.html') - body_text = template.render(Context(data)) + body_text = template.render(Context(data))#todo: set lang if DEBUG_THIS_COMMAND: print "User: %s
\nSubject:%s
\nText: %s
\n" % \ diff --git a/askbot/management/commands/send_unanswered_question_reminders.py b/askbot/management/commands/send_unanswered_question_reminders.py index 3fa390ad..982dbafb 100644 --- a/askbot/management/commands/send_unanswered_question_reminders.py +++ b/askbot/management/commands/send_unanswered_question_reminders.py @@ -1,4 +1,5 @@ from django.core.management.base import NoArgsCommand +from django.template.loader import get_template from askbot import models from askbot import const from askbot.conf import settings as askbot_settings @@ -6,7 +7,6 @@ from django.utils.translation import ungettext from askbot import mail from askbot.utils.classes import ReminderSchedule from askbot.models.question import Thread -from askbot.skins.loaders import get_template from django.template import Context DEBUG_THIS_COMMAND = False @@ -78,7 +78,7 @@ class Command(NoArgsCommand): } template = get_template('email/unanswered_question_reminder.html') - body_text = template.render(Context(data)) + body_text = template.render(Context(data))#todo: set lang if DEBUG_THIS_COMMAND: diff --git a/askbot/media/style/style.less b/askbot/media/style/style.less index ed0e0572..69f4daf7 100644 --- a/askbot/media/style/style.less +++ b/askbot/media/style/style.less @@ -531,7 +531,7 @@ body.anon { #searchBar { width: 500px; .searchInput { - width: 440px; + width: 435px; } .searchInputCancelable { diff --git a/askbot/models/__init__.py b/askbot/models/__init__.py index c2c4a58d..0da80c4c 100644 --- a/askbot/models/__init__.py +++ b/askbot/models/__init__.py @@ -21,6 +21,7 @@ from celery.task import task from django.core.urlresolvers import reverse, NoReverseMatch from django.db.models import signals as django_signals from django.template import Context +from django.template.loader import get_template from django.utils.translation import ugettext as _ from django.utils.translation import ungettext from django.utils.safestring import mark_safe @@ -3438,9 +3439,8 @@ def send_respondable_email_validation_message( ) data['email_code'] = reply_address.address - from askbot.skins.loaders import get_template template = get_template(template_name) - body_text = template.render(Context(data)) + body_text = template.render(Context(data))#todo: set lang reply_to_address = 'welcome-%s@%s' % ( reply_address.address, diff --git a/askbot/models/post.py b/askbot/models/post.py index 03791e5e..ce7b249b 100644 --- a/askbot/models/post.py +++ b/askbot/models/post.py @@ -862,8 +862,8 @@ class Post(models.Model): if quote_level > 0, the post will be indented that number of times todo: move to views? """ - from askbot.skins.loaders import get_template from django.template import Context + from django.template.loader import get_template template = get_template('email/quoted_post.html') data = { 'post': self, @@ -871,7 +871,7 @@ class Post(models.Model): 'is_leaf_post': is_leaf_post, 'format': format } - return template.render(Context(data)) + return template.render(Context(data))#todo: set lang def format_for_email_as_parent_thread_summary(self): """format for email as summary of parent posts @@ -895,10 +895,10 @@ class Post(models.Model): """outputs question or answer and all it's comments returns empty string for all other post types """ - from askbot.skins.loaders import get_template from django.template import Context + from django.template.loader import get_template template = get_template('email/post_as_subthread.html') - return template.render(Context({'post': self})) + return template.render(Context({'post': self}))#todo: set lang def set_cached_comments(self, comments): """caches comments in the lifetime of the object diff --git a/askbot/models/question.py b/askbot/models/question.py index f7ead369..5c0d5732 100644 --- a/askbot/models/question.py +++ b/askbot/models/question.py @@ -8,6 +8,7 @@ from django.contrib.auth.models import User from django.core import cache # import cache, not from cache import cache, to be able to monkey-patch cache.cache in test cases from django.core import exceptions as django_exceptions from django.core.urlresolvers import reverse +from django.template.loader import get_template from django.utils.hashcompat import md5_constructor from django.utils.translation import ugettext as _ from django.utils.translation import ungettext @@ -30,7 +31,6 @@ from askbot import const from askbot.utils.lists import LazyList from askbot.search import mysql from askbot.utils.slug import slugify -from askbot.skins.loaders import get_template #jinja2 template loading enviroment from askbot.search.state_manager import DummySearchState class ThreadQuerySet(models.query.QuerySet): diff --git a/askbot/setup_templates/settings.py.mustache b/askbot/setup_templates/settings.py.mustache index 333df331..1f3dabd2 100644 --- a/askbot/setup_templates/settings.py.mustache +++ b/askbot/setup_templates/settings.py.mustache @@ -91,10 +91,9 @@ SECRET_KEY = 'sdljdfjkldsflsdjkhsjkldgjlsdgfs s ' # List of callables that know how to import templates from various sources. TEMPLATE_LOADERS = ( - 'django.template.loaders.filesystem.Loader', + 'askbot.skins.loaders.Loader', 'django.template.loaders.app_directories.Loader', - #below is askbot stuff for this tuple - 'askbot.skins.loaders.filesystem_load_template_source', + 'django.template.loaders.filesystem.Loader', #'django.template.loaders.eggs.load_template_source', ) diff --git a/askbot/skins/loaders.py b/askbot/skins/loaders.py index 16b4ccf0..50276f34 100644 --- a/askbot/skins/loaders.py +++ b/askbot/skins/loaders.py @@ -1,6 +1,7 @@ import os.path -from django.template.loaders.filesystem import Loader +from django.template.loader import BaseLoader from django.template import RequestContext +from django.template import TemplateDoesNotExist from django.http import HttpResponse from django.utils import translation from django.conf import settings as django_settings @@ -22,29 +23,6 @@ template.add_to_builtins('askbot.templatetags.extra_filters_jinja') #here it is ignored because it is assumed that we won't use unicode paths ASKBOT_SKIN_COLLECTION_DIR = os.path.dirname(__file__) -filesystem = Loader() - -#changed the name from load_template_source -def filesystem_load_template_source(name, dirs=None): - """Django template loader - """ - - if dirs is None: - dirs = (ASKBOT_SKIN_COLLECTION_DIR, ) - else: - dirs += (ASKBOT_SKIN_COLLECTION_DIR, ) - - try: - #todo: move this to top after splitting out get_skin_dirs() - tname = os.path.join(askbot_settings.ASKBOT_DEFAULT_SKIN, 'templates', name) - return filesystem.load_template_source(tname, dirs) - except: - tname = os.path.join('default', 'templates', name) - return filesystem.load_template_source(tname, dirs) -filesystem_load_template_source.is_usable = True -#added this for backward compatbility -load_template_source = filesystem_load_template_source - class SkinEnvironment(CoffinEnvironment): """Jinja template environment that loads templates from askbot skins @@ -105,8 +83,9 @@ def get_skin(request = None): for a given request (request var is not used at this time)""" return SKINS[askbot_settings.ASKBOT_DEFAULT_SKIN] -def get_template(template, request = None): - """retreives template for the skin +def get_askbot_template(template, request = None): + """ + retreives template for the skin request variable will be used in the future to set template according to the user preference or admins preference @@ -119,21 +98,22 @@ def get_template(template, request = None): def render_into_skin_as_string(template, data, request): context = RequestContext(request, data) - template = get_template(template, request) + template = get_askbot_template(template, request) return template.render(context) -def render_into_skin(template, data, request, mimetype = 'text/html'): - """in the future this function will be able to - switch skin depending on the site administrator/user selection - right now only admins can switch - """ - return HttpResponse( - render_into_skin_as_string(template, data, request), - mimetype=mimetype - ) - def render_text_into_skin(text, data, request): context = RequestContext(request, data) skin = get_skin(request) template = skin.from_string(text) return template.render(context) + +class Loader(BaseLoader): + """skins template loader for Django > 1.2 + todo: verify that this actually follows django's convention correctly + """ + is_usable = True + def load_template(self, template_name, template_dirs = None): + try: + return get_askbot_template(template_name), template_name + except TemplateNotFound: + raise TemplateDoesNotExist diff --git a/askbot/startup_procedures.py b/askbot/startup_procedures.py index 957aa14e..acb99b50 100644 --- a/askbot/startup_procedures.py +++ b/askbot/startup_procedures.py @@ -211,14 +211,28 @@ def test_encoding(): def test_template_loader(): """Sends a warning if you have an old style template loader that used to send a warning""" - old_template_loader = 'askbot.skins.loaders.load_template_source' - if old_template_loader in django_settings.TEMPLATE_LOADERS: - raise AskbotConfigError( - "\nPlease change: \n" - "'askbot.skins.loaders.load_template_source', to\n" - "'askbot.skins.loaders.filesystem_load_template_source',\n" - "in the TEMPLATE_LOADERS of your settings.py file" + old_loaders = ( + 'askbot.skins.loaders.load_template_source', + 'askbot.skins.loaders.filesystem_load_template_source', + ) + errors = list() + for loader in old_loaders: + if loader in django_settings.TEMPLATE_LOADERS: + errors.append( + 'remove "%s" from the TEMPLATE_LOADERS setting' % loader + ) + + current_loader = 'askbot.skins.loaders.Loader' + if current_loader not in django_settings.TEMPLATE_LOADERS: + errors.append( + 'add "%s" to the beginning of the TEMPLATE_LOADERS' % current_loader + ) + elif django_settings.TEMPLATE_LOADERS[0] != current_loader: + errors.append( + '"%s" must be the first element of TEMPLATE_LOADERS' % current_loader ) + + print_errors(errors) def test_celery(): """Tests celery settings @@ -458,7 +472,6 @@ def test_staticfiles(): ' python manage.py collectstatic\n' ) - print_errors(errors) if django_settings.STATICFILES_STORAGE == \ 'django.contrib.staticfiles.storage.StaticFilesStorage': diff --git a/askbot/tasks.py b/askbot/tasks.py index 5cdd59b7..0ae96c09 100644 --- a/askbot/tasks.py +++ b/askbot/tasks.py @@ -24,6 +24,7 @@ import uuid from django.contrib.contenttypes.models import ContentType from django.template import Context +from django.template.loader import get_template from django.utils.translation import ugettext as _ from celery.decorators import task from askbot.conf import settings as askbot_settings @@ -80,7 +81,6 @@ def notify_author_of_published_revision_celery_task(revision): } #load the template - from askbot.skins.loaders import get_template template = get_template('email/notify_author_about_approved_post.html') #todo: possibly add headers to organize messages in threads headers = {'Reply-To': append_content_address} @@ -191,7 +191,6 @@ def send_instant_notifications_about_activity_in_post( return #calculate some variables used in the loop below - from askbot.skins.loaders import get_template update_type_map = const.RESPONSE_ACTIVITY_TYPE_MAP_FOR_TEMPLATES update_type = update_type_map[update_activity.activity_type] origin_post = post.get_origin_post() diff --git a/askbot/templates/404.html b/askbot/templates/404.html index 158bfb94..2da99646 100644 --- a/askbot/templates/404.html +++ b/askbot/templates/404.html @@ -1,5 +1,44 @@ -{% load extra_tags %} -{% include_jinja "404.jinja.html" request %} -{% comment %} -this one has to be a django template because of use of default hander404 -{% endcomment %} +{% extends "one_column_body.html" %} + +{% block title %}{% spaceless %}{% trans %}Page not found{% endtrans %}{% endspaceless %}{% endblock %} +{% block forestyle%} + +{% endblock %} +{% block content %} +

{% trans %}Page not found{% endtrans %}

+
+
+

{% trans %}Sorry, could not find the page you requested.{% endtrans %}

+
+ {% trans %}This might have happened for the following reasons:{% endtrans %}
+
    +
  • {% trans %}this question or answer has been deleted;{% endtrans %}
  • +
  • {% trans %}url has error - please check it;{% endtrans %}
  • +
  • {% trans %}the page you tried to visit is protected or you don't have sufficient points, see{% endtrans %} {% trans %}faq{% endtrans %};
  • +
  • {% trans %}if you believe this error 404 should not have occured, please{% endtrans %} + {% trans %}report this problem{% endtrans %}
  • + +
+ + +
+
+{% endblock %} +{% block endjs %} + +{% endblock %} + diff --git a/askbot/templates/404.jinja.html b/askbot/templates/404.jinja.html deleted file mode 100644 index 2da99646..00000000 --- a/askbot/templates/404.jinja.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends "one_column_body.html" %} - -{% block title %}{% spaceless %}{% trans %}Page not found{% endtrans %}{% endspaceless %}{% endblock %} -{% block forestyle%} - -{% endblock %} -{% block content %} -

{% trans %}Page not found{% endtrans %}

-
-
-

{% trans %}Sorry, could not find the page you requested.{% endtrans %}

-
- {% trans %}This might have happened for the following reasons:{% endtrans %}
-
    -
  • {% trans %}this question or answer has been deleted;{% endtrans %}
  • -
  • {% trans %}url has error - please check it;{% endtrans %}
  • -
  • {% trans %}the page you tried to visit is protected or you don't have sufficient points, see{% endtrans %} {% trans %}faq{% endtrans %};
  • -
  • {% trans %}if you believe this error 404 should not have occured, please{% endtrans %} - {% trans %}report this problem{% endtrans %}
  • - -
- - -
-
-{% endblock %} -{% block endjs %} - -{% endblock %} - diff --git a/askbot/templates/500.html b/askbot/templates/500.html new file mode 100644 index 00000000..297ae736 --- /dev/null +++ b/askbot/templates/500.html @@ -0,0 +1,25 @@ +{% extends "two_column_body.html" %} + +{% block title %}{% spaceless %}{% trans %}Internal server error{% endtrans %}{% endspaceless %}{% endblock %} +{% block content %} +

{% trans %}Internal server error{% endtrans %}

+
+
+ {% trans %}system error log is recorded, error will be fixed as soon as possible{% endtrans %}
+ {% trans %}please report the error to the site administrators if you wish{% endtrans %} +
+
+{% endblock %} +{% block endjs %} + +{% endblock %} + diff --git a/askbot/templates/500.jinja.html b/askbot/templates/500.jinja.html deleted file mode 100644 index 297ae736..00000000 --- a/askbot/templates/500.jinja.html +++ /dev/null @@ -1,25 +0,0 @@ -{% extends "two_column_body.html" %} - -{% block title %}{% spaceless %}{% trans %}Internal server error{% endtrans %}{% endspaceless %}{% endblock %} -{% block content %} -

{% trans %}Internal server error{% endtrans %}

-
-
- {% trans %}system error log is recorded, error will be fixed as soon as possible{% endtrans %}
- {% trans %}please report the error to the site administrators if you wish{% endtrans %} -
-
-{% endblock %} -{% block endjs %} - -{% endblock %} - diff --git a/askbot/templatetags/extra_tags.py b/askbot/templatetags/extra_tags.py index dc9da5fc..6b148b4b 100644 --- a/askbot/templatetags/extra_tags.py +++ b/askbot/templatetags/extra_tags.py @@ -1,11 +1,12 @@ import math from django import template +from django.template import RequestContext +from django.template.loader import get_template from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _ from django.core.urlresolvers import reverse from askbot.utils import functions from askbot.utils.slug import slugify -from askbot.skins.loaders import get_template from askbot.conf import settings as askbot_settings register = template.Library() @@ -90,8 +91,8 @@ class IncludeJinja(template.Node): self.request_var = template.Variable(request_var) def render(self, context): request = self.request_var.resolve(context) - jinja_template = get_template(self.filename, request) - return jinja_template.render(context) + jinja_template = get_template(self.filename) + return jinja_template.render(RequestContext(request, context)) @register.tag def include_jinja(parser, token): @@ -112,4 +113,3 @@ def include_jinja(parser, token): raise template.TemplateSyntaxError('file name must be quoted') return IncludeJinja(filename, request_var) - diff --git a/askbot/tests/email_parsing_tests.py b/askbot/tests/email_parsing_tests.py index c8f3a057..3ed0908a 100644 --- a/askbot/tests/email_parsing_tests.py +++ b/askbot/tests/email_parsing_tests.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from django.conf import settings as django_settings -from askbot.skins.loaders import get_template from django.template import Context +from django.template.loader import get_template from askbot import mail from askbot import models from askbot.tests import utils diff --git a/askbot/tests/post_model_tests.py b/askbot/tests/post_model_tests.py index e61fcd2d..031909fb 100644 --- a/askbot/tests/post_model_tests.py +++ b/askbot/tests/post_model_tests.py @@ -3,13 +3,13 @@ import datetime from operator import attrgetter import time from askbot.search.state_manager import SearchState -from askbot.skins.loaders import get_template from django.contrib.auth.models import User from django.core import cache, urlresolvers from django.core.cache.backends.dummy import DummyCache from django.core.cache.backends.locmem import LocMemCache from django.core.exceptions import ValidationError +from django.template.loader import get_template from askbot.tests.utils import AskbotTestCase from askbot.models import Post from askbot.models import PostRevision diff --git a/askbot/views/avatar_views.py b/askbot/views/avatar_views.py index 42d0b38a..94252860 100644 --- a/askbot/views/avatar_views.py +++ b/askbot/views/avatar_views.py @@ -1,10 +1,15 @@ -"""this is an unfortunate copy-paste (mostly) +""" +todo: remove this module - not needed any more + +this is an unfortunate copy-paste (mostly) from the avatar app - the reason is that django-avatar app does not support jinja templates """ import urllib from django.http import HttpResponseRedirect from django.template import RequestContext +from django.template.loader import get_template +from django.shortcuts import render from django.utils.translation import ugettext as _ from django.views.decorators import csrf from django.conf import settings @@ -17,7 +22,6 @@ from avatar.settings import AVATAR_MAX_AVATARS_PER_USER, AVATAR_DEFAULT_SIZE from avatar.util import get_primary_avatar, get_default_avatar_url from avatar.views import render_primary as django_avatar_render_primary -from askbot.skins.loaders import render_into_skin from askbot import models notification = False @@ -111,7 +115,7 @@ def add(request, extra_context=None, next_override=None, if extra_context: data.update(extra_context) - return render_into_skin('avatar/add.html', data, request) + return render(request, 'avatar/add.html', data) @login_required @csrf.csrf_protect @@ -153,7 +157,7 @@ def change(request, extra_context=None, next_override=None, if extra_context: data.update(extra_context) - return render_into_skin('avatar/change.html', data, request) + return render(request, 'avatar/change.html', data) @login_required @csrf.csrf_protect @@ -190,7 +194,7 @@ def delete(request, extra_context=None, next_override=None, *args, **kwargs): if extra_context: data.update(extra_context) - return render_into_skin('avatar/confirm_delete.html', data, request) + return render(request, 'avatar/confirm_delete.html', data) def render_primary(request, user_id = None, *args, **kwargs): user = models.User.objects.get(id = user_id) diff --git a/askbot/views/commands.py b/askbot/views/commands.py index c072f7b8..de5bb12b 100644 --- a/askbot/views/commands.py +++ b/askbot/views/commands.py @@ -20,6 +20,8 @@ from django.http import HttpResponseRedirect from django.http import HttpResponseForbidden from django.forms import ValidationError, IntegerField, CharField from django.shortcuts import get_object_or_404 +from django.shortcuts import render +from django.template.loader import get_template from django.views.decorators import csrf from django.utils import simplejson from django.utils.html import escape @@ -35,8 +37,7 @@ from askbot.utils import decorators from askbot.utils import url_utils from askbot.utils.forms import get_db_object_or_404 from askbot import mail -from django.template import Context -from askbot.skins.loaders import render_into_skin, get_template +from django.template import RequestContext from askbot.skins.loaders import render_into_skin_as_string from askbot.skins.loaders import render_text_into_skin from askbot import const @@ -115,7 +116,7 @@ def manage_inbox(request): 'post': post.html, 'reject_reason': reject_reason.details.html } - body_text = template.render(Context(data)) + body_text = template.render(RequestContext(request, data)) mail.send_mail( subject_line = _('your post was not accepted'), body_text = unicode(body_text), @@ -684,7 +685,7 @@ def subscribe_for_tags(request): return HttpResponseRedirect(reverse('index')) else: data = {'tags': tag_names} - return render_into_skin('subscribe_for_tags.html', data, request) + return render(request, 'subscribe_for_tags.html', data) else: all_tag_names = pure_tag_names + wildcards message = _('Please sign in to subscribe for: %(tags)s') \ @@ -769,7 +770,7 @@ def close(request, id):#close question 'question': question, 'form': form, } - return render_into_skin('close.html', data, request) + return render(request, 'close.html', data) except exceptions.PermissionDenied, e: request.user.message_set.create(message = unicode(e)) return HttpResponseRedirect(question.get_absolute_url()) @@ -798,7 +799,7 @@ def reopen(request, id):#re-open question 'closed_by_profile_url': closed_by_profile_url, 'closed_by_username': closed_by_username, } - return render_into_skin('reopen.html', data, request) + return render(request, 'reopen.html', data) except exceptions.PermissionDenied, e: request.user.message_set.create(message = unicode(e)) diff --git a/askbot/views/meta.py b/askbot/views/meta.py index 22c701d9..bb152d5b 100644 --- a/askbot/views/meta.py +++ b/askbot/views/meta.py @@ -6,7 +6,9 @@ This module contains a collection of views displaying all sorts of secondary and from django.shortcuts import render_to_response, get_object_or_404 from django.core.urlresolvers import reverse from django.core.paginator import Paginator, EmptyPage, InvalidPage +from django.shortcuts import render from django.template import RequestContext, Template +from django.template.loader import get_template from django.http import HttpResponseRedirect, HttpResponse, Http404 from django.core.urlresolvers import reverse from django.utils.translation import ugettext as _ @@ -21,16 +23,16 @@ from askbot.utils.forms import get_next_url from askbot.mail import mail_moderators from askbot.models import BadgeData, Award, User, Tag from askbot.models import badges as badge_data -from askbot.skins.loaders import get_template, render_into_skin, render_text_into_skin +from askbot.skins.loaders import render_text_into_skin from askbot.utils.decorators import admins_only from askbot.utils.forms import get_next_url from askbot.utils import functions def generic_view(request, template = None, page_class = None): - """this may be not necessary, since it is just a rewrite of render_into_skin""" + """this may be not necessary, since it is just a rewrite of render""" if request is None: # a plug for strange import errors in django startup return render_to_response('django_error.html') - return render_into_skin(template, {'page_class': page_class}, request) + return render(request, template, {'page_class': page_class}) def config_variable(request, variable_name = None, mimetype = None): """Print value from the configuration settings @@ -47,7 +49,7 @@ def about(request, template='about.html'): 'page_class': 'meta', 'content': askbot_settings.FORUM_ABOUT } - return render_into_skin('static_page.html', data, request) + return render(request, 'static_page.html', data) def page_not_found(request, template='404.html'): return generic_view(request, template) @@ -60,7 +62,7 @@ def help(request): 'app_name': askbot_settings.APP_SHORT_NAME, 'page_class': 'meta' } - return render_into_skin('help.html', data, request) + return render(render, 'help.html', data) def faq(request): if askbot_settings.FORUM_FAQ.strip() != '': @@ -69,18 +71,14 @@ def faq(request): 'content': askbot_settings.FORUM_FAQ, 'page_class': 'meta', } - return render_into_skin( - 'static_page.html', - data, - request - ) + return render(request, 'static_page.html', data) else: data = { 'gravatar_faq_url': reverse('faq') + '#gravatar', 'ask_question_url': reverse('ask'), 'page_class': 'meta', } - return render_into_skin('faq_static.html', data, request) + return render(request, 'faq_static.html', data) @csrf.csrf_protect def feedback(request): @@ -108,7 +106,7 @@ def feedback(request): data['message'] = form.cleaned_data['message'] data['name'] = form.cleaned_data.get('name', None) - template = get_template('email/feedback_email.txt', request) + template = get_template('email/feedback_email.txt') message = template.render(RequestContext(request, data)) headers = {} @@ -128,7 +126,7 @@ def feedback(request): initial={'next':get_next_url(request)}) data['form'] = form - return render_into_skin('feedback.html', data, request) + return render(request, 'feedback.html', data) feedback.CANCEL_MESSAGE=_('We look forward to hearing your feedback! Please, give it next time :)') def privacy(request): @@ -137,7 +135,7 @@ def privacy(request): 'page_class': 'meta', 'content': askbot_settings.FORUM_PRIVACY } - return render_into_skin('static_page.html', data, request) + return render(request, 'static_page.html', data) def badges(request):#user status/reputation system #todo: supplement database data with the stuff from badges.py @@ -161,7 +159,7 @@ def badges(request):#user status/reputation system 'mybadges' : my_badges, 'feedback_faq_url' : reverse('feedback'), } - return render_into_skin('badges.html', data, request) + return render(request, 'badges.html', data) def badge(request, id): #todo: supplement database data with the stuff from badges.py @@ -182,7 +180,7 @@ def badge(request, id): 'badge' : badge, 'page_class': 'meta', } - return render_into_skin('badge.html', data, request) + return render(request, 'badge.html', data) @admins_only def list_suggested_tags(request): @@ -222,4 +220,4 @@ def list_suggested_tags(request): 'page_title': _('Suggested tags'), 'paginator_context' : paginator_context, } - return render_into_skin('list_suggested_tags.html', data, request) + return render(request, 'list_suggested_tags.html', data) diff --git a/askbot/views/readers.py b/askbot/views/readers.py index 3211a86b..f1b31b32 100644 --- a/askbot/views/readers.py +++ b/askbot/views/readers.py @@ -11,9 +11,11 @@ import logging import urllib import operator from django.shortcuts import get_object_or_404 +from django.shortcuts import render from django.http import HttpResponseRedirect, HttpResponse, Http404, HttpResponseNotAllowed from django.core.paginator import Paginator, EmptyPage, InvalidPage -from django.template import Context +from django.template.loader import get_template +from django.template import RequestContext from django.utils import simplejson from django.utils.html import escape from django.utils.translation import ugettext as _ @@ -41,7 +43,6 @@ from askbot.utils.decorators import anonymous_forbidden, ajax_only, get_only from askbot.search.state_manager import SearchState, DummySearchState from askbot.templatetags import extra_tags from askbot.conf import settings as askbot_settings -from askbot.skins.loaders import render_into_skin, get_template #jinja2 template loading enviroment from askbot.views import context # used in index page @@ -151,23 +152,31 @@ def questions(request, **kwargs): question_counter = question_counter % {'q_num': humanize.intcomma(q_count),} if q_count > page_size: - paginator_tpl = get_template('main_page/paginator.html', request) - paginator_html = paginator_tpl.render(Context({ - 'context': functions.setup_paginator(paginator_context), - 'questions_count': q_count, - 'page_size' : page_size, - 'search_state': search_state, - })) + paginator_tpl = get_template('main_page/paginator.html') + paginator_html = paginator_tpl.render( + RequestContext( + request, { + 'context': functions.setup_paginator(paginator_context), + 'questions_count': q_count, + 'page_size' : page_size, + 'search_state': search_state, + } + ) + ) else: paginator_html = '' - questions_tpl = get_template('main_page/questions_loop.html', request) - questions_html = questions_tpl.render(Context({ - 'threads': page, - 'search_state': search_state, - 'reset_method_count': reset_method_count, - 'request': request - })) + questions_tpl = get_template('main_page/questions_loop.html') + questions_html = questions_tpl.render( + RequestContext( + request, { + 'threads': page, + 'search_state': search_state, + 'reset_method_count': reset_method_count, + 'request': request + } + ) + ) ajax_data = { 'query_data': { @@ -226,7 +235,7 @@ def questions(request, **kwargs): 'feed_url': context_feed_url, } - return render_into_skin('main_page.html', template_data, request) + return render(request, 'main_page.html', template_data) def tags(request):#view showing a listing of available tags - plain list @@ -316,7 +325,7 @@ def tags(request):#view showing a listing of available tags - plain list 'search_state': SearchState(*[None for x in range(7)]) } - return render_into_skin('tags.html', data, request) + return render(request, 'tags.html', data) @csrf.csrf_protect def question(request, id):#refactor - long subroutine. display question body, answers and comments @@ -598,7 +607,7 @@ def question(request, id):#refactor - long subroutine. display question body, an data.update(context.get_for_tag_editor()) - return render_into_skin('question.html', data, request) + return render(request, 'question.html', data) def revisions(request, id, post_type = None): assert post_type in ('question', 'answer') @@ -621,7 +630,7 @@ def revisions(request, id, post_type = None): 'post': post, 'revisions': revisions, } - return render_into_skin('revisions.html', data, request) + return render(request, 'revisions.html', data) @csrf.csrf_exempt @ajax_only diff --git a/askbot/views/users.py b/askbot/views/users.py index 2a5b1047..6c2a34fd 100644 --- a/askbot/views/users.py +++ b/askbot/views/users.py @@ -21,6 +21,7 @@ from django.core.paginator import Paginator, EmptyPage, InvalidPage from django.contrib.contenttypes.models import ContentType from django.core.urlresolvers import reverse from django.shortcuts import get_object_or_404 +from django.shortcuts import render from django.http import HttpResponse, HttpResponseForbidden from django.http import HttpResponseRedirect, Http404 from django.utils.translation import ugettext as _ @@ -40,7 +41,6 @@ from askbot import models from askbot import exceptions from askbot.models.badges import award_badges_signal from askbot.models.tag import format_personal_group_name -from askbot.skins.loaders import render_into_skin from askbot.search.state_manager import SearchState from askbot.utils import url_utils from askbot.utils.loading import load_module @@ -200,7 +200,7 @@ def show_users(request, by_group=False, group_id=None, group_slug=None): 'group_openness_choices': group_openness_choices } - return render_into_skin('users.html', data, request) + return render(request, 'users.html', data) @csrf.csrf_protect def user_moderate(request, subject, context): @@ -294,7 +294,7 @@ def user_moderate(request, subject, context): 'user_status_changed': user_status_changed } context.update(data) - return render_into_skin('user_profile/user_moderate.html', context, request) + return render(request, 'user_profile/user_moderate.html', context) #non-view function def set_new_email(user, new_email, nomessage=False): @@ -356,7 +356,7 @@ def edit_user(request, id): 'support_custom_avatars': ('avatar' in django_settings.INSTALLED_APPS), 'view_user': user, } - return render_into_skin('user_profile/user_edit.html', data, request) + return render(request, 'user_profile/user_edit.html', data) def user_stats(request, user, context): question_filter = {} @@ -528,7 +528,7 @@ def user_stats(request, user, context): } context.update(data) - return render_into_skin('user_profile/user_stats.html', context, request) + return render(request, 'user_profile/user_stats.html', context) def user_recent(request, user, context): @@ -682,7 +682,7 @@ def user_recent(request, user, context): 'activities' : activities[:const.USER_VIEW_DATA_SIZE] } context.update(data) - return render_into_skin('user_profile/user_recent.html', context, request) + return render(request, 'user_profile/user_recent.html', context) #not a view - no direct url route here, called by `user_responses` @csrf.csrf_protect @@ -714,7 +714,7 @@ def show_group_join_requests(request, user, context): 'join_requests': join_requests } context.update(data) - return render_into_skin('user_inbox/group_join_requests.html', context, request) + return render(request, 'user_inbox/group_join_requests.html', context) @owner_or_moderator_required @@ -769,9 +769,7 @@ def user_responses(request, user, context): 'page_title' : _('profile - messages') } context.update(data) - return render_into_skin( - 'user_inbox/messages.html', context, request - ) + return render(request, 'user_inbox/messages.html', context) else: raise Http404 @@ -839,7 +837,7 @@ def user_responses(request, user, context): 'responses' : filtered_response_list, } context.update(data) - return render_into_skin('user_inbox/responses_and_flags.html', context, request) + return render(request, 'user_inbox/responses_and_flags.html', context) def user_network(request, user, context): if 'followit' not in django_settings.INSTALLED_APPS: @@ -850,7 +848,7 @@ def user_network(request, user, context): 'followers': user.get_followers(), } context.update(data) - return render_into_skin('user_profile/user_network.html', context, request) + return render(request, 'user_profile/user_network.html', context) @owner_or_moderator_required def user_votes(request, user, context): @@ -880,7 +878,7 @@ def user_votes(request, user, context): 'votes' : votes[:const.USER_VIEW_DATA_SIZE] } context.update(data) - return render_into_skin('user_profile/user_votes.html', context, request) + return render(request, 'user_profile/user_votes.html', context) def user_reputation(request, user, context): @@ -903,7 +901,7 @@ def user_reputation(request, user, context): 'reps': reps } context.update(data) - return render_into_skin('user_profile/user_reputation.html', context, request) + return render(request, 'user_profile/user_reputation.html', context) def user_favorites(request, user, context): @@ -921,7 +919,7 @@ def user_favorites(request, user, context): 'questions' : questions, } context.update(data) - return render_into_skin('user_profile/user_favorites.html', context, request) + return render(request, 'user_profile/user_favorites.html', context) @owner_or_moderator_required @@ -972,10 +970,10 @@ def user_email_subscriptions(request, user, context): 'action_status': action_status, } context.update(data) - return render_into_skin( + return render( + request, 'user_profile/user_email_subscriptions.html', - context, - request + context ) @csrf.csrf_protect @@ -994,7 +992,7 @@ def user_custom_tab(request, user, context): 'tab_name': tab_settings['SLUG'], 'page_title': page_title }) - return render_into_skin('user_profile/custom_tab.html', context, request) + return render(request, 'user_profile/custom_tab.html', context) USER_VIEW_CALL_TABLE = { 'stats': user_stats, @@ -1118,4 +1116,4 @@ def groups(request, id = None, slug = None): 'tab_name': scope, 'page_class': 'groups-page' } - return render_into_skin('groups.html', data, request) + return render(request, 'groups.html', data) diff --git a/askbot/views/widgets.py b/askbot/views/widgets.py index 9ad2d900..f607411d 100644 --- a/askbot/views/widgets.py +++ b/askbot/views/widgets.py @@ -1,6 +1,8 @@ from datetime import datetime -from django.template import Context +from django.template import RequestContext +from django.template.loader import get_template +from django.shortcuts import render from django.http import HttpResponse, Http404 from django.views.decorators import csrf from django.core.urlresolvers import reverse @@ -8,7 +10,6 @@ from django.shortcuts import redirect, get_object_or_404 from django.contrib.auth.decorators import login_required -from askbot.skins.loaders import render_into_skin, get_template from askbot.conf import settings as askbot_settings from askbot.utils import decorators from askbot import models @@ -45,7 +46,7 @@ def widgets(request): 'question_widgets': models.QuestionWidget.objects.all().count(), 'page_class': 'widgets' } - return render_into_skin('embed/widgets.html', data, request) + return render(request, 'embed/widgets.html', data) @csrf.csrf_protect def ask_widget(request, widget_id): @@ -127,7 +128,7 @@ def ask_widget(request, widget_id): 'widget': widget, 'editor_type': askbot_settings.EDITOR_TYPE } - return render_into_skin('embed/ask_by_widget.html', data, request) + return render(request, 'embed/ask_by_widget.html', data) @login_required def ask_widget_complete(request): @@ -142,7 +143,7 @@ def ask_widget_complete(request): del request.session['widget_css'] data = {'question_url': question_url, 'custom_css': custom_css} - return render_into_skin('embed/ask_widget_complete.html', data, request) + return render(request, 'embed/ask_widget_complete.html', data) @decorators.admins_only @@ -153,7 +154,7 @@ def list_widgets(request, model): 'widgets': widgets, 'widget_name': model } - return render_into_skin('embed/list_widgets.html', data, request) + return render(request, 'embed/list_widgets.html', data) @decorators.admins_only def create_widget(request, model): @@ -171,7 +172,7 @@ def create_widget(request, model): data = {'form': form, 'action': 'edit', 'widget_name': model} - return render_into_skin('embed/widget_form.html', data, request) + return render(request, 'embed/widget_form.html', data) @decorators.admins_only def edit_widget(request, model, widget_id): @@ -210,7 +211,7 @@ def edit_widget(request, model, widget_id): data = {'form': form, 'action': 'edit', 'widget_name': model} - return render_into_skin('embed/widget_form.html', data, request) + return render(request, 'embed/widget_form.html', data) @decorators.admins_only def delete_widget(request, model, widget_id): @@ -220,28 +221,35 @@ def delete_widget(request, model, widget_id): widget.delete() return redirect('list_widgets', model=model) else: - return render_into_skin('embed/delete_widget.html', - {'widget': widget, 'widget_name': model}, request) + return render( + request, + 'embed/delete_widget.html', + {'widget': widget, 'widget_name': model} + ) def render_ask_widget_js(request, widget_id): widget = get_object_or_404(models.AskWidget, pk=widget_id) variable_name = "AskbotAskWidget%d" % widget.id - content_tpl = get_template('embed/askbot_widget.js', request) - context_dict = {'widget': widget, - 'host': request.get_host(), - 'variable_name': variable_name} - content = content_tpl.render(Context(context_dict)) + content_tpl = get_template('embed/askbot_widget.js') + context_dict = { + 'widget': widget, + 'host': request.get_host(), + 'variable_name': variable_name + } + content = content_tpl.render(RequestContext(request, context_dict)) return HttpResponse(content, mimetype='text/javascript') def render_ask_widget_css(request, widget_id): widget = get_object_or_404(models.AskWidget, pk=widget_id) variable_name = "AskbotAskWidget%d" % widget.id - content_tpl = get_template('embed/askbot_widget.css', request) - context_dict = {'widget': widget, - 'host': request.get_host(), - 'editor_type': askbot_settings.EDITOR_TYPE, - 'variable_name': variable_name} - content = content_tpl.render(Context(context_dict)) + content_tpl = get_template('embed/askbot_widget.css') + context_dict = { + 'widget': widget, + 'host': request.get_host(), + 'editor_type': askbot_settings.EDITOR_TYPE, + 'variable_name': variable_name + } + content = content_tpl.render(RequestContext(request, context_dict)) return HttpResponse(content, mimetype='text/css') def question_widget(request, widget_id): @@ -275,4 +283,4 @@ def question_widget(request, widget_id): 'widget': widget } - return render_into_skin('embed/question_widget.html', data, request) + return render(request, 'embed/question_widget.html', data) diff --git a/askbot/views/writers.py b/askbot/views/writers.py index d1504d23..da4ce6a1 100644 --- a/askbot/views/writers.py +++ b/askbot/views/writers.py @@ -14,6 +14,7 @@ import tempfile import time import urlparse from django.shortcuts import get_object_or_404 +from django.shortcuts import render from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from django.http import HttpResponseRedirect, HttpResponse, HttpResponseForbidden, Http404 @@ -29,7 +30,6 @@ from askbot import exceptions as askbot_exceptions from askbot import forms from askbot import models from askbot.conf import settings as askbot_settings -from askbot.skins.loaders import render_into_skin from askbot.utils import decorators from askbot.utils.forms import format_errors from askbot.utils.functions import diff_date @@ -192,7 +192,7 @@ def import_data(request): 'dump_upload_form': form, 'need_configuration': (not stackexchange.is_ready()) } - return render_into_skin('import_data.html', data, request) + return render(request, 'import_data.html', data) #@login_required #actually you can post anonymously, but then must register @csrf.csrf_protect @@ -302,7 +302,7 @@ def ask(request):#view used to ask a new question 'tag_names': list()#need to keep context in sync with edit_question for tag editor } data.update(context.get_for_tag_editor()) - return render_into_skin('ask.html', data, request) + return render(request, 'ask.html', data) @login_required @csrf.csrf_exempt @@ -349,7 +349,7 @@ def retag_question(request, id): 'question': question, 'form' : form, } - return render_into_skin('question_retag.html', data, request) + return render(request, 'question_retag.html', data) except exceptions.PermissionDenied, e: if request.is_ajax(): response_data = { @@ -394,7 +394,7 @@ def edit_question(request, id): form = forms.EditQuestionForm( request.POST, question=question, - user=quest.user, + user=question.user, revision=revision ) else:#new content edit @@ -455,7 +455,7 @@ def edit_question(request, id): 'category_tree_data': askbot_settings.CATEGORY_TREE } data.update(context.get_for_tag_editor()) - return render_into_skin('question_edit.html', data, request) + return render(request, 'question_edit.html', data) except exceptions.PermissionDenied, e: request.user.message_set.create(message = unicode(e)) @@ -522,7 +522,7 @@ def edit_answer(request, id): 'revision_form': revision_form, 'form': form, } - return render_into_skin('answer_edit.html', data, request) + return render(request, 'answer_edit.html', data) except exceptions.PermissionDenied, e: request.user.message_set.create(message = unicode(e)) -- cgit v1.2.3-1-g7c22