Пример #1
0
 def test_shell_invoke(self):
     r = invoke_script(settings.PREPARE_SCRIPT, {})
     self.assertEqual(1, r["code"])
     r = invoke_script(settings.PREPARE_SCRIPT, {
         "course_key": "foo",
         "dir": settings.SUBMISSION_PATH
     })
     self.assertEqual(0, r["code"])
Пример #2
0
def expaca(course, exercise, action, submission_dir):
    '''
    Executes third party expaca testing application.
    '''
    r = invoke_script(settings.EXPACA_SCRIPT,
        _collect_args(("rule_file", "model_dir", "user_dir"), action),
        submission_dir)

    # Expaca should always return 0.
    if r["code"] != 0:
        raise ConfigError("Expaca return code not zero!\nMore information: %s"
            % (str(r)))
    out = r["out"]
    points = 0
    max_points = 0

    # Find points in the XML.
    b = out.find("<TotalPoints>")
    if b >= 0:
        e = out.find("</TotalPoints>", b + 13)
        points = int(out[b + 13 : e])
    b = out.find("<TotalMaxpoints>")
    if b >= 0:
        e = out.find("</TotalMaxpoints>", b + 16)
        max_points = int(out[b + 16 : e])

    # Transform the feedback if configured.
    if "xslt_transform" in action:
        out = transform(out, "%s/%s" % (settings.BASE_DIR,
            action["xslt_transform"]))

    return { "points": points, "max_points": max_points, "out": out,
        "err": r["err"], "stop": False }
Пример #3
0
def prepare(course, exercise, action, submission_dir, user_ids='', submission_number=1):
    '''
    Runs the preparation script for the submitted files.

    @type user_ids: C{str}
    @param user_ids: user ID(s) of the submitter(s) as string (format "1", "1-2-3")
    @type submission_number: C{int}
    @param submission_number: ordinal number of the submission
    '''
    args = {
        "course_key": course["key"],
        "exercise_key": exercise["key"],
    }
    cp_personal_error = None
    if "personalized" in exercise and exercise["personalized"]:
        args["userid"] = user_ids
        args["gen_instance_path"] = select_generated_exercise_instance(course, exercise, user_ids, submission_number)
        if not settings.ENABLE_PERSONAL_DIRECTORIES and "cp_personal" in action:
            cp_personal_error = 'settings.ENABLE_PERSONAL_DIRECTORIES is False but action grader.actions.prepare has "cp_personal" field'
            LOGGER.error(cp_personal_error)

    result = _boolean(invoke_script(settings.PREPARE_SCRIPT,
        _collect_args(("attachment_pull", "attachment_unzip", "unzip",
            "charset", "cp_exercises", "cp", "mv", "cp_personal", "cp_generated"),
            action, args),
        submission_dir))
    if cp_personal_error:
        # add the error to the feedback too
        result["err"] += "\n" + cp_personal_error
    return result
Пример #4
0
def prepare(course, exercise, action, submission_dir):
    '''
    Runs the preparation script for the submitted files.
    '''
    return _boolean(invoke_script(settings.PREPARE_SCRIPT,
        _collect_args(("attachment_pull", "attachment_unzip", "unzip",
            "charset", "cp_exercises", "cp", "mv"), action,
            { "course_key": course["key"] }),
        submission_dir))
Пример #5
0
def gitclone(course, exercise, action, submission_dir):
    '''
    Runs a git clone script.
    '''
    return _appendix(
        _boolean(
            invoke_script(settings.GITCLONE_SCRIPT,
                          _collect_args(("repo_dir", "read", "files"), action),
                          submission_dir)))
Пример #6
0
def store_user_files(course, exercise, action, submission_dir, user_ids, submission_number=1):
    '''
    Stores files from the submission directory to the personal directory of the user(s).
    '''
    if not (settings.ENABLE_PERSONAL_DIRECTORIES and \
            "personalized" in exercise and exercise["personalized"]):
        msg = 'Action "grader.actions.store_user_files" can only be used in personalized exercises. ' \
            'Check project settings.ENABLE_PERSONAL_DIRECTORIES value and exercise-specific personalization configuration.'
        LOGGER.error(msg)
        raise ConfigError(msg)
    args = {
        "target": user_personal_directory_path(course, exercise, user_ids),
    }

    return _boolean(invoke_script(settings.STORE_USER_FILES_SCRIPT,
        _collect_args(("cp",),
            action, args),
        submission_dir))
Пример #7
0
def store_user_files(course,
                     exercise,
                     action,
                     submission_dir,
                     user_ids,
                     submission_number=1):
    '''
    Stores files from the submission directory to the personal directory of the user(s).
    '''
    if not (settings.ENABLE_PERSONAL_DIRECTORIES and \
            "personalized" in exercise and exercise["personalized"]):
        msg = 'Action "grader.actions.store_user_files" can only be used in personalized exercises. ' \
            'Check project settings.ENABLE_PERSONAL_DIRECTORIES value and exercise-specific personalization configuration.'
        LOGGER.error(msg)
        raise ConfigError(msg)
    args = {
        "target": user_personal_directory_path(course, exercise, user_ids),
    }

    return _boolean(
        invoke_script(settings.STORE_USER_FILES_SCRIPT,
                      _collect_args(("cp", ), action, args), submission_dir))
Пример #8
0
def expaca(course, exercise, action, submission_dir):
    '''
    Executes third party expaca testing application.
    '''
    r = invoke_script(
        settings.EXPACA_SCRIPT,
        _collect_args(("rule_file", "model_dir", "user_dir"), action),
        submission_dir)

    # Expaca should always return 0.
    if r["code"] != 0:
        raise ConfigError(
            "Expaca return code not zero!\nMore information: %s" % (str(r)))
    out = r["out"]
    points = 0
    max_points = 0

    # Find points in the XML.
    b = out.find("<TotalPoints>")
    if b >= 0:
        e = out.find("</TotalPoints>", b + 13)
        points = int(out[b + 13:e])
    b = out.find("<TotalMaxpoints>")
    if b >= 0:
        e = out.find("</TotalMaxpoints>", b + 16)
        max_points = int(out[b + 16:e])

    # Transform the feedback if configured.
    if "xslt_transform" in action:
        out = transform(
            out, "%s/%s" % (settings.BASE_DIR, action["xslt_transform"]))

    return {
        "points": points,
        "max_points": max_points,
        "out": out,
        "err": r["err"],
        "stop": False
    }
Пример #9
0
def prepare(course,
            exercise,
            action,
            submission_dir,
            user_ids='',
            submission_number=1):
    '''
    Runs the preparation script for the submitted files.

    @type user_ids: C{str}
    @param user_ids: user ID(s) of the submitter(s) as string (format "1", "1-2-3")
    @type submission_number: C{int}
    @param submission_number: ordinal number of the submission
    '''
    args = {
        "course_key": course["key"],
        "exercise_key": exercise["key"],
    }
    cp_personal_error = None
    if "personalized" in exercise and exercise["personalized"]:
        args["userid"] = user_ids
        args["gen_instance_path"] = select_generated_exercise_instance(
            course, exercise, user_ids, submission_number)
        if not settings.ENABLE_PERSONAL_DIRECTORIES and "cp_personal" in action:
            cp_personal_error = 'settings.ENABLE_PERSONAL_DIRECTORIES is False but action grader.actions.prepare has "cp_personal" field'
            LOGGER.error(cp_personal_error)

    result = _boolean(
        invoke_script(
            settings.PREPARE_SCRIPT,
            _collect_args(
                ("attachment_pull", "attachment_unzip", "unzip", "charset",
                 "cp_exercises", "cp", "mv", "cp_personal", "cp_generated"),
                action, args), submission_dir))
    if cp_personal_error:
        # add the error to the feedback too
        result["err"] += "\n" + cp_personal_error
    return result
Пример #10
0
def gitclone(course, exercise, action, submission_dir):
    '''
    Runs a git clone script.
    '''
    return _appendix(_boolean(invoke_script(settings.GITCLONE_SCRIPT,
        _collect_args(("repo_dir", "read", "files"), action), submission_dir)))
Пример #11
0
 def test_shell_invoke(self):
     r = invoke_script(settings.PREPARE_SCRIPT, {})
     self.assertEqual(1, r["code"])
     r = invoke_script(settings.PREPARE_SCRIPT, { "course_key": "foo", "dir": settings.SUBMISSION_PATH })
     self.assertEqual(0, r["code"])