protected void UpdateReportDays(MoodReport report, IEnumerable <GlobalMoodReportModel> days) { Console.WriteLine("Update report days"); var allMoods = Mood.All().ToList(); NSDictionary userInfo = NSDictionary.FromObjectAndKey(NSObject.FromObject("Saving data ..."), new NSString("Status")); NSNotificationCenter.DefaultCenter.PostNotificationName("RequestingReportStatus", null, userInfo); int count = 1; var insertSnapshotSql = "insert into Snapshot (Id, MoodReportId, TimeOfSnapshot, TimeOfSnapshotLocal, TotalResponses, CreatedOn) " + " values (@Id, @MoodReportId, @TimeOfSnapshot, @TimeOfSnapshotLocal, @TotalResponses, @CreatedOn)"; var insertMoodSnapshotSql = "insert into MoodSnapshot (Id, SnapshotId, MoodId, ResponseCount, ResponsePercentage) " + " values (@Id, @SnapshotId, @MoodId, @ResponseCount, @ResponsePercentage)"; foreach (var day in days) { foreach (var s in day.Snapshots) { userInfo = NSDictionary.FromObjectAndKey(NSObject.FromObject(string.Format("Saving snapshot {0}", count)), new NSString("Status")); NSNotificationCenter.DefaultCenter.PostNotificationName("RequestingReportStatus", null, userInfo); count++; var snapshotId = System.Guid.NewGuid().ToString(); CSDatabase.ExecuteNonQuery(insertSnapshotSql, new{ Id = snapshotId, MoodReportId = report.Id, TimeOfSnapshot = s.t, TimeOfSnapshotLocal = s.t.ToLocalTime(ApplicationState.Current.EventTimeOffset), TotalResponses = s.r, CreatedOn = DateTime.UtcNow }); // Snapshot snap = Snapshot.New (); // snap.Id = System.Guid.NewGuid ().ToString (); // snap.MoodReport = report; // snap.TimeOfSnapshot = s.t; // snap.TimeOfSnapshotLocal = s.t.ToLocalTime (ApplicationState.Current.EventTimeOffset); // snap.TotalResponses = s.r; // snap.IsFirstGlance = false; // snap.CreatedOn = DateTime.UtcNow; // snap.Save (); //make sure a snapshot is recorde for all moods even if no data provided var snapMoods = from m in allMoods join d in s.d on m.DisplayIndex equals d.i into gm from subm in gm.DefaultIfEmpty() select new { Mood = m, ResponseCount = subm == null ? 0 : subm.c, ResponsePercentage = subm == null ? 0 : subm.p, MoodType = m.MoodType }; foreach (var d in snapMoods) { CSDatabase.ExecuteNonQuery(insertMoodSnapshotSql, new { Id = System.Guid.NewGuid().ToString(), SnapshotId = snapshotId, MoodId = d.Mood.Id, ResponseCount = d.ResponseCount, ResponsePercentage = d.ResponsePercentage }); // MoodSnapshot ms = MoodSnapshot.New (); // ms.Id = System.Guid.NewGuid ().ToString (); // ms.Snapshot = snap; // ms.Mood = d.Mood; // //ms.Name = d.Mood.Name; // //ms.DisplayIndex = d.Mood.DisplayIndex; // ms.ResponseCount = d.ResponseCount; // ms.ResponsePercentage = d.ResponsePercentage; // ms.Save (); } } } }
public static void GenerateReportImages(MoodReport report, RenderLevel renderLevel) { Console.WriteLine("Generate report images - {0} / {1}", report.Id, renderLevel.Index); if (report != null) { string imagesFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Reports", report.Id.ToString()); DirectoryInfo imagesDir = new DirectoryInfo(imagesFolder); if (!imagesDir.Exists) { imagesDir.Create(); } var nowLocal = DateTime.UtcNow.ToLocalTime(ApplicationState.Current.EventTimeOffset); var reportStartLocal = GetReportStartLocal(report); var reportEndLocal = GetReportEndLocal(report); //var finalSnapshotTime = nowLocal > reportEndLocal ? reportEndLocal : nowLocal; var finalSnapshotTime = reportEndLocal; var dayStart = reportStartLocal; var dayEnd = reportStartLocal.Date.Add(DayEndTime); //var dayHours = dayEnd.Subtract (dayStart).TotalHours; if (dayEnd > reportEndLocal) { dayEnd = reportEndLocal; } var allMoods = Mood.All().ToList(); var lastSnapshot = GenerateEmptyMoodList(allMoods); var lastSnapshotAdded = dayStart; //var days = (float)reportEndLocal.Date.Subtract (reportStartLocal.Date).Days + 1; var dayIndex = 0; while (dayStart < reportEndLocal) { var imageFrame = new RectangleF(0f, 0f, renderLevel.DayImageWidth, renderLevel.DayImageHeight); var imager = new GlobalMoodMapImager(dayStart, dayEnd); bool lastAdded = false; var snapshots = Snapshot.OrderedList("TimeOfSnapshotLocal", "MoodReport.Id = @ReportId and TimeOfSnapshotLocal >= @Start and TimeOfSnapshotLocal <= @End", new { ReportId = report.Id, Start = lastSnapshotAdded, End = dayEnd }).ToList(); var addedFirst = false; foreach (var snapshot in snapshots) { if (snapshot.TimeOfSnapshotLocal < dayStart) { lastSnapshot = GetMoods(snapshot); } else { if (!addedFirst && dayStart <= finalSnapshotTime) { addedFirst = true; if (snapshot.TimeOfSnapshotLocal != dayStart) { if (dayStart == finalSnapshotTime) { lastAdded = true; } imager.AddSnapshot(dayStart, lastSnapshot, lastAdded); lastSnapshotAdded = dayStart; } } if (!lastAdded && snapshot.TimeOfSnapshotLocal <= finalSnapshotTime && snapshot.TimeOfSnapshotLocal <= dayEnd) { //if last snapshot more than 10 mins ago then add a pre-datapoint using last snapshot data if (snapshot.TimeOfSnapshotLocal.Subtract(lastSnapshotAdded).TotalMinutes > 10) { imager.AddSnapshot(snapshot.TimeOfSnapshotLocal.AddMinutes(-10), lastSnapshot, false); } if (snapshot.TimeOfSnapshotLocal == finalSnapshotTime) { lastAdded = true; } lastSnapshot = GetMoods(snapshot); imager.AddSnapshot(snapshot.TimeOfSnapshotLocal, lastSnapshot, lastAdded); lastSnapshotAdded = snapshot.TimeOfSnapshotLocal; } } } //always make sure there is a snapshot at the start of the day if (!addedFirst) { addedFirst = true; imager.AddSnapshot(dayStart, lastSnapshot, lastAdded); lastSnapshotAdded = dayStart; } if (!lastAdded && lastSnapshot != null && lastSnapshotAdded < dayEnd) { if (dayStart.AddDays(1) > reportEndLocal) { imager.AddSnapshot(finalSnapshotTime, lastSnapshot, true); lastSnapshotAdded = finalSnapshotTime; } else { imager.AddSnapshot(dayEnd, lastSnapshot, false); lastSnapshotAdded = dayEnd; } } using (var img = imager.DrawMapImage(imageFrame)){ string filename = Path.Combine(imagesFolder, GetDayImageFileName(renderLevel, dayIndex)); NSError err; img.AsPNG().Save(filename, true, out err); } Console.WriteLine("Image drawn"); dayStart = dayStart.AddDays(1); dayEnd = dayEnd.AddDays(1); if (dayEnd > reportEndLocal) { dayEnd = reportEndLocal; } dayIndex++; } Console.WriteLine("Images generated"); } }