Skip to content

Commit fbb3490

Browse files
authored
Merge pull request encode#5188 from andreagrandi/auth-token-cmd
Add Django manage command to create a DRF user Token
2 parents 7d240a2 + d245971 commit fbb3490

File tree

4 files changed

+80
-0
lines changed

4 files changed

+80
-0
lines changed

rest_framework/authtoken/management/__init__.py

Whitespace-only changes.

rest_framework/authtoken/management/commands/__init__.py

Whitespace-only changes.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from django.contrib.auth import get_user_model
2+
from django.core.management.base import BaseCommand, CommandError
3+
from rest_framework.authtoken.models import Token
4+
5+
6+
UserModel = get_user_model()
7+
8+
9+
class Command(BaseCommand):
10+
help = 'Create DRF Token for a given user'
11+
12+
def create_user_token(self, username, reset_token):
13+
user = UserModel._default_manager.get_by_natural_key(username)
14+
15+
if reset_token:
16+
Token.objects.filter(user=user).delete()
17+
18+
token = Token.objects.get_or_create(user=user)
19+
return token[0]
20+
21+
def add_arguments(self, parser):
22+
parser.add_argument('username', type=str, nargs='+')
23+
24+
parser.add_argument(
25+
'-r',
26+
'--reset',
27+
action='store_true',
28+
dest='reset_token',
29+
default=False,
30+
help='Reset existing User token and create a new one',
31+
)
32+
33+
def handle(self, *args, **options):
34+
username = options['username']
35+
reset_token = options['reset_token']
36+
37+
try:
38+
token = self.create_user_token(username, reset_token)
39+
except UserModel.DoesNotExist:
40+
raise CommandError(
41+
'Cannot create the Token: user {0} does not exist'.format(
42+
username)
43+
)
44+
self.stdout.write(
45+
'Generated token {0} for user {1}'.format(token.key, username))

tests/test_authtoken.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
from django.test import TestCase
55

66
from rest_framework.authtoken.admin import TokenAdmin
7+
from rest_framework.authtoken.management.commands.drf_create_token import \
8+
Command as AuthTokenCommand
79
from rest_framework.authtoken.models import Token
810
from rest_framework.authtoken.serializers import AuthTokenSerializer
911
from rest_framework.exceptions import ValidationError
@@ -33,3 +35,36 @@ def test_whitespace_in_password(self):
3335
self.user.set_password(data['password'])
3436
self.user.save()
3537
assert AuthTokenSerializer(data=data).is_valid()
38+
39+
40+
class AuthTokenCommandTests(TestCase):
41+
42+
def setUp(self):
43+
self.site = site
44+
self.user = User.objects.create_user(username='test_user')
45+
46+
def test_command_create_user_token(self):
47+
token = AuthTokenCommand().create_user_token(self.user.username, False)
48+
assert token is not None
49+
token_saved = Token.objects.first()
50+
assert token.key == token_saved.key
51+
52+
def test_command_create_user_token_invalid_user(self):
53+
with pytest.raises(User.DoesNotExist):
54+
AuthTokenCommand().create_user_token('not_existing_user', False)
55+
56+
def test_command_reset_user_token(self):
57+
AuthTokenCommand().create_user_token(self.user.username, False)
58+
first_token_key = Token.objects.first().key
59+
AuthTokenCommand().create_user_token(self.user.username, True)
60+
second_token_key = Token.objects.first().key
61+
62+
assert first_token_key != second_token_key
63+
64+
def test_command_do_not_reset_user_token(self):
65+
AuthTokenCommand().create_user_token(self.user.username, False)
66+
first_token_key = Token.objects.first().key
67+
AuthTokenCommand().create_user_token(self.user.username, False)
68+
second_token_key = Token.objects.first().key
69+
70+
assert first_token_key == second_token_key

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy