def getDetail(project_id):
        # Load project from internal database
        project = models.Project.query.filter_by(id=project_id).first()

        # Check if project was found
        if not project:
            validation = ValidationResult(dict())
            validation.addError("Project not in internal database")

            return validation

        # Init result cloud api
        resultCloud = ResultCloud(config.RESULT_CLOUD_API)
        
        # Try to load project
        try:
            response = resultCloud.get_project(project.ext_id)
        except:
            # Prepare validation and return result
            validation = ValidationResult(models.serialize(project))
            return validation

        # Init result
        result = models.serialize(project)

        # If there was a response, get submissions
        if response:
            result["submissions"] = resultCloud.last_response['Result']['Submissions']

        # Prepare validation and return result
        validation = ValidationResult(result)
        return validation
    def exists(project_id):
        # Init validation
        validation = ValidationResult(dict())

        # Check for file
        validation.data["exists"] = ModelService._exists("project_" + project_id)

        # Return validation
        return validation
    def poll():
        # Init validation
        validation = ValidationResult({"State": ""})

        # Check if session is set
        if config.POLLING_KEY not in app.config:
            StateService.reset()        

        validation.data["State"] = app.config[config.POLLING_KEY]
        

        # Return validation
        return validation
    def predictForRevision(project_id, revision):
        # Init validation
        validation = ValidationResult([]);

        # Load project
        projectValidation = ProjectService.getDetail(project_id);

        # Check project validation
        if not validation.append(projectValidation):
            return validation

        # Get changes of given revision
        submissionValidation = RepositoryService.getRevisionDifference(projectValidation.data["repository"], revision + "^", revision)

        # Check submission validation
        if not validation.append(submissionValidation):
            return validation        

        # Make prediction
        return ModelService.predict(project_id, submissionValidation.data)
    def getList():
        # Init api handler
        resultCloud = ResultCloud(config.RESULT_CLOUD_API)

        # Try to load projects from result cloud
        try:
            response  = resultCloud.get_git_projects()   
        except:
            # Load internal projects
            internalProjects = models.Project.query.all()

            # Prepare validation and return result
            validation =  ValidationResult([models.serialize(project) for project in internalProjects])
            return validation
 
        # Check if the request was successful
        if not response:
            # Load failed
            validationResult = ValidationResult(dict())
            validationResult.addError("Failed to load projects from ResultCloud repository")

            # Return result
            return validationResult
        else:
            # Load was successful
            externalProjects = resultCloud.last_response['Result']

            # Merge new projects
            for project in externalProjects:
                if not models.Project.query.filter_by(ext_id=project["Id"]).first():
                    new_project = models.Project(project["Id"], project["Name"], project["GitRepository"])
                    ProjectService.save(new_project)

            # Load internal projects
            internalProjects = models.Project.query.all()

            # Prepare validation and return result
            validation =  ValidationResult([models.serialize(project) for project in internalProjects])
            return validation