Commit 2b683b0d0bf90c84b33ec4ed5c70e3bc787094e2

Authored by Dmitriy Zaporozhets
1 parent 96105e21

Ability to create project with namespace

app/helpers/application_helper.rb
@@ -74,6 +74,18 @@ module ApplicationHelper @@ -74,6 +74,18 @@ module ApplicationHelper
74 grouped_options_for_select(options, @ref || @project.default_branch) 74 grouped_options_for_select(options, @ref || @project.default_branch)
75 end 75 end
76 76
  77 + def namespaces_options
  78 + groups = current_user.namespaces.select {|n| n.type == 'Group'}
  79 + users = current_user.namespaces.reject {|n| n.type == 'Group'}
  80 +
  81 + options = [
  82 + ["Groups", groups.map {|g| [g.human_name, g.id]} ],
  83 + [ "Users", users.map {|u| [u.human_name, u.id]} ]
  84 + ]
  85 +
  86 + grouped_options_for_select(options, current_user.namespace.id)
  87 + end
  88 +
77 def search_autocomplete_source 89 def search_autocomplete_source
78 projects = current_user.projects.map{ |p| { label: p.name, url: project_path(p) } } 90 projects = current_user.projects.map{ |p| { label: p.name, url: project_path(p) } }
79 91
app/models/group.rb
@@ -14,4 +14,8 @@ class Group < Namespace @@ -14,4 +14,8 @@ class Group < Namespace
14 def users 14 def users
15 User.joins(:users_projects).where(users_projects: {project_id: project_ids}).uniq 15 User.joins(:users_projects).where(users_projects: {project_id: project_ids}).uniq
16 end 16 end
  17 +
  18 + def human_name
  19 + name
  20 + end
17 end 21 end
app/models/namespace.rb
@@ -17,4 +17,8 @@ class Namespace < ActiveRecord::Base @@ -17,4 +17,8 @@ class Namespace < ActiveRecord::Base
17 def to_param 17 def to_param
18 code 18 code
19 end 19 end
  20 +
  21 + def human_name
  22 + owner_name
  23 + end
20 end 24 end
app/models/project.rb
@@ -81,10 +81,13 @@ class Project < ActiveRecord::Base @@ -81,10 +81,13 @@ class Project < ActiveRecord::Base
81 end 81 end
82 82
83 def create_by_user(params, user) 83 def create_by_user(params, user)
  84 + namespace_id = params.delete(:namespace_id) || namespace.try(:id)
  85 +
84 project = Project.new params 86 project = Project.new params
85 87
86 Project.transaction do 88 Project.transaction do
87 project.owner = user 89 project.owner = user
  90 + project.namespace_id = namespace_id
88 project.save! 91 project.save!
89 92
90 # Add user as project master 93 # Add user as project master
app/models/user.rb
@@ -38,13 +38,16 @@ class User < ActiveRecord::Base @@ -38,13 +38,16 @@ class User < ActiveRecord::Base
38 devise :database_authenticatable, :token_authenticatable, :lockable, 38 devise :database_authenticatable, :token_authenticatable, :lockable,
39 :recoverable, :rememberable, :trackable, :validatable, :omniauthable 39 :recoverable, :rememberable, :trackable, :validatable, :omniauthable
40 40
41 - attr_accessible :email, :password, :password_confirmation, :remember_me, :bio, :name, 41 + attr_accessible :email, :password, :password_confirmation, :remember_me, :bio, :name, :username,
42 :skype, :linkedin, :twitter, :dark_scheme, :theme_id, :force_random_password, 42 :skype, :linkedin, :twitter, :dark_scheme, :theme_id, :force_random_password,
43 :extern_uid, :provider, :as => [:default, :admin] 43 :extern_uid, :provider, :as => [:default, :admin]
44 attr_accessible :projects_limit, :as => :admin 44 attr_accessible :projects_limit, :as => :admin
45 45
46 attr_accessor :force_random_password 46 attr_accessor :force_random_password
47 47
  48 + # Namespace for personal projects
  49 + has_one :namespace, class_name: "Namespace", foreign_key: :owner_id, conditions: 'type IS NULL', dependent: :destroy
  50 +
48 has_many :keys, dependent: :destroy 51 has_many :keys, dependent: :destroy
49 has_many :projects, through: :users_projects 52 has_many :projects, through: :users_projects
50 has_many :users_projects, dependent: :destroy 53 has_many :users_projects, dependent: :destroy
@@ -112,4 +115,11 @@ class User < ActiveRecord::Base @@ -112,4 +115,11 @@ class User < ActiveRecord::Base
112 self.password = self.password_confirmation = Devise.friendly_token.first(8) 115 self.password = self.password_confirmation = Devise.friendly_token.first(8)
113 end 116 end
114 end 117 end
  118 +
  119 + def namespaces
  120 + namespaces = []
  121 + namespaces << self.namespace
  122 + namespaces = namespaces + Group.all if admin
  123 + namespaces
  124 + end
115 end 125 end
app/views/profile/account.html.haml
@@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
8 = link_to authbutton(provider, 32), omniauth_authorize_path(User, provider) 8 = link_to authbutton(provider, 32), omniauth_authorize_path(User, provider)
9 9
10 10
  11 +
11 %fieldset 12 %fieldset
12 %legend 13 %legend
13 Private token 14 Private token
@@ -44,11 +45,25 @@ @@ -44,11 +45,25 @@
44 .input= f.password_field :password 45 .input= f.password_field :password
45 .clearfix 46 .clearfix
46 = f.label :password_confirmation 47 = f.label :password_confirmation
47 - .input= f.password_field :password_confirmation  
48 - .actions  
49 - = f.submit 'Save', class: "btn save-btn" 48 + .input
  49 + = f.password_field :password_confirmation
  50 + .clearfix
  51 + .input
  52 + = f.submit 'Save password', class: "btn save-btn"
50 53
51 54
52 55
  56 +%fieldset
  57 + %legend
  58 + Username
  59 + %small.right
  60 + Changing your username can have unintended side effects!
  61 + = form_for @user, url: profile_update_path, method: :put do |f|
  62 + .padded
  63 + = f.label :username
  64 + .input
  65 + = f.text_field :username
  66 + .input
  67 + = f.submit 'Save username', class: "btn save-btn"
53 68
54 69
app/views/projects/_new_form.html.haml
@@ -12,6 +12,12 @@ @@ -12,6 +12,12 @@
12 %hr 12 %hr
13 %div.adv_settings 13 %div.adv_settings
14 %h6 Advanced settings: 14 %h6 Advanced settings:
  15 + - if current_user.namespaces.size > 1
  16 + .clearfix
  17 + = f.label :namespace_id do
  18 + Namespace
  19 + .input
  20 + = f.select :namespace_id, namespaces_options, {}, {class: 'chosen'}
15 .clearfix 21 .clearfix
16 = f.label :path do 22 = f.label :path do
17 Git Clone 23 Git Clone
config/routes.rb
@@ -49,7 +49,7 @@ Gitlab::Application.routes.draw do @@ -49,7 +49,7 @@ Gitlab::Application.routes.draw do
49 delete :remove_project 49 delete :remove_project
50 end 50 end
51 end 51 end
52 - resources :projects, constraints: { id: /[^\/]+/ } do 52 + resources :projects, constraints: { id: /[a-zA-Z.\/0-9_\-]+/ } do
53 member do 53 member do
54 get :team 54 get :team
55 put :team_update 55 put :team_update
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 # 11 #
12 # It's strongly recommended to check this file into your version control system. 12 # It's strongly recommended to check this file into your version control system.
13 13
14 -ActiveRecord::Schema.define(:version => 20121122150932) do 14 +ActiveRecord::Schema.define(:version => 20121123104937) do
15 15
16 create_table "events", :force => true do |t| 16 create_table "events", :force => true do |t|
17 t.string "target_type" 17 t.string "target_type"
@@ -195,6 +195,7 @@ ActiveRecord::Schema.define(:version =&gt; 20121122150932) do @@ -195,6 +195,7 @@ ActiveRecord::Schema.define(:version =&gt; 20121122150932) do
195 t.datetime "locked_at" 195 t.datetime "locked_at"
196 t.string "extern_uid" 196 t.string "extern_uid"
197 t.string "provider" 197 t.string "provider"
  198 + t.string "username"
198 end 199 end
199 200
200 add_index "users", ["email"], :name => "index_users_on_email", :unique => true 201 add_index "users", ["email"], :name => "index_users_on_email", :unique => true
spec/models/user_spec.rb
@@ -36,6 +36,7 @@ require &#39;spec_helper&#39; @@ -36,6 +36,7 @@ require &#39;spec_helper&#39;
36 36
37 describe User do 37 describe User do
38 describe "Associations" do 38 describe "Associations" do
  39 + it { should have_one(:namespace) }
39 it { should have_many(:users_projects).dependent(:destroy) } 40 it { should have_many(:users_projects).dependent(:destroy) }
40 it { should have_many(:projects) } 41 it { should have_many(:projects) }
41 it { should have_many(:my_own_projects).class_name('Project') } 42 it { should have_many(:my_own_projects).class_name('Project') }