diff --git a/pgp/forms.py b/pgp/forms.py new file mode 100644 index 0000000000000000000000000000000000000000..d8c0b58170edf154204544d6f453716affb83dc6 --- /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 72f84cf3bd4fbb35f7a24eb12dbca2b459cf355a..05e0ac330cd36ffc2688414c7fbb3242a9b521c0 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 0000000000000000000000000000000000000000..45033f7aa7d2a4420eddf8e68b91a0a4c397b170 --- /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 20923e5ce4b4eb75680c7d339fafc263c312a7ff..a7503cea8ef8a57baca9a4df1c046b3a348fc3f1 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 8ec363bc2731eca4b55179a621ba66589a3f60fd..81a26b0e586202c5779580c60db22646e2de3c47 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 7244274e413c3000783a0e1ce6d76fdea8a13fab..88cb030953bc69d0b464d2fc8bdbdb123435178c 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