Commit 16427f4c40073474ce7563edc70dd1e8e1b22a68

Authored by Dmitriy Zaporozhets
2 parents 96308f75 cc3c6ad0

Merge pull request #880 from NARKOZ/dashboard-feed

Dashboard feed
app/controllers/application_controller.rb
1 class ApplicationController < ActionController::Base 1 class ApplicationController < ActionController::Base
2 before_filter :authenticate_user! 2 before_filter :authenticate_user!
3 before_filter :reject_blocked! 3 before_filter :reject_blocked!
4 - before_filter :set_current_user_for_mailer 4 + before_filter :set_current_user_for_mailer, :check_token_auth
5 protect_from_forgery 5 protect_from_forgery
6 helper_method :abilities, :can? 6 helper_method :abilities, :can?
7 7
@@ -21,9 +21,16 @@ class ApplicationController &lt; ActionController::Base @@ -21,9 +21,16 @@ class ApplicationController &lt; ActionController::Base
21 21
22 protected 22 protected
23 23
  24 + def check_token_auth
  25 + # Redirect to login page if not atom feed
  26 + if params[:private_token].present? && params[:format] != 'atom'
  27 + redirect_to new_user_session_path
  28 + end
  29 + end
  30 +
24 def reject_blocked! 31 def reject_blocked!
25 if current_user && current_user.blocked 32 if current_user && current_user.blocked
26 - sign_out current_user 33 + sign_out current_user
27 flash[:alert] = "Your account was blocked" 34 flash[:alert] = "Your account was blocked"
28 redirect_to new_user_session_path 35 redirect_to new_user_session_path
29 end 36 end
app/controllers/projects_controller.rb
@@ -14,6 +14,11 @@ class ProjectsController &lt; ApplicationController @@ -14,6 +14,11 @@ class ProjectsController &lt; ApplicationController
14 @projects = current_user.projects.includes(:events).order("events.created_at DESC") 14 @projects = current_user.projects.includes(:events).order("events.created_at DESC")
15 @projects = @projects.page(params[:page]).per(40) 15 @projects = @projects.page(params[:page]).per(40)
16 @events = Event.where(:project_id => current_user.projects.map(&:id)).recent.limit(20) 16 @events = Event.where(:project_id => current_user.projects.map(&:id)).recent.limit(20)
  17 +
  18 + respond_to do |format|
  19 + format.html
  20 + format.atom { render :layout => false }
  21 + end
17 end 22 end
18 23
19 def new 24 def new
@@ -31,7 +36,7 @@ class ProjectsController &lt; ApplicationController @@ -31,7 +36,7 @@ class ProjectsController &lt; ApplicationController
31 @project.save! 36 @project.save!
32 @project.users_projects.create!(:project_access => UsersProject::MASTER, :user => current_user) 37 @project.users_projects.create!(:project_access => UsersProject::MASTER, :user => current_user)
33 38
34 - # when project saved no team member exist so 39 + # when project saved no team member exist so
35 # project repository should be updated after first user add 40 # project repository should be updated after first user add
36 @project.update_repository 41 @project.update_repository
37 end 42 end
@@ -72,7 +77,7 @@ class ProjectsController &lt; ApplicationController @@ -72,7 +77,7 @@ class ProjectsController &lt; ApplicationController
72 @events = @project.events.recent.limit(limit) 77 @events = @project.events.recent.limit(limit)
73 78
74 respond_to do |format| 79 respond_to do |format|
75 - format.html do 80 + format.html do
76 if @project.repo_exists? && @project.has_commits? 81 if @project.repo_exists? && @project.has_commits?
77 render :show 82 render :show
78 else 83 else
app/views/layouts/_head.html.haml
@@ -8,10 +8,11 @@ @@ -8,10 +8,11 @@
8 = javascript_include_tag "application" 8 = javascript_include_tag "application"
9 9
10 -# Atom feed 10 -# Atom feed
  11 + - if controller_name == 'projects' && action_name == 'index'
  12 + = auto_discovery_link_tag :atom, projects_url(:atom, :private_token => current_user.private_token), :title => "Dashboard feed"
11 - if @project && !@project.new_record? 13 - if @project && !@project.new_record?
12 - if current_page?(tree_project_ref_path(@project, @project.root_ref)) || current_page?(project_commits_path(@project)) 14 - if current_page?(tree_project_ref_path(@project, @project.root_ref)) || current_page?(project_commits_path(@project))
13 = auto_discovery_link_tag(:atom, project_commits_url(@project, :atom, :ref => @ref, :private_token => current_user.private_token), :title => "Recent commits to #{@project.name}:#{@ref}") 15 = auto_discovery_link_tag(:atom, project_commits_url(@project, :atom, :ref => @ref, :private_token => current_user.private_token), :title => "Recent commits to #{@project.name}:#{@ref}")
14 - if request.path == project_issues_path(@project) 16 - if request.path == project_issues_path(@project)
15 = auto_discovery_link_tag(:atom, project_issues_url(@project, :atom, :private_token => current_user.private_token), :title => "#{@project.name} issues") 17 = auto_discovery_link_tag(:atom, project_issues_url(@project, :atom, :private_token => current_user.private_token), :title => "#{@project.name} issues")
16 = csrf_meta_tags 18 = csrf_meta_tags
17 -  
app/views/projects/index.atom.builder 0 → 100644
@@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
  1 +xml.instruct!
  2 +xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do
  3 + xml.title "Dashboard feed#{" - #{current_user.name}" if current_user.name.present?}"
  4 + xml.link :href => projects_url(:atom), :rel => "self", :type => "application/atom+xml"
  5 + xml.link :href => projects_url, :rel => "alternate", :type => "text/html"
  6 + xml.id projects_url
  7 + xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any?
  8 +
  9 + @events.each do |event|
  10 + if event.allowed?
  11 + xml.entry do
  12 + if event.issue?
  13 + event_link = project_issue_url(event.project, event.issue)
  14 + event_title = event.issue_title
  15 + elsif event.merge_request?
  16 + event_link = project_merge_request_url(event.project, event.merge_request)
  17 + event_title = event.merge_request_title
  18 + elsif event.push?
  19 + event_link = project_commits_url(event.project, :ref => event.ref_name)
  20 + event_title = event.ref_name
  21 + end
  22 +
  23 + xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}"
  24 + xml.link :href => event_link
  25 + xml.title truncate(event_title, :length => 80)
  26 + xml.updated event.created_at.strftime("%Y-%m-%dT%H:%M:%SZ")
  27 + xml.media :thumbnail, :width => "40", :height => "40", :url => gravatar_icon(event.author_email)
  28 + xml.author do |author|
  29 + xml.name event.author_name
  30 + xml.email event.author_email
  31 + end
  32 + xml.summary event_title
  33 + end
  34 + end
  35 + end
  36 +end
spec/requests/projects_spec.rb
@@ -18,9 +18,23 @@ describe &quot;Projects&quot; do @@ -18,9 +18,23 @@ describe &quot;Projects&quot; do
18 page.should have_content("New Project") 18 page.should have_content("New Project")
19 end 19 end
20 20
21 - it "should have project" do 21 + it "should have project" do
22 page.should have_content(@project.name) 22 page.should have_content(@project.name)
23 end 23 end
  24 +
  25 + it "should render projects atom feed via private token" do
  26 + logout
  27 +
  28 + visit projects_path(:atom, :private_token => @user.private_token)
  29 + page.body.should have_selector("feed title")
  30 + end
  31 +
  32 + it "should not render projects page via private token" do
  33 + logout
  34 +
  35 + visit projects_path(:private_token => @user.private_token)
  36 + current_path.should == new_user_session_path
  37 + end
24 end 38 end
25 39
26 describe "GET /projects/new" do 40 describe "GET /projects/new" do