From 4cbb29cfadb243733185cdfaefe34e15dee35260 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Date: Thu, 27 Dec 2012 06:14:05 +0300
Subject: [PATCH] Fix not_in_project scope. Added counters in admin -> users.
 Improved seeds

---
 app/models/user.rb                            |  9 ++++-
 app/views/admin/projects/index.html.haml      |  2 +-
 app/views/admin/users/index.html.haml         |  9 ++++-
 db/fixtures/development/001_admin.rb          | 10 -----
 db/fixtures/development/002_project.rb        | 12 ++++++
 db/fixtures/development/003_users.rb          | 26 +++++++-----
 db/fixtures/development/004_teams.rb          | 40 ++++++++++---------
 db/fixtures/development/006_wall.rb           |  8 ++--
 db/fixtures/development/007_issues.rb         |  8 ++--
 db/fixtures/development/008_merge_requests.rb |  9 +++--
 db/fixtures/development/009_source_code.rb    | 12 +++---
 db/fixtures/development/010_keys.rb           |  8 ++++
 lib/support/truncate_repositories.sh          | 11 +++++
 13 files changed, 105 insertions(+), 59 deletions(-)
 create mode 100644 db/fixtures/development/010_keys.rb
 create mode 100755 lib/support/truncate_repositories.sh

diff --git a/app/models/user.rb b/app/models/user.rb
index 1bc070f040..c2486fd3a1 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -77,7 +77,6 @@ class User < ActiveRecord::Base
   delegate :path, to: :namespace, allow_nil: true, prefix: true
 
   # Scopes
-  scope :not_in_project, ->(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)
@@ -93,6 +92,14 @@ class User < ActiveRecord::Base
       end
     end
 
+    def not_in_project(project)
+      if project.users.present?
+        where("id not in (:ids)", ids: project.users.map(&:id) )
+      else
+        scoped
+      end
+    end
+
     def without_projects
       where('id NOT IN (SELECT DISTINCT(user_id) FROM users_projects)')
     end
diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml
index 310cfa5389..0b9f91f7a5 100644
--- a/app/views/admin/projects/index.html.haml
+++ b/app/views/admin/projects/index.html.haml
@@ -1,5 +1,5 @@
 %h3.page_title
-  Projects (#{@projects.count})
+  Projects (#{Project.count})
   = link_to 'New Project', new_project_path, class: "btn small right"
 %br
 = form_tag admin_projects_path, method: :get, class: 'form-inline' do
diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml
index 1df4f590bc..87290abe7a 100644
--- a/app/views/admin/users/index.html.haml
+++ b/app/views/admin/users/index.html.haml
@@ -1,5 +1,5 @@
 %h3.page_title
-  Users (#{@admin_users.count})
+  Users
   = link_to 'New User', new_admin_user_path, class: "btn small right"
 %br
 
@@ -8,16 +8,21 @@
   = submit_tag "Search", class: "btn submit primary"
 %ul.nav.nav-tabs
   %li{class: "#{'active' unless params[:filter]}"}
-    = link_to "Active", admin_users_path
+    = link_to admin_users_path do
+      Active
+      %span.badge= User.active.count
   %li{class: "#{'active' if params[:filter] == "admins"}"}
     = link_to admin_users_path(filter: "admins") do
       Admins
+      %span.badge= User.admins.count
   %li{class: "#{'active' if params[:filter] == "blocked"}"}
     = link_to admin_users_path(filter: "blocked") do
       Blocked
+      %span.badge= User.blocked.count
   %li{class: "#{'active' if params[:filter] == "wop"}"}
     = link_to admin_users_path(filter: "wop") do
       Without projects
+      %span.badge= User.without_projects.count
 
 %table
   %thead
diff --git a/db/fixtures/development/001_admin.rb b/db/fixtures/development/001_admin.rb
index fa8addbe19..fbe41e4d22 100644
--- a/db/fixtures/development/001_admin.rb
+++ b/db/fixtures/development/001_admin.rb
@@ -9,13 +9,3 @@ User.seed(:id, [
     admin: true,
   }
 ])
-
-
-Key.seed(:id, [
-  {
-    id: 1,
-    title: "Sample key",
-    key: "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",
-    user_id: 1,
-  }
-])
diff --git a/db/fixtures/development/002_project.rb b/db/fixtures/development/002_project.rb
index 4db11a878e..d145cc6254 100644
--- a/db/fixtures/development/002_project.rb
+++ b/db/fixtures/development/002_project.rb
@@ -1,14 +1,26 @@
 Group.seed(:id, [
+  { id: 99,  name: "GitLab", path: 'gitlab', owner_id: 1 },
   { id: 100, name: "Brightbox", path: 'brightbox', owner_id: 1 },
   { id: 101, name: "KDE", path: 'kde', owner_id: 1 },
 ])
 
 Project.seed(:id, [
+
+  # Global
   { id: 1, name: "Underscore.js", path: "underscore", owner_id: 1 },
   { id: 2, name: "Diaspora", path: "diaspora", owner_id: 1 },
+
+  # Brightbox
   { id: 3, namespace_id: 100, name: "Brightbox CLI", path: "brightbox-cli", owner_id: 1 },
   { id: 4, namespace_id: 100, name: "Puppet", path: "puppet", owner_id: 1 },
+
+  # KDE
   { id: 5, namespace_id: 101, name: "kdebase", path: "kdebase", owner_id: 1},
   { id: 6, namespace_id: 101, name: "kdelibs", path: "kdelibs", owner_id: 1},
   { id: 7, namespace_id: 101, name: "amarok",  path: "amarok",  owner_id: 1},
+
+  # GitLab
+  { id: 8,  namespace_id: 99, name: "gitlabhq", path: "gitlabhq", owner_id: 1},
+  { id: 9,  namespace_id: 99, name: "gitlab-ci",  path: "gitlab-ci",  owner_id: 1},
+  { id: 10, namespace_id: 99, name: "gitlab-recipes",  path: "gitlab-recipes",  owner_id: 1},
 ])
diff --git a/db/fixtures/development/003_users.rb b/db/fixtures/development/003_users.rb
index 25705f1b72..abcb025961 100644
--- a/db/fixtures/development/003_users.rb
+++ b/db/fixtures/development/003_users.rb
@@ -1,11 +1,15 @@
-User.seed(:id, [
-  { id: 2, username: Faker::Internet.user_name, name: Faker::Name.name, email: Faker::Internet.email},
-  { id: 3, username: Faker::Internet.user_name, name: Faker::Name.name, email: Faker::Internet.email},
-  { id: 4, username: Faker::Internet.user_name, name: Faker::Name.name, email: Faker::Internet.email},
-  { id: 5, username: Faker::Internet.user_name, name: Faker::Name.name, email: Faker::Internet.email},
-  { id: 6, username: Faker::Internet.user_name, name: Faker::Name.name, email: Faker::Internet.email},
-  { id: 7, username: Faker::Internet.user_name, name: Faker::Name.name, email: Faker::Internet.email},
-  { id: 8, username: Faker::Internet.user_name, name: Faker::Name.name, email: Faker::Internet.email},
-  { id: 9, username: Faker::Internet.user_name, name: Faker::Name.name, email: Faker::Internet.email}
-])
-
+Gitlab::Seeder.quiet do
+  (2..300).each  do |i|
+    begin
+      User.seed(:id, [{
+        id: i,
+        username: Faker::Internet.user_name,
+        name: Faker::Name.name,
+        email: Faker::Internet.email,
+      }])
+      print '.'
+    rescue ActiveRecord::RecordNotSaved
+      print 'F'
+    end
+  end
+end
diff --git a/db/fixtures/development/004_teams.rb b/db/fixtures/development/004_teams.rb
index 2752cb44e1..7a8f9139d3 100644
--- a/db/fixtures/development/004_teams.rb
+++ b/db/fixtures/development/004_teams.rb
@@ -1,24 +1,26 @@
 UsersProject.skip_callback(:save, :after, :update_repository)
 
-UsersProject.seed(:id, [
-  { :id => 1,  :project_id => 1, :user_id => 1, :project_access => UsersProject::MASTER },
-  { :id => 2,  :project_id => 1, :user_id => 2, :project_access => UsersProject::REPORTER},
-  { :id => 3,  :project_id => 1, :user_id => 3, :project_access => UsersProject::REPORTER},
-  { :id => 4,  :project_id => 1, :user_id => 4, :project_access => UsersProject::REPORTER},
-  { :id => 5,  :project_id => 1, :user_id => 5, :project_access => UsersProject::REPORTER},
-
-  { :id => 6,  :project_id => 2, :user_id => 1, :project_access => UsersProject::MASTER },
-  { :id => 7,  :project_id => 2, :user_id => 2, :project_access => UsersProject::REPORTER},
-  { :id => 8,  :project_id => 2, :user_id => 3, :project_access => UsersProject::REPORTER},
-  { :id => 9,  :project_id => 2, :user_id => 4, :project_access => UsersProject::MASTER},
-  { :id => 11, :project_id => 2, :user_id => 5, :project_access => UsersProject::MASTER},
-
-  { :id => 12, :project_id => 3, :user_id => 1, :project_access => UsersProject::MASTER },
-  { :id => 13, :project_id => 3, :user_id => 2, :project_access => UsersProject::REPORTER},
-  { :id => 14, :project_id => 3, :user_id => 3, :project_access => UsersProject::MASTER},
-  { :id => 15, :project_id => 3, :user_id => 4, :project_access => UsersProject::REPORTER},
-  { :id => 16, :project_id => 3, :user_id => 5, :project_access => UsersProject::MASTER}
-])
+Gitlab::Seeder.quiet do
+
+  (1..300).each  do |i|
+    # Random Project
+    project = Project.scoped.sample
+
+    # Random user
+    user = User.not_in_project(project).sample
+
+    next unless user
+
+    UsersProject.seed(:id, [{
+      id: i,
+      project_id: project.id,
+      user_id: user.id,
+      project_access: UsersProject.access_roles.values.sample
+    }])
+
+    print('.')
+  end
+end
 
 UsersProject.set_callback(:save, :after, :update_repository)
 
diff --git a/db/fixtures/development/006_wall.rb b/db/fixtures/development/006_wall.rb
index a9fb66dda6..c4e304cc21 100644
--- a/db/fixtures/development/006_wall.rb
+++ b/db/fixtures/development/006_wall.rb
@@ -1,16 +1,18 @@
 Gitlab::Seeder.quiet do
   (1..300).each  do |i|
     # Random Project
-    project_id = rand(2) + 1
-    project = Project.find(project_id)
+    project = Project.all.sample
 
     # Random user
     user = project.users.sample
+
+    next unless user
+
     user_id = user.id
 
     Note.seed(:id, [{
       id: i,
-      project_id: project_id,
+      project_id: project.id,
       author_id: user_id,
       note: Faker::Lorem.sentence(6)
     }])
diff --git a/db/fixtures/development/007_issues.rb b/db/fixtures/development/007_issues.rb
index 98e32fccc3..8978db4742 100644
--- a/db/fixtures/development/007_issues.rb
+++ b/db/fixtures/development/007_issues.rb
@@ -1,17 +1,19 @@
 Gitlab::Seeder.quiet do
   (1..300).each  do |i|
     # Random Project
-    project_id = rand(2) + 1
-    project = Project.find(project_id)
+    project = Project.all.sample
 
     # Random user
     user = project.users.sample
+
+    next unless user
+
     user_id = user.id
     IssueObserver.current_user = user
 
     Issue.seed(:id, [{
       id: i,
-      project_id: project_id,
+      project_id: project.id,
       author_id: user_id,
       assignee_id: user_id,
       closed: [true, false].sample,
diff --git a/db/fixtures/development/008_merge_requests.rb b/db/fixtures/development/008_merge_requests.rb
index 698c55ad95..9904b4a150 100644
--- a/db/fixtures/development/008_merge_requests.rb
+++ b/db/fixtures/development/008_merge_requests.rb
@@ -1,19 +1,20 @@
 Gitlab::Seeder.quiet do
   (1..300).each  do |i|
     # Random Project
-    project_id = rand(2) + 1
-    project = Project.find(project_id)
+    project = Project.all.sample
 
     # Random user
     user = project.users.sample
+
+    next unless user
+
     user_id = user.id
     MergeRequestObserver.current_user = user
-
     MergeRequest.seed(:id, [{
       id: i,
       source_branch: 'master',
       target_branch: 'feature',
-      project_id: project_id,
+      project_id: project.id,
       author_id: user_id,
       assignee_id: user_id,
       closed: [true, false].sample,
diff --git a/db/fixtures/development/009_source_code.rb b/db/fixtures/development/009_source_code.rb
index 6b9b6584a5..d3fe69c6f5 100644
--- a/db/fixtures/development/009_source_code.rb
+++ b/db/fixtures/development/009_source_code.rb
@@ -1,16 +1,18 @@
-root = Gitlab.config.git_base_path
+root = Gitlab.config.gitolite.repos_path
 
 projects = [
-  { path: 'underscore.git', git: 'https://github.com/documentcloud/underscore.git' },
-  { path: 'diaspora.git', git: 'https://github.com/diaspora/diaspora.git' },
+  { path: 'underscore.git',              git: 'https://github.com/documentcloud/underscore.git' },
+  { path: 'diaspora.git',                git: 'https://github.com/diaspora/diaspora.git' },
   { path: 'brightbox/brightbox-cli.git', git: 'https://github.com/brightbox/brightbox-cli.git' },
-  { path: 'brightbox/puppet.git', git: 'https://github.com/brightbox/puppet.git' },
+  { path: 'brightbox/puppet.git',        git: 'https://github.com/brightbox/puppet.git' },
+  { path: 'gitlab/gitlabhq.git',        git: 'https://github.com/gitlabhq/gitlabhq.git' },
+  { path: 'gitlab/gitlab-ci.git',       git: 'https://github.com/gitlabhq/gitlab-ci.git' },
+  { path: 'gitlab/gitlab-recipres.git', git: 'https://github.com/gitlabhq/gitlab-recipes.git' },
 ]
 
 projects.each do |project|
   project_path = File.join(root, project[:path])
 
-
   next if File.exists?(project_path)
 
   cmds = [
diff --git a/db/fixtures/development/010_keys.rb b/db/fixtures/development/010_keys.rb
new file mode 100644
index 0000000000..d17e73db56
--- /dev/null
+++ b/db/fixtures/development/010_keys.rb
@@ -0,0 +1,8 @@
+Key.seed(:id, [
+  {
+    id: 1,
+    title: "Sample key",
+    key: "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",
+    user_id: 1,
+  }
+])
diff --git a/lib/support/truncate_repositories.sh b/lib/support/truncate_repositories.sh
new file mode 100755
index 0000000000..3b14e2ee36
--- /dev/null
+++ b/lib/support/truncate_repositories.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+echo "Danger!!! Data Loss"
+while true; do
+  read -p "Do you wish to all directories except gitolite-admin.git from /home/git/repositories/ (y/n) ?:  " yn
+  case $yn in
+    [Yy]* ) sh -c "find /home/git/repositories/. -maxdepth 1  -not -name 'gitolite-admin.git' -not -name '.' | xargs sudo rm -rf"; break;;
+    [Nn]* ) exit;;
+    * ) echo "Please answer yes or no.";;
+  esac
+done
-- 
2.30.9