Commit cf33d85e by Victor Shnayder Committed by Carlos Andrés Rocha

Wire up cert status

parent 01dcf291
...@@ -29,6 +29,9 @@ from django_future.csrf import ensure_csrf_cookie, csrf_exempt ...@@ -29,6 +29,9 @@ from django_future.csrf import ensure_csrf_cookie, csrf_exempt
from student.models import (Registration, UserProfile, from student.models import (Registration, UserProfile,
PendingNameChange, PendingEmailChange, PendingNameChange, PendingEmailChange,
CourseEnrollment) CourseEnrollment)
from certificates.models import CertificateStatuses, certificate_status_for_student
from xmodule.course_module import CourseDescriptor from xmodule.course_module import CourseDescriptor
from xmodule.modulestore.exceptions import ItemNotFoundError from xmodule.modulestore.exceptions import ItemNotFoundError
from xmodule.modulestore.django import modulestore from xmodule.modulestore.django import modulestore
...@@ -143,11 +146,15 @@ def dashboard(request): ...@@ -143,11 +146,15 @@ def dashboard(request):
show_courseware_links_for = frozenset(course.id for course in courses show_courseware_links_for = frozenset(course.id for course in courses
if has_access(request.user, course, 'load')) if has_access(request.user, course, 'load'))
cert_statuses = [certificate_status_for_student(request.user, course.id) for course in courses]
context = {'courses': courses, context = {'courses': courses,
'message': message, 'message': message,
'staff_access': staff_access, 'staff_access': staff_access,
'errored_courses': errored_courses, 'errored_courses': errored_courses,
'show_courseware_links_for' : show_courseware_links_for} 'show_courseware_links_for' : show_courseware_links_for,
'cert_statuses': cert_statuses,
}
return render_to_response('dashboard.html', context) return render_to_response('dashboard.html', context)
......
...@@ -299,6 +299,16 @@ class CourseDescriptor(SequenceDescriptor): ...@@ -299,6 +299,16 @@ class CourseDescriptor(SequenceDescriptor):
return self.metadata.get('hide_progress_tab') == True return self.metadata.get('hide_progress_tab') == True
@property @property
def end_of_course_survey_url(self):
"""
Pull from policy. Once we have our own survey module set up, can change this to point to an automatically
created survey for each class.
Returns None if no url specified.
"""
return self.metadata.get('end_of_course_survey_url')
@property
def title(self): def title(self):
return self.display_name return self.display_name
......
...@@ -2,7 +2,7 @@ from django.contrib.auth.models import User ...@@ -2,7 +2,7 @@ from django.contrib.auth.models import User
from django.db import models from django.db import models
from datetime import datetime from datetime import datetime
''' """
Certificates are created for a student and an offering of a course. Certificates are created for a student and an offering of a course.
When a certificate is generated, a unique ID is generated so that When a certificate is generated, a unique ID is generated so that
...@@ -35,8 +35,7 @@ State diagram: ...@@ -35,8 +35,7 @@ State diagram:
v v v v v v
[downloadable] [downloadable] [deleted] [downloadable] [downloadable] [deleted]
''' """
class CertificateStatuses(object): class CertificateStatuses(object):
unavailable = 'unavailable' unavailable = 'unavailable'
...@@ -88,6 +87,7 @@ def certificate_status_for_student(student, course_id): ...@@ -88,6 +87,7 @@ def certificate_status_for_student(student, course_id):
If the status is "downloadable", the dictionary also contains If the status is "downloadable", the dictionary also contains
"download_url". "download_url".
If the student has been graded, the dictionary also contains their grade for the course.
''' '''
try: try:
...@@ -97,6 +97,7 @@ def certificate_status_for_student(student, course_id): ...@@ -97,6 +97,7 @@ def certificate_status_for_student(student, course_id):
return { return {
'status': CertificateStatuses.downloadable, 'status': CertificateStatuses.downloadable,
'download_url': generated_certificate.download_url, 'download_url': generated_certificate.download_url,
'grade': generated_certificate.grade,
} }
else: else:
return {'status': generated_certificate.status} return {'status': generated_certificate.status}
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from courseware.courses import course_image_url, get_course_about_section from courseware.courses import course_image_url, get_course_about_section
from courseware.access import has_access from courseware.access import has_access
from certificates.models import CertificateStatuses
%> %>
<%inherit file="main.html" /> <%inherit file="main.html" />
...@@ -114,7 +115,7 @@ ...@@ -114,7 +115,7 @@
</header> </header>
% if len(courses) > 0: % if len(courses) > 0:
% for course in courses: % for course, cert_status in zip(courses, cert_statuses):
<article class="my-course"> <article class="my-course">
<% <%
...@@ -145,35 +146,65 @@ ...@@ -145,35 +146,65 @@
</a> </a>
</article> </article>
<div class="message message-status course-status-processing is-shown">
<p class="message-copy">Final course details are being wrapped up at this time. Your final standing will be available shortly.</p>
</div>
<div class="message message-status course-status-certrendering is-shown">
<p class="message-copy">You have received a grade of <span class="grade-value">B</span> in this course.</p>
% if course.has_ended:
<%
passing_grade = False
cert_button = False
survey_button = False
if cert_status['status'] in [CertificateStatuses.generating, CertificateStatuses.regenerating]:
status_css_class = 'course-status-certrendering'
cert_button = True
survey_button = True
passing_grade = True
elif cert_status['status'] == CertificateStatuses.downloadable:
status_css_class = 'course-status-certavailable'
cert_button = True
survey_button = True
passing_grade = True
elif cert_status['status'] == CertificateStatuses.notpassing:
status_css_class = 'course-status-certnotavailable'
survey_button = True
else cert_status['status']:
# This is primarily the 'unavailable' state, but also 'error', 'deleted', etc.
status_css_class = 'course-status-processing'
if survey_button and not course.end_of_course_survey_url:
survey_button = False
%>
<div class="message message-status ${status_css_class} is-shown">
% if cert_status == CertificateStatuses.unavailable:
<p class="message-copy">Final course details are being wrapped up at this time.
Your final standing will be available shortly.</p>
% elif passing_grade:
<p class="message-copy">You have received a grade of
<span class="grade-value">${cert_status['grade']}</span>
in this course.</p>
% elif cert_status == CertificateStatuses.notpassing:
<p class="message-copy">You did not complete the necessary requirements for
completion of this course. Your grade was <span class="grade-value">${cert_status['grade']}</span>
</p>
% endif
% if cert_button or survey_button:
<ul class="actions"> <ul class="actions">
% if cert_button and cert_status['status'] == CertificateStatuses.generating:
<li class="action"><span class="btn disabled" href="">Your Certificate is Generating</span></li> <li class="action"><span class="btn disabled" href="">Your Certificate is Generating</span></li>
<li class="action"><a class="cta" href="">Complete our course feedback survey</a></li> % elif cert_button and cert_status['status'] == CertificateStatuses.downloadable:
</ul> <li class="action">
</div> <a class="btn" href="${cert_status['download_url']}"
title="This link will open/download a PDF document">
<div class="message message-status course-status-certavailable is-shown"> Download Your PDF Certificate</a></li>
<p class="message-copy">You have received a grade of <span class="grade-value">B</span> in this course.</p> % endif
% if survey_button:
<ul class="actions"> <li class="action"><a class="cta" href="${course.end_of_course_survey_url}">
<li class="action"><a class="btn" href="" title="This link will open/download a PDF document">Download Your PDF Certificate</a></li> Complete our course feedback survey</a></li>
<li class="action"><a class="cta" href="">Complete our course feedback survey</a></li> % endif
</ul> </ul>
% endif
</div> </div>
<div class="message message-status course-status-certnotavailable is-shown"> % endif
<p class="message-copy">You did not complete the necessary requirements for completion of this course.</p>
<ul class="actions">
<li class="action"><a class="cta" href="">Complete our course feedback survey</a></li>
</ul>
</div>
<a href="#unenroll-modal" class="unenroll" rel="leanModal" data-course-id="${course.id}" data-course-number="${course.number}">Unregister</a> <a href="#unenroll-modal" class="unenroll" rel="leanModal" data-course-id="${course.id}" data-course-number="${course.number}">Unregister</a>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment