from django import forms, http, template from django.contrib.auth.decorators import login_required from django.shortcuts import get_object_or_404, render_to_response from django.http import HttpResponse, Http404, HttpResponseServerError import os, commands from models import * from settings import * from django.contrib.comments.models import Comment # Create your views here. def frontpage(request): t = fromslug('') t.update() #TODO: doesn't display free comments unless there's a comment lc = Comment.objects.filter(content_type__name="item").order_by('-submit_date')[:6] return render_to_response('git_wiki/frontpage.html', \ dict(shortlog=shortlog(), tree=t, latest_comments=lc, newitems=newest_items())) def tree(request, reqslug, tree=None): if not tree: t = fromslug(reqslug) if not t: raise Http404 if t.type == 'blob': return item(request, reqslug, blob=t) else: t = tree t.update() (heads,tags) = reposcan() return render_to_response('git_wiki/tree.html', dict(shortlog=shortlog(tree=t), tree=t, heads=heads,tags=tags)) def item(request, reqslug, blob=None): if not blob: i = fromslug(reqslug) if not i: raise Http404 if i.type == 'tree': return tree(request, reqslug) else: i = blob i.update() try: from docutils.core import publish_parts,Publisher import latex_directive latex_directive.dorawtexstuff = False latex_directive.register() except ImportError: if settings.DEBUG: raise HttpResponseServerError(request) else: docutils_settings = getattr(settings, "GITWIKI_REST_SETTINGS", {}) parts = publish_parts(source=i.contents, writer_name="html4css1", settings_overrides=docutils_settings) return render_to_response('git_wiki/item.html', dict(item=i,doc=parts,user=request.user)) def latexitem(request, reqslug, blob=None): if not blob: i = fromslug(reqslug) if not i: raise Http404 if i.type == 'tree': return tree(request, reqslug) else: i = blob i.update() try: from docutils.core import publish_parts,Publisher import latex_directive latex_directive.dorawtexstuff = True latex_directive.register() except ImportError: if settings.DEBUG: raise HttpResponseServerError(request) else: docutils_settings = getattr(settings, "GITWIKI_REST_SETTINGS", {'format':'latex'}) parts = publish_parts(source=i.contents, writer_name="latex", settings_overrides=docutils_settings) hr = HttpResponse(mimetype="text/plain") hr['Content-Disposition'] = 'filename=%s.tex' % reqslug hr.write(parts['whole'].replace('{\$}','$')) #hr.write(parts['whole']) return hr def pdfitem(request, reqslug, blob=None): if not blob: i = fromslug(reqslug) if not i: raise Http404 if i.type == 'tree': return tree(request, reqslug) else: i = blob i.update() try: from docutils.core import publish_parts,Publisher import latex_directive latex_directive.dorawtexstuff = True latex_directive.register() import tempfile,re,os,shutil except ImportError: if settings.DEBUG: raise HttpResponseServerError(request) else: docutils_settings = getattr(settings, "GITWIKI_REST_SETTINGS", {'format':'latex'}) parts = publish_parts(source=i.contents, writer_name="latex", settings_overrides=docutils_settings) tmpdir = tempfile.mkdtemp() pre = i.slug().split('/') for fig in re.findall('\\includegraphics.*\{(.+)\}', parts['whole']): try: if len(pre) > 1: fig_blob = fromslug("%s/%s" % ('/'.join(pre[:-1])),fig) else: fig_blob = fromslug(fig) fig_blob.update() # if might have to create subdirectories for figures fig_pre = fig.split('/') if len(fig_pre) > 1: os.mkdir("%s/%s" % (tmpdir,'/'.join(fig_pre[:-1]))) fig_file = file(str("%s/%s" % (tmpdir,fig)),'wb') fig_file.write(fig_blob.contents) fig_file.close() except: parts['whole'].replace(fig,'') hr = HttpResponse(mimetype="application/pdf") #hr = HttpResponse() hr['Content-Disposition'] = 'filename=%s.pdf' % reqslug write_tex,pdf = os.popen2('rubber-pipe -qqq -d --into %s' % tmpdir) write_tex.write(parts['whole'].replace('{\$}','$')) write_tex.flush() write_tex.close() #hr.write(parts['whole']) #pdf.flush() for l in pdf.readlines(): hr.write(l) try: pdff = open("%s/rubtmp0.pdf" % tmpdir,'r') for l in pdff.readlines(): hr.write(l) pdff.close() except: pass pdf.close() shutil.rmtree(tmpdir) return hr def rawitem(request, reqslug, blob=None): if reqslug.endswith('/'): reqslug=reqslug[:-1] if not blob: i = fromslug(reqslug) if not i: raise Http404 if i.type == 'tree': return tree(request, reqslug) else: i = blob i.update() slug = i.slug() r = HttpResponse(mimetype="text/plain") r['Content-Disposition'] = 'filename=%s.txt' % reqslug r.write(i.contents) return r def figure(request, reqslug, blob=None, download=False): if reqslug.endswith('/'): reqslug=reqslug[:-1] if not blob: i = fromslug(reqslug) if not i: l = reqslug.split('/') if l[-2] == 'fig': l = l[:-3] + l[-2:] else: l = l[:-2] + l[-1:] i = fromslug('/'.join(l)) if not i: raise Http404 if i.type == 'tree': return tree(request, reqslug) else: i = blob mime = "image/image" slug = i.slug() i.update() if slug.endswith('.jpg') or slug.endswith('.jpeg'): mime = "image/jpeg" elif slug.endswith('.png'): mime = "image/jpeg" elif slug.endswith('.gif'): mime = "image/jpeg" elif slug.endswith('.svg'): mime = "image/svg+xml" r = HttpResponse(mimetype=mime) if download: r['Content-Disposition'] = 'attachment; filename=%s' % reqslug else: r['Content-Disposition'] = 'filename=%s' % reqslug f = i.getfile() t = f.readlines() r.write(i.contents) return r def olditem(request, hash): i = get_object_or_404(Item, id=hash) i.update() return render_to_response('git_browse/olditem.html', dict(item=i)) def view_commit(request, hash): (heads, tags) = reposcan() c = Commit(id=hash) c.update() try: from pygments import highlight from pygments.lexers import DiffLexer from pygments.formatters import HtmlFormatter c.pretty_diff = highlight(c.rawdiff, DiffLexer(), HtmlFormatter()) except: pass return render_to_response('git_wiki/commit.html', dict(heads=heads, tags=tags, commit=c))