Merge branch 'feature/note_milestone_events'
This commit is contained in:
commit
9cf1f69cfa
13 changed files with 123 additions and 40 deletions
|
@ -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 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.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 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
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
|
||||||
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 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
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
|
||||||
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
|
||||||
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 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
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
|
||||||
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
|
||||||
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
|
||||||
|
|
|
@ -1,18 +1,27 @@
|
||||||
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,
|
||||||
|
|
21
app/roles/note_event.rb
Normal file
21
app/roles/note_event.rb
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
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
|
||||||
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
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
- 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
|
|
||||||
|
|
23
app/views/events/event/_note.html.haml
Normal file
23
app/views/events/event/_note.html.haml
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
.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
|
||||||
|
|
||||||
|
%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
|
||||||
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
|
||||||
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
|
||||||
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
|
||||||
|
end
|
||||||
|
|
||||||
#it_should_be_valid_event
|
it_should_be_valid_event
|
||||||
#it { @event.action.should == Event::Commented }
|
it { @event.action.should == Event::Commented }
|
||||||
#it { @event.target.should == @note }
|
it { @event.target.should == @note }
|
||||||
#end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Reference in a new issue