diff --git a/yaksh/fixtures/users_correct.csv b/yaksh/fixtures/users_correct.csv index 7b2a977b2..10739944a 100644 --- a/yaksh/fixtures/users_correct.csv +++ b/yaksh/fixtures/users_correct.csv @@ -1,2 +1,11 @@ -firstname, lastname, email -abc, abc, abc@xyz.com +firstname,lastname,email +abc, abc, abc0@xyz.com +abc, abc, abc1@xyz.com +abc, abc, abc2@xyz.com +abc, abc, abc3@xyz.com +abc, abc, abc4@xyz.com +abc, abc, abc5@xyz.com +abc, abc, abc6@xyz.com +abc, abc, abc7@xyz.com +abc, abc, abc8@xyz.com +abc, abc, abc9@xyz.com diff --git a/yaksh/test_views.py b/yaksh/test_views.py index 8c79085c5..c9bf7eb4a 100644 --- a/yaksh/test_views.py +++ b/yaksh/test_views.py @@ -3069,12 +3069,16 @@ def test_upload_users_with_correct_csv(self): csv_file.close() # Then - uploaded_user = User.objects.filter(email="abc@xyz.com") - self.assertEqual(uploaded_user.count(), 1) + up_user = User.objects.filter(email="abc0@xyz.com") + up_user9 = User.objects.filter(email="abc9@xyz.com") self.assertEqual(response.status_code, 302) messages = [m.message for m in get_messages(response.wsgi_request)] - self.assertIn("abc@xyz.com", messages[0]) - self.assertIn(uploaded_user.first(), self.user1_course.students.all()) + self.assertIn("abc0@xyz.com", messages[0]) + self.assertIn("abc9@xyz.com", messages[0]) + self.assertIn(up_user.first(), self.user1_course.students.all()) + self.assertIn(up_user9.first(), self.user1_course.students.all()) + self.assertTrue(Profile.objects.filter(user=up_user.first()).exists()) + self.assertTrue(Profile.objects.filter(user=up_user9.first()).exists()) def test_upload_existing_user(self): # Given @@ -3120,14 +3124,14 @@ def test_upload_same_user_multiple_course(self): data={'csv_file': upload_file2}) # Then - uploaded_users = User.objects.filter(email='abc@xyz.com') + uploaded_users = User.objects.filter(email='abc0@xyz.com') self.assertEqual(response1.status_code, 302) messages1 = [m.message for m in get_messages(response1.wsgi_request)] - self.assertIn('abc@xyz.com', messages1[0]) + self.assertIn('abc0@xyz.com', messages1[0]) self.assertEqual(response2.status_code, 302) messages2 = [m.message for m in get_messages(response2.wsgi_request)] - self.assertIn('abc@xyz.com', messages2[0]) - self.assertIn('abc@xyz.com', messages2[1]) + self.assertIn('abc0@xyz.com', messages2[0]) + self.assertIn('abc0@xyz.com', messages2[1]) self.assertTrue( self.user1_course.students.filter( id=uploaded_users.first().id).exists() @@ -3190,8 +3194,8 @@ def test_upload_users_add_update_reject(self): self.assertIn(user, self.user1_course.get_rejected()) self.assertEqual(response.status_code, 302) messages = [m.message for m in get_messages(response.wsgi_request)] - self.assertIn('test2', messages[2]) - self.assertIn('User rejected', messages[2]) + self.assertIn('test2', messages[0]) + self.assertIn('User rejected', messages[0]) def test_upload_users_with_wrong_csv(self): # Given diff --git a/yaksh/views.py b/yaksh/views.py index 4a6f462d2..58dc39527 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -2466,6 +2466,9 @@ def upload_users(request, course_id): def _read_user_csv(request, reader, course): fields = reader.fieldnames counter = 0 + user_objs = [] + profile_objs = [] + profiles_defaults = [] for row in reader: counter += 1 (username, email, first_name, last_name, password, roll_no, institute, @@ -2491,21 +2494,20 @@ def _read_user_csv(request, reader, course): continue user_defaults = {'email': email, 'first_name': first_name, 'last_name': last_name} - user, created = _create_or_update_user(username, password, - user_defaults) + user_objs.append(_create_or_update_user(username, password, + user_defaults)) profile_defaults = {'institute': institute, 'roll_number': roll_no, 'department': department, 'is_email_verified': True} - _create_or_update_profile(user, profile_defaults) - if created: - state = "Added" - course.students.add(user) - else: - state = "Updated" - messages.info(request, "{0} -- {1} -- User {2} Successfully".format( - counter, user.username, state)) + profiles_defaults.append(profile_defaults) if counter == 0: messages.warning(request, "No rows in the CSV file") + else: + course.students.add(*user_objs) + for (user, profile_values) in zip(user_objs, profiles_defaults): + profile_objs.append(_create_or_update_profile(user, profile_values)) + Profile.objects.bulk_create(profile_objs) + messages.info(request, " {0}-- Users Added Successfully".format(user_objs)) def _get_csv_values(row, fields): @@ -2553,11 +2555,13 @@ def _create_or_update_user(username, password, defaults): defaults=defaults) user.set_password(password) user.save() - return user, created + return user def _create_or_update_profile(user, defaults): - Profile.objects.update_or_create(user=user, defaults=defaults) + defaults['user'] = user + profile = Profile(**defaults) + return profile @login_required