Get editing working
[txt.house] / txt_house / views.py
1 import base64
2 import secrets
3
4 from django.http import HttpResponse, Http404
5 from django.shortcuts import get_object_or_404, render
6
7 from . import models
8
9 def index(request):
10     return render(
11         request,
12         'index.html',
13     )
14
15 def create(request):
16     if request.method != 'POST':
17         raise Http404()
18
19     text = request.POST.get('text')
20
21     tf = models.TextFile(text=text, edit_key=secrets.token_urlsafe())
22     tf.save()
23
24     return render(
25         request,
26         'edit.html',
27         {
28             'text_file': tf,
29             'text': tf.text,
30             'edit_key': tf.edit_key,
31         },
32     )
33
34 def text_file(request, pk):
35     if request.method != 'GET':
36         raise Http404()
37
38     pk_int = int.from_bytes(base64.urlsafe_b64decode(pk), 'big')
39
40     tf = get_object_or_404(models.TextFile, pk=pk_int)
41
42     if request.GET.get('raw'):
43         return HttpResponse(tf.text, content_type='text/plain')
44
45     font = request.GET.get('font', 'sans')
46
47     return render(
48         request,
49         'text_file.html',
50         {
51             'text_file': tf,
52             'font': font,
53             'text': tf.text.strip(),
54         },
55     )
56
57 def edit(request, pk):
58     pk_int = int.from_bytes(base64.urlsafe_b64decode(pk), 'big')
59
60     tf = get_object_or_404(models.TextFile, pk=pk_int)
61
62     context = {
63         'text_file': tf,
64     }
65
66     if request.method == 'POST':
67         edit_key = request.POST.get('edit_key','')
68         text = request.POST.get('text','')
69
70         context['text'] = text
71
72         if secrets.compare_digest(edit_key, tf.edit_key):
73             context['edit_key'] = edit_key
74             tf.text = text
75             tf.save()
76
77         else:
78             context['incorrect_key'] = True
79
80     elif request.method == 'GET':
81         context['text'] = tf.text
82
83     return render(
84         request,
85         'edit.html',
86         context,
87     )