OSDN Git Service

add ability to change namespace from project edit page
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Sat, 24 Nov 2012 20:00:30 +0000 (22:00 +0200)
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Sat, 24 Nov 2012 20:00:30 +0000 (22:00 +0200)
app/controllers/application_controller.rb
app/controllers/groups_controller.rb
app/controllers/projects_controller.rb
app/models/ability.rb
app/models/project.rb
app/views/groups/_projects.html.haml
app/views/projects/_form.html.haml
app/views/projects/_new_form.html.haml
app/views/projects/update.js.haml

index 847523d..2be9a54 100644 (file)
@@ -64,9 +64,8 @@ class ApplicationController < ActionController::Base
 
   def project
     id = params[:project_id] || params[:id]
-    id = id.split("/") if id.include?("/")
 
-    @project ||= current_user.projects.find_by_path(id)
+    @project ||= current_user.projects.find_with_namespace(id)
     @project || render_404
   end
 
index 07f6130..c969f41 100644 (file)
@@ -4,6 +4,7 @@ class GroupsController < ApplicationController
 
   before_filter :group
   before_filter :projects
+  before_filter :add_project_abilities
 
   def show
     @events = Event.in_projects(project_ids).limit(20).offset(params[:offset] || 0)
index 7208007..1a402ef 100644 (file)
@@ -34,8 +34,16 @@ class ProjectsController < ProjectResourceController
   end
 
   def update
+    namespace_id = params[:project].delete(:namespace_id)
+
+    if namespace_id
+      namespace = Namespace.find(namespace_id)
+      project.transfer(namespace)
+    end
+
     respond_to do |format|
       if project.update_attributes(params[:project])
+        flash[:notice] = 'Project was successfully updated.'
         format.html { redirect_to edit_project_path(project), notice: 'Project was successfully updated.' }
         format.js
       else
index c3a212f..e55e770 100644 (file)
@@ -7,6 +7,7 @@ class Ability
       when "Note" then note_abilities(object, subject)
       when "Snippet" then snippet_abilities(object, subject)
       when "MergeRequest" then merge_request_abilities(object, subject)
+      when "Group" then group_abilities(object, subject)
       else []
       end
     end
@@ -61,6 +62,16 @@ class Ability
       rules.flatten
     end
 
+    def group_abilities user, group
+      rules = []
+
+      rules << [
+        :manage_group
+      ] if group.owner == user
+
+      rules.flatten
+    end
+
     [:issue, :note, :snippet, :merge_request].each do |name|
       define_method "#{name}_abilities" do |user, subject|
         if subject.author == user
index ad8d829..956ab2a 100644 (file)
@@ -84,6 +84,16 @@ class Project < ActiveRecord::Base
       where("projects.name LIKE :query OR projects.path LIKE :query", query: "%#{query}%")
     end
 
+    def find_with_namespace(id)
+      if id.include?("/")
+        id = id.split("/")
+        namespace_id = Namespace.find_by_path(id.first).id
+        where(namespace_id: namespace_id).find_by_path(id.last)
+      else
+        find_by_path(id)
+      end
+    end
+
     def create_by_user(params, user)
       namespace_id = params.delete(:namespace_id)
       namespace_id ||= user.namespace.try(:id)
index b565dad..6425a2e 100644 (file)
@@ -3,6 +3,11 @@
     Projects
     %small
       (#{projects.count})
+    - if can? current_user, :manage_group, @group
+      %span.right
+        = link_to new_project_path(namespace_id: @group.id), class: "btn very_small info" do
+          %i.icon-plus
+          New Project
   %ul.unstyled
     - projects.each do |project|
       %li.wll
index 68b9e78..fe926ad 100644 (file)
@@ -9,41 +9,45 @@
       Project name is
     .input
       = f.text_field :name, placeholder: "Example Project", class: "xxlarge"
-
   %fieldset
     %legend  Advanced settings:
-    .clearfix
+    .control-group
       = f.label :path do
         Path
-      .input
-        .input-prepend
-          %strong
-            = text_field_tag :ppath, @project.path_to_repo, class: "xlarge", disabled: true
-
-    - unless @project.new_record? || @project.heads.empty?
+      .controls
+        = text_field_tag :ppath, @project.path_to_repo, class: "xlarge", disabled: true
+
+    .control-group
+      = f.label :namespace_id do
+        %span Namespace
+      .controls
+        = f.select :namespace_id, namespaces_options(@project.namespace_id), {}, {class: 'chosen'}
+        &nbsp;
+        %span.cred Be careful. Changing project namespace can have unintended side effects
+
+    - unless @project.heads.empty?
       .clearfix
         = f.label :default_branch, "Default Branch"
         .input= f.select(:default_branch, @project.heads.map(&:name), {}, style: "width:210px;")
 
-  - unless @project.new_record?
-    %fieldset
-      %legend Features:
+  %fieldset
+    %legend Features:
 
-      .clearfix
-        = f.label :issues_enabled, "Issues"
-        .input= f.check_box :issues_enabled
+    .clearfix
+      = f.label :issues_enabled, "Issues"
+      .input= f.check_box :issues_enabled
 
-      .clearfix
-        = f.label :merge_requests_enabled, "Merge Requests"
-        .input= f.check_box :merge_requests_enabled
+    .clearfix
+      = f.label :merge_requests_enabled, "Merge Requests"
+      .input= f.check_box :merge_requests_enabled
 
-      .clearfix
-        = f.label :wall_enabled, "Wall"
-        .input= f.check_box :wall_enabled
+    .clearfix
+      = f.label :wall_enabled, "Wall"
+      .input= f.check_box :wall_enabled
 
-      .clearfix
-        = f.label :wiki_enabled, "Wiki"
-        .input= f.check_box :wiki_enabled
+    .clearfix
+      = f.label :wiki_enabled, "Wiki"
+      .input= f.check_box :wiki_enabled
 
   %br
 
index ae7b051..2ef29cb 100644 (file)
@@ -14,7 +14,7 @@
       = f.label :namespace_id do
         %span.cgray Namespace
       .input
-        = f.select :namespace_id, namespaces_options, {}, {class: 'chosen'}
+        = f.select :namespace_id, namespaces_options(params[:namespace_id] || :current_user), {}, {class: 'chosen'}
   %hr
   %p.padded
     All created project are private. You choose who can see project and commit to repository.
index 8aaa0e4..f44ed52 100644 (file)
@@ -1,6 +1,6 @@
 - if @project.valid?
   :plain
-    location.href = "#{edit_project_path(@project, notice: 'Project was successfully updated.')}";
+    location.href = "#{edit_project_path(@project)}";
 - else
   :plain
     $('.project_edit_holder').show();