Untitled
#!/usr/bin/python3 # COMP3311 22T3 Ass2 ... print a transcript for a given student import sys import psycopg2 import re from helpers import getStudent # define any local helper functions here ### set up some globals usage = f"Usage: {sys.argv[0]} zID" db = None string = "{CourseCode} {Term} {SubjectTitle:<32s}{Mark:>3} {Grade:>2s} {UOC:2}" uocPass = {'A', 'B', 'C', 'D', 'A+', 'B+', 'C+', 'D+', 'A-', 'B-', 'C-', 'D-', 'HD', 'DN', 'CR', 'PS', 'XE', 'T', 'SY', 'EC', 'RC'} toWam = {'HD', 'DN', 'CR', 'PS', 'AF', 'FL', 'UF', 'E', 'F'} fail = {'AF', 'FL', 'UF', 'E', 'F'} unrs = {'AS', 'AW', 'PW', 'NA', 'RD', 'NF', 'NC', 'LE', 'PE', 'WD', 'WJ'} ### process command-line args argc = len(sys.argv) if argc < 2: print(usage) exit(1) zid = sys.argv[1] if zid[0] == 'z': zid = zid[1:8] digits = re.compile("^\d{7}$") if not digits.match(zid): print(f"Invalid student ID {zid}") exit(1) # manipulate database try: db = psycopg2.connect("dbname=ass2") stuInfo = getStudent(db,zid) if not stuInfo: print(f"Invalid student ID {zid}") exit() print(str(stuInfo[1]) + ' ' + stuInfo[2] + ', ' + stuInfo[3]) # debug # Print transcript for Student # ... add your code here ... cur = db.cursor() qry = """select MAX(t.starting), pe.id from Terms t join Program_enrolments pe on pe.term = t.id join Programs p on pe.program = p.id where pe.student = %s group by pe.id, t.starting order by t.starting desc""" cur.execute(qry, [stuInfo[0]]) qry1 = """select * from Programs p where pe.student = %s""" tup = cur.fetchone() qry2 = """select sub.code, t.code, sub.title, pe.id, ce.mark, ce.grade, sub.uoc from Courses c join Course_enrolments ce on ce.course = c.id join Subjects sub on sub.id = c.subject join Students s on s.id = ce.student join Program_enrolments pe on pe.student = s.id join Terms t on c.term = t.id where pe.id = %s order by t.code, sub.code""" cur.execute(qry2, [tup[1]]) qry3 = """select s.code, p.code, p.name from Programs p join Program_enrolments pe on pe.program = p.id join Stream_enrolments se on se.part_of = pe.id join Streams s on s.id = se.stream where pe.id = %s""" cur.execute(qry3, [tup[1]]) codes = cur.fetchone() print(codes[1] + ' ' + codes[0] + ' ' + codes[2]) cur.execute(qry2, [tup[1]]) attemptUoc = 0; achvUoc = 0; totWam = 0; for course in cur.fetchall(): truncString = (course[2])[0:31] mark = course[4] if mark == None: mark = '-' else: mark = course[4] grade = course[5] uocString = '' if grade in fail: uocString = 'fail' elif grade in unrs: uocString = 'unrs' else: uocString = str(course[6]) + 'uoc' print(string.format(CourseCode = course[0], Term = course[1], SubjectTitle = truncString, Mark = mark, Grade = grade, UOC = uocString)) if course[5] in uocPass: achvUoc += course[6] if course[5] in toWam: attemptUoc += course[6] if mark != '-': totWam += mark * course[6] finalWam = totWam / attemptUoc print('UOC = ' + str(achvUoc) + ', WAM = ' + str(round(finalWam, 1))) except Exception as err: print("DB error: ", err) finally: if db: db.close()
Leave a Comment