mysociety/alaveteli

View on GitHub
app/models/project/leaderboard.rb

Summary

Maintainability
A
0 mins
Test Coverage
##
# Export a project's leaderboard of classifications and data extractions to CSV.
#
class Project::Leaderboard
  include DownloadHelper

  attr_reader :project
  protected :project

  def initialize(project)
    @project = project
  end

  def all_time
    @leaderboard_all_time ||= data.first(5)
  end

  def twenty_eight_days
    @leaderboard_28_days ||= data(
      project.submissions.where(created_at: 28.days.ago..)
    ).first(5)
  end

  def name
    generate_download_filename(
      resource: 'project-leaderboard',
      id: project.id,
      title: project.title,
      ext: 'csv'
    )
  end

  def to_csv
    CSV.generate do |csv|
      header = data.first
      csv << header.keys.map(&:to_s) if header
      data.each do |row|
        row[:user] = row[:user].name
        csv << row.values
      end
    end
  end

  private

  def data(scope = project.submissions)
    leaderboard = project.members.map do |user|
      user_scope = scope.where(user_id: user.id)
      {
        user: user,
        classifications: user_scope.classification.size,
        extractions: user_scope.extraction.size,
        total_contributions: user_scope.size
      }
    end
    leaderboard.sort_by { |row| row[:total_contributions] }.reverse
  end
end