make archivebox server work for urls, hashes, and timestamps

This commit is contained in:
Nick Sweeting 2019-04-30 23:13:21 -04:00
parent 95007d9137
commit d26f87efef
4 changed files with 79 additions and 24 deletions

View file

@ -1,9 +1,15 @@
from django.shortcuts import render
__package__ = 'archivebox.core'
from django.views import View
from django.shortcuts import render, redirect
from .index import load_main_index, load_main_index_meta
from .config import OUTPUT_DIR
from django.http import HttpResponse
from django.views import View, static
from core.models import Page
from ..index import load_main_index, load_main_index_meta
from ..config import OUTPUT_DIR, VERSION, FOOTER_INFO
from ..util import base_url
class MainIndex(View):
@ -17,6 +23,8 @@ class MainIndex(View):
'updated': meta_info['updated'],
'num_links': meta_info['num_links'],
'links': all_links,
'VERSION': VERSION,
'FOOTER_INFO': FOOTER_INFO,
}
return render(template_name=self.template, request=request, context=context)
@ -41,7 +49,45 @@ class AddLinks(View):
class LinkDetails(View):
template = 'link_details.html'
def get(self, request, path):
# missing trailing slash -> redirect to index
if '/' not in path:
return redirect(f'{path}/index.html')
def get(self, request):
return render(template_name=self.template, request=request, context={})
try:
slug, archivefile = path.split('/', 1)
except (IndexError, ValueError):
slug, archivefile = path.split('/', 1)[0], 'index.html'
all_pages = list(Page.objects.all())
# slug is a timestamp
by_ts = {page.timestamp: page for page in all_pages}
try:
return static.serve(request, archivefile, by_ts[slug].link_dir, show_indexes=True)
except KeyError:
pass
# slug is a hash
by_hash = {page.url_hash: page for page in all_pages}
try:
timestamp = by_hash[slug].timestamp
return redirect(f'/archive/{timestamp}/{archivefile}')
except KeyError:
pass
# slug is a URL
by_url = {page.base_url: page for page in all_pages}
try:
# TODO: add multiple snapshot support by showing index of all snapshots
# for given url instead of redirecting to timestamp index
timestamp = by_url[base_url(path)].timestamp
return redirect(f'/archive/{timestamp}/index.html')
except KeyError:
pass
return HttpResponse(
'No archived link matches the given timestamp or hash.',
content_type="text/plain",
status=404,
)