Commit cb3b878c authored by Enrico Zini's avatar Enrico Zini
Browse files

Added PersonFingerprints to show and edit fingerprints

parent 62bf4506
...@@ -74,6 +74,10 @@ class VisitPersonMixin(VisitorMixin): ...@@ -74,6 +74,10 @@ class VisitPersonMixin(VisitorMixin):
Visit a person record. Adds self.person and self.vperms with the Visit a person record. Adds self.person and self.vperms with the
permissions the visitor has over the person permissions the visitor has over the person
""" """
# Define to "edit_bio" "edit_ldap" or "view_person_audit_log" to raise
# PermissionDenied if the given test on the person-visitor fails
require_vperms = None
def pre_dispatch(self): def pre_dispatch(self):
super(VisitPersonMixin, self).pre_dispatch() super(VisitPersonMixin, self).pre_dispatch()
key = self.kwargs.get("key", None) key = self.kwargs.get("key", None)
...@@ -83,6 +87,9 @@ class VisitPersonMixin(VisitorMixin): ...@@ -83,6 +87,9 @@ class VisitPersonMixin(VisitorMixin):
self.person = bmodels.Person.lookup_or_404(key) self.person = bmodels.Person.lookup_or_404(key)
self.vperms = self.person.permissions_of(self.visitor) self.vperms = self.person.permissions_of(self.visitor)
if self.require_vperms and self.require_vperms not in self.vperms.perms:
raise PermissionDenied
def get_context_data(self, **kw): def get_context_data(self, **kw):
ctx = super(VisitPersonMixin, self).get_context_data(**kw) ctx = super(VisitPersonMixin, self).get_context_data(**kw)
ctx["person"] = self.person ctx["person"] = self.person
......
{% extends "restricted/base.html" %}
{% load nm %}
{% block head_resources %}
{{block.super}}
<style type="text/css">
.errorlist { color: red; }
</style>
{% endblock %}
{% block breadcrumbs %}{{block.super}}
/ <a href="{{ person.get_absolute_url }}">{{person.lookup_key}}</a>
{% endblock %}
{% block content %}
<h1>Edit fingerprints for {{person.fullname}}</h1>
<form action="{% url 'restricted_person_fingerprints' key=person.lookup_key %}" method="post">{% csrf_token %}
{% for hidden in form.hidden_fields %} {{hidden}} {% endfor %}
{{ form.non_field_errors }}
{% for f in form.visible_fields %}
<p>{{f.label_tag}}<br>{{f}}<br><small>{{f.help_text}}</small></p>{{f.errors}}
{% endfor %}
<input type="submit" value="Add key">
</form>
<table>
<thead>
<tr>
<th>Key</th>
<th>Active</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{% for fpr in person.fprs.all %}
<tr>
<td>{{fpr.fpr}}</td>
<td>{{fpr.is_active}}</td>
<td></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
...@@ -31,6 +31,7 @@ urlpatterns = patterns('restricted.views', ...@@ -31,6 +31,7 @@ urlpatterns = patterns('restricted.views',
url(r'^amprofile(?:/(?P<key>[^/]+))?$', views.AMProfile.as_view(), name="restricted_amprofile"), url(r'^amprofile(?:/(?P<key>[^/]+))?$', views.AMProfile.as_view(), name="restricted_amprofile"),
# Edit personal info # Edit personal info
url(r'^person/(?P<key>[^/]+)$', views.Person.as_view(), name="restricted_person"), url(r'^person/(?P<key>[^/]+)$', views.Person.as_view(), name="restricted_person"),
url(r'^person/(?P<key>[^/]+)/fingerprints$', views.PersonFingerprints.as_view(), name="restricted_person_fingerprints"),
# Create new process for a person (advocate) # Create new process for a person (advocate)
url(r'^advocate/(?P<applying_for>[^/]+)/(?P<key>[^/]+)$', views.NewProcess.as_view(), name="restricted_advocate"), url(r'^advocate/(?P<applying_for>[^/]+)/(?P<key>[^/]+)$', views.NewProcess.as_view(), name="restricted_advocate"),
# Show changelogs (minechangelogs) # Show changelogs (minechangelogs)
......
...@@ -27,11 +27,13 @@ from django.utils.translation import ugettext as _ ...@@ -27,11 +27,13 @@ from django.utils.translation import ugettext as _
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.views.generic import View from django.views.generic import View
from django.views.generic.edit import FormView
from django.utils.timezone import now from django.utils.timezone import now
from django.db import transaction
import backend.models as bmodels import backend.models as bmodels
import minechangelogs.models as mmodels import minechangelogs.models as mmodels
from backend import const from backend import const
from backend.mixins import VisitorMixin, VisitorTemplateView, VisitPersonTemplateView from backend.mixins import VisitorMixin, VisitPersonMixin, VisitorTemplateView, VisitPersonTemplateView
import backend.email import backend.email
import json import json
import datetime import datetime
...@@ -564,3 +566,27 @@ class MailboxStats(VisitorTemplateView): ...@@ -564,3 +566,27 @@ class MailboxStats(VisitorTemplateView):
emails=sorted(stats["emails"].items()), emails=sorted(stats["emails"].items()),
) )
return ctx return ctx
class NewFingerprintForm(forms.ModelForm):
class Meta:
model = bmodels.Fingerprint
fields = ["fpr"]
class PersonFingerprints(VisitPersonMixin, FormView):
template_name = "restricted/person_fingerprints.html"
require_vperms = "edit_ldap"
form_class = NewFingerprintForm
# TODO: add template
@transaction.atomic
def form_valid(self, form):
fpr = form.save(commit=False)
fpr.user = self.person
fpr.is_active = True
fpr.save(audit_author=self.visitor, audit_notes="added new fingerprint")
# Ensure that only the new fingerprint is the active one
self.person.fprs.exclude(pk=fpr.pk).update(is_active=False)
return redirect("restricted_person_fingerprints", key=self.person.lookup_key)
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment