Skip to content

Commit ff64198

Browse files
author
Dylan Stein
committed
updates to folder structure, absolute paths, paths over urls
1 parent 8ca32f0 commit ff64198

15 files changed

+192
-76
lines changed

.gitignore

+102
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,105 @@
1+
# Byte-compiled / optimized / DLL files
2+
__pycache__/
3+
*.py[cod]
4+
*$py.class
5+
6+
# C extensions
7+
*.so
8+
9+
# Distribution / packaging
10+
.Python
11+
env/
12+
build/
13+
develop-eggs/
14+
dist/
15+
downloads/
16+
eggs/
17+
.eggs/
18+
lib/
19+
lib64/
20+
parts/
21+
sdist/
22+
var/
23+
wheels/
24+
*.egg-info/
25+
.installed.cfg
26+
*.egg
27+
28+
# PyInstaller
29+
# Usually these files are written by a python script from a template
30+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
31+
*.manifest
32+
*.spec
33+
34+
# Installer logs
35+
pip-log.txt
36+
pip-delete-this-directory.txt
37+
38+
# Unit test / coverage reports
39+
htmlcov/
40+
.tox/
41+
.coverage
42+
.coverage.*
43+
.cache
44+
nosetests.xml
45+
coverage.xml
46+
*.cover
47+
.hypothesis/
48+
49+
# Translations
50+
*.mo
51+
*.pot
52+
53+
# Django stuff:
54+
*.log
55+
local_settings.py
56+
57+
# Flask stuff:
58+
instance/
59+
.webassets-cache
60+
61+
# Scrapy stuff:
62+
.scrapy
63+
64+
# Sphinx documentation
65+
docs/_build/
66+
67+
# PyBuilder
68+
target/
69+
70+
# Jupyter Notebook
71+
.ipynb_checkpoints
72+
73+
# pyenv
74+
.python-version
75+
76+
# celery beat schedule file
77+
celerybeat-schedule
78+
79+
# SageMath parsed files
80+
*.sage.py
81+
82+
# dotenv
83+
.env
84+
85+
# virtualenv
86+
.venv
87+
venv/
88+
ENV/
89+
90+
# Spyder project settings
91+
.spyderproject
92+
.spyproject
93+
94+
# Rope project settings
95+
.ropeproject
96+
97+
# mkdocs documentation
98+
/site
99+
100+
# mypy
101+
.mypy_cache/
102+
1103
# Byte-compiled / optimized / DLL files
2104
__pycache__/
3105
*.py[cod]

.travis.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
python: '3.5'
1+
python: '3.6'
22

33
language: python
44

@@ -55,4 +55,4 @@ install:
5555
- pip install tox
5656

5757
script:
58-
- tox -e $TOX_ENV
58+
- tox -e $TOX_ENV

drfpasswordless/__version__.py

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
VERSION = (1, 1, 5)
2+
3+
__version__ = '.'.join(map(str, VERSION))

drfpasswordless/admin.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from django.contrib import admin
22
from django.urls import reverse
3-
from .models import CallbackToken
3+
from drfpasswordless.models import CallbackToken
44

55

66
class UserLinkMixin(object):

drfpasswordless/apps.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from django.apps import AppConfig
2-
2+
from django.utils.translation import gettext_lazy as _
33

44
class DrfpasswordlessConfig(AppConfig):
55
name = 'drfpasswordless'
6+
verbose = _("DRF Passwordless")
67

78
def ready(self):
8-
import drfpasswordless.signals # NOQA
9+
import drfpasswordless.signals

drfpasswordless/models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from random import randint
21
import uuid
2+
from random import randint
33
from django.db import models
44
from django.conf import settings
55

drfpasswordless/serializers.py

+16-23
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,22 @@
44
from django.core.exceptions import PermissionDenied
55
from django.core.validators import RegexValidator
66
from rest_framework import serializers
7-
from .models import CallbackToken
8-
from .settings import api_settings
9-
from .utils import authenticate_by_token, verify_user_alias, validate_token_age
7+
from drfpasswordless.models import CallbackToken
8+
from drfpasswordless.settings import api_settings
9+
from drfpasswordless.utils import authenticate_by_token, verify_user_alias, validate_token_age
1010

11-
log = logging.getLogger(__name__)
11+
logger = logging.getLogger(__name__)
1212
User = get_user_model()
1313

14-
"""
15-
Fields
16-
"""
17-
1814

1915
class TokenField(serializers.CharField):
20-
default_error_messages = {'required': _('Invalid Token'),
21-
'invalid': _('Invalid Token'),
22-
'blank': _('Invalid Token'),
23-
'max_length': _('Tokens are {max_length} digits long.'),
24-
'min_length': _('Tokens are {min_length} digits long.')}
25-
26-
27-
"""
28-
Auth Token
29-
"""
16+
default_error_messages = {
17+
'required': _('Invalid Token'),
18+
'invalid': _('Invalid Token'),
19+
'blank': _('Invalid Token'),
20+
'max_length': _('Tokens are {max_length} digits long.'),
21+
'min_length': _('Tokens are {min_length} digits long.')
22+
}
3023

3124

3225
class AbstractBaseAliasAuthenticationSerializer(serializers.Serializer):
@@ -229,25 +222,25 @@ def validate(self, attrs):
229222
# Mark this alias as verified
230223
success = verify_user_alias(user, token)
231224
if success is False:
232-
log.debug("drfpasswordless: Error verifying alias.")
225+
logger.debug("drfpasswordless: Error verifying alias.")
233226

234227
attrs['user'] = user
235228
return attrs
236229
else:
237230
msg = _('This token is invalid. Try again later.')
238-
log.debug("drfpasswordless: User token mismatch when verifying alias.")
231+
logger.debug("drfpasswordless: User token mismatch when verifying alias.")
239232

240233
except CallbackToken.DoesNotExist:
241234
msg = _('Missing authentication token.')
242-
log.debug("drfpasswordless: Tried to validate alias with bad token.")
235+
logger.debug("drfpasswordless: Tried to validate alias with bad token.")
243236
pass
244237
except User.DoesNotExist:
245238
msg = _('Missing user.')
246-
log.debug("drfpasswordless: Tried to validate alias with bad user.")
239+
logger.debug("drfpasswordless: Tried to validate alias with bad user.")
247240
pass
248241
except PermissionDenied:
249242
msg = _('Insufficient permissions.')
250-
log.debug("drfpasswordless: Permission denied while validating alias.")
243+
logger.debug("drfpasswordless: Permission denied while validating alias.")
251244
pass
252245

253246
raise serializers.ValidationError(msg)

drfpasswordless/services.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
from .utils import create_callback_token_for_user, send_email_with_callback_token, send_sms_with_callback_token
1+
from drfpasswordless.utils import (
2+
create_callback_token_for_user,
3+
send_email_with_callback_token,
4+
send_sms_with_callback_token
5+
)
26

37

48
class TokenService(object):

drfpasswordless/signals.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
from django.contrib.auth import get_user_model
33
from django.dispatch import receiver
44
from django.db.models import signals
5-
from .models import CallbackToken
6-
from .models import generate_numeric_token
7-
from .settings import api_settings
8-
from .services import TokenService
5+
from drfpasswordless.models import CallbackToken
6+
from drfpasswordless.models import generate_numeric_token
7+
from drfpasswordless.settings import api_settings
8+
from drfpasswordless.services import TokenService
99

1010
logger = logging.getLogger(__name__)
1111

drfpasswordless/urls.py

+17-14
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1-
from django.conf.urls import url
2-
from .views import (ObtainEmailCallbackToken,
3-
ObtainMobileCallbackToken,
4-
ObtainAuthTokenFromCallbackToken,
5-
VerifyAliasFromCallbackToken,
6-
ObtainEmailVerificationCallbackToken,
7-
ObtainMobileVerificationCallbackToken,
8-
)
1+
from django.urls import path
2+
from drfpasswordless.views import (
3+
ObtainEmailCallbackToken,
4+
ObtainMobileCallbackToken,
5+
ObtainAuthTokenFromCallbackToken,
6+
VerifyAliasFromCallbackToken,
7+
ObtainEmailVerificationCallbackToken,
8+
ObtainMobileVerificationCallbackToken,
9+
)
910

10-
urlpatterns = [url(r'^callback/auth/$', ObtainAuthTokenFromCallbackToken.as_view(), name='auth_callback'),
11-
url(r'^auth/email/$', ObtainEmailCallbackToken.as_view(), name='auth_email'),
12-
url(r'^auth/mobile/$', ObtainMobileCallbackToken.as_view(), name='auth_mobile'),
13-
url(r'^callback/verify/$', VerifyAliasFromCallbackToken.as_view(), name='verify_callback'),
14-
url(r'^verify/email/$', ObtainEmailVerificationCallbackToken.as_view(), name='verify_email'),
15-
url(r'^verify/mobile/$', ObtainMobileVerificationCallbackToken.as_view(), name='verify_mobile')]
11+
urlpatterns = [
12+
path('callback/auth/', ObtainAuthTokenFromCallbackToken.as_view(), name='auth_callback'),
13+
path('auth/email/', ObtainEmailCallbackToken.as_view(), name='auth_email'),
14+
path('auth/mobile/', ObtainMobileCallbackToken.as_view(), name='auth_mobile'),
15+
path('callback/verify/', VerifyAliasFromCallbackToken.as_view(), name='verify_callback'),
16+
path('verify/email/', ObtainEmailVerificationCallbackToken.as_view(), name='verify_email'),
17+
path('verify/mobile/', ObtainMobileVerificationCallbackToken.as_view(), name='verify_mobile'),
18+
]

drfpasswordless/utils.py

+14-14
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
from django.core.mail import send_mail
66
from django.template import loader
77
from django.utils import timezone
8-
from .models import CallbackToken
9-
from .settings import api_settings
8+
from drfpasswordless.models import CallbackToken
9+
from drfpasswordless.settings import api_settings
1010

1111

12-
log = logging.getLogger(__name__)
12+
logger = logging.getLogger(__name__)
1313
User = get_user_model()
1414

1515

@@ -25,11 +25,11 @@ def authenticate_by_token(callback_token):
2525
return token.user
2626

2727
except CallbackToken.DoesNotExist:
28-
log.debug("drfpasswordless: Challenged with a callback token that doesn't exist.")
28+
logger.debug("drfpasswordless: Challenged with a callback token that doesn't exist.")
2929
except User.DoesNotExist:
30-
log.debug("drfpasswordless: Authenticated user somehow doesn't exist.")
30+
logger.debug("drfpasswordless: Authenticated user somehow doesn't exist.")
3131
except PermissionDenied:
32-
log.debug("drfpasswordless: Permission denied while authenticating.")
32+
logger.debug("drfpasswordless: Permission denied while authenticating.")
3333

3434
return None
3535

@@ -133,15 +133,15 @@ def send_email_with_callback_token(user, email_token, **kwargs):
133133
html_message=html_message,)
134134

135135
else:
136-
log.debug("Failed to send token email. Missing PASSWORDLESS_EMAIL_NOREPLY_ADDRESS.")
136+
logger.debug("Failed to send token email. Missing PASSWORDLESS_EMAIL_NOREPLY_ADDRESS.")
137137
return False
138138
return True
139139

140140
except Exception as e:
141-
log.debug("Failed to send token email to user: %d."
141+
logger.debug("Failed to send token email to user: %d."
142142
"Possibly no email on user object. Email entered was %s" %
143143
(user.id, getattr(user, api_settings.PASSWORDLESS_USER_EMAIL_FIELD_NAME)))
144-
log.debug(e)
144+
logger.debug(e)
145145
return False
146146

147147

@@ -170,17 +170,17 @@ def send_sms_with_callback_token(user, mobile_token, **kwargs):
170170
)
171171
return True
172172
else:
173-
log.debug("Failed to send token sms. Missing PASSWORDLESS_MOBILE_NOREPLY_NUMBER.")
173+
logger.debug("Failed to send token sms. Missing PASSWORDLESS_MOBILE_NOREPLY_NUMBER.")
174174
return False
175175
except ImportError:
176-
log.debug("Couldn't import Twilio client. Is twilio installed?")
176+
logger.debug("Couldn't import Twilio client. Is twilio installed?")
177177
return False
178178
except KeyError:
179-
log.debug("Couldn't send SMS."
179+
logger.debug("Couldn't send SMS."
180180
"Did you set your Twilio account tokens and specify a PASSWORDLESS_MOBILE_NOREPLY_NUMBER?")
181181
except Exception as e:
182-
log.debug("Failed to send token SMS to user: %d. "
182+
logger.debug("Failed to send token SMS to user: %d. "
183183
"Possibly no mobile number on user object or the twilio package isn't set up yet. "
184184
"Number entered was %s" % (user.id, getattr(user, api_settings.PASSWORDLESS_USER_MOBILE_FIELD_NAME)))
185-
log.debug(e)
185+
logger.debug(e)
186186
return False

drfpasswordless/views.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
)
1616
from drfpasswordless.services import TokenService
1717

18-
log = logging.getLogger(__name__)
18+
logger = logging.getLogger(__name__)
1919

2020

2121
class AbstractBaseObtainCallbackToken(APIView):
@@ -146,7 +146,7 @@ def post(self, request, *args, **kwargs):
146146
# Return our key for consumption.
147147
return Response({'token': token.key}, status=status.HTTP_200_OK)
148148
else:
149-
log.error(
149+
logger.error(
150150
"Couldn't log in unknown user. Errors on serializer: %s" % (serializer.error_messages, ))
151151
return Response({'detail': 'Couldn\'t log you in. Try again later.'},
152152
status=status.HTTP_400_BAD_REQUEST)
@@ -177,7 +177,7 @@ def post(self, request, *args, **kwargs):
177177

178178
return Response({'detail': 'Alias verified.'}, status=status.HTTP_200_OK)
179179
else:
180-
log.error(
180+
logger.error(
181181
"Couldn't verify unknown user. Errors on serializer: %s" % (serializer.error_messages, ))
182182

183183
return Response({'detail': 'We couldn\'t verify this alias. Try again later.'}, status.HTTP_400_BAD_REQUEST)

requirements.txt

-8
This file was deleted.

0 commit comments

Comments
 (0)