Skip to content

Commit 6e32e0a

Browse files
committed
Replace user_exists api method with slightly different is_unique method; Implement signup api endpoint; Extend signup form
1 parent 2d78711 commit 6e32e0a

File tree

3 files changed

+124
-28
lines changed

3 files changed

+124
-28
lines changed

api.py

+100-26
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,19 @@ class Meta:
8383

8484

8585
class PersonResource(ModelResource):
86-
user = fields.ForeignKey(UserResource, 'user')
86+
user = fields.ForeignKey(UserResource, 'user', blank=True, null=True)
8787
# teams = fields.ManyToManyField(TeamResource, 'teams')
8888

8989
class Meta:
9090
queryset = Person.objects.all()
9191
authorization = Authorization()
92-
authentication = ApiKeyAuthentication()
92+
authentication = Authentication()
9393
excludes = ['activation_key', 'key_expires']
94+
filtering = {
95+
'user': ALL_WITH_RELATIONS,
96+
'first_name': ['exact'],
97+
'last_name': ['exact']
98+
}
9499

95100

96101
class GameTypeResource(ModelResource):
@@ -155,6 +160,58 @@ class Meta:
155160
"""
156161

157162

163+
def sign_up(request):
164+
form = SignUpForm(request.POST)
165+
if form.is_valid():
166+
username = form.cleaned_data['username']
167+
password = form.cleaned_data['password']
168+
email = form.cleaned_data['email']
169+
gender = form.cleaned_data['gender']
170+
first_name = form.cleaned_data['first_name']
171+
last_name = form.cleaned_data['last_name']
172+
pass_number = form.cleaned_data['pass_number']
173+
address = form.cleaned_data['address']
174+
city = form.cleaned_data['city']
175+
zip_code = form.cleaned_data['zip_code']
176+
mobile_number = form.cleaned_data['mobile_number']
177+
178+
user = User.objects.create(username=username, password=password, email=email)
179+
180+
profile = form.cleaned_data['profile'] or Person.objects.create(user=user)
181+
profile.first_name = first_name
182+
profile.last_name = last_name
183+
profile.gender = gender
184+
profile.pass_number = pass_number
185+
profile.address = address
186+
profile.city = city
187+
profile.zip_code = zip_code
188+
profile.mobile_number = mobile_number
189+
profile.save()
190+
191+
# Build the activation key
192+
salt = sha.new(str(random())).hexdigest()[:5]
193+
activation_key = sha.new(salt + user.username).hexdigest()
194+
key_expires = datetime.datetime.now(pytz.utc) + datetime.timedelta(2)
195+
196+
# User is unactive until visiting activation link
197+
user.is_active = False
198+
user_profile.activation_key = activation_key
199+
user_profile.key_expires = key_expires
200+
activation_link = 'http://127.0.0.1/activate/' + activation_key
201+
202+
user.save()
203+
user_profile.save()
204+
205+
from django.core.mail import send_mail
206+
subject = _('Welcome to ScoreIt!')
207+
message = _('To activate, please click the following link:\n' + activation_link)
208+
sender = _('noreply@score-it.de')
209+
recipients = [email]
210+
send_mail(subject, message, sender, recipients)
211+
212+
return HttpResponse()
213+
214+
158215
def validate_user(request):
159216
"""
160217
Checks a user's basic auth credentials and, if valid, returns the users data
@@ -199,30 +256,47 @@ def validate_user(request):
199256
return HttpResponse(person_resource.serialize(None, bundle, 'application/json'))
200257

201258

202-
def user_exists(request):
203-
username = request.GET['username']
204-
email = request.GET['email']
205-
username_exists = True
206-
email_exists = True
207-
208-
try:
209-
User.objects.get(username=username)
210-
except User.DoesNotExist:
211-
username_exists = False
212-
except User.MultipleObjectsReturned:
213-
email_exists = True
214-
215-
try:
216-
User.objects.get(email=email)
217-
except User.DoesNotExist:
218-
email_exists = False
219-
except User.MultipleObjectsReturned:
220-
email_exists = True
221-
222-
data = {
223-
'username': username_exists,
224-
'email': email_exists
225-
}
259+
def is_unique(request):
260+
data = {}
261+
262+
if 'user_name' in request.GET:
263+
user_name = request.GET['user_name']
264+
265+
try:
266+
User.objects.get(username=user_name)
267+
unique = False
268+
except User.DoesNotExist:
269+
unique = True
270+
except User.MultipleObjectsReturned:
271+
unique = False
272+
273+
data['user_name'] = unique
274+
275+
if 'email' in request.GET:
276+
email = request.GET['email']
277+
278+
try:
279+
User.objects.get(email=email)
280+
unique = False
281+
except User.DoesNotExist:
282+
unique = True
283+
except User.MultipleObjectsReturned:
284+
unique = False
285+
286+
data['email'] = unique
287+
288+
if 'pass_number' in request.GET:
289+
pass_number = request.GET['pass_number']
290+
291+
try:
292+
Person.objects.get(pass_number=pass_number)
293+
unique = False
294+
except Person.DoesNotExist:
295+
unique = True
296+
except Person.MultipleObjectsReturned:
297+
unique = False
298+
299+
data['pass_number'] = unique
226300

227301
serializer = Serializer()
228302

forms.py

+23-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django import forms
22
from django.utils.translation import ugettext as _
33
from django.contrib.auth.models import User
4+
from handball.models import Person
45

56

67
class SignUpForm(forms.Form):
@@ -9,7 +10,19 @@ class SignUpForm(forms.Form):
910
password = forms.CharField(widget=forms.PasswordInput,
1011
label=_('Password'), required=True)
1112
password_repeat = forms.CharField(widget=forms.PasswordInput,
12-
label=_('Repeat password'), required=True)
13+
label=_('Repeat Password'), required=True)
14+
15+
gender = forms.ChoiceField(choices=(('male', _('male')), ('female', _('female'))))
16+
first_name = forms.CharField(label=_('First Name'), required=True)
17+
last_name = forms.CharField(label=_('Last Name'), required=True)
18+
pass_number = forms.CharField(label=_('Pass Number'))
19+
address = forms.CharField(label=_('Address'))
20+
city = forms.CharField(label=_('City'))
21+
zip_code = forms.CharField(label=_('Zip Code'))
22+
mobile_number = forms.CharField(label=_('Mobile Number'))
23+
24+
profile = forms.ModelChoiceField(required=False,
25+
queryset=Person.objects.filter(first_name=first_name).filter(last_name=last_name).filter(user__isnull=True))
1326

1427
def clean_username(self):
1528
data = self.cleaned_data['username']
@@ -28,6 +41,15 @@ def clean_email(self):
2841
raise forms.ValidationError(
2942
_('A user with this email is already registered.'))
3043

44+
def clean_pass_number(self):
45+
data = self.cleaned_data['pass_number']
46+
try:
47+
Person.objects.get(pass_number=data)
48+
except Person.DoesNotExist:
49+
return data
50+
raise forms.ValidationError(
51+
_('A player with this pass number is already registered.'))
52+
3153
def clean(self):
3254
cleaned_data = super(SignUpForm, self).clean()
3355
password = cleaned_data.get('password')

urls.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,6 @@
2424
# Non-resource api endpoints
2525
urlpatterns += patterns('handball.api',
2626
(r'^api/v1/auth/validate/$', 'validate_user'),
27-
(r'^api/v1/auth/exists/$', 'user_exists')
27+
(r'^api/v1/auth/unique/$', 'is_unique')
2828
#(r'^api/v1/auth/signup/$', 'sign_up')
2929
)

0 commit comments

Comments
 (0)