testmycode/tmc-server

View on GitHub
app/models/review.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

require 'natsort'

class Review < ApplicationRecord
  include Swagger::Blocks

  swagger_schema :Review do
    key :required, %i[submission_id exercise_name id marked_as_read reviewer_name review_body
                      points points_not_awarded url update_url created_at updated_at]

    property :submission_id, type: :integer, example: 1
    property :exercise_name, type: :string, example: 'trivial'
    property :id, type: :integer, example: 1
    property :marked_as_read, type: :boolean, example: false
    property :reviewer_name, type: :string, example: 'hn'
    property :review_body, type: :string, example: ''
    property :points, type: :array do
      items do
        key :type, :string
      end
    end
    property :points_not_awarded, type: :array do
      items do
        key :type, :string
      end
    end
    property :url, type: :string, example: 'http://localhost:3000/api/core/v8/submissions/1/reviews'
    property :update_url, type: :string, example: 'http://localhost:3000/api/v8/core/courses/1/reviews/1'
    property :created_at, type: :string, example: '2016-10-10T13:22:19.554+03:00'
    property :updated_at, type: :string, example: '2016-10-10T13:22:19.554+03:00'
  end

  def self.course_reviews_json(course, reviewed_submissions, view_context)
    reviewed_submissions = reviewed_submissions.includes(reviews: %i[reviewer submission])
    exercises = course.exercises.index_by { |e| e.name }
    reviewed_submissions.map do |s|
      s.reviews.map do |r|
        available_points = exercises[r.submission.exercise_name].available_points.where(requires_review: true).map(&:name)
        points_not_awarded = available_points - r.points_list
        {
          submission_id: s.id,
          exercise_name: s.exercise_name,

          id: r.id,
          marked_as_read: r.marked_as_read,
          reviewer_name: r.reviewer.display_name,
          review_body: r.review_body,
          points: r.points_list.natsort,
          points_not_awarded: points_not_awarded.natsort,
          url: view_context.submission_reviews_url(r.submission_id),
          update_url: view_context.api_v8_core_course_review_url(course.id, r.id),
          created_at: r.created_at,
          updated_at: r.updated_at
        }
      end
    end.flatten
  end

  belongs_to :submission
  belongs_to :reviewer, class_name: 'User', inverse_of: :reviews

  def points_list
    points.to_s.split
  end

  def readable_by?(user)
    user.administrator? ||
      user.id == submission.user.id ||
      user.teacher?(submission.course.organization)
  end

  def manageable_by?(user)
    user.administrator? ||
      user.teacher?(submission.course.organization)
  end
end