using System.Globalization; using Microsoft.AspNetCore.Mvc; using UWLecturePlan.Models; using UWLib; using Microsoft.EntityFrameworkCore; namespace UWLecturePlan.Controllers { public class LectureController : Controller { public IActionResult Index(LecturesViewModel model) { LectureContext db = new LectureContext(@"D:\Projects\C#\UWScraper\UWScraper\bin\Debug\net8.0\lecture.db"); if (model.CurrentSemester == null) { model.CurrentSemester = GetSemester(DateTime.Now); } var from = DateTime.Now; model.LectureEvents = db.LectureEvents.Include(x=>x.Lecture) .Where(x => x.From >= from) .Where(x => x.Lecture.Semester == model.CurrentSemester) .ToList(); if (model.LocationFilter != null) { model.LectureEvents = model.LectureEvents .Where(x => x.Location.Contains(model.LocationFilter)).ToList(); } return View(model); } // This presumes that weeks start with Monday. // Week 1 is the 1st week of the year with a Thursday in it. public static int GetIso8601WeekOfYear(DateTime time) { // Seriously cheat. If its Monday, Tuesday or Wednesday, then it'll // be the same week# as whatever Thursday, Friday or Saturday are, // and we always get those right DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time); if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday) { time = time.AddDays(3); } // Return the week of our adjusted day return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); } public static DateTime FirstDateOfWeekISO8601(int year, int weekOfYear) { DateTime jan1 = new DateTime(year, 1, 1); int daysOffset = DayOfWeek.Thursday - jan1.DayOfWeek; // Use first Thursday in January to get first week of the year as // it will never be in Week 52/53 DateTime firstThursday = jan1.AddDays(daysOffset); var cal = CultureInfo.CurrentCulture.Calendar; int firstWeek = cal.GetWeekOfYear(firstThursday, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); var weekNum = weekOfYear; // As we're adding days to a date in Week 1, // we need to subtract 1 in order to get the right date for week #1 if (firstWeek == 1) { weekNum -= 1; } // Using the first Thursday as starting week ensures that we are starting in the right year // then we add number of weeks multiplied with days var result = firstThursday.AddDays(weekNum * 7); // Subtract 3 days from Thursday to get Monday, which is the first weekday in ISO8601 return result.AddDays(-3); } public static string GetSemester(DateTime time) { return time.Year + (time.Month <= 6 ? "S" : "W"); } } }