diff --git a/docs/navigation.rst b/docs/navigation.rst index d32ef0d4..01f36bdb 100644 --- a/docs/navigation.rst +++ b/docs/navigation.rst @@ -1,11 +1,10 @@ Navigation ========== -The navigation system is based on a django context called NavContext, -implemented in pgweb.util.contexts.NavContext. This means that all the +The navigation system is based on a django function called render_pgweb, +implemented in pgweb.util.contexts. This means that all the menu links in the system are defined in this file -(pgweb/utils/contexts.py). Each django view needs to specify the -NavContext in it's call to template rendering, and this will make the -correct nav menu show up. +(pgweb/utils/contexts.py). Each django view needs to use render_pgweb() +instead of render(), and this will make the correct nav menu show up. This is one of the parts of the system that can probably be made a lot easier, leaving much room for future improvement :-) diff --git a/pgweb/account/views.py b/pgweb/account/views.py index 20af2302..07944554 100644 --- a/pgweb/account/views.py +++ b/pgweb/account/views.py @@ -2,7 +2,7 @@ from django.contrib.auth.models import User from django.contrib.auth import login as django_login import django.contrib.auth.views as authviews from django.http import HttpResponseRedirect, Http404, HttpResponse -from django.shortcuts import render_to_response, get_object_or_404 +from django.shortcuts import get_object_or_404 from pgweb.util.decorators import login_required from django.utils.encoding import force_bytes from django.utils.http import urlsafe_base64_encode @@ -21,7 +21,7 @@ import json from datetime import datetime, timedelta import itertools -from pgweb.util.contexts import NavContext +from pgweb.util.contexts import render_pgweb from pgweb.util.misc import send_template_mail, generate_random_token, get_client_ip from pgweb.util.helpers import HttpServerError @@ -52,13 +52,13 @@ def home(request): myorgs = Organisation.objects.filter(managers=request.user, approved=False) myproducts = Product.objects.filter(org__managers=request.user, approved=False) myprofservs = ProfessionalService.objects.filter(org__managers=request.user, approved=False) - return render_to_response('account/index.html', { + return render_pgweb(request, 'account', 'account/index.html', { 'newsarticles': myarticles, 'events': myevents, 'organisations': myorgs, 'products': myproducts, 'profservs': myprofservs, - }, NavContext(request, 'account')) + }) objtypes = { 'news': { @@ -126,12 +126,12 @@ def profile(request): if contrib: contribform = ContributorForm(instance=contrib) - return render_to_response('account/userprofileform.html', { + return render_pgweb(request, 'account', 'account/userprofileform.html', { 'userform': userform, 'profileform': profileform, 'contribform': contribform, 'can_change_email': can_change_email, - }, NavContext(request, "account")) + }) @login_required @transaction.atomic @@ -167,10 +167,10 @@ def change_email(request): else: form = ChangeEmailForm(request.user) - return render_to_response('account/emailchangeform.html', { + return render_pgweb(request, 'account', 'account/emailchangeform.html', { 'form': form, 'token': token, - }, NavContext(request, "account")) + }) @login_required @transaction.atomic @@ -189,10 +189,10 @@ def confirm_change_email(request, tokenhash): request.user.save() token.delete() - return render_to_response('account/emailchangecompleted.html', { + return render_pgweb(request, 'account', 'account/emailchangecompleted.html', { 'token': tokenhash, 'success': token and True or False, - }, NavContext(request, "account")) + }) @login_required def listobjects(request, objtype): @@ -200,20 +200,20 @@ def listobjects(request, objtype): raise Http404("Object type not found") o = objtypes[objtype] - return render_to_response('account/objectlist.html', { + return render_pgweb(request, 'account', 'account/objectlist.html', { 'objects': o['objects'](request.user), 'title': o['title'], 'submit_header': o.has_key('submit_header') and o['submit_header'] or None, 'suburl': objtype, - }, NavContext(request, 'account')) + }) @login_required def orglist(request): orgs = Organisation.objects.filter(approved=True) - return render_to_response('account/orglist.html', { + return render_pgweb(request, 'account', 'account/orglist.html', { 'orgs': orgs, - }, NavContext(request, 'account')) + }) def login(request): return authviews.login(request, template_name='account/login.html', @@ -304,7 +304,7 @@ def signup(request): else: form = SignupForm(get_client_ip(request)) - return render_to_response('base/form.html', { + return render_pgweb(request, 'account', 'base/form.html', { 'form': form, 'formitemtype': 'Account', 'form_intro': """ @@ -315,12 +315,12 @@ content is available for reading without an account. 'savebutton': 'Sign up', 'operation': 'New', 'recaptcha': True, - }, NavContext(request, 'account')) + }) def signup_complete(request): - return render_to_response('account/signup_complete.html', { - }, NavContext(request, 'account')) + return render_pgweb(request, 'account', 'account/signup_complete.html', { + }) @transaction.atomic @@ -392,12 +392,12 @@ def signup_oauth(request): 'last_name': request.session['oauth_lastname'][:30], }) - return render_to_response('account/signup_oauth.html', { + return render_pgweb(request, 'account', 'account/signup_oauth.html', { 'form': form, 'operation': 'New account', 'savebutton': 'Sign up for new account', 'recaptcha': True, - }, NavContext(request, 'account')) + }) #### ## Community authentication endpoint @@ -458,17 +458,17 @@ def communityauth(request, siteid): # course, we fill a structure with information about the user. if request.user.first_name=='' or request.user.last_name=='' or request.user.email=='': - return render_to_response('account/communityauth_noinfo.html', { - }, NavContext(request, 'account')) + return render_pgweb(request, 'account', 'account/communityauth_noinfo.html', { + }) # Check for cooloff period if site.cooloff_hours > 0: if (datetime.now() - request.user.date_joined) < timedelta(hours=site.cooloff_hours): log.warning("User {0} tried to log in to {1} before cooloff period ended.".format( request.user.username, site.name)) - return render_to_response('account/communityauth_cooloff.html', { + return render_pgweb(request, 'account', 'account/communityauth_cooloff.html', { 'site': site, - }, NavContext(request, 'account')) + }) info = { 'u': request.user.username.encode('utf-8'), diff --git a/pgweb/contributors/views.py b/pgweb/contributors/views.py index 13867e7c..31027de5 100644 --- a/pgweb/contributors/views.py +++ b/pgweb/contributors/views.py @@ -1,11 +1,9 @@ -from django.shortcuts import render_to_response - -from pgweb.util.contexts import NavContext +from pgweb.util.contexts import render_pgweb from models import ContributorType def completelist(request): contributortypes = list(ContributorType.objects.all()) - return render_to_response('contributors/list.html', { + return render_pgweb(request, 'community', 'contributors/list.html', { 'contributortypes': contributortypes, - }, NavContext(request, 'community')) + }) diff --git a/pgweb/core/views.py b/pgweb/core/views.py index cdc91d98..d7d33bbf 100644 --- a/pgweb/core/views.py +++ b/pgweb/core/views.py @@ -1,4 +1,4 @@ -from django.shortcuts import render_to_response +from django.shortcuts import render from django.http import HttpResponse, Http404, HttpResponseRedirect from django.http import HttpResponseNotModified from django.template import TemplateDoesNotExist, loader @@ -17,7 +17,7 @@ import re import urllib from pgweb.util.decorators import cache, nocache -from pgweb.util.contexts import NavContext +from pgweb.util.contexts import render_pgweb, get_nav_menu from pgweb.util.helpers import simple_form, PgXmlHelper, HttpServerError from pgweb.util.moderation import get_all_pending_moderations from pgweb.util.misc import get_client_ip, varnish_purge @@ -35,7 +35,6 @@ from pgweb.survey.models import Survey # models and forms needed for core objects from models import Organisation from forms import OrganisationForm, MergeOrgsForm -from django.template.context import RequestContext # Front page view @cache(minutes=10) @@ -60,7 +59,7 @@ def home(request): curs.execute("SELECT * FROM (SELECT DISTINCT(core_organisation.name) FROM events_event INNER JOIN core_organisation ON org_id=core_organisation.id WHERE startdate <= (CURRENT_DATE + '6 Months'::interval) AND enddate >= CURRENT_DATE AND events_event.approved AND training AND org_id IS NOT NULL) x ORDER BY random() LIMIT 3") trainingcompanies = [r[0] for r in curs.fetchall()] - return render_to_response('index.html', { + return render(request, 'index.html', { 'title': 'The world\'s most advanced open source database', 'news': news, 'newstags': NewsTag.objects.all(), @@ -71,7 +70,7 @@ def home(request): 'quote': quote, 'versions': versions, 'planet': planet, - }, RequestContext(request)) + }) # Community main page (contains surveys and potentially more) def community(request): @@ -81,16 +80,16 @@ def community(request): except: s = None planet = ImportedRSSItem.objects.filter(feed__internalname="planet").order_by("-posttime")[:7] - return render_to_response('core/community.html', { + return render_pgweb(request, 'community', 'core/community.html', { 'survey': s, 'planet': planet, - }, NavContext(request, 'community')) + }) # List of supported versions def versions(request): - return render_to_response('support/versioning.html', { + return render_pgweb(request, 'support', 'support/versioning.html', { 'versions': Version.objects.filter(tree__gt=0).filter(testing=0), - }, NavContext(request, 'support')) + }) re_staticfilenames = re.compile("^[0-9A-Z/_-]+$", re.IGNORECASE) # Generic fallback view for static pages @@ -115,7 +114,7 @@ def fallback(request, url): navsect = url.split('/',2)[0] except: navsect = '' - return HttpResponse(t.render(NavContext(request, navsect))) + return HttpResponse(t.render({'navmenu': get_nav_menu(navsect)})) # Edit-forms for core objects @login_required @@ -225,7 +224,7 @@ def dynamic_css(request, css): @nocache def csrf_failure(request, reason=''): - resp = render_to_response('errors/csrf_failure.html', { + resp = render(request, 'errors/csrf_failure.html', { 'reason': reason, }) resp.status_code = 403 # Forbidden @@ -234,7 +233,7 @@ def csrf_failure(request, reason=''): # Basic information about the connection @cache(seconds=30) def system_information(request): - return render_to_response('core/system_information.html', { + return render(request,'core/system_information.html', { 'server': os.uname()[1], 'cache_server': request.META['REMOTE_ADDR'] or None, 'client_ip': get_client_ip(request), @@ -254,9 +253,9 @@ def sync_timestamp(request): @user_passes_test(lambda u: u.is_staff) @user_passes_test(lambda u: u.groups.filter(name='web slaves').exists()) def admin_pending(request): - return render_to_response('core/admin_pending.html', { + return render(request, 'core/admin_pending.html', { 'app_list': get_all_pending_moderations(), - }, RequestContext(request)) + }) # Purge objects from varnish, for the admin pages @login_required @@ -276,9 +275,9 @@ def admin_purge(request): curs.execute("SELECT added, completed, consumer, mode, expr FROM varnishqueue.queue q LEFT JOIN varnishqueue.consumers c ON c.consumerid=q.consumerid ORDER BY added DESC") latest = curs.fetchall() - return render_to_response('core/admin_purge.html', { + return render(request, 'core/admin_purge.html', { 'latest_purges': latest, - }, RequestContext(request)) + }) @csrf_exempt def api_varnish_purge(request): @@ -325,6 +324,6 @@ def admin_mergeorg(request): else: form = MergeOrgsForm() - return render_to_response('core/admin_mergeorg.html', { + return render(request, 'core/admin_mergeorg.html', { 'form': form, - }, RequestContext(request)) + }) diff --git a/pgweb/docs/views.py b/pgweb/docs/views.py index e9fc639a..904057ce 100644 --- a/pgweb/docs/views.py +++ b/pgweb/docs/views.py @@ -1,7 +1,6 @@ -from django.shortcuts import render_to_response, get_object_or_404 +from django.shortcuts import render, get_object_or_404 from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect from django.http import Http404 -from django.template.context import RequestContext from pgweb.util.decorators import login_required from django.db.models import Q from django.conf import settings @@ -9,7 +8,7 @@ from django.conf import settings from decimal import Decimal import os -from pgweb.util.contexts import NavContext +from pgweb.util.contexts import render_pgweb from pgweb.util.helpers import template_to_string from pgweb.util.misc import send_template_mail @@ -67,7 +66,7 @@ def docpage(request, version, typ, filename): # Interactive documents are disabled, so redirect to static page return HttpResponsePermanentRedirect("/docs/{0}/static/{1}.html".format(version, filename)) - return render_to_response('docs/docspage.html', { + return render(request, 'docs/docspage.html', { 'page': page, 'supported_versions': [v for v in versions if v.supported], 'devel_versions': [v for v in versions if not v.supported and v.testing], @@ -75,7 +74,7 @@ def docpage(request, version, typ, filename): 'title': page.title, 'doc_index_filename': indexname, 'loaddate': loaddate, - }, RequestContext(request)) + }) def docsrootpage(request, version, typ): return docpage(request, version, typ, 'index') @@ -85,9 +84,9 @@ def redirect_root(request, version): def root(request): versions = Version.objects.filter(Q(supported=True) | Q(testing__gt=0,tree__gt=0)).order_by('-tree') - return render_to_response('docs/index.html', { + return render_pgweb(request, 'docs', 'docs/index.html', { 'versions': versions, - }, NavContext(request, 'docs')) + }) class _VersionPdfWrapper(Version): """ @@ -117,15 +116,15 @@ class _VersionPdfWrapper(Version): def manuals(request): versions = Version.objects.filter(Q(supported=True) | Q(testing__gt=0,tree__gt=0)).order_by('-tree') - return render_to_response('docs/manuals.html', { + return render_pgweb(request, 'docs', 'docs/manuals.html', { 'versions': [_VersionPdfWrapper(v) for v in versions], - }, NavContext(request, 'docs')) + }) def manualarchive(request): versions = Version.objects.filter(testing=0,supported=False,tree__gt=0).order_by('-tree') - return render_to_response('docs/archive.html', { + return render_pgweb(request, 'docs', 'docs/archive.html', { 'versions': [_VersionPdfWrapper(v) for v in versions], - }, NavContext(request, 'docs')) + }) @login_required def commentform(request, itemid, version, filename): @@ -149,19 +148,18 @@ def commentform(request, itemid, version, filename): replyto='%s, %s' % (form.cleaned_data['email'], settings.DOCSREPORT_EMAIL), sendername='PG Doc comments form' ) - return render_to_response('docs/docsbug_completed.html', { - }, NavContext(request, 'docs')) + return render_pgweb(request, 'docs', 'docs/docsbug_completed.html', {}) else: form = DocCommentForm(initial={ 'name': '%s %s' % (request.user.first_name, request.user.last_name), 'email': request.user.email, }) - return render_to_response('base/form.html', { + return render_pgweb(request, 'docs', 'base/form.html', { 'form': form, 'formitemtype': 'documentation correction', 'operation': 'Submit', 'form_intro': template_to_string('docs/docsbug.html', { 'user': request.user, }), - }, NavContext(request, 'docs')) + }) diff --git a/pgweb/downloads/views.py b/pgweb/downloads/views.py index 1229471a..76003369 100644 --- a/pgweb/downloads/views.py +++ b/pgweb/downloads/views.py @@ -1,5 +1,5 @@ from django.core.urlresolvers import reverse -from django.shortcuts import render_to_response, get_object_or_404 +from django.shortcuts import render, get_object_or_404 from django.http import HttpResponse, Http404, HttpResponseRedirect from pgweb.util.decorators import login_required from django.views.decorators.csrf import csrf_exempt @@ -12,7 +12,7 @@ import cPickle as pickle import json from pgweb.util.decorators import nocache -from pgweb.util.contexts import NavContext +from pgweb.util.contexts import render_pgweb from pgweb.util.helpers import simple_form, PgXmlHelper, HttpServerError from pgweb.util.misc import get_client_ip, varnish_purge, version_sort @@ -110,7 +110,7 @@ def ftpbrowser(request, subpath): del node - return render_to_response('downloads/ftpbrowser.html', { + return render_pgweb(request, 'download', 'downloads/ftpbrowser.html', { 'basepath': subpath.rstrip('/'), 'directories': directories, 'files': sorted(files), @@ -118,7 +118,7 @@ def ftpbrowser(request, subpath): 'readme': file_readme, 'messagefile': file_message, 'maintainer': file_maintainer, - }, NavContext(request, 'download')) + }) # Accept an upload of the ftpsite pickle. This is fairly resource consuming, @@ -197,7 +197,7 @@ def mirrorselect(request, path): def yum_js(request): with open(settings.YUM_JSON) as f: jsonstr = f.read() - return render_to_response('downloads/js/yum.js', { + return render(request, 'downloads/js/yum.js', { 'json': jsonstr, 'supported_versions': ','.join([str(v.numtree) for v in Version.objects.filter(supported=True)]), }, content_type='application/json') @@ -207,18 +207,18 @@ def yum_js(request): ####### def categorylist(request): categories = Category.objects.all() - return render_to_response('downloads/categorylist.html', { + return render_pgweb(request, 'download', 'downloads/categorylist.html', { 'categories': categories, - }, NavContext(request, 'download')) + }) def productlist(request, catid, junk=None): category = get_object_or_404(Category, pk=catid) products = Product.objects.select_related('org','licencetype').filter(category=category, approved=True) - return render_to_response('downloads/productlist.html', { + return render_pgweb(request, 'download', 'downloads/productlist.html', { 'category': category, 'products': products, 'productcount': len(products), - }, NavContext(request, 'download')) + }) @login_required def productform(request, itemid): diff --git a/pgweb/events/views.py b/pgweb/events/views.py index a4978270..5c76c896 100644 --- a/pgweb/events/views.py +++ b/pgweb/events/views.py @@ -1,10 +1,10 @@ -from django.shortcuts import render_to_response, get_object_or_404 +from django.shortcuts import get_object_or_404 from django.http import Http404 from pgweb.util.decorators import login_required from datetime import date -from pgweb.util.contexts import NavContext +from pgweb.util.contexts import render_pgweb from pgweb.util.helpers import simple_form from models import Event @@ -14,25 +14,25 @@ def main(request): community_events = Event.objects.select_related('country').filter(approved=True, badged=True).filter(training=False, enddate__gt=date.today()).order_by('enddate', 'startdate',) other_events = Event.objects.select_related('country').filter(approved=True, badged=False).filter(training=False, enddate__gt=date.today()).order_by('enddate', 'startdate',) training = Event.objects.select_related('country').filter(approved=True).filter(training=True, enddate__gt=date.today()).order_by('enddate', 'startdate',) - return render_to_response('events/archive.html', { + return render_pgweb(request, 'about', 'events/archive.html', { 'title': 'Upcoming events', 'eventblocks': ( { 'name': 'Community Events', 'events': community_events, 'link': '',}, { 'name': 'Other Events', 'events': other_events, 'link': '',}, { 'name': 'Training', 'events': training, 'link': 'training/',}, ), - }, NavContext(request, 'about')) + }) def _eventarchive(request, training, title): # Hardcode to the latest 100 events. Do we need paging too? events = Event.objects.select_related('country').filter(approved=True).filter(training=training, enddate__lte=date.today()).order_by('-enddate', '-startdate',)[:100] - return render_to_response('events/archive.html', { + return render_pgweb(request, 'about', 'events/archive.html', { 'title': '%s Archive' % title, 'archive': True, 'eventblocks': ( {'name': title, 'events': events, }, ), - }, NavContext(request, 'about')) + }) def archive(request): return _eventarchive(request, False, 'Event') @@ -44,9 +44,9 @@ def item(request, itemid, throwaway=None): event = get_object_or_404(Event, pk=itemid) if not event.approved: raise Http404 - return render_to_response('events/item.html', { + return render_pgweb(request, 'about', 'events/item.html', { 'obj': event, - }, NavContext(request, 'about')) + }) @login_required def form(request, itemid): diff --git a/pgweb/featurematrix/views.py b/pgweb/featurematrix/views.py index 3a8411ef..c9da0307 100644 --- a/pgweb/featurematrix/views.py +++ b/pgweb/featurematrix/views.py @@ -1,6 +1,6 @@ -from django.shortcuts import render_to_response, get_object_or_404 +from django.shortcuts import get_object_or_404 -from pgweb.util.contexts import NavContext +from pgweb.util.contexts import render_pgweb from pgweb.core.models import Version from models import Feature @@ -24,13 +24,13 @@ def root(request): groups.append(currentgroup) eol_versions = [v.tree for v in Version.objects.filter(supported=False, testing=False)] - return render_to_response('featurematrix/featurematrix.html', { + return render_pgweb(request, 'about', 'featurematrix/featurematrix.html', { 'groups': groups, 'eol_versions': eol_versions, - }, NavContext(request, 'about')) + }) def detail(request, featureid): feature = get_object_or_404(Feature, pk=featureid) - return render_to_response('featurematrix/featuredetail.html', { + return render_pgweb(request, 'about', 'featurematrix/featuredetail.html', { 'feature': feature, - }, NavContext(request, 'about')) + }) diff --git a/pgweb/lists/views.py b/pgweb/lists/views.py index 1125b94d..bb0dd5f2 100644 --- a/pgweb/lists/views.py +++ b/pgweb/lists/views.py @@ -1,4 +1,4 @@ -from django.shortcuts import render_to_response, get_object_or_404 +from django.shortcuts import get_object_or_404 from django.http import HttpResponse, HttpResponseForbidden from django.views.decorators.csrf import csrf_exempt from django.conf import settings diff --git a/pgweb/misc/views.py b/pgweb/misc/views.py index cd7cb318..ddd38e97 100644 --- a/pgweb/misc/views.py +++ b/pgweb/misc/views.py @@ -1,4 +1,3 @@ -from django.shortcuts import render_to_response from pgweb.util.decorators import login_required from django.http import HttpResponse from django.db import connection @@ -6,7 +5,7 @@ from django.conf import settings import os -from pgweb.util.contexts import NavContext +from pgweb.util.contexts import render_pgweb from pgweb.util.helpers import template_to_string from pgweb.util.misc import send_template_mail @@ -38,9 +37,9 @@ def submitbug(request): sendername="PG Bug reporting form", ) - return render_to_response('misc/bug_completed.html', { + return render_pgweb(request, 'support', 'misc/bug_completed.html', { 'bugid': bugid, - }, NavContext(request, 'support')) + }) else: form = SubmitBugForm(initial={ 'name': '%s %s' % (request.user.first_name, request.user.last_name), @@ -49,14 +48,14 @@ def submitbug(request): versions = Version.objects.filter(supported=True) - return render_to_response('base/form.html', { + return render_pgweb(request, 'support', 'base/form.html', { 'form': form, 'formitemtype': 'bug report', 'operation': 'Submit', 'form_intro': template_to_string('misc/bug_header.html', { 'supportedversions': versions, }), - }, NavContext(request, 'support')) + }) # A crash testing URL. If the file /tmp/crashtest exists, raise a http 500 diff --git a/pgweb/news/views.py b/pgweb/news/views.py index 1c2b093a..94ac1e6c 100644 --- a/pgweb/news/views.py +++ b/pgweb/news/views.py @@ -1,8 +1,8 @@ -from django.shortcuts import render_to_response, get_object_or_404 +from django.shortcuts import get_object_or_404 from django.http import HttpResponse, Http404 from pgweb.util.decorators import login_required -from pgweb.util.contexts import NavContext +from pgweb.util.contexts import render_pgweb from pgweb.util.helpers import simple_form from models import NewsArticle, NewsTag @@ -17,20 +17,20 @@ def archive(request, tag=None, paging=None): else: tag = None news = NewsArticle.objects.filter(approved=True) - return render_to_response('news/newsarchive.html', { + return render_pgweb(request, 'about', 'news/newsarchive.html', { 'news': news, 'tag': tag, 'newstags': NewsTag.objects.all(), - }, NavContext(request, 'about')) + }) def item(request, itemid, throwaway=None): news = get_object_or_404(NewsArticle, pk=itemid) if not news.approved: raise Http404 - return render_to_response('news/item.html', { + return render_pgweb(request, 'about', 'news/item.html', { 'obj': news, 'newstags': NewsTag.objects.all(), - }, NavContext(request, 'about')) + }) def taglist_json(request): return HttpResponse(json.dumps({ diff --git a/pgweb/profserv/views.py b/pgweb/profserv/views.py index c179ef20..eb08c510 100644 --- a/pgweb/profserv/views.py +++ b/pgweb/profserv/views.py @@ -1,8 +1,7 @@ -from django.shortcuts import render_to_response from django.http import Http404 from pgweb.util.decorators import login_required -from pgweb.util.contexts import NavContext +from pgweb.util.contexts import render_pgweb from pgweb.util.helpers import simple_form from models import ProfessionalService @@ -21,12 +20,12 @@ def root(request, servtype): title = servtype=='support' and 'Professional Services' or 'Hosting Providers' what = servtype=='support' and 'support' or 'hosting' support = servtype=='support' - return render_to_response('profserv/root.html', { + return render_pgweb(request, 'support', 'profserv/root.html', { 'title': title, 'support': support, 'regions': regions, 'what': what, - }, NavContext(request, 'support')) + }) def region(request, servtype, regionname): @@ -44,14 +43,14 @@ def region(request, servtype, regionname): # Field names are cleaned up earlier, so it's safe against injections. services = ProfessionalService.objects.select_related('org').filter(approved=True).extra(where=["region_%s AND provides_%s" % (regionname, what),]) - return render_to_response('profserv/list.html', { + return render_pgweb(request, 'support', 'profserv/list.html', { 'title': title, 'support': support, 'what': what, 'whatname': whatname, 'regionname': regname, 'services': services, - }, NavContext(request, 'support')) + }) # Forms to edit diff --git a/pgweb/pugs/views.py b/pgweb/pugs/views.py index 8a916aa9..83414ed7 100644 --- a/pgweb/pugs/views.py +++ b/pgweb/pugs/views.py @@ -1,6 +1,4 @@ -from django.shortcuts import render_to_response - -from pgweb.util.contexts import NavContext +from pgweb.util.contexts import render_pgweb from models import PUG @@ -17,6 +15,6 @@ def index(request): 'country': pug.country.name, 'pugs': [pug] }) - return render_to_response('pugs/index.html', { + return render_pgweb(request, 'community', 'pugs/index.html', { 'pug_list': pug_list, - }, NavContext(request, 'community')) + }) diff --git a/pgweb/quotes/views.py b/pgweb/quotes/views.py index 41432fda..ce379a00 100644 --- a/pgweb/quotes/views.py +++ b/pgweb/quotes/views.py @@ -1,11 +1,9 @@ -from django.shortcuts import render_to_response - -from pgweb.util.contexts import NavContext +from pgweb.util.contexts import render_pgweb from models import Quote def allquotes(request): quotes = Quote.objects.filter(approved=True) - return render_to_response('quotes/quotelist.html', { + return render_pgweb(request, 'about', 'quotes/quotelist.html', { 'quotes': quotes, - }, NavContext(request, 'about')) + }) diff --git a/pgweb/search/views.py b/pgweb/search/views.py index fe078123..8f11c384 100644 --- a/pgweb/search/views.py +++ b/pgweb/search/views.py @@ -1,5 +1,4 @@ -from django.shortcuts import render_to_response -from django.template.context import RequestContext +from django.shortcuts import render from django.http import HttpResponseRedirect from django.views.decorators.csrf import csrf_exempt from django.conf import settings @@ -130,25 +129,25 @@ def search(request): # Check that we actually have something to search for if not request.GET.has_key('q') or request.GET['q'] == '': if searchlists: - return render_to_response('search/listsearch.html', { + return render(request, 'search/listsearch.html', { 'search_error': "No search term specified.", 'sortoptions': sortoptions, 'lists': MailingList.objects.all().order_by("group__sortkey"), 'listid': listid, 'dates': dateoptions, 'dateval': dateval, - }, RequestContext(request)) + }) else: - return render_to_response('search/sitesearch.html', { + return render(request, 'search/sitesearch.html', { 'search_error': "No search term specified.", - }, RequestContext(request)) + }) query = request.GET['q'].strip() # Anti-stefan prevention if len(query) > 1000: - return render_to_response('search/sitesearch.html', { + return render(request, 'search/sitesearch.html', { 'search_error': "Search term too long.", - }, RequestContext(request)) + }) # Is the request being paged? if request.GET.has_key('p'): @@ -199,14 +198,14 @@ def search(request): try: r = c.getresponse() except (socket.timeout, ssl.SSLError): - return render_to_response('search/listsearch.html', { + return render(request, 'search/listsearch.html', { 'search_error': 'Timeout when talking to search server. Please try your search again later, or with a more restrictive search terms.', - }, RequestContext(request)) + }) if r.status != 200: memc = None - return render_to_response('search/listsearch.html', { + return render(request, 'search/listsearch.html', { 'search_error': 'Error talking to search server: %s' % r.reason, - }, RequestContext(request)) + }) hits = json.loads(r.read()) if has_memcached and memc: # Store them in memcached too! But only for 10 minutes... @@ -229,7 +228,7 @@ def search(request): listsort ) - return render_to_response('search/listsearch.html', { + return render(request, 'search/listsearch.html', { 'hitcount': totalhits, 'firsthit': firsthit, 'lasthit': min(totalhits, firsthit+hitsperpage-1), @@ -251,7 +250,7 @@ def search(request): 'listid': listid, 'dates': dateoptions, 'dateval': dateval, - }, RequestContext(request)) + }) else: # Website search is still done by making a regular pgsql connection @@ -260,9 +259,9 @@ def search(request): conn = psycopg2.connect(settings.SEARCH_DSN) curs = conn.cursor() except: - return render_to_response('search/sitesearch.html', { + return render(request, 'search/sitesearch.html', { 'search_error': 'Could not connect to search database.' - }, RequestContext(request)) + }) # This is kind of a hack, but... Some URLs are flagged as internal # and should as such only be included in searches that explicitly @@ -283,9 +282,9 @@ def search(request): 'internal': include_internal, }) except psycopg2.ProgrammingError: - return render_to_response('search/sitesearch.html', { + return render(request, 'search/sitesearch.html', { 'search_error': 'Error executing search query.' - }, RequestContext(request)) + }) hits = curs.fetchall() conn.close() @@ -296,7 +295,7 @@ def search(request): suburl and urllib.quote_plus(suburl) or '', ) - return render_to_response('search/sitesearch.html', { + return render(request, 'search/sitesearch.html', { 'suburl': suburl, 'allsites': allsites, 'hitcount': totalhits, @@ -312,4 +311,4 @@ def search(request): 'url': "%s%s" % (h[1], h[2]), 'abstract': h[4].replace("[[[[[[", "").replace("]]]]]]",""), 'rank': h[5]} for h in hits[:-1]], - }, RequestContext(request)) + }) diff --git a/pgweb/security/views.py b/pgweb/security/views.py index 0017b19a..86dfa3e4 100644 --- a/pgweb/security/views.py +++ b/pgweb/security/views.py @@ -1,6 +1,6 @@ -from django.shortcuts import render_to_response, get_object_or_404 +from django.shortcuts import get_object_or_404 -from pgweb.util.contexts import NavContext +from pgweb.util.contexts import render_pgweb from pgweb.core.models import Version from models import SecurityPatch @@ -11,13 +11,13 @@ def GetPatchesList(filt): def _list_patches(request, filt): patches = GetPatchesList(filt) - return render_to_response('security/security.html', { + return render_pgweb(request, 'support', 'security/security.html', { 'patches': patches, 'supported': Version.objects.filter(supported=True), 'unsupported': Version.objects.filter(supported=False, tree__gt=0).extra( where=["EXISTS (SELECT 1 FROM security_securitypatchversion pv WHERE pv.version_id=core_version.id)"], ), - }, NavContext(request, 'support')) + }) def index(request): # Show all supported versions diff --git a/pgweb/sponsors/views.py b/pgweb/sponsors/views.py index c91a61b2..7b676f76 100644 --- a/pgweb/sponsors/views.py +++ b/pgweb/sponsors/views.py @@ -1,6 +1,4 @@ -from django.shortcuts import render_to_response - -from pgweb.util.contexts import NavContext +from pgweb.util.contexts import render_pgweb from pgweb.util.decorators import cache from models import Sponsor, Server @@ -8,12 +6,12 @@ from models import Sponsor, Server @cache(minutes=30) def sponsors(request): sponsors = Sponsor.objects.select_related().filter(sponsortype__sortkey__gt=0).order_by('sponsortype__sortkey' ,'?') - return render_to_response('sponsors/sponsors.html', { + return render_pgweb(request, 'about', 'sponsors/sponsors.html', { 'sponsors': sponsors, - }, NavContext(request, 'about')) + }) def servers(request): servers = Server.objects.select_related().all() - return render_to_response('sponsors/servers.html', { + return render_pgweb(request, 'about', 'sponsors/servers.html', { 'servers': servers, - }, NavContext(request, 'about')) + }) diff --git a/pgweb/survey/views.py b/pgweb/survey/views.py index a2a2b244..eb5cad2a 100644 --- a/pgweb/survey/views.py +++ b/pgweb/survey/views.py @@ -1,10 +1,10 @@ -from django.shortcuts import render_to_response, get_object_or_404 +from django.shortcuts import get_object_or_404 from django.http import HttpResponseRedirect from django.db import connection, transaction from django.template.defaultfilters import slugify from django.views.decorators.csrf import csrf_exempt -from pgweb.util.contexts import NavContext +from pgweb.util.contexts import render_pgweb from pgweb.util.misc import get_client_ip, varnish_purge from pgweb.util.helpers import HttpServerError @@ -14,10 +14,10 @@ def results(request, surveyid, junk=None): survey = get_object_or_404(Survey, pk=surveyid) surveylist = Survey.objects.all().order_by('-posted') - return render_to_response('survey/results.html', { + return render_pgweb(request, 'community', 'survey/results.html', { 'survey': survey, 'surveylist': surveylist, - }, NavContext(request, 'community')) + }) # Served over insecure HTTP, the Varnish proxy strips cookies @csrf_exempt diff --git a/pgweb/util/contexts.py b/pgweb/util/contexts.py index 045cea1d..029e9a1c 100644 --- a/pgweb/util/contexts.py +++ b/pgweb/util/contexts.py @@ -1,5 +1,5 @@ -from django.template import RequestContext from django.utils.functional import SimpleLazyObject +from django.shortcuts import render from django.conf import settings # This is the whole site navigation structure. Stick in a smarter file? @@ -91,15 +91,15 @@ sitenav = { } -class NavContext(RequestContext): - def __init__(self, request, section): - RequestContext.__init__(self, request) - if sitenav.has_key(section): - navsection = sitenav[section] - else: - navsection = {} - self.update({'navmenu': navsection}) +def get_nav_menu(section): + if sitenav.has_key(section): + return sitenav[section] + else: + return {} +def render_pgweb(request, section, template, context): + context['navmenu'] = get_nav_menu(section) + return render(request, template, context) def _get_gitrev(): # Return the current git revision, that is used for diff --git a/pgweb/util/helpers.py b/pgweb/util/helpers.py index f553e79b..15632b3e 100644 --- a/pgweb/util/helpers.py +++ b/pgweb/util/helpers.py @@ -1,5 +1,5 @@ -from django.shortcuts import render_to_response, get_object_or_404 -from pgweb.util.contexts import NavContext +from django.shortcuts import render, get_object_or_404 +from pgweb.util.contexts import render_pgweb from django.http import HttpResponseRedirect, Http404 from django.template import Context from django.template.loader import get_template @@ -63,7 +63,7 @@ def simple_form(instancetype, itemid, request, formclass, formtemplate='base/for else: described_checkboxes = None - return render_to_response(formtemplate, { + return render_pgweb(request, navsection, formtemplate, { 'form': form, 'formitemtype': instance._meta.verbose_name, 'markdownfields': markdownfields, @@ -73,13 +73,13 @@ def simple_form(instancetype, itemid, request, formclass, formtemplate='base/for 'jquery': hasattr(form, 'jquery') and form.jquery or None, 'savebutton': (itemid == "new") and "New" or "Save", 'operation': (itemid == "new") and "New" or "Edit", - }, NavContext(request, navsection)) + }) def template_to_string(templatename, attrs = {}): return get_template(templatename).render(Context(attrs)) def HttpServerError(msg): - r = render_to_response('errors/500.html', { + r = render(request, 'errors/500.html', { 'message': msg, }) r.status_code = 500