dpaste/dpaste/views.py

177 lines
5.7 KiB
Python
Raw Normal View History

2011-05-30 09:03:04 +10:00
from django.shortcuts import render_to_response, get_object_or_404, get_list_or_404
from django.template.context import RequestContext
2011-08-27 20:32:20 +10:00
from django.http import Http404, HttpResponseRedirect, HttpResponseBadRequest, \
HttpResponse, HttpResponseForbidden
2011-05-30 09:03:04 +10:00
from django.conf import settings
2011-08-27 20:29:12 +10:00
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
2011-05-30 09:03:04 +10:00
from django.utils.translation import ugettext_lazy as _
from django.core.urlresolvers import reverse
from django.utils import simplejson
from django.views.defaults import page_not_found as django_page_not_found, \
server_error as django_server_error
2013-03-20 05:17:07 +11:00
from dpaste.forms import SnippetForm
from dpaste.models import Snippet
2013-03-20 05:43:38 +11:00
from dpaste.highlight import guess_code_lexer, \
LEXER_WORDWRAP, LEXER_LIST
2011-05-30 09:03:04 +10:00
import difflib
def snippet_new(request, template_name='dpaste/snippet_new.html'):
if request.method == "POST":
snippet_form = SnippetForm(data=request.POST, request=request)
if snippet_form.is_valid():
request, new_snippet = snippet_form.save()
2013-03-20 07:13:13 +11:00
url = new_snippet.get_absolute_url()
return HttpResponseRedirect(url)
2011-05-30 09:03:04 +10:00
else:
snippet_form = SnippetForm(request=request)
template_context = {
'snippet_form': snippet_form,
}
return render_to_response(
template_name,
template_context,
RequestContext(request)
)
def snippet_details(request, snippet_id, template_name='dpaste/snippet_details.html', is_raw=False):
2011-08-27 20:29:12 +10:00
try:
snippet = Snippet.objects.get(secret_id=snippet_id)
except MultipleObjectsReturned:
raise Http404('Multiple snippets exist for this slug. This should never '
'happen but its likely that you are a spam bot, so I dont '
'care.')
except ObjectDoesNotExist:
raise Http404('This snippet does not exist anymore. Its likely that its '
'lifetime is expired.')
tree = snippet.get_root()
tree = tree.get_descendants(include_self=True)
2011-05-30 09:03:04 +10:00
new_snippet_initial = {
'content': snippet.content,
'lexer': snippet.lexer,
}
if request.method == "POST":
snippet_form = SnippetForm(data=request.POST, request=request, initial=new_snippet_initial)
if snippet_form.is_valid():
request, new_snippet = snippet_form.save(parent=snippet)
2013-03-20 07:13:13 +11:00
url = new_snippet.get_absolute_url()
return HttpResponseRedirect(url)
2011-05-30 09:03:04 +10:00
else:
snippet_form = SnippetForm(initial=new_snippet_initial, request=request)
template_context = {
'snippet_form': snippet_form,
'snippet': snippet,
2013-03-20 05:17:07 +11:00
'lexers': LEXER_LIST,
2011-05-30 09:03:04 +10:00
'lines': range(snippet.get_linecount()),
'tree': tree,
'wordwrap': snippet.lexer in LEXER_WORDWRAP and 'True' or 'False',
2011-05-30 09:03:04 +10:00
}
response = render_to_response(
template_name,
template_context,
RequestContext(request)
)
if is_raw:
2011-09-09 11:01:37 +10:00
response['Content-Type'] = 'text/plain;charset=UTF-8'
2011-05-30 09:03:04 +10:00
return response
else:
return response
def snippet_delete(request, snippet_id):
snippet = get_object_or_404(Snippet, secret_id=snippet_id)
try:
snippet_list = request.session['snippet_list']
except KeyError:
return HttpResponseForbidden('You have no recent snippet list, cookie error?')
if not snippet.pk in snippet_list:
2013-03-20 05:17:07 +11:00
return HttpResponseForbidden('That\'s not your snippet!')
2011-05-30 09:03:04 +10:00
snippet.delete()
return HttpResponseRedirect(reverse('snippet_new'))
2013-03-20 05:17:07 +11:00
def snippet_history(request, template_name='dpaste/snippet_list.html'):
2011-06-08 20:23:08 +10:00
2011-05-30 09:03:04 +10:00
try:
snippet_list = get_list_or_404(Snippet, pk__in=request.session.get('snippet_list', None))
except ValueError:
snippet_list = None
2011-06-08 20:23:08 +10:00
2011-05-30 09:03:04 +10:00
template_context = {
'snippets_max': getattr(settings, 'MAX_SNIPPETS_PER_USER', 10),
'snippet_list': snippet_list,
}
return render_to_response(
template_name,
template_context,
RequestContext(request)
)
def snippet_diff(request, template_name='dpaste/snippet_diff.html'):
2011-06-03 18:56:11 +10:00
if request.GET.get('a') and request.GET.get('a').isdigit() \
and request.GET.get('b') and request.GET.get('b').isdigit():
2011-05-30 09:03:04 +10:00
try:
fileA = Snippet.objects.get(pk=int(request.GET.get('a')))
fileB = Snippet.objects.get(pk=int(request.GET.get('b')))
except ObjectDoesNotExist:
return HttpResponseBadRequest(u'Selected file(s) does not exist.')
else:
return HttpResponseBadRequest(u'You must select two snippets.')
2013-03-20 05:17:07 +11:00
class DiffText(object):
pass
diff = DiffText()
2011-05-30 09:03:04 +10:00
if fileA.content != fileB.content:
d = difflib.unified_diff(
fileA.content.splitlines(),
fileB.content.splitlines(),
'Original',
'Current',
lineterm=''
)
2013-03-20 05:17:07 +11:00
diff.content = '\n'.join(d).strip()
diff.lexer = 'diff'
2011-05-30 09:03:04 +10:00
else:
2013-03-20 05:17:07 +11:00
diff.content = _(u'No changes were made between this two files.')
diff.lexer = 'text'
2011-05-30 09:03:04 +10:00
template_context = {
2013-03-20 05:17:07 +11:00
'snippet': diff,
2011-05-30 09:03:04 +10:00
'fileA': fileA,
'fileB': fileB,
}
return render_to_response(
template_name,
template_context,
RequestContext(request)
)
2011-06-08 20:23:08 +10:00
2011-05-30 09:03:04 +10:00
def guess_lexer(request):
code_string = request.GET.get('codestring', False)
response = simplejson.dumps({'lexer': guess_code_lexer(code_string)})
return HttpResponse(response)
def page_not_found(request, template_name='dpaste/404.html'):
return django_page_not_found(request, template_name)
def server_error(request, template_name='dpaste/500.html'):
return django_server_error(request, template_name)