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 @@ +
+ <% prev_level = 0 %> + <% @tree.each do |u| %> + <% if u[:level] > prev_level %> +