Added redactions resource
authorMatt Amos <zerebubuth@gmail.com>
Sat, 31 Mar 2012 22:44:18 +0000 (23:44 +0100)
committerTom Hughes <tom@compton.nu>
Thu, 5 Apr 2012 12:50:15 +0000 (13:50 +0100)
14 files changed:
app/controllers/application_controller.rb
app/controllers/redactions_controller.rb [new file with mode: 0644]
app/controllers/user_blocks_controller.rb
app/models/redaction.rb
app/views/redactions/_redaction.html.erb [new file with mode: 0644]
app/views/redactions/_redactions.html.erb [new file with mode: 0644]
app/views/redactions/edit.html.erb [new file with mode: 0644]
app/views/redactions/index.html.erb [new file with mode: 0644]
app/views/redactions/new.html.erb [new file with mode: 0644]
app/views/redactions/show.html.erb [new file with mode: 0644]
config/locales/en.yml
config/routes.rb
db/migrate/20120318201948_create_redactions.rb
db/migrate/20120404205604_add_user_and_description_to_redaction.rb [new file with mode: 0644]

index 7043d8206363d7f4978d3afa4a9d7f571e217ac6..d987472531e5a147a64325f546936e6bc262e517 100644 (file)
@@ -111,6 +111,20 @@ class ApplicationController < ActionController::Base
     require_capability(:allow_write_gpx)
   end
 
+  ##
+  # require that the user is a moderator, or fill out a helpful error message
+  # and return them to the blocks index.
+  def require_moderator
+    unless @user.moderator?
+      if request.get?
+        flash[:error] = t('application.require_moderator.not_a_moderator')
+        redirect_to :action => 'index'
+      else
+        render :nothing => true, :status => :forbidden
+      end
+    end
+  end
+
   ##
   # sets up the @user object for use by other methods. this is mostly called
   # from the authorize method, but can be called elsewhere if authorisation
diff --git a/app/controllers/redactions_controller.rb b/app/controllers/redactions_controller.rb
new file mode 100644 (file)
index 0000000..201f188
--- /dev/null
@@ -0,0 +1,84 @@
+class RedactionsController < ApplicationController
+  layout 'site'
+  
+  before_filter :authorize_web
+  before_filter :set_locale
+  before_filter :require_user, :only => [:new, :create, :edit, :update, :destroy]
+  before_filter :require_moderator, :only => [:new, :create, :edit, :update, :destroy]
+  before_filter :lookup_redaction, :only => [:show, :edit, :update, :destroy]
+  before_filter :check_database_readable
+  before_filter :check_database_writable, :only => [:create, :update, :destroy]
+
+  def index
+    @redactions_pages, @redactions = paginate(:redactions, :order => :id, :per_page => 10)
+  end
+
+  def new
+    @redaction = Redaction.new
+  end
+     
+  def create
+    @redaction = Redaction.new
+    @redaction.user_id = @user.id
+    @redaction.title = params[:redaction][:title]
+    @redaction.description = params[:redaction][:description]
+    # didn't see this come in from the form - maybe i'm doing something
+    # wrong, or markdown is the only thing supported at the moment?
+    @redaction.description_format = 'markdown'
+
+    if @redaction.save
+      flash[:notice] = t('redaction.create.flash')
+      redirect_to @redaction
+    else
+      render :action => 'new'
+    end
+  end
+     
+  def show
+  end
+  
+  def edit
+  end
+     
+  def update
+    # note - don't update the user ID
+    
+    if params[:redaction][:title] and params[:redaction][:title] != @redaction.title
+      @redaction.title = params[:redaction][:title]
+    end
+
+    if params[:redaction][:description] and params[:redaction][:description] != @redaction.description
+      @redaction.description = params[:redaction][:description]
+    end
+
+    if @redaction.save
+      flash[:notice] = t('redaction.update.flash')
+      redirect_to @redaction
+    else
+      render :action => 'edit'
+    end
+  end
+     
+  def destroy
+    unless @redaction.old_nodes.empty? and
+        @redaction.old_ways.empty? and
+        @redaction.old_relations.empty?
+      flash[:error] = t('redaction.destroy.not_empty')
+      redirect_to @redaction
+    else
+      if @redaction.destroy
+        flash[:notice] = t('redaction.destroy.flash')
+        redirect_to :index
+      else
+        flash[:error] = t('redaction.destroy.error')
+        redirect_to @redaction
+      end
+    end
+  end
+
+  private
+
+  def lookup_redaction
+    @redaction = Redaction.find(params[:id])
+  end
+end
index 103909e382e01d39de6221824f6157f26b654af9..455e45c3f23abcf887d25d772ec0153da124a923 100644 (file)
@@ -106,20 +106,6 @@ class UserBlocksController < ApplicationController
   end
 
   private
-  ##
-  # require that the user is a moderator, or fill out a helpful error message
-  # and return them to the blocks index.
-  def require_moderator
-    unless @user.moderator?
-      if request.get?
-        flash[:error] = t('user_block.filter.not_a_moderator')
-        redirect_to :action => 'index'
-      else
-        render :nothing => true, :status => :forbidden
-      end
-    end
-  end
-
   ##
   # ensure that there is a "user_block" instance variable
   def lookup_user_block
index 28a4512425fa8816a225290d1535b4b8e6406239..ca0ea7232f02755a1e7ecee454c4a49c9ed2a683 100644 (file)
@@ -8,7 +8,13 @@
 # displayed linked from the redacted records.
 #
 class Redaction < ActiveRecord::Base
-  has_many :nodes
-  has_many :ways
-  has_many :relations
+  belongs_to :user
+
+  has_many :old_nodes
+  has_many :old_ways
+  has_many :old_relations
+
+  def description
+    RichText.new(read_attribute(:description_format), read_attribute(:description))
+  end
 end
diff --git a/app/views/redactions/_redaction.html.erb b/app/views/redactions/_redaction.html.erb
new file mode 100644 (file)
index 0000000..c246004
--- /dev/null
@@ -0,0 +1 @@
+<li><%= link_to h(redaction.title), :controller => 'redaction', :action => 'show', :id => redaction.id %></li>
diff --git a/app/views/redactions/_redactions.html.erb b/app/views/redactions/_redactions.html.erb
new file mode 100644 (file)
index 0000000..a6b6820
--- /dev/null
@@ -0,0 +1,3 @@
+<ul id="redaction_list">
+  <%= render :partial => 'redaction', :collection => @redactions %>
+</ul>
diff --git a/app/views/redactions/edit.html.erb b/app/views/redactions/edit.html.erb
new file mode 100644 (file)
index 0000000..2a5e69d
--- /dev/null
@@ -0,0 +1,19 @@
+<% @title = t 'redaction.edit.title' %>
+<h1><%= t 'redaction.edit.heading' %></h1>
+
+<%= form_for(@redaction) do |f| %>
+  <%= f.error_messages %>
+
+  <p>
+    <%= f.label :title, t('redaction.edit.title') %><br />
+    <%= f.text_field :title %>
+  </p>
+  <p>
+    <%= f.label :description, t('redaction.edit.description') %><br />
+    <%= richtext_area :redaction, :description, :cols => 80, :rows => 20, :format => @redaction.description_format %>
+  </p>
+  <p>
+    <%= f.submit t('redaction.edit.submit') %>
+  </p>
+<% end %>
+
diff --git a/app/views/redactions/index.html.erb b/app/views/redactions/index.html.erb
new file mode 100644 (file)
index 0000000..1fa683d
--- /dev/null
@@ -0,0 +1,8 @@
+<% @title = t('redaction.index.title') %>
+<h1><%= t('redaction.index.heading') %></h1>
+
+<% unless @redactions.empty? %>
+  <%= render :partial => 'redactions' %>
+<% else %>
+  <p><%= t 'redaction.index.empty' %></p>
+<% end %>
diff --git a/app/views/redactions/new.html.erb b/app/views/redactions/new.html.erb
new file mode 100644 (file)
index 0000000..c714acd
--- /dev/null
@@ -0,0 +1,20 @@
+<% @title = t 'redaction.new.title' %>
+<h1><%= t 'redaction.new.heading' %></h1>
+
+<%= form_for(@redaction) do |f| %>
+  <%= f.error_messages %>
+
+  <p>
+    <%= f.label :title, t('redaction.new.title') %><br />
+    <%= f.text_field :title %>
+  </p>
+  <p>
+    <%= f.label :description, t('redaction.new.description') %><br />
+    <%= richtext_area :redaction, :description, :cols => 80, :rows => 20, :format => @redaction.description_format %>
+  </p>
+  <p>
+    <%= f.submit t('redaction.new.submit') %>
+  </p>
+<% end %>
+
+
diff --git a/app/views/redactions/show.html.erb b/app/views/redactions/show.html.erb
new file mode 100644 (file)
index 0000000..04df9ad
--- /dev/null
@@ -0,0 +1,16 @@
+<% @title = t('redaction.show.title') %>
+<h1><%= t('redaction.show.heading', :title => @redaction.title) %></h1>
+
+<p>
+  <b><%= t 'redaction.show.user' %></b>
+  <%= link_to(h(@redaction.user.display_name), {:controller => 'user', :action => 'view', :display_name => @redaction.user.display_name}) %>
+</p>
+<p>
+  <b><%= t 'redaction.show.description' %></b>
+  <%= @redaction.description.to_html %>
+</p>
+
+<% if @user and @user.moderator? %>
+<%= link_to t('redaction.show.edit'), edit_redaction_path(@redaction) %>
+<%= button_to(t('redaction.show.destroy'), @redaction, :confirm => t('redaction.show.confirm'), :method => "delete", :remote => true) %>
+<% end %>
index 3a9a62978e74768864a4754c5198cb732f4ab615..dce8e3eaddbacdac50e03fd29758421c560c168e 100644 (file)
@@ -1522,6 +1522,8 @@ en:
   application:
     require_cookies:
       cookies_needed: "You appear to have cookies disabled - please enable cookies in your browser before continuing."
+    require_moderator:
+      not_a_moderator: "You need to be a moderator to perform that action."      
     setup_user_auth:
       blocked: "Your access to the API has been blocked. Please log-in to the web interface to find out more."
       need_to_see_terms: "Your access to the API is temporarily suspended. Please log-in to the web interface to view the Contributor Terms. You do not need to agree, but you must view them."
@@ -1921,7 +1923,6 @@ en:
       back: "View all blocks"
       needs_view: "Does the user need to log in before this block will be cleared?"
     filter:
-      not_a_moderator: "You need to be a moderator to perform that action."
       block_expired: "The block has already expired and cannot be edited."
       block_period: "The blocking period must be one of the values selectable in the drop-down list."
     create:
@@ -1999,3 +2000,34 @@ en:
       history_tooltip: View edits for this area
       history_disabled_tooltip: Zoom in to view edits for this area
       history_zoom_alert: You must zoom in to view edits for this area
+  redaction:
+    edit:
+      description: "Description"
+      heading: "Edit redaction"
+      submit: "Save redaction"
+      title: "Edit redaction"
+    index:
+      empty: "No redactions to show."
+      heading: "List of redactions"
+      title: "List of redactions"
+    new:
+      description: "Description"
+      heading: "Enter information for new redaction"
+      submit: "Create redaction"
+      title: "Creating new redaction"
+    show:
+      description: "Description"
+      heading: "Showing redaction \"%{title}\""
+      title: "Showing redaction"
+      user: "Creator:"
+      edit: "Edit this redaction."
+      destroy: "Remove this redaction"
+      confirm: "Are you sure?"
+    create:
+      flash: "Redaction created."
+    update:
+      flash: "Changes saved."
+    destroy:
+      not_empty: "Redaction is not empty. Please un-redact all versions belonging to this redaction before destroying it."
+      flash: "Redaction destroyed."
+      error: "There was an error destroying this redaction."
index 73540ca7f78a3d165ea1a17ee7cd71c36ebfc782..bc4c12c972c44d04545c89954815897069d4da5b 100644 (file)
@@ -229,4 +229,7 @@ OpenStreetMap::Application.routes.draw do
   match '/blocks/new/:display_name' => 'user_blocks#new', :via => :get, :as => "new_user_block"
   resources :user_blocks
   match '/blocks/:id/revoke' => 'user_blocks#revoke', :via => [:get, :post], :as => "revoke_user_block"
+
+  # redactions
+  resources :redactions
 end
index bcb3929cb65590a41345c30bb35091446a523119..b6ee96037948205745635aca949a9e4d73da76db 100644 (file)
@@ -20,7 +20,7 @@ class CreateRedactions < ActiveRecord::Migration
       remove_foreign_key tbl, [:redaction_id], :redactions, [:id]
       remove_column tbl, :redaction_id
     end
-    
+
     drop_table :redactions
   end
 end
diff --git a/db/migrate/20120404205604_add_user_and_description_to_redaction.rb b/db/migrate/20120404205604_add_user_and_description_to_redaction.rb
new file mode 100644 (file)
index 0000000..05c75d3
--- /dev/null
@@ -0,0 +1,17 @@
+require 'migrate'
+
+class AddUserAndDescriptionToRedaction < ActiveRecord::Migration
+  def up
+    add_column :redactions, :user_id, :bigint, :null => false
+    add_column :redactions, :description_format, :format_enum, :null => false, :default => "markdown"
+
+    add_foreign_key :redactions, [:user_id], :users, [:id]
+  end
+
+  def down
+    remove_foreign_key :redactions, [:user_id], :users, [:id]
+
+    remove_column :redactions, :description_format
+    remove_column :redactions, :user_id
+  end
+end