diff --git a/.vscode/settings.json b/.vscode/settings.json
index 707790c63..caeacfe05 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -5,6 +5,7 @@
"editor.tabSize": 2
},
"cSpell.words": [
+ "SAML",
"pyazo"
]
}
\ No newline at end of file
diff --git a/passbook/admin/templates/administration/provider/list.html b/passbook/admin/templates/administration/provider/list.html
index 02b3d3293..209d47bb6 100644
--- a/passbook/admin/templates/administration/provider/list.html
+++ b/passbook/admin/templates/administration/provider/list.html
@@ -2,6 +2,7 @@
{% load i18n %}
{% load utils %}
+{% load admin_reflection %}
{% block title %}
{% title %}
@@ -38,6 +39,10 @@
{% trans 'Edit' %}
{% trans 'Delete' %}
+ {% get_links provider as links %}
+ {% for name, href in links.items %}
+ {% trans name %}
+ {% endfor %}
|
{% endfor %}
diff --git a/passbook/admin/templates/administration/source/list.html b/passbook/admin/templates/administration/source/list.html
index 4814fe243..66128fcb2 100644
--- a/passbook/admin/templates/administration/source/list.html
+++ b/passbook/admin/templates/administration/source/list.html
@@ -2,6 +2,7 @@
{% load i18n %}
{% load utils %}
+{% load admin_reflection %}
{% block content %}
@@ -34,6 +35,10 @@
{% trans 'Edit' %}
{% trans 'Delete' %}
+ {% get_links source as links %}
+ {% for name, href in links %}
+ {% trans name %}
+ {% endfor %}
|
{% endfor %}
diff --git a/passbook/admin/templatetags/__init__.py b/passbook/admin/templatetags/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/passbook/admin/templatetags/admin_reflection.py b/passbook/admin/templatetags/admin_reflection.py
new file mode 100644
index 000000000..fbb9a4d35
--- /dev/null
+++ b/passbook/admin/templatetags/admin_reflection.py
@@ -0,0 +1,26 @@
+"""passbook admin templatetags"""
+import inspect
+from logging import getLogger
+
+from django import template
+from django.db.models import Model
+
+register = template.Library()
+LOGGER = getLogger(__name__)
+
+@register.simple_tag()
+def get_links(model_instance):
+ """Find all link_ methods on an object instance, run them and return as dict"""
+ prefix = 'link_'
+ links = {}
+
+ if not isinstance(model_instance, Model):
+ LOGGER.warning("Model %s is not instance of Model", model_instance)
+ return links
+
+ for name, method in inspect.getmembers(model_instance, predicate=inspect.ismethod):
+ if name.startswith(prefix):
+ human_name = name.replace(prefix, '').replace('_', ' ').capitalize()
+ links[human_name] = method()
+
+ return links