summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dzaporozhets@gitlab.com>2015-03-26 15:46:43 +0000
committerDmitriy Zaporozhets <dzaporozhets@gitlab.com>2015-03-26 15:46:43 +0000
commit56e38f55bfebda0f6148fde8ebc087eb79ba38da (patch)
treee9aea027041fc7935074f033d6262b0ca1bec093
parent5d663b309d0b1c2254a61cc9e2cb3fa03ab8f2bf (diff)
parentf162e1b45e21597dbf4da641aa9f0f28c2b44592 (diff)
downloadgitlab-ci-56e38f55bfebda0f6148fde8ebc087eb79ba38da.tar.gz
Merge branch 'events_list' into 'master'
Events list fixes #134 ![joxi_screenshot_1426879556641](https://dev.gitlab.org/gitlab/gitlab-ci/uploads/bf8ca0686d0a8dc5b2f7e5a3d3543208/joxi_screenshot_1426879556641.png) ![joxi_screenshot_1427122511845](https://dev.gitlab.org/gitlab/gitlab-ci/uploads/0ca6c0f82050ec181423d43be3d95780/joxi_screenshot_1427122511845.png) See merge request !141
-rw-r--r--CHANGELOG2
-rw-r--r--app/controllers/admin/events_controller.rb7
-rw-r--r--app/controllers/events_controller.rb19
-rw-r--r--app/controllers/projects_controller.rb5
-rw-r--r--app/models/event.rb23
-rw-r--r--app/models/project.rb1
-rw-r--r--app/services/create_project_service.rb2
-rw-r--r--app/services/event_service.rb29
-rw-r--r--app/views/admin/events/index.html.haml19
-rw-r--r--app/views/events/index.html.haml19
-rw-r--r--app/views/layouts/_nav.html.haml3
-rw-r--r--app/views/layouts/_nav_project.html.haml4
-rw-r--r--config/routes.rb6
-rw-r--r--db/migrate/20150320001810_create_event_table.rb16
-rw-r--r--db/schema.rb15
-rw-r--r--spec/factories/events.rb24
-rw-r--r--spec/features/admin/events_spec.rb20
-rw-r--r--spec/features/events_spec.rb20
-rw-r--r--spec/services/event_service_spec.rb34
19 files changed, 266 insertions, 2 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 0a1996b..2a02c06 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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