Source code for django_otp.plugins.otp_hotp.admin
from __future__ import absolute_import, division, print_function, unicode_literals
from django.conf.urls import url
from django.contrib import admin
from django.contrib.admin.sites import AlreadyRegistered
from django.core.urlresolvers import reverse
from django.http import HttpResponse
from django.template.response import TemplateResponse
from django.utils.html import format_html
from .models import HOTPDevice
[docs]class HOTPDeviceAdmin(admin.ModelAdmin):
"""
:class:`~django.contrib.admin.ModelAdmin` for
:class:`~django_otp.plugins.otp_hotp.models.HOTPDevice`.
"""
list_display = ['user', 'name', 'confirmed', 'qrcode_link']
fieldsets = [
('Identity', {
'fields': ['user', 'name', 'confirmed'],
}),
('Configuration', {
'fields': ['key', 'digits', 'tolerance'],
}),
('State', {
'fields': ['counter'],
}),
(None, {
'fields': ['qrcode_link'],
}),
]
raw_id_fields = ['user']
readonly_fields = ['qrcode_link']
radio_fields = {'digits': admin.HORIZONTAL}
def get_queryset(self, request):
queryset = super(HOTPDeviceAdmin, self).get_queryset(request)
queryset = queryset.select_related('user')
return queryset
#
# Columns
#
def qrcode_link(self, device):
try:
href = reverse('admin:otp_hotp_hotpdevice_config', kwargs={'pk': device.pk})
link = format_html('<a href="{}">qrcode</a>', href)
except Exception:
link = ''
return link
qrcode_link.short_description = "QR Code"
#
# Custom views
#
def get_urls(self):
urls = [
url(r'^(?P<pk>\d+)/config/$', self.admin_site.admin_view(self.config_view), name='otp_hotp_hotpdevice_config'),
url(r'^(?P<pk>\d+)/qrcode/$', self.admin_site.admin_view(self.qrcode_view), name='otp_hotp_hotpdevice_qrcode'),
] + super(HOTPDeviceAdmin, self).get_urls()
return urls
def config_view(self, request, pk):
device = HOTPDevice.objects.get(pk=pk)
try:
context = dict(
self.admin_site.each_context(request),
device=device,
)
except AttributeError: # Older versions don't have each_context().
context = {'device': device}
return TemplateResponse(request, 'otp_hotp/admin/config.html', context)
def qrcode_view(self, request, pk):
device = HOTPDevice.objects.get(pk=pk)
try:
import qrcode
import qrcode.image.svg
img = qrcode.make(device.config_url, image_factory=qrcode.image.svg.SvgImage)
response = HttpResponse(content_type='image/svg+xml')
img.save(response)
except ImportError:
response = HttpResponse('', status=503)
return response
try:
admin.site.register(HOTPDevice, HOTPDeviceAdmin)
except AlreadyRegistered:
# A useless exception from a double import
pass