#
# file:: wiki_controller.rb
# author:: Jon A. Lambert
# version:: 0.1.0
# date:: 1/6/2006
#
# This source code copyright (C) 2006 by Jon A. Lambert
# All rights reserved.
#
# Released under the terms of the TeensyWeb Public License
# See LICENSE file for additional information.
#
class WikiController < ApplicationController
model :page, :revision, :user
before_filter :login_required, :only => [:edit]
before_filter :admin_required, :only => [:rename, :lock]
layout 'layout'
helper_method :page_name
helper_method :rev_name
def page_name
if params['id'].nil?
return TWCONFIG['home_page'] || "HomePage"
end
URI.unescape(params['id']) =~ WIKI_LINK_PATTERN
if $1.nil?
flash['notice'] = "Invalid page name"
TWCONFIG['home_page'] || "HomePage"
else
$1
end
end
def rev_name
params['rev']
end
def index
redirect_to(:action => "show", :id => page_name)
end
def show
@page = Page.find_by_name(page_name)
redirect_to(:action => "edit", :id => page_name) && return if !@page
if rev_name
@revision = Revision.find(rev_name, :conditions => [ "page_id == ?", @page.id])
else
@revision = @page.revision
end
end
def raw
@page = Page.find_by_name(page_name)
redirect_to(:action => "edit", :id => page_name) && return if !@page
if rev_name
@revision = Revision.find(rev_name, :conditions => [ "page_id == ?", @page.id])
else
@revision = @page.revision
end
end
def edit
@page = Page.find_by_name(page_name) || Page.new('name' => page_name, 'revision_id' => 0)
if !admin? && @page.page_locked == 1
flash['notice'] = 'Page locked'
redirect_to(:action => "show", :id => page_name) && return
end
if rev_name
@revision = Revision.find(rev_name, :conditions => [ "page_id == ?", @page.id])
else
@revision = @page.revision || Revision.new('data' => 'Describe page here')
end
if request.post?
case params['commit']
when 'Save'
@page.save
begin
host = Socket.gethostbyname(request.remote_ip)[0]
rescue
host = request.remote_ip
end
@revision = Revision.new('data' => params['content'], 'user_id' => session['user']['id'],
'page_id' => @page.id, 'ip' => request.remote_ip, 'host' => host,
'comment' => params['comment']
)
@revision.save
@page.revision_id = @revision.id
@page.save
flash['notice'] = "Page saved"
redirect_to(:action => "show", :id => page_name)
when 'Preview'
@revision = Revision.new('data' => params['content'], 'comment' => params['comment'])
@preview = true
flash['notice'] = "Preview"
when 'Cancel'
flash['notice'] = "Edit cancelled"
redirect_to(:action => "show", :id => page_name)
end
end
end
def recent
# seven days
@pages = Page.find(:all, :conditions => [ "updated_at > ?", Time.now - 60*60*24*7]).sort {|a,b| b.updated_at <=> a.updated_at}
@title = "Pages changed in last 7 days"
end
def rss
# seven days
@pages = Page.find(:all, :conditions => [ "updated_at > ?", Time.now - 60*60*24*7]).sort {|a,b| b.updated_at <=> a.updated_at}
@title = "Pages changed in last 7 days"
render_without_layout
end
def all
@pages = Page.find(:all).sort {|a,b| a.name <=> b.name}
@title = "All pages"
end
def search
@query = params['query']
@results = []
return if @query == ''
revs = Revision.find_by_sql "select * from revisions r, pages p where p.revision_id == r.id"
revs.each do |r|
@results << r if r.name =~ /#{@query}/i || r.data =~ /#{@query}/i
end
@title = "Wiki pages found for query \"#{@query}\""
end
def backrefs
@results = []
revs = Revision.find_by_sql "select * from revisions r, pages p where p.revision_id == r.id"
revs.each do |r|
@results << r if r.data =~ /#{page_name}/
end
@title = "Back references for: #{page_name}"
end
def revisions
@page = Page.find_by_name(page_name)
@revisions = Revision.find(:all, :conditions => [ "page_id == ?", @page.id])
@title = "Revision list"
end
def lock
return if !admin?
@page = Page.find_by_name(page_name)
return if !@page
@page.page_locked = @page.page_locked == 0 ? 1 : 0 # toggle
@page.save
redirect_to(:action => "show", :id => page_name)
end
def rename
redirect_to(:action => "show", :id => page_name)
end
end