public
Description: The easy to use rails wiki
Homepage: http://signalwiki.com
Clone URL: git://github.com/queso/signal-wiki.git
commit  97e1874d38dc94079b9205b3cba0b341b3085fc5
tree    2acd64707634af291fae9a4b9e198c65760ec840
parent  ef22344ab94f249f9318c5e5bf5d93e436364d38
signal-wiki / app / controllers / pages_controller.rb
100644 168 lines (146 sloc) 4.377 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
class PagesController < ApplicationController
  before_filter :require_login, :except => [:index, :show, :revision, :search]
  before_filter :require_admin, :only => [:lock]
  before_filter :check_private, :only => [:show, :revision]
  caches_page :show
  cache_sweeper :page_sweeper, :only => [:create, :update]
  
  
  # GET /pages
  # GET /pages.xml
  def index
    @pages = site.pages.find(:all, :limit => 20, :order => "updated_at DESC")
    # todo: paginate
    respond_to do |format|
      format.html # index.html.erb
      format.xml { render :xml => @pages }
    end
  end
 
  # GET /pages/1
  # GET /pages/1.xml
  def show
    @page = site.pages.find_by_permalink(params[:id] || "home")
    
    
    if @page
      respond_to do |format|
        format.html # show.html.erb
        format.xml { render :xml => @page }
      end
    else
      session[:new_title] = params[:id]
      redirect_to new_page_url()
    end
  end
 
  def revision
    @page = site.pages.find_by_permalink(params[:id])
    @page = site.pages.find_version(@page.id, params[:version])
    
    respond_to do |format|
      format.html
    end
  end
 
  # GET /pages/new
  # GET /pages/new.xml
  def new
    @page = site.pages.new(:title => session[:new_title].to_s.gsub("-", " ").capitalize, :permalink => session[:new_title])
    @attachments = Attachment.find_parent(:all)
    @button_text = "Add this page"
    respond_to do |format|
      format.html # new.html.erb
      format.xml { render :xml => @page }
    end
  end
 
  # GET /pages/1/edit
  def edit
    @page = site.pages.find_by_permalink(params[:id])
    @attachments = Attachment.find_parent(:all)
    @button_text = "Save this version"
  end
 
  # POST /pages
  # POST /pages.xml
  def create
    @page = site.pages.new(params[:page])
    @page.request = request
    @page.user = logged_in? ? current_user : User.new
 
    respond_to do |format|
      if @page.save
        #flash[:notice] = 'Page was successfully created.'
        format.html { redirect_to(wiki_page_url(@page)) }
        format.xml { render :xml => @page, :status => :created, :location => @page }
      else
        format.html { render :action => "new" }
        format.xml { render :xml => @page.errors, :status => :unprocessable_entity }
      end
    end
  end
 
  # PUT /pages/1
  # PUT /pages/1.xml
  def update
    @page = site.pages.find_by_permalink(params[:id])
    @page.request = request
    @page.user = logged_in? ? current_user : User.new
    
    respond_to do |format|
      if @page.update_attributes(params[:page])
        #flash[:notice] = 'Page was successfully updated.'
        format.html { redirect_to(wiki_page_url(@page)) }
        format.xml { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml { render :xml => @page.errors, :status => :unprocessable_entity }
      end
    end
  end
 
  def rollback
    @page = site.pages.find_by_permalink(params[:id])
    @page.revert_to!(params[:version])
    expire_page("/#{@page.permalink}")
    respond_to do |format|
      #flash[:notice] = "#{@page.title} was successfully rolled back to revision #{params[:version]}"
      format.html { redirect_to(wiki_page_url(@page)) }
      format.xml { head :ok }
    end
  end
 
  def search
    @pages = site.pages.find_with_index("#{params[:query]}")
    respond_to do |format|
      format.html
      format.xml
      format.js
    end
  end
 
  # DELETE /pages/1
  # DELETE /pages/1.xml
  def destroy
    @page = site.pages.find_by_permalink(params[:id]).destroy
    respond_to do |format|
      format.html { redirect_to(pages_url) }
      format.xml { head :ok }
    end
  end
  
  def lock
    @page = site.pages.find_by_permalink(params[:id])
    if @page.locked?
      @page.unlock
    else
      @page.lock
    end
    respond_to do |format|
      format.html { redirect_to(wiki_page_url(@page)) }
      format.xml { head :ok }
    end
  end
  
  def check_private
    @page = site.pages.find_by_permalink(params[:id])
    return unless @page
    if @page.private_page
      login_required
    else
      true
    end
  end
  
  #FIXME: Remove this and add a manual cache call for pages we want cached, in the show method.
  def caching_allowed
    if @page
      ! @page.private_page
    end
  end
  
  def require_login
    site.require_login_to_post ? login_required : true
  end
  
end