OSDN Git Service

Ability to create project with namespace
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Fri, 23 Nov 2012 04:11:09 +0000 (07:11 +0300)
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Fri, 23 Nov 2012 04:11:09 +0000 (07:11 +0300)
app/helpers/application_helper.rb
app/models/group.rb
app/models/namespace.rb
app/models/project.rb
app/models/user.rb
app/views/profile/account.html.haml
app/views/projects/_new_form.html.haml
config/routes.rb
db/schema.rb
spec/models/user_spec.rb

index cba34c9..8f20660 100644 (file)
@@ -74,6 +74,18 @@ module ApplicationHelper
     grouped_options_for_select(options, @ref || @project.default_branch)
   end
 
+  def namespaces_options
+    groups = current_user.namespaces.select {|n| n.type == 'Group'}
+    users = current_user.namespaces.reject {|n| n.type == 'Group'}
+
+    options = [
+      ["Groups", groups.map {|g| [g.human_name, g.id]} ],
+      [ "Users", users.map {|u| [u.human_name, u.id]} ]
+    ]
+
+    grouped_options_for_select(options, current_user.namespace.id)
+  end
+
   def search_autocomplete_source
     projects = current_user.projects.map{ |p| { label: p.name, url: project_path(p) } }
 
index 683606f..ab7b1b8 100644 (file)
@@ -14,4 +14,8 @@ class Group < Namespace
   def users
     User.joins(:users_projects).where(users_projects: {project_id: project_ids}).uniq
   end
+
+  def human_name
+    name
+  end
 end
index bdf624e..2fa8b06 100644 (file)
@@ -17,4 +17,8 @@ class Namespace < ActiveRecord::Base
   def to_param
     code
   end
+
+  def human_name
+    owner_name
+  end
 end
index 479a2ac..eb3b1b3 100644 (file)
@@ -81,10 +81,13 @@ class Project < ActiveRecord::Base
     end
 
     def create_by_user(params, user)
+      namespace_id = params.delete(:namespace_id) || namespace.try(:id)
+
       project = Project.new params
 
       Project.transaction do
         project.owner = user
+        project.namespace_id = namespace_id
         project.save!
 
         # Add user as project master
index 6d539c1..cd1dd20 100644 (file)
@@ -38,13 +38,16 @@ class User < ActiveRecord::Base
   devise :database_authenticatable, :token_authenticatable, :lockable,
          :recoverable, :rememberable, :trackable, :validatable, :omniauthable
 
-  attr_accessible :email, :password, :password_confirmation, :remember_me, :bio, :name,
+  attr_accessible :email, :password, :password_confirmation, :remember_me, :bio, :name, :username,
                   :skype, :linkedin, :twitter, :dark_scheme, :theme_id, :force_random_password,
                   :extern_uid, :provider, :as => [:default, :admin]
   attr_accessible :projects_limit, :as => :admin
 
   attr_accessor :force_random_password
 
+  # Namespace for personal projects
+  has_one :namespace, class_name: "Namespace", foreign_key: :owner_id, conditions: 'type IS NULL', dependent: :destroy
+
   has_many :keys, dependent: :destroy
   has_many :projects, through: :users_projects
   has_many :users_projects, dependent: :destroy
@@ -112,4 +115,11 @@ class User < ActiveRecord::Base
       self.password = self.password_confirmation = Devise.friendly_token.first(8)
     end
   end
+
+  def namespaces
+    namespaces = []
+    namespaces << self.namespace
+    namespaces = namespaces + Group.all if admin
+    namespaces
+  end
 end
index 1e3a8b1..21a5f5a 100644 (file)
@@ -8,6 +8,7 @@
           = link_to authbutton(provider, 32), omniauth_authorize_path(User, provider)
 
 
+
 %fieldset
   %legend
     Private token
         .input= f.password_field :password
       .clearfix
         = f.label :password_confirmation
-        .input= f.password_field :password_confirmation
-    .actions
-      = f.submit 'Save', class: "btn save-btn"
+        .input
+          = f.password_field :password_confirmation
+      .clearfix
+        .input
+          = f.submit 'Save password', class: "btn save-btn"
 
 
 
+%fieldset
+  %legend
+    Username
+    %small.right
+      Changing your username can have unintended side effects!
+  = form_for @user, url: profile_update_path,  method: :put do |f|
+    .padded
+      = f.label :username
+      .input
+        = f.text_field :username
+      .input
+        = f.submit 'Save username', class: "btn save-btn"
 
 
index e6d5e93..978352e 100644 (file)
   %hr
   %div.adv_settings
     %h6 Advanced settings:
+    - if current_user.namespaces.size > 1
+      .clearfix
+        = f.label :namespace_id do
+          Namespace
+        .input
+          = f.select :namespace_id, namespaces_options, {}, {class: 'chosen'}
     .clearfix
       = f.label :path do
         Git Clone
index 42de89d..192f488 100644 (file)
@@ -49,7 +49,7 @@ Gitlab::Application.routes.draw do
         delete :remove_project
       end
     end
-    resources :projects, constraints: { id: /[^\/]+/ } do
+    resources :projects, constraints: { id: /[a-zA-Z.\/0-9_\-]+/ } do
       member do
         get :team
         put :team_update
index 90b027d..8ce3df0 100644 (file)
@@ -11,7 +11,7 @@
 #
 # It's strongly recommended to check this file into your version control system.
 
-ActiveRecord::Schema.define(:version => 20121122150932) do
+ActiveRecord::Schema.define(:version => 20121123104937) do
 
   create_table "events", :force => true do |t|
     t.string   "target_type"
@@ -195,6 +195,7 @@ ActiveRecord::Schema.define(:version => 20121122150932) do
     t.datetime "locked_at"
     t.string   "extern_uid"
     t.string   "provider"
+    t.string   "username"
   end
 
   add_index "users", ["email"], :name => "index_users_on_email", :unique => true
index 4ac699b..3a87499 100644 (file)
@@ -36,6 +36,7 @@ require 'spec_helper'
 
 describe User do
   describe "Associations" do
+    it { should have_one(:namespace) }
     it { should have_many(:users_projects).dependent(:destroy) }
     it { should have_many(:projects) }
     it { should have_many(:my_own_projects).class_name('Project') }