From 8ec32b2f2d544526ab515e992069273331ed1242 Mon Sep 17 00:00:00 2001
From: Frank Sauerburger <frank@sauerburger.com>
Date: Sat, 20 Feb 2021 18:01:46 +0100
Subject: [PATCH] Implement basic pgp views

---
 pgp/forms.py                            | 10 ++++++++
 pgp/templates/pgp/publickey_detail.html |  1 +
 pgp/templates/pgp/publickey_form.html   |  9 +++++++
 pgp/templates/pgp/publickey_list.html   |  5 +++-
 pgp/urls.py                             |  3 ++-
 pgp/views.py                            | 32 +++++++++++++++++++++----
 6 files changed, 53 insertions(+), 7 deletions(-)
 create mode 100644 pgp/forms.py
 create mode 100644 pgp/templates/pgp/publickey_form.html

diff --git a/pgp/forms.py b/pgp/forms.py
new file mode 100644
index 0000000..d8c0b58
--- /dev/null
+++ b/pgp/forms.py
@@ -0,0 +1,10 @@
+
+from django import forms
+from . import models
+
+class PublicKeyForm(forms.ModelForm):
+    public = forms.BooleanField(required=False)
+
+    class Meta:
+        model = models.PublicKey
+        fields = ["email", "armor"]
diff --git a/pgp/templates/pgp/publickey_detail.html b/pgp/templates/pgp/publickey_detail.html
index 72f84cf..05e0ac3 100644
--- a/pgp/templates/pgp/publickey_detail.html
+++ b/pgp/templates/pgp/publickey_detail.html
@@ -1,5 +1,6 @@
 {% extends 'pgp/base.html' %}
 
 {% block content %}
+<h2>Public key for: {{ publickey.email }}</h2>
 <pre>{{ publickey.armor }}</pre>
 {% endblock %}
diff --git a/pgp/templates/pgp/publickey_form.html b/pgp/templates/pgp/publickey_form.html
new file mode 100644
index 0000000..45033f7
--- /dev/null
+++ b/pgp/templates/pgp/publickey_form.html
@@ -0,0 +1,9 @@
+{% extends 'pgp/base.html' %}
+
+{% block content %}
+<form method="post">
+    {% csrf_token %}
+    {{ form.as_p }}
+    <button type="submit">Save</button>
+</form>
+{% endblock %}
diff --git a/pgp/templates/pgp/publickey_list.html b/pgp/templates/pgp/publickey_list.html
index 20923e5..a7503ce 100644
--- a/pgp/templates/pgp/publickey_list.html
+++ b/pgp/templates/pgp/publickey_list.html
@@ -1,6 +1,9 @@
 {% extends 'pgp/base.html' %}
 
 {% block content %}
+{% if perms.pgp.add_publickey %}
+<a href="{% url 'publickey-create' %}">Add public key</a>
+{% endif %}
 {% if publickey_list %}
 <ul>
 {% for publickey in publickey_list %}
@@ -9,8 +12,8 @@
         {{ publickey.email }}
     </a>
   </li>
-</ul>
 {% endfor %}
+</ul>
 {% else %}
  <p>No public key has been published.</p>
 {% endif %}
diff --git a/pgp/urls.py b/pgp/urls.py
index 8ec363b..81a26b0 100644
--- a/pgp/urls.py
+++ b/pgp/urls.py
@@ -20,5 +20,6 @@ from . import views
 
 urlpatterns = [
     path("", views.PublicKeyListView.as_view(), name="publickey-list"),
-    path("<int:pk>/", views.PublicKeyDetailView.as_view(), name="publickey-detail"),
+    path("<int:pk>", views.PublicKeyDetailView.as_view(), name="publickey-detail"),
+    path("new", views.PublicKeyCreateView.as_view(), name="publickey-create"),
 ]
diff --git a/pgp/views.py b/pgp/views.py
index 7244274..88cb030 100644
--- a/pgp/views.py
+++ b/pgp/views.py
@@ -1,12 +1,34 @@
 from django.shortcuts import render
-
-from django.shortcuts import render
-from django.views.generic import DetailView, ListView
+from django.urls import reverse_lazy
+from django.views.generic import DetailView, ListView, CreateView
+from guardian.mixins import PermissionRequiredMixin, PermissionListMixin
+from guardian.shortcuts import assign_perm
+from guardian.utils import get_anonymous_user
 
 from . import models
+from . import forms
+
+class PublicKeyListView(PermissionListMixin, ListView):
+    model = models.PublicKey
+    permission_required = ['view_publickey']
 
-class PublicKeyListView(ListView):
+class PublicKeyDetailView(PermissionRequiredMixin, DetailView):
     model = models.PublicKey
+    permission_required = ['view_publickey']
 
-class PublicKeyDetailView(DetailView):
+class PublicKeyCreateView(PermissionRequiredMixin, CreateView):
+    form_class = forms.PublicKeyForm
     model = models.PublicKey
+    permission_required = ['add_publickey']
+    permission_object = None
+    success_url = reverse_lazy('publickey-list') 
+
+    def form_valid(self, form):
+        resp = super().form_valid(form)
+        assign_perm('view_publickey', self.request.user, self.object)
+        assign_perm('change_publickey', self.request.user, self.object)
+        if form.cleaned_data["public"]:
+            anonymous = get_anonymous_user()
+            assign_perm('view_publickey', anonymous, self.object)
+
+        return resp
-- 
GitLab