Пример #1
0
        /// <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);
        }
Пример #2
0
        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());
        }
Пример #3
0
        /// <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;
            }
        }