]> git.openstreetmap.org Git - rails.git/blob - app/controllers/diary_entry_controller.rb
Use one "no_such_user" view everywhere
[rails.git] / app / controllers / diary_entry_controller.rb
1 class DiaryEntryController < ApplicationController
2   layout 'site', :except => :rss
3
4   before_filter :authorize_web
5   before_filter :set_locale
6   before_filter :require_user, :only => [:new, :edit, :comment, :hide, :hidecomment]
7   before_filter :check_database_readable
8   before_filter :check_database_writable, :only => [:new, :edit]
9   before_filter :require_administrator, :only => [:hide, :hidecomment]
10
11   caches_action :list, :layout => false, :unless => :user_specific_list?
12   caches_action :rss, :layout => true
13   caches_action :view, :layout => false
14   cache_sweeper :diary_sweeper, :only => [:new, :edit, :comment, :hide, :hidecomment]
15
16   def new
17     @title = t 'diary_entry.new.title'
18
19     if params[:diary_entry]
20       @diary_entry = DiaryEntry.new(params[:diary_entry])
21       @diary_entry.user = @user
22
23       if @diary_entry.save
24         default_lang = @user.preferences.where(:k => "diary.default_language").first
25         if default_lang
26           default_lang.v = @diary_entry.language_code
27           default_lang.save!
28         else
29           @user.preferences.create(:k => "diary.default_language", :v => @diary_entry.language_code)
30         end
31         redirect_to :controller => 'diary_entry', :action => 'list', :display_name => @user.display_name 
32       else
33         render :action => 'edit'
34       end
35     else
36       default_lang = @user.preferences.where(:k => "diary.default_language").first
37       lang_code = default_lang ? default_lang.v : @user.preferred_language
38       @diary_entry = DiaryEntry.new(:language_code => lang_code)
39       render :action => 'edit'
40     end
41   end
42
43   def edit
44     @title= t 'diary_entry.edit.title'
45     @diary_entry = DiaryEntry.find(params[:id])
46
47     if @user != @diary_entry.user
48       redirect_to :controller => 'diary_entry', :action => 'view', :id => params[:id]
49     elsif params[:diary_entry]
50       if @diary_entry.update_attributes(params[:diary_entry])
51         redirect_to :controller => 'diary_entry', :action => 'view', :id => params[:id]
52       end
53     end
54   rescue ActiveRecord::RecordNotFound
55     render :action => "no_such_entry", :status => :not_found
56   end
57
58   def comment
59     @entry = DiaryEntry.find(params[:id])
60     @diary_comment = @entry.comments.build(params[:diary_comment])
61     @diary_comment.user = @user
62     if @diary_comment.save
63       if @diary_comment.user != @entry.user
64         Notifier.diary_comment_notification(@diary_comment).deliver
65       end
66
67       redirect_to :controller => 'diary_entry', :action => 'view', :display_name => @entry.user.display_name, :id => @entry.id
68     else
69       render :action => 'view'
70     end
71   end
72
73   def list
74     if params[:display_name]
75       @this_user = User.active.find_by_display_name(params[:display_name])
76
77       if @this_user
78         @title = t 'diary_entry.list.user_title', :user => @this_user.display_name
79         @entry_pages, @entries = paginate(:diary_entries,
80                                           :conditions => { 
81                                             :user_id => @this_user.id,
82                                             :visible => true 
83                                           },
84                                           :order => 'created_at DESC',
85                                           :per_page => 20)
86       else
87         render_unknown_user params[:display_name]
88       end
89     elsif params[:language]
90       @title = t 'diary_entry.list.in_language_title', :language => Language.find(params[:language]).english_name
91       @entry_pages, @entries = paginate(:diary_entries, :include => :user,
92                                         :conditions => {
93                                           :users => { :status => ["active", "confirmed"] },
94                                           :visible => true,
95                                           :language_code => params[:language]
96                                         },
97                                         :order => 'created_at DESC',
98                                         :per_page => 20)
99     elsif params[:friends]
100       if @user
101         @title = t 'diary_entry.list.title_friends'
102         @entry_pages, @entries = paginate(:diary_entries, :include => :user,
103                                           :conditions => {
104                                             :user_id => @user.friend_users,
105                                             :visible => true
106                                           },
107                                           :order => 'created_at DESC',
108                                           :per_page => 20)
109       else
110           require_user
111           return     
112       end
113     elsif params[:nearby]
114       if @user
115         @title = t 'diary_entry.list.title_nearby'
116         @entry_pages, @entries = paginate(:diary_entries, :include => :user,
117                                           :conditions => {
118                                             :user_id => @user.nearby,
119                                             :visible => true
120                                           },
121                                           :order => 'created_at DESC',
122                                           :per_page => 20)                                        
123       else
124           require_user
125           return     
126       end                                  
127     else
128       @title = t 'diary_entry.list.title'
129       @entry_pages, @entries = paginate(:diary_entries, :include => :user,
130                                         :conditions => {
131                                           :users => { :status => ["active", "confirmed"] },
132                                           :visible => true
133                                         },
134                                         :order => 'created_at DESC',
135                                         :per_page => 20)
136     end
137   end
138
139   def rss
140     @entries = DiaryEntry.includes(:user).order("created_at DESC").limit(20)
141
142     if params[:display_name]
143       user = User.active.find_by_display_name(params[:display_name])
144
145       if user
146         @entries = user.diary_entries.visible
147         @title = I18n.t('diary_entry.feed.user.title', :user => user.display_name)
148         @description = I18n.t('diary_entry.feed.user.description', :user => user.display_name)
149         @link = "http://#{SERVER_URL}/user/#{user.display_name}/diary"
150       else
151         render :nothing => true, :status => :not_found
152       end
153     elsif params[:language]
154       @entries = @entries.visible.where(:language_code => params[:language]).joins(:user).where(:users => { :status => ["active", "confirmed"] })
155       @title = I18n.t('diary_entry.feed.language.title', :language_name => Language.find(params[:language]).english_name)
156       @description = I18n.t('diary_entry.feed.language.description', :language_name => Language.find(params[:language]).english_name)
157       @link = "http://#{SERVER_URL}/diary/#{params[:language]}"
158     else
159       @entries = @entries.visible.joins(:user).where(:users => { :status => ["active", "confirmed"] })
160       @title = I18n.t('diary_entry.feed.all.title')
161       @description = I18n.t('diary_entry.feed.all.description')
162       @link = "http://#{SERVER_URL}/diary"
163     end
164   end
165
166   def view
167     user = User.active.find_by_display_name(params[:display_name])
168
169     if user
170       @entry = user.diary_entries.visible.where(:id => params[:id]).first
171       if @entry
172         @title = t 'diary_entry.view.title', :user => params[:display_name], :title => @entry.title
173       else
174         @title = t 'diary_entry.no_such_entry.title', :id => params[:id]
175         render :action => 'no_such_entry', :status => :not_found
176       end
177     else
178       render_unknown_user params[:display_name]
179     end
180   end
181
182   def hide
183     entry = DiaryEntry.find(params[:id])
184     entry.update_attributes(:visible => false)
185     redirect_to :action => "list", :display_name => entry.user.display_name
186   end
187
188   def hidecomment
189     comment = DiaryComment.find(params[:comment])
190     comment.update_attributes(:visible => false)
191     redirect_to :action => "view", :display_name => comment.diary_entry.user.display_name, :id => comment.diary_entry.id
192   end
193
194   def comments
195     @this_user = User.active.find_by_display_name(params[:display_name])
196
197     if @this_user
198       @comment_pages, @comments = paginate(:diary_comments,
199                                            :conditions => { :user_id => @this_user },
200                                            :order => 'created_at DESC',
201                                            :per_page => 20)
202       @page = (params[:page] || 1).to_i
203     else
204       render_unknown_user params[:display_name]
205     end                                         
206   end  
207 private
208   ##
209   # require that the user is a administrator, or fill out a helpful error message
210   # and return them to the user page.
211   def require_administrator
212     unless @user.administrator?
213       flash[:error] = t('user.filter.not_an_administrator')
214       redirect_to :controller => 'diary_entry', :action => 'view', :display_name => params[:id]
215     end
216   end
217
218   ##
219   # is this list user specific?
220   def user_specific_list?
221     params[:friends] or params[:nearby]
222   end
223 end