]> source.dussan.org Git - redmine.git/commitdiff
Add a user preference to choose how comments/replies are displayed: in chronological...
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 5 Mar 2008 15:41:54 +0000 (15:41 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 5 Mar 2008 15:41:54 +0000 (15:41 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1197 e93f8b46-1217-0410-a6f0-8f06a7374b81

35 files changed:
app/controllers/issues_controller.rb
app/controllers/messages_controller.rb
app/controllers/news_controller.rb
app/models/journal.rb
app/models/user.rb
app/models/user_preference.rb
app/views/issues/_history.rhtml
app/views/messages/edit.rhtml
app/views/messages/show.rhtml
app/views/my/account.rhtml
app/views/news/show.rhtml
lang/bg.yml
lang/cs.yml
lang/de.yml
lang/en.yml
lang/es.yml
lang/fi.yml
lang/fr.yml
lang/he.yml
lang/it.yml
lang/ja.yml
lang/ko.yml
lang/lt.yml
lang/nl.yml
lang/pl.yml
lang/pt-br.yml
lang/pt.yml
lang/ro.yml
lang/ru.yml
lang/sr.yml
lang/sv.yml
lang/uk.yml
lang/zh-tw.yml
lang/zh.yml
test/unit/user_test.rb

index 4a44d09bca28169b84955c344a6dea1643724be5..2636750407c47b24347fd4ad5519a7a69d2914bb 100644 (file)
@@ -92,6 +92,8 @@ class IssuesController < ApplicationController
   def show
     @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| @issue.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x, :customized => @issue) }
     @journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC")
+    @journals.each_with_index {|j,i| j.indice = i+1}
+    @journals.reverse! if User.current.wants_comments_in_reverse_order?
     @allowed_statuses = @issue.new_statuses_allowed_to(User.current)
     @edit_allowed = User.current.allowed_to?(:edit_issues, @project)
     @activities = Enumeration::get_values('ACTI')
index 49f4ba77ccf14646aa2d8e3e63e39c0bfd603ed9..64a7fa1c9db390535e9bdb04c0075a1d119da152 100644 (file)
@@ -29,6 +29,8 @@ class MessagesController < ApplicationController
 
   # Show a topic and its replies
   def show
+    @replies = @topic.children
+    @replies.reverse! if User.current.wants_comments_in_reverse_order?
     @reply = Message.new(:subject => "RE: #{@message.subject}")
     render :action => "show", :layout => false if request.xhr?
   end
index 66ed61cf4061670d48c1fdc86673273dfeb43228..c9ba6b991994bc6160b87e3eb863593e3a3741b7 100644 (file)
@@ -36,6 +36,8 @@ class NewsController < ApplicationController
   end
   
   def show
+    @comments = @news.comments
+    @comments.reverse! if User.current.wants_comments_in_reverse_order?
   end
 
   def new
index d757ef90da0a57967a27c0831717bd8737bf1161..7c5e3d3bf10e39675b86d604f9dcec38c57bfb7c 100644 (file)
@@ -23,6 +23,7 @@ class Journal < ActiveRecord::Base
   
   belongs_to :user
   has_many :details, :class_name => "JournalDetail", :dependent => :delete_all
+  attr_accessor :indice
   
   acts_as_searchable :columns => 'notes',
                      :include => :issue,
index 22d66539d25e20cb337c64447a96a35558557ee7..2dd698f2887b406aa259995a546a4177d80b48d3 100644 (file)
@@ -144,6 +144,10 @@ class User < ActiveRecord::Base
     self.pref.time_zone.nil? ? nil : TimeZone[self.pref.time_zone]
   end
   
+  def wants_comments_in_reverse_order?
+    self.pref[:comments_sorting] == 'desc'
+  end
+  
   # Return user's RSS key (a 40 chars long string), used to access feeds
   def rss_key
     token = self.rss_token || Token.create(:user => self, :action => 'feeds')
index 1ed9e0fd99569f4f6045ea21cbaa6d0b84862612..73e4a50c6d57d71030ae202dc73a4601f1254b03 100644 (file)
@@ -46,4 +46,7 @@ class UserPreference < ActiveRecord::Base
       self.others.store attr_name, value
     end
   end
+  
+  def comments_sorting; self[:comments_sorting] end
+  def comments_sorting=(order); self[:comments_sorting]=order end
 end
index 7c1ee2113afaad352c16e058e3add5c02a5a1d50..373758874686c80faaf05041edbccd79a2be54dc 100644 (file)
@@ -1,8 +1,7 @@
-<% note_id = 1 %>
 <% for journal in journals %>
     <div id="change-<%= journal.id %>">
-       <h4><div style="float:right;"><%= link_to "##{note_id}", :anchor => "note-#{note_id}" %></div>
-       <%= content_tag('a', '', :name => "note-#{note_id}")%>
+       <h4><div style="float:right;"><%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %></div>
+       <%= content_tag('a', '', :name => "note-#{journal.indice}")%>
        <%= format_time(journal.created_on) %> - <%= journal.user.name %></h4>
        <ul>
        <% for detail in journal.details %>
@@ -11,5 +10,4 @@
        </ul>
        <%= render_notes(journal) unless journal.notes.blank? %>
        </div>
-       <% note_id += 1 %>
 <% end %>
index 808b6ea27ecbab78369238e8a69c478424dcc9ab..dcc59a3965e4375fa7c1e1eab14505b274ee3f8c 100644 (file)
@@ -1,6 +1,6 @@
 <h2><%= link_to h(@board.name), :controller => 'boards', :action => 'show', :project_id => @project, :id => @board %> &#187; <%=h @message.subject %></h2>
 
 <% form_for :message, @message, :url => {:action => 'edit'}, :html => {:multipart => true} do |f| %>
-  <%= render :partial => 'form', :locals => {:f => f} %>
+  <%= render :partial => 'form', :locals => {:f => f, :replying => !@message.parent.nil?} %>
   <%= submit_tag l(:button_save) %>
 <% end %>
index 7d4c9989e392c15920b1e42b69d5b1b9777242d5..b9897cb400c8824a2a593a0158983fcf3fa3e1fa 100644 (file)
 <br />
 
 <h3 class="icon22 icon22-comment"><%= l(:label_reply_plural) %></h3>
-<% @topic.children.each do |message| %>
+<% @replies.each do |message| %>
   <a name="<%= "message-#{message.id}" %>"></a>
   <div class="contextual">
-    <%= link_to_if_authorized l(:button_edit), {:action => 'edit', :id => message}, :class => 'icon icon-edit' %>
-    <%= link_to_if_authorized l(:button_delete), {:action => 'destroy', :id => message}, :method => :post, :confirm => l(:text_are_you_sure), :class => 'icon icon-del' %>
+    <%= link_to_if_authorized image_tag('edit.png'), {:action => 'edit', :id => message}, :title => l(:button_edit) %>
+    <%= link_to_if_authorized image_tag('delete.png'), {:action => 'destroy', :id => message}, :method => :post, :confirm => l(:text_are_you_sure), :title => l(:button_delete) %>
   </div>
   <div class="message reply">
   <h4><%=h message.subject %> - <%= authoring message.created_on, message.author %></h4>
index 77568836d9a5c1fdb756136654243100eb7ff4a8..20210c99a12c42d398f8d5041ba1f75e689b641b 100644 (file)
 <p><%= f.text_field :lastname, :required => true %></p>
 <p><%= f.text_field :mail, :required => true %></p>
 <p><%= f.select :language, lang_options_for_select %></p>
-
-<% fields_for :pref, @user.pref, :builder => TabularFormBuilder, :lang => current_language do |pref_fields| %>
-<p><%= pref_fields.select :time_zone, TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %></p>
-<p><%= pref_fields.check_box :hide_mail %></p>
-<% end %>
 </div>
 
 <%= submit_tag l(:button_save) %>
 <% end %>
 <p><label><%= check_box_tag 'no_self_notified', 1, @user.pref[:no_self_notified] %> <%= l(:label_user_mail_no_self_notified) %></label></p>
 </div>
+
+<h3><%=l(:label_preferences)%></h3>
+<div class="box tabular">
+<% fields_for :pref, @user.pref, :builder => TabularFormBuilder, :lang => current_language do |pref_fields| %>
+<p><%= pref_fields.check_box :hide_mail %></p>
+<p><%= pref_fields.select :time_zone, TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %></p>
+<p><%= pref_fields.select :comments_sorting, [[l(:label_chronological_order), 'asc'], [l(:label_reverse_chronological_order), 'desc']] %></p>
+<% end %>
+</div>
 </div>
 <% end %>
 
index cc9eed0430c6e105d19c601373f93cdd3489772b..6de8aa86e88ffffbc8479ef7ca652582e7af44d6 100644 (file)
 
 <div id="comments" style="margin-bottom:16px;">
 <h3 class="icon22 icon22-comment"><%= l(:label_comment_plural) %></h3>
-<% @news.comments.each do |comment| %>
+<% @comments.each do |comment| %>
     <% next if comment.new_record? %>
-    <h4><%= authoring comment.created_on, comment.author %></h4>
     <div class="contextual">
-        <%= link_to_if_authorized l(:button_delete), {:controller => 'news', :action => 'destroy_comment', :id => @news, :comment_id => comment}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %>
+    <%= link_to_if_authorized image_tag('delete.png'), {:controller => 'news', :action => 'destroy_comment', :id => @news, :comment_id => comment},
+                                                       :confirm => l(:text_are_you_sure), :method => :post, :title => l(:button_delete) %>
     </div>
+    <h4><%= authoring comment.created_on, comment.author %></h4>
     <%= textilizable(comment.comments) %>
-<% end if @news.comments_count > 0 %>
+<% end if @comments.any? %>
 </div>
 
 <% if authorize_for 'news', 'add_comment' %>
index a99a8888a288adb304a0048a6fea4ba789a374a9..11e18b8499c05104913a46b9da7504535871ad06 100644 (file)
@@ -608,3 +608,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project
 text_destroy_time_entries: Delete reported hours
 text_reassign_time_entries: 'Reassign reported hours to this issue:'
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index 5036b6b45845faf251a43ad5fecc8139c1080435..ccf93fb9c4e7eb9448d4a67e37e9cf31e7c4dcba 100644 (file)
@@ -608,3 +608,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project
 text_destroy_time_entries: Delete reported hours
 text_reassign_time_entries: 'Reassign reported hours to this issue:'
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index 3d0db927c166e9fc11ceae6b934a3cbf27d1f675..bdbe549c28b056fb8044339b93e9dfccccf9abec 100644 (file)
@@ -609,3 +609,7 @@ enumeration_issue_priorities: Ticket-Prioritäten
 enumeration_doc_categories: Dokumentenkategorien
 enumeration_activities: Aktivitäten (Zeiterfassung)
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index a23d1b025b9874db0872258049c96f02f4b316e4..0445834fe5b065625d6f4019b687620fe4d6cb1d 100644 (file)
@@ -177,6 +177,7 @@ field_column_names: Columns
 field_time_zone: Time zone
 field_searchable: Searchable
 field_default_value: Default value
+field_comments_sorting: Afficher les commentaires
 
 setting_app_title: Application title
 setting_app_subtitle: Application subtitle
@@ -501,6 +502,9 @@ label_ldap_authentication: LDAP authentication
 label_downloads_abbr: D/L
 label_optional_description: Optional description
 label_add_another_file: Add another file
+label_preferences: Preferences
+label_chronological_order: In chronological order
+label_reverse_chronological_order: In reverse chronological order
 
 button_login: Login
 button_submit: Submit
index 66238934d926a1f0d2ee269a9c5f2ddaf071d7cd..d137054d904f63271a06de16f91a31b2565163d9 100644 (file)
@@ -611,3 +611,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project
 text_destroy_time_entries: Delete reported hours
 text_reassign_time_entries: 'Reassign reported hours to this issue:'
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index d85629e1f0a01e32d19832e5ef929d6bcc261f81..b2ad672f4f1dd05ff4db19201b48c6e579c1c69c 100644 (file)
@@ -612,3 +612,7 @@ text_destroy_time_entries: Delete reported hours
 text_reassign_time_entries: 'Reassign reported hours to this issue:'
 label_on: 'on'
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index 85e699c3cf613bdd1708218971c2684ed14200a5..b992ceff26d3f467091781a98e57f3d30ad92932 100644 (file)
@@ -177,6 +177,7 @@ field_column_names: Colonnes
 field_time_zone: Fuseau horaire
 field_searchable: Utilisé pour les recherches
 field_default_value: Valeur par défaut
+field_comments_sorting: Afficher les commentaires
 
 setting_app_title: Titre de l'application
 setting_app_subtitle: Sous-titre de l'application
@@ -501,6 +502,9 @@ label_ldap_authentication: Authentification LDAP
 label_downloads_abbr: D/L
 label_optional_description: Description facultative
 label_add_another_file: Ajouter un autre fichier
+label_preferences: Préférences
+label_chronological_order: Dans l'ordre chronologique
+label_reverse_chronological_order: Dans l'ordre chronologique inverse
 
 button_login: Connexion
 button_submit: Soumettre
index fe31e860b90a53633e609db166fd129979b34495..66a493bbbb6c502ee6bb93c5cf01981fead015df 100644 (file)
@@ -608,3 +608,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project
 text_destroy_time_entries: Delete reported hours
 text_reassign_time_entries: 'Reassign reported hours to this issue:'
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index f207c2e193eab44d1e7d03f92031fc195d70fb68..c47729c504d4c1d03d6d6165b3bdeafd8187de04 100644 (file)
@@ -608,3 +608,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project
 text_destroy_time_entries: Delete reported hours
 text_reassign_time_entries: 'Reassign reported hours to this issue:'
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index f00fc4d815c8b1c8920c508de0c0b0b1156f0477..37392dd7e2b3a65d94caeaaa560f1e11c20fc8fb 100644 (file)
@@ -609,3 +609,7 @@ label_optional_description: Optional description
 text_destroy_time_entries: Delete reported hours
 text_reassign_time_entries: 'Reassign reported hours to this issue:'
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index cf25e23ef5109da57a84c5cf17303253c8d3e7ea..5685d063a209a9580c4b332db7c8f86454603c71 100644 (file)
@@ -608,3 +608,7 @@ label_last_month: last month
 text_destroy_time_entries: Delete reported hours
 text_reassign_time_entries: 'Reassign reported hours to this issue:'
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index b50120764d48308f95593757d799c547fb2dfc77..c783f5768727edbbb23979608793fdb0d89611d7 100644 (file)
@@ -609,3 +609,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project
 text_destroy_time_entries: Delete reported hours
 text_reassign_time_entries: 'Reassign reported hours to this issue:'
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index 2d8a6aa00c9ea8bc9721ef7c8e4f02b2137a7da7..6d650456d242bc8926ad416582b91da64d8c657d 100644 (file)
@@ -609,3 +609,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project
 text_destroy_time_entries: Delete reported hours
 text_reassign_time_entries: 'Reassign reported hours to this issue:'
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index 57559aedbc2d2a683c0df46cd6c2871ea8d1fe95..bf8f3f1ba11aee4ad54e9efc7232fae61c263808 100644 (file)
@@ -608,3 +608,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project
 text_destroy_time_entries: Delete reported hours
 text_reassign_time_entries: 'Reassign reported hours to this issue:'
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index 35f490b836e3918f8129a2d2a953178739a9b549..9ddd6f94bb8daf992c69b55084ec416fa6916edc 100644 (file)
@@ -608,3 +608,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project
 text_destroy_time_entries: Delete reported hours\r
 text_reassign_time_entries: 'Reassign reported hours to this issue:'\r
 setting_activity_days_default: Days displayed on project activity\r
+label_chronological_order: In chronological order\r
+field_comments_sorting: Afficher les commentaires\r
+label_reverse_chronological_order: In reverse chronological order\r
+label_preferences: Preferences\r
index c07364f72c67a15b853e5b45603bcd23a6195ea7..63972d0424f1596b2a1bd6607cdf479d3bfc7d0a 100644 (file)
@@ -608,3 +608,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project
 text_destroy_time_entries: Delete reported hours
 text_reassign_time_entries: 'Reassign reported hours to this issue:'
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index 68de767a9738abc2e9e59c86623d0831654bbdd1..9d374af531c1180f8a83e18c0bf223d1fba7b48e 100644 (file)
@@ -608,3 +608,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project
 text_destroy_time_entries: Delete reported hours
 text_reassign_time_entries: 'Reassign reported hours to this issue:'
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index 39a30fd3be467556cd1a67db735b6d51908e5a65..d5b67f964ffcd149194270f0a1ffa64316733b15 100644 (file)
@@ -612,3 +612,7 @@ text_assign_time_entries_to_project: Прикрепить зарегистрир
 text_destroy_time_entries: Удалить зарегистрированное время
 text_reassign_time_entries: 'Перенести зарегистрированное время на следующую задачу:'
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index 5e693c09e2e2ff1bb4a084ed87ec6f239fb05246..edef5f7f50e1e43d75e37c825afcb4022acc6be1 100644 (file)
@@ -609,3 +609,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project
 text_destroy_time_entries: Delete reported hours
 text_reassign_time_entries: 'Reassign reported hours to this issue:'
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index 1b4698f35ada2d934f3bdc333765c0a8a61a1769..f3940759bf8443339131a8ffbb85555490f95dc1 100644 (file)
@@ -609,3 +609,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project
 text_destroy_time_entries: Delete reported hours
 text_reassign_time_entries: 'Reassign reported hours to this issue:'
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index c264541899fa9360e3e649aa6812df06a5774c94..d8e4a7a66c5e32ec4da0d2c9e94bc10d21728021 100644 (file)
@@ -610,3 +610,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project
 text_destroy_time_entries: Delete reported hours
 text_reassign_time_entries: 'Reassign reported hours to this issue:'
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index 5d504081130ae2bf27a784941d878c550d10a02a..eb1a5e305d784b6ed39cdc67c48694a94402ca70 100644 (file)
@@ -609,3 +609,7 @@ enumeration_issue_priorities: 項目優先權
 enumeration_doc_categories: 文件分類
 enumeration_activities: 活動 (time tracking)
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index 8646d47cd181afadde21d33270cf1e45c791a824..e7d790938d8955eabb7660dddb89637eec96f42a 100644 (file)
@@ -609,3 +609,7 @@ enumeration_issue_priorities: 问题优先级
 enumeration_doc_categories: 文档类别
 enumeration_activities: 活动(时间跟踪)
 setting_activity_days_default: Days displayed on project activity
+label_chronological_order: In chronological order
+field_comments_sorting: Afficher les commentaires
+label_reverse_chronological_order: In reverse chronological order
+label_preferences: Preferences
index 845a34afd6658d6bcf95c11c5d544351e578db9b..3209f261ad311f6ea398712dd702deb26fb82794 100644 (file)
@@ -144,4 +144,12 @@ class UserTest < Test::Unit::TestCase
     @jsmith.reload
     assert !@jsmith.projects.first.recipients.include?(@jsmith.mail)
   end
+  
+  def test_comments_sorting_preference
+    assert !@jsmith.wants_comments_in_reverse_order?
+    @jsmith.pref.comments_sorting = 'asc'
+    assert !@jsmith.wants_comments_in_reverse_order?
+    @jsmith.pref.comments_sorting = 'desc'
+    assert @jsmith.wants_comments_in_reverse_order?
+  end
 end