def save_courses(course_list): """ Saves a list of course information dictionaries to the database. :param course_list: List of dict, List of course information for courses """ for course_dict in course_info_list: Course.create(code=course_dict["code"], name=course_dict["norwegian_name"].strip(), credit=course_dict["credit"], average_grade=course_dict["average"], pass_rate=course_dict["pass_rate"]).save()
def test_retrieve_courses_from_token_invalid_token(self): with patch("course.views.Course") as mock_course_db: mock_course_db.return_value.objects.return_value.filter.return_value = [ Course.create("AAA9999", "Test course", 0, 0, 100.0) ] with self.assertRaises(TypeError): retrieve_courses_from_token("invalid_token")
def test_retrieve_courses_from_token_valid_token(self): with patch("course.views.Course") as mock_course_db: mock_course_db.return_value.objects.return_value.filter.return_value = [ Course.create("AAA9999", "Test course", 0, 0, 100.0) ] number_of_courses = len(retrieve_courses_from_token("valid_token")) self.assertEqual(number_of_courses, 28)
def test_get_reviewable_courses_invalid_token(self): with patch("course.views.get_current_semester") as mock_curr_semester, \ patch("course.views.Course") as mock_course_db: mock_curr_semester.return_value = "H2020" mock_course_db.return_value.objects.return_value.filter.return_value = [ Course.create("AAA9999", "Test course", 0, 0, 100.0)] with self.assertRaises(ValueError): get_reviewable_courses("invalid token")
def test_can_review_successful(self): c = APIClient() c.credentials(HTTP_AUTHORIZATION='valid_token') with patch("course.views.Course.objects.filter") as mock_course_db: mock_course_db.return_value = MockQuerySet( [Course.create("AAA9999", "Test course", 0, 0, 100.0)]) res = c.get("/review/check/?courseCode=TMA4100") self.assertEqual(res.status_code, 200) self.assertEqual(res.data, 0)
def test_get_current_user_courses_valid_token(self): with patch("course.views.Course.objects.filter") as mock_course_db: mock_course_db.return_value = [ Course.create("AAA9999", "Test course", 0, 0, 100.0) ] c = APIClient() c.credentials(HTTP_AUTHORIZATION='valid_token') response = c.get("/course/me/") self.assertEqual(response.status_code, 200) self.assertEqual(len(json.loads(response.content)), 28)
def test_get_reviewable_courses_valid_token(self): # Check that courses for the current semester are removed. with patch("course.views.get_current_semester") as mock_curr_semester, \ patch("course.views.Course") as mock_course_db: mock_curr_semester.return_value = "H2020" mock_course_db.return_value.objects.return_value.filter.return_value = [ Course.create("AAA9999", "Test course", 0, 0, 100.0)] actual_reviewables = [ 'EXPH0004', 'TDT4137', 'TMA4140', 'TDT4136', 'TFE4101', 'TDT4112', 'TDT4113', 'TDT4110', 'TMA4100', 'TDT4180', 'HMS0002', 'TDT4160', 'TDT4186', 'TFY4125', 'TDT4100', 'TMA4135', 'TDT4145', 'TDT4120', 'TDT4140', 'TDT4171', 'TMA4115', 'TMA4240', 'TIØ4252', 'TTM4100', 'TDT4290', 'TDT4165', 'TDT4173', 'TIØ4146'] for course in get_reviewable_courses("valid_token"): if course not in actual_reviewables: self.fail("Invalid course in reviewable courses")
def test_post_review_valid_request_course_exists(self): # Test valid request with existing course valid_test_data = {"courseCode": "TDT4120", "score": 1, "workload": 1, "difficulty": 1, "reviewText": "Lorem ipsum"} c = APIClient() c.credentials(HTTP_AUTHORIZATION='valid_token') with patch("course.views.Course") as mock_course_db: mock_course_db.return_value.objects.return_value.filter.return_value = [ Course.create("AAA9999", "Test course", 0, 0, 100.0)] response = c.post("/review/", data=valid_test_data, format="json") self.assertEqual(response.status_code, 200) self.assertTrue(Review.objects.filter(course_code="TDT4120", user_email="*****@*****.**").exists())
def test_can_review_review_exists(self): c = APIClient() c.credentials(HTTP_AUTHORIZATION='valid_token') Review(course_code="TMA4100", user_email="*****@*****.**", score=5, workload=1, difficulty=2, review_text="Bra f*g", full_name="Test testesen", study_programme="MTDT").save() with patch("course.views.Course.objects.filter") as mock_course_db: mock_course_db.return_value = MockQuerySet( [Course.create("AAA9999", "Test course", 0, 0, 100.0)]) res = c.get("/review/check/?courseCode=TMA4100") self.assertEqual(res.status_code, 200) self.assertEqual(res.data, 2)
def post(self, request): current_user = request.user course_name = request.POST.get("Course Name", "") department = request.POST.get("Department", "") course_number = int(request.POST.get("Course Number", "")) # add functionality to assign instructor upon creation permission_check = current_user.is_at_least(4) course_name_already_exists = Course.objects.filter(courseName=course_name) course_number_already_exists = Course.objects.filter(courseNumber=course_number) create = False if permission_check and not course_name_already_exists: new_course = Course.create(course_name,department,course_number) new_course.save() create = True return render(request, 'createCourse.html', {"permission_check": permission_check, "create" : create}) else: return render(request, 'createCourse.html', {"permission_check": permission_check, "create" : create, "message" : "Error! The course " + course_name + " " + course_number.__str__() + " already exists"})
def command(self, s, request): try: currentUser = self.getActiveUser(request) except: pass tokens = s.split() cmd = tokens[0] args = tokens[1:] if cmd == "login": if len(args) < 2: return "Insufficient arguments for command " + cmd username = args[0] password = args[1] try: user = Users.objects.get(username=username) if user.check_password(password): login(request, user) return "Login successful." else: return "Login failed, wrong password" except Exception as e: print(e) return "Login failed, no such user" elif cmd == 'logout': logout(request) return "Logged out" elif cmd == "createCourse": return "Pass - implemented in Web Interface not Command Line." if len(args) < 3: return "Insufficient arguments for command " + cmd coursename = args[0] department = args[1] coursenumber = args[2] permission = True # todo : check permissions of active user Course.create(coursename, department, coursenumber).save() return "Course created successfully." elif cmd == "createAccount": if len(args) < 3: return "Insufficient arguments for command " + cmd username = args[0] password = args[1] role = int(args[2]) try: permission = self.getActiveUser(request).is_at_least(4) except: return "Permission denied - Your role may not create accounts!" greater = self.getActiveUser(request).is_at_least(role) if permission: if not greater: return "Permission denied - Your role may not create accounts of this type!" else: try: user = Users.create(username, password, role) user.set_password(password) #hashing fix user.save() #ci looks for user in db so save first user.set_contact_info("","","","","","") #initialize ci user.save() #now save updated ci except: return "Account already exists!" return "Account created successfully." else: return "Permission denied - Your role may not create accounts!" elif cmd == "deleteAccount": if len(args) < 1: return "Insufficient arguments for command " + cmd username = args[0] permission = self.getActiveUser(request).is_at_least(4) user = Users.objects.filter(username=username) if len(user) == 0: return "No such user" if not self.getActiveUser(request).is_at_least(user[0].roles): return "Permission denied - Your role may not delete accounts of this type!" user[0].delete() return "User deleted" elif cmd == "editContactInfo": if len(args) < 6: return "Missing arguments" if len(args) > 6: return "Field does not exist" try: u = self.getActiveUser(request) if not u: return "Login a user first" if len(ContactInfo.objects.filter(account=u)) == 0: ContactInfo.create(u.username, args[0], args[1], args[2], args[3], args[4], args[5]).save() return "field successfully revised" u.editContactInfo(u, args[0], args[1], args[2], args[3], args[4], args[5]) return "field successfully revised" except: return "Login a user first" # todo : support other commands elif cmd == "assignInstructor": return "Pass - implemented in Web Interface not Command Line." course = Course.objects.get(courseName=args[0]) user = Users.objects.get(username=args[1]) course.assign_instructor(user) return "Successfully added instructor to course" elif cmd == "removeInstructor": return "Pass - implemented in Web Interface not Command Line." elif cmd == "assignTACourse": return "Pass - implemented in Web Interface not Command Line." course = Course.objects.get(courseName=args[0]) user = Users.objects.get(username=args[1]) ta = TA.create(user, True, 1) ta.save() course.assign_TA(ta) return "Successfully added TA to course" elif cmd == "sendEmail": return "Failed- Unimplemented" elif cmd == "removeTACourse": return "Pass - implemented in Web Interface not Command Line." return elif cmd == "assignTALab": return "Pass - implemented in Web Interface not Command Line." lab = Lab.objects.get(labNumber=args[0]) user = Users.objects.get(username=args[1]) ta = TA.create(user, True, 1) ta.save() lab.assign_TA(ta) return "Successfully added TA to lab" elif cmd == "removeTALab": return "Pass - implemented in Web Interface not Command Line." return elif cmd == "courseAssignments": return "Pass - implemented in Web Interface not Command Line." return elif cmd == "readTAAssignment": return "Pass - implemented in Web Interface not Command Line." return elif cmd == "readAllTAAssignment": return "Pass - implemented in Web Interface not Command Line." return elif cmd == "readPublicContactInfo": return "Pass - implemented in Web Interface not Command Line." elif cmd == "readAllTAAssignments": return "Pass - implemented in Web Interface not Command Line." elif cmd == "editAccount": return "Pass - implemented in Web Interface not Command Line." else: return "Unrecognized command: " + cmd