Feature: atom feed for user activity
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
This commit is contained in:
parent
05d713be19
commit
a46fe875c6
6 changed files with 90 additions and 4 deletions
|
@ -20,7 +20,7 @@ v 7.6.0
|
||||||
- In the docker directory is a container template based on the Omnibus packages.
|
- In the docker directory is a container template based on the Omnibus packages.
|
||||||
- Update Sidekiq to version 2.17.8
|
- Update Sidekiq to version 2.17.8
|
||||||
-
|
-
|
||||||
-
|
- Atom feed for user activity
|
||||||
|
|
||||||
v 7.5.2
|
v 7.5.2
|
||||||
- Don't log Sidekiq arguments by default
|
- Don't log Sidekiq arguments by default
|
||||||
|
|
|
@ -20,9 +20,14 @@ class UsersController < ApplicationController
|
||||||
|
|
||||||
# Get user activity feed for projects common for both users
|
# Get user activity feed for projects common for both users
|
||||||
@events = @user.recent_events.
|
@events = @user.recent_events.
|
||||||
where(project_id: authorized_projects_ids).limit(20)
|
where(project_id: authorized_projects_ids).limit(30)
|
||||||
|
|
||||||
@title = @user.name
|
@title = @user.name
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
format.html
|
||||||
|
format.atom { render layout: false }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def determine_layout
|
def determine_layout
|
||||||
|
|
29
app/views/users/show.atom.builder
Normal file
29
app/views/users/show.atom.builder
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
xml.instruct!
|
||||||
|
xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do
|
||||||
|
xml.title "Activity feed for #{@user.name}"
|
||||||
|
xml.link :href => user_url(@user, :atom), :rel => "self", :type => "application/atom+xml"
|
||||||
|
xml.link :href => user_url(@user), :rel => "alternate", :type => "text/html"
|
||||||
|
xml.id projects_url
|
||||||
|
xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any?
|
||||||
|
|
||||||
|
@events.each do |event|
|
||||||
|
if event.proper?
|
||||||
|
xml.entry do
|
||||||
|
event_link = event_feed_url(event)
|
||||||
|
event_title = event_feed_title(event)
|
||||||
|
event_summary = event_feed_summary(event)
|
||||||
|
|
||||||
|
xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}"
|
||||||
|
xml.link :href => event_link
|
||||||
|
xml.title truncate(event_title, :length => 80)
|
||||||
|
xml.updated event.created_at.strftime("%Y-%m-%dT%H:%M:%SZ")
|
||||||
|
xml.media :thumbnail, :width => "40", :height => "40", :url => avatar_icon(event.author_email)
|
||||||
|
xml.author do |author|
|
||||||
|
xml.name event.author_name
|
||||||
|
xml.email event.author_email
|
||||||
|
end
|
||||||
|
xml.summary(:type => "xhtml") { |x| x << event_summary unless event_summary.nil? }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -18,7 +18,15 @@
|
||||||
%h4 Groups:
|
%h4 Groups:
|
||||||
= render 'groups', groups: @groups
|
= render 'groups', groups: @groups
|
||||||
%hr
|
%hr
|
||||||
%h4 User Activity:
|
%h4
|
||||||
|
User Activity:
|
||||||
|
|
||||||
|
- if current_user
|
||||||
|
%span.rss-icon.pull-right
|
||||||
|
= link_to user_path(@user, :atom, { private_token: current_user.private_token }) do
|
||||||
|
%strong
|
||||||
|
%i.fa.fa-rss
|
||||||
|
|
||||||
= render @events
|
= render @events
|
||||||
.col-md-4
|
.col-md-4
|
||||||
= render 'profile', user: @user
|
= render 'profile', user: @user
|
||||||
|
|
|
@ -137,7 +137,8 @@ Gitlab::Application.routes.draw do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
match "/u/:username" => "users#show", as: :user, constraints: { username: /.*/ }, via: :get
|
match "/u/:username" => "users#show", as: :user,
|
||||||
|
constraints: {username: /(?:[^.]|\.(?!atom$))+/, format: /atom/}, via: :get
|
||||||
|
|
||||||
#
|
#
|
||||||
# Dashboard Area
|
# Dashboard Area
|
||||||
|
|
43
spec/features/atom/users_spec.rb
Normal file
43
spec/features/atom/users_spec.rb
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe "User Feed", feature: true do
|
||||||
|
describe "GET /" do
|
||||||
|
let!(:user) { create(:user) }
|
||||||
|
|
||||||
|
context "user atom feed via private token" do
|
||||||
|
it "should render user atom feed" do
|
||||||
|
visit user_path(user, :atom, private_token: user.private_token)
|
||||||
|
body.should have_selector("feed title")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'feed content' do
|
||||||
|
let(:project) { create(:project) }
|
||||||
|
let(:issue) { create(:issue, project: project, author: user, description: '') }
|
||||||
|
let(:note) { create(:note, noteable: issue, author: user, note: 'Bug confirmed', project: project) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
project.team << [user, :master]
|
||||||
|
issue_event(issue, user)
|
||||||
|
note_event(note, user)
|
||||||
|
visit user_path(user, :atom, private_token: user.private_token)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should have issue opened event" do
|
||||||
|
body.should have_content("#{user.name} opened issue ##{issue.iid}")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should have issue comment event" do
|
||||||
|
body.should have_content("#{user.name} commented on issue ##{issue.iid}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def issue_event(issue, user)
|
||||||
|
EventCreateService.new.open_issue(issue, user)
|
||||||
|
end
|
||||||
|
|
||||||
|
def note_event(note, user)
|
||||||
|
EventCreateService.new.leave_note(note, user)
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue