testmycode/tmc-server

View on GitHub
app/views/courses/show.html.erb

Summary

Maintainability
Test Coverage
<% if can? :teach, @course %>
  <%= javascript_tag do %>
    window.courseTemplateId = "<%=j @course.course_template.id %>";
  <% end %>
  <%= javascript_include_tag 'course-refresh' %>
<% end %>
<div class="row">
  <div class="col-md-12">
    <% if can? :edit, @course %>
      <%= link_to 'Edit details', edit_setup_organization_course_course_details_path(@organization, @course), class: "btn btn-primary pull-right" %>
    <% end %>
    <h1><%= @course.title %></h1>

  <div class="card">
    <div class="card-body">
      <% unless @course.description.blank? %>
        <p class="card-text"><%= @course.description %></p>
      <% end %>
    </div>
  </div>
  <br>

  <% unless @course.initial_refresh_ready? %>
    <p class='course-initial-refresh-warning'><strong>
      Course is being updated and it is not fully functional yet! Please wait.</strong>
      <br>This operation usually takes about 15 minutes but it can take up to an hour.
    </p>
  <% end %>

  <div class="course-options-card">
      <% unless @course.material_url.blank? %>
        <%= link_to @course.material_url, target: '_blank', class: 'btn btn-primary' do %>
          <%= fa_icon 'book', text: 'Course material' %>
        <% end %>
      <% end %>
      <% if @course.has_external_scoreboard_url? %>
        <% if can? :view_external_scoreboard_url, @course %>
            <%= link_to @course.parsed_external_scoreboard_url(@organization, @course, current_user), target: '_blank', class: 'btn btn-primary' do %>
              <%= fa_icon 'list', text: 'Points list' %>
            <% end %>
        <% end %>
      <% else %>
        <% if can? :see_points, @course %>
          <%= link_to organization_course_points_path(@organization, @course), class: 'btn btn-primary' do %>
            <%= fa_icon 'list', text: 'Points list' %>
          <% end %>
        <% end %>
      <% end %>
    </div>
    <br >

    <% if @course.disabled? %>
      <div class="card text-danger border-danger mb-3">
        <div class="card-body">
          <h3 class="card-title"><%= fa_icon 'warning', text: 'This course is disabled' %></h3>
          <p class="card-text">
            It is not possible to start this course while it is disabled and the course is hidden from the course list.
            However, old results should still be visible.
          </p>
          <%= link_to 'Enable course', enable_organization_course_path(@organization, @course), method: :post, class: "btn btn-danger" if can? :teach, @course  %>
        </div>
      </div>
    <% end %>

    <% if can? :teach, @course %>
      <% if @course.hide_submission_results? %>
        <div class="card text-danger border-danger mb-3">
          <div class="card-body">
            <h3 class="card-title"><%= fa_icon 'warning', text: 'Exam mode enabled' %></h3>
            <p class="card-text">
              This course is marked as an exam.
              <ul>
                <li>Submission results will not be visible to users.</li>
                <li>Model solutions are not accessible.</li>
                <li>Points are hidden.</li>
              </ul>
            </p>
            <%= link_to 'Disable exam mode', toggle_submission_result_visibility_organization_course_path(@organization, @course), method: :post, class: "btn btn-danger" if can? :teach, @course  %>
          </div>
        </div>
      <% end %>

      <% if @course.hidden? %>
        <div class="card text-danger border-danger mb-3">
          <div class="card-body">
            <h3 class="card-title"><%= fa_icon 'warning', text: 'Course is hidden' %></h3>
            <p class="card-text">
              This is rarely a good idea. Consider disabling it instead.
            </p>
              <%= link_to 'Make course visible', toggle_hidden_organization_course_path(@organization, @course), method: :post, class: "btn btn-danger" if can? :teach, @course  %>
          </div>
        </div>
      <% end %>
    <% end %>

    <% if can? :teach, @course %>
      <div class="teacher-panel">
        <h4><%= fa_icon 'graduation-cap', text: 'Teacher functions' %></h4>

        <%= render :partial => 'courses/refresh_progress_report', :locals => { :refresh_initialized => @refresh_initialized } %>

        <% if @refresh_report %>
          <%= render :partial => 'courses/refresh_report', :locals => { :report => @refresh_report } %>
        <% end %>

        <ul>
          <% # User mails %>
          <% if can?(:list_user_emails, @course) || can?(:send_mail_to_participants, @course) %>
            <li>
              <% if can?(:list_user_emails, @course) %>
                <%= link_to 'View student emails', organization_emails_path, class: 'btn btn-sm btn-link' %>
              <% end %>
              <% if can? :send_mail_to_participants, @course %>
                <%= link_to 'Send message to every participant', new_organization_course_course_notifications_path(@organization, @course), class: 'btn btn-link btn-sm' %>
              <% end %>
            </li>
          <% end %>

          <% # Feedback questions %>
          <li>
            <%= link_to 'View feedback', organization_course_feedback_answers_path(@organization, @course), class: 'btn btn-sm btn-link' %>
            <%= link_to 'Manage feedback questions', organization_course_feedback_questions_path(@organization, @course), class: 'btn btn-sm btn-link' %>
          </li>

          <% if @course.code_review_requests_enabled? && can?(:view_code_reviews, @course) %>
            <li><%= link_to 'View code reviews', organization_course_reviews_path(@organization, @course), class: 'btn btn-sm btn-link' %></li>
            <%
              reviews_required = @course.reviews_required.count
              reviews_requested = @course.reviews_requested.count
            %>
            <% if reviews_required > 0 %>
              <li class="review-required">
                <%= link_to pluralize(reviews_required, "code review") + " required", organization_course_reviews_path(@organization, @course) %>
              </li>
            <% end %>
            <% if reviews_requested > 0 %>
              <li class="review-requested">
                <%= link_to pluralize(reviews_requested, "code review") + " requested", organization_course_reviews_path(@organization, @course) %>
              </li>
            <% end %>
          <% end %>

            <li>
              <% if @course.code_review_requests_enabled? %>
                <%= link_to 'Disable code review requests', toggle_code_review_requests_organization_course_path(@organization, @course), method: :post, class: "btn btn-warning btn-sm" %>
              <% else %>
                <%= link_to 'Enable code review requests', toggle_code_review_requests_organization_course_path(@organization, @course), method: :post, class: "btn btn-warning btn-sm" %>
            <% end %>
            </li>
          <% # Course timing, deadlines, unlocks %>
          <% if can? :manage_deadlines, @course %>
            <li>
              <%= link_to 'Manage basic timing', setup_organization_course_course_timing_path(@organization, @course), class: "btn tvn-default btn-link btn-sm" %>
              <%= link_to 'Advanced deadlines management', manage_deadlines_organization_course_path(@organization, @course), class: "btn btn-link btn-sm" %>
              <%= link_to 'Advanced unlock conditions management', manage_unlocks_organization_course_path, class: "btn btn-link btn-sm" %>
            </li>
          <% end %>

          <li>
            <% if can? :edit, @course %>
              <%= link_to 'Edit course details', edit_setup_organization_course_course_details_path(@organization, @course), class: "btn btn-link btn-sm" %>
            <% end %>
            <% if can? :manage_exercises, @course %>
              <%= link_to 'Manage exercises', manage_exercises_organization_course_path, class: "btn btn-link btn-sm" %>
            <% end %>
            <% if can? :modify_assistants, @course %>
              <%= link_to 'Manage assistants', setup_organization_course_course_assistants_path(@organization, @course), class: "btn btn-link btn-sm" %>
            <% end %>
          </li>

          <li>
          <% if can? :toggle_submission_result_visibility, @course %>
            <% if @course.hide_submission_results? %>
              <%= link_to 'Disable exam mode', toggle_submission_result_visibility_organization_course_path(@organization, @course), method: :post, class: "btn btn-primary btn-sm" %>
            <% else %>
              <%= link_to 'Enable exam mode', toggle_submission_result_visibility_organization_course_path(@organization, @course), method: :post, class: "btn btn-warning btn-sm" %>
            <% end %>
          <% end %>
          <% if can? :refresh, @course %>
            <%= link_to 'Refresh', refresh_organization_course_path(@organization, @course), id: 'refresh-btn', class: "btn btn-warning btn-sm #{@refresh_initialized ? ' disabled' : nil}", data: { disable_with: "Refreshing..." }  %>
          <% end %>
          <% if @course.disabled? %>
            <%=
              link_to 'Enable Course', enable_organization_course_path(@organization, @course), method: :post,
                      class: "btn btn-info btn-sm" %>
          <% else %>
            <%=
              link_to 'Disable Course', disable_organization_course_path(@organization, @course), method: :post,
                      class: "btn btn-danger btn-sm", data: { confirm: "Are you sure you want to disable the course?" } %>
          <% end %>
          </li>

          <% unlockables = @course.unlockable_exercises_for(current_user) %>
          <% unless unlockables.empty? %>
            <p>
              You can <%= link_to "unlock #{pluralize(unlockables.count, 'new exercise')}", organization_course_unlock_path(@organization, @course) %>.
            </p>
          <% end %>

          <% # General info %>
          <% if @course.refreshed_at %>
            <li>
              Last refreshed at <%= @course.refreshed_at.strftime("%d.%m.%Y %H:%M:%S") %> 
              <% if @course.course_template.course_template_refreshes.any? %>
                by <%= @course.course_template.course_template_refreshes.last.user.login %>
                <%= link_to 'Show last report', organization_course_path(@organization, @course, generate_report: @course.course_template.course_template_refreshes.last.id), class: "btn btn-link" %>
              <% end %>
            </li>
          <% end %>

          <% if @course.disabled? %>
            <li>The course is currently <strong>disabled</strong>.</li>
          <% end %>

          <% if @course.hidden? %>
            <li>The course is currently <strong>hidden</strong>.</li>
          <% end %>

          <% if @course.hide_after != nil %>
            <li>Course hidden after: <%= @course.hide_after %></li>
          <% end %>

          <% if @course.hidden_if_registered_after != nil %>
            <li>Course hidden from user accounts created after: <%= @course.hidden_if_registered_after %></li>
          <% end %>

          <li>
            Number of submissions (from <span title="administrators and specially marked test user accounts are excluded">actual users</span>): <%= @total_submissions %>
            (stats <%= link_to 'over time', organization_course_stat_path(@organization, @course, 'submissions') %>,
             <%= link_to 'by hour', organization_course_stat_path(@organization, @course, 'submission_times') %>)
          </li>

          <% if @course.moocfi_id? %>
            <li>MOOC.fi id: <%= @course.moocfi_id %></li>
          <% else %>
            <li>Points will not be synchronized to MOOC.fi until MOOC.fi id is set.</li>
          <% end %>

        </ul>
      </div>
    <% end # :teach, @course %>

    <% if current_user.administrator? %>
      <div class="admin-panel">
        <h4><%= fa_icon 'exclamation-circle', text: 'Admin functions' %></h4>
        <ul>
          <% if current_user.administrator? %>
            <li>Source type: <%= @course.source_backend.upcase %> </li>
            <li>Source URL: <span class="source-url"><%= @course.source_url %></span></li>
            <% if @course.source_backend == 'git' %>
              <% github_url = github_repo_url_to_project_page_url(@course.source_url) %>
              <% if github_url %>
                <li>Github URL: <%= link_to github_url, github_url %></li>
              <% end %>
              <li>Git branch: <%= @course.git_branch %></li>
              <% gitrev = @course.git_revision %>
              <% if gitrev %>
                <li>Git revision: <%= gitrev %></li>
              <% end %>
            <% end %>
            <% unless @course.custom? %>
              <li>Created from template: <%= link_to @course.course_template.name, course_templates_path %></li>
            <% end %>
          <% end %>
        </ul>
      </div>
    <% end %>

    <h2>All exercises</h2>
    <div>
      <%=
          render partial: 'exercises/list', locals: {
            course: @course,
            exercises: @exercises,
            completion_status: @exercise_completion_status,
            unlocks: @unlocks
          }
      %>
    </div>

    <% if @submissions %>
      <h2>Latest submissions</h2>
      <section>
        <% if @total_submissions > @submissions.count %>
          <p>
            Only showing <%= @submissions.count %> of <%= @total_submissions %>
            <%= link_to "(show all)", organization_course_submissions_path(@organization, @course) %>.
          </p>
        <% end %>
        <div>
          <%= show_submission_list(@submissions) %>
        </div>
      </section>
    <% end %>
  </div>
</div>