Skip to content
Snippets Groups Projects
dashboard.html 20.3 KiB
Newer Older
Calen Pennington's avatar
Calen Pennington committed
<%! from django.utils.translation import ugettext as _ %>

<%!
  from django.core.urlresolvers import reverse
  from courseware.courses import course_image_url, get_course_about_section
  from courseware.access import has_access
Victor Shnayder's avatar
Victor Shnayder committed
  from certificates.models import CertificateStatuses
  from xmodule.modulestore import MONGO_MODULESTORE_TYPE
  from xmodule.modulestore.django import modulestore
Matthew Mongeau's avatar
Matthew Mongeau committed
<%inherit file="main.html" />

<%namespace name='static' file='static_content.html'/>

Calen Pennington's avatar
Calen Pennington committed
<%block name="title"><title>${_("Dashboard")}</title></%block>
<%block name="js_extra">
  <script type="text/javascript">
  (function() {

    $(".email-settings").click(function(event) {
      $("#email_settings_course_id").val( $(event.target).data("course-id") );
      $("#email_settings_course_number").text( $(event.target).data("course-number") );
      if($(event.target).data("optout") == "False") {
        $("#receive_emails").prop('checked', true);
      }
    });

    $(".unenroll").click(function(event) {
      $("#unenroll_course_id").val( $(event.target).data("course-id") );
      $("#unenroll_course_number").text( $(event.target).data("course-number") );
    $('#unenroll_form').on('ajax:complete', function(event, xhr) {
      if(xhr.status == 200) {
        location.href = "${reverse('dashboard')}";
      } else if (xhr.status == 403) {
        location.href = "${reverse('signin_user')}?course_id=" +
          $("#unenroll_course_id").val() + "&enrollment_action=unenroll";
          xhr.responseText ? xhr.responseText : "An error occurred. Please try again later."
        ).stop().css("display", "block");
      }
    });

    $('#pwd_reset_button').click(function() {
      $.post('${reverse("password_reset")}',
             {"email"  : $('#id_email').val()},
             function(data){
               $("#password_reset_complete_link").click();
             });
    });
    $("#change_email_form").submit(function(){
      var new_email = $('#new_email_field').val();
      var new_password = $('#new_email_password').val();

      $.post('${reverse("change_email")}',
               {"new_email" : new_email, "password" : new_password},
               function(data) {
                 if (data.success) {
                   $("#change_email_title").html("Please verify your new email");
                   $("#change_email_form").html("<p>You'll receive a confirmation in your " +
                                                "in-box. Please click the link in the " +
                                                "email to confirm the email change.</p>");
                   $("#change_email_form").html("<p>${_('You\'ll receive a confirmation in your in-box. Please click the link in the email to confirm the email change.')}</p>");
                   $("#change_email_error").html(data.error).stop().css("display", "block");
                 }
               });
      return false;
    $("#change_name_form").submit(function(){
      var new_name = $('#new_name_field').val();
      var rationale = $('#name_rationale_field').val();

      $.post('${reverse("change_name")}',
             {"new_name":new_name, "rationale":rationale},
             function(data) {
               if(data.success) {
                 location.reload();
                 // $("#change_name_body").html("<p>Name changed.</p>");
               } else {
                 $("#change_name_error").html(data.error).stop().css("display", "block");
               }
             });
       return false;
    });

    $("#email_settings_form").submit(function(){
      $.ajax({
        type: "POST",
        url: '${reverse("change_email_settings")}',
        data: $(this).serializeArray(),
        success: function(data) {
          if(data.success) {
            location.href = "${reverse('dashboard')}";
          }
        },
        error: function(xhr, textStatus, error) {
          if (xhr.status == 403) {
            location.href = "${reverse('signin_user')}";          
          }
        }
      });
      return false;
    });
<section class="container dashboard">
  %if message:
    <section class="dashboard-banner">
      ${message}
    </section>
  %endif
Matthew Mongeau's avatar
Matthew Mongeau committed

  <section class="profile-sidebar">
    <header class="profile">
      <h1 class="user-name">${ user.username }</h1>
Calen Pennington's avatar
Calen Pennington committed
          <span class="title"><div class="icon name-icon"></div>${_("Full Name")} (<a href="#apply_name_change" rel="leanModal" class="edit-name">${_("edit")}</a>)</span> <span class="data">${ user.profile.name | h }</span>
Calen Pennington's avatar
Calen Pennington committed
          <span class="title"><div class="icon email-icon"></div>${_("Email")}
            % if external_auth_map is None or 'shib' not in external_auth_map.external_domain:
Calen Pennington's avatar
Calen Pennington committed
            (<a href="#change_email" rel="leanModal" class="edit-email">${_("edit")}</a>)
            % endif
          </span> <span class="data">${ user.email | h }</span>

        % if external_auth_map is None or 'shib' not in external_auth_map.external_domain:
Calen Pennington's avatar
Calen Pennington committed
          <span class="title"><a href="#password_reset_complete" rel="leanModal" id="pwd_reset_button">${_("Reset Password")}</a></span>
          <form id="password_reset_form" method="post" data-remote="true" action="${reverse('password_reset')}">
            <input id="id_email" type="hidden" name="email" maxlength="75" value="${user.email}" />
Calen Pennington's avatar
Calen Pennington committed
            <!-- <input type="submit" id="pwd_reset_button" value="${_('Reset Password')}" /> -->
Matthew Mongeau's avatar
Matthew Mongeau committed

  <section class="my-courses">
    <header>
Calen Pennington's avatar
Calen Pennington committed
      <h2>${_("Current Courses")}</h2>
Matthew Mongeau's avatar
Matthew Mongeau committed

    % if len(courses) > 0:
      % for course, enrollment in courses:
      <article class="my-course ${enrollment.mode}">
          <%
            course_target = reverse('info', args=[course.id])
          %>
          % if course.id in show_courseware_links_for:
            <a href="${course_target}" class="cover">
              <img src="${course_image_url(course)}" alt="${_('{course_number} {course_name} Cover Image').format(course_number=course.number, course_name=course.display_name_with_default) |h}" />
            </a>
          % else:
            <div class="cover">
Chris Dodge's avatar
Chris Dodge committed
              <img src="${course_image_url(course)}" alt="${_('{course_number} {course_name} Cover Image').format(course_number=course.number, course_name=course.display_name_with_default) | h}" />

          <section class="info">
            <hgroup>
              <p class="date-block">
Calen Pennington's avatar
Calen Pennington committed
              ${_("Course Completed - {end_date}").format(end_date=course.end_date_text)}
Calen Pennington's avatar
Calen Pennington committed
              ${_("Course Started - {start_date}").format(start_date=course.start_date_text)}
Calen Pennington's avatar
Calen Pennington committed
              ${_("Course Starts - {start_date}").format(start_date=course.start_date_text)}
              <h2 class="university">${get_course_about_section(course, 'university')}</h2>
              <h3>
                % if course.id in show_courseware_links_for:
Chris Dodge's avatar
Chris Dodge committed
                  <a href="${course_target}">${course.display_number_with_default | h} ${course.display_name_with_default}</a>
Chris Dodge's avatar
Chris Dodge committed
                  <span>${course.display_number_with_default | h} ${course.display_name_with_default}</span>
                testcenter_exam_info = course.current_test_center_exam
                registration = exam_registrations.get(course.id)
                testcenter_register_target = reverse('begin_exam_registration', args=[course.id])
            % if testcenter_exam_info is not None:

                % if registration is None and testcenter_exam_info.is_registering():
                <div class="message message-status is-shown exam-register">
Calen Pennington's avatar
Calen Pennington committed
                  <a href="${testcenter_register_target}" class="button exam-button" id="exam_register_button">${_("Register for Pearson exam")}</a>
                  <p class="message-copy">${_("Registration for the Pearson exam is now open and will close on {end_date}").format(end_date="<strong>{}</strong>".format(testcenter_exam_info.registration_end_date_text))}</p>
                % endif
                <!-- display a registration for a current exam, even if the registration period is over -->
                % if registration is not None:
                    % if registration.is_accepted:
                <div class="message message-status is-shown exam-schedule">
Calen Pennington's avatar
Calen Pennington committed
                   <a href="${registration.registration_signup_url}" class="button exam-button">${_("Schedule Pearson exam")}</a>
                   <p class="exam-registration-number">${_("{link_start}Registration{link_end} number: {number}").format(
                      link_start='<a href="{url}" id="exam_register_link">'.format(url=testcenter_register_target),
                      link_end='</a>',
                      number=registration.client_candidate_id,
                    )}</p>
                   <p class="message-copy">${_("Write this down! You'll need it to schedule your exam.")}</p>
                    % if  registration.is_rejected:
                <div class="message message-status is-shown exam-schedule">
Calen Pennington's avatar
Calen Pennington committed
                  <p class="message-copy">
                    <strong>${_("Your registration for the Pearson exam has been rejected. Please {link_start}see your registration status details{link_end}.").format(
                      link_start='<a href="{url}" id="exam_register_link">'.format(url=testcenter_register_target),
                      link_end='</a>')}</strong>
                    ${_("Otherwise {link_start}contact edX at {email}{link_end} for further help.").format(
Chris Dodge's avatar
Chris Dodge committed
                      link_start='<a class="contact-link" href="mailto:{email}?subject=Pearson VUE Exam - {about} {number}">'.format(email="exam-help@edx.org", about=get_course_about_section(course, 'university'), number=course.display_number_with_default),
Calen Pennington's avatar
Calen Pennington committed
                      link_end='</a>',
                      email="exam-help@edx.org",
                     )}
                   	% if not registration.is_accepted and not registration.is_rejected:
	            <div class="message message-status is-shown">
Calen Pennington's avatar
Calen Pennington committed
                  <p class="message-copy"><strong>${_("Your {link_start}registration for the Pearson exam{link_end} is pending.").format(link_start='<a href="{url}" id="exam_register_link">'.format(url=testcenter_register_target), link_end='</a>')}</strong>
                  ${_("Within a few days, you should see a confirmation number here, which can be used to schedule your exam.")}
                  </p>
            cert_status = cert_statuses.get(course.id)
            % if course.has_ended() and cert_status:
                <%
                if cert_status['status'] == 'generating':
                    status_css_class = 'course-status-certrendering'
                elif cert_status['status'] == 'ready':
                    status_css_class = 'course-status-certavailable'
                elif cert_status['status'] == 'notpassing':
                    status_css_class = 'course-status-certnotavailable'
                else:
                    status_css_class = 'course-status-processing'
                %>
                <div class="message message-status ${status_css_class} is-shown">

                % if cert_status['status'] == 'processing':
Calen Pennington's avatar
Calen Pennington committed
                      <p class="message-copy">${_("Final course details are being wrapped up at this time. Your final standing will be available shortly.")}</p>
                % elif cert_status['status'] in ('generating', 'ready', 'notpassing', 'restricted'):
Calen Pennington's avatar
Calen Pennington committed
                      <p class="message-copy">${_("Your final grade:")}
                      <span class="grade-value">${"{0:.0f}%".format(float(cert_status['grade'])*100)}</span>.
                      % if cert_status['status'] == 'notpassing':
Calen Pennington's avatar
Calen Pennington committed
                         ${_("Grade required for a certificate:")} <span class="grade-value">
                           ${"{0:.0f}%".format(float(course.lowest_passing_grade)*100)}</span>.
                      % elif cert_status['status'] == 'restricted':
                          <p class="message-copy">
Calen Pennington's avatar
Calen Pennington committed
                          ${_("Your certificate is being held pending confirmation that the issuance of your certificate is in compliance with strict U.S. embargoes on Iran, Cuba, Syria and Sudan. If you think our system has mistakenly identified you as being connected with one of those countries, please let us know by contacting {email}.").format(email='<a class="contact-link" href="mailto:{email}">{email}</a>.'.format(email=settings.CONTACT_EMAIL))}
Victor Shnayder's avatar
Victor Shnayder committed
                % endif
                % if cert_status['show_disabled_download_button'] or cert_status['show_download_url'] or cert_status['show_survey_button']:
                  <ul class="actions">
                    % if cert_status['show_disabled_download_button']:
                      <li class="action"><span class="disabled">
Calen Pennington's avatar
Calen Pennington committed
                          ${_("Your Certificate is Generating")}</span></li>
                    % elif cert_status['show_download_url']:
                      <li class="action">
                      <a class="btn" href="${cert_status['download_url']}"
Calen Pennington's avatar
Calen Pennington committed
                         title="${_('This link will open/download a PDF document')}">
                         Download Your PDF Certificate</a></li>
                    % endif

                    % if cert_status['show_survey_button']:
                      <li class="action"><a class="cta" href="${cert_status['survey_url']}">
Calen Pennington's avatar
Calen Pennington committed
                             ${_('Complete our course feedback survey')}</a></li>
Victor Shnayder's avatar
Victor Shnayder committed
                % endif
Victor Shnayder's avatar
Victor Shnayder committed
            % endif

            % if course.id in show_courseware_links_for:
              % if course.has_ended():
Calen Pennington's avatar
Calen Pennington committed
                <a href="${course_target}" class="enter-course archived">${_('View Archived Course')}</a>
Calen Pennington's avatar
Calen Pennington committed
                <a href="${course_target}" class="enter-course">${_('View Course')}</a>
Calen Pennington's avatar
Calen Pennington committed
            <a href="#unenroll-modal" class="unenroll" rel="leanModal" data-course-id="${course.id}" data-course-number="${course.number}">${_('Unregister')}</a>
	    % if settings.MITX_FEATURES['ENABLE_INSTRUCTOR_EMAIL'] and modulestore().get_modulestore_type(course.id) == MONGO_MODULESTORE_TYPE:
	      <!-- Only show the Email Settings link/modal if this course has bulk email feature enabled -->
              <a href="#email-settings-modal" class="email-settings" rel="leanModal" data-course-id="${course.id}" data-course-number="${course.number}" data-optout="${course.id in course_optouts}">${_('Email Settings')}</a>
	    % endif
      % endfor
    % else:
      <section class="empty-dashboard-message">
Calen Pennington's avatar
Calen Pennington committed
        <p>${_("Looks like you haven't registered for any courses yet.")}</p>
        <a href="${marketing_link('COURSES')}">
Calen Pennington's avatar
Calen Pennington committed
            ${_("Find courses now!")}
        </a>
Matthew Mongeau's avatar
Matthew Mongeau committed

    % if staff_access and len(errored_courses) > 0:
      <div id="course-errors">
Calen Pennington's avatar
Calen Pennington committed
        <h2>${_("Course-loading errors")}</h2>

      % for course_dir, errors in errored_courses.items():
         <h3>${course_dir | h}</h3>
             <ul>
           % for (msg, err) in errors:
               <li>${msg}
                 <ul><li><pre>${err}</pre></li></ul>
               </li>
           % endfor
             </ul>
      % endfor
    % endif
Matthew Mongeau's avatar
Matthew Mongeau committed
  </section>
</section>
<section id="email-settings-modal" class="modal">
  <div class="inner-wrapper">
    <header>
      <h2>${_('Email Settings for {course_number}').format(course_number='<span id="email_settings_course_number"></span>')}</h2>
      <hr/>
    </header>

    <form id="email_settings_form" method="post">
      <input name="course_id" id="email_settings_course_id" type="hidden" />
      <label>${_("Receive course emails")} <input type="checkbox" id="receive_emails" name="receive_emails" /></label>
      <div class="submit">
        <input type="submit" id="submit" value="Save Settings" />
      </div>
    </form>

    <div class="close-modal">
      <div class="inner">
        <p>&#10005;</p>
      </div>
    </div>
  </div>
</section>

<section id="unenroll-modal" class="modal unenroll-modal">
  <div class="inner-wrapper">
    <header>
Calen Pennington's avatar
Calen Pennington committed
      <h2>${_('Are you sure you want to unregister from {course_number}?').format(course_number='<span id="unenroll_course_number"></span>')}</h2>
    <div id="unenroll_error" class="modal-form-error"></div>

    <form id="unenroll_form" method="post" data-remote="true" action="${reverse('change_enrollment')}">
      <input name="course_id" id="unenroll_course_id" type="hidden" />
      <input name="enrollment_action" type="hidden" value="unenroll" />
      <div class="submit">
        <input name="submit" type="submit" value="Unregister" />
      </div>
    </form>

    <div class="close-modal">
      <div class="inner">
        <p>&#10005;</p>
      </div>
    </div>
  </div>
</section>

<section id="password_reset_complete" class="modal">
  <div class="inner-wrapper">
Calen Pennington's avatar
Calen Pennington committed
      <h2>${_('Password Reset Email Sent')}</h2>
      <form> <!-- Here for styling reasons -->
        <section>
Calen Pennington's avatar
Calen Pennington committed
          <p>${_('An email has been sent to {email}. Follow the link in the email to change your password.').format(email=user.email)}</p>
    </div>
    <div class="close-modal">
      <div class="inner">
        <p>&#10005;</p>
      </div>
    </div>
  </div>
</section>
<section id="change_email" class="modal">
  <div class="inner-wrapper">
    <header>
Calen Pennington's avatar
Calen Pennington committed
      <h2><span id="change_email_title">${_("Change Email")}</span></h2>
      <hr/>
    </header>
    <div id="change_email_body">
      <form id="change_email_form">
        <div id="change_email_error" class="modal-form-error"> </div>
          <div class="input-group">
Calen Pennington's avatar
Calen Pennington committed
            <label>${_('Please enter your new email address:')}</label>
            <input id="new_email_field" type="email" value="" />
Calen Pennington's avatar
Calen Pennington committed
            <label>${_('Please confirm your password:')}</label>
            <input id="new_email_password" value="" type="password" />
          </div>
Calen Pennington's avatar
Calen Pennington committed
            <p>${_('We will send a confirmation to both {email} and your new email as part of the process.').format(email=user.email)}</p>
Calen Pennington's avatar
Calen Pennington committed
            <input type="submit" id="submit_email_change" value="${_('Change Email')}"/>
          </div>
        </fieldset>
      </form>
    </div>
    <div class="close-modal">
      <div class="inner">
        <p>&#10005;</p>
      </div>
    </div>
  </div>
</section>

<section id="apply_name_change" class="modal">
  <div class="inner-wrapper">
    <header>
Calen Pennington's avatar
Calen Pennington committed
      <h2>${_("Change your name")}</h2>
      <hr/>
    </header>
    <div id="change_name_body">
      <form id="change_name_form">
        <div id="change_name_error" class="modal-form-error"> </div>
        <p>${_("To uphold the credibility of {platform} certificates, all name changes will be logged and recorded.").format(platform=settings.PLATFORM_NAME)}</p>
        <br/>
        <fieldset>
          <div class="input-group">
Calen Pennington's avatar
Calen Pennington committed
            <label>${_("Enter your desired full name, as it will appear on the {platform} certificates:").format(platform=settings.PLATFORM_NAME)}</label>
            <input id="new_name_field" value="" type="text" />
Calen Pennington's avatar
Calen Pennington committed
            <label>${_("Reason for name change:")}</label>
            <textarea id="name_rationale_field" value=""></textarea>
          </div>
          <div class="submit">
Calen Pennington's avatar
Calen Pennington committed
            <input type="submit" id="submit" value="${_('Change My Name')}">
        </fieldset>
      </form>
    </div>
    <div class="close-modal">
      <div class="inner">
        <p>&#10005;</p>
      </div>
    </div>
  </div>
</section>