Diary entries pretty much i18n'd. Additional test that checks there are no missing...
[rails.git] / app / controllers / diary_entry_controller.rb
1 class DiaryEntryController < ApplicationController
2   layout 'site', :except => :rss
3
4   before_filter :set_locale
5   before_filter :authorize_web
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 = 'New diary entry'
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         redirect_to :controller => 'diary_entry', :action => 'list', :display_name => @user.display_name 
19       else
20         render :action => 'edit'
21       end
22     else
23       render :action => 'edit'
24     end
25   end
26
27   def edit
28     @title= 'Edit diary entry'
29     @diary_entry = DiaryEntry.find(params[:id])
30
31     if @user != @diary_entry.user
32       redirect_to :controller => 'diary_entry', :action => 'view', :id => params[:id]
33     elsif params[:diary_entry]
34       if @diary_entry.update_attributes(params[:diary_entry])
35         redirect_to :controller => 'diary_entry', :action => 'view', :id => params[:id]
36       end
37     end
38   rescue ActiveRecord::RecordNotFound
39     render :action => "no_such_entry", :status => :not_found
40   end
41
42   def comment
43     @entry = DiaryEntry.find(params[:id])
44     @diary_comment = @entry.diary_comments.build(params[:diary_comment])
45     @diary_comment.user = @user
46     if @diary_comment.save
47       Notifier::deliver_diary_comment_notification(@diary_comment)
48       redirect_to :controller => 'diary_entry', :action => 'view', :display_name => @entry.user.display_name, :id => @entry.id
49     else
50       render :action => 'view'
51     end
52   end
53
54   def list
55     if params[:display_name]
56       @this_user = User.find_by_display_name(params[:display_name], :conditions => {:visible => true})
57
58       if @this_user
59         @title = @this_user.display_name + "'s diary"
60         @entry_pages, @entries = paginate(:diary_entries,
61                                           :conditions => ['user_id = ?', @this_user.id],
62                                           :order => 'created_at DESC',
63                                           :per_page => 20)
64       else
65         @not_found_user = params[:display_name]
66
67         render :action => 'no_such_user', :status => :not_found
68       end
69     else
70       @title = "Users' diaries"
71       @entry_pages, @entries = paginate(:diary_entries, :include => :user,
72                                         :conditions => ["users.visible = ?", true],
73                                         :order => 'created_at DESC',
74                                         :per_page => 20)
75     end
76   end
77
78   def rss
79     if params[:display_name]
80       user = User.find_by_display_name(params[:display_name], :conditions => {:visible => true})
81
82       if user
83         @entries = DiaryEntry.find(:all, :conditions => ['user_id = ?', user.id], :order => 'created_at DESC', :limit => 20)
84         @title = "OpenStreetMap diary entries for #{user.display_name}"
85         @description = "Recent OpenStreetmap diary entries from #{user.display_name}"
86         @link = "http://#{SERVER_URL}/user/#{user.display_name}/diary"
87
88         render :content_type => Mime::RSS
89       else
90         render :nothing => true, :status => :not_found
91       end
92     elsif params[:language]
93       @entries = DiaryEntry.find(:all, :include => :user,
94         :conditions => ["users.visible = ? AND diary_entries.language = ?", true, params[:language]],
95         :order => 'created_at DESC', :limit => 20)
96       @title = "OpenStreetMap diary entries in #{params[:language]}"
97       @description = "Recent diary entries from users of OpenStreetMap"
98       @link = "http://#{SERVER_URL}/diary/#{params[:language]}"
99       
100       render :content_type => Mime::RSS
101     else
102       @entries = DiaryEntry.find(:all, :include => :user,
103                                  :conditions => ["users.visible = ?", true],
104                                  :order => 'created_at DESC', :limit => 20)
105       @title = "OpenStreetMap diary entries"
106       @description = "Recent diary entries from users of OpenStreetMap"
107       @link = "http://#{SERVER_URL}/diary"
108
109       render :content_type => Mime::RSS
110     end
111   end
112
113   def view
114     user = User.find_by_display_name(params[:display_name], :conditions => {:visible => true})
115
116     if user
117       @entry = DiaryEntry.find(:first, :conditions => ['user_id = ? AND id = ?', user.id, params[:id]])
118       if @entry
119         @title = "Users' diaries | #{params[:display_name]}"
120       else
121         render :action => 'no_such_entry', :status => :not_found
122       end
123     else
124       @not_found_user = params[:display_name]
125
126       render :action => 'no_such_user', :status => :not_found
127     end
128   end
129 end