def test_waiting_students_number(self): """Check whether we get correct number of waiting students of given type. Our exercise groups have limit for 1 person. Bolek is in cooking_exercise_group_1 and Lolek is in cooking_exercise_group_2. Tola is in queues of all above groups. Bolek changed his mind and want to be in cooking_exercise_group_2. Lolek also want to join other group(cooking_exercise_group_1). We have 2 enrolled Records and 4 enqueued. Only Lola isn't enrolled in any group. That's why we should return 1. """ with patch(RECORDS_DATETIME, mock_datetime(2011, 10, 8, 12)): self.cooking_exercise_group_1.limit = 1 self.cooking_exercise_group_2.limit = 1 Record.enqueue_student(self.bolek, self.cooking_exercise_group_1) Record.enqueue_student(self.lolek, self.cooking_exercise_group_2) Record.enqueue_student(self.tola, self.cooking_exercise_group_1) Record.enqueue_student(self.tola, self.cooking_exercise_group_2) Record.enqueue_student(self.bolek, self.cooking_exercise_group_2) Record.enqueue_student(self.lolek, self.cooking_exercise_group_1) expected_waiting = { self.cooking_exercise_group_1.course_id: { self.cooking_exercise_group_1.type: 1 } } self.assertDictEqual( Record.list_waiting_students( [self.cooking_exercise_group_1.course]), expected_waiting)
def course_view_data(request, slug) -> Tuple[Optional[CourseInstance], Optional[Dict]]: """Retrieves course and relevant data for the request. If course does not exist it returns two None objects. """ course: CourseInstance = None try: course = CourseInstance.objects.filter(slug=slug).select_related( 'semester', 'course_type').prefetch_related('tags', 'effects').get() except CourseInstance.DoesNotExist: return None, None student: Student = None if request.user.is_authenticated and request.user.student: student = request.user.student groups = course.groups.exclude(extra='hidden').select_related( 'teacher', 'teacher__user', ).prefetch_related('term', 'term__classrooms', 'guaranteed_spots', 'guaranteed_spots__role') # Collect the general groups statistics. groups_stats = Record.groups_stats(groups) # Collect groups information related to the student. student_status_groups = Record.is_recorded_in_groups(student, groups) student_can_enqueue = Record.can_enqueue_groups(student, course.groups.all()) student_can_dequeue = Record.can_dequeue_groups(student, course.groups.all()) for group in groups: group.num_enrolled = groups_stats.get(group.pk).get('num_enrolled') group.num_enqueued = groups_stats.get(group.pk).get('num_enqueued') group.is_enrolled = student_status_groups.get(group.pk).get('enrolled') group.is_enqueued = student_status_groups.get(group.pk).get('enqueued') group.priority = student_status_groups.get(group.pk).get('priority') group.can_enqueue = student_can_enqueue.get(group.pk) group.can_dequeue = student_can_dequeue.get(group.pk) teachers = {g.teacher for g in groups} course.is_enrollment_on = any(g.can_enqueue for g in groups) waiting_students = {} if request.user.employee: waiting_students = Record.list_waiting_students([course])[course.id] data = { 'course': course, 'teachers': teachers, 'groups': groups, 'waiting_students': waiting_students, } return course, data