Beispiel #1
0
        public IDictionary <Period, PeriodData> GetPeriodData(string schoolkey, int periodLength)
        {
            string cacheKey = "PeriodLength:" + periodLength + ":PeriodData:" + schoolkey;
            IDictionary <Period, PeriodData> periodData;

            if (_memoryCache.TryGetValue(cacheKey, out periodData))
            {
                return(periodData);
            }

            var schoolCalendarDays = StudentDataRepository.GetSchoolCalendarDays(schoolkey);

            IReadOnlyCollection <Period> Periods = Enum.GetValues(typeof(Period))
                                                   .Cast <Period>()
                                                   .ToArray();

            periodData = new SortedList <Period, PeriodData>();
            foreach (var period in Periods)
            {
                periodData[period] = new PeriodData();
            }

            schoolCalendarDays.ForEach((Action <SchoolCalendarDim>)(schoolCalendarDay =>
            {
                var periodIndex = schoolCalendarDay.GetPeriodIndex(periodLength);
                if (periodIndex > 2)
                {
                    return;
                }

                var period      = (Period)periodIndex;
                var periodDatum = periodData[period];
                periodDatum.CalendarDates.Add(schoolCalendarDay.Date);
            }));


            int i = 0;

            foreach (var periodDatum in periodData.Values)
            {
                if (periodDatum.CalendarDates.Count < periodLength)
                {
                    periodDatum.CalendarDates.Clear();
                }
                i++;
            }

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

            _memoryCache.Set(cacheKey, periodData, cacheEntryOptions);

            return(periodData);
        }
Beispiel #2
0
        public override IDictionary <string, List <StudentMetric> > GetAllStudentMetricsForSchool(string schoolKey)
        {
            string cacheKey = "schoolKey:" + schoolKey + " MetricId:" + GetMetricId();

            IDictionary <string, List <StudentMetric> > returnMap;

            if (_memoryCache.TryGetValue(cacheKey, out returnMap))
            {
                return(returnMap);
            }

            returnMap = new Dictionary <string, List <StudentMetric> >();
            IDictionary <string, List <StudentAttendanceEvent> > studentAttendanceEventDictionary     = getStudentAttendanceEvents(schoolKey);
            IDictionary <string, List <StudentSchoolDim> >       studentSchoolAssociationsDictionary  = StudentDataRepository.GetStudentSchoolAssociationsDictionary(schoolKey);
            IDictionary <string, List <StudentSectionDim> >      studentSectionAssociationsDictionary = getStudentSectionAssociationsDictionary(schoolKey);

            foreach (string studentKey in studentAttendanceEventDictionary.Keys)
            {
                List <StudentAttendanceEvent> studentAttendanceEvents    = studentAttendanceEventDictionary[studentKey];
                List <StudentSchoolDim>       studentSchoolAssociations  = studentSchoolAssociationsDictionary.ContainsKey(studentKey) ? studentSchoolAssociationsDictionary[studentKey] : new List <StudentSchoolDim>();
                List <StudentSectionDim>      studentSectionAssociations = studentSectionAssociationsDictionary.ContainsKey(studentKey) ? studentSectionAssociationsDictionary[studentKey] : new List <StudentSectionDim>();

                int metricCount = GetMetricCount(studentAttendanceEvents);
                HashSet <DateTime> schoolCalendarDaysAsSet = new HashSet <DateTime>();
                StudentDataRepository.GetSchoolCalendarDays(schoolKey).ForEach(s => schoolCalendarDaysAsSet.Add(s.Date));

                var     daysStudentWasEnrolled       = GetDaysStudentWasEnrolled(true, schoolCalendarDaysAsSet, studentSchoolAssociations, studentSectionAssociations).Count;
                decimal ytdClassPeriodAttendanceRate = GetYtdAttendanceRate(metricCount, daysStudentWasEnrolled);

                var metricStateType = _metricInfo.GetMetricStateType(ytdClassPeriodAttendanceRate, null);
                var metricState     = MetricUtility.GetMetricState(metricStateType.Value);

                if (!returnMap.ContainsKey(studentKey))
                {
                    returnMap[studentKey] = new List <StudentMetric>();
                }

                returnMap[studentKey].Add(new StudentMetric
                {
                    Id             = _metricInfo.Id,
                    Name           = _metricInfo.DisplayName,
                    Value          = ytdClassPeriodAttendanceRate.Display().DisplayValue(DISPLAY_FORMAT_ATTENDANCE_RATE),
                    State          = metricState,
                    TrendDirection = null,
                });
            }

            _memoryCache.Set(cacheKey, returnMap, _cacheEntryOptions);
            return(returnMap);
        }
Beispiel #3
0
        public void ResizeImage(String indexNo)
        {
            StudentDataRepository sdr = new StudentDataRepository();
            Student student           = sdr.GetStudent(indexNo);

            if (student == null)
            {
                Trace.TraceInformation(String.Format("Student sa brojem indeksa {0} ne postoji!", indexNo), "Information");
                return;
            }
            BlobHelper blobHelper     = new BlobHelper();
            string     uniqueBlobName = string.Format("image_{0}", student.RowKey);
            Image      image          = blobHelper.DownloadImage("vezba", uniqueBlobName);

            image = ImageConvertes.ConvertImage(image);
            string thumbnailUrl = blobHelper.UploadImage(image, "vezba", uniqueBlobName +
                                                         "thumb");

            student.ThumbnailUrl = thumbnailUrl;
            sdr.AddOrReplaceStudent(student);
        }
Beispiel #4
0
        public IDictionary <DateTime, Period> GetSchoolDaysPeriod(string schoolkey, int?periodLength)
        {
            string cacheKey = "SchoolDaysPeriod:" + schoolkey + ":PeriodLength" + (ReportingPeriodLength.HasValue ? ReportingPeriodLength.Value : 99999);
            IDictionary <DateTime, Period> schoolDaysPeriod;

            if (_memoryCache.TryGetValue(cacheKey, out schoolDaysPeriod))
            {
                return(schoolDaysPeriod);
            }

            schoolDaysPeriod = new Dictionary <DateTime, Period>();
            var schoolCalendarDays = StudentDataRepository.GetSchoolCalendarDays(schoolkey);
            IReadOnlyCollection <Period> Periods = Enum.GetValues(typeof(Period)).Cast <Period>().ToArray();

            schoolCalendarDays.ForEach(schoolCalendarDay =>
            {
                var periodIndex = (periodLength == null) ? (int)Period.First : schoolCalendarDay.GetPeriodIndex(periodLength.Value);
                if (periodIndex > Periods.Count)
                {
                    return;
                }

                var period = (Period)periodIndex;
                schoolDaysPeriod[schoolCalendarDay.Date] = period;
            });

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

            _memoryCache.Set(cacheKey, schoolDaysPeriod, cacheEntryOptions);

            return(schoolDaysPeriod);
        }
Beispiel #5
0
        public override IDictionary <string, List <StudentMetric> > GetAllStudentMetricsForSchool(string schoolKey)
        {
            string cacheKey = "schoolKey:" + schoolKey + " MetricId:" + GetMetricId();

            IDictionary <string, List <StudentMetric> > returnMap;

            if (_memoryCache.TryGetValue(cacheKey, out returnMap))
            {
                return(returnMap);
            }

            int periodLength = GetPeriodLength();

            returnMap = new Dictionary <string, List <StudentMetric> >();
            IDictionary <Period, PeriodData> periodDataDictionary = GetPeriodData(schoolKey, periodLength);
            PeriodData firstPeriodData  = periodDataDictionary[Period.First];
            PeriodData secondPeriodData = periodDataDictionary[Period.Second];
            IDictionary <string, List <StudentAttendanceEvent> > studentAttendanceEventDictionary     = getStudentAttendanceEvents(schoolKey);
            IDictionary <string, List <StudentSchoolDim> >       studentSchoolAssociationsDictionary  = StudentDataRepository.GetStudentSchoolAssociationsDictionary(schoolKey);
            IDictionary <string, List <StudentSectionDim> >      studentSectionAssociationsDictionary = getStudentSectionAssociationsDictionary(schoolKey);


            foreach (string studentKey in studentAttendanceEventDictionary.Keys)
            {
                List <StudentAttendanceEvent> studentAttendanceEvents    = studentAttendanceEventDictionary[studentKey];
                List <StudentSchoolDim>       studentSchoolAssociations  = studentSchoolAssociationsDictionary.ContainsKey(studentKey) ? studentSchoolAssociationsDictionary[studentKey] : new List <StudentSchoolDim>();
                List <StudentSectionDim>      studentSectionAssociations = studentSectionAssociationsDictionary.ContainsKey(studentKey) ? studentSectionAssociationsDictionary[studentKey] : new List <StudentSectionDim>();

                //var firstPeriodAttendanceEvents = studentAttendanceEvents.Where(studentAttendanceEvent => firstPeriodData.CalendarDates.Any()
                //                                                                && studentAttendanceEvent.EventDate.IsBetween(firstPeriodData.CalendarDates.Min(), firstPeriodData.CalendarDates.Max()));


                List <StudentAttendanceEvent> firstPeriodMetricAttendanceEvents = GetMetricAttendanceEvents(studentAttendanceEvents, firstPeriodData);
                //var firstPeriodDailyAttendanceRateAttendanceEvents = firstPeriodAttendanceEvents.Where(studentAttendanceEvent => studentAttendanceEvent.IsForDailyAttendance()
                //                                                && (studentAttendanceEvent.AttendanceEventCategoryDescriptor.Equals(AttendanceEventCategoryDescriptor.ExcusedAbsence)
                //                                                    || studentAttendanceEvent.AttendanceEventCategoryDescriptor.Equals(AttendanceEventCategoryDescriptor.UnexcusedAbsence)))
                //                                            .DistinctBy(studentAttendanceEvent => studentAttendanceEvent.EventDate)
                //                                            .ToList();



                List <StudentAttendanceEvent> secondPeriodMetricAttendanceEvents = GetMetricAttendanceEvents(studentAttendanceEvents, secondPeriodData);

                var firstPeriodDenominator = GetDaysStudentWasEnrolled(IsClassPeriodAbsenceRateMetric(), firstPeriodData.CalendarDates, studentSchoolAssociations, studentSectionAssociations).Count;

                if (firstPeriodDenominator >= periodLength)
                {
                    var  secondPeriodDenominator = GetDaysStudentWasEnrolled(IsClassPeriodAbsenceRateMetric(), secondPeriodData.CalendarDates, studentSchoolAssociations, studentSectionAssociations).Count;
                    var  firstPeriodNumerator    = GetPeriodNumerator(firstPeriodMetricAttendanceEvents, firstPeriodDenominator);
                    var  firstPeriodRatio        = ((decimal)firstPeriodNumerator / firstPeriodDenominator).RoundTo(3);
                    var  secondPeriodNumerator   = GetPeriodNumerator(secondPeriodMetricAttendanceEvents, secondPeriodDenominator);
                    int? trend;
                    bool flag;
                    GetTrendByAttendance(firstPeriodDenominator, secondPeriodDenominator, firstPeriodNumerator, secondPeriodNumerator, _metricInfo.RateDirection, out trend, out flag);
                    var metricStateType = _metricInfo.GetMetricStateType(firstPeriodRatio, null);
                    var metricState     = MetricUtility.GetMetricState(metricStateType.Value);

                    if (!returnMap.ContainsKey(studentKey))
                    {
                        returnMap[studentKey] = new List <StudentMetric>();
                    }
                    returnMap[studentKey].Add(new StudentMetric
                    {
                        Id             = _metricInfo.Id,
                        Name           = string.Format(_metricInfo.DisplayName, periodLength),
                        Value          = firstPeriodRatio.Display().DisplayValue(DISPLAY_FORMAT_ATTENDANCE_RATE),
                        TrendDirection = trend ?? null,
                        State          = metricState
                    });
                }
            }

            _memoryCache.Set(cacheKey, returnMap, _cacheEntryOptions);
            return(returnMap);
        }
Beispiel #6
0
        protected override IDictionary <string, StudentAssessmentDim> GetStudentAssessments(string schoolKey)
        {
            IDictionary <string, StudentAssessmentDim> studentAssessmentsDictionary;

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

            if (_memoryCache.TryGetValue(cacheKey, out studentAssessmentsDictionary))
            {
                return(studentAssessmentsDictionary);
            }
            studentAssessmentsDictionary = new Dictionary <string, StudentAssessmentDim>();

            var schoolDays = StudentDataRepository.GetSchoolCalendarDays(schoolKey).Select(calendarDay => calendarDay.Date).ToList();

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

            if (schoolMinMaxDateDim == null)
            {
                return(studentAssessmentsDictionary);
            }

            var studentAssessmentsDbRecords = GetStudentAssessmentsDbRecords(schoolKey);

            foreach (var studentAssessmentDbRecord in studentAssessmentsDbRecords)
            {
                if (studentAssessmentDbRecord.Value.Assessments.Any())
                {
                    List <StudentAssessmentDim> studentAssessmentDims = new List <StudentAssessmentDim>();
                    foreach (var assessmentDim in studentAssessmentDbRecord.Value.Assessments)
                    {
                        if (assessmentDim.AdministrationDate > schoolMinMaxDateDim.MaxDate)
                        {
                            continue;
                        }

                        if (!(AcademicSubjects.Contains(assessmentDim.AcademicSubject) && AssessmentCategories.Contains(assessmentDim.AssessmentCategory)))
                        {
                            continue;
                        }

                        if (!studentAssessmentDbRecord.Value.ScoreResults.Any())
                        {
                            continue;
                        }
                        var scoreResults = studentAssessmentDbRecord.Value.ScoreResults.Where(sr => sr.StudentAssessmentIdentifier.Equals(assessmentDim.StudentAssessmentIdentifier, StringComparison.Ordinal) &&
                                                                                              sr.AssessmentIdentifier.Equals(assessmentDim.AssessmentIdentifier, StringComparison.Ordinal) &&
                                                                                              sr.Namespace.Equals(assessmentDim.Namespace, StringComparison.Ordinal) &&
                                                                                              sr.ReportingMethod.Equals(AssessmentReportingMethodType, StringComparison.Ordinal))
                                           .ToList();
                        if (!scoreResults.Any())
                        {
                            continue;
                        }

                        assessmentDim.ScoreResults = scoreResults;
                        studentAssessmentDims.Add(assessmentDim);
                    }
                    if (studentAssessmentDims.Any())
                    {
                        var mostRecentAssessment = studentAssessmentDims.Where(assessment => string.IsNullOrEmpty(assessment.ReasonNotTested))
                                                   .OrderByDescending(assessment => assessment.AdministrationDate).FirstOrDefault();
                        if (mostRecentAssessment != null)
                        {
                            var numerator       = mostRecentAssessment.ScoreResults.Single(x => x.ReportingMethod.Equals(AssessmentReportingMethodType)).Result.ToNullableDecimal();
                            var assessmentRatio = numerator.DivideBySafeAndRound(mostRecentAssessment.MaxScoreResult);
                            if (assessmentRatio == null)
                            {
                                continue;
                            }
                            mostRecentAssessment.BenchmarkAssessmentRatio = assessmentRatio;
                            studentAssessmentsDictionary[mostRecentAssessment.StudentKey] = mostRecentAssessment;
                        }
                    }
                    else
                    {
                        studentAssessmentsDictionary[studentAssessmentDbRecord.Key] = null;
                    }
                }
            }

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

            _memoryCache.Set(cacheKey, studentAssessmentsDictionary, cacheEntryOptions);

            return(studentAssessmentsDictionary);
        }
Beispiel #7
0
        protected override IDictionary <string, StudentAssessmentDim> GetStudentAssessments(string schoolKey)
        {
            IDictionary <string, StudentAssessmentDim> studentAssessmentsDictionary;

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

            if (_memoryCache.TryGetValue(cacheKey, out studentAssessmentsDictionary))
            {
                return(studentAssessmentsDictionary);
            }
            studentAssessmentsDictionary = new Dictionary <string, StudentAssessmentDim>();

            var schoolDays = StudentDataRepository.GetSchoolCalendarDays(schoolKey).Select(calendarDay => calendarDay.Date).ToList();

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

            if (schoolMinMaxDateDim == null)
            {
                return(studentAssessmentsDictionary);
            }

            var studentAssessmentsDbRecords = GetStudentAssessmentsDbRecords(schoolKey);

            foreach (var studentAssessmentDbRecord in studentAssessmentsDbRecords)
            {
                if (studentAssessmentDbRecord.Value.Assessments.Any())
                {
                    StudentAssessmentDim studentAssessment = new StudentAssessmentDim {
                        AssessmentCorrectItems = 0, AssessmentTotalItems = 0
                    };
                    foreach (var assessmentDim in studentAssessmentDbRecord.Value.Assessments)
                    {
                        if (assessmentDim.AdministrationDate > schoolMinMaxDateDim.MaxDate)
                        {
                            continue;
                        }

                        if (!schoolDays.Contains(assessmentDim.AdministrationDate))
                        {
                            continue;
                        }

                        if (!(AcademicSubjects.Contains(assessmentDim.AcademicSubject) && AssessmentCategories.Contains(assessmentDim.AssessmentCategory)))
                        {
                            continue;
                        }

                        if (!studentAssessmentDbRecord.Value.ScoreResults.Any())
                        {
                            continue;
                        }
                        if (!studentAssessmentDbRecord.Value.AssessmentItems.Any())
                        {
                            continue;
                        }
                        var assessmentItems = studentAssessmentDbRecord.Value.AssessmentItems.Where(sr => sr.StudentAssessmentIdentifier.Equals(assessmentDim.StudentAssessmentIdentifier, StringComparison.Ordinal) &&
                                                                                                    sr.AssessmentIdentifier.Equals(assessmentDim.AssessmentIdentifier, StringComparison.Ordinal) &&
                                                                                                    sr.Namespace.Equals(assessmentDim.Namespace, StringComparison.Ordinal))
                                              .ToList();
                        if (!assessmentItems.Any())
                        {
                            continue;
                        }

                        studentAssessment.AssessmentTotalItems   += assessmentItems.Count();
                        studentAssessment.AssessmentCorrectItems += assessmentItems.Where(ai => AssessmentItemResults.Contains(ai.AssessmentItemResult)).Count();
                    }

                    studentAssessmentsDictionary[studentAssessmentDbRecord.Key] = studentAssessment;
                }
            }

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

            _memoryCache.Set(cacheKey, studentAssessmentsDictionary, cacheEntryOptions);

            return(studentAssessmentsDictionary);
        }
Beispiel #8
0
        protected IDictionary <string, StudentAssessment> GetStudentAssessmentsDbRecords(string schoolKey)
        {
            IDictionary <string, StudentAssessment> studentAssessmentDictionary;

            string cacheKey = "StudentAssessmentsDbRecords" + schoolKey;

            if (_memoryCache.TryGetValue(cacheKey, out studentAssessmentDictionary))
            {
                return(studentAssessmentDictionary);
            }

            studentAssessmentDictionary = new Dictionary <string, StudentAssessment>();

            IDictionary <string, List <StudentSchoolDim> > studentSchoolAssociationsDictionary = StudentDataRepository.GetStudentSchoolAssociationsDictionary(schoolKey);

            List <string> studentUniqueIds = studentSchoolAssociationsDictionary.Select(d => d.Key).ToList();

            var studentAssessmentDbRecords = (from studentAssessment in _context.StudentAssessmentDims.AsNoTracking()
                                              where studentAssessment.SchoolKey.Equals(schoolKey) && studentUniqueIds.Contains(studentAssessment.StudentKey)
                                              select studentAssessment)
                                             .ToList()
                                             .OrderBy(a => a.StudentKey);

            var studentAssessmentDbRecordsDictionary = studentAssessmentDbRecords
                                                       .GroupBy(x => x.StudentKey)
                                                       .ToDictionary(x => x.Key, x => x.ToList()
                                                                     .OrderBy(a => a.AdministrationDate));

            var studentAssessmentScoreResultsDbRecords = (from sasrd in _context.StudentAssessmentScoreResultDims.AsNoTracking()
                                                          where sasrd.SchoolKey.Equals(schoolKey) && studentUniqueIds.Contains(sasrd.StudentKey)
                                                          select sasrd)
                                                         .ToList()
                                                         .OrderBy(a => a.StudentKey);

            var studentAssessmentScoreResultsDbRecordsDictionary = studentAssessmentScoreResultsDbRecords
                                                                   .GroupBy(x => x.StudentKey)
                                                                   .ToDictionary(x => x.Key, x => x.ToList()
                                                                                 .OrderBy(a => a.AdministrationDate));

            var studentAssessmentItemsDbRecords = (from sasrd in _context.StudentAssessmentItemDims.AsNoTracking()
                                                   where sasrd.SchoolKey.Equals(schoolKey) && studentUniqueIds.Contains(sasrd.StudentKey)
                                                   select sasrd)
                                                  .ToList()
                                                  .OrderBy(a => a.StudentKey);

            var studentAssessmentItemsDbRecordsDictionary = studentAssessmentItemsDbRecords
                                                            .GroupBy(x => x.StudentKey)
                                                            .ToDictionary(x => x.Key, x => x.ToList()
                                                                          .OrderBy(a => a.AdministrationDate));


            foreach (var studentUniqueId in studentUniqueIds)
            {
                var studentAssessment = new StudentAssessment {
                    StudentKey = studentUniqueId
                };
                if (studentAssessmentDbRecordsDictionary.ContainsKey(studentUniqueId))
                {
                    studentAssessment.Assessments = studentAssessmentDbRecordsDictionary[studentUniqueId].ToList();
                }
                if (studentAssessmentScoreResultsDbRecordsDictionary.ContainsKey(studentUniqueId))
                {
                    studentAssessment.ScoreResults = studentAssessmentScoreResultsDbRecordsDictionary[studentUniqueId].ToList();
                }
                if (studentAssessmentItemsDbRecordsDictionary.ContainsKey(studentUniqueId))
                {
                    studentAssessment.AssessmentItems = studentAssessmentItemsDbRecordsDictionary[studentUniqueId].ToList();
                }
                studentAssessmentDictionary[studentUniqueId] = studentAssessment;
            }
            var cacheEntryOptions = new MemoryCacheEntryOptions()
                                    .SetSize(1000)//Size amount
                                    .SetPriority(CacheItemPriority.High)
                                    .SetSlidingExpiration(TimeSpan.FromMinutes(15))
                                    .SetAbsoluteExpiration(TimeSpan.FromMinutes(60));

            _memoryCache.Set(cacheKey, studentAssessmentDictionary, cacheEntryOptions);

            return(studentAssessmentDictionary);
        }
Beispiel #9
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);
        }
Beispiel #10
0
        public override IDictionary <string, List <StudentMetric> > GetAllStudentMetricsForSchool(string schoolKey)
        {
            string cacheKey = "schoolKey:" + schoolKey + " MetricId:" + GetMetricId();

            IDictionary <string, List <StudentMetric> > returnMap;

            if (_memoryCache.TryGetValue(cacheKey, out returnMap))
            {
                return(returnMap);
            }

            returnMap = new Dictionary <string, List <StudentMetric> >();
            var schoolMinMaxDateDim = _context.SchoolMinMaxDateDims.Where(s => s.SchoolKey.Equals(schoolKey.ToString())).FirstOrDefault();

            if (schoolMinMaxDateDim == null)
            {
                //"No entry found in analytics.SchoolMinMaxDateDim
                return(returnMap);
            }

            var ytdGradingPeriod = new GradingPeriodDim
            {
                BeginDate = schoolMinMaxDateDim.MinDate.Value,
                EndDate   = schoolMinMaxDateDim.MaxDate.Value,
                GradingPeriodDescription = string.Empty,
                IsYearToDate             = true
            };

            int temp;
            int schoolKeyInt       = int.TryParse(schoolKey, out temp) ? temp : 0;
            var schoolCalendarDays = _context.SchoolCalendarDims.Where(s => s.SchoolKey == schoolKeyInt).ToList();
            HashSet <DateTime> _schoolCalendarDays = new HashSet <DateTime>();

            schoolCalendarDays.ForEach(s => _schoolCalendarDays.Add(s.Date));

            IDictionary <string, List <StudentSchoolDim> >  studentSchoolAssociationsDictionary  = StudentDataRepository.GetStudentSchoolAssociationsDictionary(schoolKey);
            IDictionary <string, List <StudentSectionDim> > studentSectionAssociationsDictionary = getStudentSectionAssociationsDictionary(schoolKey);

            IDictionary <string, List <StudentAttendanceEvent> > studentAttendanceEventDictionary = getStudentAttendanceEvents(schoolKey);

            foreach (var studentId in studentAttendanceEventDictionary.Keys)
            {
                DateTime?          _lastAttendanceDateForStudent = null;
                HashSet <DateTime> _excusedAbsences   = new HashSet <DateTime>();
                HashSet <DateTime> _unexcusedAbsences = new HashSet <DateTime>();
                int ytdTotalDaysAbsences = 0;
                int ytdUnexcusedAbsences = 0;

                foreach (var studentAttendanceEvent in studentAttendanceEventDictionary[studentId])
                {
                    if (_lastAttendanceDateForStudent == studentAttendanceEvent.EventDate)
                    {
                        continue;
                    }

                    if (studentAttendanceEvent.AttendanceEventCategoryDescriptor.Equals(AttendanceEventCategoryDescriptor.ExcusedAbsence) && studentAttendanceEvent.IsForDailyAttendance())
                    {
                        _excusedAbsences.Add(studentAttendanceEvent.EventDate);
                        _lastAttendanceDateForStudent = studentAttendanceEvent.EventDate;
                    }
                    else if (studentAttendanceEvent.AttendanceEventCategoryDescriptor.Equals(AttendanceEventCategoryDescriptor.UnexcusedAbsence) && studentAttendanceEvent.IsForDailyAttendance())
                    {
                        _unexcusedAbsences.Add(studentAttendanceEvent.EventDate);
                        _lastAttendanceDateForStudent = studentAttendanceEvent.EventDate;
                    }
                }

                var daysStudentWasEnrolled = _schoolCalendarDays
                                             .DaysInRange(studentSchoolAssociationsDictionary.ContainsKey(studentId) ? studentSchoolAssociationsDictionary[studentId] : new List <StudentSchoolDim>())
                                             .DaysInRange(studentSectionAssociationsDictionary.ContainsKey(studentId) ? studentSectionAssociationsDictionary[studentId] : new List <StudentSectionDim>())
                                             .ToArray();
                if (!daysStudentWasEnrolled.Any())
                {
                    // Do no calculations for students that were not enrolled for any instructional days
                    continue;
                }

                _unexcusedAbsences.RemoveWhere(x => _excusedAbsences.Contains(x));
                var excusedAbsences   = _excusedAbsences.CountDaysInRange(ytdGradingPeriod);
                var unExcusedAbsences = _unexcusedAbsences.CountDaysInRange(ytdGradingPeriod);
                ytdTotalDaysAbsences = excusedAbsences + unExcusedAbsences;
                ytdUnexcusedAbsences = unExcusedAbsences;

                if (!returnMap.ContainsKey(studentId))
                {
                    returnMap[studentId] = new List <StudentMetric>();
                }
                int metricValue     = GetAbsences(excusedAbsences, unExcusedAbsences);
                var metricStateType = _metricInfo.GetMetricStateType(metricValue, null);
                returnMap[studentId].Add(new Models.StudentMetric
                {
                    StudentUsi = int.TryParse(studentId, out temp) ? temp : 0,
                    Name       = _metricInfo.DisplayName,
                    Id         = _metricInfo.Id,
                    Value      = metricValue.ToString(),
                    State      = MetricUtility.GetMetricState(metricStateType.Value)
                });;
            }


            _memoryCache.Set(cacheKey, returnMap, _cacheEntryOptions);
            return(returnMap);
        }
Beispiel #11
0
        protected IDictionary <string, StudentDiscipline> GetStudentDisciplines(string schoolKey)
        {
            IDictionary <string, StudentDiscipline> studentDisciplineDictionary;

            string cacheKey = "StudentDisciplineEvents" + schoolKey + ":IsStateOffense:" + IsStateOffense.ToString() + ":PeriodLength" + (ReportingPeriodLength.HasValue ? ReportingPeriodLength.Value : 99999);

            if (_memoryCache.TryGetValue(cacheKey, out studentDisciplineDictionary))
            {
                return(studentDisciplineDictionary);
            }
            var currentSchoolYearDim = _context.CurrentSchoolYearDims.FirstOrDefault();

            studentDisciplineDictionary = new Dictionary <string, StudentDiscipline>();
            if (currentSchoolYearDim == null)
            {
                return(studentDisciplineDictionary);
            }

            IDictionary <string, List <StudentSchoolDim> > studentSchoolAssociationsDictionary = StudentDataRepository.GetStudentSchoolAssociationsDictionary(schoolKey);

            List <string> studentUniqueIds = studentSchoolAssociationsDictionary.Select(d => d.Key).ToList();

            var studentSchoolDisciplineDbRecords = GetStudentDisciplineDbRecords(schoolKey);

            studentSchoolDisciplineDbRecords = FilterDisciplineRecordsByBehaviorDescription(studentSchoolDisciplineDbRecords);

            var studentSchoolDisciplineDbRecordsDictionary = studentSchoolDisciplineDbRecords
                                                             .GroupBy(x => x.StudentKey)
                                                             .ToDictionary(x => x.Key, x => x.ToList().OrderBy(a => a.IncidentDate));


            var schoolDaysPeriod = GetSchoolDaysPeriod(schoolKey, ReportingPeriodLength);

            foreach (var studentUniqueId in studentUniqueIds)
            {
                string _previousIncidentIdentifier = string.Empty;
                var    studentSchoolAssociations   = studentSchoolAssociationsDictionary.ContainsKey(studentUniqueId) ? studentSchoolAssociationsDictionary[studentUniqueId] : new List <StudentSchoolDim>();
                var    studentDiscipline           = new StudentDiscipline {
                    PeriodLength = ReportingPeriodLength
                };
                if (studentSchoolDisciplineDbRecordsDictionary != null && studentSchoolDisciplineDbRecordsDictionary.ContainsKey(studentUniqueId))
                {
                    foreach (var studentSchoolDisciplineDbRecord in studentSchoolDisciplineDbRecordsDictionary[studentUniqueId])
                    {
                        if (studentSchoolAssociations.ContainsDate(studentSchoolDisciplineDbRecord.IncidentDate) &&
                            !string.Equals(studentSchoolDisciplineDbRecord.IncidentIdentifier, _previousIncidentIdentifier, StringComparison.Ordinal))
                        {
                            Period period;
                            if (schoolDaysPeriod.TryGetValue(studentSchoolDisciplineDbRecord.IncidentDate, out period))
                            {
                                studentDiscipline.DisciplineIncidentsByPeriod.Increment(period);
                                _previousIncidentIdentifier = studentSchoolDisciplineDbRecord.IncidentIdentifier;
                            }
                        }
                    }
                }
                else
                {
                    studentDiscipline.DisciplineIncidentsByPeriod.Add(Period.First, 0);
                    studentDiscipline.DisciplineIncidentsByPeriod.Add(Period.Second, 0);
                }

                studentDisciplineDictionary[studentUniqueId] = studentDiscipline;
            }

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

            _memoryCache.Set(cacheKey, studentDisciplineDictionary, cacheEntryOptions);

            return(studentDisciplineDictionary);
        }