OSDN Git Service

User blocking improved. Admin area styled
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Mon, 16 Apr 2012 20:33:03 +0000 (23:33 +0300)
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Mon, 16 Apr 2012 20:33:03 +0000 (23:33 +0300)
13 files changed:
CHANGELOG
app/assets/stylesheets/gitlab_bootstrap.scss
app/controllers/admin/users_controller.rb
app/controllers/application_controller.rb
app/models/user.rb
app/views/admin/projects/index.html.haml
app/views/admin/projects/show.html.haml
app/views/admin/users/_form.html.haml
app/views/admin/users/index.html.haml
app/views/admin/users/show.html.haml
app/views/help/index.html.haml
app/views/layouts/admin.html.haml
config/routes.rb

index 8e07452..57f7fba 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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
index 85672ab..641064a 100644 (file)
@@ -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);
+  }
+}
index 5b194d8..bbb1990 100644 (file)
@@ -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])
index 5ae19a7..17bcef4 100644 (file)
@@ -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
index 3149de4..b98ae33 100644 (file)
@@ -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
 #
index 046cffd..bf576e4 100644 (file)
@@ -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
index a387fc7..5303a0e 100644 (file)
@@ -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
         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 { 
index 2fd4f71..d493ebf 100644 (file)
@@ -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 &amp; will not be able to login to GitLab.
     .actions
       = f.submit 'Save', :class => "btn primary"
       - if @admin_user.new_record? 
index a7003f8..1332598 100644 (file)
@@ -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
       %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"
index fd7f4dc..060dd0c 100644 (file)
@@ -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
       %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 { 
index d246add..6e180ac 100644 (file)
@@ -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. 
index 78d3cb8..a71dd57 100644 (file)
@@ -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"
 
index c13ffd0..6e29ec7 100644 (file)
@@ -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