label_token #8

Merged
pedro merged 2 commits from label_token into release 2025-01-30 13:02:14 +00:00
6 changed files with 118 additions and 11 deletions

View file

@ -0,0 +1,22 @@
# Generated by Django 4.2.5 on 2025-01-27 09:20
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('webhook', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='token',
name='active',
field=models.BooleanField(default=True, verbose_name='Active'),
),
migrations.AddField(
model_name='token',
name='label',
field=models.CharField(default='', max_length=250, verbose_name='Label'),
),
]

View file

@ -1,7 +1,10 @@
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _
# Create your models here. # Create your models here.
class Token(models.Model): class Token(models.Model):
token = models.UUIDField() token = models.UUIDField()
label = models.CharField(_("Label"), max_length=250, default="")
active = models.BooleanField(_("Active"), default=True)

View file

@ -1,11 +1,12 @@
import django_tables2 as tables import django_tables2 as tables
from django.utils.html import format_html from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.urls import reverse
from webhook.models import Token from webhook.models import Token
class ButtonColumn(tables.Column): class ButtonRemoveColumn(tables.Column):
attrs = { attrs = {
"a": { "a": {
"type": "button", "type": "button",
@ -25,7 +26,7 @@ class ButtonColumn(tables.Column):
class TokensTable(tables.Table): class TokensTable(tables.Table):
delete = ButtonColumn( delete = ButtonRemoveColumn(
verbose_name=_("Delete"), verbose_name=_("Delete"),
linkify={ linkify={
"viewname": "webhook:delete_token", "viewname": "webhook:delete_token",
@ -33,11 +34,19 @@ class TokensTable(tables.Table):
}, },
orderable=False orderable=False
) )
# active = tables.Column(linkify=lambda record: reverse("webhook:status_token", kwargs={"pk": record.pk}))
active = tables.Column(
linkify={
"viewname": "webhook:status_token",
"args": [tables.A("pk")]
}
)
token = tables.Column(verbose_name=_("Token"), empty_values=()) token = tables.Column(verbose_name=_("Token"), empty_values=())
label = tables.Column(verbose_name=_("Label"), empty_values=())
def render_view_user(self): # def render_view_user(self):
return format_html('<i class="bi bi-eye"></i>') # return format_html('<i class="bi bi-eye"></i>')
# def render_token(self, record): # def render_token(self, record):
# return record.get_memberships() # return record.get_memberships()
@ -63,5 +72,13 @@ class TokensTable(tables.Table):
class Meta: class Meta:
model = Token model = Token
template_name = "idhub/custom_table.html" template_name = "idhub/custom_table.html"
fields = ("token", "view_user") fields = ("token", "label", "active")
def render_active(self, value):
"""
Render icons custom based on active value
"""
if value: # if `active` is True
return format_html('<i class="bi bi-toggle-on text-primary"></i>')
else: # if `active` is False
return format_html('<i class="bi bi-toggle-off text-danger"></i>')

View file

@ -0,0 +1,34 @@
{% extends "idhub/base_admin.html" %}
{% load i18n %}
{% block content %}
<h3>
<i class="{{ icon }}"></i>
{{ subtitle }}
</h3>
{% load django_bootstrap5 %}
<form role="form" method="post">
{% csrf_token %}
{% if form.errors %}
<div class="alert alert-danger alert-icon alert-icon-border alert-dismissible" role="alert">
<div class="icon"><span class="mdi mdi-close-circle-o"></span></div>
<div class="message">
{% for field, error in form.errors.items %}
{{ error }}<br />
{% endfor %}
<button class="btn-close" type="button" data-dismiss="alert" aria-label="Close"></button>
</div>
</div>
{% endif %}
<div class="row">
<div class="col-sm-4">
{% bootstrap_form form %}
</div>
</div>
<div class="form-actions-no-box">
<a class="btn btn-grey" href="{% url 'webhook:tokens' %}">{% translate "Cancel" %}</a>
<input class="btn btn-green-admin" type="submit" name="submit" value="{% translate 'Save' %}" />
</div>
</form>
{% endblock %}

View file

@ -11,4 +11,5 @@ urlpatterns = [
path('tokens/', views.WebHookTokenView.as_view(), name='tokens'), path('tokens/', views.WebHookTokenView.as_view(), name='tokens'),
path('tokens/new', views.TokenNewView.as_view(), name='new_token'), path('tokens/new', views.TokenNewView.as_view(), name='new_token'),
path('tokens/<int:pk>/del', views.TokenDeleteView.as_view(), name='delete_token'), path('tokens/<int:pk>/del', views.TokenDeleteView.as_view(), name='delete_token'),
path('tokens/<int:pk>/status', views.TokenStatusView.as_view(), name='status_token'),
] ]

View file

@ -3,13 +3,14 @@ import json
from django.shortcuts import get_object_or_404, redirect from django.shortcuts import get_object_or_404, redirect
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from django.views.generic.edit import DeleteView from django.views.generic.edit import DeleteView, CreateView
from django.views.generic.base import View from django.views.generic.base import View
from django.core.cache import cache from django.core.cache import cache
from django.http import JsonResponse from django.http import JsonResponse
from django_tables2 import SingleTableView from django_tables2 import SingleTableView
from pyvckit.verify import verify_vp, verify_vc from pyvckit.verify import verify_vp, verify_vc
from uuid import uuid4 from uuid import uuid4
from django.urls import reverse_lazy
from idhub.mixins import AdminView from idhub.mixins import AdminView
from idhub_auth.models import User from idhub_auth.models import User
@ -30,7 +31,7 @@ def webhook_verify(request):
return JsonResponse({'error': 'Invalid or missing token'}, status=401) return JsonResponse({'error': 'Invalid or missing token'}, status=401)
token = auth_header.split(' ')[1].strip("'").strip('"') token = auth_header.split(' ')[1].strip("'").strip('"')
tk = Token.objects.filter(token=token).first() tk = Token.objects.filter(token=token, active=True).first()
if not tk: if not tk:
return JsonResponse({'error': 'Invalid or missing token'}, status=401) return JsonResponse({'error': 'Invalid or missing token'}, status=401)
@ -70,7 +71,7 @@ def webhook_issue(request):
return JsonResponse({'error': 'Invalid or missing token'}, status=401) return JsonResponse({'error': 'Invalid or missing token'}, status=401)
token = auth_header.split(' ')[1].strip("'").strip('"') token = auth_header.split(' ')[1].strip("'").strip('"')
tk = Token.objects.filter(token=token).first() tk = Token.objects.filter(token=token, active=True).first()
if not tk: if not tk:
return JsonResponse({'error': 'Invalid or missing token'}, status=401) return JsonResponse({'error': 'Invalid or missing token'}, status=401)
@ -153,10 +154,39 @@ class TokenDeleteView(AdminView, DeleteView):
return redirect('webhook:tokens') return redirect('webhook:tokens')
class TokenNewView(AdminView, View): class TokenStatusView(AdminView, DeleteView):
model = Token
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
self.check_valid_user() self.check_valid_user()
Token.objects.create(token=uuid4()) self.pk = kwargs['pk']
self.object = get_object_or_404(self.model, pk=self.pk)
if self.object.active:
self.object.active = False
else:
self.object.active = True
self.object.save()
return redirect('webhook:tokens') return redirect('webhook:tokens')
class TokenNewView(AdminView, CreateView):
title = _("Token management")
section = "Credential"
subtitle = _('New Tokens')
icon = 'bi bi-key'
title = "Token"
template_name = "new_token.html"
model = Token
fields = ("label",)
success_url = reverse_lazy('webhook:tokens')
# def get(self, request, *args, **kwargs):
# self.check_valid_user()
# Token.objects.create(token=uuid4())
# return redirect('webhook:tokens')
def form_valid(self, form):
form.instance.token = uuid4()
form.save()
return super().form_valid(form)