Skip to content
Permalink
Browse files

Adding ability to sort by most recent comment (or edit). Fixes #470

  • Loading branch information...
arfon committed Dec 14, 2018
1 parent 9d92696 commit 31b0d2332acbfad55929eb61da5fac71bfb56341
@@ -25,19 +25,29 @@ def dashboard
end

def incoming
if params[:order]
@papers = Paper.unscoped.in_progress.where(:editor => nil).order(:last_activity => params[:order]).paginate(
:page => params[:page],
:per_page => 20
)
else
@papers = Paper.in_progress.where(:editor => nil).paginate(
:page => params[:page],
:per_page => 20
)
end

@active_tab = "incoming"
@papers = Paper.in_progress.where(:editor => nil).paginate(
:page => params[:page],
:per_page => 20
)

render template: "home/reviews"
end

def reviews
if params[:editor]
@active_tab =
@editor = Editor.find_by_login(params[:editor])
@papers = Paper.in_progress.where(:editor => @editor).paginate(
@active_tab = @editor = Editor.find_by_login(params[:editor])
sort_order = params[:order] ? params[:order] : 'desc'

@papers = Paper.unscoped.in_progress.where(:editor => @editor).order(:last_activity => sort_order).paginate(
:page => params[:page],
:per_page => 20
)
@@ -50,18 +60,33 @@ def reviews
end

def in_progress
@papers = Paper.in_progress.paginate(
:page => params[:page],
:per_page => 20
)
if params[:order]
@papers = Paper.unscoped.in_progress.order(:last_activity => params[:order]).paginate(
:page => params[:page],
:per_page => 20
)
else
@papers = Paper.in_progress.paginate(
:page => params[:page],
:per_page => 20
)
end
render template: "home/reviews"
end

def all
@papers = Paper.all.paginate(
if params[:order]
@papers = Paper.unscoped.all.order(:last_activity => params[:order]).paginate(
:page => params[:page],
:per_page => 20
)
else
@papers = Paper.all.paginate(
:page => params[:page],
:per_page => 20
)
end

render template: "home/reviews"
end

@@ -104,6 +104,7 @@ def parse_payload!
issues['last_edits'] = {}
issues['last_edits'][sender] = payload['issue']['updated_at']
end
paper.last_activity = payload['issue']['updated_at']
paper.save and return
end

@@ -133,6 +134,7 @@ def parse_payload!
# Only keep the last 5 comments
issues['comments'] = issues['comments'].take(5)

paper.last_activity = commented_at
paper.save
end

@@ -40,6 +40,14 @@ def commenters_for(paper)

end

def stale_link
link_to("Most stale".html_safe, "#{request.path}?order=asc")
end

def fresh_link
link_to("Least stale".html_safe, "#{request.path}?order=desc")
end

def comment_link(comment)
link_to("View comment →".html_safe, comment['comment_url'], :target => "_blank")
end
@@ -62,7 +62,7 @@ class Paper < ActiveRecord::Base
scope :visible, -> { where(:state => VISIBLE_STATES) }
scope :everything, lambda { where('state NOT IN (?)', ['rejected', 'withdrawn']) }

before_create :set_sha
before_create :set_sha, :set_last_activity
after_create :notify_editors

validates_presence_of :title
@@ -288,4 +288,8 @@ def markdown_code
def set_sha
self.sha ||= SecureRandom.hex
end

def set_last_activity
self.last_activity = Time.now
end
end
@@ -25,7 +25,7 @@
<th scope="col" width="8%">State</th>
<th scope="col" width="18%">Reviewers</th>
<th scope="col" width="12%">Submitted</th>
<th scope="col" width="29%">Last Activity</th>
<th scope="col" width="29%">Last Activity &middot; <%= stale_link %> &middot; <%= fresh_link %></th>
</tr>
</thead>
<tbody>
@@ -0,0 +1,6 @@
class AddLastActiveAtToPapers < ActiveRecord::Migration[5.1]
def change
add_column :papers, :last_activity, :datetime
add_index :papers, :last_activity
end
end
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 20180929182512) do
ActiveRecord::Schema.define(version: 20181213123534) do

# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -56,7 +56,9 @@
t.integer "editor_id"
t.string "reviewers", default: [], array: true
t.text "activities"
t.datetime "last_activity"
t.index ["editor_id"], name: "index_papers_on_editor_id"
t.index ["last_activity"], name: "index_papers_on_last_activity"
t.index ["reviewers"], name: "index_papers_on_reviewers", using: :gin
t.index ["sha"], name: "index_papers_on_sha"
t.index ["user_id"], name: "index_papers_on_user_id"
@@ -3,6 +3,50 @@ include ConsoleExtensions

namespace :utils do

desc "Populate activities"
task :update_activities => :environment do
Paper.all.each do |paper|
if activities = paper.activities
# Find the most recent comment

puts "working with #{paper.id}"
if activities['issues'].nil?
puts "No activity for #{paper.id}"
else
comments = activities['issues']['comments']
last_comment = comments.sort_by {|c| c['commented_at']}.last['commented_at']
end

if activities['last_edits'].nil?
if last_comment.nil?
paper.last_activity = paper.created_at
puts "Setting last activity to #{paper.created_at} for #{paper.id} (LAST RESORT)"

else
puts "No edits for #{paper.id}"
paper.last_activity = last_comment
puts "Setting last activity to #{last_comment} for #{paper.id}"
end
else
edits = activities['issues']['last_edits']
last_edit = edits.sort_by {|e, date| date }.last[1]

puts last_edit
puts last_comment
date = last_comment > last_edit ? last_comment : last_edit

paper.last_activity = date
puts "Setting last activity to #{date} for #{paper.id}"
end

paper.save
else # no paper activities
paper.last_activity = paper.created_at
paper.save
end
end
end

def utils_initialize_activities(paper)
activities = {
'issues' => {
@@ -69,6 +69,11 @@ def json_fixture(file_name)
expect(response).to be_ok
expect(@paper.activities).to eq({"issues"=>{"commenters"=>{"pre-review"=>{}, "review"=>{}}, "comments"=>[], "last_edits"=>{"comment-editor"=>"2018-10-06T16:18:56Z"}}})
end

it "should update the last_activity field" do
github_updated_at = JSON.parse(whedon_review_edit)['issue']['updated_at'].to_datetime.strftime("%Y-%m-%dT%l:%M:%S%z")
expect(@paper.last_activity.strftime('%Y-%m-%dT%l:%M:%S%z')).to eql(github_updated_at)
end
end

describe "POST #github_recevier", :type => :request do

0 comments on commit 31b0d23

Please sign in to comment.
You can’t perform that action at this time.