Skip to content

Commit 9d6e012

Browse files
committed
Separate user profile from handball profile; move outside of handball app into new app
1 parent 09f2656 commit 9d6e012

File tree

6 files changed

+13
-329
lines changed

6 files changed

+13
-329
lines changed

api.py

+4-155
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,13 @@
1-
import sha
2-
import datetime
3-
from random import random
4-
import pytz
5-
from tastypie.resources import ModelResource, ALL, ALL_WITH_RELATIONS
1+
from tastypie.resources import ModelResource, ALL_WITH_RELATIONS
62
from tastypie import fields
73
from handball.models import *
8-
from handball.forms import SignUpForm
94
from django.contrib.auth.models import User
105
from tastypie.authorization import DjangoAuthorization, Authorization
116
from tastypie.authentication import Authentication, ApiKeyAuthentication
12-
from django.contrib.auth import authenticate
13-
from django.core.mail import send_mail
14-
from django.http import HttpResponse, HttpResponseNotFound, HttpResponseBadRequest
7+
from django.http import HttpResponse, HttpResponseBadRequest
158
from tastypie.serializers import Serializer
169
from tastypie.utils.mime import determine_format
17-
from django.utils.translation import ugettext as _
10+
from auth.api import UserResource
1811

1912

2013
class UnionResource(ModelResource):
@@ -101,16 +94,8 @@ def dehydrate(self, bundle):
10194
return bundle
10295

10396

104-
class UserResource(ModelResource):
105-
person = fields.OneToOneField('handball.api.PersonResource', 'person', full=True)
106-
107-
class Meta:
108-
queryset = User.objects.all()
109-
excludes = ['email', 'password']
110-
111-
11297
class PersonResource(ModelResource):
113-
user = fields.ForeignKey(UserResource, 'user', blank=True, null=True)
98+
user = fields.OneToOneField(UserResource, 'user', blank=True, null=True)
11499
clubs = fields.ManyToManyField(ClubResource, 'clubs')
115100
# teams = fields.ManyToManyField(TeamResource, 'teams')
116101

@@ -192,145 +177,9 @@ class Meta:
192177
"""
193178

194179

195-
def sign_up(request):
196-
form = SignUpForm(request.POST)
197-
serializer = Serializer()
198-
format = determine_format(request, serializer, default_format='application/json')
199-
200-
if form.is_valid():
201-
username = form.cleaned_data['username']
202-
password = form.cleaned_data['password']
203-
email = form.cleaned_data['email']
204-
first_name = form.cleaned_data['first_name']
205-
last_name = form.cleaned_data['last_name']
206-
# gender = form.cleaned_data['gender']
207-
# pass_number = form.cleaned_data['pass_number']
208-
# address = form.cleaned_data['address']
209-
# city = form.cleaned_data['city']
210-
# zip_code = form.cleaned_data['zip_code']
211-
# mobile_number = form.cleaned_data['mobile_number']
212-
213-
user = User.objects.create(username=username, password=password, first_name=first_name, last_name=last_name, email=email)
214-
215-
profile = form.cleaned_data['profile'] or Person.objects.create()
216-
profile.first_name = first_name
217-
profile.last_name = last_name
218-
# profile.gender = gender
219-
# profile.pass_number = pass_number
220-
# profile.address = address
221-
# profile.city = city
222-
# profile.zip_code = zip_code
223-
# profile.mobile_number = mobile_number
224-
profile.user = user
225-
226-
# Build the activation key
227-
salt = sha.new(str(random())).hexdigest()[:5]
228-
activation_key = sha.new(salt + user.username).hexdigest()
229-
key_expires = datetime.datetime.now(pytz.utc) + datetime.timedelta(2)
230-
231-
# User is unactive until visiting activation link
232-
user.is_active = False
233-
profile.activation_key = activation_key
234-
profile.key_expires = key_expires
235-
activation_link = 'http://127.0.0.1:8000/auth/activate/' + activation_key
236-
237-
user.save()
238-
profile.save()
239-
240-
subject = _('Welcome to ScoreIt!')
241-
message = _('To activate, please click the following link:\n' + activation_link)
242-
sender = _('noreply@score-it.de')
243-
recipients = [email]
244-
send_mail(subject, message, sender, recipients)
245-
246-
user_resource = UserResource()
247-
person_resource = PersonResource()
248-
249-
data = {
250-
'user': user_resource.get_resource_uri(user),
251-
'profile': person_resource.get_resource_uri(profile),
252-
'activation_key': activation_key
253-
}
254-
255-
return HttpResponse(serializer.serialize(data, format, {}))
256-
257-
else:
258-
return HttpResponseBadRequest(serializer.serialize(form.errors, format, {}))
259-
260-
261-
def validate_user(request):
262-
"""
263-
Checks a user's basic auth credentials and, if valid, returns the users data
264-
"""
265-
266-
# if not request.META.get('HTTP_AUTHORIZATION'):
267-
# return HttpResponseBadRequest('No HTTP_AUTHORIZATION header found')
268-
269-
# try:
270-
# (auth_type, data) = request.META['HTTP_AUTHORIZATION'].split()
271-
# if auth_type.lower() != 'basic':
272-
# return HttpResponseBadRequest('Wrong auth type. Use basic auth!')
273-
# user_pass = base64.b64decode(data)
274-
# except:
275-
# return HttpResponseBadRequest('Could not decode auth credentials.')
276-
277-
# bits = user_pass.split(':', 1)
278-
279-
# if len(bits) != 2:
280-
# return HttpResponseBadRequest('Could not decode auth credentials.')
281-
282-
# user = authenticate(username=bits[0], password=bits[1])
283-
284-
username = request.POST['username']
285-
password = request.POST['password']
286-
287-
if not username or not password:
288-
return HttpResponseBadRequest()
289-
290-
user = authenticate(username=username, password=password)
291-
292-
if user is None or not user.is_active:
293-
return HttpResponseNotFound('User does not exist or password incorrect.')
294-
295-
person = user.get_profile()
296-
297-
person_resource = PersonResource()
298-
bundle = person_resource.build_bundle(obj=person, request=request)
299-
person_resource.full_dehydrate(bundle)
300-
bundle.data['api_key'] = user.api_key.key
301-
302-
return HttpResponse(person_resource.serialize(None, bundle, 'application/json'))
303-
304-
305180
def is_unique(request):
306181
data = {}
307182

308-
if 'user_name' in request.GET:
309-
user_name = request.GET['user_name']
310-
311-
try:
312-
User.objects.get(username=user_name)
313-
unique = False
314-
except User.DoesNotExist:
315-
unique = True
316-
except User.MultipleObjectsReturned:
317-
unique = False
318-
319-
data['user_name'] = unique
320-
321-
if 'email' in request.GET:
322-
email = request.GET['email']
323-
324-
try:
325-
User.objects.get(email=email)
326-
unique = False
327-
except User.DoesNotExist:
328-
unique = True
329-
except User.MultipleObjectsReturned:
330-
unique = False
331-
332-
data['email'] = unique
333-
334183
if 'pass_number' in request.GET:
335184
pass_number = request.GET['pass_number']
336185

forms.py

-73
This file was deleted.

models.py

+1-12
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,9 @@
88

99

1010
class Person(models.Model):
11-
user = models.OneToOneField(User, blank=True, null=True)
11+
user = models.OneToOneField(User, blank=True, null=True, related_name='handball_profile')
1212
clubs = models.ManyToManyField('Club', related_name='members', blank=False)
1313

14-
# Fields used for user activation after signup
15-
activation_key = models.CharField(max_length=40, blank=True)
16-
key_expires = models.DateTimeField(null=True, blank=True)
17-
1814
first_name = models.CharField(max_length=50)
1915
last_name = models.CharField(max_length=50)
2016
address = models.CharField(max_length=50, blank=True)
@@ -178,12 +174,6 @@ def __unicode__(self):
178174
return self.name
179175

180176

181-
def create_user_profile(sender, instance, created, **kwargs):
182-
# Create user profile for user after creation
183-
if created:
184-
Person.objects.create(user=instance, first_name=instance.first_name, last_name=instance.last_name)
185-
186-
187177
def create_default_leagues(sender, instance, created, **kwargs):
188178
# Create defaults leagues for District after creation
189179
if created:
@@ -198,7 +188,6 @@ def set_union_by_district(sender, instance, **kwargs):
198188
if instance.district:
199189
instance.union = instance.district.union
200190

201-
# post_save.connect(create_user_profile, sender=User)
202191

203192
# Create API key for a new user
204193
post_save.connect(create_api_key, sender=User)

tests.py

+5-13
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,8 @@
1-
"""
2-
This file demonstrates writing tests using the unittest module. These will pass
3-
when you run "manage.py test".
1+
from tastypie.test import ResourceTestCase
42

5-
Replace this with more appropriate tests for your application.
6-
"""
73

8-
from django.test import TestCase
4+
class UnionResourceTest(ResourceTestCase):
5+
fixtures = ['testdump.json']
96

10-
11-
class SimpleTest(TestCase):
12-
def test_basic_addition(self):
13-
"""
14-
Tests that 1 + 1 always equals 2.
15-
"""
16-
self.assertEqual(1 + 1, 2)
7+
def test_get_list_unauthorzied(self):
8+
self.assertHttpUnauthorized(self.api_client.get('/api/v1/unions/', format='json'))

urls.py

+2-8
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,18 @@
77
v1_api.register(UnionResource())
88
v1_api.register(ClubResource())
99
v1_api.register(TeamResource())
10-
v1_api.register(UserResource())
1110
v1_api.register(PersonResource())
1211
v1_api.register(GameResource())
1312
v1_api.register(LeagueResource())
1413
v1_api.register(DistrictResource())
1514

1615
urlpatterns = patterns('handball.views',
17-
(r'^$', 'index'),
18-
(r'^auth/signup/$', 'sign_up'),
19-
(r'^auth/activate/([abcdef0123456789]+)$', 'activate'),
20-
(r'^thanks/$', 'thanks')
16+
(r'^$', 'index')
2117
)
2218

2319
urlpatterns += patterns('', (r'^api/', include(v1_api.urls)))
2420

2521
# Non-resource api endpoints
2622
urlpatterns += patterns('handball.api',
27-
(r'^api/v1/auth/validate/$', 'validate_user'),
28-
(r'^api/v1/auth/unique/$', 'is_unique'),
29-
(r'^api/v1/auth/signup/$', 'sign_up')
23+
(r'^api/v1/unique/$', 'is_unique'),
3024
)

0 commit comments

Comments
 (0)