Handle removed author when rendering comments
[gitorious:mainline.git] / app / presenters / comment_presenter.rb
1 # encoding: utf-8
2 #--
3 #   Copyright (C) 2013 Gitorious AS
4 #
5 #   This program is free software: you can redistribute it and/or modify
6 #   it under the terms of the GNU Affero General Public License as published by
7 #   the Free Software Foundation, either version 3 of the License, or
8 #   (at your option) any later version.
9 #
10 #   This program is distributed in the hope that it will be useful,
11 #   but WITHOUT ANY WARRANTY; without even the implied warranty of
12 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 #   GNU Affero General Public License for more details.
14 #
15 #   You should have received a copy of the GNU Affero General Public License
16 #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 #++
18
19 class CommentPresenter
20   attr_reader :comment, :view_context
21   alias :v :view_context
22
23   def initialize(comment, view_context)
24     @comment = comment
25     @view_context = view_context
26   end
27
28   def id
29     comment.id
30   end
31
32   def context
33     return if comment.context.blank?
34     v.content_tag :blockquote do
35       v.content_tag :pre, :class => "diff-comment-context" do
36         v.content_tag(:code, comment.context)
37       end
38     end
39   end
40
41   def state_changed
42     return unless comment.state_changed_to
43
44     v.content_tag :p, :class => 'gts-bordered-row' do |c|
45       "→ State changed #{state_changed_from} #{state_changed_to}".html_safe
46     end
47   end
48
49   def markdown
50     v.render_markdown(comment.body, :auto_link).html_safe
51   end
52
53   def avatar
54     default_url = Gitorious::View::AvatarHelper::DEFAULT_AVATAR_FILE
55     url = comment.user ? v.avatar_url(comment.user, :size => 24) : default_url
56     v.image_tag url, :width => 24, :height => 24, :alt => "avatar", :class => "gts-avatar"
57   end
58
59   def author_link
60     return v.content_tag :span, "Removed Author" unless comment.user
61     v.link_to(comment.user.login, v.user_path(comment.user))
62   end
63
64   def label
65     "#{line_number} #{time}"
66   end
67
68   def edit_link
69     return unless v.can_edit?(v.current_user, comment)
70     v.link_to("Edit comment", v.edit_comment_path(comment))
71   end
72
73   private
74
75   def line_number
76     return unless comment.applies_to_line_numbers?
77     link = v.link_to("##{comment.sha1[0...7]}", v.project_repository_commit_path(comment.project, comment.repository, comment.sha1))
78     "on " + link
79   end
80
81   def time
82     comment.created_at.strftime("%b %-d %Y, %H:%M.")
83   end
84
85   def state_changed_from
86     return "" unless comment.state_changed_from
87     state_changed_span("from", comment.state_changed_from)
88   end
89
90   def state_changed_to
91     state_changed_span("to", comment.state_changed_to)
92   end
93
94   def state_changed_span(label, state)
95     label_class = v.status_open?(state) ? 'label-success' : 'label-inverse'
96     span = v.content_tag(:span, state, :class => "label #{label_class}")
97     "#{label} #{span}"
98   end
99 end
100