From: Tom Hughes Date: Thu, 8 Nov 2018 17:44:57 +0000 (+0000) Subject: Merge remote-tracking branch 'upstream/pull/2052' X-Git-Tag: live~2825 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/70d6880e10881dfd4b68f51cf16609a9f8aaff24?hp=26777c44648f908b723c0c74b65972f75ac5fd3d Merge remote-tracking branch 'upstream/pull/2052' --- diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index e6ecfdb4a..7232d199b 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -48,7 +48,7 @@ Metrics/BlockNesting: # Offense count: 63 # Configuration parameters: CountComments. Metrics/ClassLength: - Max: 1801 + Max: 1627 # Offense count: 72 Metrics/CyclomaticComplexity: diff --git a/app/controllers/changeset_comments_controller.rb b/app/controllers/changeset_comments_controller.rb new file mode 100644 index 000000000..6a563f9b2 --- /dev/null +++ b/app/controllers/changeset_comments_controller.rb @@ -0,0 +1,125 @@ +class ChangesetCommentsController < ApplicationController + before_action :authorize_web, :only => [:index] + before_action :set_locale, :only => [:index] + before_action :authorize, :only => [:create, :destroy, :restore] + before_action :require_moderator, :only => [:destroy, :restore] + before_action :require_allow_write_api, :only => [:create, :destroy, :restore] + before_action :require_public_data, :only => [:create] + before_action :check_api_writable, :only => [:create, :destroy, :restore] + before_action :check_api_readable, :except => [:create, :index] + before_action(:only => [:index]) { |c| c.check_database_readable(true) } + around_action :api_call_handle_error, :except => [:index] + around_action :api_call_timeout, :except => [:index] + around_action :web_timeout, :only => [:index] + + ## + # Add a comment to a changeset + def create + # Check the arguments are sane + raise OSM::APIBadUserInput, "No id was given" unless params[:id] + raise OSM::APIBadUserInput, "No text was given" if params[:text].blank? + + # Extract the arguments + id = params[:id].to_i + body = params[:text] + + # Find the changeset and check it is valid + changeset = Changeset.find(id) + raise OSM::APIChangesetNotYetClosedError, changeset if changeset.is_open? + + # Add a comment to the changeset + comment = changeset.comments.create(:changeset => changeset, + :body => body, + :author => current_user) + + # Notify current subscribers of the new comment + changeset.subscribers.visible.each do |user| + Notifier.changeset_comment_notification(comment, user).deliver_later if current_user != user + end + + # Add the commenter to the subscribers if necessary + changeset.subscribers << current_user unless changeset.subscribers.exists?(current_user.id) + + # Return a copy of the updated changeset + render :xml => changeset.to_xml.to_s + end + + ## + # Sets visible flag on comment to false + def destroy + # Check the arguments are sane + raise OSM::APIBadUserInput, "No id was given" unless params[:id] + + # Extract the arguments + id = params[:id].to_i + + # Find the changeset + comment = ChangesetComment.find(id) + + # Hide the comment + comment.update(:visible => false) + + # Return a copy of the updated changeset + render :xml => comment.changeset.to_xml.to_s + end + + ## + # Sets visible flag on comment to true + def restore + # Check the arguments are sane + raise OSM::APIBadUserInput, "No id was given" unless params[:id] + + # Extract the arguments + id = params[:id].to_i + + # Find the changeset + comment = ChangesetComment.find(id) + + # Unhide the comment + comment.update(:visible => true) + + # Return a copy of the updated changeset + render :xml => comment.changeset.to_xml.to_s + end + + ## + # Get a feed of recent changeset comments + def index + if params[:id] + # Extract the arguments + id = params[:id].to_i + + # Find the changeset + changeset = Changeset.find(id) + + # Return comments for this changeset only + @comments = changeset.comments.includes(:author, :changeset).limit(comments_limit) + else + # Return comments + @comments = ChangesetComment.includes(:author, :changeset).where(:visible => true).order("created_at DESC").limit(comments_limit).preload(:changeset) + end + + # Render the result + respond_to do |format| + format.rss + end + rescue OSM::APIBadUserInput + head :bad_request + end + + private + + ## + # Get the maximum number of comments to return + def comments_limit + if params[:limit] + if params[:limit].to_i.positive? && params[:limit].to_i <= 10000 + params[:limit].to_i + else + raise OSM::APIBadUserInput, "Comments limit must be between 1 and 10000" + end + else + 100 + end + end +end diff --git a/app/controllers/changeset_controller.rb b/app/controllers/changeset_controller.rb index 4ce205fd1..7c9944f63 100644 --- a/app/controllers/changeset_controller.rb +++ b/app/controllers/changeset_controller.rb @@ -5,18 +5,17 @@ class ChangesetController < ApplicationController require "xml/libxml" skip_before_action :verify_authenticity_token, :except => [:index] - before_action :authorize_web, :only => [:index, :feed, :comments_feed] - before_action :set_locale, :only => [:index, :feed, :comments_feed] - before_action :authorize, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment] - before_action :require_moderator, :only => [:hide_comment, :unhide_comment] - before_action :require_allow_write_api, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment] - before_action :require_public_data, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe] - before_action :check_api_writable, :only => [:create, :update, :upload, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment] - before_action :check_api_readable, :except => [:create, :update, :upload, :download, :query, :index, :feed, :comment, :subscribe, :unsubscribe, :comments_feed] - before_action(:only => [:index, :feed, :comments_feed]) { |c| c.check_database_readable(true) } - around_action :api_call_handle_error, :except => [:index, :feed, :comments_feed] - around_action :api_call_timeout, :except => [:index, :feed, :comments_feed, :upload] - around_action :web_timeout, :only => [:index, :feed, :comments_feed] + before_action :authorize_web, :only => [:index, :feed] + before_action :set_locale, :only => [:index, :feed] + before_action :authorize, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe] + before_action :require_allow_write_api, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe] + before_action :require_public_data, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe] + before_action :check_api_writable, :only => [:create, :update, :upload, :subscribe, :unsubscribe] + before_action :check_api_readable, :except => [:create, :update, :upload, :download, :query, :index, :feed, :subscribe, :unsubscribe] + before_action(:only => [:index, :feed]) { |c| c.check_database_readable(true) } + around_action :api_call_handle_error, :except => [:index, :feed] + around_action :api_call_timeout, :except => [:index, :feed, :upload] + around_action :web_timeout, :only => [:index, :feed] # Helper methods for checking consistency include ConsistencyValidations @@ -310,38 +309,6 @@ class ChangesetController < ApplicationController index end - ## - # Add a comment to a changeset - def comment - # Check the arguments are sane - raise OSM::APIBadUserInput, "No id was given" unless params[:id] - raise OSM::APIBadUserInput, "No text was given" if params[:text].blank? - - # Extract the arguments - id = params[:id].to_i - body = params[:text] - - # Find the changeset and check it is valid - changeset = Changeset.find(id) - raise OSM::APIChangesetNotYetClosedError, changeset if changeset.is_open? - - # Add a comment to the changeset - comment = changeset.comments.create(:changeset => changeset, - :body => body, - :author => current_user) - - # Notify current subscribers of the new comment - changeset.subscribers.visible.each do |user| - Notifier.changeset_comment_notification(comment, user).deliver_later if current_user != user - end - - # Add the commenter to the subscribers if necessary - changeset.subscribers << current_user unless changeset.subscribers.exists?(current_user.id) - - # Return a copy of the updated changeset - render :xml => changeset.to_xml.to_s - end - ## # Adds a subscriber to the changeset def subscribe @@ -382,69 +349,6 @@ class ChangesetController < ApplicationController render :xml => changeset.to_xml.to_s end - ## - # Sets visible flag on comment to false - def hide_comment - # Check the arguments are sane - raise OSM::APIBadUserInput, "No id was given" unless params[:id] - - # Extract the arguments - id = params[:id].to_i - - # Find the changeset - comment = ChangesetComment.find(id) - - # Hide the comment - comment.update(:visible => false) - - # Return a copy of the updated changeset - render :xml => comment.changeset.to_xml.to_s - end - - ## - # Sets visible flag on comment to true - def unhide_comment - # Check the arguments are sane - raise OSM::APIBadUserInput, "No id was given" unless params[:id] - - # Extract the arguments - id = params[:id].to_i - - # Find the changeset - comment = ChangesetComment.find(id) - - # Unhide the comment - comment.update(:visible => true) - - # Return a copy of the updated changeset - render :xml => comment.changeset.to_xml.to_s - end - - ## - # Get a feed of recent changeset comments - def comments_feed - if params[:id] - # Extract the arguments - id = params[:id].to_i - - # Find the changeset - changeset = Changeset.find(id) - - # Return comments for this changeset only - @comments = changeset.comments.includes(:author, :changeset).limit(comments_limit) - else - # Return comments - @comments = ChangesetComment.includes(:author, :changeset).where(:visible => true).order("created_at DESC").limit(comments_limit).preload(:changeset) - end - - # Render the result - respond_to do |format| - format.rss - end - rescue OSM::APIBadUserInput - head :bad_request - end - private #------------------------------------------------------------ @@ -577,18 +481,4 @@ class ChangesetController < ApplicationController def conditions_nonempty(changesets) changesets.where("num_changes > 0") end - - ## - # Get the maximum number of comments to return - def comments_limit - if params[:limit] - if params[:limit].to_i.positive? && params[:limit].to_i <= 10000 - params[:limit].to_i - else - raise OSM::APIBadUserInput, "Comments limit must be between 1 and 10000" - end - else - 100 - end - end end diff --git a/app/views/changeset/_comment.html.erb b/app/views/changeset_comments/_comment.html.erb similarity index 51% rename from app/views/changeset/_comment.html.erb rename to app/views/changeset_comments/_comment.html.erb index dfd91167b..32a4b9229 100644 --- a/app/views/changeset/_comment.html.erb +++ b/app/views/changeset_comments/_comment.html.erb @@ -1,6 +1,6 @@ -

<%= t "changeset.rss.comment", :author => comment.author.display_name, +

<%= t ".comment", :author => comment.author.display_name, :changeset_id => comment.changeset.id.to_s %>

-
<%= t "changeset.rss.commented_at_by_html", :when => friendly_date(comment.created_at), :user => comment.author.display_name %>
+
<%= t ".commented_at_by_html", :when => friendly_date(comment.created_at), :user => comment.author.display_name %>
<%= comment.body %>
diff --git a/app/views/changeset/_comments.rss.builder b/app/views/changeset_comments/_comments.rss.builder similarity index 82% rename from app/views/changeset/_comments.rss.builder rename to app/views/changeset_comments/_comments.rss.builder index 5c683c86d..8848b9a80 100644 --- a/app/views/changeset/_comments.rss.builder +++ b/app/views/changeset_comments/_comments.rss.builder @@ -1,6 +1,6 @@ comments.each do |comment| xml.item do - xml.title t("changeset.rss.comment", :author => comment.author.display_name, :changeset_id => comment.changeset.id.to_s) + xml.title t(".comment", :author => comment.author.display_name, :changeset_id => comment.changeset.id.to_s) xml.link url_for(:controller => "browse", :action => "changeset", :id => comment.changeset.id, :anchor => "c#{comment.id}", :only_path => false) xml.guid url_for(:controller => "browse", :action => "changeset", :id => comment.changeset.id, :anchor => "c#{comment.id}", :only_path => false) diff --git a/app/views/changeset/comments_feed.rss.builder b/app/views/changeset_comments/index.rss.builder similarity index 70% rename from app/views/changeset/comments_feed.rss.builder rename to app/views/changeset_comments/index.rss.builder index f6d304a4c..acaa54727 100644 --- a/app/views/changeset/comments_feed.rss.builder +++ b/app/views/changeset_comments/index.rss.builder @@ -2,9 +2,9 @@ xml.rss("version" => "2.0", "xmlns:dc" => "http://purl.org/dc/elements/1.1/") do xml.channel do if @changeset - xml.title t("changeset.rss.title_particular", :changeset_id => @changeset.id) + xml.title t(".title_particular", :changeset_id => @changeset.id) else - xml.title t("changeset.rss.title_all") + xml.title t(".title_all") end xml.link url_for(:controller => "site", :action => "index", :only_path => false) diff --git a/app/views/changeset_comments/timeout.atom.builder b/app/views/changeset_comments/timeout.atom.builder new file mode 100644 index 000000000..b5eeeed4a --- /dev/null +++ b/app/views/changeset_comments/timeout.atom.builder @@ -0,0 +1,12 @@ +atom_feed(:language => I18n.locale, :schema_date => 2009, + :id => url_for(params.merge(:only_path => false)), + :root_url => url_for(params.merge(:only_path => false, :format => nil)), + "xmlns:georss" => "http://www.georss.org/georss") do |feed| + feed.title @title + + feed.subtitle :type => "xhtml" do |xhtml| + xhtml.p do |p| + p << t(".sorry") + end + end +end diff --git a/app/views/changeset_comments/timeout.html.erb b/app/views/changeset_comments/timeout.html.erb new file mode 100644 index 000000000..84432bc8d --- /dev/null +++ b/app/views/changeset_comments/timeout.html.erb @@ -0,0 +1 @@ +

<%= t '.sorry' %>

diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 718f30119..8f39978bb 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -2662,4 +2662,9 @@ ar: هذا التنقيح قبل تدميره. flash: التنقيح تم تدميره. error: حدث خطأ في تدمير هذا التنقيح. + validations: + leading_whitespace: لديه مسافة بيضاء أمامية + trailing_whitespace: لديه مسافة بيضاء زائدة + invalid_characters: يحتوي على أحرف غير صالحة + url_characters: يحتوي على أحرف يو آر إل خاصة (%{characters}) ... diff --git a/config/locales/bn.yml b/config/locales/bn.yml index b24834872..ec97318ef 100644 --- a/config/locales/bn.yml +++ b/config/locales/bn.yml @@ -6,6 +6,7 @@ # Author: Bodhisattwa # Author: Ehsanulhb # Author: Elias Ahmmad +# Author: Gronthokeet # Author: Kayser Ahmad # Author: Nasir8891 # Author: R4bb1 @@ -314,10 +315,12 @@ bn: edit_link: এই ভুক্তি সম্পাদনা করুন hide_link: এই ভুক্তি লুকান confirm: নিশ্চিত করুন + report: এই ভুক্তির বিরুদ্ধে অভিযোগ করুন diary_comment: comment_from: '%{comment_created_at}-এ %{link_user} কর্তৃক মন্তব্য' hide_link: এই মন্তব্যটি লুকান confirm: নিশ্চিত করুন + report: এই মন্তব্যের বিরুদ্ধে অভিযোগ করুন location: location: 'অবস্থান:' view: দেখাও @@ -361,6 +364,7 @@ bn: aerodrome: বিমানশালা apron: বর্হিবাস gate: প্রবেশপথ + hangar: বিমান রাখার স্থান helipad: হেলিপ্যাড parking_position: পার্কিং-এর স্থান runway: রানওয়ে @@ -421,6 +425,7 @@ bn: office: দপ্তর parking: পার্কিং parking_entrance: পার্কিং প্রবেশপথ + parking_space: গাড়ি রাখার স্থান pharmacy: ঔষধালয় place_of_worship: উপাসনালয় police: পুলিশ @@ -456,6 +461,7 @@ bn: youth_centre: যুব কেন্দ্র boundary: administrative: প্রশাসনিক সীমানা + census: আদমশুমারি এলাকা national_park: জাতীয় উদ্যান protected_area: সুরক্ষিত এলাকা bridge: @@ -479,8 +485,10 @@ bn: "yes": কারুকাজ দোকান emergency: ambulance_station: রুগ্নবাহিকা স্টেশন + defibrillator: ডিফাইব্রিলেটর landing_site: জরুরি অবতরণ ক্ষেত্র phone: জরুরি ফোন + water_tank: জরুরি পানির ট্যাংক "yes": জরুরী highway: abandoned: পরিত্যক্ত মহাসড়ক @@ -493,6 +501,7 @@ bn: emergency_access_point: জরুরি প্রবেশ স্থল footway: ফুটপাথ milestone: মাইলফলক + motorway: মোটরপথ path: পাথ pedestrian: পাদচারী পথ platform: প্লাটফর্ম @@ -508,12 +517,13 @@ bn: service: পার্শ্ব সড়ক speed_camera: গতিমাপক ক্যামেরা steps: ধাপ - stop: থাকার চিহ্ন + stop: থামার চিহ্ন street_lamp: রাস্তার বাতি tertiary: প্রশাখা সড়ক tertiary_link: প্রশাখা সড়ক track: নির্ধারিত পথ traffic_signals: ট্রাফিক সংকেত + trail: চলাচলের নিশানা trunk: মূল সড়ক trunk_link: মূল সড়ক unclassified: অশ্রেণীকৃত সড়ক @@ -523,6 +533,7 @@ bn: battlefield: যুদ্ধক্ষেত্র boundary_stone: সীমানাজ্ঞাপক পাথর building: ঐতিহাসিক ভবন + bunker: আপদকালীন ভূগর্ভস্থ আশ্রয়স্থল castle: কেল্লা church: গির্জা city_gate: নগর দ্বার @@ -540,6 +551,8 @@ bn: stone: প্রস্তর tomb: সমাধি tower: মিনার + wreck: ভগ্নাবশেষ + "yes": ঐতিহাসিক স্থান junction: "yes": জংশন landuse: @@ -571,27 +584,49 @@ bn: "yes": ব্যবহার্য ভূমি leisure: beach_resort: সৈকতীয় রিসোর্ট + bird_hide: পক্ষীদর্শন স্থান common: সাধারণ ভূমি dog_park: কুকুর উদ্যান fishing: মৎস শিকারের এলাকা + fitness_centre: শরীরচর্চা কেন্দ্র garden: বাগান golf_course: গল্ফ মাঠ + horse_riding: অশ্বারোহণ + miniature_golf: ক্ষুদ্রাকৃতির গল্ফ nature_reserve: সংরক্ষিত প্রাকৃতিক ভূমি park: উদ্যান + pitch: খেলার পিচ playground: খেলার মাঠ recreation_ground: চিত্তবিনোদন মাঠ resort: রিসোর্ট + sauna: বাষ্পস্নান + slipway: নৌকা ছাড়ার পথ sports_centre: ক্রীড়া কেন্দ্র stadium: ক্রিড়াঙ্গন swimming_pool: সুইমিং পুল water_park: বারি উদ্যান "yes": অবসর man_made: + adit: খনি সুড়ঙ্গ + beehive: মৌমাছির কৃত্রিম বাসা + breakwater: বেড়িবাঁধ bridge: সেতু + bunker_silo: গাড়ি ভর্তি ও খালি করার জায়গা + chimney: চিম্নী + crane: কপিকল + dyke: বাঁধ + flagpole: সতর্কীকরণ পতাকা lighthouse: বাতিঘর + mast: টাওয়ার mine: খনি + monitoring_station: আবহাওয়া পর্যবেক্ষ্ণ কেন্দ্র + petroleum_well: তেলের খনি pipeline: পাইপলাইন + silo: সিলো + surveillance: নজরদারী ক্যামেরা tower: টাওয়ার + water_tower: পানির ট্যাংক + water_well: পানির কূপ works: কারখানা "yes": মনুষ্য-নির্মিত military: @@ -1324,15 +1359,26 @@ bn: rest_of_world: অন্যান্য দেশসমূহ show: my edits: আমার সম্পাদনা + my messages: আমার বার্তাসমূহ my profile: আমার প্রোফাইল my settings: আমার সেটিংস + my comments: আমার মন্তব্যস্মূহ oauth settings: OAuth সেটিংস + send message: বার্তা পাঠান + diary: দিনলিপি edits: সম্পাদনাসমূহ + remove as friend: আনফ্রেন্ড + add as friend: বন্ধু যোগ করুন + mapper since: থেকে ম্যাপ বানাচ্ছেন + ct undecided: সিদ্ধান্তহীন + ct declined: বাতিলকৃত email address: 'ই-মেইল ঠিকানা:' description: বিবরণ + user location: ব্যবহারকারীর অবস্থান settings_link_text: সেটিংস my friends: আমার বন্ধুগণ no friends: আপনি বন্ধুতালিকায় কাউকে যুক্ত করেননি। + nearby users: কাছাকাছি অন্য ব্যবহারকারী block_history: সক্রিয় বাধাসমূহ moderator_history: প্রদত্ত বাধাগুলি comments: মন্তব্যসমূহ diff --git a/config/locales/br.yml b/config/locales/br.yml index faf77a515..2541d0c64 100644 --- a/config/locales/br.yml +++ b/config/locales/br.yml @@ -219,6 +219,7 @@ br: reopened_by_anonymous: Adweredekaet gant un den dianv %{when} zo hidden_by: Kuzhet gant %{user} %{when} zo + report: Disklêriañ an notenn-mañ query: title: Arc'hweladurioù enklask introduction: Klikit war ar gartenn evit kavout arc'hweladurioù e-kichen. @@ -959,6 +960,7 @@ br: update: new_report: Enrollet mat eo bet ho tanevell successful_update: Hizivaet mat eo bet ho tanevell + provide_details: Reiñ ar munudoù goulennet show: title: '%{status} Kudenn #%{issue_id}' reports: @@ -983,6 +985,25 @@ br: issue_comments: create: comment_created: Krouet mat eo bet hoc'h evezhiadenn. + reports: + new: + title_html: Danevell %{link} + missing_params: N'haller ket krouiñ un danevell nevez + details: Roit muioc'h a vunudoù diwar-benn ar gudenn (dre ret) + disclaimer: + not_just_mistake: Sur oc'h n'eo ket ar gudenn-se ur fazi hepken. + categories: + diary_entry: + other_label: All + diary_comment: + other_label: All + user: + other_label: All + note: + other_label: All + create: + successful_report: Enrollet mat eo bet ho tanevell + provide_details: Roit ar munudoù goulennet mar plij layouts: logo: alt_text: Logo OpenStreetMap @@ -996,6 +1017,7 @@ br: edit: Aozañ history: Istor export: Ezporzhiañ + issues: Kudennoù data: Roadennoù export_data: Ezporzhiañ roadennoù gps_traces: Roudoù GPS @@ -1683,8 +1705,10 @@ br: tags_help: bevennet gant virgulennoù visibility: 'Gwelusted :' visibility_help: Petra a dalvez ? + visibility_help_url: https://wiki.openstreetmap.org/wiki/FR:Visibilit%C3%A9_des_traces_GPS upload_button: Enporzhiañ help: Skoazell + help_url: https://wiki.openstreetmap.org/wiki/FR:Upload create: upload_trace: Kas ar roud GPS trace_uploaded: Kaset eo bet ho restr GPX hag emañ en gortoz a vezañ ensoc'het @@ -1731,8 +1755,9 @@ br: delete_trace: Dilemel ar roudenn-mañ trace_not_found: N'eo ket bet kavet ar roud ! visibility: 'Gwelusted :' + confirm_delete: Diverkañ ar roudenn-mañ trace_paging_nav: - showing_page: Page %{page} + showing_page: Pajenn %{page} older: ↓Roudoù kozh newer: ↓Roudoù nevez trace: @@ -1753,6 +1778,7 @@ br: map: kartenn index: public_traces: Roudoù GPS foran + my_traces: Ma roudennoù GPS public_traces_from: Roudoù GPS foran gant %{user} description: Furchal ar roud GPS pellgarget nevez zo tagged_with: ' balizennet gant %{tags}' @@ -1761,6 +1787,7 @@ br: ar href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2i. upload_trace: Kas ur roud see_all_traces: Gwelet an holl roudoù + see_my_traces: Gwelet ma roudennoù delete: scheduled_for_deletion: Roudenn da vezañ dilamet make_public: @@ -1781,8 +1808,13 @@ br: require_cookies: cookies_needed: Diweredekaet eo an toupinoù ganeoc'h war a seblant - gweredekait an toupinoù en ho merdeer a-raok mont pelloc'h, mar plij. + require_admin: + not_an_admin: Ret eo deoc'h bezañ merour evit kas an ober-mañ da benn. require_moderator: not_a_moderator: Ret eo deoc'h bezañ habaskaer evit kas an ober-mañ da benn. + require_moderator_or_admin: + not_a_moderator_or_admin: Ret eo deoc'h bezañ habaskaer pe merour evit kas an + ober-mañ da benn. setup_user_auth: blocked_zero_hour: Ur gemennadenn vallus zo war lec'hienn OpenStreetMap evidoc'h. Ret eo deoc'h lenn ar gemennadenn-se a-raok gallout enrollañ ho kemmoù. @@ -2001,10 +2033,12 @@ br: consider_pd: Ouzhpenn an asant amañ a-us, ez anavezan emañ ma zegasadennoù en domani foran consider_pd_why: petra eo se ? + consider_pd_why_url: https://www.osmfoundation.org/wiki/License/Why_would_I_want_my_contributions_to_be_public_domain guidance: 'Titouroù da skoazellañ kompren an termenoù-mañ : a diverradenn lennus gant mab-den hag un nebeud troidigezhioù anfurmel' agree: Mat eo din + declined: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined decline: Nac'h you need to accept or decline: Lennit da gentañ Termenoù ar berzhidi nevez ha goude-se nac'hit pe asantit evit gallout kenderc'hel. @@ -2055,6 +2089,7 @@ br: if set location: Lakait ho lec'h-annez war ar bajenn %{settings_link} da welet an implijerien war-dro. settings_link_text: arventennoù + my friends: Ma mignoned no friends: N'hoc'h eus ouzhpennet mignon ebet c'hoazh. km away: war-hed %{count} km m away: war-hed %{count} m @@ -2124,6 +2159,7 @@ br: review link text: Heuilhit al liamm-mañ evel ma karot evit sellet ouzh diferadennoù nevez ar c'henlabourer hag asantiñ dezho. agreed_with_pd: Disklêriet hoc'h eus ivez emañ ho tegasadennoù en domani foran. + link: https://www.osmfoundation.org/wiki/License/Contributor_Terms link text: Petra eo se ? profile description: 'Deskrivadur ar profil :' preferred languages: 'Yezhoù gwellañ karet :' @@ -2498,12 +2534,20 @@ br: distance: Hed errors: no_route: Ne c'haller ket kavout un hent etre an daou lec'h-mañ. - no_place: Ho tigarez, ne c'haller ket kavout al lec'h-mañ. + no_place: 'Ho tigarez, ne c''haller ket kavout al lec''h-mañ : %{place}.' instructions: continue_without_exit: Kenderc'hel war%{name} slight_right_without_exit: Troit un tammig a-zehoù war %{name} offramp_right_with_name: Kemer ar vretell dehou %{name} + offramp_right_with_directions: Kemer ar vretell dehou war-zu %{directions} + offramp_right_with_name_directions: Kemer ar vretell dehou war %{name}, war-zu + %{directions} onramp_right_without_exit: Troit a-zehoù war ar bretell war %{name} + onramp_right_with_directions: Troit a-zehoù war ar vretell war-zu %{directions} + onramp_right_with_name_directions: Troit a-zehou war ar vretell war %{name}, + war-zu %{directions} + onramp_right_without_directions: Treiñ a-zehou war ar vretell + onramp_right: Troit a gleiz war ar vretell endofroad_right_without_exit: E penn an hent, troit a-zezhoù war %{name} merge_right_without_exit: Mont a-zehoù war %{name} fork_right_without_exit: Er forc'h-hent, troit a-zehoù war %{name} @@ -2512,8 +2556,17 @@ br: uturn_without_exit: Grit hanter dro war %{name} sharp_left_without_exit: Troit prim a-gleiz war %{name} turn_left_without_exit: Treiñ a-gleiz war %{name} + offramp_left: Troit a gleiz war ar vretell offramp_left_with_name: Kemer ar vretell gleiz betek %{name} + offramp_left_with_directions: Troit a-gleiz war ar vretell war-zu %{directions} + offramp_left_with_name_directions: Troit a-gleiz war ar vretell war %{name}, + war-zu %{directions} onramp_left_without_exit: Troit a-gleiz war ar vretell war %{name} + onramp_left_with_directions: Troit a-gleiz war ar vretell war-zu %{directions} + onramp_left_with_name_directions: Troit a-gleiz war ar vretell war %{name}, + war-zu %{directions} + onramp_left_without_directions: Troit a-gleiz war ar vretell + onramp_left: Troit a-gleiz war ar vretell endofroad_left_without_exit: E penn an hent, troit a-gleiz war %{name} merge_left_without_exit: Mont a-gleiz war %{name} fork_left_without_exit: Er forc'h-hent, troit a-gleiz war %{name} @@ -2523,7 +2576,7 @@ br: roundabout_without_exit: Er c'hroashent-tro, troit %{name} leave_roundabout_without_exit: Kuitaat ar c'roashent-tro - %{name} stay_roundabout_without_exit: Chom war ar c'hroashent-tro -%{name} - start_without_exit: Loc'hañ e dibenn %{name} + start_without_exit: Loc'hañ war %{name} destination_without_exit: Tizhout al lec'h against_oneway_without_exit: Mont gant ar straed untu war %{name} end_oneway_without_exit: Dibenn an tremen untun war %{name} diff --git a/config/locales/da.yml b/config/locales/da.yml index 8f662f344..7966d36f0 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -967,6 +967,7 @@ da: reported_user: Rapporteret bruger not_updated: Ikke opdateret search: Søg + search_guidance: 'Søgning blandt sager:' user_not_found: Brugeren findes ikke status: Status reports: Rapporter @@ -2641,4 +2642,6 @@ da: der tilhører denne omarbejdelse, før du sletter den. flash: Omarbejdelse slettet. error: Der opstod en fejl under sletning af denne omarbejdelse. + validations: + invalid_characters: indholder ugyldige tegn ... diff --git a/config/locales/de.yml b/config/locales/de.yml index d0e38546b..666592b07 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -2793,4 +2793,9 @@ de: zugehörigen Versionen zurück, bevor du die Redaction löschst. flash: Redaction wurde gelöscht. error: Beim Löschen dieser Redaction ist ein Fehler aufgetreten. + validations: + leading_whitespace: hat anführendes Leerzeichen + trailing_whitespace: hat anhängendes Leerzeichen + invalid_characters: enthält ungültige Zeichen + url_characters: enthält besondere URL-Zeichen (%{characters}) ... diff --git a/config/locales/el.yml b/config/locales/el.yml index 57f0a26cc..ad4f8ee47 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -2764,4 +2764,6 @@ el: σε αυτή τη σύνταξη πριν την καταστρέψετε. flash: Η παράληψη καταστραφεί. error: Εμφανίστηκε ένα σφάλμα που καταστρέφει αυτή τη σύνταξη. + validations: + invalid_characters: περιέχει μη έγκυρους χαρακτήρες ... diff --git a/config/locales/en.yml b/config/locales/en.yml index d0b574a09..197c6308c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -242,13 +242,17 @@ en: load_more: "Load more" timeout: sorry: "Sorry, the list of changesets you requested took too long to retrieve." - rss: - title_all: OpenStreetMap changeset discussion - title_particular: "OpenStreetMap changeset #%{changeset_id} discussion" + changeset_comments: + comment: comment: "New comment on changeset #%{changeset_id} by %{author}" - commented_at_html: "Updated %{when} ago" commented_at_by_html: "Updated %{when} ago by %{user}" - full: Full discussion + comments: + comment: "New comment on changeset #%{changeset_id} by %{author}" + index: + title_all: OpenStreetMap changeset discussion + title_particular: "OpenStreetMap changeset #%{changeset_id} discussion" + timeout: + sorry: "Sorry, the list of changeset comments you requested took too long to retrieve." diary_entries: new: title: New Diary Entry diff --git a/config/locales/eo.yml b/config/locales/eo.yml index f10147286..9c7462781 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -665,7 +665,7 @@ eo: monitoring_station: Observada stacio petroleum_well: Naftoŝakto pier: Marponto - pipeline: Tubolinio + pipeline: Konduktubo silo: Tur-stokejo storage_tank: Rezervujo surveillance: Supergardo diff --git a/config/locales/es.yml b/config/locales/es.yml index e0aa65cef..3b7bee66c 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -2757,4 +2757,6 @@ es: previas pertenecientes a esta redacción antes de destruirla. flash: Redacción destruida. error: Se produjo un error al destruir esta redacción + validations: + invalid_characters: contiene caracteres no válidos ... diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 2f4b77dc6..bc47886e6 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -1248,8 +1248,8 @@ fa: english_link: اصل انگلیسی native: title: درباره این صفحه - text: شما در حال مشاهده ویرایش انگلیسی قانون کپی‌رایت هستید. برای دیدن %{native_link} می - توانید به عقب باز گردید یا خواندن متن کپی رایت و %{mapping_link} را متوقف + text: شما در حال مشاهدهٔ ویرایش انگلیسی قانون کپی‌رایت هستید. برای دیدن %{native_link} + می‌توانید به عقب بازگردید یا مطالعه دربارهٔ کپی‌رایت را رها و %{mapping_link} کنید. native_link: نسخهٔ فارسی mapping_link: شروع به نقشه‌کشی @@ -1693,7 +1693,7 @@ fa: owner: 'مالک:' description: 'شرح:' tags: 'برچسب‌ها:' - none: هیچ کدام + none: هیچ edit_trace: ویرایش این رد delete_trace: حذف این رد trace_not_found: رد یافت نشد! diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 193ae8c68..4a17b3af1 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -2792,4 +2792,9 @@ fr: appartenant à ce masquage avant de le supprimer. flash: Masquage supprimé. error: Une erreur est survenue lors de la suppression de ce masquage. + validations: + leading_whitespace: a des espaces au début + trailing_whitespace: a des espaces à la fin + invalid_characters: contient des caractères non valides + url_characters: contient des caractères d’URL spéciaux (%{characters}) ... diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 4dc589c1e..649788070 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -27,6 +27,7 @@ # Author: Tacsipacsi # Author: Uno20001 # Author: Urbalazs +# Author: Zizzerus --- hu: time: @@ -2535,4 +2536,6 @@ hu: mielőtt törlöd ezt a módosítást. flash: Módosítás törölve. error: Hiba történt a művelet végrehajtása során. + validations: + invalid_characters: érvénytelen karaktereket tartalmaz ... diff --git a/config/locales/it.yml b/config/locales/it.yml index 2fa9107ea..3d5f50e91 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1883,6 +1883,7 @@ it: other: File GPX con %{count} punti da %{user} description_without_count: File GPX da %{user} application: + permission_denied: Non disponi dei permessi necessari per eseguire questa azione require_cookies: cookies_needed: Pare che tu abbia i cookie non abilitati - abilita i cookie nel tuo browser prima di continuare. @@ -2731,4 +2732,7 @@ it: appartenenti a questa revisione prima di eliminarla. flash: Revisione eliminata. error: Si è verificato un errore durante l'eliminazione. + validations: + invalid_characters: contiene caratteri non validi + url_characters: contiene caratteri URL speciali (%{characters}) ... diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 9ed3f177a..2308a17f4 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -2580,4 +2580,7 @@ ko: not_empty: 교정이 비어 있지 않습니다. 파기하기 전에 이 교정에 속하는 모든 판을 교정 취소하세요. flash: 교정을 파기했습니다. error: 이 교정을 파기하는 중에 오류가 발생했습니다. + validations: + invalid_characters: 유효하지 않은 문자가 포함됨 + url_characters: 특정 URL 문자 포함 (%{characters}) ... diff --git a/config/locales/mk.yml b/config/locales/mk.yml index d459f11f5..009ad4781 100644 --- a/config/locales/mk.yml +++ b/config/locales/mk.yml @@ -2692,4 +2692,9 @@ mk: на оваа редакција пред да ја поништите. flash: Редакцијата е поништена. error: Се појави грешка при поништувањето на редакцијата. + validations: + leading_whitespace: има почетна белина + trailing_whitespace: има завршна белина + invalid_characters: содржи неважечки знаци + url_characters: содржи посебни знаци во URL-то (%{characters}) ... diff --git a/config/locales/mo.yml b/config/locales/mo.yml index 91282edde..c1f975159 100644 --- a/config/locales/mo.yml +++ b/config/locales/mo.yml @@ -576,6 +576,9 @@ mo: site: export: title: Експортаре + traces: + edit: + save_button: Апликаря модификэрилор users: login: title: Презентаци-вэ @@ -650,10 +653,20 @@ mo: openid: link text: че май есте ши аста? public editing: + heading: 'Редактаря публикэ:' enabled link text: че май есте ши аста? contributor terms: link text: че май есте ши аста? + profile description: 'Дескриеря профилулуй:' + preferred languages: 'Лимбиле преферате:' preferred editor: 'Редактор преферат:' + image: 'Имаӂине:' gravatar: + gravatar: Фолосиря Граватарулуй link text: че май есте ши аста? + new image: Адэугаря имаӂиний + home location: 'Локул де решединцэ:' + latitude: 'Латитудине:' + longitude: 'Лонӂитудине:' + save changes button: Апликаря модификэрилор ... diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 28b3d7f59..0e997fafb 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -523,6 +523,7 @@ nl: "yes": Ambachtswinkel emergency: ambulance_station: Ambulancepost + assembly_point: Verzamelplaats defibrillator: Defibrillator landing_site: Noodlandingsbaan phone: Noodtelefoon @@ -887,6 +888,7 @@ nl: stationery: Kantoorartikelenwinkel supermarket: Supermarkt tailor: Kleermaker + ticket: Ticketwinkel tobacco: Tabakswinkel toys: Speelgoedwinkel travel_agency: Reisbureau @@ -1808,6 +1810,7 @@ nl: map: kaart index: public_traces: Openbare GPS-traces + my_traces: Mijn GPS-tracks public_traces_from: Openbare GPS-traces van %{user} description: Recente GPS-trackuploads bekijken tagged_with: ' gelabeld met %{tags}' @@ -1815,6 +1818,7 @@ nl: trace of kom meer te weten over GPS tracen op de wikipagina. upload_trace: Trace uploaden see_all_traces: Alle traces bekijken + see_my_traces: Weergeef mijn tracks delete: scheduled_for_deletion: Trace staat op de lijst voor verwijdering make_public: @@ -2635,4 +2639,7 @@ nl: betrokken zijn voordat u die vernietigt. flash: De redigering is vernietigd. error: Er is een fout opgetreden tijdens het verwijderen van de redigering. + validations: + invalid_characters: bevat ongeldige karakters + url_characters: bevat speciale URL karakters (%{characters}) ... diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index ca3969dfc..f8d690a64 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -2744,4 +2744,9 @@ pt-BR: a esta anulação antes de destruí-la. flash: Redação destruída. error: Houve um erro ao destruir esta anulação. + validations: + leading_whitespace: tem espaço em branco líder + trailing_whitespace: tem espaço em branco à direita + invalid_characters: contém caracteres inválidos + url_characters: contém caracteres de URL especiais (%{characters}) ... diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 961271545..63a7ec070 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -2734,4 +2734,9 @@ pt-PT: as versões pertencentes a esta supressão antes de a eliminar flash: Supressão eliminada. error: Ocorreu um erro ao tentar eliminar esta supressão. + validations: + leading_whitespace: tem espaços no início + trailing_whitespace: tem espaços no fim + invalid_characters: contém caracteres inválidos + url_characters: contém caracteres especiais dos URL (%{characters}) ... diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 8fe3d372e..02e3a6d10 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -37,6 +37,7 @@ # Author: Irus # Author: Kaganer # Author: Komzpa +# Author: Link2xt # Author: Lockal # Author: Macofe # Author: Mavl @@ -1908,6 +1909,7 @@ ru: other: GPX-файл с %{count} точками от %{user} description_without_count: GPX-файл от %{user} application: + permission_denied: У вас нет прав для выполнения этого действия require_cookies: cookies_needed: Похоже, что у вас выключены куки. Пожалуйста, включите куки в вашем браузере, прежде чем продолжить. @@ -2771,4 +2773,7 @@ ru: принадлежащих к этому исправлению перед удалением. flash: Исправление уничтожено. error: Произошла ошибка при уничтожении этого исправления. + validations: + invalid_characters: содержит недопустимые символы + url_characters: содержит специальные символы в URL (%{characters}) ... diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 555cc6ff0..6d107bd5c 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1900,6 +1900,7 @@ tr: other: '%{user} tarafından %{count} noktalı GPX dosyası' description_without_count: '%{user} tarafından GPX dosyası' application: + permission_denied: Bu eyleme erişme izniniz yok require_cookies: cookies_needed: Çerezleri devre dışı bırakmış görünüyorsunuz - devam etmeden önce lütfen tarayıcınızda çerezleri etkinleştirin. @@ -2684,6 +2685,9 @@ tr: against_oneway_without_exit: '%{name}X üzerinde tek yönlü git' end_oneway_without_exit: '%{name} için tek yönün sonu' roundabout_with_exit: Dönel kavşakta %{exit}. çıkışı kullanarak %{name} üzerine + roundabout_with_exit_ordinal: Dönel kavşakta %{exit} çıkışı kullanarak %{name} + üzerine + exit_roundabout: '%{name} giden kavşaktan çıkın' unnamed: adsız yol courtesy: Yolculuğun izniyle %{link}x exit_counts: @@ -2744,4 +2748,7 @@ tr: sürümlerini tekrar düzenleyin. flash: Redaksiyon kaldırıldı. error: Bu redaksiyon kaldırılırken bir hata oluştu. + validations: + invalid_characters: geçersiz karakterler içeriyor + url_characters: özel URL karakterleri içerir (%{characters}) ... diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 6dfe3523c..349817a90 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -2488,4 +2488,9 @@ zh-TW: not_empty: 修訂尚未清空。請在銷毀前清除所有此修訂的版本。 flash: 修訂已銷毀。 error: 銷毀此修訂時發生錯誤。 + validations: + leading_whitespace: 前頭有空白 + trailing_whitespace: 後端有空白 + invalid_characters: 包含無效字元 + url_characters: 包含特定 URL 字元(%{characters}) ... diff --git a/config/routes.rb b/config/routes.rb index 1f25a62c6..781466064 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -16,9 +16,9 @@ OpenStreetMap::Application.routes.draw do put "changeset/:id" => "changeset#update", :id => /\d+/ put "changeset/:id/close" => "changeset#close", :id => /\d+/ get "changesets" => "changeset#query" - post "changeset/:id/comment" => "changeset#comment", :as => :changeset_comment, :id => /\d+/ - post "changeset/comment/:id/hide" => "changeset#hide_comment", :as => :changeset_comment_hide, :id => /\d+/ - post "changeset/comment/:id/unhide" => "changeset#unhide_comment", :as => :changeset_comment_unhide, :id => /\d+/ + post "changeset/:id/comment" => "changeset_comments#create", :as => :changeset_comment, :id => /\d+/ + post "changeset/comment/:id/hide" => "changeset_comments#destroy", :as => :changeset_comment_hide, :id => /\d+/ + post "changeset/comment/:id/unhide" => "changeset_comments#restore", :as => :changeset_comment_unhide, :id => /\d+/ put "node/create" => "nodes#create" get "node/:id/ways" => "ways#ways_for_node", :id => /\d+/ @@ -116,7 +116,7 @@ OpenStreetMap::Application.routes.draw do get "/relation/:id" => "browse#relation", :id => /\d+/, :as => :relation get "/relation/:id/history" => "browse#relation_history", :id => /\d+/ get "/changeset/:id" => "browse#changeset", :as => :changeset, :id => /\d+/ - get "/changeset/:id/comments/feed" => "changeset#comments_feed", :as => :changeset_comments_feed, :id => /\d*/, :defaults => { :format => "rss" } + get "/changeset/:id/comments/feed" => "changeset_comments#index", :as => :changeset_comments_feed, :id => /\d*/, :defaults => { :format => "rss" } get "/note/:id" => "browse#note", :id => /\d+/, :as => "browse_note" get "/note/new" => "browse#new_note" get "/user/:display_name/history" => "changeset#index" @@ -152,7 +152,7 @@ OpenStreetMap::Application.routes.draw do get "/about" => "site#about" get "/history" => "changeset#index" get "/history/feed" => "changeset#feed", :defaults => { :format => :atom } - get "/history/comments/feed" => "changeset#comments_feed", :as => :changesets_comments_feed, :defaults => { :format => "rss" } + get "/history/comments/feed" => "changeset_comments#index", :as => :changesets_comments_feed, :defaults => { :format => "rss" } get "/export" => "site#export" match "/login" => "users#login", :via => [:get, :post] match "/logout" => "users#logout", :via => [:get, :post] diff --git a/test/controllers/api_controller_test.rb b/test/controllers/api_controller_test.rb index 11d850ac3..cdc20a1aa 100644 --- a/test/controllers/api_controller_test.rb +++ b/test/controllers/api_controller_test.rb @@ -1,5 +1,4 @@ require "test_helper" -require "api_controller" class ApiControllerTest < ActionController::TestCase def setup diff --git a/test/controllers/browse_controller_test.rb b/test/controllers/browse_controller_test.rb index d6bde97d6..7cb55b0ec 100644 --- a/test/controllers/browse_controller_test.rb +++ b/test/controllers/browse_controller_test.rb @@ -1,5 +1,4 @@ require "test_helper" -require "browse_controller" class BrowseControllerTest < ActionController::TestCase ## diff --git a/test/controllers/changeset_comments_controller_test.rb b/test/controllers/changeset_comments_controller_test.rb new file mode 100644 index 000000000..10dfb1f88 --- /dev/null +++ b/test/controllers/changeset_comments_controller_test.rb @@ -0,0 +1,251 @@ +require "test_helper" + +class ChangesetCommentsControllerTest < ActionController::TestCase + ## + # test all routes which lead to this controller + def test_routes + assert_routing( + { :path => "/api/0.6/changeset/1/comment", :method => :post }, + { :controller => "changeset_comments", :action => "create", :id => "1" } + ) + assert_routing( + { :path => "/api/0.6/changeset/comment/1/hide", :method => :post }, + { :controller => "changeset_comments", :action => "destroy", :id => "1" } + ) + assert_routing( + { :path => "/api/0.6/changeset/comment/1/unhide", :method => :post }, + { :controller => "changeset_comments", :action => "restore", :id => "1" } + ) + assert_routing( + { :path => "/changeset/1/comments/feed", :method => :get }, + { :controller => "changeset_comments", :action => "index", :id => "1", :format => "rss" } + ) + assert_routing( + { :path => "/history/comments/feed", :method => :get }, + { :controller => "changeset_comments", :action => "index", :format => "rss" } + ) + end + + ## + # create comment success + def test_create_comment_success + user = create(:user) + user2 = create(:user) + private_user = create(:user, :data_public => false) + suspended_user = create(:user, :suspended) + deleted_user = create(:user, :deleted) + private_user_closed_changeset = create(:changeset, :closed, :user => private_user) + + basic_authorization user.email, "test" + + assert_difference "ChangesetComment.count", 1 do + assert_no_difference "ActionMailer::Base.deliveries.size" do + perform_enqueued_jobs do + post :create, :params => { :id => private_user_closed_changeset.id, :text => "This is a comment" } + end + end + end + assert_response :success + + changeset = create(:changeset, :closed, :user => private_user) + changeset.subscribers.push(private_user) + changeset.subscribers.push(user) + changeset.subscribers.push(suspended_user) + changeset.subscribers.push(deleted_user) + + assert_difference "ChangesetComment.count", 1 do + assert_difference "ActionMailer::Base.deliveries.size", 1 do + perform_enqueued_jobs do + post :create, :params => { :id => changeset.id, :text => "This is a comment" } + end + end + end + assert_response :success + + email = ActionMailer::Base.deliveries.first + assert_equal 1, email.to.length + assert_equal "[OpenStreetMap] #{user.display_name} has commented on one of your changesets", email.subject + assert_equal private_user.email, email.to.first + + ActionMailer::Base.deliveries.clear + + basic_authorization user2.email, "test" + + assert_difference "ChangesetComment.count", 1 do + assert_difference "ActionMailer::Base.deliveries.size", 2 do + perform_enqueued_jobs do + post :create, :params => { :id => changeset.id, :text => "This is a comment" } + end + end + end + assert_response :success + + email = ActionMailer::Base.deliveries.find { |e| e.to.first == private_user.email } + assert_not_nil email + assert_equal 1, email.to.length + assert_equal "[OpenStreetMap] #{user2.display_name} has commented on one of your changesets", email.subject + + email = ActionMailer::Base.deliveries.find { |e| e.to.first == user.email } + assert_not_nil email + assert_equal 1, email.to.length + assert_equal "[OpenStreetMap] #{user2.display_name} has commented on a changeset you are interested in", email.subject + + ActionMailer::Base.deliveries.clear + end + + ## + # create comment fail + def test_create_comment_fail + # unauthorized + post :create, :params => { :id => create(:changeset, :closed).id, :text => "This is a comment" } + assert_response :unauthorized + + basic_authorization create(:user).email, "test" + + # bad changeset id + assert_no_difference "ChangesetComment.count" do + post :create, :params => { :id => 999111, :text => "This is a comment" } + end + assert_response :not_found + + # not closed changeset + assert_no_difference "ChangesetComment.count" do + post :create, :params => { :id => create(:changeset).id, :text => "This is a comment" } + end + assert_response :conflict + + # no text + assert_no_difference "ChangesetComment.count" do + post :create, :params => { :id => create(:changeset, :closed).id } + end + assert_response :bad_request + + # empty text + assert_no_difference "ChangesetComment.count" do + post :create, :params => { :id => create(:changeset, :closed).id, :text => "" } + end + assert_response :bad_request + end + + ## + # test hide comment fail + def test_destroy_comment_fail + # unauthorized + comment = create(:changeset_comment) + assert_equal true, comment.visible + + post :destroy, :params => { :id => comment.id } + assert_response :unauthorized + assert_equal true, comment.reload.visible + + basic_authorization create(:user).email, "test" + + # not a moderator + post :destroy, :params => { :id => comment.id } + assert_response :forbidden + assert_equal true, comment.reload.visible + + basic_authorization create(:moderator_user).email, "test" + + # bad comment id + post :destroy, :params => { :id => 999111 } + assert_response :not_found + assert_equal true, comment.reload.visible + end + + ## + # test hide comment succes + def test_hide_comment_success + comment = create(:changeset_comment) + assert_equal true, comment.visible + + basic_authorization create(:moderator_user).email, "test" + + post :destroy, :params => { :id => comment.id } + assert_response :success + assert_equal false, comment.reload.visible + end + + ## + # test unhide comment fail + def test_restore_comment_fail + # unauthorized + comment = create(:changeset_comment, :visible => false) + assert_equal false, comment.visible + + post :restore, :params => { :id => comment.id } + assert_response :unauthorized + assert_equal false, comment.reload.visible + + basic_authorization create(:user).email, "test" + + # not a moderator + post :restore, :params => { :id => comment.id } + assert_response :forbidden + assert_equal false, comment.reload.visible + + basic_authorization create(:moderator_user).email, "test" + + # bad comment id + post :restore, :params => { :id => 999111 } + assert_response :not_found + assert_equal false, comment.reload.visible + end + + ## + # test unhide comment succes + def test_unhide_comment_success + comment = create(:changeset_comment, :visible => false) + assert_equal false, comment.visible + + basic_authorization create(:moderator_user).email, "test" + + post :restore, :params => { :id => comment.id } + assert_response :success + assert_equal true, comment.reload.visible + end + + ## + # test comments feed + def test_feed + changeset = create(:changeset, :closed) + create_list(:changeset_comment, 3, :changeset => changeset) + + get :index, :params => { :format => "rss" } + assert_response :success + assert_equal "application/rss+xml", @response.content_type + assert_select "rss", :count => 1 do + assert_select "channel", :count => 1 do + assert_select "item", :count => 3 + end + end + + get :index, :params => { :format => "rss", :limit => 2 } + assert_response :success + assert_equal "application/rss+xml", @response.content_type + assert_select "rss", :count => 1 do + assert_select "channel", :count => 1 do + assert_select "item", :count => 2 + end + end + + get :index, :params => { :id => changeset.id, :format => "rss" } + assert_response :success + assert_equal "application/rss+xml", @response.content_type + assert_select "rss", :count => 1 do + assert_select "channel", :count => 1 do + assert_select "item", :count => 3 + end + end + end + + ## + # test comments feed + def test_feed_bad_limit + get :index, :params => { :format => "rss", :limit => 0 } + assert_response :bad_request + + get :index, :params => { :format => "rss", :limit => 100001 } + assert_response :bad_request + end +end diff --git a/test/controllers/changeset_controller_test.rb b/test/controllers/changeset_controller_test.rb index 472ebb259..7dc479cad 100644 --- a/test/controllers/changeset_controller_test.rb +++ b/test/controllers/changeset_controller_test.rb @@ -41,26 +41,10 @@ class ChangesetControllerTest < ActionController::TestCase { :path => "/api/0.6/changeset/1/close", :method => :put }, { :controller => "changeset", :action => "close", :id => "1" } ) - assert_routing( - { :path => "/api/0.6/changeset/1/comment", :method => :post }, - { :controller => "changeset", :action => "comment", :id => "1" } - ) - assert_routing( - { :path => "/api/0.6/changeset/comment/1/hide", :method => :post }, - { :controller => "changeset", :action => "hide_comment", :id => "1" } - ) - assert_routing( - { :path => "/api/0.6/changeset/comment/1/unhide", :method => :post }, - { :controller => "changeset", :action => "unhide_comment", :id => "1" } - ) assert_routing( { :path => "/api/0.6/changesets", :method => :get }, { :controller => "changeset", :action => "query" } ) - assert_routing( - { :path => "/changeset/1/comments/feed", :method => :get }, - { :controller => "changeset", :action => "comments_feed", :id => "1", :format => "rss" } - ) assert_routing( { :path => "/user/name/history", :method => :get }, { :controller => "changeset", :action => "index", :display_name => "name" } @@ -85,10 +69,6 @@ class ChangesetControllerTest < ActionController::TestCase { :path => "/history/feed", :method => :get }, { :controller => "changeset", :action => "feed", :format => :atom } ) - assert_routing( - { :path => "/history/comments/feed", :method => :get }, - { :controller => "changeset", :action => "comments_feed", :format => "rss" } - ) end # ----------------------- @@ -2139,107 +2119,6 @@ CHANGESET assert_select "osmChange node[id='#{node.id}'][version='1']", 0 end - ## - # create comment success - def test_create_comment_success - user = create(:user) - user2 = create(:user) - private_user = create(:user, :data_public => false) - suspended_user = create(:user, :suspended) - deleted_user = create(:user, :deleted) - private_user_closed_changeset = create(:changeset, :closed, :user => private_user) - - basic_authorization user.email, "test" - - assert_difference "ChangesetComment.count", 1 do - assert_no_difference "ActionMailer::Base.deliveries.size" do - perform_enqueued_jobs do - post :comment, :params => { :id => private_user_closed_changeset.id, :text => "This is a comment" } - end - end - end - assert_response :success - - changeset = create(:changeset, :closed, :user => private_user) - changeset.subscribers.push(private_user) - changeset.subscribers.push(user) - changeset.subscribers.push(suspended_user) - changeset.subscribers.push(deleted_user) - - assert_difference "ChangesetComment.count", 1 do - assert_difference "ActionMailer::Base.deliveries.size", 1 do - perform_enqueued_jobs do - post :comment, :params => { :id => changeset.id, :text => "This is a comment" } - end - end - end - assert_response :success - - email = ActionMailer::Base.deliveries.first - assert_equal 1, email.to.length - assert_equal "[OpenStreetMap] #{user.display_name} has commented on one of your changesets", email.subject - assert_equal private_user.email, email.to.first - - ActionMailer::Base.deliveries.clear - - basic_authorization user2.email, "test" - - assert_difference "ChangesetComment.count", 1 do - assert_difference "ActionMailer::Base.deliveries.size", 2 do - perform_enqueued_jobs do - post :comment, :params => { :id => changeset.id, :text => "This is a comment" } - end - end - end - assert_response :success - - email = ActionMailer::Base.deliveries.find { |e| e.to.first == private_user.email } - assert_not_nil email - assert_equal 1, email.to.length - assert_equal "[OpenStreetMap] #{user2.display_name} has commented on one of your changesets", email.subject - - email = ActionMailer::Base.deliveries.find { |e| e.to.first == user.email } - assert_not_nil email - assert_equal 1, email.to.length - assert_equal "[OpenStreetMap] #{user2.display_name} has commented on a changeset you are interested in", email.subject - - ActionMailer::Base.deliveries.clear - end - - ## - # create comment fail - def test_create_comment_fail - # unauthorized - post :comment, :params => { :id => create(:changeset, :closed).id, :text => "This is a comment" } - assert_response :unauthorized - - basic_authorization create(:user).email, "test" - - # bad changeset id - assert_no_difference "ChangesetComment.count" do - post :comment, :params => { :id => 999111, :text => "This is a comment" } - end - assert_response :not_found - - # not closed changeset - assert_no_difference "ChangesetComment.count" do - post :comment, :params => { :id => create(:changeset).id, :text => "This is a comment" } - end - assert_response :conflict - - # no text - assert_no_difference "ChangesetComment.count" do - post :comment, :params => { :id => create(:changeset, :closed).id } - end - assert_response :bad_request - - # empty text - assert_no_difference "ChangesetComment.count" do - post :comment, :params => { :id => create(:changeset, :closed).id, :text => "" } - end - assert_response :bad_request - end - ## # test subscribe success def test_subscribe_success @@ -2337,128 +2216,6 @@ CHANGESET assert_response :not_found end - ## - # test hide comment fail - def test_hide_comment_fail - # unauthorized - comment = create(:changeset_comment) - assert_equal true, comment.visible - - post :hide_comment, :params => { :id => comment.id } - assert_response :unauthorized - assert_equal true, comment.reload.visible - - basic_authorization create(:user).email, "test" - - # not a moderator - post :hide_comment, :params => { :id => comment.id } - assert_response :forbidden - assert_equal true, comment.reload.visible - - basic_authorization create(:moderator_user).email, "test" - - # bad comment id - post :hide_comment, :params => { :id => 999111 } - assert_response :not_found - assert_equal true, comment.reload.visible - end - - ## - # test hide comment succes - def test_hide_comment_success - comment = create(:changeset_comment) - assert_equal true, comment.visible - - basic_authorization create(:moderator_user).email, "test" - - post :hide_comment, :params => { :id => comment.id } - assert_response :success - assert_equal false, comment.reload.visible - end - - ## - # test unhide comment fail - def test_unhide_comment_fail - # unauthorized - comment = create(:changeset_comment, :visible => false) - assert_equal false, comment.visible - - post :unhide_comment, :params => { :id => comment.id } - assert_response :unauthorized - assert_equal false, comment.reload.visible - - basic_authorization create(:user).email, "test" - - # not a moderator - post :unhide_comment, :params => { :id => comment.id } - assert_response :forbidden - assert_equal false, comment.reload.visible - - basic_authorization create(:moderator_user).email, "test" - - # bad comment id - post :unhide_comment, :params => { :id => 999111 } - assert_response :not_found - assert_equal false, comment.reload.visible - end - - ## - # test unhide comment succes - def test_unhide_comment_success - comment = create(:changeset_comment, :visible => false) - assert_equal false, comment.visible - - basic_authorization create(:moderator_user).email, "test" - - post :unhide_comment, :params => { :id => comment.id } - assert_response :success - assert_equal true, comment.reload.visible - end - - ## - # test comments feed - def test_comments_feed - changeset = create(:changeset, :closed) - create_list(:changeset_comment, 3, :changeset => changeset) - - get :comments_feed, :params => { :format => "rss" } - assert_response :success - assert_equal "application/rss+xml", @response.content_type - assert_select "rss", :count => 1 do - assert_select "channel", :count => 1 do - assert_select "item", :count => 3 - end - end - - get :comments_feed, :params => { :format => "rss", :limit => 2 } - assert_response :success - assert_equal "application/rss+xml", @response.content_type - assert_select "rss", :count => 1 do - assert_select "channel", :count => 1 do - assert_select "item", :count => 2 - end - end - - get :comments_feed, :params => { :id => changeset.id, :format => "rss" } - assert_response :success - assert_equal "application/rss+xml", @response.content_type - assert_select "rss", :count => 1 do - assert_select "channel", :count => 1 do - assert_select "item", :count => 3 - end - end - end - - ## - # test comments feed - def test_comments_feed_bad_limit - get :comments_feed, :params => { :format => "rss", :limit => 0 } - assert_response :bad_request - - get :comments_feed, :params => { :format => "rss", :limit => 100001 } - assert_response :bad_request - end - private ## diff --git a/test/controllers/geocoder_controller_test.rb b/test/controllers/geocoder_controller_test.rb index 3f6e25ea6..1a1435182 100644 --- a/test/controllers/geocoder_controller_test.rb +++ b/test/controllers/geocoder_controller_test.rb @@ -1,5 +1,4 @@ require "test_helper" -require "geocoder_controller" class GeocoderControllerTest < ActionController::TestCase ## diff --git a/test/controllers/redactions_controller_test.rb b/test/controllers/redactions_controller_test.rb index e2123f725..0bf57c310 100644 --- a/test/controllers/redactions_controller_test.rb +++ b/test/controllers/redactions_controller_test.rb @@ -1,5 +1,4 @@ require "test_helper" -require "redactions_controller" class RedactionsControllerTest < ActionController::TestCase ## diff --git a/test/models/redaction_test.rb b/test/models/redaction_test.rb index 4196dea15..fb232b81b 100644 --- a/test/models/redaction_test.rb +++ b/test/models/redaction_test.rb @@ -1,5 +1,4 @@ require "test_helper" -require "osm" class RedactionTest < ActiveSupport::TestCase def test_cannot_redact_current