示例#1
0
    def updateStudent(self, studentId: int, name: str, group: int):
        """
        Updates the student data
        """

        student = self.findStudent(studentId)
        newStudent = copy(student)
        newStudent.setName(name)
        newStudent.setGroup(group)
        StudentValidator.validateStudent(newStudent)
        self.__studentRepository.updateItem(newStudent)
        self.__changesStack.beginCommit()
        self.__changesStack.addChange(ChangesStack.ItemRemoved(student))
        self.__changesStack.addChange(ChangesStack.ItemAdded(newStudent))
        self.__changesStack.endCommit()
示例#2
0
    def updateAssignment(self, assignmentId: int, description: str,
                         deadline: datetime.date):
        """
        Updates the assignment data
        """
        assignment = self.findAssignment(assignmentId)
        newAssignment = copy(assignment)
        newAssignment.setDescription(description)
        newAssignment.setDeadline(deadline)
        AssignmentValidator.validateAssignment(newAssignment)
        self.__assignmentRepository.updateItem(newAssignment)

        self.__changesStack.beginCommit()
        self.__changesStack.addChange(ChangesStack.ItemRemoved(assignment))
        self.__changesStack.addChange(ChangesStack.ItemAdded(newAssignment))
        self.__changesStack.endCommit()
示例#3
0
    def __init__(self, repositoryWrapper: RepositoryWrapper,
                 currentDate: date):
        self.__repositoryWrapper = repositoryWrapper
        self.__changesStack = ChangesStack(self)

        studentRepository = repositoryWrapper.getRepository(Student)
        gradeRepository = repositoryWrapper.getRepository(Grade)
        assignmentRepository = repositoryWrapper.getRepository(Assignment)

        self.__studentController = StudentController(studentRepository,
                                                     self.__changesStack,
                                                     self.cascadeDelete)
        self.__assignmentController = AssignmentController(
            repositoryWrapper.getRepository(Assignment), self.__changesStack,
            self.cascadeDelete)
        self.__gradeController = GradeController(studentRepository,
                                                 gradeRepository,
                                                 assignmentRepository,
                                                 currentDate,
                                                 self.__changesStack)
示例#4
0
    def addStudent(self, studentId: int, name: str, group: int) -> Student:
        """
        Adds a student to the repository
        """
        student = Student(studentId, name, group)
        StudentValidator.validateStudent(student)
        self.__studentRepository.addItem(student)
        self.__changesStack.addChange(ChangesStack.ItemAdded(student),
                                      newCommit=True)

        return student
示例#5
0
 def removeAssignment(self, assignmentId: int):
     """
     Removes an assignment from the repository
     """
     assignment = self.findAssignment(assignmentId)
     self.__assignmentRepository.deleteItem(assignment)
     self.__changesStack.beginCommit()
     self.__changesStack.addChange(ChangesStack.ItemRemoved(assignment))
     if self.__deleteCallback is not None:
         self.__deleteCallback(assignment)
     else:
         self.__changesStack.endCommit()
示例#6
0
    def addAssignment(self, assignmentId: int, description: str,
                      deadline: datetime.date) -> Assignment:
        """
        Adds an assignment to the repository
        """
        assignment = Assignment(assignmentId, description, deadline)
        AssignmentValidator.validateAssignment(assignment)
        self.__assignmentRepository.addItem(assignment)
        self.__changesStack.addChange(ChangesStack.ItemAdded(assignment),
                                      newCommit=True)

        return assignment
示例#7
0
 def cascadeDelete(self, item):
     if type(item) is Student or Assignment:
         gradeRepository = self.__repositoryWrapper.getRepository(Grade)
         gradeList = gradeRepository.getItems()
         linkedGrades = [
             grade for grade in gradeList
             if self.__gradeLinked(grade, item)
         ]
         for grade in linkedGrades:
             self.__changesStack.addChange(ChangesStack.ItemRemoved(grade))
             gradeRepository.deleteItem(grade)
         self.__changesStack.endCommit()
示例#8
0
    def grade(self, studentId: int, assignmentId: int, grade: int):
        """
        Grades the student at the given assignment
        :param studentId: The ID of the student
        :param assignmentId: The ID of the assignment
        :param grade: The grade of the assignment, an integer between 1 and 10
        :raises InvalidGrade: If an invalid grade is given
        :raises InvalidAssignmentId: If the student has not been given the assignment
        """
        self.findStudent(studentId)
        self.findAssignment(assignmentId)
        gradeObject = self.validateGrading(studentId, assignmentId)
        newGradeObject = copy(gradeObject)
        newGradeObject.setGrade(grade)
        GradeValidator.validateGrade(newGradeObject)
        self.__gradeRepository.updateItem(newGradeObject)

        self.__changesStack.beginCommit()
        self.__changesStack.addChange(ChangesStack.ItemRemoved(gradeObject))
        self.__changesStack.addChange(ChangesStack.ItemAdded(newGradeObject))
        self.__changesStack.endCommit()
示例#9
0
    def removeStudent(self, studentId: int):
        """
        Removes a student from the repository
        """
        student = self.findStudent(studentId)
        self.__studentRepository.deleteItem(student)

        self.__changesStack.beginCommit()
        self.__changesStack.addChange(ChangesStack.ItemRemoved(student))
        if self.__deleteCallback is not None:
            self.__deleteCallback(student)
        else:
            self.__changesStack.endCommit()
示例#10
0
 def assignToStudent(self, studentId, assignmentId, newCommit=True) -> Grade:
     """
     Gives an assignment to a student
     """
     self.findStudent(studentId)
     self.findAssignment(assignmentId)
     grade = Grade(studentId, assignmentId)
     self.__gradeRepository.addItem(grade)
     if newCommit:
         self.__changesStack.beginCommit()
     self.__changesStack.addChange(ChangesStack.ItemAdded(grade))
     if newCommit:
         self.__changesStack.endCommit()
     return grade
示例#11
0
class ControllerWrapper(ChangesHandler):
    def __init__(self, repositoryWrapper: RepositoryWrapper,
                 currentDate: date):
        self.__repositoryWrapper = repositoryWrapper
        self.__changesStack = ChangesStack(self)

        studentRepository = repositoryWrapper.getRepository(Student)
        gradeRepository = repositoryWrapper.getRepository(Grade)
        assignmentRepository = repositoryWrapper.getRepository(Assignment)

        self.__studentController = StudentController(studentRepository,
                                                     self.__changesStack,
                                                     self.cascadeDelete)
        self.__assignmentController = AssignmentController(
            repositoryWrapper.getRepository(Assignment), self.__changesStack,
            self.cascadeDelete)
        self.__gradeController = GradeController(studentRepository,
                                                 gradeRepository,
                                                 assignmentRepository,
                                                 currentDate,
                                                 self.__changesStack)

    def getStudentController(self) -> StudentController:
        return self.__studentController

    def getGradeController(self) -> GradeController:
        return self.__gradeController

    def getAssignmentController(self) -> AssignmentController:
        return self.__assignmentController

    def cascadeDelete(self, item):
        if type(item) is Student or Assignment:
            gradeRepository = self.__repositoryWrapper.getRepository(Grade)
            gradeList = gradeRepository.getItems()
            linkedGrades = [
                grade for grade in gradeList
                if self.__gradeLinked(grade, item)
            ]
            for grade in linkedGrades:
                self.__changesStack.addChange(ChangesStack.ItemRemoved(grade))
                gradeRepository.deleteItem(grade)
            self.__changesStack.endCommit()

    @staticmethod
    def __gradeLinked(grade: Grade, item):
        if type(item) is Student:
            return grade.getStudentId() == item.getStudentId()
        elif type(item) is Assignment:
            return grade.getAssignmentId() == item.getAssignmentId()

    def populateRepository(self):
        """
        Adds default data to the repository
        """
        self.__studentController.addRandomStudents(50)
        self.__assignmentController.addRandomAssignments(50)
        self.__gradeController.addRandomGrades(40, 40, 50)

        self.clearHistory()

    def handleChanges(self, changesList: List[ChangesStack.Change], reverse):
        """
        Handles changes provided by the ChangesStack
        """
        if reverse:
            functionDict = {
                ChangesStack.ItemAdded: self.removeItem,
                ChangesStack.ItemRemoved: self.addItem
            }
            iteratedList = reversed(changesList)
        else:
            functionDict = {
                ChangesStack.ItemAdded: self.addItem,
                ChangesStack.ItemRemoved: self.removeItem
            }
            iteratedList = changesList

        for change in iteratedList:
            itemType: Type[Union[ChangesStack.ItemAdded,
                                 ChangesStack.ItemRemoved]] = type(change)
            item = change.getItem()
            functionDict[itemType](item)

    def addItem(self, item):
        self.__repositoryWrapper.getRepository(type(item)).addItem(item)

    def removeItem(self, item):
        self.__repositoryWrapper.getRepository(type(item)).deleteItem(item)

    def clearHistory(self):
        self.__changesStack.clearStack()

    def undo(self):
        """
        Undoes the last operation
        """
        return self.__changesStack.undo()

    def redo(self):
        """
        Reverses the last undo operation
        """
        return self.__changesStack.redo()