a Django-based indieweb.org site https://00dani.me/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.1 KiB

from django.http import HttpResponse
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 urllib.parse import urljoin
from entries.jobs import ping_hub, send_mentions
from entries.models import Cat, Entry
from entries.kinds import Article, Note, Reply, Like, Repost
from lemoncurry import utils
from lemonauth import tokens
@method_decorator(csrf_exempt, name='dispatch')
class MicropubView(View):
def post(self, request):
token = tokens.auth(request)
if hasattr(token, 'content'):
return token
post = request.POST
if post.get('h') != 'entry':
return utils.bad_req('only h=entry supported')
entry = Entry(author=token.user)
kind = Note
if 'name' in post:
entry.name = post['name']
kind = Article
if 'content' in post:
entry.content = post['content']
if 'in-reply-to' in post:
entry.in_reply_to = post['in-reply-to']
kind = Reply
if 'like-of' in post:
entry.like_of = post['like-of']
kind = Like
if 'repost-of' in post:
entry.repost_of = post['repost-of']
kind = Repost
cats = [
Cat.objects.from_name(c) for c in
post.getlist('category') + post.getlist('category[]')
entry.kind = kind.id
entry.cats = cats
base = utils.origin(request)
perma = urljoin(base, entry.url)
others = [urljoin(base, url) for url in (
reverse('entries:' + kind.index),
reverse('entries:' + kind.atom),
reverse('entries:' + kind.rss),
)] + [urljoin(base, cat.url) for cat in cats]
ping_hub.delay(perma, *others)
res = HttpResponse(status=201)
res['Location'] = perma
return res
micropub = MicropubView.as_view()