Commit 650582eb by Zia Fazal Committed by Jonathan Piacenti

put post in list view and remove detail view

parent d6c303d1
......@@ -1133,7 +1133,7 @@ class CoursesApiTests(TestCase):
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data), 1)
def test_coursemodulecompletions_detail_delete(self):
def test_coursemodulecompletions_post(self):
data = {
'email': 'test@example.com',
......@@ -1145,9 +1145,9 @@ class CoursesApiTests(TestCase):
response = self.do_post(self.base_users_uri, data)
self.assertEqual(response.status_code, 201)
created_user_id = response.data['id']
detail_uri = '{}/{}/completions/{}/{}'.format(self.base_courses_uri, self.course.id, self.course_content.id,
created_user_id)
response = self.do_post(detail_uri, {})
completions_uri = '{}/{}/completions/'.format(self.base_courses_uri, self.course.id)
completions_data = {'content_id': self.course_content.id, 'user_id': created_user_id}
response = self.do_post(completions_uri, completions_data)
self.assertEqual(response.status_code, 201)
coursemodulecomp_id = response.data['id']
self.assertGreater(coursemodulecomp_id, 0)
......@@ -1158,23 +1158,18 @@ class CoursesApiTests(TestCase):
self.assertIsNotNone(response.data['modified'])
# test to create course completion with same attributes
response = self.do_post(detail_uri, {})
response = self.do_post(completions_uri, completions_data)
self.assertEqual(response.status_code, 409)
# test for delete
response = self.do_delete(detail_uri)
self.assertEqual(response.status_code, 204)
response = self.do_get('{}/{}/completions?user_id={}&content_id={}'.format(self.base_courses_uri,
self.course.id,
created_user_id,
self.course_content.id))
self.assertEqual(response.status_code, 404)
# test to create course completion with empty user_id
completions_data['user_id'] = None
response = self.do_post(completions_uri, completions_data)
self.assertEqual(response.status_code, 400)
#test deletion of non existing course module completion
non_existing_uri = '{}/{}/completions/{}/{}'.format(self.base_courses_uri, self.course.id,
self.course_content.id, '3323432')
response = self.do_delete(non_existing_uri)
self.assertEqual(response.status_code, 404)
# test to create course completion with empty content_id
completions_data['content_id'] = None
response = self.do_post(completions_uri, completions_data)
self.assertEqual(response.status_code, 400)
def test_coursemodulecompletions_filters(self):
completion_uri = '{}/{}/completions/'.format(self.base_courses_uri, self.course.id)
......@@ -1192,7 +1187,8 @@ class CoursesApiTests(TestCase):
for i in xrange(1, 26):
content_id = self.course_content.id + str(i)
response = self.do_post('{}{}/{}'.format(completion_uri, content_id, created_user_id), {})
completions_data = {'content_id': content_id, 'user_id': created_user_id}
response = self.do_post(completion_uri, completions_data)
self.assertEqual(response.status_code, 201)
#filter course module completion by user
......@@ -1214,7 +1210,8 @@ class CoursesApiTests(TestCase):
#filter course module completion by user who has not completed any course module
user_filter_uri = '{}?user_id={}'.format(completion_uri, 1)
response = self.do_get(user_filter_uri)
self.assertEqual(response.status_code, 404)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data['results']), 0)
#filter course module completion by course_id
course_filter_uri = '{}?course_id={}&page_size=10'.format(completion_uri, self.course.id)
......
......@@ -27,8 +27,6 @@ urlpatterns = patterns(
url(r'^(?P<course_id>[^/]+/[^/]+/[^/]+)/users/(?P<user_id>[0-9]+)$', courses_views.CoursesUsersDetail.as_view()),
url(r'^(?P<course_id>[^/]+/[^/]+/[^/]+)/users/*$', courses_views.CoursesUsersList.as_view()),
url(r'^(?P<course_id>[^/]+/[^/]+/[^/]+)/completions/*$', courses_views.CourseModuleCompletionList.as_view(), name='completion-list'),
url(r'^(?P<course_id>[^/]+/[^/]+/[^/]+)/completions/(?P<content_id>[a-zA-Z0-9/_:]+)/(?P<user_id>[0-9]+)$',
courses_views.CourseModuleCompletionDetail.as_view(), name='completion-detail'),
)
urlpatterns = format_suffix_patterns(urlpatterns)
......@@ -1090,6 +1090,12 @@ class CourseModuleCompletionList(SecureListAPIView):
```/api/courses/{course_id}/completions/?user_id={user_id}```
```/api/courses/{course_id}/completions/?content_id={content_id}```
```/api/courses/{course_id}/completions/?user_id={user_id}&content_id={content_id}```
- POST: Creates a Course-Module completion entity
- POST Example:
{
"content_id":"i4x://the/content/location",
"user_id":4
}
### Use Cases/Notes:
* Use GET operation to retrieve list of course completions by user
* Use GET operation to verify user has completed specific course module
......@@ -1113,26 +1119,19 @@ class CourseModuleCompletionList(SecureListAPIView):
if content_id:
queryset = queryset.filter(content_id=content_id)
if not queryset.exists() and (user_ids or content_id):
raise Http404
return queryset
class CourseModuleCompletionDetail(SecureAPIView):
def post(self, request, course_id):
"""
### The CourseModuleCompletionDetail view allows clients to interact with a
specific Course-Content completion entity
- URI: ```/api/courses/{course_id}/completions/{content_id}/{user_id}```
- POST: Creates a Course-Module completion entity
- DELETE: Removes an existing Course-Module completion entity from the system
### Use Cases/Notes:
* Use this operation to save or remove Course-Module completion entity
POST /api/courses/{course_id}/completions/
"""
content_id = request.DATA.get('content_id', None)
user_id = request.DATA.get('user_id', None)
if not content_id:
return Response({'message': _('content_id is missing')}, status.HTTP_400_BAD_REQUEST)
if not user_id:
return Response({'message': _('user_id is missing')}, status.HTTP_400_BAD_REQUEST)
def post(self, request, course_id, content_id, user_id):
"""
POST /api/courses/{course_id}/completions/{content_id}/{user_id}
"""
completion, created = CourseModuleCompletion.objects.get_or_create(user_id=user_id,
course_id=course_id,
content_id=content_id)
......@@ -1141,15 +1140,3 @@ class CourseModuleCompletionDetail(SecureAPIView):
return Response(serializer.data, status=status.HTTP_201_CREATED) # pylint: disable=E1101
else:
return Response({'message': _('Resource already exists')}, status=status.HTTP_409_CONFLICT)
def delete(self, request, course_id, content_id, user_id):
"""
DELETE /api/courses/{course_id}/completions/{content_id}/{user_id}
"""
try:
completion = CourseModuleCompletion.objects.get(user_id=user_id, course_id=course_id, content_id=content_id)
completion.delete()
except ObjectDoesNotExist:
raise Http404
response_data = {'uri': _generate_base_uri(request)}
return Response(response_data, status=status.HTTP_204_NO_CONTENT)
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