Refactor micropub into a class-based view so that it can have a GET handler implemented as well (since that's needed to query for config info and stuff)

This commit is contained in:
Danielle McLean 2017-11-09 13:55:44 +11:00
parent b47716249e
commit b8a8cd62cf
Signed by untrusted user: 00dani
GPG key ID: 5A5D2D1AFF12EEC5

View file

@ -1,8 +1,9 @@
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.http import HttpResponse from django.http import HttpResponse
from django.urls import reverse from django.urls import reverse
from django.utils.decorators import method_decorator
from django.views import View
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_POST
from urllib.parse import urljoin from urllib.parse import urljoin
from entries.jobs import ping_hub, send_mentions from entries.jobs import ping_hub, send_mentions
@ -12,45 +13,48 @@ from lemoncurry import utils
from lemonauth import tokens from lemonauth import tokens
@csrf_exempt @method_decorator(csrf_exempt, name='dispatch')
@require_POST class MicropubView(View):
def micropub(request): def post(self, request):
auth = request.META.get('HTTP_AUTHORIZATION', '').split(' ') auth = request.META.get('HTTP_AUTHORIZATION', '').split(' ')
if auth[0] != 'Bearer': if auth[0] != 'Bearer':
return utils.bad_req('only Bearer auth supported') return utils.bad_req('only Bearer auth supported')
try: try:
token = tokens.decode(auth[1]) token = tokens.decode(auth[1])
except Exception: except Exception:
return utils.forbid('invalid token') return utils.forbid('invalid token')
user = get_user_model().objects.get(pk=token['uid']) user = get_user_model().objects.get(pk=token['uid'])
post = request.POST post = request.POST
if post.get('h') != 'entry': if post.get('h') != 'entry':
return utils.bad_req('only h=entry supported') return utils.bad_req('only h=entry supported')
entry = Entry(author=user) entry = Entry(author=user)
kind = Note kind = Note
if 'name' in post: if 'name' in post:
entry.name = post['name'] entry.name = post['name']
kind = Article kind = Article
if 'content' in post: if 'content' in post:
entry.content = post['content'] entry.content = post['content']
entry.kind = kind.id entry.kind = kind.id
entry.save() entry.save()
base = utils.origin(request) base = utils.origin(request)
perma = urljoin(base, entry.url) perma = urljoin(base, entry.url)
others = (urljoin(base, url) for url in ( others = (urljoin(base, url) for url in (
reverse('home:index'), reverse('home:index'),
reverse('entries:atom'), reverse('entries:atom'),
reverse('entries:rss'), reverse('entries:rss'),
reverse('entries:' + kind.index), reverse('entries:' + kind.index),
reverse('entries:' + kind.atom), reverse('entries:' + kind.atom),
reverse('entries:' + kind.rss), reverse('entries:' + kind.rss),
)) ))
ping_hub.delay(perma, *others) ping_hub.delay(perma, *others)
send_mentions.delay(perma) send_mentions.delay(perma)
res = HttpResponse(status=201) res = HttpResponse(status=201)
res['Location'] = perma res['Location'] = perma
return res return res
micropub = MicropubView.as_view()