diff --git a/archivebox/config/__init__.py b/archivebox/config/__init__.py index 3fa5e090..af69e94d 100644 --- a/archivebox/config/__init__.py +++ b/archivebox/config/__init__.py @@ -69,6 +69,7 @@ CONFIG_DEFAULTS: Dict[str, ConfigDefaultDict] = { 'DEBUG': {'type': bool, 'default': False}, 'PUBLIC_INDEX': {'type': bool, 'default': True}, 'PUBLIC_SNAPSHOTS': {'type': bool, 'default': True}, + 'PUBLIC_ADD_VIEW': {'type': bool, 'default': False}, 'FOOTER_INFO': {'type': str, 'default': 'Content is hosted for personal archiving purposes only. Contact server owner for any takedown requests.'}, 'ACTIVE_THEME': {'type': str, 'default': 'default'}, }, diff --git a/archivebox/core/urls.py b/archivebox/core/urls.py index 394bbbd0..a078ed94 100644 --- a/archivebox/core/urls.py +++ b/archivebox/core/urls.py @@ -5,7 +5,7 @@ from django.views import static from django.conf import settings from django.views.generic.base import RedirectView -from core.views import MainIndex, OldIndex, LinkDetails, PublicArchiveView, SearchResultsView +from core.views import MainIndex, OldIndex, LinkDetails, PublicArchiveView, SearchResultsView, add_view # print('DEBUG', settings.DEBUG) @@ -18,7 +18,7 @@ urlpatterns = [ path('archive/', RedirectView.as_view(url='/')), path('archive/', LinkDetails.as_view(), name='LinkAssets'), - path('add/', RedirectView.as_view(url='/admin/core/snapshot/add/')), + path('add/', add_view), path('accounts/login/', RedirectView.as_view(url='/admin/login/')), path('accounts/logout/', RedirectView.as_view(url='/admin/logout/')), diff --git a/archivebox/core/views.py b/archivebox/core/views.py index 3d349a0f..c7a0890f 100644 --- a/archivebox/core/views.py +++ b/archivebox/core/views.py @@ -1,5 +1,8 @@ __package__ = 'archivebox.core' +from io import StringIO +from contextlib import redirect_stdout + from django.shortcuts import render, redirect from django.http import HttpResponse @@ -11,6 +14,8 @@ from django_datatables_view.base_datatable_view import BaseDatatableView from core.models import Snapshot from core.utils import get_icons +from core.forms import AddLinkForm + from ..index import load_main_index, load_main_index_meta @@ -20,8 +25,10 @@ from ..config import ( FOOTER_INFO, PUBLIC_INDEX, PUBLIC_SNAPSHOTS, + PUBLIC_ADD_VIEW ) -from ..util import base_url +from main import add +from ..util import base_url, ansi_to_html class MainIndex(View): @@ -133,4 +140,39 @@ class SearchResultsView(PublicArchiveView): results = Snapshot.objects.filter(title__icontains=query) for snapshot in results: snapshot.icons = get_icons(snapshot) - return results \ No newline at end of file + return results + +def add_view(request): + if PUBLIC_ADD_VIEW or request.user.is_authenticated: + context = { + 'title': 'Add URLs', + } + if request.method == 'GET': + context['form'] = AddLinkForm() + + elif request.method == 'POST': + form = AddLinkForm(request.POST) + if form.is_valid(): + url = form.cleaned_data["url"] + print(f'[+] Adding URL: {url}') + depth = 0 if form.cleaned_data["depth"] == "0" else 1 + input_kwargs = { + "urls": url, + "depth": depth, + "update_all": False, + "out_dir": OUTPUT_DIR, + } + add_stdout = StringIO() + with redirect_stdout(add_stdout): + add(**input_kwargs) + print(add_stdout.getvalue()) + + context.update({ + "stdout": ansi_to_html(add_stdout.getvalue().strip()), + "form": AddLinkForm() + }) + else: + context["form"] = form + return render(template_name='add_links.html', request=request, context=context) + else: + return redirect(f'/admin/login/?next={request.path}') \ No newline at end of file