Mercurial > hg > soundsoftware-site
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}"