pasteque/paste/views.py

88 lines
3.6 KiB
Python
Raw Normal View History

2018-05-06 21:19:49 +00:00
from . import renderers
from django.urls import reverse
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect
from django.views.decorators.csrf import csrf_exempt
from .models import Paste, Language
2018-05-06 21:19:49 +00:00
from .forms import PasteForm
from .tools import random_id
2013-04-04 17:37:30 +00:00
from webtools import settings
@csrf_exempt
2013-04-04 17:37:30 +00:00
def index(request):
"""Displays form."""
data = {'menu': 'index',
2018-05-07 20:52:15 +00:00
'max_characters': settings.PASTE['max_characters']}
2013-04-04 17:37:30 +00:00
if request.method == 'POST':
2018-05-06 22:35:52 +00:00
paste = Paste(slug=random_id(Paste),
2018-05-06 21:19:49 +00:00
paste_ip=request.META['REMOTE_ADDR'],
2013-04-04 17:37:30 +00:00
paste_agent=request.META['HTTP_USER_AGENT'])
if request.FILES:
for language_name, any_file in request.FILES.items():
break
language = Language.by_name(language_name)
form = PasteForm({'language': language.id,
2018-05-12 21:24:12 +00:00
'title': any_file.name,
'private': settings.PASTE['private_by_default'],
'lifetime': settings.PASTE['default_lifetime'],
'content': any_file.read().decode()
}, instance=paste)
else:
form = PasteForm(request.POST, instance=paste)
2013-04-04 17:37:30 +00:00
if not form.is_valid():
data['form'] = form
return render(request, 'paste/index.html', data)
form.save() # Some logic added to overrided method, see forms.py
location = request.build_absolute_uri(
2018-05-12 21:23:57 +00:00
reverse('short_paste', kwargs={'slug': paste.slug}))
return HttpResponseRedirect(location, content=location + "\n",
content_type='text/plain')
2018-05-07 20:52:15 +00:00
data['form'] = PasteForm(initial={
'private': settings.PASTE['private_by_default'],
'lifetime': settings.PASTE['default_lifetime'],
2018-05-13 14:39:34 +00:00
'language': Language.by_name(settings.PASTE['default_language']).id})
2018-05-12 22:35:34 +00:00
data['absolute_index_url'] = request.build_absolute_uri(reverse('index'))
2013-04-04 17:37:30 +00:00
return render(request, 'paste/index.html', data)
2018-05-06 22:56:42 +00:00
def show(request, slug, renderer='pygments'):
2013-04-04 17:37:30 +00:00
"""Display paste."""
# Fetching object
paste = get_object_or_404(Paste, slug=slug)
data = {'title': paste.title,'slug': slug}
# Handling expiration
if paste.is_expired():
return render(request, 'paste/expired.html')
2018-05-06 21:19:49 +00:00
# Handling passwords
2013-04-04 17:37:30 +00:00
if paste.password:
if 'password' in request.POST:
password = request.POST['password']
elif 'password' in request.COOKIES:
password = request.COOKIES['password']
else:
password = None
if not paste.pwd_match(password):
return render(request, 'paste/locked.html', data)
# Before rendering actions
paste.incr_viewcount()
# Handling rendering modes
2018-05-07 20:52:15 +00:00
if not renderer or renderer not in settings.PASTE['enabled_renderers']:
renderer = settings.PASTE['default_renderer']
2013-04-04 17:37:30 +00:00
data['current_renderer'] = renderer
2018-05-07 20:52:15 +00:00
data['renderers'] = settings.PASTE['enabled_renderers']
2013-04-04 17:37:30 +00:00
render_method = getattr(renderers, 'render_%s' % renderer)
2018-05-07 21:15:23 +00:00
response = render_method(request, paste, data)
2013-04-04 17:37:30 +00:00
# Responding
if 'password' in request.POST:
response.set_cookie('password', request.POST['password'])
return response
def history(request):
"""Display last 25 public non-expired pastes."""
pastes = Paste.objects.filter(private=False, expired=False).order_by('-pk')[:25]
2018-05-07 20:52:15 +00:00
data = {'pastes': pastes, 'menu': 'history', 'default_renderer': settings.PASTE['default_renderer']}
2013-04-04 17:37:30 +00:00
return render(request, 'paste/history.html', data)