Commit c9def945 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

User blocking improved. Admin area styled

parent c0df0cd7
v 2.4.0 v 2.4.0
- Ability to block user
- Simplified dashboard area
- Improved admin area
- Accept merge request - Accept merge request
- Bootstrap 2.0
- Responsive layout
- Big commits handling
- Perfomance improved
- Milestones
v 2.3.1 v 2.3.1
- Issues pagination - Issues pagination
......
...@@ -450,3 +450,17 @@ form { ...@@ -450,3 +450,17 @@ form {
} }
} }
table.admin-table {
@extend .table-bordered;
@extend .zebra-striped;
th {
border-color: #CCC;
border-bottom: 1px solid #bbb;
background:#eee;
background-image: -webkit-gradient(linear, 0 0, 0 30, color-stop(0.066, #eee), to(#dfdfdf));
background-image: -webkit-linear-gradient(#eee 6.6%, #dfdfdf);
background-image: -moz-linear-gradient(#eee 6.6%, #dfdfdf);
background-image: -o-linear-gradient(#eee 6.6%, #dfdfdf);
}
}
...@@ -4,7 +4,9 @@ class Admin::UsersController < ApplicationController ...@@ -4,7 +4,9 @@ class Admin::UsersController < ApplicationController
before_filter :authenticate_admin! before_filter :authenticate_admin!
def index def index
@admin_users = User.page(params[:page]) @admin_users = User.scoped
@admin_users = @admin_users.filter(params[:filter])
@admin_users = @admin_users.order("updated_at DESC").page(params[:page])
end end
def show def show
...@@ -38,13 +40,31 @@ class Admin::UsersController < ApplicationController ...@@ -38,13 +40,31 @@ class Admin::UsersController < ApplicationController
@admin_user = User.find(params[:id]) @admin_user = User.find(params[:id])
end end
def block
@admin_user = User.find(params[:id])
if @admin_user.block
redirect_to :back, alert: "Successfully blocked"
else
redirect_to :back, alert: "Error occured. User was not blocked"
end
end
def unblock
@admin_user = User.find(params[:id])
if @admin_user.update_attribute(:blocked, false)
redirect_to :back, alert: "Successfully unblocked"
else
redirect_to :back, alert: "Error occured. User was not unblocked"
end
end
def create def create
admin = params[:user].delete("admin") admin = params[:user].delete("admin")
blocked = params[:user].delete("blocked")
@admin_user = User.new(params[:user]) @admin_user = User.new(params[:user])
@admin_user.admin = (admin && admin.to_i > 0) @admin_user.admin = (admin && admin.to_i > 0)
@admin_user.blocked = blocked
respond_to do |format| respond_to do |format|
if @admin_user.save if @admin_user.save
...@@ -59,7 +79,6 @@ class Admin::UsersController < ApplicationController ...@@ -59,7 +79,6 @@ class Admin::UsersController < ApplicationController
def update def update
admin = params[:user].delete("admin") admin = params[:user].delete("admin")
blocked = params[:user].delete("blocked")
if params[:user][:password].blank? if params[:user][:password].blank?
params[:user].delete(:password) params[:user].delete(:password)
...@@ -68,7 +87,6 @@ class Admin::UsersController < ApplicationController ...@@ -68,7 +87,6 @@ class Admin::UsersController < ApplicationController
@admin_user = User.find(params[:id]) @admin_user = User.find(params[:id])
@admin_user.admin = (admin && admin.to_i > 0) @admin_user.admin = (admin && admin.to_i > 0)
@admin_user.blocked = blocked
respond_to do |format| respond_to do |format|
if @admin_user.update_attributes(params[:user]) if @admin_user.update_attributes(params[:user])
......
class ApplicationController < ActionController::Base class ApplicationController < ActionController::Base
before_filter :authenticate_user! before_filter :authenticate_user!
before_filter :reject_blocked!
before_filter :set_current_user_for_mailer before_filter :set_current_user_for_mailer
protect_from_forgery protect_from_forgery
helper_method :abilities, :can? helper_method :abilities, :can?
...@@ -16,6 +17,14 @@ class ApplicationController < ActionController::Base ...@@ -16,6 +17,14 @@ class ApplicationController < ActionController::Base
protected protected
def reject_blocked!
if current_user && current_user.blocked
sign_out current_user
flash[:alert] = "Your account was blocked"
redirect_to new_user_session_path
end
end
def after_sign_in_path_for resource def after_sign_in_path_for resource
if resource.is_a?(User) && resource.respond_to?(:blocked) && resource.blocked if resource.is_a?(User) && resource.respond_to?(:blocked) && resource.blocked
sign_out resource sign_out resource
......
...@@ -48,7 +48,25 @@ class User < ActiveRecord::Base ...@@ -48,7 +48,25 @@ class User < ActiveRecord::Base
before_create :ensure_authentication_token before_create :ensure_authentication_token
alias_attribute :private_token, :authentication_token alias_attribute :private_token, :authentication_token
scope :not_in_project, lambda { |project| where("id not in (:ids)", :ids => project.users.map(&:id) ) } scope :not_in_project, lambda { |project| where("id not in (:ids)", :ids => project.users.map(&:id) ) }
scope :admins, where(:admin => true)
scope :blocked, where(:blocked => true)
scope :active, where(:blocked => false)
def self.filter filter_name
case filter_name
when "admins"; self.admins
when "blocked"; self.blocked
when "wop"; self.without_projects
else
self.active
end
end
def self.without_projects
where('id NOT IN (SELECT DISTINCT(user_id) FROM users_projects)')
end
def identifier def identifier
email.gsub /[@.]/, "_" email.gsub /[@.]/, "_"
...@@ -58,6 +76,7 @@ class User < ActiveRecord::Base ...@@ -58,6 +76,7 @@ class User < ActiveRecord::Base
admin admin
end end
def require_ssh_key? def require_ssh_key?
keys.count == 0 keys.count == 0
end end
...@@ -101,6 +120,17 @@ class User < ActiveRecord::Base ...@@ -101,6 +120,17 @@ class User < ActiveRecord::Base
def project_ids def project_ids
projects.map(&:id) projects.map(&:id)
end end
# Remove user from all projects and
# set blocked attribute to true
def block
users_projects.all.each do |membership|
return false unless membership.destroy
end
self.blocked = true
save
end
end end
# == Schema Information # == Schema Information
# #
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
Projects Projects
= link_to 'New Project', new_admin_project_path, :class => "btn small right" = link_to 'New Project', new_admin_project_path, :class => "btn small right"
%br %br
%table.zebra-striped.table-bordered %table.admin-table
%thead %thead
%th Name %th Name
%th Path %th Path
......
...@@ -2,9 +2,8 @@ ...@@ -2,9 +2,8 @@
= @admin_project.name = @admin_project.name
= link_to 'Edit', edit_admin_project_path(@admin_project), :class => "btn right small" = link_to 'Edit', edit_admin_project_path(@admin_project), :class => "btn right small"
%hr %br
%table.zebra-striped.table-bordered
%table.zebra-striped
%tr %tr
%td %td
%b %b
...@@ -29,47 +28,47 @@ ...@@ -29,47 +28,47 @@
Description: Description:
%td %td
= @admin_project.description = @admin_project.description
%br
%h3
Team
%small
(#{@admin_project.users_projects.count})
%br
%table.zebra-striped.table-bordered
%thead
%tr
%th Name
%th Project Access
%th Repository Access
%th
- @admin_project.users_projects.each do |tm|
%tr
%td
= link_to tm.user_name, admin_user_path(tm.user)
%td= select_tag :tm_project_access, options_for_select(Project.access_options, tm.project_access), :class => "medium project-access-select", :disabled => :disabled
%td= link_to 'Edit Access', edit_admin_team_member_path(tm), :class => "btn small"
%td= link_to 'Remove from team', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete, :class => "btn danger small"
.span12 %br
%h3 Add new team member
%h3 %br
Team = form_tag team_update_admin_project_path(@admin_project), :class => "bulk_import", :method => :put do
%small %table.zebra-striped.table-bordered
(#{@admin_project.users_projects.count})
%hr
%table.zebra-striped
%thead %thead
%tr %tr
%th Name %th Users
%th Project Access %th Project Access:
%th Repository Access
%th
- @admin_project.users_projects.each do |tm| %tr
%tr %td= select_tag :user_ids, options_from_collection_for_select(@users , :id, :name), :multiple => true
%td %td= select_tag :project_access, options_for_select(Project.access_options), :class => "project-access-select"
= link_to tm.user_name, admin_user_path(tm.user)
%td= select_tag :tm_project_access, options_for_select(Project.access_options, tm.project_access), :class => "medium project-access-select", :disabled => :disabled
%td= link_to 'Edit Access', edit_admin_team_member_path(tm), :class => "btn small"
%td= link_to 'Remove from team', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete, :class => "btn danger small"
= form_tag team_update_admin_project_path(@admin_project), :class => "bulk_import", :method => :put do
%table
%thead
%tr
%th Users
%th Project Access:
%th Repo Access:
%tr
%td= select_tag :user_ids, options_from_collection_for_select(@users , :id, :name), :multiple => true
%td= select_tag :project_access, options_for_select(Project.access_options), :class => "project-access-select"
.actions %tr
= submit_tag 'Add', :class => "btn primary" %td= submit_tag 'Add', :class => "btn primary"
%td
Read more about project permissions
%strong= link_to "here", help_permissions_path, :class => "vlink"
:css :css
form select { form select {
......
...@@ -6,41 +6,55 @@ ...@@ -6,41 +6,55 @@
- @admin_user.errors.full_messages.each do |msg| - @admin_user.errors.full_messages.each do |msg|
%li= msg %li= msg
.clearfix .row
= f.label :name .span6
.input= f.text_field :name .clearfix
.clearfix = f.label :name
= f.label :email .input
.input= f.text_field :email = f.text_field :name
.clearfix %span.help-inline * requried
= f.label :password .clearfix
.input= f.password_field :password = f.label :email
.clearfix .input
= f.label :password_confirmation = f.text_field :email
.input= f.password_field :password_confirmation %span.help-inline * requried
.clearfix
= f.label :password
.input= f.password_field :password
.clearfix
= f.label :password_confirmation
.input= f.password_field :password_confirmation
%hr
.clearfix
= f.label :skype
.input= f.text_field :skype
.clearfix
= f.label :linkedin
.input= f.text_field :linkedin
.clearfix
= f.label :twitter
.input= f.text_field :twitter
.span6
.clearfix
= f.label :projects_limit
.input= f.text_field :projects_limit, :class => "small_input"
.clearfix .alert
= f.label :projects_limit .clearfix
.input= f.text_field :projects_limit, :class => "small_input" %p Give user ability to manage application.
= f.label :admin, :class => "checkbox" do
.clearfix = f.check_box :admin
= f.label :skype %span Administrator
.input= f.text_field :skype - unless @admin_user.new_record?
.clearfix .alert.alert-error
= f.label :linkedin - if @admin_user.blocked
.input= f.text_field :linkedin %span
.clearfix = link_to 'Unblock', unblock_admin_user_path(@admin_user), :method => :put, :class => "btn small"
= f.label :twitter This user is blocked and is not able to login GitLab
.input= f.text_field :twitter - else
%hr %span
.clearfix = link_to 'Block', block_admin_user_path(@admin_user), :confirm => 'USER WILL BE BLOCKED! Are you sure?', :method => :put, :class => "btn small danger"
= f.label :admin do Blocked user will removed from all projects &amp; will not be able to login to GitLab.
= f.check_box :admin
%span Administrator
.clearfix
= f.label :blocked do
= f.check_box :blocked
%span Blocked
.actions .actions
= f.submit 'Save', :class => "btn primary" = f.submit 'Save', :class => "btn primary"
- if @admin_user.new_record? - if @admin_user.new_record?
......
...@@ -2,15 +2,29 @@ ...@@ -2,15 +2,29 @@
Users Users
= link_to 'New User', new_admin_user_path, :class => "btn small right" = link_to 'New User', new_admin_user_path, :class => "btn small right"
%br %br
%table.zebra-striped.table-bordered
%ul.nav.nav-pills
%li{:class => "#{'active' unless params[:filter]}"}
= link_to "Active", admin_users_path
%li{:class => "#{'active' if params[:filter] == "admins"}"}
= link_to admin_users_path(:filter => "admins") do
Admins
%li{:class => "#{'active' if params[:filter] == "blocked"}"}
= link_to admin_users_path(:filter => "blocked") do
Blocked
%li{:class => "#{'active' if params[:filter] == "wop"}"}
= link_to admin_users_path(:filter => "wop") do
Without projects
%table.admin-table
%thead %thead
%th Admin %th Admin
%th Name %th Name
%th Email %th Email
%th Projects %th Projects
%th Edit
%th Blocked %th Blocked
%th %th
%th
- @admin_users.each do |user| - @admin_users.each do |user|
%tr %tr
...@@ -18,8 +32,12 @@ ...@@ -18,8 +32,12 @@
%td= link_to user.name, [:admin, user] %td= link_to user.name, [:admin, user]
%td= user.email %td= user.email
%td= user.users_projects.count %td= user.users_projects.count
%td= check_box_tag "blocked", 1, user.blocked, :disabled => :disabled
%td= link_to 'Edit', edit_admin_user_path(user), :id => "edit_#{dom_id(user)}", :class => "btn small" %td= link_to 'Edit', edit_admin_user_path(user), :id => "edit_#{dom_id(user)}", :class => "btn small"
%td= link_to 'Destroy', [:admin, user], :confirm => 'Are you sure?', :method => :delete, :class => "btn small danger" %td
- if user.blocked
= link_to 'Unblock', unblock_admin_user_path(user), :method => :put, :class => "btn small success"
- else
= link_to 'Block', block_admin_user_path(user), :confirm => 'USER WILL BE BLOCKED! Are you sure?', :method => :put, :class => "btn small danger"
%td= link_to 'Destroy', [:admin, user], :confirm => 'USER WILL BE REMOVED! Are you sure?', :method => :delete, :class => "btn small danger"
= paginate @admin_users, :theme => "admin" = paginate @admin_users, :theme => "admin"
%h3 %h3
= @admin_user.name = @admin_user.name
- if @admin_user.blocked
%small Blocked
- if @admin_user.admin
%small Administrator
= link_to 'Edit', edit_admin_user_path(@admin_user), :class => "btn small right" = link_to 'Edit', edit_admin_user_path(@admin_user), :class => "btn small right"
%hr %br
%table.zebra-striped %table.zebra-striped.table-bordered
%tr %tr
%td %td
%b %b
...@@ -49,41 +53,47 @@ ...@@ -49,41 +53,47 @@
%td %td
= @admin_user.twitter = @admin_user.twitter
%h3 Projects
%hr
%table.zebra-striped
%tr
%thead
%th Name
%th Project Access
%th Repository Access
%th
%th
- @admin_user.users_projects.each do |tm|
- project = tm.project
%tr
%td= link_to project.name, admin_project_path(project)
%td= select_tag :tm_project_access, options_for_select(Project.access_options, tm.project_access), :class => "medium project-access-select", :disabled => :disabled
%td= link_to 'Edit Access', edit_admin_team_member_path(tm), :class => "btn small"
%td= link_to 'Remove from team', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete, :class => "btn small danger"
%br
%h3 Add User to Projects
%br
= form_tag team_update_admin_user_path(@admin_user), :class => "bulk_import", :method => :put do = form_tag team_update_admin_user_path(@admin_user), :class => "bulk_import", :method => :put do
%table %table.table-bordered
%thead %thead
%tr %tr
%th Projects %th Projects
%th Project Access: %th Project Access:
%th Repo Access:
%tr %tr
%td= select_tag :project_ids, options_from_collection_for_select(@projects , :id, :name), :multiple => true %td= select_tag :project_ids, options_from_collection_for_select(@projects , :id, :name), :multiple => true
%td= select_tag :project_access, options_for_select(Project.access_options), :class => "project-access-select" %td= select_tag :project_access, options_for_select(Project.access_options), :class => "project-access-select"
.actions %tr
= submit_tag 'Add', :class => "btn primary" %td= submit_tag 'Add', :class => "btn primary"
%td
Read more about project permissions
%strong= link_to "here", help_permissions_path, :class => "vlink"
%br
- if @admin_user.projects.present?
%h3 Projects
%br
%table.zebra-striped.table-bordered
%tr
%thead
%th Name
%th Project Access
%th
%th
- @admin_user.users_projects.each do |tm|
- project = tm.project
%tr
%td= link_to project.name, admin_project_path(project)
%td= select_tag :tm_project_access, options_for_select(Project.access_options, tm.project_access), :class => "medium project-access-select", :disabled => :disabled
%td= link_to 'Edit Access', edit_admin_team_member_path(tm), :class => "btn small"
%td= link_to 'Remove from team', admin_team_member_path(tm), :confirm => 'Are you sure?', :method => :delete, :class => "btn small danger"
:css :css
form select { form select {
......
%h3 %h3
Gitlabhq Gitlabhq
%span.right v2.3 %span.right v2.4
%hr %hr
%h4 Self Hosted Git Management %h4 Self Hosted Git Management
%h4 Fast, secure and stable solution based on Ruby on Rails & Gitolite. %h4 Fast, secure and stable solution based on Ruby on Rails & Gitolite.
......
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
.container .container
%nav.main_menu %nav.main_menu
= render "layouts/const_menu_links" = render "layouts/const_menu_links"
= link_to "Users", admin_users_path, :class => controller.controller_name == "users" ? "current" : nil
= link_to "Projects", admin_projects_path, :class => controller.controller_name == "projects" ? "current" : nil = link_to "Projects", admin_projects_path, :class => controller.controller_name == "projects" ? "current" : nil
= link_to "Users", admin_users_path, :class => controller.controller_name == "users" ? "current" : nil
= link_to "Emails", admin_emails_path, :class => controller.controller_name == "mailer" ? "current" : nil = link_to "Emails", admin_emails_path, :class => controller.controller_name == "mailer" ? "current" : nil
= link_to "Resque", "/info/resque" = link_to "Resque", "/info/resque"
......
...@@ -14,6 +14,8 @@ Gitlab::Application.routes.draw do ...@@ -14,6 +14,8 @@ Gitlab::Application.routes.draw do
resources :users do resources :users do
member do member do
put :team_update put :team_update
put :block
put :unblock
end end
end end
resources :projects, :constraints => { :id => /[^\/]+/ } do resources :projects, :constraints => { :id => /[^\/]+/ } do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment