protected override Task LoadAsyncOverride()
        {
            DataItemClass dataClass;

            DataItemWeightCategory[]        dataWeightCategories;
            BaseDataItemHomeworkExamGrade[] dataGrades;

            dataClass            = _originalClass.DataItem as DataItemClass;
            dataWeightCategories = _originalClass.WeightCategories.Select(i => i.DataItem as DataItemWeightCategory).ToArray();
            dataGrades           = _originalClass.WeightCategories.SelectMany(i => i.Grades).Select(i => i.DataItem as BaseDataItemHomeworkExamGrade).ToArray();

            ViewItemClass classItem;

            classItem = new ViewItemClass(
                dataClass,
                createWeightMethod: CreateWeight);

            classItem.FilterAndAddChildren(dataWeightCategories);

            foreach (var weight in classItem.WeightCategories)
            {
                weight.FilterAndAddChildren(dataGrades);
            }

            Class = classItem;

            Class.CalculateEverything();
            Class.PrepareForWhatIf();
            DesiredGPA = Class.GPA;

            return(Task.FromResult(true));
        }
Beispiel #2
0
        private async Task LoadBlocking(ViewItemSemester viewItemSemester, bool includeWeights)
        {
            var dataStore = await GetDataStore();

            DataItemClass dataClass;

            DataItemClass[]          dataClasses;
            DataItemSchedule[]       dataSchedules;
            DataItemWeightCategory[] dataWeights;

            using (await Locks.LockDataForReadAsync("ClassViewItemsGroup.LoadBlocking"))
            {
                dataClasses = viewItemSemester.Classes.Select(i => i.DataItem).OfType <DataItemClass>().ToArray();

                var viewClassRef = viewItemSemester.Classes.FirstOrDefault(i => i.Identifier == _classId);
                dataClass = viewClassRef?.DataItem as DataItemClass;

                if (dataClass == null)
                {
                    throw new ClassNotFoundExcetion();
                }

                dataSchedules = viewClassRef.Schedules.Select(i => i.DataItem).OfType <DataItemSchedule>().ToArray();

                if (includeWeights)
                {
                    // Get weights for ALL classes, since we need them for editing purposes when editing item to different class
                    dataWeights = viewItemSemester.Classes.SelectMany(i => i.WeightCategories).Select(i => i.DataItem).OfType <DataItemWeightCategory>().ToArray();
                }
                else
                {
                    dataWeights = null;
                }

                Func <DataItemWeightCategory, ViewItemWeightCategory> createWeight = null;
                if (includeWeights)
                {
                    createWeight = CreateWeight;
                }

                var classItem = new ViewItemClass(
                    dataClass,
                    createScheduleMethod: CreateSchedule,
                    createWeightMethod: createWeight);

                classItem.FilterAndAddChildren(dataSchedules);

                if (includeWeights)
                {
                    classItem.FilterAndAddChildren(dataWeights);
                }

                this.Class = classItem;

                _semester = new ViewItemSemester(dataClass.UpperIdentifier, createClassMethod: CreateClass);

                dataClasses = dataStore.TableClasses.Where(i => i.UpperIdentifier == _semester.Identifier).ToArray();

                _semester.FilterAndAddChildren(dataClasses);

                // Add the weights for the other classes
                if (includeWeights)
                {
                    foreach (var c in _semester.Classes.Where(i => i.Identifier != this.Class.Identifier))
                    {
                        c.FilterAndAddChildren(dataWeights);
                    }
                }
            }

            // If there were no weights in the class, we need to create and add a weight
            if (this.Class.WeightCategories != null && this.Class.WeightCategories.Count == 0)
            {
                TelemetryExtension.Current?.TrackEvent("Error_ClassMissingWeightCategoryAddingDefault");

                DataChanges changes = new DataLayer.DataChanges();
                changes.Add(AccountDataStore.CreateDefaultWeightCategory(this.Class.Identifier));

                await PowerPlannerApp.Current.SaveChanges(changes);
            }
        }