Skip to content

Commit 1da41c9

Browse files
Merge pull request #380 from jazzband/giovanni/admin-improvements
Rebase: Django Admin integation fix adding AuthToken #330
2 parents 20ca95a + 5f41516 commit 1da41c9

File tree

3 files changed

+56
-4
lines changed

3 files changed

+56
-4
lines changed

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ on: [push, pull_request]
44

55
jobs:
66
build:
7-
runs-on: ubuntu-20.04
7+
runs-on: ubuntu-22.04
88
strategy:
99
fail-fast: false
1010
max-parallel: 5

knox/admin.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,50 @@
1-
from django.contrib import admin
1+
from django import forms
2+
from django.contrib import admin, messages
3+
from django.contrib.auth import get_user_model
24

35
from knox import models
6+
from knox.settings import CONSTANTS
7+
8+
9+
class AuthTokenCreateForm(forms.ModelForm):
10+
11+
def __init__(self, *args, **kwargs):
12+
super(AuthTokenCreateForm, self).__init__(*args, **kwargs)
13+
self.token = None
14+
15+
class Meta:
16+
model = models.AuthToken
17+
fields = ['user', 'expiry']
18+
19+
def save(self, commit=True):
20+
obj = super(AuthTokenCreateForm, self).save(commit=False)
21+
digest, token = models.get_digest_token()
22+
obj.digest = digest
23+
obj.token_key = token[:CONSTANTS.TOKEN_KEY_LENGTH]
24+
self.token = token
25+
if commit:
26+
obj.save()
27+
obj.save_m2m()
28+
return obj
429

530

631
@admin.register(models.AuthToken)
732
class AuthTokenAdmin(admin.ModelAdmin):
33+
add_form = AuthTokenCreateForm
834
list_display = ('digest', 'user', 'created', 'expiry',)
35+
# We dont know how a custom User model looks like, but is must have a USERNAME_FIELD
36+
search_fields = ['digest', 'token_key', 'user__'+get_user_model().USERNAME_FIELD]
937
fields = ()
1038
raw_id_fields = ('user',)
39+
40+
def get_form(self, request, obj=None, **kwargs):
41+
defaults = {}
42+
if obj is None:
43+
defaults['form'] = self.add_form
44+
defaults.update(kwargs)
45+
return super(AuthTokenAdmin, self).get_form(request, obj, **defaults)
46+
47+
def save_model(self, request, obj, form, change):
48+
if not change:
49+
self.message_user(request, "TOKEN " + form.token, messages.INFO)
50+
super(AuthTokenAdmin, self).save_model(request, obj, form, change)

knox/models.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,18 @@
1212
User = settings.AUTH_USER_MODEL
1313

1414

15+
def get_expiry(expiry):
16+
if expiry is not None:
17+
expiry = timezone.now() + expiry
18+
return expiry
19+
20+
21+
def get_digest_token(prefix=knox_settings.TOKEN_PREFIX):
22+
token = prefix + crypto.create_token_string()
23+
digest = crypto.hash_token(token)
24+
return digest, token
25+
26+
1527
class AuthTokenManager(models.Manager):
1628
def create(
1729
self,
@@ -20,8 +32,8 @@ def create(
2032
prefix=knox_settings.TOKEN_PREFIX,
2133
**kwargs
2234
):
23-
token = prefix + crypto.create_token_string()
24-
digest = crypto.hash_token(token)
35+
36+
digest, token = get_digest_token(prefix)
2537
if expiry is not None:
2638
expiry = timezone.now() + expiry
2739
instance = super().create(

0 commit comments

Comments
 (0)