Пример #1
0
        public TimetableLoader(TimetableKind kind, string element)
        {
            this.kind = kind;

            switch (kind)
            {
            case TimetableKind.Class:
                timetableIndex = Array.IndexOf(Names.Classes, element);
                kindChar       = 'c';

                var elementParts = element.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                if (elementParts.Length >= 1)
                {
                    hasSchoolClass = true;
                    schoolClass    = elementParts[0][elementParts[0].Length - 1];
                    schoolYear     = elementParts[0].Substring(0, elementParts[0].Length - 1);
                }
                break;

            case TimetableKind.Student:
                timetableIndex = Array.IndexOf(Names.Students, element);
                kindChar       = 's';
                break;

            case TimetableKind.Teacher:
                timetableIndex = Array.IndexOf(Names.Teachers, element);
                kindChar       = 't';
                break;
            }

            //Non 0-based
            timetableIndex += 1;
        }
Пример #2
0
        /*
         * public async Task<IActionResult> GoogleCalendar(TimetableKind kind, string timetableName, ICollection<Model.Lesson> lessons)
         * {
         *  return View("Success");
         * }
         */

        public async Task <IActionResult> ICalendar(TimetableKind kind, string timetableName, ICollection <Model.Lesson> lessons)
        {
            var exporter = new ExporterICalendar();

            var file = await exporter.ExportAsync(kind, timetableName, lessons);

            ViewData["File"] = file;

            return(View("SuccessICalendar"));
        }
Пример #3
0
        public async Task <IActionResult> Edit(string @class, string student, string teacher)
        {
            TimetableKind kind    = TimetableKind.Class;
            string        element = "";

            if (!string.IsNullOrWhiteSpace(@class))
            {
                kind    = TimetableKind.Class;
                element = @class;
            }
            else if (!string.IsNullOrWhiteSpace(teacher))
            {
                kind    = TimetableKind.Teacher;
                element = teacher;
            }
            else if (!string.IsNullOrWhiteSpace(student))
            {
                kind    = TimetableKind.Student;
                element = student;
            }

            TimetableLoader timetable = new TimetableLoader(kind, element);
            var             lessons   = await timetable.LoadAsync();

            var lessonVMs = new List <LessonViewModel>();

            foreach (var lesson in lessons)
            {
                var classVMs = new List <ClassViewModel>();
                foreach (var _class in lesson.Classes)
                {
                    classVMs.Add(new ClassViewModel(_class.Name, _class.Teacher, _class.Room));
                }
                lessonVMs.Add(new LessonViewModel(lesson.DayOfWeek, lesson.Period, lesson.Duration, lesson.Name, kind == TimetableKind.Teacher ? lesson.SchoolClass : lesson.Teacher, lesson.Room, lesson.Color, lesson.Week, classVMs));
            }

            var viewModel = new EditViewModel(kind, element, lessonVMs);

            return(View(viewModel));
        }
Пример #4
0
        public async Task <string> ExportAsync(TimetableKind kind, string timetableName, ICollection <Lesson> lessons)
        {
            var fileName  = timetableName + "_" + DateTime.Now.ToString("dd-M-yyyy-h-mm-ss");
            var vacations = await Vacation.LoadForYearAsync(Bundesland.Hessen, DateTime.Now.Year.ToString());

            vacations.Insert(vacations.FindIndex(v => v.Title == "Osterferien 2017 Hessen"), new Vacation("HACKY", new DateTime(2017, 1, 1), new DateTime(2017, 2, 3)));
            var semesterDates = await Vacation.GetSemesterDatesAsync(Semester.Second, vacations);

            var semesterStart = semesterDates.Item1;
            var semesterEnd   = semesterDates.Item2;

            var calendar = new Calendar();

            for (int i = 0; i < vacations.Count - 1; i++)
            {
                var yearPartStart = vacations[i].End.AddDays(3);
                var yearPartEnd   = vacations[i + 1].Begin;

                // Workaround for inconsistent vacation data by api, ensure start is monday
                if (yearPartStart.DayOfWeek != DayOfWeek.Monday && yearPartStart.DayOfWeek != DayOfWeek.Saturday && yearPartStart.DayOfWeek != DayOfWeek.Sunday)
                {
                    yearPartStart = yearPartStart.AddDays((int)DayOfWeek.Monday - (int)yearPartStart.DayOfWeek);
                }
                else if (yearPartStart.DayOfWeek == DayOfWeek.Saturday)
                {
                    yearPartStart = yearPartStart.AddDays(2);
                }
                else if (yearPartStart.DayOfWeek == DayOfWeek.Sunday)
                {
                    yearPartStart = yearPartStart.AddDays(1);
                }

                if (yearPartStart >= semesterEnd || yearPartStart < semesterStart)
                {
                    continue;
                }

                foreach (var lesson in lessons)
                {
                    var dateStart = new DateTime(yearPartStart.Year, yearPartStart.Month, yearPartStart.Day, Periods.Hours[lesson.Period], Periods.Minutes[lesson.Period], 0);
                    dateStart = dateStart.AddDays((int)lesson.Day - (int)DayOfWeek.Monday);
                    int week = dateStart.GetIso8601WeekOfYear();

                    if (Vacation.IsInVacation(dateStart, vacations))
                    {
                        continue;
                    }

                    if (lesson.Week == Week.Odd && week % 2 == 0 || lesson.Week == Week.Even && week % 2 == 1)
                    {
                        dateStart = dateStart.AddDays(7);
                    }

                    var dateEnd = dateStart.AddMinutes(Periods.Duration * lesson.Duration + (lesson.Period != 8 ? lesson.Duration / 2 * 5 : 0));
                    var rrule   = new RecurrencePattern(FrequencyType.Weekly, lesson.Week == Week.Both ? 1 : 2);
                    rrule.Until = yearPartEnd;

                    var description = (kind == TimetableKind.Teacher ? "Kurs: " : "Lehrer: ") + lesson.TeacherOrSchoolClass;
                    var room        = Names.ResolveRoom(lesson.Room);

                    var calEvent = new Event()
                    {
                        Summary         = Names.ResolveSubject(lesson.Name),
                        Description     = description,
                        Location        = "Gesamtschule Hungen" + (!string.IsNullOrWhiteSpace(room) ? ": " + Names.ResolveRoom(lesson.Room) : string.Empty),
                        DtStart         = new CalDateTime(dateStart),
                        DtEnd           = new CalDateTime(dateEnd),
                        RecurrenceRules = { rrule },
                    };

                    calendar.Events.Add(calEvent);
                }
            }

            var serializer         = new CalendarSerializer(new SerializationContext());
            var serializedCalendar = serializer.SerializeToString(calendar);

            string filePath = Path.Combine("Static", "ICalendar", fileName + ".ics");

            File.WriteAllText(filePath, serializedCalendar);

            return(fileName);
        }
Пример #5
0
 public EditViewModel(TimetableKind kind, string element, List <LessonViewModel> lessons)
 {
     Kind    = kind;
     Element = element;
     Lessons = lessons.ToImmutableList();
 }