Commit 0225e33a by Matt Drayer Committed by Jonathan Piacenti

mattdrayer/api-middleware-regex: Support for opaque keys, server API namespace

parent e093fc25
......@@ -4,7 +4,7 @@ import logging
from opaque_keys.edx.locations import SlashSeparatedCourseKey
from opaque_keys.edx.keys import CourseKey
from opaque_keys import InvalidKeyError
from util.request import COURSE_REGEX
from util.request import course_id_from_url, COURSE_REGEX
log = logging.getLogger(__name__)
......@@ -15,7 +15,6 @@ def course_context_from_url(url):
`course_context_from_course_id()`.
"""
url = url or ''
match = COURSE_REGEX.match(url)
course_id = None
if match:
......@@ -29,7 +28,6 @@ def course_context_from_url(url):
),
exc_info=True
)
return course_context_from_course_id(course_id)
......
......@@ -50,12 +50,9 @@ def course_id_from_url(url):
key_generator = CourseKey.from_string
match = COURSE_REGEX.match(url)
if match is None:
return None
course_id = match.group('course_id')
if course_id is None:
return None
......
......@@ -83,7 +83,7 @@ def _serialize_content(request, content_key, content_descriptor):
protocol = 'http'
if request.is_secure():
protocol = protocol + 's'
content_uri = '{}://{}/api/courses/{}'.format(
content_uri = '{}://{}/api/server/courses/{}'.format(
protocol,
request.get_host(),
unicode(content_key)
......@@ -466,7 +466,7 @@ class CourseContentDetail(SecureAPIView):
protocol = 'http'
if request.is_secure():
protocol = protocol + 's'
response_data['uri'] = '{}://{}/api/courses/{}'.format(
response_data['uri'] = '{}://{}/api/server/courses/{}'.format(
protocol,
request.get_host(),
unicode(course_key)
......
......@@ -42,8 +42,9 @@ class GroupsApiTests(ModuleStoreTestCase):
self.test_group_name = str(uuid.uuid4())
self.test_first_name = str(uuid.uuid4())
self.test_last_name = str(uuid.uuid4())
self.base_users_uri = '/api/users'
self.base_groups_uri = '/api/groups'
self.base_users_uri = '/api/server/users'
self.base_groups_uri = '/api/server/groups'
self.base_workgroups_uri = '/api/server/workgroups/'
self.test_course_data = '<html>{}</html>'.format(str(uuid.uuid4()))
self.course = CourseFactory.create()
......@@ -965,7 +966,7 @@ class GroupsApiTests(ModuleStoreTestCase):
response = self.do_post(self.base_groups_uri, data)
self.assertEqual(response.status_code, 201)
group_id = response.data['id']
test_workgroups_uri = '/api/workgroups/'
test_workgroups_uri = self.base_workgroups_uri
for i in xrange(1, 12):
project_id = self.test_project.id
data = {
......@@ -981,7 +982,7 @@ class GroupsApiTests(ModuleStoreTestCase):
self.assertEqual(response.status_code, 201)
# test to get list of workgroups
test_uri = '/api/groups/{}/workgroups/?page_size=10'.format(group_id)
test_uri = '{}/{}/workgroups/?page_size=10'.format(self.base_groups_uri, group_id)
response = self.do_get(test_uri)
self.assertEqual(response.data['count'], 11)
self.assertEqual(len(response.data['results']), 10)
......@@ -989,12 +990,13 @@ class GroupsApiTests(ModuleStoreTestCase):
# test with course_id filter
course_id = {'course_id': unicode(self.course.id)}
response = self.do_get('/api/groups/{}/workgroups/?{}'.format(group_id, urlencode(course_id)))
groups_uri = '{}/{}/workgroups/?{}'.format(self.base_groups_uri, group_id, urlencode(course_id))
response = self.do_get(groups_uri)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data['count'], 11)
self.assertIsNotNone(response.data['results'][0]['name'])
self.assertIsNotNone(response.data['results'][0]['project'])
# test with invalid group id
response = self.do_get('/api/groups/4356340/workgroups/')
response = self.do_get('{}/4356340/workgroups/'.format(self.base_groups_uri))
self.assertEqual(response.status_code, 404)
......@@ -8,7 +8,6 @@ from django.test import RequestFactory
from api_manager import models as api_models
from api_manager.courseware_access import get_course, get_course_child
from opaque_keys import InvalidKeyError
from projects import models as project_models
class Command(BaseCommand):
......@@ -21,37 +20,6 @@ class Command(BaseCommand):
request = request_factory.get('/')
request.user = User(email='migration@edx.org', username='migration', password='migration', is_active=True)
projects = project_models.Project.objects.all()
for project in projects:
course_descriptor, course_key, course_content = get_course(request, request.user, project.course_id)
project.course_id = unicode(course_key)
try:
project.content_id = course_key.make_usage_key_from_deprecated_string(project.content_id)
except InvalidKeyError:
pass # If the key conversion fails it was either a new-style key or junk data
project.save()
workgroup_reviews = project_models.WorkgroupReview.objects.all()
for wr in workgroup_reviews:
course_id = wr.workgroup.project.course_id
course_descriptor, course_key, course_content = get_course(request, request.user, course_id)
try:
wr.content_id = course_key.make_usage_key_from_deprecated_string(wr.content_id)
except InvalidKeyError:
pass # If the key conversion fails it was either a new-style key or junk data
wr.save()
workgroup_submission_reviews = project_models.WorkgroupSubmissionReview.objects.all()
for wsr in workgroup_submission_reviews:
course_id = wsr.submission.workgroup.project.course_id
course_descriptor, course_key, course_content = get_course(request, request.user, course_id)
try:
wsr.content_id = course_key.make_usage_key_from_deprecated_string(wsr.content_id)
except InvalidKeyError:
pass # If the key conversion fails it was either a new-style key or junk data
wsr.save()
course_groups = api_models.CourseGroupRelationship.objects.all()
for cg in course_groups:
course_id = cg.course_id
......
......@@ -9,7 +9,6 @@ from django.contrib.auth.models import Group, User
from api_manager import models as api_models
from api_manager.management.commands import migrate_courseids
from projects import models as project_models
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
......@@ -63,11 +62,6 @@ class MigrateCourseIdsTests(ModuleStoreTestCase):
"""
# Set up the data to be migrated
user = User.objects.create(email='testuser@edx.org', username='testuser', password='testpassword', is_active=True)
project = project_models.Project.objects.create(course_id=self.old_style_course_id, content_id=self.old_style_content_id)
workgroup = project_models.Workgroup.objects.create(name='Test Workgroup', project=project)
workgroup_review = project_models.WorkgroupReview.objects.create(workgroup=workgroup, content_id=self.old_style_content_id)
workgroup_submission = project_models.WorkgroupSubmission.objects.create(workgroup=workgroup, user=user)
workgroup_submission_review = project_models.WorkgroupSubmissionReview.objects.create(submission=workgroup_submission, content_id=self.old_style_content_id)
group = Group.objects.create(name='Test Group')
group_profile = api_models.GroupProfile.objects.create(group=group)
course_group = api_models.CourseGroupRelationship.objects.create(course_id=self.old_style_course_id, group=group)
......@@ -75,11 +69,6 @@ class MigrateCourseIdsTests(ModuleStoreTestCase):
course_module_completion = api_models.CourseModuleCompletion.objects.create(user=user, course_id=self.old_style_course_id, content_id=self.old_style_content_id)
user2 = User.objects.create(email='testuser2@edx.org', username='testuser2', password='testpassword2', is_active=True)
project2 = project_models.Project.objects.create(course_id=self.new_style_course_id2, content_id=self.new_style_content_id2)
workgroup2 = project_models.Workgroup.objects.create(name='Test Workgroup2', project=project2)
workgroup_review2 = project_models.WorkgroupReview.objects.create(workgroup=workgroup2, content_id=self.new_style_content_id2)
workgroup_submission2 = project_models.WorkgroupSubmission.objects.create(workgroup=workgroup2, user=user2)
workgroup_submission_review2 = project_models.WorkgroupSubmissionReview.objects.create(submission=workgroup_submission2, content_id=self.new_style_content_id2)
group2 = Group.objects.create(name='Test Group2')
group_profile2 = api_models.GroupProfile.objects.create(group=group2)
course_group2 = api_models.CourseGroupRelationship.objects.create(course_id=self.new_style_course_id2, group=group2)
......@@ -92,26 +81,6 @@ class MigrateCourseIdsTests(ModuleStoreTestCase):
# Confirm that the data has been properly migrated
updated_project = project_models.Project.objects.get(id=project.id)
self.assertEqual(updated_project.course_id, self.new_style_course_id)
self.assertEqual(updated_project.content_id, self.new_style_content_id)
updated_project = project_models.Project.objects.get(id=project2.id)
self.assertEqual(updated_project.course_id, self.new_style_course_id2)
self.assertEqual(updated_project.content_id, self.new_style_content_id2)
print "Project Data Migration Passed"
updated_workgroup_review = project_models.WorkgroupReview.objects.get(id=workgroup_review.id)
self.assertEqual(updated_workgroup_review.content_id, self.new_style_content_id)
updated_workgroup_review = project_models.WorkgroupReview.objects.get(id=workgroup_review2.id)
self.assertEqual(updated_workgroup_review.content_id, self.new_style_content_id2)
print "Workgroup Review Data Migration Passed"
updated_workgroup_submission_review = project_models.WorkgroupSubmissionReview.objects.get(id=workgroup_submission_review.id)
self.assertEqual(updated_workgroup_submission_review.content_id, self.new_style_content_id)
updated_workgroup_submission_review = project_models.WorkgroupSubmissionReview.objects.get(id=workgroup_submission_review2.id)
self.assertEqual(updated_workgroup_submission_review.content_id, self.new_style_content_id2)
print "Workgroup Submission Review Data Migration Passed"
updated_course_group = api_models.CourseGroupRelationship.objects.get(id=course_group.id)
self.assertEqual(updated_course_group.course_id, self.new_style_course_id)
updated_course_group = api_models.CourseGroupRelationship.objects.get(id=course_group2.id)
......
......@@ -35,9 +35,9 @@ class OrganizationsApiTests(ModuleStoreTestCase):
def setUp(self):
self.test_server_prefix = 'https://testserver'
self.test_organizations_uri = '/api/organizations/'
self.test_users_uri = '/api/users'
self.base_groups_uri = '/api/groups'
self.base_organizations_uri = '/api/server/organizations/'
self.base_users_uri = '/api/server/users'
self.base_groups_uri = '/api/server/groups'
self.test_organization_name = str(uuid.uuid4())
self.test_organization_display_name = 'Test Org'
self.test_organization_contact_name = 'John Org'
......@@ -97,7 +97,7 @@ class OrganizationsApiTests(ModuleStoreTestCase):
'first_name': 'John{}'.format(i),
'last_name': 'Doe{}'.format(i)
}
response = self.do_post(self.test_users_uri, data)
response = self.do_post(self.base_users_uri, data)
self.assertEqual(response.status_code, 201)
users.append(response.data['id'])
......@@ -109,12 +109,12 @@ class OrganizationsApiTests(ModuleStoreTestCase):
'contact_phone': self.test_organization_contact_phone,
'users': users
}
response = self.do_post(self.test_organizations_uri, data)
response = self.do_post(self.base_organizations_uri, data)
self.assertEqual(response.status_code, 201)
self.assertGreater(response.data['id'], 0)
confirm_uri = '{}{}{}/'.format(
self.test_server_prefix,
self.test_organizations_uri,
self.base_organizations_uri,
str(response.data['id'])
)
self.assertEqual(response.data['url'], confirm_uri)
......@@ -137,9 +137,9 @@ class OrganizationsApiTests(ModuleStoreTestCase):
'contact_email': self.test_organization_contact_email,
'contact_phone': self.test_organization_contact_phone
}
response = self.do_post(self.test_organizations_uri, data)
response = self.do_post(self.base_organizations_uri, data)
self.assertEqual(response.status_code, 201)
test_uri = '{}{}/'.format(self.test_organizations_uri, str(response.data['id']))
test_uri = '{}{}/'.format(self.base_organizations_uri, str(response.data['id']))
response = self.do_get(test_uri)
self.assertEqual(response.status_code, 200)
confirm_uri = self.test_server_prefix + test_uri
......@@ -156,15 +156,15 @@ class OrganizationsApiTests(ModuleStoreTestCase):
self.assertIsNotNone(response.data['modified'])
def test_organizations_detail_get_undefined(self):
test_uri = '/api/organizations/123456789/'
test_uri = '{}/123456789/'.format(self.base_organizations_uri)
response = self.do_get(test_uri)
self.assertEqual(response.status_code, 404)
def test_organizations_detail_delete(self):
data = {'name': self.test_organization_name}
response = self.do_post(self.test_organizations_uri, data)
response = self.do_post(self.base_organizations_uri, data)
self.assertEqual(response.status_code, 201)
test_uri = '{}{}/'.format(self.test_organizations_uri, str(response.data['id']))
test_uri = '{}{}/'.format(self.base_organizations_uri, str(response.data['id']))
response = self.do_get(test_uri)
self.assertEqual(response.status_code, 200)
response = self.do_delete(test_uri)
......@@ -180,7 +180,7 @@ class OrganizationsApiTests(ModuleStoreTestCase):
'contact_email': 'testatme.com',
'contact_phone': self.test_organization_contact_phone
}
response = self.do_post(self.test_organizations_uri, data)
response = self.do_post(self.base_organizations_uri, data)
self.assertEqual(response.status_code, 400)
def test_organizations_list_post_with_groups(self):
......@@ -200,7 +200,7 @@ class OrganizationsApiTests(ModuleStoreTestCase):
'display_name': self.test_organization_display_name,
'groups': groups
}
response = self.do_post(self.test_organizations_uri, data)
response = self.do_post(self.base_organizations_uri, data)
self.assertEqual(response.status_code, 201)
self.assertEqual(len(response.data['groups']), len(groups))
......@@ -212,9 +212,9 @@ class OrganizationsApiTests(ModuleStoreTestCase):
'contact_email': self.test_organization_contact_email,
'contact_phone': self.test_organization_contact_phone
}
response = self.do_post(self.test_organizations_uri, data)
response = self.do_post(self.base_organizations_uri, data)
self.assertEqual(response.status_code, 201)
test_uri = '{}{}/'.format(self.test_organizations_uri, str(response.data['id']))
test_uri = '{}{}/'.format(self.base_organizations_uri, str(response.data['id']))
users_uri = '{}users/'.format(test_uri)
data = {"id": self.test_user.id}
response = self.do_post(users_uri, data)
......@@ -231,9 +231,9 @@ class OrganizationsApiTests(ModuleStoreTestCase):
'contact_email': self.test_organization_contact_email,
'contact_phone': self.test_organization_contact_phone
}
response = self.do_post(self.test_organizations_uri, data)
response = self.do_post(self.base_organizations_uri, data)
self.assertEqual(response.status_code, 201)
test_uri = '{}{}/'.format(self.test_organizations_uri, str(response.data['id']))
test_uri = '{}{}/'.format(self.base_organizations_uri, str(response.data['id']))
users_uri = '{}users/'.format(test_uri)
data = {"id": 123456}
response = self.do_post(users_uri, data)
......@@ -247,9 +247,9 @@ class OrganizationsApiTests(ModuleStoreTestCase):
'contact_email': self.test_organization_contact_email,
'contact_phone': self.test_organization_contact_phone
}
response = self.do_post(self.test_organizations_uri, data)
response = self.do_post(self.base_organizations_uri, data)
self.assertEqual(response.status_code, 201)
test_uri = '{}{}/'.format(self.test_organizations_uri, str(response.data['id']))
test_uri = '{}{}/'.format(self.base_organizations_uri, str(response.data['id']))
users_uri = '{}users/'.format(test_uri)
data = {"id": self.test_user.id}
response = self.do_post(users_uri, data)
......@@ -271,9 +271,9 @@ class OrganizationsApiTests(ModuleStoreTestCase):
'contact_email': self.test_organization_contact_email,
'contact_phone': self.test_organization_contact_phone
}
response = self.do_post(self.test_organizations_uri, data)
response = self.do_post(self.base_organizations_uri, data)
self.assertEqual(response.status_code, 201)
test_uri = '{}{}/'.format(self.test_organizations_uri, str(response.data['id']))
test_uri = '{}{}/'.format(self.base_organizations_uri, str(response.data['id']))
users_uri = '{}users/'.format(test_uri)
data = {"id": self.test_user.id}
response = self.do_post(users_uri, data)
......
......@@ -37,7 +37,7 @@ class SessionApiRateLimitingProtectionTest(TestCase):
# Create the test client
self.client = Client()
cache.clear()
self.session_url = '/api/sessions'
self.session_url = '/api/server/sessions'
def test_login_ratelimiting_protection(self):
""" Try (and fail) login user 30 times on invalid password """
......
......@@ -38,8 +38,8 @@ class SessionApiSecurityTest(TestCase):
# Create the test client
self.client = Client()
cache.clear()
self.session_url = '/api/sessions'
self.user_url = '/api/users'
self.session_url = '/api/server/sessions'
self.user_url = '/api/server/users'
@override_settings(MAX_FAILED_LOGIN_ATTEMPTS_ALLOWED=10)
def test_login_ratelimited_success(self):
......
......@@ -33,8 +33,8 @@ class SessionsApiTests(TestCase):
self.test_username = str(uuid.uuid4())
self.test_password = str(uuid.uuid4())
self.test_email = str(uuid.uuid4()) + '@test.org'
self.base_users_uri = '/api/users'
self.base_sessions_uri = '/api/sessions'
self.base_users_uri = '/api/server/users'
self.base_sessions_uri = '/api/server/sessions'
self.client = SecureClient()
cache.clear()
......
......@@ -26,7 +26,7 @@ class SystemApiTests(TestCase):
""" Test suite for base API views """
def setUp(self):
self.test_server_prefix = "https://testserver/api/"
self.test_server_prefix = "https://testserver/api/server/"
self.test_username = str(uuid.uuid4())
self.test_password = str(uuid.uuid4())
self.test_email = str(uuid.uuid4()) + '@test.org'
......
......@@ -20,7 +20,7 @@ class PermissionsTests(TestCase):
self.username = self.username[3:-1] # username is a 32-character field
self.test_password = str(uuid.uuid4())
self.test_email = str(uuid.uuid4()) + '@test.org'
self.test_uri = '/api/users'
self.test_uri = '/api/server/users'
self.data = {'email': self.test_email, 'username': self.test_username, 'password': self.test_password}
self.headers = {
'Content-Type': 'application/json',
......
......@@ -27,16 +27,16 @@ urlpatterns = patterns(
url(r'^courses/*', include('api_manager.courses.urls')),
)
router = SimpleRouter()
router.register(r'organizations', OrganizationsViewSet)
server_api_router = SimpleRouter()
server_api_router.register(r'organizations', OrganizationsViewSet)
# Project-related ViewSets
router.register(r'projects', project_views.ProjectsViewSet)
router.register(r'workgroups', project_views.WorkgroupsViewSet)
router.register(r'submissions', project_views.WorkgroupSubmissionsViewSet)
router.register(r'workgroup_reviews', project_views.WorkgroupReviewsViewSet)
router.register(r'submission_reviews', project_views.WorkgroupSubmissionReviewsViewSet)
router.register(r'peer_reviews', project_views.WorkgroupPeerReviewsViewSet)
router.register(r'groups', project_views.GroupViewSet)
router.register(r'users', project_views.UserViewSet)
urlpatterns += router.urls
server_api_router.register(r'projects', project_views.ProjectsViewSet)
server_api_router.register(r'workgroups', project_views.WorkgroupsViewSet)
server_api_router.register(r'submissions', project_views.WorkgroupSubmissionsViewSet)
server_api_router.register(r'workgroup_reviews', project_views.WorkgroupReviewsViewSet)
server_api_router.register(r'submission_reviews', project_views.WorkgroupSubmissionReviewsViewSet)
server_api_router.register(r'peer_reviews', project_views.WorkgroupPeerReviewsViewSet)
server_api_router.register(r'groups', project_views.GroupViewSet)
server_api_router.register(r'users', project_views.UserViewSet)
urlpatterns += server_api_router.urls
......@@ -30,8 +30,8 @@ class UserPasswordResetTest(TestCase):
"""
setup the api urls
"""
self.session_url = '/api/sessions'
self.user_url = '/api/users'
self.session_url = '/api/server/sessions'
self.user_url = '/api/server/users'
cache.clear()
@override_settings(ADVANCED_SECURITY_CONFIG={'MIN_DAYS_FOR_STUDENT_ACCOUNTS_PASSWORD_RESETS': 5})
......
"""
One-time data migration script -- shoulen't need to run it again
"""
from django.contrib.auth.models import User
from django.core.management.base import BaseCommand
from django.test import RequestFactory
from api_manager.courseware_access import get_course, get_course_child
from opaque_keys import InvalidKeyError
from project.models import Project, WorkgroupReview, WorkgroupSubmissionReview
class Command(BaseCommand):
"""
Migrates legacy course/content identifiers across several models to the new format
"""
def handle(self, *args, **options):
request_factory = RequestFactory()
request = request_factory.get('/')
request.user = User(email='migration@edx.org', username='migration', password='migration', is_active=True)
projects = Project.objects.all()
for project in projects:
course_descriptor, course_key, course_content = get_course(request, request.user, project.course_id)
project.course_id = unicode(course_key)
try:
project.content_id = course_key.make_usage_key_from_deprecated_string(project.content_id)
except InvalidKeyError:
pass # If the key conversion fails it was either a new-style key or junk data
project.save()
workgroup_reviews = WorkgroupReview.objects.all()
for wr in workgroup_reviews:
course_id = wr.workgroup.project.course_id
course_descriptor, course_key, course_content = get_course(request, request.user, course_id)
try:
wr.content_id = course_key.make_usage_key_from_deprecated_string(wr.content_id)
except InvalidKeyError:
pass # If the key conversion fails it was either a new-style key or junk data
wr.save()
workgroup_submission_reviews = WorkgroupSubmissionReview.objects.all()
for wsr in workgroup_submission_reviews:
course_id = wsr.submission.workgroup.project.course_id
course_descriptor, course_key, course_content = get_course(request, request.user, course_id)
try:
wsr.content_id = course_key.make_usage_key_from_deprecated_string(wsr.content_id)
except InvalidKeyError:
pass # If the key conversion fails it was either a new-style key or junk data
wsr.save()
"""
Run these tests @ Devstack:
rake fasttest_lms[common/djangoapps/api_manager/management/commands/tests/test_migrate_orgdata.py]
"""
from datetime import datetime
import uuid
from django.contrib.auth.models import Group, User
from django.test import TestCase
from django.test.utils import override_settings
from api_manager.management.commands import migrate_courseids
from courseware.tests.modulestore_config import TEST_DATA_MIXED_MODULESTORE
from projects.models import Project, Workgroup, WorkgroupReview, WorkgroupSubmission, WorkgroupSubmissionReview
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
from django.db import connection
@override_settings(MODULESTORE=TEST_DATA_MIXED_MODULESTORE)
class MigrateCourseIdsTests(TestCase):
"""
Test suite for data migration script
"""
def setUp(self):
self.course = CourseFactory.create(
start=datetime(2014, 6, 16, 14, 30),
end=datetime(2015, 1, 16)
)
self.test_data = '<html>{}</html>'.format(str(uuid.uuid4()))
self.chapter = ItemFactory.create(
category="chapter",
parent_location=self.course.location,
data=self.test_data,
due=datetime(2014, 5, 16, 14, 30),
display_name="Overview"
)
self.old_style_course_id = self.course.id.to_deprecated_string()
self.new_style_course_id = unicode(self.course.id)
self.old_style_content_id = self.chapter.location.to_deprecated_string()
self.new_style_content_id = unicode(self.chapter.location)
self.course2 = CourseFactory.create(
org='TEST',
start=datetime(2014, 6, 16, 14, 30),
end=datetime(2015, 1, 16)
)
self.chapter2 = ItemFactory.create(
category="chapter",
parent_location=self.course2.location,
data=self.test_data,
due=datetime(2014, 5, 16, 14, 30),
display_name="Overview"
)
self.new_style_course_id2 = unicode(self.course2.id)
self.new_style_content_id2 = unicode(self.chapter2.location)
def test_migrate_courseids(self):
"""
Test the data migration
"""
# Set up the data to be migrated
user = User.objects.create(email='testuser@edx.org', username='testuser', password='testpassword', is_active=True)
project = Project.objects.create(course_id=self.old_style_course_id, content_id=self.old_style_content_id)
workgroup = Workgroup.objects.create(name='Test Workgroup', project=project)
workgroup_review = WorkgroupReview.objects.create(workgroup=workgroup, content_id=self.old_style_content_id)
workgroup_submission = WorkgroupSubmission.objects.create(workgroup=workgroup, user=user)
workgroup_submission_review = WorkgroupSubmissionReview.objects.create(submission=workgroup_submission, content_id=self.old_style_content_id)
user2 = User.objects.create(email='testuser2@edx.org', username='testuser2', password='testpassword2', is_active=True)
project2 = Project.objects.create(course_id=self.new_style_course_id2, content_id=self.new_style_content_id2)
workgroup2 = Workgroup.objects.create(name='Test Workgroup2', project=project2)
workgroup_review2 = WorkgroupReview.objects.create(workgroup=workgroup2, content_id=self.new_style_content_id2)
workgroup_submission2 = WorkgroupSubmission.objects.create(workgroup=workgroup2, user=user2)
workgroup_submission_review2 = WorkgroupSubmissionReview.objects.create(submission=workgroup_submission2, content_id=self.new_style_content_id2)
# Run the data migration
migrate_courseids.Command().handle()
# Confirm that the data has been properly migrated
updated_project = Project.objects.get(id=project.id)
self.assertEqual(updated_project.course_id, self.new_style_course_id)
self.assertEqual(updated_project.content_id, self.new_style_content_id)
updated_project = Project.objects.get(id=project2.id)
self.assertEqual(updated_project.course_id, self.new_style_course_id2)
self.assertEqual(updated_project.content_id, self.new_style_content_id2)
print "Project Data Migration Passed"
updated_workgroup_review = WorkgroupReview.objects.get(id=workgroup_review.id)
self.assertEqual(updated_workgroup_review.content_id, self.new_style_content_id)
updated_workgroup_review = WorkgroupReview.objects.get(id=workgroup_review2.id)
self.assertEqual(updated_workgroup_review.content_id, self.new_style_content_id2)
print "Workgroup Review Data Migration Passed"
updated_workgroup_submission_review = WorkgroupSubmissionReview.objects.get(id=workgroup_submission_review.id)
self.assertEqual(updated_workgroup_submission_review.content_id, self.new_style_content_id)
updated_workgroup_submission_review = WorkgroupSubmissionReview.objects.get(id=workgroup_submission_review2.id)
self.assertEqual(updated_workgroup_submission_review.content_id, self.new_style_content_id2)
print "Workgroup Submission Review Data Migration Passed"
......@@ -37,10 +37,10 @@ class PeerReviewsApiTests(ModuleStoreTestCase):
def setUp(self):
self.test_server_prefix = 'https://testserver'
self.test_users_uri = '/api/users/'
self.test_workgroups_uri = '/api/workgroups/'
self.test_projects_uri = '/api/projects/'
self.test_peer_reviews_uri = '/api/peer_reviews/'
self.test_users_uri = '/api/server/users/'
self.test_workgroups_uri = '/api/server/workgroups/'
self.test_projects_uri = '/api/server/projects/'
self.test_peer_reviews_uri = '/api/server/peer_reviews/'
self.course = CourseFactory.create()
self.test_data = '<html>{}</html>'.format(str(uuid.uuid4()))
......@@ -181,7 +181,7 @@ class PeerReviewsApiTests(ModuleStoreTestCase):
self.assertIsNotNone(response.data['modified'])
def test_peer_reviews_detail_get_undefined(self):
test_uri = '/api/peer_reviews/123456789/'
test_uri = '{}/123456789/'.format(self.test_peer_reviews_uri)
response = self.do_get(test_uri)
self.assertEqual(response.status_code, 404)
......
......@@ -34,8 +34,8 @@ class ProjectsApiTests(TestCase):
def setUp(self):
self.test_server_prefix = 'https://testserver'
self.test_projects_uri = '/api/projects/'
self.test_organizations_uri = '/api/organizations/'
self.test_projects_uri = '/api/server/projects/'
self.test_organizations_uri = '/api/server/organizations/'
self.test_project_name = str(uuid.uuid4())
self.test_course_id = 'edx/demo/course'
......@@ -155,7 +155,7 @@ class ProjectsApiTests(TestCase):
self.assertEqual(response.status_code, 400)
def test_projects_detail_get_undefined(self):
test_uri = '/api/projects/123456789/'
test_uri = '{}/123456789/'.format(self.test_projects_uri)
response = self.do_get(test_uri)
self.assertEqual(response.status_code, 404)
......
......@@ -37,10 +37,10 @@ class SubmissionReviewsApiTests(ModuleStoreTestCase):
def setUp(self):
self.test_server_prefix = 'https://testserver'
self.test_users_uri = '/api/users/'
self.test_workgroups_uri = '/api/workgroups/'
self.test_projects_uri = '/api/projects/'
self.test_submission_reviews_uri = '/api/submission_reviews/'
self.test_users_uri = '/api/server/users/'
self.test_workgroups_uri = '/api/server/workgroups/'
self.test_projects_uri = '/api/server/projects/'
self.test_submission_reviews_uri = '/api/server/submission_reviews/'
self.course = CourseFactory.create()
self.test_data = '<html>{}</html>'.format(str(uuid.uuid4()))
......@@ -174,7 +174,7 @@ class SubmissionReviewsApiTests(ModuleStoreTestCase):
self.assertIsNotNone(response.data['modified'])
def test_submission_reviews_detail_get_undefined(self):
test_uri = '/api/submission_reviews/123456789/'
test_uri = '{}123456789/'.format(self.test_submission_reviews_uri)
response = self.do_get(test_uri)
self.assertEqual(response.status_code, 404)
......
......@@ -38,10 +38,10 @@ class WorkgroupReviewsApiTests(ModuleStoreTestCase):
def setUp(self):
super(WorkgroupReviewsApiTests, self).setUp()
self.test_server_prefix = 'https://testserver'
self.test_users_uri = '/api/users/'
self.test_workgroups_uri = '/api/workgroups/'
self.test_projects_uri = '/api/projects/'
self.test_workgroup_reviews_uri = '/api/workgroup_reviews/'
self.test_users_uri = '/api/server/users/'
self.test_workgroups_uri = '/api/server/workgroups/'
self.test_projects_uri = '/api/server/projects/'
self.test_workgroup_reviews_uri = '/api/server/workgroup_reviews/'
self.course = CourseFactory.create()
self.test_data = '<html>{}</html>'.format(str(uuid.uuid4()))
......@@ -174,7 +174,7 @@ class WorkgroupReviewsApiTests(ModuleStoreTestCase):
self.assertIsNotNone(response.data['modified'])
def test_workgroup_reviews_detail_get_undefined(self):
test_uri = '/api/workgroup_reviews/123456789/'
test_uri = '{}123456789/'.format(self.test_workgroup_reviews_uri)
response = self.do_get(test_uri)
self.assertEqual(response.status_code, 404)
......
......@@ -34,10 +34,10 @@ class SubmissionsApiTests(TestCase):
def setUp(self):
self.test_server_prefix = 'https://testserver'
self.test_users_uri = '/api/users/'
self.test_workgroups_uri = '/api/workgroups/'
self.test_projects_uri = '/api/projects/'
self.test_submissions_uri = '/api/submissions/'
self.test_users_uri = '/api/server/users/'
self.test_workgroups_uri = '/api/server/workgroups/'
self.test_projects_uri = '/api/server/projects/'
self.test_submissions_uri = '/api/server/submissions/'
self.test_course_id = 'edx/demo/course'
self.test_bogus_course_id = 'foo/bar/baz'
......@@ -182,7 +182,7 @@ class SubmissionsApiTests(TestCase):
self.assertIsNotNone(response.data['modified'])
def test_submissions_detail_get_undefined(self):
test_uri = '/api/submissions/123456789/'
test_uri = '{}123456789/'.format(self.test_submissions_uri)
response = self.do_get(test_uri)
self.assertEqual(response.status_code, 404)
......
......@@ -47,7 +47,11 @@ class WorkgroupsApiTests(ModuleStoreTestCase):
def setUp(self):
super(WorkgroupsApiTests, self).setUp()
self.test_server_prefix = 'https://testserver'
self.test_workgroups_uri = '/api/workgroups/'
self.test_workgroups_uri = '/api/server/workgroups/'
self.test_submissions_uri = '/api/server/submissions/'
self.test_peer_reviews_uri = '/api/server/peer_reviews/'
self.test_workgroup_reviews_uri = '/api/server/workgroup_reviews/'
self.test_courses_uri = '/api/server/courses'
self.test_bogus_course_id = 'foo/bar/baz'
self.test_bogus_course_content_id = "i4x://foo/bar/baz"
self.test_group_id = '1'
......@@ -383,7 +387,7 @@ class WorkgroupsApiTests(ModuleStoreTestCase):
'question': 'Test question?',
'answer': 'Test answer!'
}
response = self.do_post('/api/peer_reviews/', pr_data)
response = self.do_post(self.test_peer_reviews_uri, pr_data)
self.assertEqual(response.status_code, 201)
pr_id = response.data['id']
test_uri = '{}{}/'.format(self.test_workgroups_uri, workgroup_id)
......@@ -407,7 +411,7 @@ class WorkgroupsApiTests(ModuleStoreTestCase):
'question': 'Test question?',
'answer': 'Test answer!'
}
response = self.do_post('/api/workgroup_reviews/', wr_data)
response = self.do_post(self.test_workgroup_reviews_uri, wr_data)
self.assertEqual(response.status_code, 201)
wr_id = response.data['id']
test_uri = '{}{}/'.format(self.test_workgroups_uri, workgroup_id)
......@@ -432,7 +436,7 @@ class WorkgroupsApiTests(ModuleStoreTestCase):
'document_url': 'https://s3.amazonaws.com/bucketname/filename.pdf',
'document_mime_type': 'application/pdf'
}
response = self.do_post('/api/submissions/', data)
response = self.do_post(self.test_submissions_uri, data)
self.assertEqual(response.status_code, 201)
submission_id = response.data['id']
test_uri = '{}{}/'.format(self.test_workgroups_uri, workgroup_id)
......@@ -469,7 +473,7 @@ class WorkgroupsApiTests(ModuleStoreTestCase):
self.assertEqual(response.status_code, 201)
# Confirm the grades for the users
course_grades_uri = '/api/courses/{}/grades'.format(self.test_course_id)
course_grades_uri = '{}/{}/grades'.format(self.test_courses_uri, self.test_course_id)
response = self.do_get(course_grades_uri)
self.assertEqual(response.status_code, 200)
self.assertGreater(len(response.data['grades']), 0)
......@@ -615,7 +619,7 @@ class WorkgroupsApiTests(ModuleStoreTestCase):
self.assertEqual(response.status_code, 400)
def test_workgroups_detail_get_undefined(self):
test_uri = '/api/workgroups/123456789/'
test_uri = '{}123456789/'.format(self.test_workgroups_uri)
response = self.do_get(test_uri)
self.assertEqual(response.status_code, 404)
......
......@@ -125,7 +125,7 @@ if settings.FEATURES["ENABLE_MOBILE_REST_API"]:
# OPEN EDX API
if settings.FEATURES["API"]:
urlpatterns += (
url(r'^api/', include('api_manager.urls')),
url(r'^api/server/', include('api_manager.urls')),
)
# if settings.FEATURES.get("MULTIPLE_ENROLLMENT_ROLES"):
......
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