Search in sources :

Example 1 with EnrollException

use of teammates.common.exception.EnrollException in project teammates by TEAMMATES.

the class InstructorCourseEnrollSaveAction method execute.

@Override
public ActionResult execute() throws EntityDoesNotExistException {
    String courseId = getRequestParamValue(Const.ParamsNames.COURSE_ID);
    Assumption.assertPostParamNotNull(Const.ParamsNames.COURSE_ID, courseId);
    String studentsInfo = getRequestParamValue(Const.ParamsNames.STUDENTS_ENROLLMENT_INFO);
    String sanitizedStudentsInfo = SanitizationHelper.sanitizeForHtml(studentsInfo);
    Assumption.assertPostParamNotNull(Const.ParamsNames.STUDENTS_ENROLLMENT_INFO, studentsInfo);
    InstructorAttributes instructor = logic.getInstructorForGoogleId(courseId, account.googleId);
    gateKeeper.verifyAccessible(instructor, logic.getCourse(courseId), Const.ParamsNames.INSTRUCTOR_PERMISSION_MODIFY_STUDENT);
    /* Process enrollment list and setup data for page result */
    try {
        List<StudentAttributes>[] students = enrollAndProcessResultForDisplay(studentsInfo, courseId);
        boolean hasSection = hasSections(students);
        InstructorCourseEnrollResultPageData pageData = new InstructorCourseEnrollResultPageData(account, sessionToken, courseId, students, hasSection, studentsInfo);
        statusToAdmin = "Students Enrolled in Course <span class=\"bold\">[" + courseId + "]:</span><br>" + sanitizedStudentsInfo.replace("\n", "<br>");
        return createShowPageResult(Const.ViewURIs.INSTRUCTOR_COURSE_ENROLL_RESULT, pageData);
    } catch (EnrollException | InvalidParametersException e) {
        setStatusForException(e);
        statusToAdmin += "<br>Enrollment string entered by user:<br>" + sanitizedStudentsInfo.replace("\n", "<br>");
        InstructorCourseEnrollPageData pageData = new InstructorCourseEnrollPageData(account, sessionToken, courseId, studentsInfo);
        return createShowPageResult(Const.ViewURIs.INSTRUCTOR_COURSE_ENROLL, pageData);
    } catch (EntityAlreadyExistsException e) {
        setStatusForException(e);
        statusToUser.add(new StatusMessage("The enrollment failed, possibly because some students were re-enrolled before " + "the previous enrollment action was still being processed by TEAMMATES database " + "servers. Please try again after about 10 minutes. If the problem persists, " + "please contact TEAMMATES support", StatusMessageColor.DANGER));
        InstructorCourseEnrollPageData pageData = new InstructorCourseEnrollPageData(account, sessionToken, courseId, studentsInfo);
        log.severe("Entity already exists exception occurred when updating student: " + e.getMessage());
        return createShowPageResult(Const.ViewURIs.INSTRUCTOR_COURSE_ENROLL, pageData);
    }
}
Also used : EnrollException(teammates.common.exception.EnrollException) InstructorCourseEnrollResultPageData(teammates.ui.pagedata.InstructorCourseEnrollResultPageData) EntityAlreadyExistsException(teammates.common.exception.EntityAlreadyExistsException) InstructorCourseEnrollPageData(teammates.ui.pagedata.InstructorCourseEnrollPageData) ArrayList(java.util.ArrayList) List(java.util.List) InvalidParametersException(teammates.common.exception.InvalidParametersException) InstructorAttributes(teammates.common.datatransfer.attributes.InstructorAttributes) StatusMessage(teammates.common.util.StatusMessage)

Example 2 with EnrollException

use of teammates.common.exception.EnrollException in project teammates by TEAMMATES.

the class StudentsLogic method enrollStudents.

private CourseEnrollmentResult enrollStudents(String enrollLines, String courseId, boolean hasDocument) throws EntityDoesNotExistException, EnrollException, InvalidParametersException, EntityAlreadyExistsException {
    if (!coursesLogic.isCoursePresent(courseId)) {
        throw new EntityDoesNotExistException("Course does not exist :" + courseId);
    }
    if (enrollLines.isEmpty()) {
        throw new EnrollException(Const.StatusMessages.ENROLL_LINE_EMPTY);
    }
    List<StudentAttributes> studentList = createStudents(enrollLines, courseId);
    ArrayList<StudentAttributes> returnList = new ArrayList<>();
    ArrayList<StudentEnrollDetails> enrollmentList = new ArrayList<>();
    verifyIsWithinSizeLimitPerEnrollment(studentList);
    validateSectionsAndTeams(studentList, courseId);
    // enroll all students
    for (StudentAttributes student : studentList) {
        StudentEnrollDetails enrollmentDetails;
        enrollmentDetails = enrollStudent(student, hasDocument);
        student.updateStatus = enrollmentDetails.updateStatus;
        enrollmentList.add(enrollmentDetails);
        returnList.add(student);
    }
    // add to return list students not included in the enroll list.
    List<StudentAttributes> studentsInCourse = getStudentsForCourse(courseId);
    for (StudentAttributes student : studentsInCourse) {
        if (!isInEnrollList(student, returnList)) {
            student.updateStatus = StudentUpdateStatus.NOT_IN_ENROLL_LIST;
            returnList.add(student);
        }
    }
    return new CourseEnrollmentResult(returnList, enrollmentList);
}
Also used : EnrollException(teammates.common.exception.EnrollException) CourseEnrollmentResult(teammates.common.datatransfer.CourseEnrollmentResult) ArrayList(java.util.ArrayList) StudentEnrollDetails(teammates.common.datatransfer.StudentEnrollDetails) StudentAttributes(teammates.common.datatransfer.attributes.StudentAttributes) EntityDoesNotExistException(teammates.common.exception.EntityDoesNotExistException)

Example 3 with EnrollException

use of teammates.common.exception.EnrollException in project teammates by TEAMMATES.

the class StudentsLogic method createStudents.

/**
 * Builds {@code studentList} from user input {@code lines}. All empty lines or lines with only white spaces will
 * be skipped.
 *
 * @param lines the enrollment lines entered by the instructor.
 * @throws EnrollException if some of the student instances created are invalid. The exception message contains
 *         invalidity info for all invalid student instances in HTML format.
 */
public List<StudentAttributes> createStudents(String lines, String courseId) throws EnrollException {
    List<String> invalidityInfo = new ArrayList<>();
    String[] linesArray = lines.split(System.lineSeparator());
    List<StudentAttributes> studentList = new ArrayList<>();
    StudentAttributesFactory saf = new StudentAttributesFactory(linesArray[0]);
    for (int i = 1; i < linesArray.length; i++) {
        String line = linesArray[i];
        String sanitizedLine = SanitizationHelper.sanitizeForHtml(line);
        if (StringHelper.isWhiteSpace(line)) {
            continue;
        }
        try {
            StudentAttributes student = saf.makeStudent(line, courseId);
            if (!student.isValid()) {
                invalidityInfo.add(invalidStudentInfo(sanitizedLine, student));
            }
            int duplicateEmailIndex = getDuplicateEmailIndex(student.email, studentList);
            if (duplicateEmailIndex != -1) {
                invalidityInfo.add(duplicateEmailInfo(sanitizedLine, linesArray[duplicateEmailIndex + 1]));
            }
            studentList.add(student);
        } catch (EnrollException e) {
            invalidityInfo.add(enrollExceptionInfo(sanitizedLine, e.getMessage()));
        }
    }
    if (!invalidityInfo.isEmpty()) {
        throw new EnrollException(StringHelper.toString(invalidityInfo, "<br>"));
    }
    return studentList;
}
Also used : EnrollException(teammates.common.exception.EnrollException) ArrayList(java.util.ArrayList) StudentAttributesFactory(teammates.common.datatransfer.StudentAttributesFactory) StudentAttributes(teammates.common.datatransfer.attributes.StudentAttributes)

Example 4 with EnrollException

use of teammates.common.exception.EnrollException in project teammates by TEAMMATES.

the class StudentsLogicTest method testEnrollStudents.

private void testEnrollStudents() throws Exception {
    String instructorId = "instructorForEnrollTesting";
    String courseIdForEnrollTest = "courseForEnrollTest";
    String instructorEmail = "instructor@email.tmt";
    StudentProfileAttributes profileAttributes = StudentProfileAttributes.builder(instructorId).withShortName("Ins1").withGender("male").build();
    AccountAttributes accountToAdd = AccountAttributes.builder().withGoogleId(instructorId).withName("Instructor 1").withEmail(instructorEmail).withInstitute("TEAMMATES Test Institute 1").withIsInstructor(true).withStudentProfileAttributes(profileAttributes).build();
    accountsLogic.createAccount(accountToAdd);
    coursesLogic.createCourseAndInstructor(instructorId, courseIdForEnrollTest, "Course for Enroll Testing", "UTC");
    FeedbackSessionsLogic fsLogic = FeedbackSessionsLogic.inst();
    FeedbackSessionAttributes fsAttr = FeedbackSessionAttributes.builder("newFeedbackSessionName", courseIdForEnrollTest, instructorEmail).withInstructions(new Text("default instructions")).withCreatedTime(Instant.now()).withStartTime(TimeHelperExtension.getInstantHoursOffsetFromNow(2)).withEndTime(TimeHelperExtension.getInstantHoursOffsetFromNow(5)).withSessionVisibleFromTime(TimeHelperExtension.getInstantHoursOffsetFromNow(1)).withResultsVisibleFromTime(TimeHelperExtension.getInstantHoursOffsetFromNow(6)).withTimeZone(ZoneId.of("Asia/Singapore")).withGracePeriodMinutes(0).withFeedbackSessionType(FeedbackSessionType.PRIVATE).withOpeningEmailEnabled(false).withClosingEmailEnabled(false).withPublishedEmailEnabled(false).build();
    fsLogic.createFeedbackSession(fsAttr);
    ______TS("all valid students, but contains blank lines and trailing spaces");
    String headerLine = "team | name | email | comment";
    String line0 = "t1   |  n1   |   e1@g  |   c1";
    String line1 = " t2|  n2|  e2@g|  c2";
    String line2 = "\u00A0t3  |n3|  e3@g|c3  ";
    String line3 = "t4|n4|  e4@g|c4";
    String line4 = "t5|  n5|e5@g  |c5";
    String lines = headerLine + System.lineSeparator() + line0 + System.lineSeparator() + line1 + System.lineSeparator() + line2 + System.lineSeparator() + "  \t \t \t \t           " + System.lineSeparator() + line3 + System.lineSeparator() + System.lineSeparator() + line4 + System.lineSeparator() + "    " + System.lineSeparator() + System.lineSeparator();
    CourseEnrollmentResult enrollResults = studentsLogic.enrollStudentsWithoutDocument(lines, courseIdForEnrollTest);
    StudentAttributesFactory saf = new StudentAttributesFactory(headerLine);
    assertEquals(5, enrollResults.studentList.size());
    assertEquals(5, studentsLogic.getStudentsForCourse(courseIdForEnrollTest).size());
    // Test enroll result
    line0 = "t1|n1|e1@g|c1";
    verifyEnrollmentResultForStudent(saf.makeStudent(line0, courseIdForEnrollTest), enrollResults.studentList.get(0), StudentUpdateStatus.NEW);
    verifyEnrollmentResultForStudent(saf.makeStudent(line1, courseIdForEnrollTest), enrollResults.studentList.get(1), StudentUpdateStatus.NEW);
    verifyEnrollmentResultForStudent(saf.makeStudent(line4, courseIdForEnrollTest), enrollResults.studentList.get(4), StudentUpdateStatus.NEW);
    CourseDetailsBundle courseDetails = coursesLogic.getCourseSummary(courseIdForEnrollTest);
    assertEquals(5, courseDetails.stats.unregisteredTotal);
    ______TS("includes a mix of unmodified, modified, and new");
    String modifiedLine2 = "t3|modified name|e3@g|c3";
    String line5 = "t6|n6|e6@g|c6";
    lines = headerLine + System.lineSeparator() + line0 + System.lineSeparator() + modifiedLine2 + System.lineSeparator() + line1 + System.lineSeparator() + line5;
    enrollResults = studentsLogic.enrollStudentsWithoutDocument(lines, courseIdForEnrollTest);
    assertEquals(6, enrollResults.studentList.size());
    assertEquals(6, studentsLogic.getStudentsForCourse(courseIdForEnrollTest).size());
    verifyEnrollmentResultForStudent(saf.makeStudent(line0, courseIdForEnrollTest), enrollResults.studentList.get(0), StudentUpdateStatus.UNMODIFIED);
    verifyEnrollmentResultForStudent(saf.makeStudent(modifiedLine2, courseIdForEnrollTest), enrollResults.studentList.get(1), StudentUpdateStatus.MODIFIED);
    verifyEnrollmentResultForStudent(saf.makeStudent(line1, courseIdForEnrollTest), enrollResults.studentList.get(2), StudentUpdateStatus.UNMODIFIED);
    verifyEnrollmentResultForStudent(saf.makeStudent(line5, courseIdForEnrollTest), enrollResults.studentList.get(3), StudentUpdateStatus.NEW);
    assertEquals(StudentUpdateStatus.NOT_IN_ENROLL_LIST, enrollResults.studentList.get(4).updateStatus);
    assertEquals(StudentUpdateStatus.NOT_IN_ENROLL_LIST, enrollResults.studentList.get(5).updateStatus);
    ______TS("includes an incorrect line");
    // no changes should be done to the database
    String incorrectLine = "incorrectly formatted line";
    lines = headerLine + System.lineSeparator() + "t7|n7|e7@g|c7" + System.lineSeparator() + incorrectLine + System.lineSeparator() + line2 + System.lineSeparator() + line3;
    try {
        enrollResults = studentsLogic.enrollStudentsWithoutDocument(lines, courseIdForEnrollTest);
        signalFailureToDetectException("Did not throw exception for incorrectly formatted line");
    } catch (EnrollException e) {
        assertTrue(e.getMessage().contains(incorrectLine));
    }
    assertEquals(6, studentsLogic.getStudentsForCourse(courseIdForEnrollTest).size());
    ______TS("null parameters");
    try {
        studentsLogic.enrollStudentsWithoutDocument("a|b|c|d", null);
        signalFailureToDetectException();
    } catch (AssertionError ae) {
        assertEquals(Const.StatusCodes.DBLEVEL_NULL_INPUT, ae.getMessage());
    }
    ______TS("same student added, modified and unmodified");
    StudentProfileAttributes studentAttributes = StudentProfileAttributes.builder("tes.instructor").withShortName("Ins 1").withGender("male").build();
    accountToAdd = AccountAttributes.builder().withGoogleId("tes.instructor").withName("Instructor 1").withEmail("instructor@email.tmt").withInstitute("TEAMMATES Test Institute 1").withIsInstructor(true).withStudentProfileAttributes(studentAttributes).build();
    accountsLogic.createAccount(accountToAdd);
    coursesLogic.createCourseAndInstructor("tes.instructor", "tes.course", "TES Course", "UTC");
    String line = headerLine + System.lineSeparator() + "t8|n8|e8@g|c1";
    enrollResults = studentsLogic.enrollStudentsWithoutDocument(line, "tes.course");
    assertEquals(1, enrollResults.studentList.size());
    assertEquals(StudentUpdateStatus.NEW, enrollResults.studentList.get(0).updateStatus);
    line = headerLine + System.lineSeparator() + "t8|n8a|e8@g|c1";
    enrollResults = studentsLogic.enrollStudentsWithoutDocument(line, "tes.course");
    assertEquals(1, enrollResults.studentList.size());
    assertEquals(StudentUpdateStatus.MODIFIED, enrollResults.studentList.get(0).updateStatus);
    line = headerLine + System.lineSeparator() + "t8|n8a|e8@g|c1";
    enrollResults = studentsLogic.enrollStudentsWithoutDocument(line, "tes.course");
    assertEquals(1, enrollResults.studentList.size());
    assertEquals(StudentUpdateStatus.UNMODIFIED, enrollResults.studentList.get(0).updateStatus);
    ______TS("duplicated emails");
    String lineT9 = "t9|n9|e9@g|c9";
    String lineT10 = "t10|n10|e9@g|c10";
    lines = headerLine + System.lineSeparator() + lineT9 + System.lineSeparator() + lineT10;
    try {
        studentsLogic.enrollStudentsWithoutDocument(lines, "tes.course");
    } catch (EnrollException e) {
        assertTrue(e.getMessage().contains(lineT10));
        AssertHelper.assertContains("Same email address as the student in line \"" + lineT9 + "\"", e.getMessage());
    }
    ______TS("invalid course id");
    String enrollLines = headerLine + System.lineSeparator();
    String invalidCourseId = "invalidCourseId";
    try {
        studentsLogic.enrollStudentsWithoutDocument(enrollLines, invalidCourseId);
        signalFailureToDetectException();
    } catch (EntityDoesNotExistException e) {
        ignoreExpectedException();
    }
    ______TS("empty enroll line");
    try {
        studentsLogic.enrollStudentsWithoutDocument("", courseIdForEnrollTest);
        signalFailureToDetectException();
    } catch (EnrollException e) {
        ignoreExpectedException();
    }
    ______TS("invalidity info in enroll line");
    enrollLines = headerLine + System.lineSeparator() + "invalidline0\ninvalidline1\n";
    try {
        studentsLogic.enrollStudentsWithoutDocument(enrollLines, courseIdForEnrollTest);
        signalFailureToDetectException();
    } catch (EnrollException e) {
        ignoreExpectedException();
    }
}
Also used : FeedbackSessionAttributes(teammates.common.datatransfer.attributes.FeedbackSessionAttributes) EnrollException(teammates.common.exception.EnrollException) AccountAttributes(teammates.common.datatransfer.attributes.AccountAttributes) CourseDetailsBundle(teammates.common.datatransfer.CourseDetailsBundle) FeedbackSessionsLogic(teammates.logic.core.FeedbackSessionsLogic) CourseEnrollmentResult(teammates.common.datatransfer.CourseEnrollmentResult) Text(com.google.appengine.api.datastore.Text) StudentAttributesFactory(teammates.common.datatransfer.StudentAttributesFactory) StudentProfileAttributes(teammates.common.datatransfer.attributes.StudentProfileAttributes) EntityDoesNotExistException(teammates.common.exception.EntityDoesNotExistException)

Example 5 with EnrollException

use of teammates.common.exception.EnrollException in project teammates by TEAMMATES.

the class StudentsLogicTest method testValidateSections.

private void testValidateSections() throws Exception {
    CourseAttributes typicalCourse1 = dataBundle.courses.get("typicalCourse1");
    String courseId = typicalCourse1.getId();
    ______TS("Typical case");
    List<StudentAttributes> studentList = new ArrayList<>();
    studentList.add(StudentAttributes.builder(courseId, "New Student", "emailNew@com").withSection("Section 3").withTeam("Team 1.3").withComments("").build());
    studentList.add(StudentAttributes.builder(courseId, "student2 In Course1", "student2InCourse1@gmail.tmt").withSection("Section 2").withTeam("Team 1.4").withComments("").build());
    studentsLogic.validateSectionsAndTeams(studentList, courseId);
    ______TS("Failure case: invalid section");
    studentList = new ArrayList<>();
    for (int i = 0; i < 100; i++) {
        StudentAttributes addedStudent = StudentAttributes.builder(courseId, "Name " + i, "email@com" + i).withSection("Section 1").withTeam("Team " + i).withComments("cmt" + i).build();
        studentList.add(addedStudent);
    }
    try {
        studentsLogic.validateSectionsAndTeams(studentList, courseId);
    } catch (EnrollException e) {
        assertEquals(String.format(Const.StatusMessages.SECTION_QUOTA_EXCEED, "Section 1"), e.getMessage());
    }
    ______TS("Failure case: invalid team");
    studentList = new ArrayList<>();
    studentList.add(StudentAttributes.builder(courseId, "New Student", "newemail@com").withSection("Section 2").withTeam("Team 1.1").withComments("").build());
    try {
        studentsLogic.validateSectionsAndTeams(studentList, courseId);
    } catch (EnrollException e) {
        assertEquals(String.format(Const.StatusMessages.TEAM_INVALID_SECTION_EDIT, "Team 1.1</td></div>'\"") + "Please use the enroll page to edit multiple students", e.getMessage());
    }
}
Also used : EnrollException(teammates.common.exception.EnrollException) ArrayList(java.util.ArrayList) StudentAttributes(teammates.common.datatransfer.attributes.StudentAttributes) CourseAttributes(teammates.common.datatransfer.attributes.CourseAttributes)

Aggregations

EnrollException (teammates.common.exception.EnrollException)8 StudentAttributes (teammates.common.datatransfer.attributes.StudentAttributes)6 ArrayList (java.util.ArrayList)5 EntityDoesNotExistException (teammates.common.exception.EntityDoesNotExistException)4 CourseEnrollmentResult (teammates.common.datatransfer.CourseEnrollmentResult)3 StudentAttributesFactory (teammates.common.datatransfer.StudentAttributesFactory)3 InstructorAttributes (teammates.common.datatransfer.attributes.InstructorAttributes)3 InvalidParametersException (teammates.common.exception.InvalidParametersException)3 StatusMessage (teammates.common.util.StatusMessage)3 List (java.util.List)2 FeedbackSessionAttributes (teammates.common.datatransfer.attributes.FeedbackSessionAttributes)2 EntityAlreadyExistsException (teammates.common.exception.EntityAlreadyExistsException)2 InstructorCourseEnrollPageData (teammates.ui.pagedata.InstructorCourseEnrollPageData)2 InstructorCourseEnrollResultPageData (teammates.ui.pagedata.InstructorCourseEnrollResultPageData)2 Text (com.google.appengine.api.datastore.Text)1 Comparator (java.util.Comparator)1 Test (org.testng.annotations.Test)1 CourseDetailsBundle (teammates.common.datatransfer.CourseDetailsBundle)1 StudentEnrollDetails (teammates.common.datatransfer.StudentEnrollDetails)1 StudentUpdateStatus (teammates.common.datatransfer.StudentUpdateStatus)1