diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2012-09-09 22:32:43 -0700 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2012-09-09 22:32:43 -0700 |
commit | 80685596d3df23f05f2bd9978c8d8f483e799028 (patch) | |
tree | 043a9a48f08507b96064cef157ff733ca89ce2b4 | |
parent | a56cec113204130385e0fbc3f2223d81101357ef (diff) | |
parent | 1f240b09ed5f9f5476a863dd2f906398e5a9f0d4 (diff) | |
download | gitlab-ce-80685596d3df23f05f2bd9978c8d8f483e799028.tar.gz |
Merge pull request #1414 from AlexDenisov/team_member_events
Team membership events
-rw-r--r-- | app/assets/stylesheets/common.scss | 8 | ||||
-rw-r--r-- | app/decorators/event_decorator.rb | 4 | ||||
-rw-r--r-- | app/models/event.rb | 20 | ||||
-rw-r--r-- | app/models/users_project.rb | 2 | ||||
-rw-r--r-- | app/observers/users_project_observer.rb | 15 | ||||
-rw-r--r-- | app/views/events/_event.html.haml | 4 | ||||
-rw-r--r-- | app/views/events/_event_membership_changed.html.haml | 9 | ||||
-rw-r--r-- | features/dashboard/dashboard.feature | 10 | ||||
-rw-r--r-- | features/step_definitions/dashboard_steps.rb | 25 | ||||
-rw-r--r-- | spec/models/event_spec.rb | 22 | ||||
-rw-r--r-- | spec/observers/users_project_observer_spec.rb | 27 |
11 files changed, 143 insertions, 3 deletions
diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index aa27a280a18..012aad031b1 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -179,6 +179,14 @@ span.update-author { &.merged { background-color: #2A2; } + + &.joined { + background-color: #1cb9ff; + } + + &.left { + background-color: #ff5057; + } } form { diff --git a/app/decorators/event_decorator.rb b/app/decorators/event_decorator.rb index 7df9081f045..ce0aaa039b9 100644 --- a/app/decorators/event_decorator.rb +++ b/app/decorators/event_decorator.rb @@ -8,7 +8,9 @@ class EventDecorator < ApplicationDecorator "#{self.author_name} #{self.action_name} MR ##{self.target_id}:" + self.merge_request_title elsif self.push? "#{self.author_name} #{self.push_action_name} #{self.ref_type} " + self.ref_name - else + elsif self.membership_changed? + "#{self.author_name} #{self.action_name} #{self.project.name}" + else "" end end diff --git a/app/models/event.rb b/app/models/event.rb index e20b79e2a82..308ffd63961 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -10,6 +10,8 @@ class Event < ActiveRecord::Base Pushed = 5 Commented = 6 Merged = 7 + Joined = 8 # User joined project + Left = 9 # User left project belongs_to :project belongs_to :target, polymorphic: true @@ -37,7 +39,7 @@ class Event < ActiveRecord::Base # - new issue # - merge request def allowed? - push? || issue? || merge_request? + push? || issue? || merge_request? || membership_changed? end def push? @@ -84,6 +86,18 @@ class Event < ActiveRecord::Base [Closed, Reopened].include?(action) end + def joined? + action == Joined + end + + def left? + action == Left + end + + def membership_changed? + joined? || left? + end + def issue target if target_type == "Issue" end @@ -101,6 +115,10 @@ class Event < ActiveRecord::Base "closed" elsif merged? "merged" + elsif joined? + 'joined' + elsif left? + 'left' else "opened" end diff --git a/app/models/users_project.rb b/app/models/users_project.rb index 3b951f0dae9..ce64a10f3f0 100644 --- a/app/models/users_project.rb +++ b/app/models/users_project.rb @@ -23,7 +23,7 @@ class UsersProject < ActiveRecord::Base def self.bulk_delete(project, user_ids) UsersProject.transaction do UsersProject.where(:user_id => user_ids, :project_id => project.id).each do |users_project| - users_project.delete + users_project.destroy end end end diff --git a/app/observers/users_project_observer.rb b/app/observers/users_project_observer.rb index 763b2c87f63..b2cea9f279e 100644 --- a/app/observers/users_project_observer.rb +++ b/app/observers/users_project_observer.rb @@ -1,9 +1,24 @@ class UsersProjectObserver < ActiveRecord::Observer def after_create(users_project) Notify.project_access_granted_email(users_project.id).deliver + + Event.create( + project_id: users_project.project.id, + action: Event::Joined, + author_id: users_project.user.id + ) end def after_update(users_project) Notify.project_access_granted_email(users_project.id).deliver end + + def after_destroy(users_project) + Event.create( + project_id: users_project.project.id, + action: Event::Left, + author_id: users_project.user.id + ) + end + end diff --git a/app/views/events/_event.html.haml b/app/views/events/_event.html.haml index d49f0382dea..7bae8db13f7 100644 --- a/app/views/events/_event.html.haml +++ b/app/views/events/_event.html.haml @@ -11,3 +11,7 @@ .event_feed = render "events/event_push", event: event + - elsif event.membership_changed? + .event_feed + = render "events/event_membership_changed", event: event + diff --git a/app/views/events/_event_membership_changed.html.haml b/app/views/events/_event_membership_changed.html.haml new file mode 100644 index 00000000000..b079c138f5a --- /dev/null +++ b/app/views/events/_event_membership_changed.html.haml @@ -0,0 +1,9 @@ += image_tag gravatar_icon(event.author_email), class: "avatar" +%strong #{event.author_name} +%span.event_label{class: event.action_name}= event.action_name +project +%strong= link_to event.project.name, event.project +%span.cgray + = time_ago_in_words(event.created_at) + ago. + diff --git a/features/dashboard/dashboard.feature b/features/dashboard/dashboard.feature index a8c2205c143..98bb49803f3 100644 --- a/features/dashboard/dashboard.feature +++ b/features/dashboard/dashboard.feature @@ -15,4 +15,14 @@ Feature: Dashboard And I click "Create Merge Request" link Then I see prefilled new Merge Request page + Scenario: I should see User joined Project event + Given user with name "John Doe" joined project "Shop" + When I visit dashboard page + Then I should see "John Doe joined project Shop" event + Scenario: I should see User left Project event + Given user with name "John Doe" joined project "Shop" + And user with name "John Doe" left project "Shop" + When I visit dashboard page + Then I should see "John Doe left project Shop" event + diff --git a/features/step_definitions/dashboard_steps.rb b/features/step_definitions/dashboard_steps.rb index 867233c82cb..3ddc68e931c 100644 --- a/features/step_definitions/dashboard_steps.rb +++ b/features/step_definitions/dashboard_steps.rb @@ -109,3 +109,28 @@ Given /^I have authored merge requests$/ do :author => @user, :project => project2 end + +Given /^user with name "(.*?)" joined project "(.*?)"$/ do |user_name, project_name| + user = Factory.create(:user, {name: user_name}) + project = Project.find_by_name project_name + Event.create( + project: project, + author_id: user.id, + action: Event::Joined + ) +end + +Given /^user with name "(.*?)" left project "(.*?)"$/ do |user_name, project_name| + user = User.find_by_name user_name + project = Project.find_by_name project_name + Event.create( + project: project, + author_id: user.id, + action: Event::Left + ) +end + +Then /^I should see "(.*?)" event$/ do |event_text| + page.should have_content(event_text) +end + diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index aaffda3199e..ee022e959e7 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -49,4 +49,26 @@ describe Event do it { @event.branch_name.should == "master" } it { @event.author.should == @user } end + + describe "Joined project team" do + let(:project) {Factory.create :project} + let(:new_user) {Factory.create :user} + it "should create event" do + UsersProject.observers.enable :users_project_observer + expect{ + UsersProject.bulk_import(project, [new_user.id], UsersProject::DEVELOPER) + }.to change{Event.count}.by(1) + end + end + describe "Left project team" do + let(:project) {Factory.create :project} + let(:new_user) {Factory.create :user} + it "should create event" do + UsersProject.bulk_import(project, [new_user.id], UsersProject::DEVELOPER) + UsersProject.observers.enable :users_project_observer + expect{ + UsersProject.bulk_delete(project, [new_user.id]) + }.to change{Event.count}.by(1) + end + end end diff --git a/spec/observers/users_project_observer_spec.rb b/spec/observers/users_project_observer_spec.rb index 3e3920407cb..f38d98620a3 100644 --- a/spec/observers/users_project_observer_spec.rb +++ b/spec/observers/users_project_observer_spec.rb @@ -23,6 +23,14 @@ describe UsersProjectObserver do Notify.should_receive(:project_access_granted_email).with(users_project.id).and_return(double(deliver: true)) subject.after_create(users_project) end + it "should create new event" do + Event.should_receive(:create).with( + project_id: users_project.project.id, + action: Event::Joined, + author_id: users_project.user.id + ) + subject.after_create(users_project) + end end describe "#after_update" do @@ -37,4 +45,23 @@ describe UsersProjectObserver do subject.after_update(users_project) end end + describe "#after_destroy" do + it "should called when UsersProject destroyed" do + subject.should_receive(:after_destroy) + UsersProject.observers.enable :users_project_observer do + UsersProject.bulk_delete( + users_project.project, + [users_project.user.id] + ) + end + end + it "should create new event" do + Event.should_receive(:create).with( + project_id: users_project.project.id, + action: Event::Left, + author_id: users_project.user.id + ) + subject.after_destroy(users_project) + end + end end |