mirror of
https://github.com/postgres/pgweb.git
synced 2025-08-01 15:54:53 +00:00

render_to_response does not work on newer django, so it needs to be replaced. And using a speicfic context actually overcomplicates things, it's easier to just use a wrapper function. For those cases where we don't need NavContext, just use render() (the new shortcut function from django), which also removes the need to use RequestContext.
166 lines
5.6 KiB
Python
166 lines
5.6 KiB
Python
from django.shortcuts import render, get_object_or_404
|
|
from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect
|
|
from django.http import Http404
|
|
from pgweb.util.decorators import login_required
|
|
from django.db.models import Q
|
|
from django.conf import settings
|
|
|
|
from decimal import Decimal
|
|
import os
|
|
|
|
from pgweb.util.contexts import render_pgweb
|
|
from pgweb.util.helpers import template_to_string
|
|
from pgweb.util.misc import send_template_mail
|
|
|
|
from pgweb.core.models import Version
|
|
|
|
from models import DocPage
|
|
from forms import DocCommentForm
|
|
|
|
def docpage(request, version, typ, filename):
|
|
loaddate = None
|
|
# Get the current version both to map the /current/ url, and to later
|
|
# determine if we allow comments on this page.
|
|
currver = Version.objects.filter(current=True)[0].tree
|
|
if version == 'current':
|
|
ver = currver
|
|
elif version == 'devel':
|
|
if not typ == 'static':
|
|
return HttpResponseRedirect("/docs/devel/static/%s.html" % filename)
|
|
ver = Decimal(0)
|
|
loaddate = Version.objects.get(tree=Decimal(0)).docsloaded
|
|
else:
|
|
ver = Decimal(version)
|
|
if ver == Decimal(0):
|
|
raise Http404("Version not found")
|
|
|
|
if ver < Decimal("7.1") and ver > Decimal(0):
|
|
extension = "htm"
|
|
else:
|
|
extension = "html"
|
|
|
|
if ver < Decimal("7.1") and ver > Decimal(0):
|
|
indexname = "postgres.htm"
|
|
elif ver == Decimal("7.1"):
|
|
indexname = "postgres.html"
|
|
else:
|
|
indexname = "index.html"
|
|
|
|
if ver >= 10 and version.find('.') > -1:
|
|
# Version 10 and up, but specified as 10.0 / 11.0 etc, so redirect back without the
|
|
# decimal.
|
|
return HttpResponseRedirect("/docs/{0}/static/{1}.html".format(int(ver), filename))
|
|
|
|
fullname = "%s.%s" % (filename, extension)
|
|
page = get_object_or_404(DocPage, version=ver, file=fullname)
|
|
qq = Q(file=fullname) | Q(file='kalle.html')
|
|
versions = DocPage.objects.extra(
|
|
where=["file=%s OR file IN (SELECT file2 FROM docsalias WHERE file1=%s) OR file IN (SELECT file1 FROM docsalias WHERE file2=%s)"],
|
|
params=[fullname, fullname, fullname],
|
|
select={
|
|
'supported':"COALESCE((SELECT supported FROM core_version v WHERE v.tree=version), 'f')",
|
|
'testing':"COALESCE((SELECT testing FROM core_version v WHERE v.tree=version),0)",
|
|
}).order_by('-supported', '-version').only('version', 'file')
|
|
|
|
if typ=="interactive":
|
|
# Interactive documents are disabled, so redirect to static page
|
|
return HttpResponsePermanentRedirect("/docs/{0}/static/{1}.html".format(version, filename))
|
|
|
|
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],
|
|
'unsupported_versions': [v for v in versions if not v.supported and not v.testing],
|
|
'title': page.title,
|
|
'doc_index_filename': indexname,
|
|
'loaddate': loaddate,
|
|
})
|
|
|
|
def docsrootpage(request, version, typ):
|
|
return docpage(request, version, typ, 'index')
|
|
|
|
def redirect_root(request, version):
|
|
return HttpResponseRedirect("/docs/%s/static/" % version)
|
|
|
|
def root(request):
|
|
versions = Version.objects.filter(Q(supported=True) | Q(testing__gt=0,tree__gt=0)).order_by('-tree')
|
|
return render_pgweb(request, 'docs', 'docs/index.html', {
|
|
'versions': versions,
|
|
})
|
|
|
|
class _VersionPdfWrapper(Version):
|
|
"""
|
|
A wrapper around a version that knows to look for PDF files, and
|
|
return their sizes.
|
|
"""
|
|
def __init__(self, version):
|
|
self.__version = version
|
|
self.a4pdf = self._find_pdf('A4')
|
|
self.uspdf = self._find_pdf('US')
|
|
# Some versions have, ahem, strange index filenames
|
|
if self.__version.tree < Decimal('6.4'):
|
|
self.indexname = 'book01.htm'
|
|
elif self.__version.tree < Decimal('7.0'):
|
|
self.indexname = 'postgres.htm'
|
|
elif self.__version.tree < Decimal('7.2'):
|
|
self.indexname = 'postgres.html'
|
|
else:
|
|
self.indexname = 'index.html'
|
|
def __getattr__(self, name):
|
|
return getattr(self.__version, name)
|
|
def _find_pdf(self, pagetype):
|
|
try:
|
|
return os.stat('%s/documentation/pdf/%s/postgresql-%s-%s.pdf' % (settings.STATIC_CHECKOUT, self.__version.numtree, self.__version.numtree, pagetype)).st_size
|
|
except:
|
|
return 0
|
|
|
|
def manuals(request):
|
|
versions = Version.objects.filter(Q(supported=True) | Q(testing__gt=0,tree__gt=0)).order_by('-tree')
|
|
return render_pgweb(request, 'docs', 'docs/manuals.html', {
|
|
'versions': [_VersionPdfWrapper(v) for v in versions],
|
|
})
|
|
|
|
def manualarchive(request):
|
|
versions = Version.objects.filter(testing=0,supported=False,tree__gt=0).order_by('-tree')
|
|
return render_pgweb(request, 'docs', 'docs/archive.html', {
|
|
'versions': [_VersionPdfWrapper(v) for v in versions],
|
|
})
|
|
|
|
@login_required
|
|
def commentform(request, itemid, version, filename):
|
|
if request.method == 'POST':
|
|
form = DocCommentForm(request.POST)
|
|
if form.is_valid():
|
|
if version == '0.0':
|
|
version = 'devel'
|
|
|
|
send_template_mail(
|
|
settings.DOCSREPORT_NOREPLY_EMAIL,
|
|
settings.DOCSREPORT_EMAIL,
|
|
'%s' % form.cleaned_data['shortdesc'],
|
|
'docs/docsbugmail.txt', {
|
|
'version': version,
|
|
'filename': filename,
|
|
'details': form.cleaned_data['details'],
|
|
},
|
|
usergenerated=True,
|
|
cc=form.cleaned_data['email'],
|
|
replyto='%s, %s' % (form.cleaned_data['email'], settings.DOCSREPORT_EMAIL),
|
|
sendername='PG Doc comments form'
|
|
)
|
|
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_pgweb(request, 'docs', 'base/form.html', {
|
|
'form': form,
|
|
'formitemtype': 'documentation correction',
|
|
'operation': 'Submit',
|
|
'form_intro': template_to_string('docs/docsbug.html', {
|
|
'user': request.user,
|
|
}),
|
|
})
|