def test_enroll_non_user_student( self, view_name, send_email, outbox_count, student_form_input_name, button_tuple, identifier): """ Tests the enrollment of a list of students who are not users yet. It tests 2 different views that use slightly different parameters, but that perform the same task. """ self.make_coach() ccx = self.make_ccx() course_key = CCXLocator.from_course_locator(self.course.id, ccx.id) outbox = self.get_outbox() self.assertEqual(outbox, []) url = reverse( view_name, kwargs={'course_id': course_key} ) data = { button_tuple[0]: button_tuple[1], student_form_input_name: u','.join([identifier, ]), } if send_email: data['email-students'] = 'Notify-students-by-email' response = self.client.post(url, data=data, follow=True) self.assertEqual(response.status_code, 200) # we were redirected to our current location self.assertEqual(len(response.redirect_chain), 1) self.assertIn(302, response.redirect_chain[0]) self.assertEqual(len(outbox), outbox_count) # some error messages are returned for one of the views only if view_name == 'ccx_manage_student' and not is_email(identifier): error_message = 'Could not find a user with name or email "{identifier}" '.format( identifier=identifier ) self.assertContains(response, error_message, status_code=200) if is_email(identifier): if send_email: self.assertIn(identifier, outbox[0].recipients()) self.assertTrue( CourseEnrollmentAllowed.objects.filter(course_id=course_key, email=identifier).exists() ) else: self.assertFalse( CourseEnrollmentAllowed.objects.filter(course_id=course_key, email=identifier).exists() )
def get_valid_input(request_data, ignore_missing=False): """ Helper function to validate the data sent as input and to build field based errors. Args: request_data (OrderedDict): the request data object ignore_missing (bool): whether or not to ignore fields missing from the input data Returns: tuple: a tuple of two dictionaries for valid input and field errors """ valid_input = {} field_errors = {} mandatory_fields = ('coach_email', 'display_name', 'max_students_allowed',) # checking first if all the fields are present and they are not null if not ignore_missing: for field in mandatory_fields: if field not in request_data: field_errors[field] = {'error_code': 'missing_field_{0}'.format(field)} if field_errors: return valid_input, field_errors # at this point I can assume that if the fields are present, # they must be validated, otherwise they can be skipped coach_email = request_data.get('coach_email') if coach_email is not None: if is_email(coach_email): valid_input['coach_email'] = coach_email else: field_errors['coach_email'] = {'error_code': 'invalid_coach_email'} elif 'coach_email' in request_data: field_errors['coach_email'] = {'error_code': 'null_field_coach_email'} display_name = request_data.get('display_name') if display_name is not None: if not display_name: field_errors['display_name'] = {'error_code': 'invalid_display_name'} else: valid_input['display_name'] = display_name elif 'display_name' in request_data: field_errors['display_name'] = {'error_code': 'null_field_display_name'} max_students_allowed = request_data.get('max_students_allowed') if max_students_allowed is not None: try: max_students_allowed = int(max_students_allowed) valid_input['max_students_allowed'] = max_students_allowed except (TypeError, ValueError): field_errors['max_students_allowed'] = {'error_code': 'invalid_max_students_allowed'} elif 'max_students_allowed' in request_data: field_errors['max_students_allowed'] = {'error_code': 'null_field_max_students_allowed'} return valid_input, field_errors
def get_valid_input(request_data, ignore_missing=False): """ Helper function to validate the data sent as input and to build field based errors. Args: request_data (OrderedDict): the request data object ignore_missing (bool): whether or not to ignore fields missing from the input data Returns: tuple: a tuple of two dictionaries for valid input and field errors """ valid_input = {} field_errors = {} mandatory_fields = ( 'coach_email', 'display_name', 'max_students_allowed', ) # checking first if all the fields are present and they are not null if not ignore_missing: for field in mandatory_fields: if field not in request_data: field_errors[field] = {'error_code': f'missing_field_{field}'} if field_errors: return valid_input, field_errors # at this point I can assume that if the fields are present, # they must be validated, otherwise they can be skipped coach_email = request_data.get('coach_email') if coach_email is not None: if is_email(coach_email): valid_input['coach_email'] = coach_email else: field_errors['coach_email'] = {'error_code': 'invalid_coach_email'} elif 'coach_email' in request_data: field_errors['coach_email'] = {'error_code': 'null_field_coach_email'} display_name = request_data.get('display_name') if display_name is not None: if not display_name: field_errors['display_name'] = { 'error_code': 'invalid_display_name' } else: valid_input['display_name'] = display_name elif 'display_name' in request_data: field_errors['display_name'] = { 'error_code': 'null_field_display_name' } max_students_allowed = request_data.get('max_students_allowed') if max_students_allowed is not None: try: max_students_allowed = int(max_students_allowed) valid_input['max_students_allowed'] = max_students_allowed except (TypeError, ValueError): field_errors['max_students_allowed'] = { 'error_code': 'invalid_max_students_allowed' } elif 'max_students_allowed' in request_data: field_errors['max_students_allowed'] = { 'error_code': 'null_field_max_students_allowed' } course_modules = request_data.get('course_modules') if course_modules is not None: if isinstance(course_modules, list): # de-duplicate list of modules course_modules = list(set(course_modules)) for course_module_id in course_modules: try: UsageKey.from_string(course_module_id) except InvalidKeyError: field_errors['course_modules'] = { 'error_code': 'invalid_course_module_keys' } break else: valid_input['course_modules'] = course_modules else: field_errors['course_modules'] = { 'error_code': 'invalid_course_module_list' } elif 'course_modules' in request_data: # case if the user actually passed null as input valid_input['course_modules'] = None return valid_input, field_errors