User blocking improved. Admin area styled
This commit is contained in:
parent
c0df0cd70c
commit
c9def945d4
13 changed files with 231 additions and 109 deletions
|
@ -1,5 +1,13 @@
|
|||
v 2.4.0
|
||||
- Ability to block user
|
||||
- Simplified dashboard area
|
||||
- Improved admin area
|
||||
- Accept merge request
|
||||
- Bootstrap 2.0
|
||||
- Responsive layout
|
||||
- Big commits handling
|
||||
- Perfomance improved
|
||||
- Milestones
|
||||
|
||||
v 2.3.1
|
||||
- Issues pagination
|
||||
|
|
|
@ -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
|
|||
before_filter :authenticate_admin!
|
||||
|
||||
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
|
||||
|
||||
def show
|
||||
|
@ -38,13 +40,31 @@ class Admin::UsersController < ApplicationController
|
|||
@admin_user = User.find(params[:id])
|
||||
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
|
||||
admin = params[:user].delete("admin")
|
||||
blocked = params[:user].delete("blocked")
|
||||
|
||||
@admin_user = User.new(params[:user])
|
||||
@admin_user.admin = (admin && admin.to_i > 0)
|
||||
@admin_user.blocked = blocked
|
||||
|
||||
respond_to do |format|
|
||||
if @admin_user.save
|
||||
|
@ -59,7 +79,6 @@ class Admin::UsersController < ApplicationController
|
|||
|
||||
def update
|
||||
admin = params[:user].delete("admin")
|
||||
blocked = params[:user].delete("blocked")
|
||||
|
||||
if params[:user][:password].blank?
|
||||
params[:user].delete(:password)
|
||||
|
@ -68,7 +87,6 @@ class Admin::UsersController < ApplicationController
|
|||
|
||||
@admin_user = User.find(params[:id])
|
||||
@admin_user.admin = (admin && admin.to_i > 0)
|
||||
@admin_user.blocked = blocked
|
||||
|
||||
respond_to do |format|
|
||||
if @admin_user.update_attributes(params[:user])
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
class ApplicationController < ActionController::Base
|
||||
before_filter :authenticate_user!
|
||||
before_filter :reject_blocked!
|
||||
before_filter :set_current_user_for_mailer
|
||||
protect_from_forgery
|
||||
helper_method :abilities, :can?
|
||||
|
@ -16,6 +17,14 @@ class ApplicationController < ActionController::Base
|
|||
|
||||
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
|
||||
if resource.is_a?(User) && resource.respond_to?(:blocked) && resource.blocked
|
||||
sign_out resource
|
||||
|
|
|
@ -48,7 +48,25 @@ class User < ActiveRecord::Base
|
|||
|
||||
before_create :ensure_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 :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
|
||||
email.gsub /[@.]/, "_"
|
||||
|
@ -58,6 +76,7 @@ class User < ActiveRecord::Base
|
|||
admin
|
||||
end
|
||||
|
||||
|
||||
def require_ssh_key?
|
||||
keys.count == 0
|
||||
end
|
||||
|
@ -101,6 +120,17 @@ class User < ActiveRecord::Base
|
|||
def project_ids
|
||||
projects.map(&:id)
|
||||
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
|
||||
# == Schema Information
|
||||
#
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
Projects
|
||||
= link_to 'New Project', new_admin_project_path, :class => "btn small right"
|
||||
%br
|
||||
%table.zebra-striped.table-bordered
|
||||
%table.admin-table
|
||||
%thead
|
||||
%th Name
|
||||
%th Path
|
||||
|
|
|
@ -2,9 +2,8 @@
|
|||
= @admin_project.name
|
||||
= link_to 'Edit', edit_admin_project_path(@admin_project), :class => "btn right small"
|
||||
|
||||
%hr
|
||||
|
||||
%table.zebra-striped
|
||||
%br
|
||||
%table.zebra-striped.table-bordered
|
||||
%tr
|
||||
%td
|
||||
%b
|
||||
|
@ -29,47 +28,47 @@
|
|||
Description:
|
||||
%td
|
||||
= @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
|
||||
|
||||
%h3
|
||||
Team
|
||||
%small
|
||||
(#{@admin_project.users_projects.count})
|
||||
|
||||
%hr
|
||||
|
||||
%table.zebra-striped
|
||||
%br
|
||||
%h3 Add new team member
|
||||
%br
|
||||
= form_tag team_update_admin_project_path(@admin_project), :class => "bulk_import", :method => :put do
|
||||
%table.zebra-striped.table-bordered
|
||||
%thead
|
||||
%tr
|
||||
%th Name
|
||||
%th Project Access
|
||||
%th Repository Access
|
||||
%th
|
||||
%th Users
|
||||
%th Project Access:
|
||||
|
||||
- @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"
|
||||
%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"
|
||||
|
||||
= 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
|
||||
= submit_tag 'Add', :class => "btn primary"
|
||||
%tr
|
||||
%td= submit_tag 'Add', :class => "btn primary"
|
||||
%td
|
||||
Read more about project permissions
|
||||
%strong= link_to "here", help_permissions_path, :class => "vlink"
|
||||
|
||||
:css
|
||||
form select {
|
||||
|
|
|
@ -6,41 +6,55 @@
|
|||
- @admin_user.errors.full_messages.each do |msg|
|
||||
%li= msg
|
||||
|
||||
.clearfix
|
||||
= f.label :name
|
||||
.input= f.text_field :name
|
||||
.clearfix
|
||||
= f.label :email
|
||||
.input= f.text_field :email
|
||||
.clearfix
|
||||
= f.label :password
|
||||
.input= f.password_field :password
|
||||
.clearfix
|
||||
= f.label :password_confirmation
|
||||
.input= f.password_field :password_confirmation
|
||||
.row
|
||||
.span6
|
||||
.clearfix
|
||||
= f.label :name
|
||||
.input
|
||||
= f.text_field :name
|
||||
%span.help-inline * requried
|
||||
.clearfix
|
||||
= f.label :email
|
||||
.input
|
||||
= f.text_field :email
|
||||
%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
|
||||
= f.label :projects_limit
|
||||
.input= f.text_field :projects_limit, :class => "small_input"
|
||||
|
||||
.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
|
||||
%hr
|
||||
.clearfix
|
||||
= f.label :admin do
|
||||
= f.check_box :admin
|
||||
%span Administrator
|
||||
.clearfix
|
||||
= f.label :blocked do
|
||||
= f.check_box :blocked
|
||||
%span Blocked
|
||||
.alert
|
||||
.clearfix
|
||||
%p Give user ability to manage application.
|
||||
= f.label :admin, :class => "checkbox" do
|
||||
= f.check_box :admin
|
||||
%span Administrator
|
||||
- unless @admin_user.new_record?
|
||||
.alert.alert-error
|
||||
- if @admin_user.blocked
|
||||
%span
|
||||
= link_to 'Unblock', unblock_admin_user_path(@admin_user), :method => :put, :class => "btn small"
|
||||
This user is blocked and is not able to login GitLab
|
||||
- else
|
||||
%span
|
||||
= link_to 'Block', block_admin_user_path(@admin_user), :confirm => 'USER WILL BE BLOCKED! Are you sure?', :method => :put, :class => "btn small danger"
|
||||
Blocked user will removed from all projects & will not be able to login to GitLab.
|
||||
.actions
|
||||
= f.submit 'Save', :class => "btn primary"
|
||||
- if @admin_user.new_record?
|
||||
|
|
|
@ -2,15 +2,29 @@
|
|||
Users
|
||||
= link_to 'New User', new_admin_user_path, :class => "btn small right"
|
||||
%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
|
||||
%th Admin
|
||||
%th Name
|
||||
%th Email
|
||||
%th Projects
|
||||
%th Edit
|
||||
%th Blocked
|
||||
%th
|
||||
%th
|
||||
|
||||
- @admin_users.each do |user|
|
||||
%tr
|
||||
|
@ -18,8 +32,12 @@
|
|||
%td= link_to user.name, [:admin, user]
|
||||
%td= user.email
|
||||
%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 '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"
|
||||
|
|
|
@ -1,10 +1,14 @@
|
|||
%h3
|
||||
= @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"
|
||||
|
||||
%hr
|
||||
%br
|
||||
|
||||
%table.zebra-striped
|
||||
%table.zebra-striped.table-bordered
|
||||
%tr
|
||||
%td
|
||||
%b
|
||||
|
@ -49,41 +53,47 @@
|
|||
%td
|
||||
= @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
|
||||
%table
|
||||
%table.table-bordered
|
||||
%thead
|
||||
%tr
|
||||
%th Projects
|
||||
%th Project Access:
|
||||
%th Repo Access:
|
||||
|
||||
%tr
|
||||
%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"
|
||||
|
||||
.actions
|
||||
= submit_tag 'Add', :class => "btn primary"
|
||||
%tr
|
||||
%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
|
||||
form select {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%h3
|
||||
Gitlabhq
|
||||
%span.right v2.3
|
||||
%span.right v2.4
|
||||
%hr
|
||||
%h4 Self Hosted Git Management
|
||||
%h4 Fast, secure and stable solution based on Ruby on Rails & Gitolite.
|
||||
|
|
|
@ -7,8 +7,8 @@
|
|||
.container
|
||||
%nav.main_menu
|
||||
= 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 "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 "Resque", "/info/resque"
|
||||
|
||||
|
|
|
@ -14,6 +14,8 @@ Gitlab::Application.routes.draw do
|
|||
resources :users do
|
||||
member do
|
||||
put :team_update
|
||||
put :block
|
||||
put :unblock
|
||||
end
|
||||
end
|
||||
resources :projects, :constraints => { :id => /[^\/]+/ } do
|
||||
|
|
Loading…
Reference in a new issue