root/app/controllers/projects_controller.rb

Download in other formats: Raw | Text
Revisions
Dimitrij Denissenko
Dimitrij Denissenko
May 10 2009 * 12:07
(over 1 year ago)

Revision dea7701400cf521b5d6e7f5af6f4dc46cc7355f4

Added XML-API for projects / Simplified code/specs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
class ProjectsController < ApplicationController  
  before_filter :find_projects
 
  def index
    respond_to do |format|    
      if User.current.public? && @projects.empty?
        flash.keep
        format.html { redirect_to login_path }
        format.all  { head :forbidden }        
      elsif @projects.size == 1
        flash.keep
        format.html { redirect_to @projects.first.path_to_first_menu_item }
        format.xml  { head :found, :location => project_path(@projects.first, :format => 'xml') }              
      else
        format.html
        format.rss  { render_index_rss }
        format.xml  { render :xml => @projects }              
      end    
    end    
  end
  
  def show
    @project = @projects.find! params[:id]
  
    respond_to do |format|
      format.html { redirect_to @project.path_to_first_menu_item }
      format.rss  { render_show_rss(@project) }
      format.xml  { render :xml => @project }
    end
  end
  
  protected

    def find_projects
      @projects = User.current.active_projects
      @projects.reject! do |project|
        project_has_no_accessible_menu_items?(project)
      end
    end

    def project_has_no_accessible_menu_items?(project)
      project.enabled_menu_items.find do |item|
        path = item.path(self, project)

        if User.current.has_access?(path)
          project.path_to_first_menu_item = path
          true
        else 
          nil
        end
      end.nil?
    end

    def render_index_rss
      @records = User.current.active_projects.inject([]) do |result, project|                
        find_feedable_records(project).each do |record|
          result << [record, project]
        end        
        result
      end.sort do |(ra, pa), (rb, pb)|
        rb.previewable(:project => pb).date <=> ra.previewable(:project => pa).date
      end.first(10)

      render_rss _('All Projects'), _('All news for all projects'), projects_url do |items|
        @records.each do |record, project|
          record.to_rss(items.new_item, :project => project)
        end
      end
    end

    def render_show_rss(project)
      render_rss project.name, 
        _('All news for {{project}}', :project => project.name), 
        project_url(project) do |items|

        find_feedable_records(project).each do |record|
          record.to_rss(items.new_item, :project => project)
        end
      end
    end

  private
  
    def find_feedable_records(project, limit = 10)
      load_channels(:feedable?, project).values.flatten.map do |klass|
        project.send(klass.table_name).feedable
      end.flatten.sort do |a, b| 
        b.previewable(:project => project).date <=> a.previewable(:project => project).date
      end.first(limit)
    end

    def render_rss(title, description, link, &block)
      content = RSS::Maker.make('2.0') do |rss|
        rss.channel.title = title 
        rss.channel.description = description
        rss.channel.link = link        
        yield(rss.items)
        rss.items.do_sort = true
      end
      render :xml => content.to_s, :content_type => 'application/rss+xml'      
    end

end