Merge 16012:16110 from trunk.
[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]
7   before_filter :check_database_readable
8   before_filter :check_database_writable, :only => [:new, :edit]
9
10   def new
11     @title = t 'diary_entry.new.title'
12
13     if params[:diary_entry]
14       @diary_entry = DiaryEntry.new(params[:diary_entry])
15       @diary_entry.user = @user
16
17       if @diary_entry.save
18         default_lang = @user.preferences.find(:first, :conditions => {:k => "diary.default_language"})
19         if default_lang
20           default_lang.v = @diary_entry.language_code
21           default_lang.save!
22         else
23           @user.preferences.create(:k => "diary.default_language", :v => @diary_entry.language_code)
24         end
25         redirect_to :controller => 'diary_entry', :action => 'list', :display_name => @user.display_name 
26       else
27         render :action => 'edit'
28       end
29     else
30       default_lang = @user.preferences.find(:first, :conditions => {:k => "diary.default_language"})
31       lang_code = default_lang ? default_lang.v : @user.preferred_language
32       @diary_entry = DiaryEntry.new(:language_code => lang_code)
33       render :action => 'edit'
34     end
35   end
36
37   def edit
38     @title= t 'diary_entry.edit.title'
39     @diary_entry = DiaryEntry.find(params[:id])
40
41     if @user != @diary_entry.user
42       redirect_to :controller => 'diary_entry', :action => 'view', :id => params[:id]
43     elsif params[:diary_entry]
44       if @diary_entry.update_attributes(params[:diary_entry])
45         redirect_to :controller => 'diary_entry', :action => 'view', :id => params[:id]
46       end
47     end
48   rescue ActiveRecord::RecordNotFound
49     render :action => "no_such_entry", :status => :not_found
50   end
51
52   def comment
53     @entry = DiaryEntry.find(params[:id])
54     @diary_comment = @entry.diary_comments.build(params[:diary_comment])
55     @diary_comment.user = @user
56     if @diary_comment.save
57       Notifier::deliver_diary_comment_notification(@diary_comment)
58       redirect_to :controller => 'diary_entry', :action => 'view', :display_name => @entry.user.display_name, :id => @entry.id
59     else
60       render :action => 'view'
61     end
62   end
63
64   def list
65     if params[:display_name]
66       @this_user = User.find_by_display_name(params[:display_name], :conditions => {:visible => true})
67
68       if @this_user
69         @title = t 'diary_entry.list.user_title', :user => @this_user.display_name
70         @entry_pages, @entries = paginate(:diary_entries,
71                                           :conditions => ['user_id = ?', @this_user.id],
72                                           :order => 'created_at DESC',
73                                           :per_page => 20)
74       else
75         @title = t'diary_entry.no_such_user.title'
76         @not_found_user = params[:display_name]
77
78         render :action => 'no_such_user', :status => :not_found
79       end
80     elsif params[:language]
81       @title = t 'diary_entry.list.in_language_title', :language => Language.find(params[:language]).english_name
82       @entry_pages, @entries = paginate(:diary_entries, :include => :user,
83                                         :conditions => ["users.visible = ? AND diary_entries.language_code = ?", true, params[:language]],
84                                         :order => 'created_at DESC',
85                                         :per_page => 20)
86     else
87       @title = t 'diary_entry.list.title'
88       @entry_pages, @entries = paginate(:diary_entries, :include => :user,
89                                         :conditions => ["users.visible = ?", true],
90                                         :order => 'created_at DESC',
91                                         :per_page => 20)
92     end
93   end
94
95   def rss
96     request.format = :rss
97
98     if params[:display_name]
99       user = User.find_by_display_name(params[:display_name], :conditions => {:visible => true})
100
101       if user
102         @entries = DiaryEntry.find(:all, :conditions => ['user_id = ?', user.id], :order => 'created_at DESC', :limit => 20)
103         @title = "OpenStreetMap diary entries for #{user.display_name}"
104         @description = "Recent OpenStreetmap diary entries from #{user.display_name}"
105         @link = "http://#{SERVER_URL}/user/#{user.display_name}/diary"
106       else
107         render :nothing => true, :status => :not_found
108       end
109     elsif params[:language]
110       @entries = DiaryEntry.find(:all, :include => :user,
111         :conditions => ["users.visible = ? AND diary_entries.language_code = ?", true, params[:language]],
112         :order => 'created_at DESC', :limit => 20)
113       @title = "OpenStreetMap diary entries in #{Language.find(params[:language]).english_name}"
114       @description = "Recent diary entries from users of OpenStreetMap in #{Language.find(params[:language]).english_name}"
115       @link = "http://#{SERVER_URL}/diary/#{params[:language]}"
116     else
117       @entries = DiaryEntry.find(:all, :include => :user,
118                                  :conditions => ["users.visible = ?", true],
119                                  :order => 'created_at DESC', :limit => 20)
120       @title = "OpenStreetMap diary entries"
121       @description = "Recent diary entries from users of OpenStreetMap"
122       @link = "http://#{SERVER_URL}/diary"
123     end
124   end
125
126   def view
127     user = User.find_by_display_name(params[:display_name], :conditions => {:visible => true})
128
129     if user
130       @entry = DiaryEntry.find(:first, :conditions => ['user_id = ? AND id = ?', user.id, params[:id]])
131       if @entry
132         @title = t 'diary_entry.view.title', :user => params[:display_name]
133       else
134         @title = t 'diary_entry.no_such_entry.title', :id => params[:id]
135         render :action => 'no_such_entry', :status => :not_found
136       end
137     else
138       @not_found_user = params[:display_name]
139
140       render :action => 'no_such_user', :status => :not_found
141     end
142   end
143 end