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
}
}
+
+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);
+ }
+}
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
@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
def update
admin = params[:user].delete("admin")
- blocked = params[:user].delete("blocked")
if params[:user][:password].blank?
params[:user].delete(:password)
@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])
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?
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
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 /[@.]/, "_"
admin
end
+
def require_ssh_key?
keys.count == 0
end
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
#
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
= @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
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"
-
- = 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"
+ %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 {
- @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?
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
%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"
%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
%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 {
%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.
.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"
resources :users do
member do
put :team_update
+ put :block
+ put :unblock
end
end
resources :projects, :constraints => { :id => /[^\/]+/ } do