pasteque/paste/views.py

77 lines
2.3 KiB
Python

import json
from pathlib import Path
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.template import RequestContext, loader
from django.urls import reverse
from django.views.decorators.csrf import csrf_exempt
import pygments
from pygments.formatters import HtmlFormatter
from pygments.lexers import get_lexer_by_name
from webtools import settings
from paste.forms import PasteForm
from paste.models import Paste
@csrf_exempt
def index(request):
"""Displays form."""
if request.method == "GET":
return render(request, "paste/index.html")
paste = Paste()
paste.choose_slug()
if not request.FILES:
return HttpResponse(json.dumps({"error": "Please provide a file."}, indent=4))
(filename, the_file), *_ = request.FILES.items()
form = PasteForm(
{
"filename": filename,
"content": the_file.read().decode(),
},
instance=paste,
)
if not form.is_valid():
return HttpResponse(json.dumps(form.errors, indent=4))
form.save()
location = request.build_absolute_uri(
reverse("short_paste", kwargs={"slug": paste.slug})
)
return HttpResponseRedirect(
location, content=location + "\n", content_type="text/plain"
)
def show(request, slug):
"""Display paste."""
paste = get_object_or_404(Paste, slug=slug)
paste.incr_viewcount()
if "html" in request.headers["accept"]:
render_method = render_pygments
else:
render_method = render_raw
return render_method(request, paste, {"slug": slug})
def render_pygments(request, paste, data):
"""Renders Pygments template."""
try:
lexer = get_lexer_by_name(Path(paste.filename).suffix.strip("."))
except pygments.util.ClassNotFound:
lexer = get_lexer_by_name(settings.PASTE["default_language"])
formatter = HtmlFormatter(style="emacs")
data["paste"] = paste
data["filename"] = paste.filename
data["highlighted"] = pygments.highlight(paste.content, lexer, formatter)
rendered = loader.render_to_string("paste/show-pygments.html", data, request)
return HttpResponse(rendered)
def render_raw(request, paste, data):
"""Renders RAW content."""
return HttpResponse(paste.content, content_type="text/plain")