parent
2d643b48c6
commit
1d4be082cf
2 changed files with 39 additions and 24 deletions
@ -0,0 +1,35 @@ |
||||
from typing import Union |
||||
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.views import error |
||||
|
||||
from .models import Entry |
||||
|
||||
|
||||
def from_url(url: str) -> Union[Entry, HttpResponse]: |
||||
domain = Site.objects.get_current().domain |
||||
if not url: |
||||
return 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: |
||||
return error.bad_req('url does not point to this site') |
||||
|
||||
try: |
||||
match = resolve(parts.path) |
||||
except Resolver404: |
||||
return error.bad_req('url does not point to a valid page on this site') |
||||
|
||||
if match.view_name != 'entries:entry': |
||||
return 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: |
||||
return error.bad_req('url does not point to an existing entry') |
||||
|
||||
return entry |
Loading…
Reference in new issue