Commit fadca096 by Chris Dodge Committed by Jonathan Piacenti

cdodge/add-user-preferences: add access to the UserPreference table via the API

fixes
parent 87f25d10
......@@ -81,6 +81,16 @@ class UsersApiTests(TestCase):
response = self.client.delete(uri, headers=headers)
return response
def _create_test_user(self):
"""Helper method to create a new test user"""
test_uri = '/api/users'
local_username = self.test_username + str(randint(11, 99))
data = {'email': self.test_email, 'username': local_username, 'password':
self.test_password, 'first_name': self.test_first_name, 'last_name': self.test_last_name}
response = self.do_post(test_uri, data)
user_id = response.data['id']
return user_id
def test_user_list_post(self):
test_uri = '/api/users'
local_username = self.test_username + str(randint(11, 99))
......@@ -734,6 +744,65 @@ class UsersApiTests(TestCase):
response = self.do_get(test_uri)
self.assertEqual(response.status_code, 404)
def test_get_user_preferences_user_not_found(self):
test_uri = '/api/users/{}/preferences'.format('999999')
response = self.do_get(test_uri)
self.assertEqual(response.status_code, 404)
def test_get_user_preferences_default(self):
# By default newly created users will have one initial preference settings:
# 'pref-lang' = 'en'
user_id = self._create_test_user()
test_uri = '/api/users/{}/preferences'.format(user_id)
response = self.do_get(test_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data), 1)
self.assertEqual(response.data['pref-lang'], 'en')
def test_post_user_preferences_user_not_found(self):
test_uri = '/api/users/{}/preferences'.format('999999')
response = self.do_post(test_uri, {"foo": "bar"})
self.assertEqual(response.status_code, 404)
def test_post_user_preferences_bad_request(self):
user_id = self._create_test_user()
test_uri = '/api/users/{}/preferences'.format(user_id)
response = self.do_post(test_uri, {})
self.assertEqual(response.status_code, 400)
# also test with a non-simple key/value set of strings
response = self.do_post(test_uri, {"an_array": ['1', '2']})
self.assertEqual(response.status_code, 400)
response = self.do_post(test_uri, {"an_int": 1})
self.assertEqual(response.status_code, 400)
response = self.do_post(test_uri, {"a_float": 1.00})
self.assertEqual(response.status_code, 400)
response = self.do_post(test_uri, {"a_boolean": False})
self.assertEqual(response.status_code, 400)
def test_post_user_preferences(self):
user_id = self._create_test_user()
test_uri = '/api/users/{}/preferences'.format(user_id)
response = self.do_post(test_uri, {"foo": "bar"})
self.assertEqual(response.status_code, 201)
response = self.do_get(test_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data), 2)
self.assertEqual(response.data['pref-lang'], 'en')
self.assertEqual(response.data['foo'], 'bar')
def test_update_user_preferences(self):
user_id = self._create_test_user()
test_uri = '/api/users/{}/preferences'.format(user_id)
response = self.do_post(test_uri, {"foo": "bar"})
self.assertEqual(response.status_code, 201)
response = self.do_post(test_uri, {"foo": "updated"})
self.assertEqual(response.status_code, 200)
response = self.do_get(test_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data), 2)
self.assertEqual(response.data['pref-lang'], 'en')
self.assertEqual(response.data['foo'], 'updated')
def test_course_grades(self):
test_uri = '/api/users'
local_username = self.test_username + str(randint(11, 99))
......
......@@ -14,6 +14,7 @@ urlpatterns = patterns(
url(r'^(?P<user_id>[0-9]+)/courses/(?P<course_id>[^/]+/[^/]+/[^/]+)/grades$', users_views.UsersCoursesGradesDetail.as_view()),
url(r'^(?P<user_id>[0-9]+)/groups/*$', users_views.UsersGroupsList.as_view()),
url(r'^(?P<user_id>[0-9]+)/groups/(?P<group_id>[0-9]+)$', users_views.UsersGroupsDetail.as_view()),
url(r'^(?P<user_id>[0-9]+)/preferences$', users_views.UsersPreferences.as_view()),
)
urlpatterns = format_suffix_patterns(urlpatterns)
......@@ -636,3 +636,63 @@ class UsersCoursesGradesDetail(SecureAPIView):
}
return Response(response_data)
class UsersPreferences(SecureAPIView):
""" Inherit with SecureAPIView """
def get(self, request, user_id): # pylint: disable=W0613
"""
GET returns the preferences for the specified user
"""
response_data = {}
try:
user = User.objects.get(id=user_id)
except ObjectDoesNotExist:
return Response({}, status.HTTP_404_NOT_FOUND)
for preference in user.preferences.all():
response_data[preference.key] = preference.value
return Response(response_data)
def post(self, request, user_id):
"""
POST adds a new entry into the UserPreference table
"""
try:
user = User.objects.get(id=user_id)
except ObjectDoesNotExist:
return Response({}, status.HTTP_404_NOT_FOUND)
if not len(request.DATA):
return Response({}, status.HTTP_400_BAD_REQUEST)
# do a quick inspection to make sure we're only getting strings as values
for key in request.DATA.keys():
value = request.DATA[key]
if not isinstance(value, basestring):
return Response({}, status.HTTP_400_BAD_REQUEST)
status_code = status.HTTP_200_OK
for key in request.DATA.keys():
value = request.DATA[key]
# see if the key already exists
found = None
for preference in user.preferences.all():
if preference.key == key:
found = preference
break
if found:
found.value = value
found.save()
else:
preference = UserPreference.objects.create(user_id=user_id, key=key, value=value)
preference.save()
status_code = status.HTTP_201_CREATED
return Response({}, status_code)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment