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.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.