public IEnumerable <CourseProgress> GetCoursesProgress(string username) { var user = _usersService.GetByUsername(username); var userSubscriptions = _courseSubscriptions.All().Where(x => x.UserId == user.Id).ToList(); List <CourseProgress> courseProgresses = new List <CourseProgress>(userSubscriptions.Count); foreach (var subscription in userSubscriptions) { var courseProgress = new CourseProgress { CourseId = subscription.CourseId, TotalLecturesCount = _lectures.GetLecturesCount(subscription.CourseId), SubscriptionStatus = subscription.Status, AssessmentEligibilityStatus = _assessments.GetEligibilityStatus(username, subscription.CourseId) }; if (subscription.Status == SubscriptionStatus.Active) { courseProgress.VisitedLecturesCount = _lectures.GetLectureVisitsCount(username, subscription.CourseId); } if (courseProgress.AssessmentEligibilityStatus == AssessmentEligibilityStatus.Lockout) { courseProgress.LockoutLift = _assessments.GetNextAssessmentAttemptDate( username, subscription.CourseId); } courseProgresses.Add(courseProgress); } return(courseProgresses); }
public static bool isLevelComplete(this User user, string courseId, string levelId) { Debug.Log("checking for a match with " + courseId + "level id" + levelId); if (user.progress == null) { Debug.Log("user progress is empty"); return(false); } CourseProgress progress = user.progress.FirstOrDefault(x => x.course == courseId); if (progress != null) { Debug.Log("got course progress: " + progress.course); for (int i = 0, imax = progress.levelsComplete.Length; i < imax; i++) { Debug.Log("in the level: " + progress._id); if (progress.levelsComplete[i]._id == levelId) { Debug.Log("found a match"); return(true); } } } return(false); }
public ActionResult AddMaterials(CourseProgress c) { try { if (c.file.ContentLength > 0) { var fileName = Path.GetFileName(c.file.FileName); var path = Path.Combine(Server.MapPath("~/uploads"), fileName); c.file.SaveAs(path); Material m = new Material() { CourseName = c.Material.CourseName, Date = c.Material.Date, FilePath = path }; // m.FilePath = path; db.Materials.Add(m); db.SaveChanges(); } return(RedirectToAction("Index", "Home")); } catch { ViewBag.Message = "Upload failed"; return(View()); } }
public ActionResult AddMaterials() { var temp = db.Courses.ToList(); CourseProgress c = new CourseProgress() { Courses = temp }; return(View(c)); }
public static bool isCourseComplete(this User user, string courseId) { CourseProgress progress = user.progress.FirstOrDefault(x => x._id == courseId); if (progress == null) { return(false); } return(progress.completed); }
public IHttpActionResult GetCourseProgress(string id) { CourseProgress courseProgress = _db.CourseProgresses.Find(id); if (courseProgress == null) { return(NotFound()); } return(Ok(courseProgress)); }
public static CourseProgress ToApiModel(this CourseProgressData progressData) { var result = new CourseProgress { CourceId = progressData.CourceId, Id = progressData.Id, LessonProgresses = progressData.LessonProgresses.Select(lessonProgress => lessonProgress.ToApiModel()).ToList(), Passed = progressData.Passed, Statistics = new Statistics { Passed = progressData.StatisticsData.Passed, PassedQuestionsCount = progressData.StatisticsData.PassedQuestionsCount, TotalQuestionsCount = progressData.StatisticsData.TotalQuestionsCount }, UserId = progressData.UserId }; return(result); }
public void CreateCertificate(Account account, CourseProgress courseProgress, DateTime dateEarnedUtc) { var certificate = new Certificate { EarnedUtc = dateEarnedUtc }; courseProgress.Certificate = certificate; _entityRepository.Save(courseProgress); CreateUserCertificate(certificate, account, courseProgress, dateEarnedUtc); var licensuresWithCEUs = account.StateLicensures.Where( s => courseProgress.Course.StateCEUs.Any(ceu => ceu.StateAbbr == s.StateAbbr)).ToList(); foreach (var licensure in licensuresWithCEUs) CreateStateCertificate(certificate, account, licensure, courseProgress, dateEarnedUtc); using (var document = new iTextSharp.text.Document()) using (var stream = new FileStream(CertificatePath + certificate.ID + ".pdf", FileMode.Create, FileAccess.Write, FileShare.None)) { document.SetPageSize(new iTextSharp.text.Rectangle(700, 570)); iTextSharp.text.pdf.PdfWriter.GetInstance(document, stream); document.Open(); // User Certificate document.SetPageSize(new iTextSharp.text.Rectangle(700, 570)); using (var imageStream = new FileStream(CertificatePath + certificate.ID + "_user.jpg", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { var image = iTextSharp.text.Image.GetInstance(imageStream); image.ScaleToFit(800f, 500f); document.Add(image); } // State Certificates foreach (var licensure in licensuresWithCEUs) { document.SetPageSize(new iTextSharp.text.Rectangle(2550, 3300)); using ( var imageStream = new FileStream(CertificatePath + certificate.ID + "_state_" + licensure.ID + ".jpg", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { var image = iTextSharp.text.Image.GetInstance(imageStream); //image.ScaleToFit(800f, 500f); document.Add(image); } } document.Close(); } }
private void CreateUserCertificate(Certificate certificate, Account account, CourseProgress courseProgress, DateTime dateEarnedUtc) { var certTemplate = new Bitmap(TemplatePathUser); var g = Graphics.FromImage(certTemplate); g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; var alignCenter = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; g.DrawString(account.FirstName + " " + account.LastName, new System.Drawing.Font("Javanese Text", 26), Brushes.Black, new RectangleF(0, 0, 1110, 797), alignCenter); var font = new System.Drawing.Font("Javanese Text", 26); var maxWidth = 1100f; if (CalculateLimitedWidth(courseProgress.Course.DisplayTitle, g, font, maxWidth)) { g.DrawString(courseProgress.Course.DisplayTitle, new System.Drawing.Font("Javanese Text", 26), Brushes.Black, new RectangleF(0, 0, maxWidth, 1000), alignCenter); } else { DrawMultipleLines(courseProgress.Course.DisplayTitle, g, font, maxWidth, 445, alignCenter); } g.DrawString(dateEarnedUtc.ToLongDateString(), new System.Drawing.Font("Javanese Text", 21), Brushes.Black, new RectangleF(480, 515, 400, 100), alignCenter); g.DrawString(account.FirstName + " " + account.LastName, new System.Drawing.Font("Javanese Text", 18), Brushes.Black, new RectangleF(115, 630, 400, 100)); g.DrawString(account.FirstName + " " + account.LastName, new System.Drawing.Font("Javanese Text", 18), Brushes.Black, new RectangleF(615, 630, 400, 100)); float height = 690; foreach (var s in account.StateLicensures) { g.DrawString(s.StateAbbr, new System.Drawing.Font("Javanese Text", 8), Brushes.Black, new RectangleF(119, height, 100, 50)); var category = !string.IsNullOrEmpty(s.Category) ? _entityRepository.GetByID<CertificationCategory>(s.Category.ToGuid(true)) : null; if (category != null) { g.DrawString(category.Name + " " + category.Number, new System.Drawing.Font("Javanese Text", 8), Brushes.Black, new RectangleF(230, height, 100, 50)); } g.DrawString(s.LicenseNum, new System.Drawing.Font("Javanese Text", 8), Brushes.Black, new RectangleF(380, height, 100, 50)); height = height + 15; } g.DrawString(account.CompanyName, new System.Drawing.Font("Javanese Text", 12, FontStyle.Bold), Brushes.Black, new RectangleF(615, 670, 400, 100)); g.DrawString(account.CompanyAddress.Address1, new System.Drawing.Font("Javanese Text", 10), Brushes.Black, new RectangleF(615, 688, 400, 100)); var cityStateZipTop = 706; if (!account.CompanyAddress.Address2.IsNullOrEmpty()) { g.DrawString(account.CompanyAddress.Address2, new System.Drawing.Font("Javanese Text", 10), Brushes.Black, new RectangleF(615, 706, 400, 100)); cityStateZipTop = 724; } g.DrawString( account.CompanyAddress.City + ", " + account.CompanyAddress.State + ", " + account.CompanyAddress.ZipCode, new System.Drawing.Font("Javanese Text", 10), Brushes.Black, new RectangleF(615, cityStateZipTop, 400, 100)); certTemplate.Save(CertificatePath + certificate.ID + "_user.jpg", ImageFormat.Jpeg); }
private void CreateStateCertificate(Certificate certificate, Account account, StateLicensure licensure, CourseProgress courseProgress, DateTime dateEarnedUtc) { var certTemplate = new Bitmap(TemplatePathState); var ceu = courseProgress.Course.StateCEUs.First( s => courseProgress.Course.StateCEUs.Any(c => c.StateAbbr == s.StateAbbr)); var g = Graphics.FromImage(certTemplate); g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; var alignCenter = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }; g.DrawString(account.FirstName + " " + account.LastName, new System.Drawing.Font("Arial", 28), Brushes.Black, new RectangleF(515, 818, 400, 100)); g.DrawString(licensure.LicenseNum + "\n" + licensure.StateAbbr, new System.Drawing.Font("Arial", 28), Brushes.Black, new RectangleF(1498, 800, 400, 100)); g.DrawString(ceu.Category.Number, new System.Drawing.Font("Arial", 28), Brushes.Black, new RectangleF(2218, 818, 400, 100)); g.DrawString(courseProgress.Course.DisplayTitle, new System.Drawing.Font("Arial", 28), Brushes.Black, new RectangleF(587, 1040, 1252, 100)); g.DrawString(ceu.ActivityID, new System.Drawing.Font("Arial", 28), Brushes.Black, new RectangleF(2155, 1040, 400, 100)); g.DrawString(courseProgress.LastActivityUtc.ToLocalTime().ToString("d"), new System.Drawing.Font("Arial", 28), Brushes.Black, new RectangleF(515, 1263, 400, 100)); g.DrawString(ceu.ActivityType, new System.Drawing.Font("Arial", 28), Brushes.Black, new RectangleF(2200, 1263, 400, 100)); var activityTime = TimeSpan.FromMinutes(courseProgress.ActiveTime); g.DrawString(activityTime.Hours + ":" + activityTime.Minutes, new System.Drawing.Font("Arial", 28), Brushes.Black, new RectangleF(515, 1484, 400, 100)); var hours = TimeSpan.FromHours((double)ceu.Hours); g.DrawString(hours.Hours + ":" + hours.Minutes, new System.Drawing.Font("Arial", 28), Brushes.Black, new RectangleF(1225, 1484, 400, 100)); var percentage = courseProgress.TestProgress.CompletedQuestions.Count(r => r.CorrectOnAttempt != null) / (decimal)courseProgress.Course.Test.Questions.Count; var grade = (percentage * 100).Round(true, 0) + "%"; g.DrawString(grade, new System.Drawing.Font("Arial", 28), Brushes.Black, new RectangleF(1915, 1484, 400, 100)); if (!courseProgress.VerificationInitials.IsNullOrEmpty() && courseProgress.VerificationDate.HasValue) g.DrawString(courseProgress.VerificationInitials + " " + courseProgress.VerificationDate.Value.ToShortDateString(), new System.Drawing.Font("Arial", 24), Brushes.Black, new RectangleF(595, 1685, 277, 100), alignCenter); g.DrawString(DateTime.Now.ToString("d"), new System.Drawing.Font("Arial", 28), Brushes.Black, new RectangleF(788, 2240, 276, 100), alignCenter); certTemplate.Save(CertificatePath + certificate.ID + "_state_" + licensure.ID + ".jpg", ImageFormat.Jpeg); }
public void CanCreateCertificate() { var moqRepo = new Mock<IEntityRepository>(); moqRepo.Setup(x => x.Save(It.IsAny<CourseProgress>())); var certService = new CertificateService(moqRepo.Object); certService.SetPaths( @"D:\Source Control\Prototype1\GIE-PST\PCT.Tests\Content\Certificates\", @"D:\Source Control\Prototype1\GIE-PST\PCT.Tests\Content\Certificates\Template\certificate_template_user.jpg", @"D:\Source Control\Prototype1\GIE-PST\PCT.Tests\Content\Certificates\Template\certificate_template_state.jpg"); var account = new Account { FirstName = "Oleg", LastName = "Fridman", StateLicensures = new List<StateLicensure> { new StateLicensure {Category = "Cat1", LicenseNum = "ABC123", StateAbbr = "OH", ID = Guid.NewGuid()} }, CompanyAddress = new Address { Address1 = "123 Main St", Address2 = "Suite 123", City = "Austin", State = "TX", ZipCode = "73723", Phone = "5125232323" }, CompanyName = "Prototype1, LLC" }; var courseProgress = new CourseProgress { VerificationInitials = "OF", VerificationDate = DateTime.UtcNow, ActiveTime = (int) TimeSpan.FromHours(1.8).TotalMinutes, LastActivityUtc = DateTime.UtcNow.AddMinutes(-5), Course = new Course { Title = "Allergy Technologies: ActiveGuard® Mattress Liners Allergy Technologies: ActiveGuard® Mattress Liners", StateCEUs = new List<StateCEU> { new StateCEU { StateAbbr = "OH", Category = new CertificationCategory { Name = "OH Category", Number = "OHCAT1", StateAbbr = "OH" }, Hours = 1.5m, ActivityID = "ActID", ActivityType = "General" } }, Test = new Test { Questions = new List<Question> { new TextQuestion(), new TextQuestion(), new TextQuestion(), new TextQuestion() } } }, TestProgress = new TestProgress { CompletedQuestions = new List<TestQuestionProgress> { new TestQuestionProgress { CorrectOnAttempt = 1 }, new TestQuestionProgress { CorrectOnAttempt = 1 }, new TestQuestionProgress { CorrectOnAttempt = 1 }, new TestQuestionProgress { CorrectOnAttempt = 1 } } } }; certService.CreateCertificate(account, courseProgress, DateTime.UtcNow); var id = DateTime.Now.Ticks; new FileInfo( @"D:\Source Control\Prototype1\GIE-PST\PCT.Tests\Content\Certificates\00000000-0000-0000-0000-000000000000.pdf") .MoveTo( @"D:\Source Control\Prototype1\GIE-PST\PCT.Tests\Content\Certificates\00000000-0000-0000-0000-000000000000.pdf" .Replace(Guid.Empty.ToString(), id.ToString())); foreach(var licensure in account.StateLicensures.Where(s => courseProgress.Course.StateCEUs.Any(ceu => ceu.StateAbbr == s.StateAbbr))) new FileInfo( @"D:\Source Control\Prototype1\GIE-PST\PCT.Tests\Content\Certificates\00000000-0000-0000-0000-000000000000_state_" + licensure.ID + ".jpg") .MoveTo( (@"D:\Source Control\Prototype1\GIE-PST\PCT.Tests\Content\Certificates\00000000-0000-0000-0000-000000000000_state_" + licensure.ID + ".jpg") .Replace(Guid.Empty.ToString(), id.ToString())); new FileInfo( @"D:\Source Control\Prototype1\GIE-PST\PCT.Tests\Content\Certificates\00000000-0000-0000-0000-000000000000_user.jpg") .MoveTo( @"D:\Source Control\Prototype1\GIE-PST\PCT.Tests\Content\Certificates\00000000-0000-0000-0000-000000000000_user.jpg" .Replace(Guid.Empty.ToString(), id.ToString())); }
public void Progress(Guid courseID) { var course = _entityRepository.GetByID<Course>(courseID); var courseProgress = new CourseProgress { Course = course, LastActivityUtc = DateTime.UtcNow, TestProgress = //new List<TestProgress>{ new TestProgress { TestID = course.Test.ID, TotalQuestions = 2, TriesLeft = 3, LastActivityUtc = DateTime.UtcNow //} }, Sections = new List<SectionProgress> { new SectionProgress { SectionID = course.Sections[0].ID, TotalQuestions = 2, LastActivityUtc = DateTime.UtcNow, CompletedQuestions = new List<QuestionProgress> { new QuestionProgress { QuestionID = course.Sections[0].Questions[0].ID, LastActivityUtc = DateTime.UtcNow } } }, new SectionProgress { SectionID = course.Sections[1].ID, TotalQuestions = 2, LastActivityUtc = DateTime.UtcNow } } }; _entityRepository.Save(courseProgress); var account = _entityRepository.GetByID<Account>(CurrentUserID); //account.CourseProgress.Add(courseProgress); //_entityRepository.Save(account); }
public async Task <IHttpActionResult> Post(bool CanViewAsLearner, [FromBody] ContentCompletionModel request) { if (ModelState.IsValid) { var currentContent = db.CourseContents.Find(request.ContentId); var nextContent = await db.CourseContents.Where(x => x.Order > currentContent.Order && x.CourseModuleId == currentContent.CourseModuleId) .OrderBy(x => x.Order).FirstOrDefaultAsync(); if (nextContent != null) { request.nextContentId = nextContent.Id; request.nextModuleId = currentContent.CourseModuleId; } else { // get next module var currentModule = db.CourseModules.Find(currentContent.CourseModuleId); var nextModule = await db.CourseModules.Where(x => x.CourseId == request.CourseId && x.Order > currentModule.Order).OrderBy(x => x.Order).FirstOrDefaultAsync(); if (nextModule == null) { request.nextContentId = null; request.nextModuleId = null; } else { request.nextModuleId = nextModule.Id; request.nextContentId = null; } } // Check if Admin or non learner, if so, no need to keep progress if (CanViewAsLearner) { return(Ok(request)); } var course = await db.Courses.FindAsync(currentContent.CourseId); if (course != null & course.Status == CourseStatus.Published) { // get enrollment info var learner = await db.Learners.FirstOrDefaultAsync(x => x.UserId == request.UserId); if (learner == null) { db.ErrorLog.Add(new ErrorLog { ErrorDescription = "Learner not found to record progress.", ErrorDetails = $"Could not find learner with userid ={request.UserId} to record progress for course = { request.CourseId} ", Module = Modules.Learning, }); db.SaveChanges(); return(BadRequest()); } var enrollment = await db.Enrollments.FirstOrDefaultAsync(x => x.CourseId == request.CourseId && x.LearnerId == learner.Id && !x.CourseEvent.IsTrial && (x.Status == EnrollmentStatus.Enrolled || x.Status == EnrollmentStatus.Completed)); if (enrollment == null) { db.ErrorLog.Add(new ErrorLog { ErrorDescription = "Enrollment not found to record progress.", ErrorDetails = $"Could not find enrollment for userid ={request.UserId} to record progress for course = { request.CourseId} ", Module = Modules.Learning, }); db.SaveChanges(); return(BadRequest()); } var courseProgress = enrollment.CourseProgress.FirstOrDefault(x => x.ModuleId == currentContent.CourseModuleId && x.ContentId == request.ContentId && x.LearnerId == learner.Id); if (courseProgress == null) { courseProgress = new CourseProgress { EnrollmentId = enrollment.Id, CourseId = course.Id, IsCompleted = true, ContentId = request.ContentId, ModuleId = currentContent.CourseModuleId, LearnerId = learner.Id, }; db.CourseProgress.Add(courseProgress); } else { courseProgress.ModuleId = currentContent.CourseModuleId; courseProgress.CourseId = currentContent.CourseId; courseProgress.IsCompleted = true; db.SetModified(courseProgress); } await db.SaveChangesAsync(); // calculate progress. var progressCount = db.CourseProgress.Where(x => x.EnrollmentId == enrollment.Id).Count(); course.UpdateCourseStat(); var totalContent = course.TotalContents; var progressPercent = ((decimal)progressCount / (decimal)totalContent) * 100m; enrollment.TotalContentsCompleted = progressCount; enrollment.PercentageCompleted = progressPercent; if ((request.nextContentId == null && request.nextModuleId == null) || enrollment.TotalContentsCompleted == totalContent) { enrollment.Status = EnrollmentStatus.Completed; enrollment.CompletionDate = DateTime.Now; } db.SetModified(enrollment); await db.SaveChangesAsync(); request.CourseId = course.Id; return(Ok(request)); } else { return(BadRequest()); } } else { return(BadRequest(ModelState)); } }