Feature #3099 » activity_always-r3.3.patch
app/controllers/activities_controller.rb | ||
---|---|---|
27 | 27 |
begin; @date_to = params[:from].to_date + 1; rescue; end |
28 | 28 |
end |
29 | 29 | |
30 |
@date_to ||= User.current.today + 1 |
|
31 |
@date_from = @date_to - @days |
|
32 | 30 |
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1') |
33 | 31 |
if params[:user_id].present? |
34 | 32 |
@author = User.active.find(params[:user_id]) |
... | ... | |
53 | 51 |
end |
54 | 52 |
end |
55 | 53 | |
54 |
@date_to ||= User.current.today + 1 |
|
55 |
@date_from = @date_to |
|
56 | ||
57 |
# Expand to empty activity period |
|
58 |
@activity_before = last_activity(@date_to) |
|
59 |
if ! @activity_before.nil? |
|
60 |
@date_from = @date_to - (((@date_to - @activity_before.to_date - 1) / @days).to_i + 1 ) * @days |
|
61 |
@activity_before = last_activity(@date_from - 1) |
|
62 |
if ! @activity_before.nil? |
|
63 |
@date_from = @date_from - (((@date_from - @activity_before.to_date - 1) / @days).to_i) * @days |
|
64 |
end |
|
65 |
end |
|
66 | ||
67 |
@activity_after = next_activity(@date_to) |
|
68 |
if @activity_after.nil? |
|
69 |
@date_to = Date.today + 1 |
|
70 |
else |
|
71 |
@date_to = @date_to + (((@activity_after.to_date - @date_to) / @days).to_i) * @days |
|
72 |
end |
|
73 | ||
56 | 74 |
events = @activity.events(@date_from, @date_to) |
57 | 75 | |
58 | 76 |
if events.empty? || stale?(:etag => [@activity.scope, @date_to, @date_from, @with_subprojects, @author, events.first, events.size, User.current, current_language]) |
... | ... | |
87 | 105 |
rescue ActiveRecord::RecordNotFound |
88 | 106 |
render_404 |
89 | 107 |
end |
108 | ||
109 |
def last_activity(to=nil) |
|
110 |
Redmine::Activity::Fetcher.new(User.current, :project => @project, |
|
111 |
:with_subprojects => @with_subprojects, |
|
112 |
:author => @author). |
|
113 |
events(nil, to, :last_by_project => true).map{|e| e[1]}.sort.last |
|
114 |
end |
|
115 | ||
116 |
def next_activity(from=nil) |
|
117 |
Redmine::Activity::Fetcher.new(User.current, :project => @project, |
|
118 |
:with_subprojects => @with_subprojects, |
|
119 |
:author => @author). |
|
120 |
events(from, nil, :next_by_project => true).map{|e| e[1]}.sort.first |
|
121 |
end |
|
90 | 122 |
end |
app/views/activities/index.html.erb | ||
---|---|---|
1 | 1 |
<h2><%= @author.nil? ? l(:label_activity) : l(:label_user_activity, link_to_user(@author)).html_safe %></h2> |
2 |
<p class="subtitle"><%= l(:label_date_from_to, :start => format_date(@date_to - @days), :end => format_date(@date_to-1)) %></p>
|
|
2 |
<p class="subtitle"><%= l(:label_date_from_to, :start => format_date(@date_from), :end => format_date(@date_to-1)) unless @events_by_day.empty? %></p>
|
|
3 | 3 | |
4 | 4 |
<div id="activity"> |
5 | 5 |
<% @events_by_day.keys.sort.reverse.each do |day| %> |
... | ... | |
23 | 23 | |
24 | 24 |
<div style="float:left;"> |
25 | 25 |
<%= link_to_content_update("\xc2\xab " + l(:label_previous), |
26 |
params.merge(:from => @date_to - @days - 1),
|
|
27 |
:title => l(:label_date_from_to, :start => format_date(@date_to - 2*@days), :end => format_date(@date_to - @days - 1)),
|
|
28 |
:accesskey => accesskey(:previous)) %> |
|
26 |
params.merge(:from => @date_from - 1),
|
|
27 |
:title => l(:label_date_from_to, :start => format_date(@date_from - @days), :end => format_date(@date_from - 1)),
|
|
28 |
:accesskey => accesskey(:previous)) unless @activity_before.nil? %>
|
|
29 | 29 |
</div> |
30 | 30 |
<div style="float:right;"> |
31 | 31 |
<%= link_to_content_update(l(:label_next) + " \xc2\xbb", |
config/locales/en.yml | ||
---|---|---|
254 | 254 |
field_downloads: Downloads |
255 | 255 |
field_author: Author |
256 | 256 |
field_created_on: Created |
257 |
field_last_activity: Last activity |
|
257 | 258 |
field_updated_on: Updated |
258 | 259 |
field_closed_on: Closed |
259 | 260 |
field_field_format: Format |
config/locales/pt-BR.yml | ||
---|---|---|
222 | 222 |
field_downloads: Downloads |
223 | 223 |
field_author: Autor |
224 | 224 |
field_created_on: Criado em |
225 |
field_last_activity: Última atividade |
|
225 | 226 |
field_updated_on: Alterado em |
226 | 227 |
field_field_format: Formato |
227 | 228 |
field_is_for_all: Para todos os projetos |
lib/plugins/acts_as_activity_provider/lib/acts_as_activity_provider.rb | ||
---|---|---|
55 | 55 | |
56 | 56 |
scope = (provider_options[:scope] || self) |
57 | 57 | |
58 |
if from && to |
|
59 |
scope = scope.where("#{provider_options[:timestamp]} BETWEEN ? AND ?", from, to) |
|
60 |
end |
|
58 |
scope = scope.where("#{provider_options[:timestamp]} >= ?", from) if from |
|
59 |
scope = scope.where("#{provider_options[:timestamp]} <= ?", to) if to |
|
61 | 60 | |
62 | 61 |
if options[:author] |
63 | 62 |
return [] if provider_options[:author_key].nil? |
... | ... | |
78 | 77 |
scope = scope.where(Project.allowed_to_condition(user, "view_#{self.name.underscore.pluralize}".to_sym, options)) |
79 | 78 |
end |
80 | 79 | |
80 |
if options[:next_by_project] |
|
81 |
scope = scope.group("projects.id").minimum(provider_options[:timestamp]) |
|
82 |
end |
|
83 | ||
84 |
if options[:last_by_project] |
|
85 |
scope = scope.group("projects.id").maximum(provider_options[:timestamp]) |
|
86 |
end |
|
87 | ||
81 | 88 |
scope.to_a |
82 | 89 |
end |
83 | 90 |
end |
lib/redmine/activity/fetcher.rb | ||
---|---|---|
85 | 85 |
def events(from = nil, to = nil, options={}) |
86 | 86 |
e = [] |
87 | 87 |
@options[:limit] = options[:limit] |
88 |
@options[:last_by_project] = options[:last_by_project] if options[:last_by_project] |
|
89 |
@options[:next_by_project] = options[:next_by_project] if options[:next_by_project] |
|
88 | 90 | |
89 | 91 |
@scope.each do |event_type| |
90 | 92 |
constantized_providers(event_type).each do |provider| |
... | ... | |
92 | 94 |
end |
93 | 95 |
end |
94 | 96 | |
95 |
e.sort! {|a,b| b.event_datetime <=> a.event_datetime} |
|
97 |
if options[:last_by_project] |
|
98 |
e.sort! |
|
99 |
elsif options[:next_by_project] |
|
100 |
e.sort! {|a,b| b <=> a} |
|
101 |
else |
|
102 |
e.sort! {|a,b| b.event_datetime <=> a.event_datetime} |
|
96 | 103 | |
97 |
if options[:limit] |
|
98 |
e = e.slice(0, options[:limit]) |
|
104 |
if options[:limit] |
|
105 |
e = e.slice(0, options[:limit]) |
|
106 |
end |
|
99 | 107 |
end |
100 | 108 |
e |
101 | 109 |
end |