/// <summary> /// Checks for updates regarding the course catalogs /// </summary> /// <returns>Returns true if there is a new course catalog, else false</returns> private static async Task <bool> UpdateCourseCatalogsAsync(DatabaseContext db) { AddLog("Update for course catalogs started!", FatalityLevel.Normal, "Update course catalogs"); var parser = new PaulParser(); var newCatalogs = await parser.GetAvailableCourseCatalogs(); var relevantSemesters = SemesterName.ForRelevantThreeSemesters(); foreach (var semester in relevantSemesters) { AddLog($"Relevant semester: {semester.ShortTitle}", FatalityLevel.Normal, "Relevant semester"); } var relevantCatalogs = relevantSemesters .Select(semesterName => newCatalogs.FirstOrDefault(cat => cat.ShortTitle == semesterName.ShortTitle)) .Where(cat => cat != null) .ToList(); try { var catalogs = db.Catalogues.OrderBy(c => c.InternalID).ToList(); var catalogsToRemove = catalogs.Except(relevantCatalogs).ToList(); var catalogsToAdd = relevantCatalogs.Except(catalogs).ToList(); if (catalogsToRemove.Any() || catalogsToAdd.Any()) { // remove irrelevant course catalogs foreach (var catalog in catalogsToRemove) { await RemoveCourseCatalogAsync(db, catalog); } // add new course catalogs db.Catalogues.AddRange(catalogsToAdd); await db.SaveChangesAsync(); AddLog("Update for course catalogs complete!", FatalityLevel.Normal, "Update course catalogs"); return(true); } AddLog("Update for course catalogs complete!", FatalityLevel.Normal, "Update course catalogs"); return(true); } catch (Exception e) { AddLog(e.ToString(), FatalityLevel.Error, "Update course catalogs"); } return(false); }
public async Task <ActionResult> TestParsing() { var searchString = "L.104.12270"; var course = PaulRepository.Courses.FirstOrDefault(c => c.Id.Contains(searchString)); var parser = new PaulParser(); var courseCatalog = (await PaulRepository.GetCourseCataloguesAsync()).First(); var httpClient = new HttpClient(); var response = await httpClient.GetAsync("https://paul.uni-paderborn.de/scripts/mgrqispi.dll?APPNAME=CampusNet&PRGNAME=COURSEDETAILS&ARGUMENTS=-N000000000000001,-N000443,-N0,-N360765878897321,-N360765878845322,-N0,-N0,-N3,-A4150504E414D453D43616D7075734E6574265052474E414D453D414354494F4E26415247554D454E54533D2D4179675978627166464D546570353271395952533363394A33415A7A346450656F347A72514F7661686C327A34706559594179354333386A6C636975396B71334456666E492D4B6E6872493545326F45672E74437349727130616D55426B4B37627573455048356D4351544F42326B4759696B507333596C316E7555742E6E3D3D"); var doc = new HtmlDocument(); using (var db = new DatabaseContext(PaulRepository.Filename, "")) { db.Attach(courseCatalog); doc.LoadHtml(await response.Content.ReadAsStringAsync()); await parser.UpdateExamDates(doc, db, course); await db.SaveChangesAsync(); } return(Ok()); }
/// <summary> /// Updates all courses (could take some time) /// </summary> /// <returns>Task</returns> public static async Task UpdateAllCoursesAsync() { if (Interlocked.Exchange(ref _isUpdating, 1) != 1) { UpdateStarting?.Invoke(); List <CourseCatalog> catalogs = new List <CourseCatalog>(); var parser = new PaulParser(); using (var context = new DatabaseContext(_filename, _basePath)) { using (var transaction = context.Database.BeginTransaction()) { //Update course catalogs await UpdateCourseCatalogsAsync(context); transaction.Commit(); } catalogs = await GetCourseCataloguesAsync(context); Courses.Clear(); Courses = context.Courses.IncludeAll().ToList(); } AddLog("Update for all courses started!", FatalityLevel.Normal, ""); foreach (var catalog in catalogs) { using (var context = new DatabaseContext(_filename, _basePath)) { using (var transaction = context.Database.BeginTransaction()) { //Update courses in each course catalog await parser.UpdateCoursesInCourseCatalog(catalog, Courses, context); transaction.Commit(); } } } AddLog($"Update for all courses completed!", FatalityLevel.Normal, ""); using (var context = new DatabaseContext(_filename, _basePath)) { // Reload Courses and CourseFilter from Database Courses.Clear(); Courses = context.Courses.IncludeAll().ToList(); } using (var context = new DatabaseContext(_filename, _basePath)) { using (var transaction = context.Database.BeginTransaction()) { await parser.UpdateCategoryFilters(Courses, context); CategoryFilter.Clear(); CategoryFilter = context.CategoryFilters.IncludeAll().ToList(); transaction.Commit(); } } // Update the list of course catalogs in the public VM var sharedPublicVM = await ScheduleManager.Instance.GetPublicViewModelAsync(); await sharedPublicVM.RefreshAvailableSemestersAsync(); _isUpdating = 0; } }