admin: add list of all tokens
This commit is contained in:
parent
13084562c5
commit
62c20b6e67
|
@ -122,6 +122,12 @@
|
||||||
{% trans 'Certificates' %}
|
{% trans 'Certificates' %}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="pf-c-nav__item">
|
||||||
|
<a href="{% url 'passbook_admin:tokens' %}"
|
||||||
|
class="pf-c-nav__link {% is_active 'passbook_admin:tokens' 'passbook_admin:token-delete' %}">
|
||||||
|
{% trans 'Tokens' %}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
<li class="pf-c-nav__item">
|
<li class="pf-c-nav__item">
|
||||||
<a href="{% url 'passbook_admin:users' %}"
|
<a href="{% url 'passbook_admin:users' %}"
|
||||||
class="pf-c-nav__link {% is_active 'passbook_admin:users' 'passbook_admin:user-update' 'passbook_admin:user-delete' %}">
|
class="pf-c-nav__link {% is_active 'passbook_admin:users' 'passbook_admin:user-update' 'passbook_admin:user-delete' %}">
|
||||||
|
|
83
passbook/admin/templates/administration/token/list.html
Normal file
83
passbook/admin/templates/administration/token/list.html
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
{% extends "administration/base.html" %}
|
||||||
|
|
||||||
|
{% load i18n %}
|
||||||
|
{% load passbook_utils %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<section class="pf-c-page__main-section pf-m-light">
|
||||||
|
<div class="pf-c-content">
|
||||||
|
<h1>
|
||||||
|
<i class="fas fa-key"></i>
|
||||||
|
{% trans 'Tokens' %}
|
||||||
|
</h1>
|
||||||
|
<p>{% trans "Tokens are used throughout passbook for Email validation stages, Recovery keys and API access." %}</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section class="pf-c-page__main-section pf-m-no-padding-mobile">
|
||||||
|
<div class="pf-c-card">
|
||||||
|
{% if object_list %}
|
||||||
|
<div class="pf-c-toolbar">
|
||||||
|
<div class="pf-c-toolbar__content">
|
||||||
|
{% include 'partials/pagination.html' %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<table class="pf-c-table pf-m-compact pf-m-grid-xl" role="grid">
|
||||||
|
<thead>
|
||||||
|
<tr role="row">
|
||||||
|
<th role="columnheader" scope="col">{% trans 'Token' %}</th>
|
||||||
|
<th role="columnheader" scope="col">{% trans 'User' %}</th>
|
||||||
|
<th role="columnheader" scope="col">{% trans 'Expires?' %}</th>
|
||||||
|
<th role="columnheader" scope="col">{% trans 'Expiry Date' %}</th>
|
||||||
|
<th role="cell"></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody role="rowgroup">
|
||||||
|
{% for token in object_list %}
|
||||||
|
<tr role="row">
|
||||||
|
<th role="columnheader">
|
||||||
|
<div>
|
||||||
|
<div>{{ token.pk }}</div>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<td role="cell">
|
||||||
|
<span>
|
||||||
|
{{ token.user }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td role="cell">
|
||||||
|
<span>
|
||||||
|
{{ token.expiring|yesno:"Yes,No" }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td role="cell">
|
||||||
|
<span>
|
||||||
|
{{ token.expires }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a class="pf-c-button pf-m-danger" href="{% url 'passbook_admin:token-delete' pk=token.pk %}?back={{ request.get_full_path }}">{% trans 'Delete' %}</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<div class="pf-c-toolbar" id="page-layout-table-simple-toolbar-bottom">
|
||||||
|
{% include 'partials/pagination.html' %}
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<div class="pf-c-empty-state">
|
||||||
|
<div class="pf-c-empty-state__content">
|
||||||
|
<i class="fas fa-cubes pf-c-empty-state__icon" aria-hidden="true"></i>
|
||||||
|
<h1 class="pf-c-title pf-m-lg">
|
||||||
|
{% trans 'No Applications.' %}
|
||||||
|
</h1>
|
||||||
|
<div class="pf-c-empty-state__body">
|
||||||
|
{% trans 'Currently no applications exist. Click the button below to create one.' %}
|
||||||
|
</div>
|
||||||
|
<a href="{% url 'passbook_admin:application-create' %}?back={{ request.get_full_path }}" class="pf-c-button pf-m-primary" type="button">{% trans 'Create' %}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
{% endblock %}
|
|
@ -17,6 +17,7 @@ from passbook.admin.views import (
|
||||||
stages_bindings,
|
stages_bindings,
|
||||||
stages_invitations,
|
stages_invitations,
|
||||||
stages_prompts,
|
stages_prompts,
|
||||||
|
tokens,
|
||||||
users,
|
users,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -41,6 +42,13 @@ urlpatterns = [
|
||||||
applications.ApplicationDeleteView.as_view(),
|
applications.ApplicationDeleteView.as_view(),
|
||||||
name="application-delete",
|
name="application-delete",
|
||||||
),
|
),
|
||||||
|
# Tokens
|
||||||
|
path("tokens/", tokens.TokenListView.as_view(), name="tokens"),
|
||||||
|
path(
|
||||||
|
"tokens/<uuid:pk>/delete/",
|
||||||
|
tokens.TokenDeleteView.as_view(),
|
||||||
|
name="token-delete",
|
||||||
|
),
|
||||||
# Sources
|
# Sources
|
||||||
path("sources/", sources.SourceListView.as_view(), name="sources"),
|
path("sources/", sources.SourceListView.as_view(), name="sources"),
|
||||||
path("sources/create/", sources.SourceCreateView.as_view(), name="source-create"),
|
path("sources/create/", sources.SourceCreateView.as_view(), name="source-create"),
|
||||||
|
|
|
@ -24,9 +24,6 @@ class ApplicationListView(LoginRequiredMixin, PermissionListMixin, ListView):
|
||||||
paginate_by = 40
|
paginate_by = 40
|
||||||
template_name = "administration/application/list.html"
|
template_name = "administration/application/list.html"
|
||||||
|
|
||||||
def get_queryset(self):
|
|
||||||
return super().get_queryset().select_subclasses()
|
|
||||||
|
|
||||||
|
|
||||||
class ApplicationCreateView(
|
class ApplicationCreateView(
|
||||||
SuccessMessageMixin,
|
SuccessMessageMixin,
|
||||||
|
|
37
passbook/admin/views/tokens.py
Normal file
37
passbook/admin/views/tokens.py
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
"""passbook Token administration"""
|
||||||
|
from django.contrib import messages
|
||||||
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
|
from django.contrib.messages.views import SuccessMessageMixin
|
||||||
|
from django.urls import reverse_lazy
|
||||||
|
from django.utils.translation import ugettext as _
|
||||||
|
from django.views.generic import DeleteView, ListView
|
||||||
|
from guardian.mixins import PermissionListMixin, PermissionRequiredMixin
|
||||||
|
|
||||||
|
from passbook.core.models import Token
|
||||||
|
|
||||||
|
|
||||||
|
class TokenListView(LoginRequiredMixin, PermissionListMixin, ListView):
|
||||||
|
"""Show list of all tokens"""
|
||||||
|
|
||||||
|
model = Token
|
||||||
|
permission_required = "passbook_core.view_token"
|
||||||
|
ordering = "expires"
|
||||||
|
paginate_by = 40
|
||||||
|
template_name = "administration/token/list.html"
|
||||||
|
|
||||||
|
|
||||||
|
class TokenDeleteView(
|
||||||
|
SuccessMessageMixin, LoginRequiredMixin, PermissionRequiredMixin, DeleteView
|
||||||
|
):
|
||||||
|
"""Delete token"""
|
||||||
|
|
||||||
|
model = Token
|
||||||
|
permission_required = "passbook_core.delete_token"
|
||||||
|
|
||||||
|
template_name = "generic/delete.html"
|
||||||
|
success_url = reverse_lazy("passbook_admin:tokens")
|
||||||
|
success_message = _("Successfully deleted Token")
|
||||||
|
|
||||||
|
def delete(self, request, *args, **kwargs):
|
||||||
|
messages.success(self.request, self.success_message)
|
||||||
|
return super().delete(request, *args, **kwargs)
|
|
@ -112,8 +112,6 @@ class Application(PolicyBindingModel):
|
||||||
meta_description = models.TextField(default="", blank=True)
|
meta_description = models.TextField(default="", blank=True)
|
||||||
meta_publisher = models.TextField(default="", blank=True)
|
meta_publisher = models.TextField(default="", blank=True)
|
||||||
|
|
||||||
objects = InheritanceManager()
|
|
||||||
|
|
||||||
def get_provider(self) -> Optional[Provider]:
|
def get_provider(self) -> Optional[Provider]:
|
||||||
"""Get casted provider instance"""
|
"""Get casted provider instance"""
|
||||||
if not self.provider:
|
if not self.provider:
|
||||||
|
|
Reference in a new issue