From 543f5c12bcc2fbbbcf8ad7e8b3810e8e4ab1d041 Mon Sep 17 00:00:00 2001 From: joshua stein Date: Sat, 7 Jul 2012 19:47:13 -0500 Subject: [PATCH] user tree --- app/assets/stylesheets/application.css | 15 ++++++++++++++ app/controllers/users_controller.rb | 28 ++++++++++++++++++++++++++ app/views/users/tree.html.erb | 22 ++++++++++++++++++++ config/routes.rb | 2 ++ 4 files changed, 67 insertions(+) create mode 100644 app/views/users/tree.html.erb diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index b8d50b7..b173741 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -584,6 +584,21 @@ div.comment_form_container, div.comment_reply { max-width: 700px; } +ul.user_tree { + color: #aaa; + margin: 0; + list-style: none; + padding-left: 0; + line-height: 1.5em; +} +ul.user_tree li { + margin-left: 0.5em; + padding-left: 1em; +} +ul.user_tree ul.user_tree li { + border-left: 1px solid #aaa; +} + /* data tables */ table.data caption { diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index ccfaeaa..1b1e99c 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -3,4 +3,32 @@ class UsersController < ApplicationController @showing_user = User.find_by_username!(params[:id]) @page_title = "User: #{@showing_user.username}" end + + def tree + parents = {} + karmas = {} + User.all.each do |u| + (parents[u.invited_by_user_id.to_i] ||= []).push u + end + + Keystore.find(:all, :conditions => "`key` like 'user:%:karma'").each do |k| + karmas[k.key[/\d+/].to_i] = k.value + end + + @tree = [] + recursor = lambda{|user,level| + if user + @tree.push({ :level => level, :user_id => user.id, + :username => user.username, :karma => karmas[user.id].to_i }) + end + + # for each user that was invited by this one, recurse with it + (parents[user ? user.id : 0] || []).each do |child| + recursor.call(child, level + 1) + end + } + recursor.call(nil, 0) + + @tree + end end diff --git a/app/views/users/tree.html.erb b/app/views/users/tree.html.erb new file mode 100644 index 0000000..13d34bd --- /dev/null +++ b/app/views/users/tree.html.erb @@ -0,0 +1,22 @@ +
+ User Tree +

+ <% prev_level = 0 %> + <% @tree.each do |u| %> + <% if u[:level] > prev_level %> +

+ <% end %> + <% end %> + +
  • <%= u[:username] %> + (<%= u[:karma] %>) + + <% prev_level = u[:level] %> + <% end %> + <% prev_level.times do %> + + <% end %> +
  • diff --git a/config/routes.rb b/config/routes.rb index 352d6bf..3e36061 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -52,6 +52,8 @@ Lobsters::Application.routes.draw do get "/s/:id/:title/comments/:comment_short_id" => "stories#show_comment" get "/s/:id/(:title)" => "stories#show" + + get "/u" => "users#tree" get "/u/:id" => "users#show" get "/rss" => "home#index", :format => "rss"