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 74 grouped_options_for_select(options, @ref || @project.default_branch)
75 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 89 def search_autocomplete_source
78 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 14 def users
15 15 User.joins(:users_projects).where(users_projects: {project_id: project_ids}).uniq
16 16 end
  17 +
  18 + def human_name
  19 + name
  20 + end
17 21 end
... ...
app/models/namespace.rb
... ... @@ -17,4 +17,8 @@ class Namespace < ActiveRecord::Base
17 17 def to_param
18 18 code
19 19 end
  20 +
  21 + def human_name
  22 + owner_name
  23 + end
20 24 end
... ...
app/models/project.rb
... ... @@ -81,10 +81,13 @@ class Project < ActiveRecord::Base
81 81 end
82 82  
83 83 def create_by_user(params, user)
  84 + namespace_id = params.delete(:namespace_id) || namespace.try(:id)
  85 +
84 86 project = Project.new params
85 87  
86 88 Project.transaction do
87 89 project.owner = user
  90 + project.namespace_id = namespace_id
88 91 project.save!
89 92  
90 93 # Add user as project master
... ...
app/models/user.rb
... ... @@ -38,13 +38,16 @@ class User < ActiveRecord::Base
38 38 devise :database_authenticatable, :token_authenticatable, :lockable,
39 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 42 :skype, :linkedin, :twitter, :dark_scheme, :theme_id, :force_random_password,
43 43 :extern_uid, :provider, :as => [:default, :admin]
44 44 attr_accessible :projects_limit, :as => :admin
45 45  
46 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 51 has_many :keys, dependent: :destroy
49 52 has_many :projects, through: :users_projects
50 53 has_many :users_projects, dependent: :destroy
... ... @@ -112,4 +115,11 @@ class User < ActiveRecord::Base
112 115 self.password = self.password_confirmation = Devise.friendly_token.first(8)
113 116 end
114 117 end
  118 +
  119 + def namespaces
  120 + namespaces = []
  121 + namespaces << self.namespace
  122 + namespaces = namespaces + Group.all if admin
  123 + namespaces
  124 + end
115 125 end
... ...
app/views/profile/account.html.haml
... ... @@ -8,6 +8,7 @@
8 8 = link_to authbutton(provider, 32), omniauth_authorize_path(User, provider)
9 9  
10 10  
  11 +
11 12 %fieldset
12 13 %legend
13 14 Private token
... ... @@ -44,11 +45,25 @@
44 45 .input= f.password_field :password
45 46 .clearfix
46 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 12 %hr
13 13 %div.adv_settings
14 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 21 .clearfix
16 22 = f.label :path do
17 23 Git Clone
... ...
config/routes.rb
... ... @@ -49,7 +49,7 @@ Gitlab::Application.routes.draw do
49 49 delete :remove_project
50 50 end
51 51 end
52   - resources :projects, constraints: { id: /[^\/]+/ } do
  52 + resources :projects, constraints: { id: /[a-zA-Z.\/0-9_\-]+/ } do
53 53 member do
54 54 get :team
55 55 put :team_update
... ...
db/schema.rb
... ... @@ -11,7 +11,7 @@
11 11 #
12 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 16 create_table "events", :force => true do |t|
17 17 t.string "target_type"
... ... @@ -195,6 +195,7 @@ ActiveRecord::Schema.define(:version =&gt; 20121122150932) do
195 195 t.datetime "locked_at"
196 196 t.string "extern_uid"
197 197 t.string "provider"
  198 + t.string "username"
198 199 end
199 200  
200 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 36  
37 37 describe User do
38 38 describe "Associations" do
  39 + it { should have_one(:namespace) }
39 40 it { should have_many(:users_projects).dependent(:destroy) }
40 41 it { should have_many(:projects) }
41 42 it { should have_many(:my_own_projects).class_name('Project') }
... ...