Defect #6082
openacts_as_event email key
0%
Description
When gravatars are enabled, the activity view tries to show the gravatar by passing a user object to the avatar method. While this works for all events that have local users, the changeset model/event can't always create a local user object for the changeset while still having the email of the user that generated this changeset.
Concrete use-case: I have a git repository in which I have cherry-picked 2 revisions from a user not member of my redmine installation, in this case the changeset retains the author not as a user object, but as a string "name <email>" (very much like git presents it), the changeset object only presents the "name" as the author (see source:/trunk/app/models/changeset.rb#L68). While this is correct behavior for places just polling event_author for a name, the avatar won't get the email address from it, though that information is present. I've changed the activity view to try to use committer (the whole "name <email>", which avatar parses corectly) if the "normal" way doesn't yield an avatar, the following line source:trunk/app/views/projects/activity.rhtml#L10
<%= avatar(e.event_author, :size => "24") if e.respond_to?(:event_author) %>
to read:
<%= (avatar(e.event_author, :size => "24") if e.respond_to?(:event_author)) or (avatar(e.committer, :size => "24") if e.respond_to?(:committer)) %>
This solves the problem for changesets, but will not solve it for the generic case.
I see 2 options here to deal with that: either extend acts_as_event to also provide a method/an interface to query the author's email address (but that feels somewhat kludgy), or mock a (temporary) user object with the information we have (basically the name for the to_s method and the email address for email) to provide the same interface as for "local users". This might break further along down the way though if anything polling the events expects to receive a full user object but only gets one with a very limited interface.
Files
Updated by Go MAEDA almost 5 years ago
- File bugs_ruby-lang_org-activity.png bugs_ruby-lang_org-activity.png added
- Status changed from New to Confirmed
I have confirmed the issue on https://bugs.ruby-lang.org/.
Gravatar icons for committers who don't have an account of the Redmine are not displayed on the Activity page.

Updated by Yuichi HARADA almost 5 years ago
- File 6082.patch 6082.patch added
I created a helper method for the activity because it complicates the Redmine account and the Repository committer decisions.
diff --git a/app/helpers/activities_helper.rb b/app/helpers/activities_helper.rb
index 49074b5617..d48a9939e1 100644
--- a/app/helpers/activities_helper.rb
+++ b/app/helpers/activities_helper.rb
@@ -30,4 +30,12 @@ module ActivitiesHelper
end
sorted_events
end
+
+ def activity_avatar(event)
+ return nil unless event.respond_to?(:event_author)
+
+ author = event.event_author
+ committer = event.respond_to?(:committer) ? event.committer : nil
+ avatar(author.is_a?(User) ? author : (committer || author))
+ end
end
diff --git a/app/views/activities/_activities.html.erb b/app/views/activities/_activities.html.erb
index aaeea76bc2..5de9a7fd37 100644
--- a/app/views/activities/_activities.html.erb
+++ b/app/views/activities/_activities.html.erb
@@ -4,7 +4,7 @@
<dl>
<% sort_activity_events(events_by_day[day]).each do |e, in_group| -%>
<dt class="<%= e.event_type %> icon icon-<%= e.event_type %> <%= "grouped" if in_group %> <%= User.current.logged? && e.respond_to?(:event_author) && User.current == e.event_author ? 'me' : nil %>">
- <%= avatar(e.event_author) if e.respond_to?(:event_author) %>
+ <%= activity_avatar(e) %>
<span class="time"><%= format_time(e.event_datetime, false) %></span>
<%= content_tag('span', e.project, :class => 'project') if @project.nil? || @project != e.project %>
<%= link_to format_activity_title(e.event_title), e.event_url %>
Updated by Go MAEDA almost 5 years ago
Thank you for posting the patch but the test fails.
$ ruby test/functional/activities_controller_test.rb
Run options: --seed 15717
# Running:
.....E
Error:
ActivitiesControllerTest#test_index_with_mercurial_changesets_and_gravatar_enabled_should_display_gravatar:
NoMethodError: undefined method `committer' for nil:NilClass
test/functional/activities_controller_test.rb:312:in `test_index_with_mercurial_changesets_and_gravatar_enabled_should_display_gravatar'
bin/rails test test/functional/activities_controller_test.rb:302
Updated by Yuichi HARADA over 4 years ago
Go MAEDA wrote:
Thank you for posting the patch but the test fails.
[...]
I was able to reproduce the test error.
$ rm -rf tmp/test/mercurial_repository
$ ruby test/functional/activities_controller_test.rb
Run options: --seed 63630
# Running:
......E
Error:
ActivitiesControllerTest#test_index_with_mercurial_changesets_and_gravatar_enabled_should_display_gravatar:
NoMethodError: undefined method `committer' for nil:NilClass
test/functional/activities_controller_test.rb:313:in `test_index_with_mercurial_changesets_and_gravatar_enabled_should_display_gravatar'
bin/rails test test/functional/activities_controller_test.rb:303
...........
Finished in 3.751118s, 4.7986 runs/s, 16.5284 assertions/s.
18 runs, 62 assertions, 0 failures, 1 errors, 0 skips
Please execute bundle exec rake test:scm:setup:mercurial to create the Mercurial repository.