aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrancis Irving <francis@mysociety.org>2010-10-09 02:01:34 +0100
committerFrancis Irving <francis@mysociety.org>2010-10-09 02:01:34 +0100
commitc8af5673bb9cd45f97ca4b76745fccb2ed1a8d0f (patch)
treec4a5c9103f027a5c9b492c5fd48cb9515eccd775
parent59225c706bfdcdb5a8f9f98d88115c65a72351f1 (diff)
First .json API call
-rw-r--r--app/controllers/request_controller.rb24
-rw-r--r--app/views/help/api.rhtml35
-rw-r--r--app/views/layouts/default.rhtml3
-rw-r--r--config/routes.rb1
-rw-r--r--vendor/plugins/has_tag_string/lib/has_tag_string.rb5
5 files changed, 62 insertions, 6 deletions
diff --git a/app/controllers/request_controller.rb b/app/controllers/request_controller.rb
index 7626e5ad2..6e7df2e17 100644
--- a/app/controllers/request_controller.rb
+++ b/app/controllers/request_controller.rb
@@ -68,6 +68,30 @@ class RequestController < ApplicationController
# For send followup link at bottom
@last_response = @info_request.get_last_response
+
+ respond_to do |format|
+ format.html { @has_json = true }
+ format.json {
+ render :json => {
+ :id => @info_request.id,
+ :url_title => @info_request.url_title,
+ :title => @info_request.title,
+ :user => @info_request.user.url_name,
+ :public_body => @info_request.public_body.url_name,
+ :created_at => @info_request.created_at,
+ :updated_at => @info_request.updated_at,
+ :described_state => @info_request.described_state,
+ :awaiting_description => @info_request.awaiting_description ,
+ :prominence => @info_request.prominence,
+ :law_used => @info_request.law_used,
+ :tags => @info_request.tag_array,
+
+ # not sure we need to make these admin params public
+ # :allow_new_responses_from => @info_request.allow_new_responses_from,
+ # :handle_rejected_responses => @info_request.handle_rejected_responses,
+ }
+ }
+ end
end
# Extra info about a request, such as event history
diff --git a/app/views/help/api.rhtml b/app/views/help/api.rhtml
index f984bed4d..9679f3cc7 100644
--- a/app/views/help/api.rhtml
+++ b/app/views/help/api.rhtml
@@ -14,7 +14,9 @@ interact with WhatDoTheyKnow via an "API".
lots of things that are similar in use to an API as they are requested.
</p>
-<h2> Linking to new requests </h2>
+<hr>
+
+<h2> 1. Linking to new requests </h2>
<p>To encourage your users to make links to a particular public authority, use URLs of the form
<%= link_to new_request_to_body_url(:url_name => "liverpool_city_council") , new_request_to_body_url(:url_name => "liverpool_city_council") %>.
@@ -27,18 +29,39 @@ These are the parameters you can add to those URLs, either in the URL or from a
<li> <strong>tags</strong> - space separated list of tags, so you can find and link up any requests made later, e.g. <em>openlylocal spending_id:12345</em>. The : indicates it is a machine tag. The values of machine tags may also include colons, useful for URIs.
</ul>
-<h2> RSS (actually, Atom) feeds </h2>
+<hr>
+
+<h2> 2. RSS (actually, Atom) feeds </h2>
<p>There are Atom feeds throughout the site, which you can use to get updates
-and links in XML format.
+and links in XML format. Find the URL of the Atom feed in one of these ways:
+<ul>
+ <li>Look for the <img src="/images/feed-16.png" alt=""> RSS feed links.</li>
+ <li>Examine the <tt>&lt;link rel="alternate" type="application/atom+xml"&gt;</tt> tag in the head of the HTML. </li>
+ <li>Add <tt>/feed</tt> to the start of another URL.
+</ul>
-<p>In particular, search queries, however complicated, all have Atom feeds.
+<p>In particular, even complicated search queries have Atom feeds.
You can do all sorts of things with them, such as query by authority, by file
-type, by date range, by status. See the <a href="/search">advanced search
+type, by date range, or by status. See the <a href="/search">advanced search
tips</a> for details.
-<dl>
+<hr>
+
+<h2> 3. JSON structured data </h2>
+
+<p>Some pages have JSON feeds, which let you download information about objects
+in a structured form. Find them by:
+<ul>
+ <li>Adding <tt>.json</tt> to the end of the URL. </li>
+ <li>Look for the <tt>&lt;link rel="alternate" type="application/json"&gt;</tt> tag in the head of the HTML. </li>
+</ul>
+</p>
+
+<hr>
+<p>Please <a href="/help/contact">contact us</a> if you need an API feature that isn't there yet. It's
+very much a work in progress, and we do add things when people ask us to.</p>
<div id="hash_link_padding"></div>
diff --git a/app/views/layouts/default.rhtml b/app/views/layouts/default.rhtml
index c5466964d..ca8904005 100644
--- a/app/views/layouts/default.rhtml
+++ b/app/views/layouts/default.rhtml
@@ -30,6 +30,9 @@
<link rel="alternate" type="application/atom+xml" title="<%=h feed[:title] %>" href="<%=h feed[:url]%>">
<% end %>
<% end %>
+ <% if @has_json %>
+ <link rel="alternate" type="application/json" title="JSON version" href="<%=h main_url(request.request_uri) %>.json">
+ <% end %>
<% if @no_crawl %>
<meta name="robots" content="noindex, nofollow">
diff --git a/config/routes.rb b/config/routes.rb
index e4d6132a9..6205f2446 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -37,6 +37,7 @@ ActionController::Routing::Routes.draw do |map|
request.new_request_to_body '/new/:url_name', :action => 'new'
request.show_request '/request/:url_title', :action => 'show'
+ request.show_request '/request/:url_title.:format', :action => 'show'
request.details_request '/details/request/:url_title', :action => 'details'
request.similar_request '/similar/request/:url_title', :action => 'similar'
diff --git a/vendor/plugins/has_tag_string/lib/has_tag_string.rb b/vendor/plugins/has_tag_string/lib/has_tag_string.rb
index fdcc35a55..5382067fb 100644
--- a/vendor/plugins/has_tag_string/lib/has_tag_string.rb
+++ b/vendor/plugins/has_tag_string/lib/has_tag_string.rb
@@ -80,6 +80,11 @@ module HasTagString
return self.tags.map { |t| t.name_and_value }.join(' ')
end
+ # Returns the tags the model has, as an array of strings
+ def tag_array
+ return self.tags.map { |t| [t.name, t.value] }
+ end
+
# Test to see if class is tagged with the given tag
def has_tag?(tag_as_string)
for tag in self.tags