diff --git a/App/controllers/courses.py b/App/controllers/courses.py deleted file mode 100644 index 3d285f0f1..000000000 --- a/App/controllers/courses.py +++ /dev/null @@ -1,80 +0,0 @@ -from App.models import Course, Prerequisites -from App.controllers.prerequistes import (create_prereq, get_all_prerequisites) -from App.database import db -import json, csv - -def createPrerequistes(prereqs, courseName): - for prereq_code in prereqs: - prereq_course = Course.query.filter_by(courseCode=prereq_code).first() - - if prereq_course: - create_prereq(prereq_code,courseName) - -def create_course(code, name, rating, credits, prereqs): - already = get_course_by_courseCode(code) - if already is None: - course = Course(code, name, rating, credits) - - if prereqs: - createPrerequistes(prereqs, name) - - db.session.add(course) - db.session.commit() - return course - else: - return None - - -def createCoursesfromFile(file_path): - try: - with open(file_path, 'r') as file: - csv_reader = csv.DictReader(file) - for row in csv_reader: - courseCode = row["courseCode"] - courseName = row["courseName"] - credits = int(row["numCredits"]) - rating = int(row["rating"]) - prerequisites_codes = row["preReqs"].split(',') - - create_course(courseCode, courseName, rating, credits, prerequisites_codes) - - except FileNotFoundError: - print("File not found.") - - except Exception as e: - print(f"An error occurred: {e}") - return False - - print("Courses added successfully.") - -def get_course_by_courseCode(code): - return Course.query.filter_by(courseCode=code).first() - -def courses_Sorted_byRating(): - courses = Course.query.order_by(Course.rating.asc()).all() - codes = [] - - for c in courses: - codes.append(c.courseCode) - - return codes - -def courses_Sorted_byRating_Objects(): - return Course.query.order_by(Course.rating.asc()).all() - - -def get_prerequisites(code): - course = get_course_by_courseCode(code) - prereqs = get_all_prerequisites(course.courseName) - return prereqs - -def get_credits(code): - course = get_course_by_courseCode(code) - return course.credits if course else 0 - -def get_ratings(code): - course = get_course_by_courseCode(code) - return course.rating if course else 0 - - - diff --git a/App/models/__init__.py b/App/models/__init__.py index c8b645206..1ebbcd887 100644 --- a/App/models/__init__.py +++ b/App/models/__init__.py @@ -1,11 +1,24 @@ -from .user import * -from .courses import * -from .program import * +from .course_self_bridge import * +from .course import * +from .coursePlan import * +from .coursePlanCourse import * +from .history import * +from .historyCourse import * +from .plan_course_bridge import * +from .programme_course_bridge import * +from .programme import * +from .programmeCourse import * from .staff import * from .student import * -from .coursesOfferedPerSem import * -from .programCourses import * -from .prerequisites import * -from .studentCourseHistory import * -from .coursePlanCourses import * -from .coursePlan import * +from .user import * +# from .user import * +# from .courses import * +# from .program import * +# from .staff import * +# from .student import * +# from .coursesOfferedPerSem import * +# from .programCourses import * +# from .prerequisites import * +# from .studentCourseHistory import * +# from .coursePlanCourses import * +# from .coursePlan import * diff --git a/App/models/course.py b/App/models/course.py new file mode 100644 index 000000000..d8f244f3f --- /dev/null +++ b/App/models/course.py @@ -0,0 +1,107 @@ +from App.database import db +from .course_self_bridge import course_self_bridge +# from App.models import prerequisites +# import json + +class Course(db.Model): + __tablename__ = 'course' + course_id = db.Column(db.Integer, primary_key=True) + courseTitle = db.Column(db.String(20), unique=True, nullable=False) + courseCode = db.Column(db.String(120), nullable=False) + courseCredits = db.Column(db.Integer, nullable=False) + courseDept = courseCode = db.Column(db.String(120), nullable=False) + # typing = db.Column(db.String(120), nullable=False) + prerequistes = db.relationship('Course', secondary=course_self_bridge, backref = 'successorCourses') + antiRequisites = db.relationship('Course', secondary=course_self_bridge, backref = 'antiRequisites') + successorCourses = db.relationship('Course', secondary=course_self_bridge, backref = 'prerequistes') + def __init__(self,title,code,credits,dept): + self.courseTitle = title + self.courseCode = code + self.set_credits(credits) + self.courseDept = dept + self.prerequistes = None + self.antiRequisites = None + self.successorCourses = None + + + def set_credits(self,credits): + self.courseCredits = credits + + def add_course_to_list(self,course,list): + if list == 'p': + self.prerequistes.append(course) + if list == 'a': + self.antiRequisites.append(course) + if list == 's': + self.successorCourses.append(course) + + + def remove_course_from_list(self,course,list): + if list == 'p': + self.prerequistes.remove(course) + if list == 'a': + self.antiRequisites.remove(course) + if list == 's': + self.successorCourses.remove(course) + + def get_course_title(self): + return self.courseTitle + + def get_course_code(self): + return self.courseCode + + def get_course_credits(self): + return self.courseCredits + + def get_course_dept(self): + return self.courseDept + + def get_prereq(self): + return [course.to_json() for course in self.prerequistes] + # return self.prerequistes + + def get_anti_req(self): + return [course.to_json() for course in self.antiRequisites] + # return self.antiRequisites + + def get_succesors(self): + return [course.to_json() for course in self.successorCourses] + # return self.successorCourses + + def to_json(self): + return{ + "course_id" : self.course_id, + "title": self.get_course_title(), + "code":self.get_course_code(), + "credits":self.get_course_credits(), + "department":self.get_course_dept(), + "prerequistes" : self.get_prereq(), + "anti_requistes" : self.get_anti_req(), + "successorCourses" : self.get_succesors() + } + # courseCode = db.Column(db.String(8), primary_key=True) + # courseName = db.Column(db.String(25)) + # credits = db.Column(db.Integer) + # rating = db.Column(db.Integer) + + # offered = db.relationship('CoursesOfferedPerSem', backref ='courses', lazy=True) + # students = db.relationship('StudentCourseHistory', backref='courses', lazy=True) + # programs = db.relationship('ProgramCourses', backref='courses', lazy=True) + # prerequisites = db.relationship('Prerequisites', backref='courses', lazy = True) + + # # planIds = db.relationship('CoursePlanCourses', backref='courses', lazy=True) + + + # def __init__(self, code, name, rating, credits): + # self.courseCode = code + # self.courseName = name + # self.rating = rating + # self.credits = credits + + # def to_json(self): + # return{ + # 'Course Code:': self.courseCode, + # 'Course Name: ': self.courseName, + # 'Course Rating: ': self.rating, + # 'No. of Credits: ': self.credits, + # } \ No newline at end of file diff --git a/App/models/coursePlan.py b/App/models/coursePlan.py index e3cfaa1e5..3d93497a4 100644 --- a/App/models/coursePlan.py +++ b/App/models/coursePlan.py @@ -1,19 +1,27 @@ from App.database import db - +from .plan_course_bridge import plan_course_bridge class CoursePlan(db.Model): - planId=db.Column(db.Integer, primary_key=True) - studentId=db.Column(db.Integer, db.ForeignKey('student.id'), nullable=False) - - student = db.relationship('Student', backref=db.backref('course_plans', uselist=True)) - - # courses = db.relationship('CoursePlanCourses', backref = 'coursePlan', lazy=True) + __tablename__ ='CoursePlan' + id = db.Column(db.Integer, primary_key=True) + # studentId=db.Column(db.Integer, db.ForeignKey('student.id'), nullable=False) + student = db.Column(db.Integer, db.ForeignKey("student.id"),nullable=False) + courses = db.relationship('course_plan_course',secondary=plan_course_bridge,backref='in_course_plans') + semester = db.Column(db.Integer, nullable=False) + year = db.Column(db.Integer, nullable=False) - def __init__(self, studentid, ): - self.studentId = studentid + def __init__(self, student, year,sem): + self.student = student + self.year = year + self.sem = sem + def get_plan_courses(self): + return [course.to_json() for course in self.courses] - def get_json(self): + def to_json(self): return{ - 'planId': self.planId, - 'studentId': self.studentId, + 'id': self.id, + 'student_id': self.student, + 'semester' : self.semester, + 'year':self.year, + 'plan_courses' : get_plan_courses() } \ No newline at end of file diff --git a/App/models/coursePlanCourses.py b/App/models/coursePlanCourses.py deleted file mode 100644 index e4f982a9f..000000000 --- a/App/models/coursePlanCourses.py +++ /dev/null @@ -1,22 +0,0 @@ -from App.database import db - - -class CoursePlanCourses(db.Model): - id = db.Column(db.Integer, primary_key=True) - planId = db.Column(db.ForeignKey('course_plan.planId')) - code = db.Column(db.ForeignKey('course.courseCode')) - - # associated_coursePlan = db.relationship('CoursePlan', back_populates='students', overlaps="coursePlan") - # associated_course = db.relationship('Course', back_populates='planIds', overlaps="courses") - - def __init__(self, plan, courseCode): - self.planId = plan - self.code = courseCode - - - def get_json(self): - return{ - 'Course Plan ID': self.planId, - 'Course': self.code - } - diff --git a/App/models/course_self_bridge.py b/App/models/course_self_bridge.py new file mode 100644 index 000000000..d4585a4f6 --- /dev/null +++ b/App/models/course_self_bridge.py @@ -0,0 +1,5 @@ +from App.database import db +course_self_bridge = db.Table('course_self_bridge', + db.Column ('linking_course_id',db.Integer, db.ForeignKey('course.course_id')), + db.Column('target_course_id',db.ForeignKey('course.course_id')) +) \ No newline at end of file diff --git a/App/models/courses.py b/App/models/courses.py deleted file mode 100644 index c198814c0..000000000 --- a/App/models/courses.py +++ /dev/null @@ -1,31 +0,0 @@ -from App.database import db -from App.models import prerequisites -import json - -class Course(db.Model): - courseCode = db.Column(db.String(8), primary_key=True) - courseName = db.Column(db.String(25)) - credits = db.Column(db.Integer) - rating = db.Column(db.Integer) - - offered = db.relationship('CoursesOfferedPerSem', backref ='courses', lazy=True) - students = db.relationship('StudentCourseHistory', backref='courses', lazy=True) - programs = db.relationship('ProgramCourses', backref='courses', lazy=True) - prerequisites = db.relationship('Prerequisites', backref='courses', lazy = True) - - # planIds = db.relationship('CoursePlanCourses', backref='courses', lazy=True) - - - def __init__(self, code, name, rating, credits): - self.courseCode = code - self.courseName = name - self.rating = rating - self.credits = credits - - def get_json(self): - return{ - 'Course Code:': self.courseCode, - 'Course Name: ': self.courseName, - 'Course Rating: ': self.rating, - 'No. of Credits: ': self.credits, - } \ No newline at end of file diff --git a/App/models/coursesOfferedPerSem.py b/App/models/coursesOfferedPerSem.py deleted file mode 100644 index b3dcb1f5d..000000000 --- a/App/models/coursesOfferedPerSem.py +++ /dev/null @@ -1,16 +0,0 @@ -from App.database import db - -class CoursesOfferedPerSem(db.Model): - id = db.Column(db.Integer, primary_key=True) - code = db.Column(db.ForeignKey('course.courseCode')) - - associated_course = db.relationship('Course', back_populates='offered', overlaps="courses") - - def __init__(self, courseCode): - self.code = courseCode - - def get_json(self): - return{ - 'ID:': self.id, - 'Course Code:': self.code - } diff --git a/App/models/plan_course_bridge.py b/App/models/plan_course_bridge.py new file mode 100644 index 000000000..476c24513 --- /dev/null +++ b/App/models/plan_course_bridge.py @@ -0,0 +1,5 @@ +from App.database import db +plan_course_bridge = db.Table('plan_course_bridge', + db.Column ('plan_id',db.Integer, db.ForeignKey('course_plan.id')), + db.Column('course_id',db.ForeignKey('course_plan_course.id')) +) \ No newline at end of file diff --git a/App/models/prerequisites.py b/App/models/prerequisites.py deleted file mode 100644 index 4858c747a..000000000 --- a/App/models/prerequisites.py +++ /dev/null @@ -1,21 +0,0 @@ -from App.database import db -class Prerequisites(db.Model): - - id = db.Column(db.Integer, primary_key=True) - prereq_courseCode = db.Column(db.ForeignKey('course.courseCode')) - courseName = db.Column(db.String(25)) - - associated_course = db.relationship('Course', back_populates='prerequisites', overlaps="courses") - - - - def __init__(self, prereqCode, nameofCourse): - self.prereq_courseCode = prereqCode - self.courseName = nameofCourse - - def get_json(self): - return{ - 'prereq_id': self.id, - 'prerequisite_courseCode': self.prereq_courseCode, - 'prerequisite_course':self.courseName - } \ No newline at end of file diff --git a/App/models/program.py b/App/models/program.py deleted file mode 100644 index 322983bbe..000000000 --- a/App/models/program.py +++ /dev/null @@ -1,27 +0,0 @@ -from App.database import db -class Program(db.Model): - id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(50)) - core_credits = db.Column(db.Integer) - elective_credits = db.Column(db.Integer) - foun_credits = db.Column(db.Integer) - - students = db.relationship('Student', backref='program', lazy=True) - courses = db.relationship('ProgramCourses', backref='program', lazy=True) - - def __init__(self, name, core, elective, foun): - self.name = name - self.core_credits = core - self.elective_credits = elective - self.foun_credits = foun - - - def get_json(self): - return{ - 'Program ID:': self.id, - 'Program Name: ': self.name, - 'Core Credits: ': self.core_credits, - 'Elective Credits ': self.elective_credits, - 'Foundation Credits: ': self.foun_credits, - } - \ No newline at end of file diff --git a/App/models/programCourses.py b/App/models/programCourses.py deleted file mode 100644 index c74cf1137..000000000 --- a/App/models/programCourses.py +++ /dev/null @@ -1,23 +0,0 @@ -from App.database import db -class ProgramCourses(db.Model): - __tablename__ ='program_courses' - id = db.Column(db.Integer, primary_key=True) - program_id = db.Column(db.ForeignKey('program.id')) - code = db.Column(db.ForeignKey('course.courseCode')) - courseType = db.Column(db.Integer) - - associated_program = db.relationship('Program', back_populates='courses', overlaps="program") - associated_course = db.relationship('Course', back_populates='programs', overlaps="courses") - - def __init__(self, programID, courseCode, num): - self.program_id = programID - self.code = courseCode - self.courseType = num - - def get_json(self): - return{ - 'Program Course ID:' : self.id, - 'Program ID:': self.program_id, - 'Course Code: ': self.code, - 'Course Type: ': self.courseType - } \ No newline at end of file diff --git a/App/models/programmeCourse.py b/App/models/programmeCourse.py new file mode 100644 index 000000000..d4be140d5 --- /dev/null +++ b/App/models/programmeCourse.py @@ -0,0 +1,37 @@ +from App.database import db +from .course import Course +class ProgrammeCourse(db.Model): + __tablename__ ='programme_course' + id = db.Column(db.Integer, primary_key=True) + base_course_id = db.Column(db.Integer,db.ForeignKey("course.course_id")) + # program_id = db.Column(db.ForeignKey('program.id')) + # code = db.Column(db.ForeignKey('course.courseCode')) + courseType = db.Column(db.String(120), nullable=False) + semesterAvailable= db.Column(db.String(120), nullable=False) + # associated_program = db.relationship('Program', back_populates='courses', overlaps="program") + # associated_course = db.relationship('Course', back_populates='programs', overlaps="courses") + + def __init__(self, base_id, course_type,semester_available): + self.base_course_id = base_id + self.set_course_type(course_type) + self.set_semester_available(semester_available) + + def set_course_type(self,typing): + self.courseType = typing + + def set_semester_available(self,sem): + self.semesterAvailable = sem + + def course_available(self,current_sem): + return current_sem == self.semesterAvailable + + def get_course_info(self,base_id): + return Course.query.get(base_id).to_json() + + def to_json(self): + return{ + 'programme_course_id' : self.id, + 'course_info' : self.get_course_info(), + 'course_type': self.courseType, + 'semester_available' : self.semesterAvailable + } \ No newline at end of file diff --git a/App/models/programme_course_bridge.py b/App/models/programme_course_bridge.py new file mode 100644 index 000000000..02a2ef4b6 --- /dev/null +++ b/App/models/programme_course_bridge.py @@ -0,0 +1,5 @@ +from App.database import db +programme_course_bridge = db.Table('programme_course_bridge', + db.Column ('programme_id',db.Integer, db.ForeignKey('programme.programmId')), + db.Column('course_id',db.ForeignKey('course.course_id')) +) \ No newline at end of file diff --git a/App/models/staff.py b/App/models/staff.py index bb6013857..98214d623 100644 --- a/App/models/staff.py +++ b/App/models/staff.py @@ -3,18 +3,23 @@ class Staff(User): - - id = db.Column(db.String(10), db.ForeignKey('user.id'), primary_key=True) - name = db.Column(db.String(50)) + dept = db.Column(db.String(120),nullable=False) + faculty = db.Column(db.String(20),nullable=False) + - def __init__(self, password, staff_id, name): - super().__init__(staff_id, password) - self.id = staff_id - self.name = name + def __init__(self, username, password, name): + super().__init__(username,password,name) + + def set_dept(self,dept): + self.dept = dept + def set_faculty(self,faculty): + self.faculty = faculty - def get_json(self): + def to_json(self): + base = super().to_json() return{ - 'staff_id': self.id, - 'name': self.name, + base + + "department" : self.dept, + "faculty" : self.faculty } diff --git a/App/models/student.py b/App/models/student.py index a0445ecb1..35ad45a22 100644 --- a/App/models/student.py +++ b/App/models/student.py @@ -1,24 +1,65 @@ -from App.models import User +# from App.models import User from App.database import db +from .user import User class Student(User): - id = db.Column(db.String(10), db.ForeignKey('user.id'), primary_key=True) - name = db.Column(db.String(50)) - program_id = db.Column(db.ForeignKey('program.id')) + __tablename__ = 'Student' + year_of_study = db.Column(db.Integer, nullable=False) + programme = db.Column(db.Integer, db.ForeignKey("programmeID")) + # academicHistory = db.relationship('History', backref=db.backref('Student'), lazy ='joined') + academicHistory = db.relationship('history', backref=db.backref('student'), lazy = 'joined') + academicPlan = db.relationship('CoursePlan', backref=db.backref('student'), lazy = 'joined',uselist=False) + # academicPlan = db.Column(db.Integer, db.ForeignKey("CoursePlanID")) + # id = db.Column(db.String(10), db.ForeignKey('user.id'), primary_key=True) + # name = db.Column(db.String(50)) + # program_id = db.Column(db.ForeignKey('program.id')) - associated_program = db.relationship('Program', back_populates='students', overlaps="program") - courses = db.relationship('StudentCourseHistory', backref='student', lazy=True) - - def __init__(self, username, password, name, program_id): - super().__init__(username, password) - self.id = username - self.name = name - self.program_id = program_id - - def get_json(self): - return{'student_id': self.id, - 'name': self.name, - 'program' : self.program_id - + # associated_program = db.relationship('Program', back_populates='students', overlaps="program") + # courses = db.relationship('StudentCourseHistory', backref='student', lazy=True) + + def __init__(self, username, password, name, utype, year): + self.username = username + super.set_password(password) + super.set_name(name) + self.userType = utype + self.year_of_study = year + + + def get_history(self): + return self.academicHistory + + def get_programme(self): + return self.programme + + def get_student_curr_year(self): + return self.year_of_study + + def enroll_in_programme(self, programme): + self.programme = programme + + def create_course_plan(self,coursePlan): + self.academicPlan = coursePlan + + def view_course_plan(self): + return self.academicPlan + + def add_new_history(self,history): + self.academicHistory.append(history) + + # def __repr__(self): + # return f'' + + def to_json(self): + base = super().to_json() + prog = self.get_programme().get_degree_name() + return{ + base+ + "current year of study" : self.get_student_curr_year(), + "programme": prog, + "academic history": self.get_history(), + "academicPlan": self.view_course_plan() + } + + diff --git a/App/models/studentCourseHistory.py b/App/models/studentCourseHistory.py deleted file mode 100644 index b5d9e8528..000000000 --- a/App/models/studentCourseHistory.py +++ /dev/null @@ -1,20 +0,0 @@ -from App.database import db - -class StudentCourseHistory(db.Model): - __tablename__ = 'studentCourses' - id = db.Column(db.Integer, primary_key=True) - studentID = db.Column(db.ForeignKey('student.id')) - code = db.Column(db.ForeignKey('course.courseCode')) - - associated_course = db.relationship('Course', back_populates='students', overlaps="courses") - associated_student = db.relationship('Student', back_populates='courses', overlaps="student") - - def __init__(self, id, courseCode): - self.studentID = id - self.code = courseCode - - def get_json(self): - return{ - 'Program ID': self.id, #is this suppose to be id or program_id alone - 'Course Code': self.code - } \ No newline at end of file diff --git a/App/models/user.py b/App/models/user.py index 22314f63d..541054d3e 100644 --- a/App/models/user.py +++ b/App/models/user.py @@ -6,21 +6,40 @@ class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String, nullable=False, unique=True) password = db.Column(db.String(120), nullable=False) + name = db.Column(db.String(240), nullable=False) + userType = db.Column(db.String(40), nullable=False) - def __init__(self, username, password): + def __init__(self, username, password, name, utype): self.username = username self.set_password(password) + self.set_name(name) + self.userType = utype - def get_json(self): - return{ - 'id': self.id, - 'username': self.username - } def set_password(self, password): """Create hashed password.""" self.password = generate_password_hash(password, method='sha256') - + + def set_name(self, name): + self.name = name + def check_password(self, password): """Check hashed password.""" return check_password_hash(self.password, password) + + def get_username(self): + return self.username + + def get_usertype(self): + return self.userType + + def get_name(self): + return self.name + + def to_json(self): + return{ + "id": self.id, + "name": self.name, + "username": self.username, + "user_type": self.userType + } diff --git a/wsgi.py b/wsgi.py index be2229779..a99d34a28 100644 --- a/wsgi.py +++ b/wsgi.py @@ -173,7 +173,7 @@ def create_staff_command(id, password, name): @click.argument("foun", type=int) def create_program_command(name,core,elective,foun): newprogram=create_program(name,core,elective,foun) - print(f'{newprogram.get_json()}') + print(f'{newprogram.to_json()}') @staff_cli.command("addprogramcourse",help='testing add program feature') @click.argument("name", type=str) @@ -372,7 +372,7 @@ def create_course_command(code): @click.argument('code', type=str) def get_course(code): course = get_course_by_courseCode(code) - course_json = course.get_json() + course_json = course.to_json() print(f'{course_json}') if course else print(f'error') @course.command('getprereqs', help='Get all prerequistes for a course')