diff --git a/app/assets/javascripts/index/layers/notes.js b/app/assets/javascripts/index/layers/notes.js index 4676aa425e..49ae566944 100644 --- a/app/assets/javascripts/index/layers/notes.js +++ b/app/assets/javascripts/index/layers/notes.js @@ -40,7 +40,7 @@ OSM.initializeNotesLayer = function (map) { } else { marker = L.marker(feature.geometry.coordinates.reverse(), { icon: noteIcons[feature.properties.status], - title: feature.properties.comments[0].text, + title: feature.properties.description, opacity: 0.8, interactive: true }); diff --git a/app/helpers/note_helper.rb b/app/helpers/note_helper.rb index 2e9850aef0..93c959a36e 100644 --- a/app/helpers/note_helper.rb +++ b/app/helpers/note_helper.rb @@ -1,6 +1,18 @@ module NoteHelper include ActionView::Helpers::TranslationHelper + def note_description(note) + if note.nil? + "" + elsif note.author_deleted? + RichText.new("text", t("notes.show.description_when_author_is_deleted")) + elsif note.user_ip.nil? && note.user_id.nil? + note.all_comments.first.body + else + RichText.new("text", note.description) + end + end + def note_event(event, at, by) if by.nil? t("notes.show.event_#{event}_by_anonymous_html", diff --git a/app/models/note.rb b/app/models/note.rb index 17b57c0fa6..ef72a847eb 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -28,6 +28,8 @@ class Note < ApplicationRecord include GeoRecord + belongs_to :author, :class_name => "User", :foreign_key => "user_id", :optional => true + has_many :comments, -> { left_joins(:author).where(:visible => true, :users => { :status => [nil, "active", "confirmed"] }).order(:created_at) }, :class_name => "NoteComment", :foreign_key => :note_id has_many :all_comments, -> { left_joins(:author).order(:created_at) }, :class_name => "NoteComment", :foreign_key => :note_id, :inverse_of => :note has_many :subscriptions, :class_name => "NoteSubscription" @@ -89,24 +91,18 @@ def freshly_closed_until closed_at + DEFAULT_FRESHLY_CLOSED_LIMIT end - # Return the note's description, derived from the first comment - def description - comments.first.body + def author_deleted? + !author.nil? && author.status == "deleted" end - # Return the note's author object, derived from the first comment + # Return the note's author object, unless record is unavailable and + # it will be derived from the first comment def author - comments.first.author - end - - # Return the note's author ID, derived from the first comment - def author_id - comments.first.author_id - end - - # Return the note's author IP address, derived from the first comment - def author_ip - comments.first.author_ip + if user_ip.nil? && user_id.nil? + all_comments.first.author + else + self[:author] + end end private diff --git a/app/views/api/notes/_note.json.jbuilder b/app/views/api/notes/_note.json.jbuilder index 0884c4426d..74b8462ebd 100644 --- a/app/views/api/notes/_note.json.jbuilder +++ b/app/views/api/notes/_note.json.jbuilder @@ -7,6 +7,7 @@ end json.properties do json.id note.id + json.description note_description(note) json.url api_note_url(note, :format => params[:format]) if note.closed? diff --git a/app/views/api/notes/_note.rss.builder b/app/views/api/notes/_note.rss.builder index fa70536f79..3deca386e5 100644 --- a/app/views/api/notes/_note.rss.builder +++ b/app/views/api/notes/_note.rss.builder @@ -13,7 +13,7 @@ xml.item do xml.guid api_note_url(note) xml.description render(:partial => "description", :object => note, :formats => [:html]) - xml.dc :creator, note.author.display_name if note.author + xml.dc :creator, note.author.display_name unless note.author.nil? || note.author_deleted? xml.pubDate note.created_at.to_fs(:rfc822) xml.geo :lat, note.lat diff --git a/app/views/api/notes/_note.xml.builder b/app/views/api/notes/_note.xml.builder index 0e5ad0007e..7175491d2a 100644 --- a/app/views/api/notes/_note.xml.builder +++ b/app/views/api/notes/_note.xml.builder @@ -1,4 +1,4 @@ -xml.note("lon" => note.lon, "lat" => note.lat) do +xml.note("lon" => note.lon, "lat" => note.lat, "description" => note_description(note)) do xml.id note.id xml.url api_note_url(note, :format => params[:format]) diff --git a/app/views/notes/index.html.erb b/app/views/notes/index.html.erb index f805a10402..f6bd75869a 100644 --- a/app/views/notes/index.html.erb +++ b/app/views/notes/index.html.erb @@ -48,7 +48,7 @@
- <% @note_comments.drop(1).each do |comment| %> + <% @note_comments.drop(@note.author_deleted? ? 0 : 1).each do |comment| %>-
<%= note_event(comment.event, comment.created_at, comment.author) %>
diff --git a/config/locales/en.yml b/config/locales/en.yml
index a7125a3a7d..722eec0e8d 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -3063,6 +3063,7 @@ en:
open_title: "Unresolved note #%{note_name}"
closed_title: "Resolved note #%{note_name}"
hidden_title: "Hidden note #%{note_name}"
+ description_when_author_is_deleted: "deleted"
event_opened_by_html: "Created by %{user} %{time_ago}"
event_opened_by_anonymous_html: "Created by anonymous %{time_ago}"
event_commented_by_html: "Comment from %{user} %{time_ago}"
diff --git a/test/models/note_test.rb b/test/models/note_test.rb
index ba87911e33..58cd66f0b0 100644
--- a/test/models/note_test.rb
+++ b/test/models/note_test.rb
@@ -47,15 +47,6 @@ def test_closed?
assert_not_predicate create(:note, :status => "open", :closed_at => nil), :closed?
end
- def test_description
- comment = create(:note_comment)
- assert_equal comment.body, comment.note.description
-
- user = create(:user)
- comment = create(:note_comment, :author => user)
- assert_equal comment.body, comment.note.description
- end
-
def test_author
comment = create(:note_comment)
assert_nil comment.note.author
@@ -65,23 +56,6 @@ def test_author
assert_equal user, comment.note.author
end
- def test_author_id
- comment = create(:note_comment)
- assert_nil comment.note.author_id
-
- user = create(:user)
- comment = create(:note_comment, :author => user)
- assert_equal user.id, comment.note.author_id
- end
-
- def test_author_ip
- comment = create(:note_comment)
- assert_nil comment.note.author_ip
-
- comment = create(:note_comment, :author_ip => IPAddr.new("192.168.1.1"))
- assert_equal IPAddr.new("192.168.1.1"), comment.note.author_ip
- end
-
# Ensure the lat/lon is formatted as a decimal e.g. not 4.0e-05
def test_lat_lon_format
note = build(:note, :latitude => 0.00004 * GeoRecord::SCALE, :longitude => 0.00008 * GeoRecord::SCALE)
diff --git a/test/system/report_note_test.rb b/test/system/report_note_test.rb
index c4bcc612d6..809495fefb 100644
--- a/test/system/report_note_test.rb
+++ b/test/system/report_note_test.rb
@@ -4,7 +4,6 @@ class ReportNoteTest < ApplicationSystemTestCase
def test_no_link_when_not_logged_in
note = create(:note_with_comments)
visit note_path(note)
- assert_content note.description
assert_no_content I18n.t("notes.show.report")
end