Commit 9cf1f69c authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge branch 'feature/note_milestone_events'

parents 69c18903 b79e0088
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
* *
*/ */
.event-item { .event-item {
min-height: 40px;
border-bottom: 1px solid #eee; border-bottom: 1px solid #eee;
.event-title { .event-title {
color: #333; color: #333;
...@@ -50,14 +49,18 @@ ...@@ -50,14 +49,18 @@
} }
} }
.avatar { .avatar {
width: 32px; position: relative;
top: -3px;
} }
.event_icon { .event_icon {
position: relative;
float: right; float: right;
border: 1px solid #EEE; border: 1px solid #EEE;
padding: 5px; padding: 5px;
@include border-radius(5px); @include border-radius(5px);
background: #F9F9F9; background: #F9F9F9;
margin-left: 10px;
top: -6px;
img { img {
width: 20px; width: 20px;
} }
...@@ -71,7 +74,7 @@ ...@@ -71,7 +74,7 @@
} }
} }
padding: 15px 5px; padding: 16px 5px;
&:last-child { border:none } &:last-child { border:none }
.wll:hover { background:none } .wll:hover { background:none }
......
...@@ -43,6 +43,7 @@ class MilestonesController < ProjectResourceController ...@@ -43,6 +43,7 @@ class MilestonesController < ProjectResourceController
def create def create
@milestone = @project.milestones.new(params[:milestone]) @milestone = @project.milestones.new(params[:milestone])
@milestone.author_id_of_changes = current_user.id
if @milestone.save if @milestone.save
redirect_to project_milestone_path(@project, @milestone) redirect_to project_milestone_path(@project, @milestone)
...@@ -52,7 +53,7 @@ class MilestonesController < ProjectResourceController ...@@ -52,7 +53,7 @@ class MilestonesController < ProjectResourceController
end end
def update def update
@milestone.update_attributes(params[:milestone]) @milestone.update_attributes(params[:milestone].merge(author_id_of_changes: current_user.id))
respond_to do |format| respond_to do |format|
format.js format.js
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
# #
class Event < ActiveRecord::Base class Event < ActiveRecord::Base
include NoteEvent
include PushEvent include PushEvent
attr_accessible :project, :action, :data, :author_id, :project_id, attr_accessible :project, :action, :data, :author_id, :project_id,
...@@ -58,12 +59,14 @@ class Event < ActiveRecord::Base ...@@ -58,12 +59,14 @@ class Event < ActiveRecord::Base
end end
end end
# Next events currently enabled for system def proper?
# - push if push?
# - new issue true
# - merge request elsif membership_changed?
def allowed? true
push? || issue? || merge_request? || membership_changed? else
(issue? || merge_request? || note? || milestone?) && target
end
end end
def project_name def project_name
...@@ -94,6 +97,14 @@ class Event < ActiveRecord::Base ...@@ -94,6 +97,14 @@ class Event < ActiveRecord::Base
action == self.class::Reopened action == self.class::Reopened
end end
def milestone?
target_type == "Milestone"
end
def note?
target_type == "Note"
end
def issue? def issue?
target_type == "Issue" target_type == "Issue"
end end
......
...@@ -13,7 +13,8 @@ ...@@ -13,7 +13,8 @@
# #
class Milestone < ActiveRecord::Base class Milestone < ActiveRecord::Base
attr_accessible :title, :description, :due_date, :closed attr_accessible :title, :description, :due_date, :closed, :author_id_of_changes
attr_accessor :author_id_of_changes
belongs_to :project belongs_to :project
has_many :issues has_many :issues
...@@ -67,4 +68,8 @@ class Milestone < ActiveRecord::Base ...@@ -67,4 +68,8 @@ class Milestone < ActiveRecord::Base
def open? def open?
!closed !closed
end end
def author_id
author_id_of_changes
end
end end
...@@ -121,4 +121,12 @@ class Note < ActiveRecord::Base ...@@ -121,4 +121,12 @@ class Note < ActiveRecord::Base
def downvote? def downvote?
note.start_with?('-1') || note.start_with?(':-1:') note.start_with?('-1') || note.start_with?(':-1:')
end end
def noteable_type_name
if noteable_type.present?
noteable_type.downcase
else
"wall"
end
end
end end
class ActivityObserver < ActiveRecord::Observer class ActivityObserver < ActiveRecord::Observer
observe :issue, :merge_request observe :issue, :merge_request, :note, :milestone
def after_create(record) def after_create(record)
event_author_id = record.author_id
# Skip status notes
if record.kind_of?(Note) && record.note.include?("_Status changed to ")
return true
end
if event_author_id
Event.create( Event.create(
project: record.project, project: record.project,
target_id: record.id, target_id: record.id,
target_type: record.class.name, target_type: record.class.name,
action: Event.determine_action(record), action: Event.determine_action(record),
author_id: record.author_id author_id: event_author_id
) )
end end
end
def after_save(record) def after_save(record)
if record.changed.include?("closed") if record.changed.include?("closed") && record.author_id_of_changes
Event.create( Event.create(
project: record.project, project: record.project,
target_id: record.id, target_id: record.id,
......
module NoteEvent
def note_commit_id
target.noteable_id
end
def note_short_commit_id
note_commit_id[0..8]
end
def note_commit?
target.noteable_type == "Commit"
end
def note_target
target.noteable
end
def note_target_id
target.noteable_id
end
end
...@@ -7,7 +7,7 @@ xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://sear ...@@ -7,7 +7,7 @@ xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://sear
xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any? xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any?
@events.each do |event| @events.each do |event|
if event.allowed? if event.proper?
event = EventDecorator.decorate(event) event = EventDecorator.decorate(event)
xml.entry do xml.entry do
event_link = event.feed_url event_link = event.feed_url
......
- if event.allowed? - if event.proper?
%div.event-item %div.event-item
= event_image(event) %span.cgray.right
#{time_ago_in_words(event.created_at)} ago.
= image_tag gravatar_icon(event.author_email), class: "avatar s24" = image_tag gravatar_icon(event.author_email), class: "avatar s24"
- if event.push? - if event.push?
= render "events/event/push", event: event = render "events/event/push", event: event
.clearfix
- elsif event.note?
= render "events/event/note", event: event
- else - else
= render "events/event/common", event: event = render "events/event/common", event: event
.clearfix
%span.cgray.right
= time_ago_in_words(event.created_at)
ago.
.clearfix
.event-title
%span.author_name= link_to_author event
%span.event_label commented on #{event.target.noteable_type_name}
- if event.target and event.note_target
- if event.note_commit?
= link_to event.note_short_commit_id, project_commit_path(event.project, event.note_commit_id), class: "commit_short_id"
- else
= link_to [event.project, event.note_target] do
%strong= truncate event.note_target_id
- else
%strong (deleted)
at
- if event.project
= link_to_project event.project
- else
= event.project_name
.event-body
%span.hint
&nbsp;
%i.icon-comment
= truncate event.target.note, length: 70
...@@ -7,7 +7,7 @@ xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://sear ...@@ -7,7 +7,7 @@ xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://sear
xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any? xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any?
@events.each do |event| @events.each do |event|
if event.allowed? if event.proper?
event = EventDecorator.decorate(event) event = EventDecorator.decorate(event)
xml.entry do xml.entry do
event_link = event.feed_url event_link = event.feed_url
......
...@@ -59,7 +59,7 @@ describe Event do ...@@ -59,7 +59,7 @@ describe Event do
end end
it { @event.push?.should be_true } it { @event.push?.should be_true }
it { @event.allowed?.should be_true } it { @event.proper?.should be_true }
it { @event.new_branch?.should be_true } it { @event.new_branch?.should be_true }
it { @event.tag?.should be_false } it { @event.tag?.should be_false }
it { @event.branch_name.should == "master" } it { @event.branch_name.should == "master" }
......
...@@ -34,15 +34,17 @@ describe ActivityObserver do ...@@ -34,15 +34,17 @@ describe ActivityObserver do
it { @event.target.should == @issue } it { @event.target.should == @issue }
end end
#describe "Issue commented" do describe "Issue commented" do
#before do before do
#@issue = create(:issue, project: project) Note.observers.enable :activity_observer do
#@note = create(:note, noteable: @issue, project: project) @issue = create(:issue, project: project)
#@event = Event.last @note = create(:note, noteable: @issue, project: project, author: @issue.author)
#end @event = Event.last
end
#it_should_be_valid_event end
#it { @event.action.should == Event::Commented }
#it { @event.target.should == @note } it_should_be_valid_event
#end it { @event.action.should == Event::Commented }
it { @event.target.should == @note }
end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment