Example #1
0
        public GradingScaleGradeDim GetGradingScaleGrade(GradingScale gradingScale, StudentGradeDim studentGrade)
        {
            if (!gradingScale.IsNumericGradingScale && !gradingScale.IsLetterGradingScale)
            {
                return(null);
            }

            if (gradingScale.IsNumericGradingScale && studentGrade.NumericGradeEarned != null)
            {
                var highestGradingScale = gradingScale.GradingScaleGradeDims.Last();
                if (highestGradingScale.UpperNumericGrade <= studentGrade.NumericGradeEarned)
                {
                    return(highestGradingScale);
                }

                return(gradingScale.GradingScaleGradeDims.FirstOrDefault(x => x.UpperNumericGrade >= studentGrade.NumericGradeEarned));
            }

            return(gradingScale.GradingScaleGradeDims.FirstOrDefault(x => string.Equals(x.LetterGrade, studentGrade.LetterGradeEarned, StringComparison.OrdinalIgnoreCase)));
        }
Example #2
0
        protected IDictionary <string, SortedList <GradingPeriodDim, StudentCourseGradingPeriodCalculation> > GetStudentGradingPeriods(string schoolKey)
        {
            IDictionary <string, SortedList <GradingPeriodDim, StudentCourseGradingPeriodCalculation> > studentGradingPeriodsDictionary;

            string cacheKey = "StudentSchoolAssessments" + schoolKey + "MetricId:" + GetMetricId();

            if (_memoryCache.TryGetValue(cacheKey, out studentGradingPeriodsDictionary))
            {
                return(studentGradingPeriodsDictionary);
            }
            studentGradingPeriodsDictionary = new Dictionary <string, SortedList <GradingPeriodDim, StudentCourseGradingPeriodCalculation> >();

            var schoolMinMaxDateDim = _context.SchoolMinMaxDateDims.Where(s => s.SchoolKey.Equals(schoolKey)).FirstOrDefault();

            if (schoolMinMaxDateDim == null || !schoolMinMaxDateDim.MaxDate.HasValue)
            {
                return(studentGradingPeriodsDictionary);
            }

            DateTime currentSchoolDay = schoolMinMaxDateDim.MaxDate.Value;
            List <GradingPeriodDim> gradingPeriodDims = StudentDataRepository.GetSchoolGradingPeriods(schoolKey);

            if (!gradingPeriodDims.Any())
            {
                return(studentGradingPeriodsDictionary);
            }

            IDictionary <string, List <StudentSectionDim> > studentSectionAssociationsDictionary = StudentDataRepository.GetStudentSectionAssociationsDictionary(schoolKey);
            IDictionary <string, List <StudentSchoolDim> >  studentSchoolAssociationsDictionary  = StudentDataRepository.GetStudentSchoolAssociationsDictionary(schoolKey);
            IDictionary <string, List <StudentGradeDim> >   studentGradeDbRecords = GetStudentGradeDbRecords(schoolKey);
            IDictionary <string, List <StudentGrade> >      studentGrades         = new Dictionary <string, List <StudentGrade> >();

            foreach (var studentGradeDbRecord in studentGradeDbRecords)
            {
                if (!studentGradeDbRecord.Value.Any())
                {
                    continue;
                }

                SortedList <GradingPeriodDim, StudentCourseGradingPeriodCalculation> studentCourseGradingPeriodCalculations = new SortedList <GradingPeriodDim, StudentCourseGradingPeriodCalculation>(new GradingPeriodComparer());
                foreach (var gradingPeriod in gradingPeriodDims)
                {
                    if (!gradingPeriod.ShouldBeIgnored(currentSchoolDay))
                    {
                        studentCourseGradingPeriodCalculations.Add(gradingPeriod, new StudentCourseGradingPeriodCalculation(CourseGradeGranularMetric, gradingPeriod, studentGradeDbRecord.Key));
                    }
                }

                StudentGrade studentGrade = new StudentGrade {
                    StudentKey = studentGradeDbRecord.Key
                };
                StudentGradeDim previousStudentGrade = null;
                foreach (var _studentGradeDbRecord in studentGradeDbRecord.Value)
                {
                    studentGrade.GradingPeriod = gradingPeriodDims.Where(sgp => _studentGradeDbRecord.GradingPeriodDescription.Equals(sgp.GradingPeriodDescription) &&
                                                                         _studentGradeDbRecord.GradingPeriodBeginDate.Equals(sgp.BeginDate))
                                                 .FirstOrDefault();
                    if (studentGrade.GradingPeriod == null)
                    {
                        continue;
                    }

                    if (studentSectionAssociationsDictionary.ContainsKey(studentGrade.StudentKey))
                    {
                        var studentSectionAssociations = studentSectionAssociationsDictionary[studentGrade.StudentKey];
                        studentGrade.StudentSection = studentSectionAssociations.Where(ssa => ssa.SectionIdentifier.Equals(_studentGradeDbRecord.SectionIdentifier) &&
                                                                                       ssa.LocalCourseCode.Equals(_studentGradeDbRecord.LocalCourseCode) &&
                                                                                       ssa.SessionName.Equals(_studentGradeDbRecord.SessionName) &&
                                                                                       ssa.SchoolYear.Equals(_studentGradeDbRecord.SchoolYear.ToString()) &&
                                                                                       ssa.SchoolKey.Equals(_studentGradeDbRecord.SchoolKey))
                                                      .FirstOrDefault();
                        if (studentGrade.StudentSection == null || !studentGrade.StudentSection.OverlapsWith(studentGrade.GradingPeriod))
                        {
                            continue;
                        }
                    }

                    if (previousStudentGrade != null &&
                        SectionComparer.Instance.Equals(previousStudentGrade, _studentGradeDbRecord) &&
                        previousStudentGrade.GradingPeriodBeginDate.Equals(_studentGradeDbRecord.GradingPeriodBeginDate) &&
                        !previousStudentGrade.GradeType.Equals(_studentGradeDbRecord.GradeType) &&
                        previousStudentGrade.SchoolYear == _studentGradeDbRecord.SchoolYear &&
                        previousStudentGrade.GradingPeriodSequence == _studentGradeDbRecord.GradingPeriodSequence)
                    {
                        continue;
                    }
                    previousStudentGrade = _studentGradeDbRecord;

                    if (studentGrade.GradingPeriod.BeginDate > currentSchoolDay)
                    {
                        continue;
                    }

                    var studentSchoolAssociation = studentSchoolAssociationsDictionary[studentGrade.StudentKey].FirstOrDefault(ssa => ssa.OverlapsWith(studentGrade.GradingPeriod));
                    if (studentSchoolAssociation == null)
                    {
                        continue;
                    }

                    var gradingScales = GradingScaleRepository.GetGradingScales(studentSchoolAssociation.LocalEducationAgencyKey.ToString());
                    if (!gradingScales.Any())
                    {
                        continue;
                    }

                    var gradingScale = gradingScales.Where(gradingScale => gradingScale.GradingScaleGradeLevelDims.Any() &&
                                                           gradingScale.GradingScaleGradeLevelDims.Exists(gradingScaleGradeLevelDim => gradingScaleGradeLevelDim.GradeLevelDescription.Equals(studentSchoolAssociation.GradeLevel)))
                                       .FirstOrDefault();
                    if (gradingScale == null)
                    {
                        continue;
                    }

                    var gradeScaleGradeRank = GradingScaleRepository.GetGradingScaleGrade(gradingScale, _studentGradeDbRecord);
                    if (gradeScaleGradeRank == null)
                    {
                        continue;
                    }

                    studentGrade.GradeRank                = gradeScaleGradeRank.Rank;
                    studentGrade.GradingScale             = gradingScale;
                    studentGrade.StudentSchoolAssociation = studentSchoolAssociation;

                    if (!AcademicSubjects.Contains(studentGrade.StudentSection.Subject))
                    {
                        continue;
                    }

                    if (!currentSchoolDay.IsInRange(studentGrade.StudentSchoolAssociation) &&
                        !studentGrade.GradingScale.GradingScaleMetricThresholdDims.ContainsKey(_metricInfo.Id))
                    {
                        continue;
                    }

                    if (!studentGrade.GradingScale.GradingScaleMetricThresholdDims.ContainsKey(CourseGradeContainerMetric.Id))
                    {
                        continue;
                    }
                    studentGrade.GradingScaleMetricThreshold = studentGrade.GradingScale.GradingScaleMetricThresholdDims[CourseGradeContainerMetric.Id];

                    if (studentGrade.GradingPeriod.ShouldBeIgnored(currentSchoolDay))
                    {
                        continue;
                    }

                    var index = studentCourseGradingPeriodCalculations.IndexOfKey(studentGrade.GradingPeriod);
                    if (index < 0)
                    {
                        continue;
                    }

                    var gradingPeriodData         = studentCourseGradingPeriodCalculations.Values[index];
                    var previousGradingPeriodData = (index == 0) ? null : studentCourseGradingPeriodCalculations.Values[index - 1];

                    var studentGradeContainer = gradingPeriodData.AddStudentGrade(studentGrade);

                    var failing = IsFailing(studentGrade, studentGrade.GradingScaleMetricThreshold);
                    if (failing)
                    {
                        gradingPeriodData.NumberOfGradesAtOrBelowThreshold++;
                    }
                    var metricStateType = CourseGradeGranularMetric.GetMetricStateTypeForStudentCourseGrades(gradingPeriodData.NumberOfGradesAtOrBelowThreshold);
                    gradingPeriodData.MetricStateType = metricStateType;

                    CalculateMetricComponentTrend(studentGradeContainer, previousGradingPeriodData);

                    if (index == studentCourseGradingPeriodCalculations.Count - 1)
                    {
                        gradingPeriodData.LastCompletedGradingPeriod = true;
                    }
                }

                studentGradingPeriodsDictionary[studentGradeDbRecord.Key] = studentCourseGradingPeriodCalculations;
            }

            var cacheEntryOptions = new MemoryCacheEntryOptions()
                                    .SetSize(200)//Size amount
                                    .SetPriority(CacheItemPriority.High)
                                    .SetSlidingExpiration(TimeSpan.FromMinutes(15))
                                    .SetAbsoluteExpiration(TimeSpan.FromMinutes(60));

            _memoryCache.Set(cacheKey, studentGradingPeriodsDictionary, cacheEntryOptions);

            return(studentGradingPeriodsDictionary);
        }