Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
3.6 kB
3
Indexable
#!/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