浏览代码

refactor: Change View to FormView

Cristian 5 年之前
父节点
当前提交
bc116c25f8
共有 3 个文件被更改,包括 99 次插入76 次删除
  1. 36 36
      archivebox/core/views.py
  2. 1 1
      archivebox/themes/default/add_links.html
  3. 62 39
      archivebox/themes/default/static/add.css

+ 36 - 36
archivebox/core/views.py

@@ -9,7 +9,8 @@ from django.http import HttpResponse
 from django.db.models import Q
 from django.views import View, static
 from django.views.generic.list import ListView
-from django.views import View
+from django.views.generic import FormView
+from django.contrib.auth.mixins import UserPassesTestMixin
 
 from core.models import Snapshot
 from core.utils import get_icons
@@ -115,38 +116,37 @@ class PublicArchiveView(ListView):
             return redirect(f'/admin/login/?next={self.request.path}')
 
 
-class AddView(View):
-    extra_context = {'title': 'Add URLs'}
-
-    def get(self, request, *args, **kwargs):
-        if PUBLIC_ADD_VIEW or self.request.user.is_authenticated:
-            self.extra_context['form'] = AddLinkForm()
-            return render(template_name='add_links.html', request=request, context=self.extra_context)
-        else:
-            return redirect(f'/admin/login/?next={request.path}')
-
-    def post(self, request, *args, **kwargs):
-        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())
-
-            self.extra_context.update({
-                "stdout": ansi_to_html(add_stdout.getvalue().strip()),
-                "form": AddLinkForm()
-            })
-        else:
-            self.extra_context["form"] = form
-        
-        return render(template_name='add_links.html', request=request, context=self.extra_context)
+class AddView(UserPassesTestMixin, FormView):
+    template_name = "add_links.html"
+    form_class = AddLinkForm
+
+    def test_func(self):
+        return PUBLIC_ADD_VIEW or self.request.user.is_authenticated
+
+    def get_context_data(self, *args, **kwargs):
+        context = super().get_context_data(*args, **kwargs)
+        context["title"]: "Add URLs"
+        return context
+
+    def form_valid(self, form):
+        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 = self.get_context_data()
+
+        context.update({
+            "stdout": ansi_to_html(add_stdout.getvalue().strip()),
+            "form": AddLinkForm()
+        })
+        return render(template_name=self.template_name, request=self.request, context=context)

+ 1 - 1
archivebox/themes/default/add_links.html

@@ -28,7 +28,7 @@
                 <a href="/add" id="submit">&nbsp; Add more URLs ➕</a>
             </center>
         {% else %}
-            <form id="add-form" action="?" method="POST" class="p-form">{% csrf_token %}
+            <form id="add-form" method="POST" class="p-form">{% csrf_token %}
                 <h1>Add new URLs to your archive</h1>
                 <br/>
                 {{ form.as_p }}

+ 62 - 39
archivebox/themes/default/static/add.css

@@ -1,39 +1,62 @@
-       .dashboard #content {
-            width: 100%;
-            margin-right: 0px;
-            margin-left: 0px;
-        }
-        #submit {
-            border: 1px solid rgba(0,0,0,0.2);
-            padding: 10px;
-            border-radius: 4px;
-            background-color: #f5dd5d;
-            color: #333;
-            font-size: 18px;
-            font-weight: 800;
-        }
-        #add-form button[role=submit]:hover {
-            background-color: #e5cd4d;
-        }
-        #add-form label {
-            display: block;
-            font-size: 16px;
-        }
-        #add-form textarea {
-            width: 100%;
-            min-height: 300px;
-        }
-        #delay-warning div {
-            border: 1px solid red;
-            border-radius: 4px;
-            margin: 10px;
-            padding: 10px;
-            font-size: 15px;
-            background-color: #F5DD5D;
-        }
-        #stdout {
-            background-color: #ded;
-            padding: 10px 10px;
-            border-radius: 4px;
-            white-space: normal;
-        }
+.dashboard #content {
+  width: 100%;
+  margin-right: 0px;
+  margin-left: 0px;
+}
+#submit {
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  padding: 10px;
+  border-radius: 4px;
+  background-color: #f5dd5d;
+  color: #333;
+  font-size: 18px;
+  font-weight: 800;
+}
+#add-form button[role="submit"]:hover {
+  background-color: #e5cd4d;
+}
+#add-form label {
+  display: block;
+  font-size: 16px;
+}
+#add-form textarea {
+  width: 100%;
+  min-height: 300px;
+}
+#delay-warning div {
+  border: 1px solid red;
+  border-radius: 4px;
+  margin: 10px;
+  padding: 10px;
+  font-size: 15px;
+  background-color: #f5dd5d;
+}
+#stdout {
+  background-color: #ded;
+  padding: 10px 10px;
+  border-radius: 4px;
+  white-space: normal;
+}
+ul#id_depth {
+  list-style-type: none;
+  padding: 0;
+}
+
+@keyframes spin {
+  0% {
+    transform: rotate(0deg);
+  }
+  100% {
+    transform: rotate(360deg);
+  }
+}
+
+.loader {
+  border: 16px solid #f3f3f3; /* Light grey */
+  border-top: 16px solid #3498db; /* Blue */
+  border-radius: 50%;
+  width: 30px;
+  height: 30px;
+  box-sizing: border-box;
+  animation: spin 2s linear infinite;
+}