diff --git a/django_walletpass/admin.py b/django_walletpass/admin.py
index 36dbb36..f9a53e9 100644
--- a/django_walletpass/admin.py
+++ b/django_walletpass/admin.py
@@ -1,9 +1,9 @@
from django.contrib import admin
+from django.template import Context, Template
from django.urls import reverse
from django.utils.html import format_html
-from django.utils.safestring import mark_safe
-from django_walletpass.models import Pass, Registration, Log
+from django_walletpass.models import Log, Pass, Registration
@admin.register(Log)
@@ -20,7 +20,13 @@ class LogAdmin(admin.ModelAdmin):
"msg",
)
list_filter = ("status", "task_type", "pass_type_identifier")
- search_fields = ("pass_type_identifier", "serial_number", "device_id", "msg", "message")
+ search_fields = (
+ "pass_type_identifier",
+ "serial_number",
+ "device_id",
+ "msg",
+ "message",
+ )
readonly_fields = ("created_at", "pass_")
raw_id_fields = ("pazz",)
list_select_related = ("pazz",)
@@ -28,7 +34,8 @@ class LogAdmin(admin.ModelAdmin):
def pass_(self, obj: Log):
if obj.pazz_id:
url = reverse(
- "admin:%s_%s_change" % (obj.pazz._meta.app_label, obj.pazz._meta.model_name),
+ "admin:%s_%s_change"
+ % (obj.pazz._meta.app_label, obj.pazz._meta.model_name),
args=[obj.pazz_id],
)
return format_html(
@@ -43,22 +50,30 @@ def pass_(self, obj: Log):
@admin.register(Pass)
class PassAdmin(admin.ModelAdmin):
- list_display = ("serial_number", "updated_at", "pass_type_identifier", "wallet_pass_")
- search_fields = ("serial_number", "pass_type_identifier", "authentication_token", "data")
+ list_display = (
+ "serial_number",
+ "updated_at",
+ "pass_type_identifier",
+ "wallet_pass_",
+ )
+ search_fields = (
+ "serial_number",
+ "pass_type_identifier",
+ "authentication_token",
+ "data",
+ )
list_filter = ("pass_type_identifier", "updated_at")
date_hierarchy = "updated_at"
readonly_fields = ("wallet_pass_", "updated_at")
def wallet_pass_(self, obj: Pass):
if obj.data:
- svg_icon = ''
return format_html(
- "{icon}",
+ Template(
+ "{% load static %}"
+ ).render(Context({})),
url=obj.data.url,
title=obj.data.name,
- icon=mark_safe(svg_icon),
)
return
@@ -75,7 +90,8 @@ class RegistrationAdmin(admin.ModelAdmin):
def pass_(self, obj: Registration):
if obj.pazz_id:
url = reverse(
- "admin:%s_%s_change" % (obj.pazz._meta.app_label, obj.pazz._meta.model_name),
+ "admin:%s_%s_change"
+ % (obj.pazz._meta.app_label, obj.pazz._meta.model_name),
args=[obj.pazz_id],
)
return format_html(
diff --git a/django_walletpass/static/admin/passbook_icon.svg b/django_walletpass/static/admin/passbook_icon.svg
new file mode 100644
index 0000000..555054e
--- /dev/null
+++ b/django_walletpass/static/admin/passbook_icon.svg
@@ -0,0 +1,3 @@
+
diff --git a/django_walletpass/tests/main.py b/django_walletpass/tests/main.py
index b774f78..d5e659e 100644
--- a/django_walletpass/tests/main.py
+++ b/django_walletpass/tests/main.py
@@ -1,31 +1,64 @@
from unittest import mock
from dateutil.parser import parse
+from django.contrib import admin
from django.test import TestCase
from django.utils import timezone
+
from django_walletpass import crypto
+from django_walletpass.admin import PassAdmin
from django_walletpass.classviews import FORMAT
from django_walletpass.models import Pass, PassBuilder, Registration
from django_walletpass.settings import dwpconfig as WALLETPASS_CONF
-class ClassViewsTestCase(TestCase):
+class AdminTestCase(TestCase):
+ def test_wallet_pass(self):
+ admin_view = PassAdmin(Pass, admin.site)
+ builder = PassBuilder()
+ builder.pass_data = {
+ "formatVersion": 1,
+ "barcode": {
+ "message": "123456789",
+ "format": "PKBarcodeFormatPDF417",
+ "messageEncoding": "iso-8859-1",
+ },
+ "organizationName": "Organic Produce",
+ "description": "Organic Produce Loyalty Card",
+ "logoText": "Organic Produce",
+ "foregroundColor": "rgb(255, 255, 255)",
+ "backgroundColor": "rgb(55, 117, 50)",
+ }
+
+ builder.build()
+
+ instance = builder.write_to_model()
+ instance.save()
+
+ self.assertEqual(
+ admin_view.wallet_pass_(instance)[-48:],
+ "",
+ )
+
+class ClassViewsTestCase(TestCase):
def test_format_parse(self):
- """ ensure dateutil reads FORMAT properly """
+ """ensure dateutil reads FORMAT properly"""
now = timezone.now()
now_string = now.strftime(FORMAT)
- self.assertEqual(parse(now_string), timezone.make_naive(now).replace(microsecond=0))
+ self.assertEqual(
+ parse(now_string), timezone.make_naive(now).replace(microsecond=0)
+ )
class CryptoTestCase(TestCase):
def test_smime_sign(self):
crypto.pkcs7_sign(
- certcontent=WALLETPASS_CONF['CERT_CONTENT'],
- keycontent=WALLETPASS_CONF['KEY_CONTENT'],
- wwdr_certificate=WALLETPASS_CONF['WWDRCA_PEM_CONTENT'],
- data=b'data to be signed',
- key_password=WALLETPASS_CONF['KEY_PASSWORD'],
+ certcontent=WALLETPASS_CONF["CERT_CONTENT"],
+ keycontent=WALLETPASS_CONF["KEY_CONTENT"],
+ wwdr_certificate=WALLETPASS_CONF["WWDRCA_PEM_CONTENT"],
+ data=b"data to be signed",
+ key_password=WALLETPASS_CONF["KEY_PASSWORD"],
)
@@ -37,7 +70,7 @@ def test_build_pkpass(self):
"barcode": {
"message": "123456789",
"format": "PKBarcodeFormatPDF417",
- "messageEncoding": "iso-8859-1"
+ "messageEncoding": "iso-8859-1",
},
"organizationName": "Organic Produce",
"description": "Organic Produce Loyalty Card",
@@ -57,7 +90,7 @@ def test_build_pkpass(self):
self.assertEqual(builder.manifest_dict, builder2.manifest_dict)
self.assertEqual(builder.pass_data, builder2.pass_data)
- builder2.pass_data.update({"organizationName": 'test'})
+ builder2.pass_data.update({"organizationName": "test"})
builder2.build()
builder2.write_to_model(instance)
instance.save()