Render site index in ui3 layout
[gitorious:mainline.git] / app / controllers / site_controller.rb
1 # encoding: utf-8
2 #--
3 #   Copyright (C) 2012 Gitorious AS
4 #   Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
5 #   Copyright (C) 2008 Johan Sørensen <johan@johansorensen.com>
6 #   Copyright (C) 2008 David A. Cuadrado <krawek@gmail.com>
7 #   Copyright (C) 2008 Tor Arne Vestbø <tavestbo@trolltech.com>
8 #   Copyright (C) 2009 Fabio Akita <fabio.akita@gmail.com>
9 #
10 #   This program is free software: you can redistribute it and/or modify
11 #   it under the terms of the GNU Affero General Public License as published by
12 #   the Free Software Foundation, either version 3 of the License, or
13 #   (at your option) any later version.
14 #
15 #   This program is distributed in the hope that it will be useful,
16 #   but WITHOUT ANY WARRANTY; without even the implied warranty of
17 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 #   GNU Affero General Public License for more details.
19 #
20 #   You should have received a copy of the GNU Affero General Public License
21 #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
22 #++
23
24 class SiteController < ApplicationController
25   skip_before_filter :public_and_logged_in, :only => [:index, :about, :faq, :contact, :tos, :privacy_policy]
26   before_filter :login_required, :only => [:dashboard]
27   renders_in_site_specific_context :except => [:about, :faq, :contact, :tos, :privacy_policy]
28   renders_in_global_context :only => [:about, :faq, :contact, :tos, :privacy_policy]
29
30   def index
31     if !current_site.subdomain.blank?
32       render_site_index
33     else
34       render_global_index
35     end
36   end
37
38   def public_timeline
39     render_public_timeline
40   end
41
42   def dashboard
43     redirect_to current_user
44   end
45
46   def about
47     render :about, :layout => "ui3"
48   end
49
50   def faq
51     render :faq, :layout => "ui3"
52   end
53
54   def contact
55     render :contact, :layout => "ui3"
56   end
57
58   protected
59
60   # Render a Site-specific index template
61   def render_site_index
62     all_projects = current_site.projects.order("created_at asc")
63     @projects = filter_authorized(current_user, all_projects)
64     @teams = Group.all_participating_in_projects(@projects)
65     @top_repository_clones = filter(Repository.most_active_clones_in_projects(@projects))
66     @latest_events = filter(Event.latest_in_projects(25, @projects.map{|p| p.id }))
67     render "site/#{current_site.subdomain}/index"
68   end
69
70   def render_public_timeline
71     @projects = filter(Project.order("id desc").limit(10))
72     @top_repository_clones = filter(Repository.most_active_clones)
73     @active_projects = filter(Project.most_active_recently(15))
74     @active_users = User.most_active
75     @active_groups = Group.most_active
76     @latest_events = filter(Event.latest(25))
77     render :template => "site/index", :layout => 'ui3'
78   end
79
80   def render_dashboard
81     @user = current_user
82
83     render :template => "site/dashboard", :layout => 'ui3', :locals => {
84       :user => current_user,
85       :events => events,
86       :user_events => user_events,
87       :projects => projects,
88       :repositories => repositories,
89       :favorites => favorites,
90       :atom_auto_discovery_url => atom_auto_discovery_url
91     }
92   end
93
94   # for dashboard
95   #
96   # TODO: extract this into some Dashboard-context object
97   def events
98     @events ||= filter_paginated(params[:page], Event.per_page) { |page|
99       current_user.paginated_events_in_watchlist(:page => page)
100     }
101   end
102
103   # needed by dashboard
104   #
105   # TODO: extract this into some Dashboard-context object
106   def projects
107     @projects ||= filter(current_user.projects.includes(:tags, { :repositories => :project }))
108   end
109
110   # needed by dashboard
111   #
112   # TODO: extract this into some Dashboard-context object
113   def repositories
114     @repositories ||= filter(current_user.commit_repositories)
115   end
116
117   # needed by dashboard
118   #
119   # TODO: extract this into some Dashboard-context object
120   def atom_auto_discovery_url
121     @atom_auto_discovery_url ||= user_watchlist_path(current_user, :format => :atom)
122   end
123
124   # needed by dashboard
125   #
126   # TODO: extract this into some Dashboard-context object
127   def favorites
128     @favorites ||= filter(current_user.favorites.all(:include => :watchable))
129   end
130
131   # needed by dashboard
132   #
133   # TODO: extract this into some Dashboard-context object
134   # TODO: this is identical as UsersController#paginated_events
135   def user_events
136     paginate(page_free_redirect_options) do
137       filter_paginated(params[:page], FeedItem.per_page) do |page|
138         current_user.events.excluding_commits.paginate(
139           :page => page,
140           :order => "events.created_at desc",
141           :include => [:user, :project]
142         )
143       end
144     end
145   end
146
147   def render_gitorious_dot_org_in_public
148     @feed_items = Rails.cache.fetch("blog_feed:feed_items", :expires_in => 1.hour) do
149       BlogFeed.new("http://blog.gitorious.org/feed/").fetch
150     end
151     render :template => "site/public_index", :layout => "second_generation/application"
152   end
153
154   # Render the global index template
155   def render_global_index
156     if logged_in?
157       render_dashboard
158     elsif Gitorious.dot_org?
159       render_gitorious_dot_org_in_public
160     else
161       render_public_timeline
162     end
163   end
164 end