aboutsummaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/assets/images/widget-base.pngbin0 -> 569 bytes
-rw-r--r--app/assets/javascripts/general.js8
-rw-r--r--app/assets/stylesheets/widget.scss109
-rw-r--r--app/controllers/track_controller.rb2
-rw-r--r--app/controllers/widgets_controller.rb63
-rw-r--r--app/helpers/widget_helper.rb46
-rw-r--r--app/models/info_request.rb1
-rw-r--r--app/models/widget_vote.rb19
-rw-r--r--app/views/request/_act.html.erb5
-rw-r--r--app/views/widgets/new.html.erb15
-rw-r--r--app/views/widgets/show.html.erb48
11 files changed, 314 insertions, 2 deletions
diff --git a/app/assets/images/widget-base.png b/app/assets/images/widget-base.png
new file mode 100644
index 000000000..872244543
--- /dev/null
+++ b/app/assets/images/widget-base.png
Binary files differ
diff --git a/app/assets/javascripts/general.js b/app/assets/javascripts/general.js
index 856f4c6d4..639a6917b 100644
--- a/app/assets/javascripts/general.js
+++ b/app/assets/javascripts/general.js
@@ -57,4 +57,12 @@ $(document).ready(function() {
$('#everypage').hide();
}
+ // "Create widget" page
+ $("#widgetbox").select()
+ // Chrome workaround
+ $("widgetbox").mouseup(function() {
+ // Prevent further mouseup intervention
+ $this.unbind("mouseup");
+ return false;
+ });
})
diff --git a/app/assets/stylesheets/widget.scss b/app/assets/stylesheets/widget.scss
new file mode 100644
index 000000000..a67e1f3f0
--- /dev/null
+++ b/app/assets/stylesheets/widget.scss
@@ -0,0 +1,109 @@
+/* CSS Mini Reset */
+
+html, body, div, form, fieldset, legend, label
+{
+ margin: 0;
+ padding: 0;
+}
+
+table
+{
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+th, td
+{
+ text-align: left;
+ vertical-align: top;
+}
+
+h1, h2, h3, h4, h5, h6, th, td, caption { font-weight:normal; }
+
+img { border: 0; }
+
+body {
+ background-color: #ffffff;
+ color: #333333;
+ padding: 0;
+ margin: 0;
+ font-family: "Helvetica Neue", Arial, Helvetica, Helmet, Freesans, sans-serif;
+ font-weight: normal;
+ font-style: normal;
+ line-height: 1.5em;
+ position: relative;
+ cursor: default;
+ font-size: 1em;
+}
+
+a:hover,
+a:focus,
+a:active {
+ color: #333;
+}
+
+.alaveteli-widget {
+ width: 318px;
+ height: 213px;
+ border: 1px solid #e9e9e9;
+ background: #e9e9e9 url("widget-base.png") top left no-repeat;
+ position: relative;
+ border: 1px solid #eee;
+}
+
+.alaveteli-widget__title {
+ position: absolute;
+ top: 1em;
+ left: 16px;
+ width: 160px;
+ height: 75px;
+ overflow: hidden;
+}
+
+.alaveteli-widget__status {
+ position: absolute;
+ top: 97px;
+ left: 16px;
+ font-weight: bold;
+ text-transform: uppercase;
+}
+
+.alaveteli-widget__status__status-label {
+ margin: 0;
+ font-weight: normal;
+ font-size: 0.875em;
+ line-height: 1.1em;
+ color: #555;
+ text-transform: capitalize;
+}
+
+.alaveteli-widget__left {
+ position: absolute;
+ width: 145px;
+}
+
+.alaveteli-widget__people-count {
+ position: absolute;
+ left: 192px;
+ top: 44px;
+ width: 100px;
+ text-align: center;
+ line-height: 1.3em;
+}
+.alaveteli-widget__count {
+ font-size: 55px;
+ line-height: 55px;
+ text-align: center;
+}
+
+.alaveteli-widget__bottom a {
+ text-decoration: none;
+}
+
+.alaveteli-widget__button {
+ position: absolute;
+ top: 173px;
+ left: 16px;
+ text-align: center;
+}
+
diff --git a/app/controllers/track_controller.rb b/app/controllers/track_controller.rb
index 4b272797f..8b8055b55 100644
--- a/app/controllers/track_controller.rb
+++ b/app/controllers/track_controller.rb
@@ -214,6 +214,4 @@ class TrackController < ApplicationController
redirect_to URI.parse(params[:r]).path
end
-
end
-
diff --git a/app/controllers/widgets_controller.rb b/app/controllers/widgets_controller.rb
new file mode 100644
index 000000000..0cc1008a1
--- /dev/null
+++ b/app/controllers/widgets_controller.rb
@@ -0,0 +1,63 @@
+# app/controllers/widget_controller.rb:
+# Handle widgets, if enabled
+#
+# Copyright (c) 2014 UK Citizens Online Democracy. All rights reserved.
+# Email: hello@mysociety.org; WWW: http://www.mysociety.org/
+
+require 'securerandom'
+
+class WidgetsController < ApplicationController
+
+ before_filter :check_widget_config, :find_info_request, :check_prominence
+ skip_before_filter :set_x_frame_options_header, :only => [:show]
+
+ def show
+ medium_cache
+ @track_thing = TrackThing.create_track_for_request(@info_request)
+ @status = @info_request.calculate_status
+ @count = @info_request.track_things.count + @info_request.widget_votes.count + 1
+
+ if @user
+ @existing_track = TrackThing.find_existing(@user, @track_thing)
+ end
+ unless @user || cookies[:widget_vote]
+ cookies.permanent[:widget_vote] = SecureRandom.hex(10)
+ end
+ render :action => 'show', :layout => false
+ end
+
+ def new
+ long_cache
+ end
+
+ # Track interest in a request from a non-logged in user
+ def update
+ if !@user && cookies[:widget_vote]
+ @info_request.widget_votes.
+ where(:cookie => cookies[:widget_vote]).
+ first_or_create
+ end
+
+ track_thing = TrackThing.create_track_for_request(@info_request)
+ redirect_to do_track_path(track_thing), status => :temporary_redirect
+ end
+
+ private
+
+ def find_info_request
+ @info_request = InfoRequest.find(params[:request_id])
+ end
+
+ def check_widget_config
+ unless AlaveteliConfiguration::enable_widgets
+ raise ActiveRecord::RecordNotFound.new("Page not enabled")
+ end
+ end
+
+ def check_prominence
+ unless @info_request.prominence == 'normal'
+ render :nothing => true, :status => :forbidden
+ end
+ end
+
+end
diff --git a/app/helpers/widget_helper.rb b/app/helpers/widget_helper.rb
new file mode 100644
index 000000000..e604954fe
--- /dev/null
+++ b/app/helpers/widget_helper.rb
@@ -0,0 +1,46 @@
+module WidgetHelper
+ def status_description(info_request, status)
+ case status
+ when 'waiting_classification'
+ _('Awaiting classification')
+ when 'waiting_response'
+ _('Awaiting response')
+ when 'waiting_response_overdue'
+ _('Delayed')
+ when 'waiting_response_very_overdue'
+ _('Long overdue')
+ when 'not_held'
+ _('Not held')
+ when 'rejected'
+ _('Rejected')
+ when 'successful'
+ _('Successful')
+ when 'partially_successful'
+ _('Partial success')
+ when 'waiting_clarification'
+ _('Awaiting clarification')
+ when 'gone_postal'
+ _('Handled by post')
+ when 'internal_review'
+ _('Internal review')
+ when 'error_message'
+ _('Delivery error')
+ when 'requires_admin'
+ _('Unusual response')
+ when 'user_withdrawn'
+ _('Withdrawn')
+ when 'attention_requested'
+ _('Needs admin attention')
+ when 'vexatious'
+ _('Vexatious')
+ when 'not_foi'
+ _('Not an FOI request')
+ else
+ if info_request.respond_to?(:theme_display_status)
+ info_request.theme_display_status(status)
+ else
+ _('Unknown')
+ end
+ end
+ end
+end \ No newline at end of file
diff --git a/app/models/info_request.rb b/app/models/info_request.rb
index 57a8fd7e0..f9f6cffa9 100644
--- a/app/models/info_request.rb
+++ b/app/models/info_request.rb
@@ -50,6 +50,7 @@ class InfoRequest < ActiveRecord::Base
has_many :info_request_events, :order => 'created_at'
has_many :user_info_request_sent_alerts
has_many :track_things, :order => 'created_at desc'
+ has_many :widget_votes
has_many :comments, :order => 'created_at'
has_many :censor_rules, :order => 'created_at desc'
has_many :mail_server_logs, :order => 'mail_server_log_done_id'
diff --git a/app/models/widget_vote.rb b/app/models/widget_vote.rb
new file mode 100644
index 000000000..021c38b30
--- /dev/null
+++ b/app/models/widget_vote.rb
@@ -0,0 +1,19 @@
+# == Schema Information
+#
+# Table name: widget_votes
+#
+# id :integer not null, primary key
+# cookie :string(255)
+# info_request_id :integer not null
+# created_at :datetime not null
+# updated_at :datetime not null
+#
+
+class WidgetVote < ActiveRecord::Base
+ belongs_to :info_request
+ validates :info_request, :presence => true
+
+ attr_accessible :cookie
+ validates :cookie, :length => { :is => 20 }
+ validates_uniqueness_of :cookie, :scope => :info_request_id
+end
diff --git a/app/views/request/_act.html.erb b/app/views/request/_act.html.erb
index 878cdf4ff..c7bbd287f 100644
--- a/app/views/request/_act.html.erb
+++ b/app/views/request/_act.html.erb
@@ -20,3 +20,8 @@
<% end %>
<%= link_to _("Start your own blog"), "http://wordpress.com/"%>
</div>
+<% if AlaveteliConfiguration::enable_widgets %>
+ <div class="act_link">
+ <%= link_to _("Create a widget for this request"), new_request_widget_path(@info_request) %>
+ </div>
+<% end %>
diff --git a/app/views/widgets/new.html.erb b/app/views/widgets/new.html.erb
new file mode 100644
index 000000000..c706155a5
--- /dev/null
+++ b/app/views/widgets/new.html.erb
@@ -0,0 +1,15 @@
+<h1>Add a widget</h1>
+
+<p>
+To add a widget for <b><%= @info_request.title %></b>, copy and paste the
+following code to your web page:
+<textarea autofocus readonly rows='4' cols='60' id='widgetbox'>
+<iframe src='<%= request_widget_url(@info_request) %>' width='320' height='215' frameborder='0' marginwidth='0' marginheight='0'></iframe>
+</textarea>
+</p>
+
+<p>
+The widget will look like this:
+<br>
+<iframe src='<%= request_widget_url(@info_request) %>' width='320' height='215' frameborder='0' marginwidth='0' marginheight='0'></iframe>
+</p>
diff --git a/app/views/widgets/show.html.erb b/app/views/widgets/show.html.erb
new file mode 100644
index 000000000..07c7b1908
--- /dev/null
+++ b/app/views/widgets/show.html.erb
@@ -0,0 +1,48 @@
+<head>
+ <%= stylesheet_link_tag "widget" %>
+</head>
+<body>
+ <div class="alaveteli-widget">
+ <div class="alaveteli-widget__top">
+ <div class="alaveteli-widget__left">
+ <div class="alaveteli-widget__title">
+ <%= link_to @info_request.title, request_path(@info_request), :target => "_top" %>
+ </div>
+ <div class="alaveteli-widget__status <%= @status %>">
+ <p class="alaveteli-widget__status__status-label">Status</p>
+ <%= status_description(@info_request, @status) %>
+ </div>
+ </div>
+ <div class="alaveteli-widget__people-count">
+ <%= n_('<div class="alaveteli-widget__count">{{count}}</div> person wants to know', '<div class="alaveteli-widget__count">{{count}}</div> people want to know', @count, :count => @count) %>
+ </div>
+ </div>
+
+
+ <div class="alaveteli-widget__bottom">
+ <% if @info_request.user && @info_request.user == @user %>
+ <div class="alaveteli-widget__button alaveteli-widget__button--down">
+ <%= _('This is your request') %>
+ </div>
+ <% elsif @existing_track %>
+ <a href="<%= url_for :controller => 'track', :action => 'update', :track_id => @existing_track.id, :track_medium => "delete", :r => request.fullpath %>">
+ <div class="alaveteli-widget__button--down">
+ <%= _('You are tracking this request') %>
+ </div>
+ </a>
+ <% else %>
+ <% if @user %>
+ <a href="<%= url_for do_track_path(@track_thing) %>" target="_blank">
+ <div class="alaveteli-widget__button">
+ <%= _('I also want to know!') %>
+ </div>
+ </a>
+ <% else %>
+ <%= form_tag request_widget_url(@info_request), :method => 'put', :target => '_blank' do %>
+ <%= submit_tag _('I also want to know!'), :class => 'alaveteli-widget__button' %>
+ <% end %>
+ <% end %>
+ <% end %>
+ </div>
+ </div>
+</body>