Add support for logical deletion of diary entries and comments.

This commit is contained in:
Tom Hughes 2009-11-14 15:57:08 +00:00
parent 6bfa897cfc
commit 634565c5d3
7 changed files with 92 additions and 14 deletions

View file

@ -3,9 +3,10 @@ class DiaryEntryController < ApplicationController
before_filter :authorize_web
before_filter :set_locale
before_filter :require_user, :only => [:new, :edit]
before_filter :require_user, :only => [:new, :edit, :comment, :hide, :hidecomment]
before_filter :check_database_readable
before_filter :check_database_writable, :only => [:new, :edit]
before_filter :require_administrator, :only => [:hide, :hidecomment]
def new
@title = t 'diary_entry.new.title'
@ -66,12 +67,15 @@ class DiaryEntryController < ApplicationController
def list
if params[:display_name]
@this_user = User.find_by_display_name(params[:display_name], :conditions => {:visible => true})
@this_user = User.find_by_display_name(params[:display_name], :conditions => { :visible => true })
if @this_user
@title = t 'diary_entry.list.user_title', :user => @this_user.display_name
@entry_pages, @entries = paginate(:diary_entries,
:conditions => ['user_id = ?', @this_user.id],
:conditions => {
:user_id => @this_user.id,
:visible => true
},
:order => 'created_at DESC',
:per_page => 20)
else
@ -83,13 +87,20 @@ class DiaryEntryController < ApplicationController
elsif params[:language]
@title = t 'diary_entry.list.in_language_title', :language => Language.find(params[:language]).english_name
@entry_pages, @entries = paginate(:diary_entries, :include => :user,
:conditions => ["users.visible = ? AND diary_entries.language_code = ?", true, params[:language]],
:conditions => {
:users => { :visible => true },
:visible => true,
:language_code => params[:language]
},
:order => 'created_at DESC',
:per_page => 20)
else
@title = t 'diary_entry.list.title'
@entry_pages, @entries = paginate(:diary_entries, :include => :user,
:conditions => ["users.visible = ?", true],
:conditions => {
:users => { :visible => true },
:visible => true
},
:order => 'created_at DESC',
:per_page => 20)
end
@ -99,10 +110,16 @@ class DiaryEntryController < ApplicationController
request.format = :rss
if params[:display_name]
user = User.find_by_display_name(params[:display_name], :conditions => {:visible => true})
user = User.find_by_display_name(params[:display_name], :conditions => { :visible => true })
if user
@entries = DiaryEntry.find(:all, :conditions => ['user_id = ?', user.id], :order => 'created_at DESC', :limit => 20)
@entries = DiaryEntry.find(:all,
:conditions => {
:user_id => user.id,
:visible => true
},
:order => 'created_at DESC',
:limit => 20)
@title = I18n.t('diary_entry.feed.user.title', :user => user.display_name)
@description = I18n.t('diary_entry.feed.user.description', :user => user.display_name)
@link = "http://#{SERVER_URL}/user/#{user.display_name}/diary"
@ -111,15 +128,24 @@ class DiaryEntryController < ApplicationController
end
elsif params[:language]
@entries = DiaryEntry.find(:all, :include => :user,
:conditions => ["users.visible = ? AND diary_entries.language_code = ?", true, params[:language]],
:order => 'created_at DESC', :limit => 20)
:conditions => {
:users => { :visible => true },
:visible => true,
:language_code => params[:language]
},
:order => 'created_at DESC',
:limit => 20)
@title = I18n.t('diary_entry.feed.language.title', :language_name => Language.find(params[:language]).english_name)
@description = I18n.t('diary_entry.feed.language.description', :language_name => Language.find(params[:language]).english_name)
@link = "http://#{SERVER_URL}/diary/#{params[:language]}"
else
@entries = DiaryEntry.find(:all, :include => :user,
:conditions => ["users.visible = ?", true],
:order => 'created_at DESC', :limit => 20)
:conditions => {
:users => { :visible => true },
:visible => true
},
:order => 'created_at DESC',
:limit => 20)
@title = I18n.t('diary_entry.feed.all.title')
@description = I18n.t('diary_entry.feed.all.description')
@link = "http://#{SERVER_URL}/diary"
@ -127,10 +153,14 @@ class DiaryEntryController < ApplicationController
end
def view
user = User.find_by_display_name(params[:display_name], :conditions => {:visible => true})
user = User.find_by_display_name(params[:display_name], :conditions => { :visible => true })
if user
@entry = DiaryEntry.find(:first, :conditions => ['user_id = ? AND id = ?', user.id, params[:id]])
@entry = DiaryEntry.find(:first, :conditions => {
:id => params[:id],
:user_id => user.id,
:visible => true
})
if @entry
@title = t 'diary_entry.view.title', :user => params[:display_name]
else
@ -143,4 +173,26 @@ class DiaryEntryController < ApplicationController
render :action => 'no_such_user', :status => :not_found
end
end
def hide
entry = DiaryEntry.find(params[:id])
entry.update_attributes(:visible => false)
redirect_to :action => "list", :display_name => entry.user.display_name
end
def hidecomment
comment = DiaryComment.find(params[:comment])
comment.update_attributes(:visible => false)
redirect_to :action => "view", :id => comment.diary_entry.id
end
private
##
# require that the user is a administrator, or fill out a helpful error message
# and return them to the user page.
def require_administrator
unless @user.administrator?
flash[:error] = t('user.filter.not_an_administrator')
redirect_to :controller => 'diary_entry', :action => 'view', :display_name => params[:id]
end
end
end

View file

@ -3,7 +3,10 @@ class DiaryEntry < ActiveRecord::Base
belongs_to :language, :foreign_key => 'language_code'
has_many :diary_comments, :include => :user,
:conditions => ["users.visible = ?", true],
:conditions => {
:users => { :visible => true },
:visible => true
},
:order => "diary_comments.id"
validates_presence_of :title, :body

View file

@ -1,3 +1,6 @@
<h4 id="comment<%= diary_comment.id %>"><%= t('diary_entry.diary_comment.comment_from', :link_user => (link_to h(diary_comment.user.display_name), :controller => 'user', :action => 'view', :display_name => diary_comment.user.display_name), :comment_created_at => l(diary_comment.created_at)) %></h4>
<%= htmlize(diary_comment.body) %>
<% if @user && @user.administrator? %>
<%= link_to t('diary_entry.diary_comment.hide_link'), {:action => 'hidecomment', :display_name => @user.display_name, :id => diary_comment.diary_entry.id, :comment => diary_comment.id}, {:confirm => t('diary_entry.diary_comment.confirm')} %>
<% end %>
<hr />

View file

@ -15,5 +15,8 @@
<% if @user == diary_entry.user %>
| <%= link_to t('diary_entry.diary_entry.edit_link'), :action => 'edit', :display_name => @user.display_name, :id => diary_entry.id %>
<% end %>
<% if @user && @user.administrator? %>
| <%= link_to t('diary_entry.diary_entry.hide_link'), {:action => 'hide', :display_name => @user.display_name, :id => diary_entry.id}, {:confirm => t('diary_entry.diary_entry.confirm')} %>
<% end %>
<br />
<hr />

View file

@ -320,8 +320,12 @@ en:
one: 1 comment
other: "{{count}} comments"
edit_link: Edit this entry
hide_link: Hide this entry
confirm: Confirm
diary_comment:
comment_from: "Comment from {{link_user}} at {{comment_created_at}}"
hide_link: Hide this comment
confirm: Confirm
feed:
user:
title: "OpenStreetMap diary entries for {{user}}"

View file

@ -156,6 +156,8 @@ ActionController::Routing::Routes.draw do |map|
map.connect '/user/:display_name/diary/rss', :controller => 'diary_entry', :action => 'rss'
map.connect '/user/:display_name/diary/new', :controller => 'diary_entry', :action => 'new'
map.connect '/user/:display_name/diary/:id/edit', :controller => 'diary_entry', :action => 'edit', :id => /\d+/
map.connect '/user/:display_name/diary/:id/hide', :controller => 'diary_entry', :action => 'hide', :id => /\d+/
map.connect '/user/:display_name/diary/:id/hidecomment/:comment', :controller => 'diary_entry', :action => 'hidecomment', :id => /\d+/, :comment => /\d+/
map.connect '/user/:display_name/account', :controller => 'user', :action => 'account'
map.connect '/user/:display_name/set_home', :controller => 'user', :action => 'set_home'
map.connect '/user/:display_name/activate', :controller => 'user', :action => 'activate'

View file

@ -0,0 +1,11 @@
class AddVisibleToDiaries < ActiveRecord::Migration
def self.up
add_column :diary_entries, :visible, :boolean, :null => false, :default => true
add_column :diary_comments, :visible, :boolean, :null => false, :default => true
end
def self.down
remove_column :diary_comments, :visible
remove_column :diary_entries, :visible
end
end