changeset 206:30203ffaa612 cannam-pre-20110113-merge

Merge from branch "bug_67"
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Tue, 08 Feb 2011 12:20:31 +0000
parents 5da98461a9f6 (current diff) 05f9a2a9c753 (diff)
children ff5112f823e5 5d6e2819f3dd
files
diffstat 3 files changed, 66 insertions(+), 65 deletions(-) [+]
line wrap: on
line diff
--- a/app/controllers/projects_controller.rb	Mon Feb 07 14:13:20 2011 +0000
+++ b/app/controllers/projects_controller.rb	Tue Feb 08 12:20:31 2011 +0000
@@ -46,19 +46,20 @@
   include RepositoriesHelper
   include ProjectsHelper
 
-  # Lists visible projects
+  # Lists visible projects. Paginator is for top-level projects only
+  # (subprojects belong to them)
   def index
     respond_to do |format|
       format.html { 
-        sort_init 'lft'
-        sort_update %w(lft title created_on updated_on)
+        sort_init 'name'
+        sort_update %w(name lft created_on updated_on)
         @limit = per_page_option
-        @project_count = Project.visible.count
+        @project_count = Project.visible_roots.count
         @project_pages = Paginator.new self, @project_count, @limit, params['page']
         @offset ||= @project_pages.current.offset
-        @projects = Project.visible.all(:offset => @offset, :limit => @limit, :order => sort_clause) 
+        @projects = Project.visible_roots.all(:offset => @offset, :limit => @limit, :order => sort_clause) 
         if User.current.logged?
-          @user_projects = User.current.projects.sort_by(&:lft)
+          @user_projects = User.current.projects.sort_by(&:name)
         end
         render :template => 'projects/index.rhtml', :layout => !request.xhr?
       }
--- a/app/helpers/projects_helper.rb	Mon Feb 07 14:13:20 2011 +0000
+++ b/app/helpers/projects_helper.rb	Tue Feb 08 12:20:31 2011 +0000
@@ -163,74 +163,17 @@
     s << "<table class='list projects'>"
     s << "<thead><tr>"
     
-    s << sort_header_tag('lft', :caption => l("field_name"), :default_order => 'desc')
+    s << sort_header_tag('name', :caption => l("field_name"))
     s << "<th class='managers'>" << l("label_managers") << "</th>"
     s << sort_header_tag('created_on', :default_order => 'desc')
     s << sort_header_tag('updated_on', :default_order => 'desc')
 
     s << "</tr></thead><tbody>"
 
-    ancestors = []
     original_project = @project
-    oddeven = 'even'
-    level = 0
 
     projects.each do |project|
-
-      # set the project environment to please macros.
-
-      @project = project
-
-      if (ancestors.empty? || project.is_descendant_of?(ancestors.last))
-        level = level + 1
-      else
-        level = 0
-        oddeven = cycle('odd','even')
-        ancestors.pop
-        while (ancestors.any? && !project.is_descendant_of?(ancestors.last))
-          ancestors.pop
-        end
-      end
-      
-      classes = (ancestors.empty? ? 'root' : 'child')
-
-      s << "<tr class='#{oddeven} #{classes} level#{level}'>"
-      s << "<td class='firstcol' align=top><div class='name hosted_here"
-      s << " no_description" if project.description.blank?
-      s << "'>" << link_to_project(project, {}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}");
-      s << "</div>"
-      unless project.description.blank?
-        s << "<div class='wiki description'>"
-        s << textilizable(project.short_description, :project => project)
-        s << "</div>"
-      end
-      
-      s << "<td class='managers' align=top>"
-
-      u = project.users_by_role
-      if u
-        u.keys.each do |r|
-          if r.allowed_to?(:edit_project)
-            mgrs = []
-            u[r].sort.each do |m|
-              mgrs << link_to_user(m)
-            end
-            if mgrs.size < 3
-              s << '<nobr>' << mgrs.join(', ') << '</nobr>'
-            else
-              s << mgrs.join(', ')
-            end
-          end
-        end
-      end
-
-      s << "</td>"
-      s << "<td class='created_on' align=top>" << format_date(project.created_on) << "</td>"
-      s << "<td class='updated_on' align=top>" << format_date(project.updated_on) << "</td>"
-
-      s << "</tr>"
-
-      ancestors << project          
+      s << render_project_in_table(project, cycle('odd', 'even'), 0)
     end
 
     s << "</table>"
@@ -241,6 +184,58 @@
   end
 
 
+  def render_project_in_table(project, oddeven, level)
+
+    # set the project environment to please macros.
+    @project = project
+
+    classes = (level == 0 ? 'root' : 'child')
+
+    s = ""
+    
+    s << "<tr class='#{oddeven} #{classes} level#{level}'>"
+    s << "<td class='firstcol' align=top><div class='name hosted_here"
+    s << " no_description" if project.description.blank?
+    s << "'>" << link_to_project(project, {}, :class => "project #{User.current.member_of?(project) ? 'my-project' : nil}");
+    s << "</div>"
+    unless project.description.blank?
+      s << "<div class='wiki description'>"
+      s << textilizable(project.short_description, :project => project)
+      s << "</div>"
+    end
+      
+    s << "<td class='managers' align=top>"
+
+    u = project.users_by_role
+    if u
+      u.keys.each do |r|
+        if r.allowed_to?(:edit_project)
+          mgrs = []
+          u[r].sort.each do |m|
+            mgrs << link_to_user(m)
+          end
+          if mgrs.size < 3
+            s << '<nobr>' << mgrs.join(', ') << '</nobr>'
+          else
+            s << mgrs.join(', ')
+          end
+        end
+      end
+    end
+
+    s << "</td>"
+    s << "<td class='created_on' align=top>" << format_date(project.created_on) << "</td>"
+    s << "<td class='updated_on' align=top>" << format_date(project.updated_on) << "</td>"
+    
+    s << "</tr>"
+
+    project.children.each do |child|
+      s << render_project_in_table(child, oddeven, level + 1)
+    end
+    
+    s
+  end
+
 
   # Returns a set of options for a select field, grouped by project.
   def version_options_for_select(versions, selected=nil)
--- a/app/models/project.rb	Mon Feb 07 14:13:20 2011 +0000
+++ b/app/models/project.rb	Tue Feb 08 12:20:31 2011 +0000
@@ -83,6 +83,7 @@
   named_scope :active, { :conditions => "#{Project.table_name}.status = #{STATUS_ACTIVE}"}
   named_scope :all_public, { :conditions => { :is_public => true } }
   named_scope :visible, lambda { { :conditions => Project.visible_by(User.current) } }
+  named_scope :visible_roots, lambda { { :conditions => Project.root_visible_by(User.current) } }
   
   def identifier=(identifier)
     super unless identifier_frozen?
@@ -114,6 +115,10 @@
     end
   end
   
+  def self.root_visible_by(user=nil)
+    return "#{Project.table_name}.parent_id IS NULL AND " + visible_by(user)
+  end
+  
   def self.allowed_to_condition(user, permission, options={})
     statements = []
     base_statement = "#{Project.table_name}.status=#{Project::STATUS_ACTIVE}"