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