summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Smarker/database.py6
-rw-r--r--Smarker/reflect.py14
2 files changed, 17 insertions, 3 deletions
diff --git a/Smarker/database.py b/Smarker/database.py
index f17c285..38af6a7 100644
--- a/Smarker/database.py
+++ b/Smarker/database.py
@@ -140,11 +140,11 @@ class SmarkerDatabase:
def add_submission(self, student_id, assessment_name, report_yaml, files):
with self.__connection.cursor() as cursor:
cursor.execute("INSERT INTO submissions (student_no, assessment_name, report_yaml) VALUES (%s, %s, %s);", (
- student_id, assessment_name, report_yaml
+ student_id, assessment_name, yaml.dump(report_yaml)
))
submission_id = cursor.lastrowid
- for file_name, file_contents in files:
+ for file_name, file_contents in files.items():
cursor.execute("""
INSERT INTO submitted_files
(submission_id, file_id, file_text)
@@ -152,4 +152,4 @@ class SmarkerDatabase:
""", (
submission_id, file_name, file_contents
))
-
+ self.__connection.commit()
diff --git a/Smarker/reflect.py b/Smarker/reflect.py
index bc5ae0e..2a1f552 100644
--- a/Smarker/reflect.py
+++ b/Smarker/reflect.py
@@ -8,6 +8,7 @@ import subprocess
import importlib
import traceback
import tempfile
+import database
import inspect
import pkgutil
import shutil
@@ -62,6 +63,9 @@ class Reflect:
"doc": self.__format_doc(inspect.getdoc(self.imported_modules[module_name]))
}
+ def get_module_source(self, module_name):
+ return inspect.getsource(self.imported_modules[module_name]).rstrip()
+
def get_classes(self, module_name):
"""Gets the classes in a given module. The module must be imported first.
@@ -237,6 +241,7 @@ def gen_reflection_report(client_code_path, assessment_struct, student_no, confi
out = assessment_struct
out["student_no"] = student_no
tests_to_run = {}
+ files_sources = {}
try:
produced_files = assessment_struct["produced_files"]
@@ -247,6 +252,8 @@ def gen_reflection_report(client_code_path, assessment_struct, student_no, confi
required_file = list(required_file.keys())[0]
module_name = os.path.splitext(required_file)[0]
+ files_sources[required_file] = None
+
if module_name in present_module_names:
out["files"][i][required_file]["present"] = True
else:
@@ -269,6 +276,7 @@ def gen_reflection_report(client_code_path, assessment_struct, student_no, confi
required_files_features = assessment_struct["files"][i][required_file]
out["files"][i][required_file]["has_exception"] = False
out["files"][i][required_file]["documentation"] = reflection.get_module_doc(module_name)
+ files_sources[required_file] = reflection.get_module_source(module_name)
if "classes" in required_files_features.keys():
present_classes = reflection.get_classes(module_name)
@@ -374,6 +382,12 @@ def gen_reflection_report(client_code_path, assessment_struct, student_no, confi
out["test_results"] = reflection.run_tests(tests_to_run, configuration["out"] == "stdout" and configuration["format"] in ["text", "txt"])
out["class_tree"] = reflection.get_class_tree()
+
+ with database.SmarkerDatabase(
+ configuration["mysql_host"], configuration["mysql_user"], configuration["mysql_passwd"],
+ "Smarker", int(configuration["mysql_port"])) as db:
+
+ db.add_submission(student_no, out["name"], out, files_sources)
return out
class MonitoredFileNotInProducedFilesException(Exception):