]> git.openstreetmap.org Git - rails.git/commitdiff
Merge branch 'master' into feature/add-communities-page
authorAdam Hoyle <atomoil@gmail.com>
Sun, 17 Oct 2021 21:33:02 +0000 (22:33 +0100)
committerAdam Hoyle <atomoil@gmail.com>
Sun, 17 Oct 2021 21:33:02 +0000 (22:33 +0100)
app/abilities/ability.rb
app/controllers/site_controller.rb
app/views/layouts/_header.html.erb
app/views/site/communities.html.erb [new file with mode: 0644]
config/locales/en.yml
config/routes.rb
lib/osm_community_index/local_chapter.rb [new file with mode: 0644]
lib/osm_community_index/osm_community_index.rb [new file with mode: 0644]
package.json
yarn.lock

index 769fbca475e401ba9538ae6164cd60f84e6bf6fe..f33ce182dd6a7c7d5f9075c61d85524ee3c9fbdb 100644 (file)
@@ -7,7 +7,7 @@ class Ability
     can [:relation, :relation_history, :way, :way_history, :node, :node_history,
          :changeset, :note, :new_note, :query], :browse
     can :search, :direction
-    can [:index, :permalink, :edit, :help, :fixthemap, :offline, :export, :about, :preview, :copyright, :key, :id], :site
+    can [:index, :permalink, :edit, :help, :fixthemap, :offline, :export, :about, :communities, :preview, :copyright, :key, :id], :site
     can [:finish, :embed], :export
     can [:search, :search_latlon, :search_ca_postcode, :search_osm_nominatim,
          :search_geonames, :search_osm_nominatim_reverse, :search_geonames_reverse], :geocoder
index 00b3e78da4c858b7c36e0211106ba1190e69436c..17353fe96ddc398bc6c42730bd4f0882e3e47772 100644 (file)
@@ -106,6 +106,11 @@ class SiteController < ApplicationController
     @locale = params[:about_locale] || I18n.locale
   end
 
+  def communities
+    @locale = I18n.locale
+    @local_chapters = OsmCommunityIndex::LocalChapter.local_chapters_with_locale(@locale)
+  end
+
   def export; end
 
   def offline; end
index 192b0761431faf62a8f25a002f6e293c8f72a806..e9e88c1e0391a512637f2cd592c5bad4958f5405 100644 (file)
@@ -50,6 +50,9 @@
       <li class="compact-hide nav-item <%= current_page_class(diary_entries_path) %>">
         <%= link_to t("layouts.user_diaries"), diary_entries_path, :class => "nav-link" %>
       </li>
+      <li class="compact-hide nav-item <%= current_page_class(communities_path) %>">
+        <%= link_to t("layouts.communities"), communities_path, :class => "nav-link" %>
+      </li>
       <li class="compact-hide nav-item <%= current_page_class(copyright_path) %>">
         <%= link_to t("layouts.copyright"), copyright_path, :class => "nav-link" %>
       </li>
@@ -72,6 +75,7 @@
           <% end %>
           <li class="<%= current_page_class(traces_path) %>"><%= link_to t("layouts.gps_traces"), traces_path, :class => "dropdown-item" %></li>
           <li class="<%= current_page_class(diary_entries_path) %>"><%= link_to t("layouts.user_diaries"), diary_entries_path, :class => "dropdown-item" %></li>
+          <li class="<%= current_page_class(communities_path) %>"><%= link_to t("layouts.communities"), communities_path, :class => "dropdown-item" %></li>
           <li class="<%= current_page_class(copyright_path) %>"><%= link_to t("layouts.copyright"), copyright_path, :class => "dropdown-item" %></li>
           <li class="<%= current_page_class(help_path) %>"><%= link_to t("layouts.help"), help_path, :class => "dropdown-item" %></li>
           <li class="<%= current_page_class(about_path) %>"><%= link_to t("layouts.about"), about_path, :class => "dropdown-item" %></li>
diff --git a/app/views/site/communities.html.erb b/app/views/site/communities.html.erb
new file mode 100644 (file)
index 0000000..265b26e
--- /dev/null
@@ -0,0 +1,19 @@
+<% content_for :heading do %>
+  <%= tag.h1 :lang => @locale, :dir => t("html.dir", :locale => @locale) do %>
+    <%= t ".title", :locale => @locale %>
+  <% end %>
+<% end %>
+
+<%= tag.div :lang => @locale, :dir => t("html.dir", :locale => @locale) do %>
+  <p><%= t ".lede_text", :locale => @locale %></p>
+  <h2><%= t ".local_chapters.title", :locale => @locale %></h2>
+  <p><%= t ".local_chapters.about_text", :locale => @locale %></p>
+  <p><%= t ".local_chapters.list_text", :locale => @locale %></p>
+  <ul>
+    <% @local_chapters.each do |chapter| %>
+      <li><a href="<%= chapter.url %>"><%= chapter.name %></a></li>
+    <% end %>
+  </ul>
+  <h2><%= t ".other_groups.title", :locale => @locale %></h2>
+  <p><%= t ".other_groups.about_html", :locale => @locale %></p>
+<% end %>
index 7a2aba1aa055e0da4352a3e6c2145ac56969eb67..183e68a90c0ff3c5b3e40e005441e92474c8b7eb 100644 (file)
@@ -1457,6 +1457,7 @@ en:
     help: Help
     about: About
     copyright: Copyright
+    communities: Communities
     community: Community
     community_blogs: "Community Blogs"
     community_blogs_title: "Blogs from members of the OpenStreetMap community"
@@ -2222,6 +2223,30 @@ en:
           Just go to <a href='%{map_url}'>the map</a> and click the note icon:
           <span class='icon note'></span>. This will add a marker to the map, which you can move
           by dragging. Add your message, then click save, and other mappers will investigate.
+    communities:
+      title: Communities
+      lede_text: |
+        People from all over the world contribute to or use OpenStreetMap.
+        Whilst some are content to participate as individuals, others have formed communities.
+        These groups come in a range of sizes and represent geographies from small towns to large multi-country regions.
+        They can also be formal or informal.
+      local_chapters:
+        title: Local Chapters
+        about_text: |
+          Local Chapters are country-level or region-level groups that have taken the formal step of
+          establishing not-for-profit legal entities. They represent the area's map and mappers when
+          dealing with local government, business, and media. They have also formed an affiliation
+          with the OpenStreetMap Foundation (OSMF), giving them a link to the legal and copyright
+          governing body.
+        list_text: |
+          So far we have the following formally established foundation Local Chapters:
+      other_groups:
+        title: Other Groups
+        about_html: |
+          There is no need to formally establish a group to the same extent as the Local Chapters.
+          Indeed many groups exist very sucessfully as an informal gathering of people or as a
+          community group. Anyone can set up or join these. Read more on the
+          <a href="https://wiki.openstreetmap.org/wiki/User_group">Communities wiki page</a>.
   traces:
     visibility:
       private: "Private (only shared as anonymous, unordered points)"
index f4c19f88cb9278ad050e9c972ad0a2939efefc8f..68ab163a933b8e8a1730f6e6df455206fd1fb77e 100644 (file)
@@ -147,6 +147,8 @@ OpenStreetMap::Application.routes.draw do
   get "/help" => "site#help"
   get "/about/:about_locale" => "site#about"
   get "/about" => "site#about"
+  get "/communities" => "site#communities"
+  get "/communities/:communities_locale" => "site#communities"
   get "/history" => "changesets#index"
   get "/history/feed" => "changesets#feed", :defaults => { :format => :atom }
   get "/history/comments/feed" => "changeset_comments#index", :as => :changesets_comments_feed, :defaults => { :format => "rss" }
diff --git a/lib/osm_community_index/local_chapter.rb b/lib/osm_community_index/local_chapter.rb
new file mode 100644 (file)
index 0000000..6b203af
--- /dev/null
@@ -0,0 +1,39 @@
+module OsmCommunityIndex
+  class LocalChapter
+
+    attr_reader :id, :name, :url
+
+    @localised_chapters = {}
+
+    def initialize(id, name, url)
+      @id = id
+      @name = name
+      @url = url
+    end
+
+    def self.local_chapters_with_locale(locale)
+      @localised_chapters[locale] ||= load_local_chapters(locale)
+    end
+
+    protected
+
+    def self.load_local_chapters(locale)
+      community_index = OsmCommunityIndex.community_index
+      localised_strings = OsmCommunityIndex.localised_strings(locale)
+      local_chapters = []
+      community_index["resources"].each do |id, resource|
+        resource.each do |key, value|
+          next unless key == "type" && value == "osm-lc" && id != "OSMF"
+
+          strings = resource["strings"]
+          name = localised_strings.dig(id, "name") || strings["name"] || strings["community"]
+          url = strings["url"]
+          local_chapters.push(LocalChapter.new(id, name, url))
+        end
+      end
+      local_chapters
+    end
+
+  end
+
+end
\ No newline at end of file
diff --git a/lib/osm_community_index/osm_community_index.rb b/lib/osm_community_index/osm_community_index.rb
new file mode 100644 (file)
index 0000000..987f946
--- /dev/null
@@ -0,0 +1,52 @@
+module OsmCommunityIndex
+  class OsmCommunityIndex
+    require "yaml"
+
+    @localised_strings = {}
+
+    def self.community_index
+      @community_index ||= community_index_from_json
+    end
+
+    def self.localised_strings(locale)
+      @localised_strings[locale] ||= locale_hash_from_json(locale)
+    end
+
+    protected
+
+    def self.community_index_from_json
+      json_file = Rails.root.join("node_modules/osm-community-index/dist/resources.json")
+      JSON.parse(File.read(json_file))
+    end
+
+    def self.locale_hash_from_json(locale_in)
+      locale = locale_in.to_s.tr("-", "_")
+      # try the passed in locale
+      json = load_locale_json(locale)
+      unless json.nil?
+        return json
+      end
+
+      # now try it without it's country part (eg 'en' instead of 'en_GB')
+      shortened_locale = locale.split("_").first
+      unless shortened_locale === locale
+        json = load_locale_json(shortened_locale)
+        unless json.nil?
+          return json
+        end
+      end
+
+      # if nothing else works, then return "en"
+      load_locale_json("en")
+    end
+
+    def self.load_locale_json(locale)
+      json_path = Rails.root.join("node_modules/osm-community-index/i18n/#{locale}.yaml")
+      if File.exist?(json_path)
+        return YAML.safe_load(File.read(json_path))[locale]
+      end
+      nil
+    end
+
+  end
+end
\ No newline at end of file
index c663c6f12e7757d8ddba2c14ab9d83941ce8ea28..bf8881668482a79c684374f006282cb915f528bf 100644 (file)
@@ -8,6 +8,7 @@
     "js-cookie": "^3.0.0",
     "leaflet": "^1.6.0",
     "leaflet.locatecontrol": "^0.74.0",
+    "osm-community-index": "^5.1.3",
     "qs": "^6.9.4"
   },
   "devDependencies": {
index e41ecf2ddc9fef835b1d85efdb9aa1919a56fd24..e876bffd45f32d504314e3b88be06562098cead3 100644 (file)
--- a/yarn.lock
+++ b/yarn.lock
@@ -163,6 +163,11 @@ deep-is@^0.1.3:
   resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
   integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
 
+diacritics@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/diacritics/-/diacritics-1.3.0.tgz#3efa87323ebb863e6696cebb0082d48ff3d6f7a1"
+  integrity sha1-PvqHMj67hj5mls67AILUj/PW96E=
+
 doctrine@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
@@ -548,6 +553,13 @@ optionator@^0.9.1:
     type-check "^0.4.0"
     word-wrap "^1.2.3"
 
+osm-community-index@^5.1.3:
+  version "5.1.3"
+  resolved "https://registry.yarnpkg.com/osm-community-index/-/osm-community-index-5.1.3.tgz#df2bd0db2b3e43b95fa026138905dc2f3f473062"
+  integrity sha512-kERHt/O+QFp7DB5jH/Pkh3P1GwT3vH+lYskN7EVEBcnnsW8AIcdGpmQDlLO9IZNCbzmP7YY81wlUv8AuWKUTIg==
+  dependencies:
+    diacritics "^1.3.0"
+
 parent-module@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"