Commit ab9d02365181df373beffbe7732b36b9b3f7a307

Authored by Dmitriy Zaporozhets
1 parent f17ddeb3

Create dir with namespace. Create namespace with user

app/models/namespace.rb
@@ -10,6 +10,8 @@ class Namespace < ActiveRecord::Base @@ -10,6 +10,8 @@ class Namespace < ActiveRecord::Base
10 10
11 delegate :name, to: :owner, allow_nil: true, prefix: true 11 delegate :name, to: :owner, allow_nil: true, prefix: true
12 12
  13 + after_save :ensure_dir_exist
  14 +
13 scope :root, where('type IS NULL') 15 scope :root, where('type IS NULL')
14 16
15 def self.search query 17 def self.search query
@@ -23,4 +25,9 @@ class Namespace < ActiveRecord::Base @@ -23,4 +25,9 @@ class Namespace < ActiveRecord::Base
23 def human_name 25 def human_name
24 owner_name 26 owner_name
25 end 27 end
  28 +
  29 + def ensure_dir_exist
  30 + namespace_dir_path = File.join(Gitlab.config.git_base_path, code)
  31 + Dir.mkdir(namespace_dir_path) unless File.exists?(namespace_dir_path)
  32 + end
26 end 33 end
app/models/project.rb
@@ -67,6 +67,7 @@ class Project < ActiveRecord::Base @@ -67,6 +67,7 @@ class Project < ActiveRecord::Base
67 message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" } 67 message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
68 validates :issues_enabled, :wall_enabled, :merge_requests_enabled, 68 validates :issues_enabled, :wall_enabled, :merge_requests_enabled,
69 :wiki_enabled, inclusion: { in: [true, false] } 69 :wiki_enabled, inclusion: { in: [true, false] }
  70 +
70 validate :check_limit, :repo_name 71 validate :check_limit, :repo_name
71 72
72 # Scopes 73 # Scopes
@@ -89,6 +90,12 @@ class Project < ActiveRecord::Base @@ -89,6 +90,12 @@ class Project < ActiveRecord::Base
89 project = Project.new params 90 project = Project.new params
90 91
91 Project.transaction do 92 Project.transaction do
  93 +
  94 + # Build gitlab-hq code from GitLab HQ name
  95 + #
  96 + slug = project.name.dup.parameterize
  97 + project.code = project.path = slug
  98 +
92 project.owner = user 99 project.owner = user
93 project.namespace_id = namespace_id 100 project.namespace_id = namespace_id
94 project.save! 101 project.save!
app/models/user.rb
@@ -63,11 +63,14 @@ class User < ActiveRecord::Base @@ -63,11 +63,14 @@ class User < ActiveRecord::Base
63 validates :bio, length: { within: 0..255 } 63 validates :bio, length: { within: 0..255 }
64 validates :extern_uid, :allow_blank => true, :uniqueness => {:scope => :provider} 64 validates :extern_uid, :allow_blank => true, :uniqueness => {:scope => :provider}
65 validates :projects_limit, presence: true, numericality: {greater_than_or_equal_to: 0} 65 validates :projects_limit, presence: true, numericality: {greater_than_or_equal_to: 0}
  66 + validates :username, presence: true
66 67
67 before_validation :generate_password, on: :create 68 before_validation :generate_password, on: :create
68 before_save :ensure_authentication_token 69 before_save :ensure_authentication_token
69 alias_attribute :private_token, :authentication_token 70 alias_attribute :private_token, :authentication_token
70 71
  72 + delegate :code, to: :namespace, allow_nil: true, prefix: true
  73 +
71 # Scopes 74 # Scopes
72 scope :not_in_project, ->(project) { where("id not in (:ids)", ids: project.users.map(&:id) ) } 75 scope :not_in_project, ->(project) { where("id not in (:ids)", ids: project.users.map(&:id) ) }
73 scope :admins, where(admin: true) 76 scope :admins, where(admin: true)
@@ -122,4 +125,8 @@ class User < ActiveRecord::Base @@ -122,4 +125,8 @@ class User < ActiveRecord::Base
122 namespaces = namespaces + Group.all if admin 125 namespaces = namespaces + Group.all if admin
123 namespaces 126 namespaces
124 end 127 end
  128 +
  129 + def several_namespaces?
  130 + namespaces.size > 1
  131 + end
125 end 132 end
app/observers/user_observer.rb
1 class UserObserver < ActiveRecord::Observer 1 class UserObserver < ActiveRecord::Observer
2 def after_create(user) 2 def after_create(user)
  3 + user.create_namespace(code: user.username, name: user.name)
  4 +
3 log_info("User \"#{user.name}\" (#{user.email}) was created") 5 log_info("User \"#{user.name}\" (#{user.email}) was created")
4 6
5 Notify.new_user_email(user.id, user.password).deliver 7 Notify.new_user_email(user.id, user.password).deliver
@@ -10,7 +12,7 @@ class UserObserver &lt; ActiveRecord::Observer @@ -10,7 +12,7 @@ class UserObserver &lt; ActiveRecord::Observer
10 end 12 end
11 13
12 def after_save user 14 def after_save user
13 - if user.username_changed? 15 + if user.username_changed? and user.namespace
14 user.namespace.update_attributes(code: user.username) 16 user.namespace.update_attributes(code: user.username)
15 end 17 end
16 end 18 end
app/views/admin/users/_form.html.haml
@@ -16,6 +16,11 @@ @@ -16,6 +16,11 @@
16 = f.text_field :name 16 = f.text_field :name
17 %span.help-inline * required 17 %span.help-inline * required
18 .clearfix 18 .clearfix
  19 + = f.label :username
  20 + .input
  21 + = f.text_field :username
  22 + %span.help-inline * required
  23 + .clearfix
19 = f.label :email 24 = f.label :email
20 .input 25 .input
21 = f.text_field :email 26 = f.text_field :email
@@ -26,11 +31,11 @@ @@ -26,11 +31,11 @@
26 = f.label :force_random_password do 31 = f.label :force_random_password do
27 %span Generate random password 32 %span Generate random password
28 .input= f.check_box :force_random_password, {}, true, nil 33 .input= f.check_box :force_random_password, {}, true, nil
29 - 34 +
30 %div.password-fields 35 %div.password-fields
31 .clearfix 36 .clearfix
32 = f.label :password 37 = f.label :password
33 - .input= f.password_field :password, disabled: f.object.force_random_password 38 + .input= f.password_field :password, disabled: f.object.force_random_password
34 .clearfix 39 .clearfix
35 = f.label :password_confirmation 40 = f.label :password_confirmation
36 .input= f.password_field :password_confirmation, disabled: f.object.force_random_password 41 .input= f.password_field :password_confirmation, disabled: f.object.force_random_password
app/views/projects/_new_form.html.haml
@@ -9,27 +9,12 @@ @@ -9,27 +9,12 @@
9 = f.text_field :name, placeholder: "Example Project", class: "xxlarge" 9 = f.text_field :name, placeholder: "Example Project", class: "xxlarge"
10 = f.submit 'Create project', class: "btn primary project-submit" 10 = f.submit 'Create project', class: "btn primary project-submit"
11 11
12 - %hr  
13 - %div.adv_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'}  
21 - .clearfix  
22 - = f.label :path do  
23 - Git Clone  
24 - .input  
25 - .input-prepend  
26 - %span.add-on= Gitlab.config.ssh_path  
27 - = f.text_field :path, placeholder: "example_project", disabled: !@project.new_record?  
28 - %span.add-on= ".git" 12 + - if current_user.several_namespaces?
29 .clearfix 13 .clearfix
30 - = f.label :code do  
31 - URL 14 + = f.label :namespace_id do
  15 + %span.cgray Namespace
32 .input 16 .input
33 - .input-prepend  
34 - %span.add-on= web_app_url  
35 - = f.text_field :code, placeholder: "example" 17 + = f.select :namespace_id, namespaces_options, {}, {class: 'chosen'}
  18 + %hr
  19 + %p.padded
  20 + All created project are private. You choose who can see project and commit to repository.