1
0
Fork 0
mirror of synced 2024-06-30 20:10:35 +12:00
ArchiveBox/archivebox/core/views.py

94 lines
2.8 KiB
Python
Raw Normal View History

__package__ = 'archivebox.core'
2019-04-03 09:36:41 +13:00
from django.shortcuts import render, redirect
2019-04-17 21:42:21 +12:00
from django.http import HttpResponse
from django.views import View, static
2019-05-01 15:44:51 +12:00
from core.models import Snapshot
from ..index import load_main_index, load_main_index_meta
from ..config import OUTPUT_DIR, VERSION, FOOTER_INFO
from ..util import base_url
2019-04-17 21:42:21 +12:00
class MainIndex(View):
template = 'main_index.html'
def get(self, request):
all_links = load_main_index(out_dir=OUTPUT_DIR)
meta_info = load_main_index_meta(out_dir=OUTPUT_DIR)
context = {
'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)
class AddLinks(View):
template = 'add_links.html'
def get(self, request):
context = {}
return render(template_name=self.template, request=request, context=context)
def post(self, request):
import_path = request.POST['url']
2019-04-23 11:10:22 +12:00
2019-04-28 09:26:24 +12:00
# TODO: add the links to the index here using archivebox.main.add
print(f'Adding URL: {import_path}')
2019-04-23 11:10:22 +12:00
return render(template_name=self.template, request=request, context={})
2019-04-17 21:42:21 +12:00
class LinkDetails(View):
def get(self, request, path):
# missing trailing slash -> redirect to index
if '/' not in path:
return redirect(f'{path}/index.html')
try:
slug, archivefile = path.split('/', 1)
except (IndexError, ValueError):
slug, archivefile = path.split('/', 1)[0], 'index.html'
2019-05-01 15:44:51 +12:00
all_pages = list(Snapshot.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,
)