Example #1
0
        public async Task <Course> FindCourseTimetableFromProxy(Course course)
        {
            List <ScheduleTimetableResult> schedules = new();
            int years = course.StudyType.Contains("inž") ? 2 : 3;

            for (int i = 1; i <= years; i++)
            {
                try
                {
                    ScheduleTimetableResult schedule = await _scheduleProxy.GetBySubjectCode(course.CourseCode, i + "", course.StudyType);

                    if (schedule != null)
                    {
                        schedules.Add(schedule);
                    }
                } catch (Exception ex)
                {
                    _logger.LogWarning($"Error while searching timetable of course {course.CourseName}({course.CourseCode}): {ex.Message}");
                }
                if (schedules == null)
                {
                    _logger.LogError($"Unable to load schedule for subject {course.CourseCode}. Schedule proxy returned null");
                    return(null);
                }
            }
            course.Timetable = new Timetable(Semester.GetSemester());
            schedules.ForEach(async(schedule) => {
                Timetable t = await ConverterApiToDomain.ConvertTimetableForCourseAsync(schedule, this);
                if (t != null)
                {
                    foreach (Block b in t.AllBlocks)
                    {
                        if (!course.Timetable.ContainsBlock(b))
                        {
                            course.Timetable.AddNewBlock(b);
                        }
                    }
                }
            });
            course.LastUpdateOfTimetable = DateTime.Now;
            await UpdateAsync(course);

            return(course);
        }
Example #2
0
        public static async Task <Timetable> ConvertAndMergeSameConsecutiveBlocks(ScheduleTimetableResult scheduleTimetable, ICourseService courseService, bool isTimetableForCourse)
        {
            var sortedBlocks = scheduleTimetable.Result.ScheduleContents
                               .OrderBy(b => b.Day)
                               .ThenBy(b => b.CourseName)
                               .ThenBy(b => b.TeacherName)
                               .ThenBy(b => b.RoomName)
                               .ThenBy(b => b.LessonType)
                               .ThenBy(b => b.BlockNumber)
                               .ToList();

            IEnumerable <Task <Block> > mergedBlocks = Merge(sortedBlocks,
                                                             (group, b2) =>
            {
                ScheduleContent b1 = group.First();
                return(b1.Day == b2.Day &&
                       b1.CourseName == b2.CourseName &&
                       b1.RoomName == b2.RoomName &&
                       b1.LessonType == b2.LessonType &&
                       (b1.BlockNumber == b2.BlockNumber - 1 ||
                        b1.BlockNumber == b2.BlockNumber));       // || b1.BlockNumber == b2.BlockNumber to eliminate duplicates (same blocks)
            },
                                                             async(group) =>
            {
                ScheduleContent firstInGroup = group.First();
                var teacherBuilder           = new StringBuilder();
                foreach (var item in group.Select(x => x.TeacherName).Distinct())
                {
                    if (string.IsNullOrEmpty(teacherBuilder.ToString()))
                    {
                        teacherBuilder.Append(item);
                    }
                    else
                    {
                        teacherBuilder.Append($", {item}");
                    }
                }
                var block = new Block()
                {
                    BlockType = ConvertToBlockType(firstInGroup.LessonType),
                    Day       = ConvertToDay(firstInGroup.Day),
                    Teacher   = teacherBuilder.ToString(),
                    Room      = firstInGroup.RoomName,
                    StartHour = (byte)(firstInGroup.BlockNumber + 6),     // block number start 1 but starting hour in school is 7:00
                    Duration  = (byte)(group.Last().BlockNumber - firstInGroup.BlockNumber + 1)
                };
                if (!isTimetableForCourse)
                {
                    Course course = await courseService.GetOrAddNotExistsCourse(firstInGroup.CourseCode,
                                                                                firstInGroup.CourseName);
                    Block courseBlock = course.Timetable?.GetBlock(block);
                    if (courseBlock != null)
                    {
                        block.BlockId = courseBlock.BlockId;
                    }
                    block.CourseId = course.Id;
                }

                return(block);
            }
                                                             );

            Timetable mergedTimetable = new(scheduleTimetable.Semester);

            foreach (var mergedBlock in mergedBlocks)
            {
                mergedTimetable.AddNewBlock(await mergedBlock);
            }
            return(mergedTimetable);
        }
Example #3
0
 public static async Task <Timetable> ConvertTimetableForCourseAsync(ScheduleTimetableResult timetable, ICourseService courseServ)
 {
     return(await ConvertAndMergeSameConsecutiveBlocks(timetable, courseServ, true));
 }