Exemple #1
0
def read_static_dir(course_key):
    '''
    Reads static_dir from course configuration.
    '''
    sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "grader.settings")
    from access.config import ConfigParser
    config = ConfigParser()

    course = config.course_entry(course_key)
    if 'static_dir' in course:
        return course['static_dir']
    return ''
Exemple #2
0
def read_static_dir(course_key):
    '''
    Reads static_dir from course configuration.
    '''
    sys.path.append(os.path.dirname(os.path.dirname(
        os.path.abspath(__file__))))
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "grader.settings")
    from access.config import ConfigParser
    config = ConfigParser()

    course = config.course_entry(course_key)
    if 'static_dir' in course:
        return course['static_dir']
    return ''
Exemple #3
0
    def handle(self, *args, **options):

        config = ConfigParser()

        # Check arguments.
        if len(args) < 1 or "/" not in args[0]:
            raise CommandError("Required arguments missing: course_key/exercise_key")
        course_key, exercise_key = args[0].split("/", 1)

        # Get exercise configuration.
        (course, exercise) = config.exercise_entry(course_key, exercise_key)
        if course is None:
            raise CommandError("Course not found for key: %s" % (course_key))
        if exercise is None:
            raise CommandError("Exercise not found for key: %s/%s" % (course_key, exercise_key))
        self.stdout.write('Exercise configuration retrieved.')

        # Check exercise type.
        if not "actions" in exercise:
            raise CommandError("Cannot grade: exercise does not configure asynchronous actions")

        # Create submission.
        sdir = create_submission_dir(course, exercise)
        if len(args) == 1:
            os.makedirs(sdir + "/user")
        for n in range(1, len(args)):
            name = args[n]

            # Copy individual files.
            if os.path.isfile(name):
                submit_path = submission_file_path(sdir, os.path.basename(name))
                shutil.copy2(name, submit_path)

            # Copy a directory.
            elif os.path.isdir(name):
                if len(args) != 2:
                    raise CommandError("Can only submit one directory or multiple files.")
                shutil.copytree(name, sdir + "/user", True)

            else:
                raise CommandError("Submit file not found: %s" % (name))

        # Run actions.
        r = runactions(course, exercise, sdir)
        self.stdout.write("Response body:")
        self.stdout.write(template_to_str(course, exercise, "", r["template"], r["result"]))
Exemple #4
0
class ConfigTestCase(TestCase):
    def setUp(self):
        self.config = ConfigParser()

    def test_parsing(self):
        from access.config import get_rst_as_html
        self.assertEqual(get_rst_as_html('A **foobar**.'),
                         '<p>A <strong>foobar</strong>.</p>\n')
        import re
        from access.config import iterate_kvp_with_dfs
        data = {
            'title|i18n': {
                'en': 'A Title',
                'fi': 'Eräs otsikko'
            },
            'text|rst':
            'Some **fancy** text with ``links <http://google.com>`` and code like ``echo "moi"``.'
        }
        self.config._process_exercise_data({"lang": "en"}, data)
        self.assertEqual(data["en"]["text"], data["fi"]["text"])
        self.assertEqual(data["en"]["title"], "A Title")
        self.assertEqual(data["fi"]["title"], "Eräs otsikko")

    def test_loading(self):
        courses = self.config.courses()
        self.assertGreater(len(courses), 0, "No courses configured")
        course_key = courses[0]["key"]

        root = self.config._course_root(course_key)
        ptime = root["ptime"]

        # Ptime changes if cache is missed.
        root = self.config._course_root(course_key)
        self.assertEqual(ptime, root["ptime"])

    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"])
Exemple #5
0
class ConfigTestCase(TestCase):

    TEST_DATA = {
        'key': 'value',
        'title|i18n': {'en': 'A Title', 'fi': 'Eräs otsikko'},
        'text|rst': 'Some **fancy** text with ``links <http://google.com>`` and code like ``echo "moi"``.',
        'nested': {
            'number|i18n': {'en': 1, 'fi': 2},
            'another': 10
        }
    }

    def setUp(self):
        self.config = ConfigParser()

    def get_course_key(self):
        courses = self.config.courses()
        self.assertGreater(len(courses), 0, "No courses configured")
        return courses[0]['key']

    def test_rst_parsing(self):
        from access.config import get_rst_as_html
        self.assertEqual(get_rst_as_html('A **foobar**.'), '<p>A <strong>foobar</strong>.</p>\n')

    def test_parsing(self):
        course = { "lang": "en" }
        data = self.config._process_exercise_data(course, self.TEST_DATA)
        self.assertEqual(data["en"]["text"], data["fi"]["text"])
        self.assertEqual(data["en"]["title"], "A Title")
        self.assertEqual(data["en"]["nested"]["number"], 1)
        self.assertEqual(data["fi"]["title"], "Eräs otsikko")
        self.assertEqual(data["fi"]["nested"]["number"], 2)

    def test_cache(self):
        course_key = self.get_course_key()

        root = self.config._course_root(course_key)
        mtime = root["mtime"]
        ptime = root["ptime"]
        self.assertGreater(ptime, mtime)

        # Ptime changes if cache is missed.
        root = self.config._course_root(course_key)
        self.assertEqual(root["mtime"], mtime)
        self.assertEqual(root["ptime"], ptime)

    def test_cache_reload(self):
        course_key = self.get_course_key()

        root = self.config._course_root(course_key)
        mtime = root["mtime"]
        ptime = root["ptime"]
        self.assertGreater(ptime, mtime)

        time.sleep(1.5)
        os.utime(root["file"])
        root = self.config._course_root(course_key)
        self.assertGreater(root["ptime"], root["mtime"])
        self.assertGreater(root["mtime"], mtime)
        self.assertGreater(root["ptime"], ptime)
Exemple #6
0
class ConfigTestCase(TestCase):

    def setUp(self):
        self.config = ConfigParser()

    def test_parsing(self):
        from access.config import get_rst_as_html
        self.assertEqual(get_rst_as_html('A **foobar**.'), '<p>A <strong>foobar</strong>.</p>\n')
        import re
        from access.config import iterate_kvp_with_dfs
        data = {
            'title|i18n': {'en': 'A Title', 'fi': 'Eräs otsikko'},
            'text|rst': 'Some **fancy** text with ``links <http://google.com>`` and code like ``echo "moi"``.'
        }
        self.config._process_exercise_data({ "lang": "en" }, data)
        self.assertEqual(data["en"]["text"], data["fi"]["text"])
        self.assertEqual(data["en"]["title"], "A Title")
        self.assertEqual(data["fi"]["title"], "Eräs otsikko")

    def test_loading(self):
        courses = self.config.courses()
        self.assertGreater(len(courses), 0, "No courses configured")
        course_key = courses[0]["key"]

        root = self.config._course_root(course_key)
        ptime = root["ptime"]

        # Ptime changes if cache is missed.
        root = self.config._course_root(course_key)
        self.assertEqual(ptime, root["ptime"])

    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"])
Exemple #7
0
 def setUp(self):
     import access
     settings.COURSES_PATH = os.path.join(os.path.dirname(__file__), 'test_data')
     self.config = ConfigParser()
Exemple #8
0
 def setUp(self):
     self.config = ConfigParser()
Exemple #9
0
 def setUp(self):
     import access
     access.config.DIR = os.path.join(os.path.dirname(__file__),
                                      'test_data')
     self.config = ConfigParser()
Exemple #10
0
 def setUp(self):
     self.config = ConfigParser()