lemoncurry/entries/from_url.py

34 lines
1 KiB
Python

from urllib.parse import urlparse
from django.contrib.sites.models import Site
from django.http import HttpResponse
from django.urls import resolve, Resolver404
from micropub import error
from .models import Entry
def from_url(url: str) -> Entry:
domain = Site.objects.get_current().domain
if not url:
raise error.bad_req('url parameter required')
if '//' not in url:
url = '//' + url
parts = urlparse(url, scheme='https')
if parts.scheme not in ('http', 'https') or parts.netloc != domain:
raise error.bad_req('url does not point to this site')
try:
match = resolve(parts.path)
except Resolver404:
raise error.bad_req('url does not point to a valid page on this site')
if match.view_name != 'entries:entry':
raise error.bad_req('url does not point to an entry on this site')
try:
entry = Entry.objects.get(pk=match.kwargs['id'])
except Entry.DoesNotExist:
raise error.bad_req('url does not point to an existing entry')
return entry