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