Improve user page navigation menu
authorTom MacWright <tom@macwright.org>
Tue, 7 Aug 2012 18:35:17 +0000 (14:35 -0400)
committerTom Hughes <tom@compton.nu>
Fri, 10 Aug 2012 07:26:48 +0000 (08:26 +0100)
Add counts to edits, blocks, and traces; don't show blocks if there
are none; and move OAuth to the settings page.

app/assets/stylesheets/common.css.scss
app/models/changeset.rb
app/models/trace.rb
app/views/user/account.html.erb
app/views/user/view.html.erb
db/migrate/20120808231205_add_counter_caches.rb [new file with mode: 0644]
db/structure.sql

index 27fd53c72e9b9c76732defaa7cf6b0820c84eccb..c32144128838d6f380ab9f7a9aa4491fbc840126 100644 (file)
@@ -887,6 +887,10 @@ p#contributorGuidance {
 
 /* Rules for the account settings page */
 
+#accountForm {
+  margin-top: 20px;
+}
+
 #accountForm td {
   padding-bottom: 10px;
 }
index b76d0c5a7e1c09f333dc573d0f9e470c9a4860b3..adb41b204eae382a80c4f4282c69a7b2d33e3a7a 100644 (file)
@@ -1,7 +1,7 @@
 class Changeset < ActiveRecord::Base
   require 'xml/libxml'
 
-  belongs_to :user
+  belongs_to :user, :counter_cache => true
 
   has_many :changeset_tags
 
index b72fda07dcd7b4b10b13a398b9f89205c936630d..bc47aa8e07acee587db1980276cfbdb43862724d 100644 (file)
@@ -1,7 +1,7 @@
 class Trace < ActiveRecord::Base
   self.table_name = "gpx_files"
 
-  belongs_to :user
+  belongs_to :user, :counter_cache => true
   has_many :tags, :class_name => 'Tracetag', :foreign_key => 'gpx_id', :dependent => :delete_all
   has_many :points, :class_name => 'Tracepoint', :foreign_key => 'gpx_id', :dependent => :delete_all
 
index 4889664911747152606ec57348c0e307d638fba8..cdd3160e8e385321b6fef10b4b7110f92d47272f 100644 (file)
@@ -1,4 +1,8 @@
 <h2><%= t 'user.account.my settings' %></h2>
+
+<%= link_to t('user.account.return to profile'), :controller => 'user', :action => 'view', :display_name => @user.display_name %> |
+<%= link_to t('user.view.oauth settings'), :controller => 'oauth_clients', :action => 'index' %>
+
 <%= error_messages_for 'user' %>
 <%= form_for :user, :html => { :multipart => true } do |f| %>
 <table id="accountForm">
 <%= raw t 'user.account.public editing note.text' %>
   <%= button_to t('user.account.make edits public button'), :action => :go_public %>
 <% end %>
-<br/>
-<br/>
-<%= link_to t('user.account.return to profile'), :controller => 'user', :action => 'view', :display_name => @user.display_name %>
-<br/>
-<br/>
index e8034510be4f9666a1902ebd4490cf2d68623cbf..95b66e864856c53f63b1760e5b917975fb4058b2 100644 (file)
@@ -5,36 +5,37 @@
 <div id="userinformation">
   <% if @user and @this_user.id == @user.id %>
     <!-- Displaying user's own profile page -->
-    <%= link_to t('user.view.my diary'), :controller => 'diary_entry', :action => 'list', :display_name => @user.display_name %>
-    |
-    <%= link_to t('user.view.new diary entry'), :controller => 'diary_entry', :action => 'new' %>
-    |
-    <%= link_to t('user.view.my comments' ), :controller => 'diary_entry', :action => 'comments', :display_name => @this_user.display_name %>
-    |
     <%= link_to t('user.view.my edits'), :controller => 'changeset', :action => 'list', :display_name => @user.display_name %>
+    <span class='count-number'><%= number_with_delimiter(@this_user.changesets.size) %></span>
     |
     <%= link_to t('user.view.my traces'), :controller => 'trace', :action=>'mine' %>
+    <span class='count-number'><%= number_with_delimiter(@this_user.traces.size) %></span>
     |
-    <%= link_to t('user.view.my settings'), :controller => 'user', :action => 'account', :display_name => @user.display_name %>
+    <%= link_to t('user.view.my diary'), :controller => 'diary_entry', :action => 'list', :display_name => @user.display_name %>
     |
-    <%= link_to t('user.view.oauth settings'), :controller => 'oauth_clients', :action => 'index' %>
+    <%= link_to t('user.view.my comments' ), :controller => 'diary_entry', :action => 'comments', :display_name => @this_user.display_name %>
     |
-    <%= link_to t('user.view.blocks on me'), :controller => 'user_blocks', :action => 'blocks_on', :display_name => @user.display_name %>
+    <%= link_to t('user.view.my settings'), :controller => 'user', :action => 'account', :display_name => @user.display_name %>
+    <% if @user.active_blocks.count > 0 %>
+      |
+      <%= link_to t('user.view.blocks on me'), :controller => 'user_blocks', :action => 'blocks_on', :display_name => @user.display_name %>
+      <span class='count-number'><%= number_with_delimiter(@this_user.active_blocks.count) %></span>
+    <% end %>
     <% if @user and @user.moderator? %>
       | <%= link_to t('user.view.blocks by me'), :controller => 'user_blocks', :action => 'blocks_by', :display_name => @user.display_name %>
     <% end %>
   <% else %>
+    <%= link_to t('user.view.edits'), :controller => 'changeset', :action => 'list', :display_name => @this_user.display_name %>
+    <span class='count-number'><%= number_with_delimiter(@this_user.changesets.size) %></span>
+    |
+    <%= link_to t('user.view.traces'), :controller => 'trace', :action => 'list', :display_name => @this_user.display_name %>
+    <span class='count-number'><%= number_with_delimiter(@this_user.traces.size) %></span>
+    |
     <!-- Displaying another user's profile page -->
     <%= link_to t('user.view.send message'), :controller => 'message', :action => 'new', :display_name => @this_user.display_name %>
     |
-    <%= link_to t('user.view.diary'), :controller => 'diary_entry', :action => 'list', :display_name => @this_user.display_name %>
-    |
     <%= link_to t('user.view.comments'), :controller => 'diary_entry', :action => 'comments', :display_name => @this_user.display_name %>
     |
-    <%= link_to t('user.view.edits'), :controller => 'changeset', :action => 'list', :display_name => @this_user.display_name %>
-    |
-    <%= link_to t('user.view.traces'), :controller => 'trace', :action => 'list', :display_name => @this_user.display_name %>
-    |
     <% if @user and @user.is_friends_with?(@this_user) %>
       <%= link_to t('user.view.remove as friend'), :controller => 'user', :action => 'remove_friend', :display_name => @this_user.display_name %>
     <% else %>
diff --git a/db/migrate/20120808231205_add_counter_caches.rb b/db/migrate/20120808231205_add_counter_caches.rb
new file mode 100644 (file)
index 0000000..a26f204
--- /dev/null
@@ -0,0 +1,19 @@
+class AddCounterCaches < ActiveRecord::Migration
+  def self.up
+    add_column :users, :changesets_count, :integer, :null => false, :default => 0
+    add_column :users, :traces_count, :integer, :null => false, :default => 0
+
+    Changeset.group(:user_id).pluck(:user_id).each do |user_id|
+      User.reset_counters(user_id, :changesets)
+    end
+
+    Trace.group(:user_id).pluck(:user_id).each do |user_id|
+      User.reset_counters(user_id, :traces)
+    end
+  end
+
+  def self.down
+    remove_column :users, :changesets_count
+    remove_column :users, :traces_count
+  end
+end
index 42e9733b18162a5c6a8e75a8ac7d4deeca43f71b..e0427e1d72948a3cf957219c83c91f0c6ec9d226 100644 (file)
@@ -44,8 +44,7 @@ SET search_path = public, pg_catalog;
 
 CREATE TYPE format_enum AS ENUM (
     'html',
-    'markdown',
-    'text'
+    'markdown'
 );
 
 
@@ -101,7 +100,7 @@ CREATE TYPE user_status_enum AS ENUM (
 
 CREATE FUNCTION maptile_for_point(bigint, bigint, integer) RETURNS integer
     LANGUAGE c STRICT
-    AS '/srv/www/master.osm.compton.nu/db/functions/libpgosm.so', 'maptile_for_point';
+    AS '/srv/www/next.osm.compton.nu/db/functions/libpgosm.so', 'maptile_for_point';
 
 
 --
@@ -110,7 +109,7 @@ CREATE FUNCTION maptile_for_point(bigint, bigint, integer) RETURNS integer
 
 CREATE FUNCTION tile_for_point(integer, integer) RETURNS bigint
     LANGUAGE c STRICT
-    AS '/srv/www/master.osm.compton.nu/db/functions/libpgosm.so', 'tile_for_point';
+    AS '/srv/www/next.osm.compton.nu/db/functions/libpgosm.so', 'tile_for_point';
 
 
 --
@@ -119,7 +118,7 @@ CREATE FUNCTION tile_for_point(integer, integer) RETURNS bigint
 
 CREATE FUNCTION xid_to_int4(xid) RETURNS integer
     LANGUAGE c IMMUTABLE STRICT
-    AS '/srv/www/master.osm.compton.nu/db/functions/libpgosm.so', 'xid_to_int4';
+    AS '/srv/www/next.osm.compton.nu/db/functions/libpgosm.so', 'xid_to_int4';
 
 
 SET default_tablespace = '';
@@ -1000,11 +999,13 @@ CREATE TABLE users (
     status user_status_enum DEFAULT 'pending'::user_status_enum NOT NULL,
     terms_agreed timestamp without time zone,
     consider_pd boolean DEFAULT false NOT NULL,
+    openid_url character varying(255),
     preferred_editor character varying(255),
     terms_seen boolean DEFAULT false NOT NULL,
-    openid_url character varying(255),
+    image_fingerprint character varying(255),
     description_format format_enum DEFAULT 'html'::format_enum NOT NULL,
-    image_fingerprint character varying(255)
+    changesets_count integer DEFAULT 0 NOT NULL,
+    traces_count integer DEFAULT 0 NOT NULL
 );
 
 
@@ -2263,6 +2264,8 @@ INSERT INTO schema_migrations (version) VALUES ('20120328090602');
 
 INSERT INTO schema_migrations (version) VALUES ('20120404205604');
 
+INSERT INTO schema_migrations (version) VALUES ('20120808231205');
+
 INSERT INTO schema_migrations (version) VALUES ('21');
 
 INSERT INTO schema_migrations (version) VALUES ('22');