191 lines
6.2 KiB
Diff
191 lines
6.2 KiB
Diff
|
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
|
||
|
--- a/app/helpers/application_helper.rb
|
||
|
+++ b/app/helpers/application_helper.rb
|
||
|
@@ -147,9 +147,8 @@ module ApplicationHelper
|
||
|
end
|
||
|
|
||
|
def project_last_activity project
|
||
|
- activity = project.last_activity
|
||
|
- if activity && activity.created_at
|
||
|
- time_ago_in_words(activity.created_at) + " ago"
|
||
|
+ if project.last_activity_date != project.created_at
|
||
|
+ time_ago_in_words(project.last_activity_date) + " ago"
|
||
|
else
|
||
|
"Never"
|
||
|
end
|
||
|
diff --git a/app/models/event.rb b/app/models/event.rb
|
||
|
--- a/app/models/event.rb
|
||
|
+++ b/app/models/event.rb
|
||
|
@@ -38,7 +38,7 @@ class Event < ActiveRecord::Base
|
||
|
delegate :title, to: :merge_request, prefix: true, allow_nil: true
|
||
|
|
||
|
belongs_to :author, class_name: "User"
|
||
|
- belongs_to :project
|
||
|
+ belongs_to :project, touch: true
|
||
|
belongs_to :target, polymorphic: true
|
||
|
|
||
|
# For Hash only
|
||
|
diff --git a/app/models/project.rb b/app/models/project.rb
|
||
|
--- a/app/models/project.rb
|
||
|
+++ b/app/models/project.rb
|
||
|
@@ -227,7 +227,8 @@ class Project < ActiveRecord::Base
|
||
|
end
|
||
|
|
||
|
def last_activity_date
|
||
|
- last_event.try(:created_at) || updated_at
|
||
|
+ # touched when any associated event is saved
|
||
|
+ updated_at
|
||
|
end
|
||
|
|
||
|
def project_id
|
||
|
diff --git a/db/migrate/20121227190440_touch_projects_last_activity.rb b/db/migrate/20121227190440_touch_projects_last_activity.rb
|
||
|
--- /dev/null
|
||
|
+++ b/db/migrate/20121227190440_touch_projects_last_activity.rb
|
||
|
@@ -0,0 +1,18 @@
|
||
|
+class TouchProjectsLastActivity < ActiveRecord::Migration
|
||
|
+ def up
|
||
|
+ Project.record_timestamps = false
|
||
|
+
|
||
|
+ Project.find_each do |project|
|
||
|
+ last_event = project.events.order(:created_at).last
|
||
|
+ if last_event and last_event.created_at > project.updated_at
|
||
|
+ project.update_attribute(:updated_at, last_event.created_at)
|
||
|
+ end
|
||
|
+ end
|
||
|
+
|
||
|
+ Project.record_timestamps = true
|
||
|
+ end
|
||
|
+
|
||
|
+ def down
|
||
|
+ raise ActiveRecord::IrreversibleMigration
|
||
|
+ end
|
||
|
+end
|
||
|
diff --git a/db/schema.rb b/db/schema.rb
|
||
|
--- a/db/schema.rb
|
||
|
+++ b/db/schema.rb
|
||
|
@@ -11,7 +11,7 @@
|
||
|
#
|
||
|
# It's strongly recommended to check this file into your version control system.
|
||
|
|
||
|
-ActiveRecord::Schema.define(:version => 20121219095402) do
|
||
|
+ActiveRecord::Schema.define(:version => 20121227190440) do
|
||
|
|
||
|
create_table "events", :force => true do |t|
|
||
|
t.string "target_type"
|
||
|
diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb
|
||
|
--- a/spec/models/event_spec.rb
|
||
|
+++ b/spec/models/event_spec.rb
|
||
|
@@ -30,6 +30,17 @@ describe Event do
|
||
|
it { should respond_to(:commits) }
|
||
|
end
|
||
|
|
||
|
+ describe "Save" do
|
||
|
+ let(:event) { create(:event) }
|
||
|
+ let(:project) { create(:project) }
|
||
|
+
|
||
|
+ it "should touch associated project" do
|
||
|
+ event.stub(project: project)
|
||
|
+ event.project.should_receive(:touch)
|
||
|
+ event.save!
|
||
|
+ end
|
||
|
+ end
|
||
|
+
|
||
|
describe "Push event" do
|
||
|
before do
|
||
|
project = create(:project)
|
||
|
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
|
||
|
--- a/spec/models/project_spec.rb
|
||
|
+++ b/spec/models/project_spec.rb
|
||
|
@@ -163,22 +163,18 @@ describe Project do
|
||
|
|
||
|
describe "last_activity methods" do
|
||
|
let(:project) { create(:project) }
|
||
|
- let(:last_event) { double(created_at: Time.now) }
|
||
|
+ let(:last_event) { create(:event) }
|
||
|
|
||
|
describe "last_activity" do
|
||
|
- it "should alias last_activity to last_event"do
|
||
|
+ it "should alias last_activity to last_event" do
|
||
|
project.stub(last_event: last_event)
|
||
|
project.last_activity.should == last_event
|
||
|
end
|
||
|
end
|
||
|
|
||
|
- describe 'last_activity_date' do
|
||
|
- it 'returns the creation date of the project\'s last event if present' do
|
||
|
- project.stub(last_event: last_event)
|
||
|
- project.last_activity_date.should == last_event.created_at
|
||
|
- end
|
||
|
-
|
||
|
- it 'returns the project\'s last update date if it has no events' do
|
||
|
+ describe "last_activity_date" do
|
||
|
+ it "should alias last_activity_date to updated_at" do
|
||
|
+ project.stub(updated_at: Time.now)
|
||
|
project.last_activity_date.should == project.updated_at
|
||
|
end
|
||
|
end
|
||
|
diff --git a/app/roles/authority.rb b/app/roles/authority.rb
|
||
|
--- a/app/roles/authority.rb
|
||
|
+++ b/app/roles/authority.rb
|
||
|
@@ -19,21 +19,25 @@ module Authority
|
||
|
end
|
||
|
|
||
|
def repository_readers
|
||
|
- keys = Key.joins({user: :users_projects}).
|
||
|
- where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::REPORTER)
|
||
|
- keys.map(&:identifier) + deploy_keys.map(&:identifier)
|
||
|
+ repository_members[UsersProject::REPORTER]
|
||
|
end
|
||
|
|
||
|
def repository_writers
|
||
|
- keys = Key.joins({user: :users_projects}).
|
||
|
- where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::DEVELOPER)
|
||
|
- keys.map(&:identifier)
|
||
|
+ repository_members[UsersProject::DEVELOPER]
|
||
|
end
|
||
|
|
||
|
def repository_masters
|
||
|
- keys = Key.joins({user: :users_projects}).
|
||
|
- where("users_projects.project_id = ? AND users_projects.project_access = ?", id, UsersProject::MASTER)
|
||
|
- keys.map(&:identifier)
|
||
|
+ repository_members[UsersProject::MASTER]
|
||
|
+ end
|
||
|
+
|
||
|
+ def repository_members
|
||
|
+ keys = Hash.new {|h,k| h[k] = [] }
|
||
|
+ UsersProject.select("keys.identifier, project_access").
|
||
|
+ joins(user: :keys).where(project_id: id).
|
||
|
+ each {|row| keys[row.project_access] << [row.identifier] }
|
||
|
+
|
||
|
+ keys[UsersProject::REPORTER] += deploy_keys.pluck(:identifier)
|
||
|
+ keys
|
||
|
end
|
||
|
|
||
|
def allow_read_for?(user)
|
||
|
diff --git a/app/views/events/_event.html.haml b/app/views/events/_event.html.haml
|
||
|
--- a/app/views/events/_event.html.haml
|
||
|
+++ b/app/views/events/_event.html.haml
|
||
|
@@ -2,14 +2,14 @@
|
||
|
%div.event-item
|
||
|
%span.cgray.right
|
||
|
#{time_ago_in_words(event.created_at)} ago.
|
||
|
+ - cache event do
|
||
|
+ = image_tag gravatar_icon(event.author_email), class: "avatar s24"
|
||
|
|
||
|
- = image_tag gravatar_icon(event.author_email), class: "avatar s24"
|
||
|
-
|
||
|
- - if event.push?
|
||
|
- = render "events/event/push", event: event
|
||
|
- .clearfix
|
||
|
- - elsif event.note?
|
||
|
- = render "events/event/note", event: event
|
||
|
- - else
|
||
|
- = render "events/event/common", event: event
|
||
|
+ - if event.push?
|
||
|
+ = render "events/event/push", event: event
|
||
|
+ .clearfix
|
||
|
+ - elsif event.note?
|
||
|
+ = render "events/event/note", event: event
|
||
|
+ - else
|
||
|
+ = render "events/event/common", event: event
|