]> git.openstreetmap.org Git - rails.git/commitdiff
Merge branch 'master' into moderation
authorAndy Allan <git@gravitystorm.co.uk>
Wed, 29 Nov 2017 12:18:39 +0000 (12:18 +0000)
committerAndy Allan <git@gravitystorm.co.uk>
Wed, 29 Nov 2017 12:18:39 +0000 (12:18 +0000)
1  2 
Gemfile
Gemfile.lock
app/assets/stylesheets/common.scss
app/controllers/diary_entry_controller.rb
app/models/user.rb
config/locales/en-GB.yml
config/locales/en.yml
config/routes.rb
test/test_helper.rb

diff --combined Gemfile
index 92e0def8fbed9f3cac7c35cfe300e7c0385262d4,79d95f9d5af3e7bc91376002e0e3574997c28aa8..43f39340a812d78ad5ad660ffada06872d2a2fc0
+++ b/Gemfile
@@@ -1,7 -1,7 +1,7 @@@
  source "https://rubygems.org"
  
  # Require rails
- gem "rails", "5.0.5"
+ gem "rails", "5.1.4"
  
  # Require things which have moved to gems in ruby 1.9
  gem "bigdecimal", "~> 1.1.0", :platforms => :ruby_19
@@@ -32,7 -32,7 +32,7 @@@ gem "jquery-rails
  gem "jsonify-rails"
  
  # Use R2 for RTL conversion
- gem "r2"
+ gem "r2", "~> 0.2.7"
  
  # Use autoprefixer to generate CSS prefixes
  gem "autoprefixer-rails"
@@@ -42,12 -42,12 +42,12 @@@ gem "image_optim_rails
  
  # Load rails plugins
  gem "actionpack-page_caching"
- gem "composite_primary_keys", "~> 9.0.7"
- gem "deadlock_retry", ">= 1.2.0"
+ gem "composite_primary_keys", "~> 10.0.0"
  gem "dynamic_form"
  gem "http_accept_language", "~> 2.0.0"
  gem "i18n-js", ">= 3.0.0"
  gem "oauth-plugin", ">= 0.5.1"
+ gem "openstreetmap-deadlock_retry", ">= 1.3.0", :require => "deadlock_retry"
  gem "paperclip", "~> 4.0"
  gem "rack-cors"
  gem "rails-i18n", "~> 4.0.0"
@@@ -70,9 -70,6 +70,9 @@@ gem "omniauth-windowslive
  # Markdown formatting support
  gem "redcarpet"
  
 +# For status transitions of Issues
 +gem "aasm"
 +
  # Load libxml support for XML parsing and generation
  gem "libxml-ruby", ">= 2.0.5", :require => "libxml"
  
@@@ -107,6 -104,7 +107,7 @@@ gem "logstasher
  
  # Gems useful for development
  group :development do
+   gem "annotate"
    gem "listen"
    gem "vendorer"
  end
  # Gems needed for running tests
  group :test do
    gem "minitest", "~> 5.1", :platforms => [:ruby_19, :ruby_20]
 +  gem "minitest-rails-capybara"
    gem "rails-controller-testing"
    gem "rubocop"
    gem "webmock"
@@@ -122,9 -119,10 +123,10 @@@ en
  
  # Needed in development as well so rake can see konacha tasks
  group :development, :test do
+   gem "capybara", "~> 2.13"
    gem "coveralls", :require => false
-   gem "factory_girl_rails"
+   gem "factory_bot_rails"
    gem "jshint"
-   #  gem "konacha"
    gem "poltergeist"
+   gem "puma", "~> 3.7"
  end
diff --combined Gemfile.lock
index ce2b4f11483c631b4c7984fb2a5fdb9f09d18f61,b65ec4ed9706fc79e552a0b9a4aa859931275967..d67d34d4723d4a670c57f156350b966e8e0998af
@@@ -2,59 -2,61 +2,62 @@@ GE
    remote: https://rubygems.org/
    specs:
      SystemTimer (1.2.3)
-     actioncable (5.0.5)
-       actionpack (= 5.0.5)
-       nio4r (>= 1.2, < 3.0)
 +    aasm (4.1.0)
+     actioncable (5.1.4)
+       actionpack (= 5.1.4)
+       nio4r (~> 2.0)
        websocket-driver (~> 0.6.1)
-     actionmailer (5.0.5)
-       actionpack (= 5.0.5)
-       actionview (= 5.0.5)
-       activejob (= 5.0.5)
+     actionmailer (5.1.4)
+       actionpack (= 5.1.4)
+       actionview (= 5.1.4)
+       activejob (= 5.1.4)
        mail (~> 2.5, >= 2.5.4)
        rails-dom-testing (~> 2.0)
-     actionpack (5.0.5)
-       actionview (= 5.0.5)
-       activesupport (= 5.0.5)
+     actionpack (5.1.4)
+       actionview (= 5.1.4)
+       activesupport (= 5.1.4)
        rack (~> 2.0)
-       rack-test (~> 0.6.3)
+       rack-test (>= 0.6.3)
        rails-dom-testing (~> 2.0)
        rails-html-sanitizer (~> 1.0, >= 1.0.2)
      actionpack-page_caching (1.1.0)
        actionpack (>= 4.0.0, < 6)
-     actionview (5.0.5)
-       activesupport (= 5.0.5)
+     actionview (5.1.4)
+       activesupport (= 5.1.4)
        builder (~> 3.1)
-       erubis (~> 2.7.0)
+       erubi (~> 1.4)
        rails-dom-testing (~> 2.0)
        rails-html-sanitizer (~> 1.0, >= 1.0.3)
-     activejob (5.0.5)
-       activesupport (= 5.0.5)
+     activejob (5.1.4)
+       activesupport (= 5.1.4)
        globalid (>= 0.3.6)
-     activemodel (5.0.5)
-       activesupport (= 5.0.5)
-     activerecord (5.0.5)
-       activemodel (= 5.0.5)
-       activesupport (= 5.0.5)
-       arel (~> 7.0)
-     activesupport (5.0.5)
+     activemodel (5.1.4)
+       activesupport (= 5.1.4)
+     activerecord (5.1.4)
+       activemodel (= 5.1.4)
+       activesupport (= 5.1.4)
+       arel (~> 8.0)
+     activesupport (5.1.4)
        concurrent-ruby (~> 1.0, >= 1.0.2)
        i18n (~> 0.7)
        minitest (~> 5.1)
        tzinfo (~> 1.1)
-     addressable (2.5.1)
-       public_suffix (~> 2.0, >= 2.0.2)
-     arel (7.1.4)
+     addressable (2.5.2)
+       public_suffix (>= 2.0.2, < 4.0)
+     annotate (2.7.2)
+       activerecord (>= 3.2, < 6.0)
+       rake (>= 10.4, < 13.0)
+     arel (8.0.0)
      ast (2.3.0)
-     autoprefixer-rails (7.1.2.3)
+     autoprefixer-rails (7.1.6)
        execjs
      bigdecimal (1.1.0)
      builder (3.2.3)
      canonical-rails (0.2.1)
        rails (>= 4.1, < 5.2)
-     capybara (2.14.4)
+     capybara (2.15.4)
        addressable
-       mime-types (>= 1.16)
+       mini_mime (>= 0.1.3)
        nokogiri (>= 1.3.3)
        rack (>= 1.0.0)
        rack-test (>= 0.5.4)
@@@ -70,8 -72,8 +73,8 @@@
        coffee-script-source
        execjs
      coffee-script-source (1.12.2)
-     composite_primary_keys (9.0.7)
-       activerecord (~> 5.0.0)
+     composite_primary_keys (10.0.1)
+       activerecord (~> 5.1.0)
      concurrent-ruby (1.0.5)
      coveralls (0.8.21)
        json (>= 1.8, < 3)
        safe_yaml (~> 1.0.0)
      crass (1.0.2)
      dalli (2.7.6)
-     deadlock_retry (1.2.0)
      docile (1.1.5)
      dynamic_form (1.1.4)
-     erubis (2.7.0)
+     erubi (1.7.0)
      execjs (2.7.0)
-     exifr (1.3.1)
-     factory_girl (4.8.0)
+     exifr (1.3.2)
+     factory_bot (4.8.2)
        activesupport (>= 3.0.0)
-     factory_girl_rails (4.8.0)
-       factory_girl (~> 4.8.0)
+     factory_bot_rails (4.8.2)
+       factory_bot (~> 4.8.2)
        railties (>= 3.0.0)
      faraday (0.12.2)
        multipart-post (>= 1.2, < 3)
      ffi (1.9.18)
      fspath (3.1.0)
      geoip (1.6.3)
-     globalid (0.4.0)
+     globalid (0.4.1)
        activesupport (>= 4.2.0)
-     hashdiff (0.3.4)
+     hashdiff (0.3.7)
      hashie (3.5.6)
      htmlentities (4.3.4)
      http_accept_language (2.0.5)
-     i18n (0.8.6)
-     i18n-js (3.0.0)
+     i18n (0.9.0)
+       concurrent-ruby (~> 1.0)
+     i18n-js (3.0.2)
        i18n (~> 0.6, >= 0.6.6)
      image_optim (0.25.0)
        exifr (~> 1.2, >= 1.2.2)
        rb-inotify (~> 0.9, >= 0.9.7)
        ruby_dep (~> 1.2)
      logstash-event (1.2.02)
-     logstasher (1.2.1)
+     logstasher (1.2.2)
        activesupport (>= 4.0)
        logstash-event (~> 1.2.0)
        request_store
-     loofah (2.0.3)
+     loofah (2.1.1)
+       crass (~> 1.0.2)
        nokogiri (>= 1.5.9)
      mail (2.6.6)
        mime-types (>= 1.16, < 4)
-     method_source (0.8.2)
+     method_source (0.9.0)
      mime-types (3.1)
        mime-types-data (~> 3.2015)
      mime-types-data (3.2016.0521)
      mimemagic (0.3.0)
-     mini_portile2 (2.2.0)
+     mini_mime (0.1.4)
+     mini_portile2 (2.3.0)
      minitest (5.10.3)
-     multi_json (1.12.1)
 +    minitest-capybara (0.8.2)
 +      capybara (~> 2.2)
 +      minitest (~> 5.0)
 +      rake
 +    minitest-metadata (0.6.0)
 +      minitest (>= 4.7, < 6.0)
 +    minitest-rails (3.0.0)
 +      minitest (~> 5.8)
 +      railties (~> 5.0)
 +    minitest-rails-capybara (3.0.1)
 +      capybara (~> 2.7)
 +      minitest-capybara (~> 0.8)
 +      minitest-metadata (~> 0.6)
 +      minitest-rails (~> 3.0)
+     multi_json (1.12.2)
      multi_xml (0.6.0)
      multipart-post (2.0.0)
      nio4r (2.1.0)
-     nokogiri (1.8.0)
-       mini_portile2 (~> 2.2.0)
+     nokogiri (1.8.1)
+       mini_portile2 (~> 2.3.0)
      nokogumbo (1.4.13)
        nokogiri
      oauth (0.4.7)
        multi_json (~> 1.3)
        multi_xml (~> 0.5)
        rack (>= 1.2, < 3)
-     omniauth (1.6.1)
+     omniauth (1.7.1)
        hashie (>= 3.4.6, < 3.6.0)
        rack (>= 1.6.2, < 3)
      omniauth-facebook (4.0.0)
      omniauth-windowslive (0.0.12)
        multi_json (~> 1.12)
        omniauth-oauth2 (~> 1.4)
+     openstreetmap-deadlock_retry (1.3.0)
      paperclip (4.3.7)
        activemodel (>= 3.2.0)
        activesupport (>= 3.2.0)
      parser (2.4.0.0)
        ast (~> 2.2)
      pg (0.21.0)
-     poltergeist (1.15.0)
+     poltergeist (1.16.0)
        capybara (~> 2.1)
        cliver (~> 0.3.1)
        websocket-driver (>= 0.2.0)
      powerpack (0.1.1)
-     progress (3.3.1)
+     progress (3.4.0)
      psych (2.2.4)
-     public_suffix (2.0.5)
+     public_suffix (3.0.0)
+     puma (3.10.0)
      r2 (0.2.7)
      rack (2.0.3)
-     rack-cors (1.0.1)
+     rack-cors (1.0.2)
      rack-openid (1.3.1)
        rack (>= 1.1.0)
        ruby-openid (>= 2.1.8)
-     rack-test (0.6.3)
-       rack (>= 1.0)
+     rack-test (0.7.0)
+       rack (>= 1.0, < 3)
      rack-uri_sanitizer (0.0.2)
-     rails (5.0.5)
-       actioncable (= 5.0.5)
-       actionmailer (= 5.0.5)
-       actionpack (= 5.0.5)
-       actionview (= 5.0.5)
-       activejob (= 5.0.5)
-       activemodel (= 5.0.5)
-       activerecord (= 5.0.5)
-       activesupport (= 5.0.5)
+     rails (5.1.4)
+       actioncable (= 5.1.4)
+       actionmailer (= 5.1.4)
+       actionpack (= 5.1.4)
+       actionview (= 5.1.4)
+       activejob (= 5.1.4)
+       activemodel (= 5.1.4)
+       activerecord (= 5.1.4)
+       activesupport (= 5.1.4)
        bundler (>= 1.3.0)
-       railties (= 5.0.5)
+       railties (= 5.1.4)
        sprockets-rails (>= 2.0.0)
      rails-controller-testing (1.0.2)
        actionpack (~> 5.x, >= 5.0.1)
      rails-i18n (4.0.2)
        i18n (~> 0.6)
        rails (>= 4.0)
-     railties (5.0.5)
-       actionpack (= 5.0.5)
-       activesupport (= 5.0.5)
+     railties (5.1.4)
+       actionpack (= 5.1.4)
+       activesupport (= 5.1.4)
        method_source
        rake (>= 0.8.7)
        thor (>= 0.18.1, < 2.0)
      rainbow (2.2.2)
        rake
-     rake (12.0.0)
+     rake (12.2.1)
      rb-fsevent (0.10.2)
      rb-inotify (0.9.10)
        ffi (>= 0.5.0, < 2)
      redcarpet (3.4.0)
      ref (2.0.0)
      request_store (1.3.2)
-     rinku (2.0.2)
+     rinku (2.0.3)
      rotp (3.3.0)
-     rubocop (0.49.1)
+     rubocop (0.51.0)
        parallel (~> 1.10)
        parser (>= 2.3.3.1, < 3.0)
        powerpack (~> 0.1)
-       rainbow (>= 1.99.1, < 3.0)
+       rainbow (>= 2.2.2, < 3.0)
        ruby-progressbar (~> 1.7)
        unicode-display_width (~> 1.0, >= 1.0.1)
      ruby-openid (2.7.0)
-     ruby-progressbar (1.8.1)
+     ruby-progressbar (1.9.0)
      ruby_dep (1.5.0)
      safe_yaml (1.0.4)
      sanitize (4.5.0)
        crass (~> 1.0.2)
        nokogiri (>= 1.4.4)
        nokogumbo (~> 1.4.1)
-     sass (3.5.1)
+     sass (3.5.3)
        sass-listen (~> 4.0.0)
      sass-listen (4.0.0)
        rb-fsevent (~> 0.9, >= 0.9.4)
        sprockets (>= 2.8, < 4.0)
        sprockets-rails (>= 2.0, < 4.0)
        tilt (>= 1.1, < 3)
-     secure_headers (3.6.7)
-       useragent
+     secure_headers (5.0.1)
+       useragent (>= 0.15.0)
      simplecov (0.14.1)
        docile (~> 1.1.0)
        json (>= 1.8, < 3)
        simplecov-html (~> 0.10.0)
-     simplecov-html (0.10.1)
+     simplecov-html (0.10.2)
      sprockets (3.7.1)
        concurrent-ruby (~> 1.0)
        rack (> 1, < 3)
-     sprockets-rails (3.2.0)
+     sprockets-rails (3.2.1)
        actionpack (>= 4.0)
        activesupport (>= 4.0)
        sprockets (>= 3.0.0)
      thread_safe (0.3.6)
      tilt (2.0.8)
      tins (1.15.0)
-     tzinfo (1.2.3)
+     tzinfo (1.2.4)
        thread_safe (~> 0.1)
      uglifier (3.2.0)
        execjs (>= 0.3.0, < 3)
      validates_email_format_of (1.6.3)
        i18n
      vendorer (0.1.16)
-     webmock (3.0.1)
+     webmock (3.1.0)
        addressable (>= 2.3.6)
        crack (>= 0.3.2)
        hashdiff
@@@ -363,18 -355,18 +370,19 @@@ PLATFORM
  
  DEPENDENCIES
    SystemTimer (>= 1.1.3)
 +  aasm
    actionpack-page_caching
+   annotate
    autoprefixer-rails
    bigdecimal (~> 1.1.0)
    canonical-rails
+   capybara (~> 2.13)
    coffee-rails (~> 4.2)
-   composite_primary_keys (~> 9.0.7)
+   composite_primary_keys (~> 10.0.0)
    coveralls
    dalli
-   deadlock_retry (>= 1.2.0)
    dynamic_form
-   factory_girl_rails
+   factory_bot_rails
    faraday
    geoip
    htmlentities
    listen
    logstasher
    minitest (~> 5.1)
 +  minitest-rails-capybara
    oauth-plugin (>= 0.5.1)
    omniauth
    omniauth-facebook
    omniauth-mediawiki (>= 0.0.3)
    omniauth-openid
    omniauth-windowslive
+   openstreetmap-deadlock_retry (>= 1.3.0)
    paperclip (~> 4.0)
    pg
    poltergeist
    psych
-   r2
+   puma (~> 3.7)
+   r2 (~> 0.2.7)
    rack-cors
    rack-uri_sanitizer
-   rails (= 5.0.5)
+   rails (= 5.1.4)
    rails-controller-testing
    rails-i18n (~> 4.0.0)
    record_tag_helper
    webmock
  
  BUNDLED WITH
-    1.13.7
+    1.15.4
index 6755b7e560f5d4bc0ef0e94b414d630ee17d1822,6b99662a42c9a844c06ad32dc2ca11bd8bade397..4e89c04c9b6d1924b301338f1f253fd4cab0eb2d
@@@ -1664,6 -1664,10 +1664,10 @@@ tr.turn:hover 
    display: inline;
  }
  
+ .pagination {
+   padding-top: $lineheight;
+ }
  /* Rules for the diary entry page */
  
  .diary_entry {
@@@ -2776,12 -2780,30 +2780,30 @@@ input.richtext_title[type="text"] 
      vertical-align: middle;
      background: 40px 40px image-url('about/sprite.png') no-repeat;
  
-     &.local        { background-position: 0px    0px; }
-     &.community    { background-position: 0px  -40px; }
-     &.open         { background-position: 0px  -80px; }
-     &.partners     { background-position: 0px -120px; }
-     &.infringement { background-position: 0px -160px; }
-     &.legal        { background-position: -45px -160px; }
+     &.local {
+       /* no-r2 */
+       background-position: 0px 0px;
+     }
+     &.community {
+       /* no-r2 */
+       background-position: 0px -40px;
+     }
+     &.open {
+       /* no-r2 */
+       background-position: 0px -80px;
+     }
+     &.partners {
+       /* no-r2 */
+       background-position: 0px -120px;
+     }
+     &.infringement {
+       /* no-r2 */
+       background-position: 0px -160px;
+     }
+     &.legal {
+       /* no-r2 */
+       background-position: -45px -160px;
+     }
    }
  }
  
      display: none;
    }
  }
 +
 +.read-reports {
 +  background: #eee;
 +  opacity: 0.7;
 +}
 +
 +.report-related-block {
 +  display:inline-block;
 +}
 +
 +.report-block {
 +  width:475px;
 +  float:left;
 +  margin-right:100px;
 +}
 +
 +.related-block{
 +  width:280px;
 +  float:right;
 +}
 +
 +.issue-comments {
 +  width:475px;
 +}
 +
 +.new-report-checkbox{
 +  float:left;
 +  margin-left:10px;
 +  margin-top:3px;
 +}
 +
 +.new-report-string {
 +  font-size:15px;
 +}
 +
 +.report-button {
 +  float:right;
 +}
 +
 +.disclaimer {
 +  width: 600px;
 +  background: #fff1f0;
 +  color: #d85030;
 +  border-color: rgba(216, 80, 48, 0.3);
 +}
index 1b57fa59b19f4b6948385ff4d06461fa702c94a5,9e0fd4991bd4f62b6ec60e295efc44cf69aa6b49..88febbe2fe96c520a75dcf04696121be5a627fba
@@@ -8,6 -8,7 +8,7 @@@ class DiaryEntryController < Applicatio
    before_action :check_database_readable
    before_action :check_database_writable, :only => [:new, :edit, :comment, :hide, :hidecomment, :subscribe, :unsubscribe]
    before_action :require_administrator, :only => [:hide, :hidecomment]
+   before_action :allow_thirdparty_images, :only => [:new, :edit, :list, :view, :comments]
  
    def new
      @title = t "diary_entry.new.title"
      @entry = @this_user.diary_entries.visible.where(:id => params[:id]).first
      if @entry
        @title = t "diary_entry.view.title", :user => params[:display_name], :title => @entry.title
 +      if params[:comment_id]
 +        @reported_comment = DiaryComment.where(:id => params[:comment_id])
 +      end
      else
        @title = t "diary_entry.no_such_entry.title", :id => params[:id]
        render :action => "no_such_entry", :status => :not_found
diff --combined app/models/user.rb
index 63c9527c7870415bae932bb387bc8a158eb5ff20,7a8414ec073c177940ad9601511467d7d89c96e2..678bbad9de34b0466ec916b34c69af5744af0a36
@@@ -1,3 -1,48 +1,48 @@@
+ # == Schema Information
+ #
+ # Table name: users
+ #
+ #  email               :string           not null
+ #  id                  :integer          not null, primary key
+ #  pass_crypt          :string           not null
+ #  creation_time       :datetime         not null
+ #  display_name        :string           default(""), not null
+ #  data_public         :boolean          default(FALSE), not null
+ #  description         :text             default(""), not null
+ #  home_lat            :float
+ #  home_lon            :float
+ #  home_zoom           :integer          default(3)
+ #  nearby              :integer          default(50)
+ #  pass_salt           :string
+ #  image_file_name     :text
+ #  email_valid         :boolean          default(FALSE), not null
+ #  new_email           :string
+ #  creation_ip         :string
+ #  languages           :string
+ #  status              :enum             default("pending"), not null
+ #  terms_agreed        :datetime
+ #  consider_pd         :boolean          default(FALSE), not null
+ #  auth_uid            :string
+ #  preferred_editor    :string
+ #  terms_seen          :boolean          default(FALSE), not null
+ #  description_format  :enum             default("markdown"), not null
+ #  image_fingerprint   :string
+ #  changesets_count    :integer          default(0), not null
+ #  traces_count        :integer          default(0), not null
+ #  diary_entries_count :integer          default(0), not null
+ #  image_use_gravatar  :boolean          default(FALSE), not null
+ #  image_content_type  :string
+ #  auth_provider       :string
+ #
+ # Indexes
+ #
+ #  users_auth_idx                (auth_provider,auth_uid) UNIQUE
+ #  users_display_name_idx        (display_name) UNIQUE
+ #  users_display_name_lower_idx  (lower((display_name)::text))
+ #  users_email_idx               (email) UNIQUE
+ #  users_email_lower_idx         (lower((email)::text))
+ #
  class User < ActiveRecord::Base
    require "xml/libxml"
  
  
    has_many :roles, :class_name => "UserRole"
  
 +  has_many :issues, :class_name => "Issue", :foreign_key => :reported_user_id
 +  has_one :issue, :class_name => "Issue", :foreign_key => :updated_by
 +  has_many :issue_comments
 +
 +  has_many :reports
 +
    scope :visible, -> { where(:status => %w[pending active confirmed]) }
    scope :active, -> { where(:status => %w[active confirmed]) }
    scope :identifiable, -> { where(:data_public => true) }
diff --combined config/locales/en-GB.yml
index c5b2630cfb9debf5fc0e4f0b8a107f634828323b,07f8eaeec4fe7131d90060989806c14fcd1b1b0d..e6ebbb6a87b4ceef301ca49e869701909ddfb69c
@@@ -150,7 -150,6 +150,7 @@@ en-GB
          title_comment: Changeset %{id} - %{comment}
        join_discussion: Log in to join the discussion
        discussion: Discussion
 +      report: Report this changeset?
      node:
        title: 'Node: %{name}'
        history_title: 'Node History: %{name}'
        reopened_by_anonymous: Reactivated by anonymous <abbr title='%{exact_time}'>%{when}
          ago</abbr>
        hidden_by: Hidden by %{user} <abbr title='%{exact_time}'>%{when} ago</abbr>
 +      report: Report this note?
      query:
        title: Query Features
        introduction: Click on the map to find nearby features.
        edit_link: Edit this entry
        hide_link: Hide this entry
        confirm: Confirm
 +      report: Report this entry?
      diary_comment:
        comment_from: Comment from %{link_user} on %{comment_created_at}
        hide_link: Hide this comment
        confirm: Confirm
 +      report: Report this comment?
      location:
        location: 'Location:'
        view: View
      search:
        title:
          latlon: Results from <a href="http://openstreetmap.org/">Internal</a>
-         us_postcode: Results from <a href="http://geocoder.us/">Geocoder.us</a>
          uk_postcode: Results from <a href="http://www.npemap.org.uk/">NPEMap / FreeThe
            Postcode</a>
          ca_postcode: Results from <a href="http://geocoder.ca/">Geocoder.CA</a>
      results:
        no_results: No results found
        more_results: More results
 +  issues:
 +    report: Report
 +    resolve: Resolve
 +    ignore: Ignore
 +    reopen: Reopen
 +    index:
 +      search:
 +        user_not_found: User does not exist
 +        issues_not_found: No such issues found
 +    create:
 +      successful_report: Your report has been registered sucessfully
 +      provide_details: Please provide the required details
 +    update:
 +      new_report: Your report been registered sucessfully
 +      successful_update: Your report has been updated successfully
 +      provide_details: Please provide the required details
 +    new:
 +      details: Please provide some more details into the problem. (This field cannot be left blank!)
 +      select: Select a reason for your report
 +      disclaimer:
 +        placeholder: Before sending in a report for official action, be sure that
 +        placeholder1: You are sure that the problem is not just a mistake
 +        placeholder2: You are unable to fix the problem yourself
 +        placeholder3: You have tried to resolve the problem with the user
 +    show:
 +      comments:
 +        reassign: The Issue was reassigned
 +        reassign_param: Reassign Issue?
 +    comment:
 +      provide_details: Please provide the required details
 +      comment_created: Your comment was successfully created
 +    resolved: Issue status has been set to 'Resolved'
 +    ignored: Issue status has been set to 'Ignored'
 +    reopened: Issue status has been set to 'Open'
 +    report_strings:
 +      DiaryEntry:
 +        spam:
 +          type: "[SPAM]"
 +          details: This Diary Entry is/contains spam
 +        offensive:
 +          type: "[OFFENSIVE]"
 +          details: This Diary Entry is obscene/offensive
 +        threat:
 +          type: "[THREAT]"
 +          details: This Diary Entry contains a threat
 +        other:
 +          type: "[OTHER]"
 +          details: Other
 +      DiaryComment:
 +        spam:
 +          type: "[SPAM]"
 +          details: This Diary Comment is/contains spam
 +        offensive:
 +          type: "[OFFENSIVE]"
 +          details: This Diary Comment is obscene/offensive
 +        threat:
 +          type: "[THREAT]"
 +          details: This Diary Comment contains a threat
 +        other:
 +          type: "[OTHER]"
 +          details: Other
 +      User:
 +        spam:
 +          type: "[SPAM]"
 +          details: This User profile is/contains spam
 +        offensive:
 +          type: "[OFFENSIVE]"
 +          details: This User profile is obscene/offensive
 +        threat:
 +          type: "[THREAT]"
 +          details: This User profile contains a threat
 +        vandal:
 +          type: "[VANDAL]"
 +          details: This User is a vandal
 +        other:
 +          type: "[OTHER]"
 +          details: Other
 +      Changeset:
 +        undiscussed_import:
 +          type: "[UNDISCUSSED-IMPORT]"
 +          details: This changeset is an undiscussed import
 +        mechanical_edit:
 +          type: "[MECH-EDIT]"
 +          details: This changeset is a mechanical edit
 +        edit_error:
 +          type: "[EDIT-ERROR]"
 +          details: This changeset contains a newbie or an editor error
 +        spam:
 +          type: "[SPAM]"
 +          details: This changeset is/contains spam
 +        vandalism:
 +          type: "[VANDALISM]"
 +          details: This changeset is/contains vandalism
 +        other:
 +          type: "[OTHER]"
 +          details: Other
 +      Note:
 +        spam:
 +          type: "[SPAM]"
 +          details: This note is spam
 +        vandalism:
 +          type: "[VANDALISM]"
 +          details: This note is vandalism
 +        personal:
 +          type: "[PERSONAL]"
 +          details: This note contains personal data
 +        abusive:
 +          type: "[ABUSIVE]"
 +          details: This note is abusive
 +        other:
 +          type: "[OTHER]"
 +          details: Other
    layouts:
      project_name:
        title: OpenStreetMap
      edit: Edit
      history: History
      export: Export
 +    reports: Reports
      data: Data
      export_data: Export Data
      gps_traces: GPS Traces
        details: More details about the changeset can be found at %{url}.
        unsubscribe: To unsubscribe from updates to this changeset, visit %{url} and
          click "Unsubscribe".
 +    new_issue_notification:
 +      subject: "[OpenStreetMap] New Issue"
 +      greeting: "Hi,"
 +      new_issue: "A new issue has been created"
 +      url: You can view the issue here
    message:
      inbox:
        title: Inbox
        date: Date
        reply_button: Reply
        unread_button: Mark as unread
+       delete_button: Delete
        back: Back
        to: To
        wrong_user: You are logged in as `%{user}' but the message you have asked to
      require_cookies:
        cookies_needed: You appear to have cookies disabled - please enable cookies
          in your browser before continuing.
 +    require_admin:
 +      not_an_admin: You need to be an admin to perform that action.
      require_moderator:
        not_a_moderator: You need to be a moderator to perform that action.
      setup_user_auth:
        friends_diaries: friends' diary entries
        nearby_changesets: nearby user changesets
        nearby_diaries: nearby user diary entries
 +      report: Report this user?
      popup:
        your location: Your location
        nearby mapper: Nearby mapper
        ascend: Ascend
        engines:
          graphhopper_bicycle: Bicycle (GraphHopper)
+         graphhopper_car: Car (GraphHopper)
          graphhopper_foot: Foot (GraphHopper)
          mapquest_bicycle: Bicycle (MapQuest)
          mapquest_car: Car (MapQuest)
diff --combined config/locales/en.yml
index ac66ba0f51ba5e3bb8080c24754a441e5af18775,062fd95d48ef75d6b7d86819788e38ede82ca7f4..7393d6efd95cff68efed6ad39d17482aba3d5a0d
@@@ -131,7 -131,6 +131,7 @@@ en
          title_comment: "Changeset %{id} - %{comment}"
        join_discussion: "Log in to join the discussion"
        discussion: Discussion
 +      report: Report this changeset?
      node:
        title: "Node: %{name}"
        history_title: "Node History: %{name}"
        reopened_by: "Reactivated by %{user} <abbr title='%{exact_time}'>%{when} ago</abbr>"
        reopened_by_anonymous: "Reactivated by anonymous <abbr title='%{exact_time}'>%{when} ago</abbr>"
        hidden_by: "Hidden by %{user} <abbr title='%{exact_time}'>%{when} ago</abbr>"
 +      report: Report this note?
      query:
        title: "Query Features"
        introduction: "Click on the map to find nearby features."
        edit_link: Edit this entry
        hide_link: Hide this entry
        confirm: Confirm
 +      report: Report this entry?
      diary_comment:
        comment_from: "Comment from %{link_user} on %{comment_created_at}"
        hide_link: Hide this comment
        confirm: Confirm
 +      report: Report this comment?
      location:
        location: "Location:"
        view: "View"
      search:
        title:
          latlon: 'Results from <a href="http://openstreetmap.org/">Internal</a>'
-         us_postcode: 'Results from <a href="http://geocoder.us/">Geocoder.us</a>'
          uk_postcode: 'Results from <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>'
          ca_postcode: 'Results from <a href="http://geocoder.ca/">Geocoder.CA</a>'
          osm_nominatim: 'Results from <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>'
      results:
        no_results: "No results found"
        more_results: "More results"
 +  issues:
 +    report: Report
 +    resolve: Resolve
 +    ignore: Ignore
 +    reopen: Reopen
 +    index:
 +      search:
 +        user_not_found: User does not exist
 +        issues_not_found: No such issues found
 +    create:
 +      successful_report: Your report has been registered sucessfully
 +      provide_details: Please provide the required details
 +    update:
 +      new_report: Your report been registered sucessfully
 +      successful_update: Your report has been updated successfully
 +      provide_details: Please provide the required details
 +    new:
 +      details: Please provide some more details into the problem. (This field cannot be left blank!)
 +      select: Select a reason for your report
 +      disclaimer:
 +        intro: Before sending in a report for official action, be sure that
 +        not_just_mistake: You are sure that the problem is not just a mistake
 +        unable_to_fix: You are unable to fix the problem yourself
 +        resolve_with_user: You have tried to resolve the problem with the user
 +    show:
 +      comments:
 +        reassign: The Issue was reassigned
 +        reassign_param: Reassign Issue?
 +    comment:
 +      provide_details: Please provide the required details
 +      comment_created: Your comment was successfully created
 +    resolved: Issue status has been set to 'Resolved'
 +    ignored: Issue status has been set to 'Ignored'
 +    reopened: Issue status has been set to 'Open'
 +    report_strings:
 +      DiaryEntry:
 +        spam:
 +          type: "[SPAM]"
 +          details: This Diary Entry is/contains spam
 +        offensive:
 +          type: "[OFFENSIVE]"
 +          details: This Diary Entry is obscene/offensive
 +        threat:
 +          type: "[THREAT]"
 +          details: This Diary Entry contains a threat
 +        other:
 +          type: "[OTHER]"
 +          details: Other
 +      DiaryComment:
 +        spam:
 +          type: "[SPAM]"
 +          details: This Diary Comment is/contains spam
 +        offensive:
 +          type: "[OFFENSIVE]"
 +          details: This Diary Comment is obscene/offensive
 +        threat:
 +          type: "[THREAT]"
 +          details: This Diary Comment contains a threat
 +        other:
 +          type: "[OTHER]"
 +          details: Other
 +      User:
 +        spam:
 +          type: "[SPAM]"
 +          details: This User profile is/contains spam
 +        offensive:
 +          type: "[OFFENSIVE]"
 +          details: This User profile is obscene/offensive
 +        threat:
 +          type: "[THREAT]"
 +          details: This User profile contains a threat
 +        vandal:
 +          type: "[VANDAL]"
 +          details: This User is a vandal
 +        other:
 +          type: "[OTHER]"
 +          details: Other
 +      Changeset:
 +        undiscussed_import:
 +          type: "[UNDISCUSSED-IMPORT]"
 +          details: This changeset is an undiscussed import
 +        mechanical_edit:
 +          type: "[MECH-EDIT]"
 +          details: This changeset is a mechanical edit
 +        edit_error:
 +          type: "[EDIT-ERROR]"
 +          details: This changeset contains a newbie or an editor error
 +        spam:
 +          type: "[SPAM]"
 +          details: This changeset is/contains spam
 +        vandalism:
 +          type: "[VANDALISM]"
 +          details: This changeset is/contains vandalism
 +        other:
 +          type: "[OTHER]"
 +          details: Other
 +      Note:
 +        spam:
 +          type: "[SPAM]"
 +          details: This note is spam
 +        vandalism:
 +          type: "[VANDALISM]"
 +          details: This note is vandalism
 +        personal:
 +          type: "[PERSONAL]"
 +          details: This note contains personal data
 +        abusive:
 +          type: "[ABUSIVE]"
 +          details: This note is abusive
 +        other:
 +          type: "[OTHER]"
 +          details: Other
    layouts:
      project_name:
        # in <title>
      edit: Edit
      history: History
      export: Export
 +    issues: Issues
      data: Data
      export_data: Export Data
      gps_traces: GPS Traces
      intro_header: Welcome to OpenStreetMap!
      intro_text: OpenStreetMap is a map of the world, created by people like you and free to use under an open license.
      intro_2_create_account: "Create a user account"
-     partners_html: "Hosting is supported by %{ucl}, %{bytemark} and %{ic}, and other %{partners}."
+     partners_html: "Hosting is supported by %{ucl}, %{bytemark}, %{ic}, and other %{partners}."
      partners_ucl: "UCL"
      partners_ic: "Imperial College London"
      partners_bytemark: "Bytemark Hosting"
        more_title_html: Finding out more
        more_1_html: |
          Read more about using our data, and how to credit us, at the <a
-         href="http://osmfoundation.org/Licence">OSMF Licence page</a> and the community <a
-         href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Legal
-         FAQ</a>.
+         href="http://osmfoundation.org/Licence">OSMF Licence page</a>.
        more_2_html: |
          Although OpenStreetMap is open data, we cannot provide a
          free-of-charge map API for third-parties.
        paragraph_1_html: |
          OpenStreetMap has few formal rules but we expect all participants to collaborate
          with, and communicate with, the community. If you are considering
 -        any activities other than editing by hand, please read and follow the guidelines on 
 -        <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Imports</a> and 
 +        any activities other than editing by hand, please read and follow the guidelines on
 +        <a href='http://wiki.openstreetmap.org/wiki/Import/Guidelines'>Imports</a> and
          <a href='http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Automated Edits</a>.
      questions:
        title: Any questions?
          title: Join the community
          explanation_html: |
            If you have noticed a problem with our map data, for example a road is missing or your address, the best way to
 -          proceed is to join the OpenStreetMap community and add or repair the data yourself. 
 +          proceed is to join the OpenStreetMap community and add or repair the data yourself.
        add_a_note:
          instructions_html: |
            Just click <a class='icon note'></a> or the same icon on the map display.
        title: Other concerns
        explanation_html: |
          If you have concerns about how our data is being used or about the contents please consult our
 -        <a href='/copyright'>copyright page</a> for more legal information, or contact the appropriate 
 -        <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF working group</a>.  
 +        <a href='/copyright'>copyright page</a> for more legal information, or contact the appropriate
 +        <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF working group</a>.
    help_page:
      title: Getting Help
      introduction: |
        Our contributors include enthusiast mappers, GIS professionals, engineers
        running the OSM servers, humanitarians mapping disaster-affected areas,
        and many more.
-       To learn more about the community, see the <a href='%{diary_path}'>user diaries</a>,
+       To learn more about the community, see the
+       <a href='https://blog.openstreetmap.org'>OpenStreetMap Blog</a>,
+       <a href='%{diary_path}'>user diaries</a>,
        <a href='http://blogs.openstreetmap.org/'>community blogs</a>, and
        the <a href='http://www.osmfoundation.org/'>OSM Foundation</a> website.
      open_data_title: Open Data
        License page</a> for details.
      legal_title: Legal
      legal_html: |
 -      This site and many other related services are formally operated by the  
 -      <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF) 
 -      on behalf of the community. Use of all OSMF operated services is subject 
 +      This site and many other related services are formally operated by the
 +      <a href='http://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF)
 +      on behalf of the community. Use of all OSMF operated services is subject
        to our <a href="http://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">
        Acceptable Use Policies</a> and our <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Privacy Policy</a>
 -      <br> 
 -      Please <a href='http://osmfoundation.org/Contact'>contact the OSMF</a> 
 +      <br>
 +      Please <a href='http://osmfoundation.org/Contact'>contact the OSMF</a>
        if you have licensing, copyright or other legal questions and issues.
      partners_title: Partners
    notifier:
          partial_changeset_without_comment: "without comment"
        details: "More details about the changeset can be found at %{url}."
        unsubscribe: 'To unsubscribe from updates to this changeset, visit %{url} and click "Unsubscribe".'
 +    new_issue_notification:
 +      subject: "[OpenStreetMap] New Issue"
 +      greeting: "Hi,"
 +      new_issue: "A new issue has been created"
 +      url: You can view the issue here
    message:
      inbox:
        title: "Inbox"
        get_directions_title: "Find directions between two points"
        from: "From"
        to: "To"
-       where_am_i: "Where am I?"
+       where_am_i: "Where is this?"
        where_am_i_title: Describe the current location using the search engine
        submit_text: "Go"
      key:
    application:
      require_cookies:
        cookies_needed: "You appear to have cookies disabled - please enable cookies in your browser before continuing."
 +    require_admin:
 +      not_an_admin: You need to be an admin to perform that action.
      require_moderator:
        not_a_moderator: "You need to be a moderator to perform that action."
      setup_user_auth:
        friends_diaries: "friends' diary entries"
        nearby_changesets: "nearby user changesets"
        nearby_diaries: "nearby user diary entries"
 +      report: "Report this user?"
      popup:
        your location: "Your location"
        nearby mapper: "Nearby mapper"
diff --combined config/routes.rb
index 277bd34ea3916826098c07ddd7e0b895a001aec1,98bb332f23cb01bba04f2a149695b16e82bbeb67..8a5dca166756ef71663af5fc5a84a5687720a8f5
@@@ -223,7 -223,7 +223,7 @@@ OpenStreetMap::Application.routes.draw 
    match "/user/:display_name/diary" => "diary_entry#list", :via => :get
    match "/diary/:language" => "diary_entry#list", :via => :get
    match "/diary" => "diary_entry#list", :via => :get
 -  match "/user/:display_name/diary/:id" => "diary_entry#view", :via => :get, :id => /\d+/
 +  match "/user/:display_name/diary/:id" => "diary_entry#view", :via => :get, :id => /\d+/, :as => :diary_entry
    match "/user/:display_name/diary/:id/newcomment" => "diary_entry#comment", :via => :post, :id => /\d+/
    match "/user/:display_name/diary/:id/edit" => "diary_entry#edit", :via => [:get, :post], :id => /\d+/
    match "/user/:display_name/diary/:id/hide" => "diary_entry#hide", :via => :post, :id => /\d+/, :as => :hide_diary_entry
    # geocoder
    match "/search" => "geocoder#search", :via => :get, :as => :search
    match "/geocoder/search_latlon" => "geocoder#search_latlon", :via => :get
-   match "/geocoder/search_us_postcode" => "geocoder#search_us_postcode", :via => :get
    match "/geocoder/search_uk_postcode" => "geocoder#search_uk_postcode", :via => :get
    match "/geocoder/search_ca_postcode" => "geocoder#search_ca_postcode", :via => :get
    match "/geocoder/search_osm_nominatim" => "geocoder#search_osm_nominatim", :via => :get
    resources :user_blocks
    match "/blocks/:id/revoke" => "user_blocks#revoke", :via => [:get, :post], :as => "revoke_user_block"
  
 +  # issues and reports
 +  resources :issues do
 +    resources :comments, :controller => :issue_comments
 +    member do
 +      post "resolve"
 +      post "assign"
 +      post "ignore"
 +      post "reopen"
 +    end
 +  end
 +
 +  resources :reports
 +
    # redactions
    resources :redactions
  end
diff --combined test/test_helper.rb
index 0e06c3c9ef8bb8c1246051745656c0528aa81edf,70f69a3ae94a590140eebd1a97fa15f46437775c..552bda7d538c02af9e24509f138cd4152d87c0da
@@@ -5,11 -5,10 +5,11 @@@ ENV["RAILS_ENV"] = "test
  require File.expand_path("../../config/environment", __FILE__)
  require "rails/test_help"
  require "webmock/minitest"
 +require "minitest/rails/capybara"
  
  module ActiveSupport
    class TestCase
-     include FactoryGirl::Syntax::Methods
+     include FactoryBot::Syntax::Methods
  
      ##
      # takes a block which is executed in the context of a different
          end
        end
      end
 +
 +    def sign_in_as(user)
 +      stub_hostip_requests
 +      visit login_path
 +      fill_in "username", :with => user.email
 +      fill_in "password", :with => "test"
 +      click_on "Login", :match => :first
 +    end
    end
  end