diff options
author | Dmitriy Zaporozhets <dzaporozhets@gitlab.com> | 2015-03-26 15:46:43 +0000 |
---|---|---|
committer | Dmitriy Zaporozhets <dzaporozhets@gitlab.com> | 2015-03-26 15:46:43 +0000 |
commit | 56e38f55bfebda0f6148fde8ebc087eb79ba38da (patch) | |
tree | e9aea027041fc7935074f033d6262b0ca1bec093 | |
parent | 5d663b309d0b1c2254a61cc9e2cb3fa03ab8f2bf (diff) | |
parent | f162e1b45e21597dbf4da641aa9f0f28c2b44592 (diff) | |
download | gitlab-ci-56e38f55bfebda0f6148fde8ebc087eb79ba38da.tar.gz |
Merge branch 'events_list' into 'master'
Events list
fixes #134


See merge request !141
-rw-r--r-- | CHANGELOG | 2 | ||||
-rw-r--r-- | app/controllers/admin/events_controller.rb | 7 | ||||
-rw-r--r-- | app/controllers/events_controller.rb | 19 | ||||
-rw-r--r-- | app/controllers/projects_controller.rb | 5 | ||||
-rw-r--r-- | app/models/event.rb | 23 | ||||
-rw-r--r-- | app/models/project.rb | 1 | ||||
-rw-r--r-- | app/services/create_project_service.rb | 2 | ||||
-rw-r--r-- | app/services/event_service.rb | 29 | ||||
-rw-r--r-- | app/views/admin/events/index.html.haml | 19 | ||||
-rw-r--r-- | app/views/events/index.html.haml | 19 | ||||
-rw-r--r-- | app/views/layouts/_nav.html.haml | 3 | ||||
-rw-r--r-- | app/views/layouts/_nav_project.html.haml | 4 | ||||
-rw-r--r-- | config/routes.rb | 6 | ||||
-rw-r--r-- | db/migrate/20150320001810_create_event_table.rb | 16 | ||||
-rw-r--r-- | db/schema.rb | 15 | ||||
-rw-r--r-- | spec/factories/events.rb | 24 | ||||
-rw-r--r-- | spec/features/admin/events_spec.rb | 20 | ||||
-rw-r--r-- | spec/features/events_spec.rb | 20 | ||||
-rw-r--r-- | spec/services/event_service_spec.rb | 34 |
19 files changed, 266 insertions, 2 deletions
@@ -5,6 +5,8 @@ v7.10.0 v7.9.1 - [Security] Adding explicit is_shared parameter to runner - [Security] By default new projects are not served by shared runners + - Events for admin + - Events per projects v7.9.0 - Reset user session if token is invalid diff --git a/app/controllers/admin/events_controller.rb b/app/controllers/admin/events_controller.rb new file mode 100644 index 0000000..3fdf5c3 --- /dev/null +++ b/app/controllers/admin/events_controller.rb @@ -0,0 +1,7 @@ +class Admin::EventsController < Admin::ApplicationController + EVENTS_PER_PAGE = 50 + + def index + @events = Event.admin.order('created_at DESC').page(params[:page]).per(EVENTS_PER_PAGE) + end +end diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb new file mode 100644 index 0000000..7351bbc --- /dev/null +++ b/app/controllers/events_controller.rb @@ -0,0 +1,19 @@ +class EventsController < ApplicationController + EVENTS_PER_PAGE = 50 + + before_filter :authenticate_user! + before_filter :project + before_filter :authorize_manage_project! + + layout 'project' + + def index + @events = project.events.order("created_at DESC").page(params[:page]).per(EVENTS_PER_PAGE) + end + + private + + def project + @project ||= Project.find(params[:project_id]) + end +end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 9e7e44c..06b01ca 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -63,6 +63,9 @@ class ProjectsController < ApplicationController def update if project.update_attributes(params[:project]) + + EventService.new.change_project_settings(current_user, project) + redirect_to project, notice: 'Project was successfully updated.' else render action: "edit" @@ -73,6 +76,8 @@ class ProjectsController < ApplicationController project.destroy Network.new.disable_ci(current_user.url, project.gitlab_id, current_user.private_token) + EventService.new.remove_project(current_user, project) + redirect_to projects_url end diff --git a/app/models/event.rb b/app/models/event.rb new file mode 100644 index 0000000..185ebf1 --- /dev/null +++ b/app/models/event.rb @@ -0,0 +1,23 @@ +# == Schema Information +# +# Table name: events +# +# id :integer not null, primary key +# project_id :integer +# user_id :integer +# is_admin :integer +# description :text +# created_at :datetime +# updated_at :datetime +# + +class Event < ActiveRecord::Base + belongs_to :project + + validates :description, + presence: true, + length: { in: 5..200 } + + scope :admin, ->(){ where(is_admin: true) } + scope :project_wide, ->(){ where(is_admin: false) } +end diff --git a/app/models/project.rb b/app/models/project.rb index cb1258e..0d4d2a0 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -39,6 +39,7 @@ class Project < ActiveRecord::Base has_many :runners, through: :runner_projects has_many :web_hooks, dependent: :destroy has_many :jobs, dependent: :destroy + has_many :events, dependent: :destroy # Project services has_many :services, dependent: :destroy diff --git a/app/services/create_project_service.rb b/app/services/create_project_service.rb index c012b8a..1d99330 100644 --- a/app/services/create_project_service.rb +++ b/app/services/create_project_service.rb @@ -20,6 +20,8 @@ class CreateProjectService end end + EventService.new.create_project(current_user, @project) + @project end end diff --git a/app/services/event_service.rb b/app/services/event_service.rb new file mode 100644 index 0000000..015a0f7 --- /dev/null +++ b/app/services/event_service.rb @@ -0,0 +1,29 @@ +class EventService + def remove_project(user, project) + create( + description: "Project \"#{project.name}\" has been removed by #{user.username}", + user_id: user.id, + is_admin: true + ) + end + + def create_project(user, project) + create( + description: "Project \"#{project.name}\" has been created by #{user.username}", + user_id: user.id, + is_admin: true + ) + end + + def change_project_settings(user, project) + create( + project_id: project.id, + user_id: user.id, + description: "User \"#{user.username}\" updated projects settings" + ) + end + + def create(*args) + Event.create!(*args) + end +end diff --git a/app/views/admin/events/index.html.haml b/app/views/admin/events/index.html.haml new file mode 100644 index 0000000..779f49b --- /dev/null +++ b/app/views/admin/events/index.html.haml @@ -0,0 +1,19 @@ +%h3.page-title Events + +%table.table + %thead + %tr + %th User ID + %th Description + %th When + - @events.each do |event| + %tr + %td + = event.user_id + %td + = event.description + %td.light + = time_ago_in_words event.updated_at + ago + += paginate @events
\ No newline at end of file diff --git a/app/views/events/index.html.haml b/app/views/events/index.html.haml new file mode 100644 index 0000000..779f49b --- /dev/null +++ b/app/views/events/index.html.haml @@ -0,0 +1,19 @@ +%h3.page-title Events + +%table.table + %thead + %tr + %th User ID + %th Description + %th When + - @events.each do |event| + %tr + %td + = event.user_id + %td + = event.description + %td.light + = time_ago_in_words event.updated_at + ago + += paginate @events
\ No newline at end of file diff --git a/app/views/layouts/_nav.html.haml b/app/views/layouts/_nav.html.haml index fc32c62..45dd7e1 100644 --- a/app/views/layouts/_nav.html.haml +++ b/app/views/layouts/_nav.html.haml @@ -19,6 +19,9 @@ %li = link_to admin_builds_path do Builds + %li + = link_to admin_events_path do + Events %li = link_to 'Help', help_path diff --git a/app/views/layouts/_nav_project.html.haml b/app/views/layouts/_nav_project.html.haml index a1e221d..063f54e 100644 --- a/app/views/layouts/_nav_project.html.haml +++ b/app/views/layouts/_nav_project.html.haml @@ -28,3 +28,7 @@ = link_to edit_project_path(@project) do %i.icon-cogs Settings + = nav_link path: 'events#index' do + = link_to project_events_path(@project) do + %i.icon-book + Events diff --git a/config/routes.rb b/config/routes.rb index 1ee64ba..a176114 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -28,7 +28,7 @@ Rails.application.routes.draw do end resource :charts, only: [:show] - + resources :refs, constraints: { ref_id: /.*/ }, only: [] do resources :commits, only: [:show] do member do @@ -63,6 +63,8 @@ Rails.application.routes.draw do get :deploy_jobs end end + + resources :events, only: [:index] end resource :user_sessions do @@ -79,6 +81,8 @@ Rails.application.routes.draw do end end + resources :events, only: [:index] + resources :projects do resources :runner_projects end diff --git a/db/migrate/20150320001810_create_event_table.rb b/db/migrate/20150320001810_create_event_table.rb new file mode 100644 index 0000000..8d889ae --- /dev/null +++ b/db/migrate/20150320001810_create_event_table.rb @@ -0,0 +1,16 @@ +class CreateEventTable < ActiveRecord::Migration + def change + create_table :events do |t| + t.integer :project_id + t.integer :user_id + t.integer :is_admin + t.text :description + + t.timestamps + + t.index :created_at + t.index :is_admin + t.index :project_id + end + end +end diff --git a/db/schema.rb b/db/schema.rb index a0b007c..390d175 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20150324001227) do +ActiveRecord::Schema.define(version: 20150320001810) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -57,6 +57,19 @@ ActiveRecord::Schema.define(version: 20150324001227) do add_index "commits", ["project_id"], name: "index_commits_on_project_id", using: :btree add_index "commits", ["sha"], name: "index_commits_on_sha", using: :btree + create_table "events", force: true do |t| + t.integer "project_id" + t.integer "user_id" + t.integer "is_admin" + t.text "description" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "events", ["created_at"], name: "index_events_on_created_at", using: :btree + add_index "events", ["is_admin"], name: "index_events_on_is_admin", using: :btree + add_index "events", ["project_id"], name: "index_events_on_project_id", using: :btree + create_table "jobs", force: true do |t| t.integer "project_id", null: false t.text "commands" diff --git a/spec/factories/events.rb b/spec/factories/events.rb new file mode 100644 index 0000000..1dfa52e --- /dev/null +++ b/spec/factories/events.rb @@ -0,0 +1,24 @@ +# == Schema Information +# +# Table name: events +# +# id :integer not null, primary key +# project_id :integer +# user_id :integer +# is_admin :integer +# description :text +# created_at :datetime +# updated_at :datetime +# + +FactoryGirl.define do + factory :event, class: Event do + sequence :description do |n| + "updated project settings#{n}" + end + + factory :admin_event do + is_admin true + end + end +end diff --git a/spec/features/admin/events_spec.rb b/spec/features/admin/events_spec.rb new file mode 100644 index 0000000..469c6ed --- /dev/null +++ b/spec/features/admin/events_spec.rb @@ -0,0 +1,20 @@ +require 'spec_helper' + +describe "Admin Events" do + let(:event) { FactoryGirl.create :admin_event } + + before do + skip_admin_auth + login_as :user + end + + describe "GET /admin/events" do + before do + event + visit admin_events_path + end + + it { page.should have_content "Events" } + it { page.should have_content event.description } + end +end diff --git a/spec/features/events_spec.rb b/spec/features/events_spec.rb new file mode 100644 index 0000000..77d1fba --- /dev/null +++ b/spec/features/events_spec.rb @@ -0,0 +1,20 @@ +require 'spec_helper' + +describe "Events" do + let(:project) { FactoryGirl.create :project } + let(:event) { FactoryGirl.create :admin_event, project: project } + + before do + login_as :user + end + + describe "GET /project/:id/events" do + before do + event + visit project_events_path(project) + end + + it { page.should have_content "Events" } + it { page.should have_content event.description } + end +end diff --git a/spec/services/event_service_spec.rb b/spec/services/event_service_spec.rb new file mode 100644 index 0000000..f7b9bf5 --- /dev/null +++ b/spec/services/event_service_spec.rb @@ -0,0 +1,34 @@ +require 'spec_helper' + +describe EventService do + let (:project) { FactoryGirl.create :project, name: "GitLab / gitlab-shell" } + let (:user) { double(username: "root", id: 1) } + + before do + Event.destroy_all + end + + describe :remove_project do + it "creates event" do + EventService.new.remove_project(user, project) + + Event.admin.last.description.should == "Project \"GitLab / gitlab-shell\" has been removed by root" + end + end + + describe :create_project do + it "creates event" do + EventService.new.create_project(user, project) + + Event.admin.last.description.should == "Project \"GitLab / gitlab-shell\" has been created by root" + end + end + + describe :change_project_settings do + it "creates event" do + EventService.new.change_project_settings(user, project) + + Event.last.description.should == "User \"root\" updated projects settings" + end + end +end
\ No newline at end of file |