Coverage for app/logic/courseManagement.py: 78%
46 statements
« prev ^ index » next coverage.py v7.2.5, created at 2023-05-24 14:13 +0000
« prev ^ index » next coverage.py v7.2.5, created at 2023-05-24 14:13 +0000
1from flask import flash
2from peewee import fn, JOIN
4from app.models import mainDB
5from app.models.courseInstructor import CourseInstructor
6from app.models.courseQuestion import CourseQuestion
7from app.models.courseStatus import CourseStatus
8from app.logic.adminLogs import createLog
9from app.logic.fileHandler import FileHandler
10from app.models.course import Course
11from app.models.term import Term
12from app.models.user import User
15def unapprovedCourses(termId):
16 '''
17 Queries the database to get all the neccessary information for submitted courses.
18 '''
20 unapprovedCourses = (Course.select(Course, Term, CourseStatus, fn.GROUP_CONCAT(" " ,User.firstName, " ", User.lastName).alias('instructors'))
21 .join(CourseInstructor, JOIN.LEFT_OUTER)
22 .join(User, JOIN.LEFT_OUTER).switch(Course)
23 .join(CourseStatus).switch(Course)
24 .join(Term)
25 .where(Term.id == termId,
26 Course.status.in_([CourseStatus.SUBMITTED,
27 CourseStatus.IN_PROGRESS]))
28 .group_by(Course, Term, CourseStatus)
29 .order_by(Course.status))
31 return unapprovedCourses
32def approvedCourses(termId):
33 '''
34 Queries the database to get all the neccessary information for
35 approved courses.
36 '''
38 approvedCourses = (Course.select(Course, Term, CourseStatus, fn.GROUP_CONCAT(" " ,User.firstName, " ", User.lastName).alias('instructors'))
39 .join(CourseInstructor, JOIN.LEFT_OUTER)
40 .join(User, JOIN.LEFT_OUTER).switch(Course)
41 .join(CourseStatus).switch(Course)
42 .join(Term)
43 .where(Term.id == termId, Course.status == CourseStatus.APPROVED)
44 .group_by(Course, Term, CourseStatus))
46 return approvedCourses
48def createCourse(creator="No user provided"):
49 """ Create an empty, in progress course """
50 course = Course.create(status=CourseStatus.IN_PROGRESS, createdBy=creator)
51 for i in range(1, 7):
52 CourseQuestion.create( course=course, questionNumber=i)
54 return course
56def updateCourse(courseData, attachment=None):
57 """
58 This function will take in courseData for the SLC proposal page and a dictionary
59 of instuctors assigned to the course and update the information in the db.
60 """
61 with mainDB.atomic() as transaction:
62 try:
63 course = Course.get_by_id(courseData['courseID'])
64 for toggler in ["slSectionsToggle", "permanentDesignation"]:
65 courseData.setdefault(toggler, "off")
66 Course.update(
67 courseName=courseData["courseName"],
68 courseAbbreviation=courseData["courseAbbreviation"],
69 sectionDesignation=courseData["sectionDesignation"],
70 courseCredit=courseData["credit"],
71 isRegularlyOccurring=int(courseData["isRegularlyOccurring"]),
72 term=courseData['term'],
73 status=CourseStatus.SUBMITTED,
74 isPreviouslyApproved=int(courseData["isPreviouslyApproved"]),
75 previouslyApprovedDescription = courseData["previouslyApprovedDescription"],
76 isAllSectionsServiceLearning=("on" in courseData["slSectionsToggle"]),
77 serviceLearningDesignatedSections=courseData["slDesignation"],
78 isPermanentlyDesignated=("on" in courseData["permanentDesignation"]),
79 hasSlcComponent = int(courseData["hasSlcComponent"])
80 ).where(Course.id == course.id).execute()
81 for i in range(1, 7):
82 (CourseQuestion.update(questionContent=courseData[f"{i}"])
83 .where((CourseQuestion.questionNumber == i) &
84 (CourseQuestion.course==course)).execute())
85 instructorList = []
86 if 'instructor[]' in courseData:
87 instructorList = courseData.getlist('instructor[]')
88 CourseInstructor.delete().where(CourseInstructor.course == course).execute()
89 for instructor in instructorList:
90 CourseInstructor.create(course=course, user=instructor)
91 createLog(f"Saved SLC proposal: {courseData['courseName']}")
92 if attachment:
93 addFile= FileHandler(attachment, courseId=course.id)
94 addFile.saveFiles()
95 return Course.get_by_id(course.id)
96 except Exception as e:
97 print(e)
98 transaction.rollback()
99 return False