summaryrefslogtreecommitdiffstats
path: root/Smarker/database.py
diff options
context:
space:
mode:
Diffstat (limited to 'Smarker/database.py')
-rw-r--r--Smarker/database.py66
1 files changed, 62 insertions, 4 deletions
diff --git a/Smarker/database.py b/Smarker/database.py
index a0e3640..f17c285 100644
--- a/Smarker/database.py
+++ b/Smarker/database.py
@@ -1,5 +1,6 @@
from dataclasses import dataclass
import pymysql
+import yaml
@dataclass
class SmarkerDatabase:
@@ -12,7 +13,8 @@ class SmarkerDatabase:
def __enter__(self):
try:
self.__connection = self.__get_connection()
- except pymysql.err.OperationalError as e:
+ except Exception as e:
+ print(e.args[1])
if e.args[0] == 1049:
self.__build_db()
return self
@@ -62,7 +64,7 @@ class SmarkerDatabase:
student_no VARCHAR(10) NOT NULL,
assessment_name VARCHAR(30) NOT NULL,
submission_dt DATETIME NOT NULL default CURRENT_TIMESTAMP,
- submission_zip_path TEXT NOT NULL,
+ report_yaml TEXT NOT NULL,
FOREIGN KEY (student_no) REFERENCES students(student_no),
FOREIGN KEY (assessment_name) REFERENCES assessment(assessment_name)
);
@@ -79,14 +81,13 @@ class SmarkerDatabase:
CREATE TABLE submitted_files(
submission_id INT UNSIGNED NOT NULL,
file_id INT UNSIGNED NOT NULL,
- file_text TEXT NOT NULL,
+ file_text TEXT NULL,
FOREIGN KEY (submission_id) REFERENCES submissions(submission_id),
FOREIGN KEY (file_id) REFERENCES assessment_file(file_id),
PRIMARY KEY(submission_id, file_id)
);
""")
-
self.__connection.commit()
return self.__connection
@@ -95,3 +96,60 @@ class SmarkerDatabase:
with self.__connection.cursor() as cursor:
cursor.execute("SHOW TABLES;")
return cursor.fetchall()
+
+ def create_assessment(self, name, yaml_f, num_enrolled, files):
+ with self.__connection.cursor() as cursor:
+ cursor.execute("INSERT INTO assessment VALUES (%s, %s, %s);", (
+ name, yaml_f, num_enrolled
+ ))
+
+ for file_ in files:
+ cursor.execute("INSERT INTO assessment_file (assessment_name, file_name) VALUES (%s, %s);", (
+ name, file_
+ ))
+ self.__connection.commit()
+
+ def remove_assessment(self, name):
+ with self.__connection.cursor() as cursor:
+ cursor.execute("DELETE FROM assessment_file WHERE assessment_name = %s;", (name, ))
+ cursor.execute("DELETE FROM assessment WHERE assessment_name = %s;", (name, ))
+ self.__connection.commit()
+
+ def get_assessments(self):
+ with self.__connection.cursor() as cursor:
+ cursor.execute("""
+ SELECT assessment.assessment_name, num_enrolled, COUNT(assessment.assessment_name)
+ FROM assessment
+ INNER JOIN assessment_file
+ ON assessment.assessment_name = assessment_file.assessment_name
+ GROUP BY assessment.assessment_name;
+ """)
+ return cursor.fetchall()
+
+ def get_assessment_yaml(self, name):
+ with self.__connection.cursor() as cursor:
+ cursor.execute("SELECT yaml_path FROM assessment WHERE assessment_name = %s;", (name, ))
+ return yaml.safe_load(cursor.fetchone()[0])
+
+ def add_student(self, student_id, name, email):
+ with self.__connection.cursor() as cursor:
+ cursor.execute("INSERT INTO students VALUES (%s, %s, %s);",
+ (student_id, name, email))
+ self.__connection.commit()
+
+ 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
+ ))
+ submission_id = cursor.lastrowid
+
+ for file_name, file_contents in files:
+ cursor.execute("""
+ INSERT INTO submitted_files
+ (submission_id, file_id, file_text)
+ VALUES (%s, (SELECT file_id FROM assessment_file WHERE file_name = %s), %s);
+ """, (
+ submission_id, file_name, file_contents
+ ))
+