Fixed multiple CourseAccessRole error on publish

This commit is contained in:
Asad Azam
2017-12-21 16:05:33 +05:00
parent 72bb440dc5
commit 1f5134b5ef
2 changed files with 71 additions and 21 deletions

View File

@@ -58,11 +58,11 @@ class CourseRunTeamSerializerMixin(serializers.Serializer):
# when using `bulk_create` with existing data. Given the relatively small number of team members
# in a course, this is not worth optimizing at this time.
for member in team:
CourseAccessRole.objects.update_or_create(
CourseAccessRole.objects.get_or_create(
course_id=instance.id,
org=instance.id.org,
user=User.objects.get(username=member['user']),
defaults={'role': member['role']}
role=member['role']
)

View File

@@ -39,7 +39,8 @@ class CourseRunViewSetTests(ModuleStoreTestCase):
def assert_access_role(self, course_run, user, role):
# An error will be raised if the endpoint did not create the role
CourseAccessRole.objects.get(course_id=course_run.id, org=course_run.id.org, user=user, role=role)
assert CourseAccessRole.objects.filter(
course_id=course_run.id, org=course_run.id.org, user=user, role=role).count() == 1
def assert_course_access_role_count(self, course_run, expected):
assert CourseAccessRole.objects.filter(course_id=course_run.id).count() == expected
@@ -138,42 +139,91 @@ class CourseRunViewSetTests(ModuleStoreTestCase):
assert response.status_code == 400
assert response.data == {'team': [{'user': ['Object with username=test-user does not exist.']}]}
def test_partial_update(self):
role = 'staff'
def test_update_with_pacing_type(self):
"""
Test that update run updates the pacing type
"""
start = datetime.datetime.now(pytz.UTC).replace(microsecond=0)
course_run = CourseFactory(start=start, end=None, enrollment_start=None, enrollment_end=None, self_paced=False)
data = {
'pacing_type': 'self_paced',
}
course_run_detail_url = reverse('api:v1:course_run-detail', kwargs={'pk': str(course_run.id)})
response = self.client.patch(course_run_detail_url, data, format='json')
assert response.status_code == 200
course_run = modulestore().get_course(course_run.id)
assert course_run.self_paced is True
self.assert_course_run_schedule(course_run, start, None, None, None)
def test_update_with_instructor_role(self):
"""
Test that update creates a new instructor role only if it does not exist
"""
instructor_role = 'instructor'
start = datetime.datetime.now(pytz.UTC).replace(microsecond=0)
new_user = UserFactory()
course_run = CourseFactory(start=start, end=None, enrollment_start=None, enrollment_end=None, self_paced=False)
assert CourseAccessRole.objects.filter(course_id=course_run.id).count() == 0
data = {
'team': [
{
'user': new_user.username,
'role': instructor_role,
},
],
'pacing_type': 'self_paced',
}
course_run_detail_url = reverse('api:v1:course_run-detail', kwargs={'pk': str(course_run.id)})
response = self.client.patch(course_run_detail_url, data, format='json')
assert response.status_code == 200
self.assert_access_role(course_run, new_user, instructor_role)
self.assert_course_access_role_count(course_run, 1)
# Requesting again with the same data should not create new instructor role
response = self.client.patch(course_run_detail_url, data, format='json')
assert response.status_code == 200
self.assert_access_role(course_run, new_user, instructor_role)
self.assert_course_access_role_count(course_run, 1)
def test_update_with_multiple_roles(self):
"""
Test that update creates an instructor role for a user in addition to any other role/roles he already has
"""
staff_role = 'staff'
instructor_role = 'instructor'
start = datetime.datetime.now(pytz.UTC).replace(microsecond=0)
course_run = CourseFactory(start=start, end=None, enrollment_start=None, enrollment_end=None, self_paced=False)
# The request should only update or create new team members
existing_user = UserFactory()
CourseAccessRole.objects.create(course_id=course_run.id, org=course_run.id.org, role=role, user=existing_user)
CourseAccessRole.objects.create(
course_id=course_run.id, org=course_run.id.org, role=staff_role, user=existing_user
)
# existing_user already has a staff role in the course
# The request should create an additional instructor role for existing_user
new_user = UserFactory()
CourseAccessRole.objects.create(course_id=course_run.id, org=course_run.id.org, role=role, user=new_user)
assert CourseAccessRole.objects.filter(course_id=course_run.id).count() == 2
assert CourseAccessRole.objects.filter(course_id=course_run.id).count() == 1
data = {
'team': [
{
'user': existing_user.username,
'role': role,
'role': instructor_role,
},
{
'user': new_user.username,
'role': role,
'role': instructor_role,
},
],
'pacing_type': 'self_paced',
}
url = reverse('api:v1:course_run-detail', kwargs={'pk': str(course_run.id)})
response = self.client.patch(url, data, format='json')
course_run_detail_url = reverse('api:v1:course_run-detail', kwargs={'pk': str(course_run.id)})
response = self.client.patch(course_run_detail_url, data, format='json')
assert response.status_code == 200
self.assert_access_role(course_run, existing_user, role)
self.assert_access_role(course_run, new_user, role)
self.assert_course_access_role_count(course_run, 2)
course_run = modulestore().get_course(course_run.id)
assert course_run.self_paced is True
self.assert_course_run_schedule(course_run, start, None, None, None)
self.assert_access_role(course_run, existing_user, instructor_role)
self.assert_access_role(course_run, new_user, instructor_role)
self.assert_course_access_role_count(course_run, 3)
@ddt.data(
('instructor_paced', False),