From f6c482c06f48449e7dcff34455b5bbdfbd8f6c7b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 24 Jan 2013 17:47:09 +0200 Subject: [PATCH] User can create group --- app/controllers/groups_controller.rb | 26 +++++++++++++++++++---- app/helpers/tab_helper.rb | 7 ++++++- app/models/user.rb | 2 +- app/views/dashboard/_groups.html.haml | 2 +- app/views/groups/new.html.haml | 21 +++++++++++++++++++ app/views/layouts/_head_panel.html.haml | 2 +- app/views/projects/_new_form.html.haml | 6 ++++++ app/views/users/_profile.html.haml | 23 ++++++++++++++++++++ app/views/users/show.html.haml | 28 ++++++------------------- config/routes.rb | 2 +- features/group/create_group.feature | 11 ++++++++++ features/steps/group/group.rb | 18 ++++++++++++++++ 12 files changed, 117 insertions(+), 31 deletions(-) create mode 100644 app/views/groups/new.html.haml create mode 100644 app/views/users/_profile.html.haml create mode 100644 features/group/create_group.feature diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index c25fc32a62c..f95db1af383 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -1,12 +1,30 @@ class GroupsController < ApplicationController respond_to :html - layout 'group' + layout 'group', except: [:new, :create] - before_filter :group - before_filter :projects + before_filter :group, except: [:new, :create] # Authorize - before_filter :authorize_read_group! + before_filter :authorize_read_group!, except: [:new, :create] + + # Load group projects + before_filter :projects, except: [:new, :create] + + def new + @group = Group.new + end + + def create + @group = Group.new(params[:group]) + @group.path = @group.name.dup.parameterize if @group.name + @group.owner = current_user + + if @group.save + redirect_to @group, notice: 'Group was successfully created.' + else + render action: "new" + end + end def show @events = Event.in_projects(project_ids).limit(20).offset(params[:offset] || 0) diff --git a/app/helpers/tab_helper.rb b/app/helpers/tab_helper.rb index d52d8af6641..5bd6de896ee 100644 --- a/app/helpers/tab_helper.rb +++ b/app/helpers/tab_helper.rb @@ -39,7 +39,12 @@ module TabHelper # Returns a list item element String def nav_link(options = {}, &block) if path = options.delete(:path) - c, a, _ = path.split('#') + if path.respond_to?(:each) + c = path.map { |p| p.split('#').first } + a = path.map { |p| p.split('#').last } + else + c, a, _ = path.split('#') + end else c = options.delete(:controller) a = options.delete(:action) diff --git a/app/models/user.rb b/app/models/user.rb index 35a693fdb1c..743d7523bdc 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -220,7 +220,7 @@ class User < ActiveRecord::Base end def can_create_group? - is_admin? + can_create_project? end def abilities diff --git a/app/views/dashboard/_groups.html.haml b/app/views/dashboard/_groups.html.haml index 7f544406761..dc50bffda80 100644 --- a/app/views/dashboard/_groups.html.haml +++ b/app/views/dashboard/_groups.html.haml @@ -5,7 +5,7 @@ (#{groups.count}) - if current_user.can_create_group? %span.right - = link_to new_admin_group_path, class: "btn very_small info" do + = link_to new_group_path, class: "btn very_small info" do %i.icon-plus New Group %ul.well-list diff --git a/app/views/groups/new.html.haml b/app/views/groups/new.html.haml new file mode 100644 index 00000000000..b6d5f46507e --- /dev/null +++ b/app/views/groups/new.html.haml @@ -0,0 +1,21 @@ +%h3.page_title New Group +%hr += form_for @group do |f| + - if @group.errors.any? + .alert-message.block-message.error + %span= @group.errors.full_messages.first + .clearfix + = f.label :name do + Group name is + .input + = f.text_field :name, placeholder: "Ex. OpenSource", class: "xxlarge left" +   + = f.submit 'Create group', class: "btn primary" + %hr + .padded + %ul + %li Group is kind of directory for several projects + %li All created groups are private + %li People within a group see only projects they have access to + %li All projects of group will be stored in group directory + %li You will be able to move existing projects into group diff --git a/app/views/layouts/_head_panel.html.haml b/app/views/layouts/_head_panel.html.haml index f4b2228a41b..8f4f3d7815f 100644 --- a/app/views/layouts/_head_panel.html.haml +++ b/app/views/layouts/_head_panel.html.haml @@ -17,7 +17,7 @@ = link_to new_project_path, title: "Create New Project", class: 'has_bottom_tooltip', 'data-original-title' => 'New project' do %i.icon-plus %li - = link_to profile_path, title: "Your Profile", class: 'has_bottom_tooltip', 'data-original-title' => 'Your profile' do + = link_to profile_path, title: "My Profile", class: 'has_bottom_tooltip', 'data-original-title' => 'Your profile' do %i.icon-user %li.separator %li diff --git a/app/views/projects/_new_form.html.haml b/app/views/projects/_new_form.html.haml index 2d5f3923e80..ba8f255558a 100644 --- a/app/views/projects/_new_form.html.haml +++ b/app/views/projects/_new_form.html.haml @@ -15,6 +15,12 @@ %span Namespace .input = f.select :namespace_id, namespaces_options(params[:namespace_id] || :current_user), {}, {class: 'chosen'} + - elsif current_user.can_create_group? + .clearfix + .input.light + Need a group for several projects? + = link_to new_group_path, class: "btn very_small" do + Create a group %hr %p.padded New projects are private by default. You choose who can see the project and commit to repository. diff --git a/app/views/users/_profile.html.haml b/app/views/users/_profile.html.haml new file mode 100644 index 00000000000..ab6538f083b --- /dev/null +++ b/app/views/users/_profile.html.haml @@ -0,0 +1,23 @@ +.ui-box + %h5.title + Profile + %ul.well-list + %li + %strong Email + %span.right= mail_to @user.email + - unless @user.skype.blank? + %li + %strong Skype + %span.right= @user.skype + - unless @user.linkedin.blank? + %li + %strong LinkedIn + %span.right= @user.linkedin + - unless @user.twitter.blank? + %li + %strong Twitter + %span.right= @user.twitter + - unless @user.bio.blank? + %li + %strong Bio + %span.right= @user.bio diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index 2a77c6bfa3d..644826282b8 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -3,6 +3,11 @@ %h3.page_title = image_tag gravatar_icon(@user.email, 90), class: "avatar s90" = @user.name + - if @user == current_user + .right + = link_to profile_path, class: 'btn small' do + %i.icon-edit + Edit Profile %br %small @#{@user.username} %br @@ -12,26 +17,5 @@ %h5 Recent events = render @events .span4 - .ui-box - %h5.title Profile - %ul.well-list - %li - %strong Email - %span.right= mail_to @user.email - - unless @user.skype.blank? - %li - %strong Skype - %span.right= @user.skype - - unless @user.linkedin.blank? - %li - %strong LinkedIn - %span.right= @user.linkedin - - unless @user.twitter.blank? - %li - %strong Twitter - %span.right= @user.twitter - - unless @user.bio.blank? - %li - %strong Bio - %span.right= @user.bio + = render 'profile' = render 'projects' diff --git a/config/routes.rb b/config/routes.rb index c7e81b6fe5a..6d7e615187d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -112,7 +112,7 @@ Gitlab::Application.routes.draw do # # Groups Area # - resources :groups, constraints: { id: /[^\/]+/ }, only: [:show] do + resources :groups, constraints: { id: /[^\/]+/ }, only: [:show, :new, :create] do member do get :issues get :merge_requests diff --git a/features/group/create_group.feature b/features/group/create_group.feature new file mode 100644 index 00000000000..b77f3599e6a --- /dev/null +++ b/features/group/create_group.feature @@ -0,0 +1,11 @@ +Feature: Groups + Background: + Given I sign in as a user + + Scenario: Create a group from dasboard + Given I have group with projects + And I visit dashboard page + When I click new group link + And submit form with new group info + Then I should be redirected to group page + And I should see newly created group diff --git a/features/steps/group/group.rb b/features/steps/group/group.rb index 04d8c874b3e..c6c6b4b5e5b 100644 --- a/features/steps/group/group.rb +++ b/features/steps/group/group.rb @@ -64,6 +64,24 @@ class Groups < Spinach::FeatureSteps author: current_user end + When 'I click new group link' do + click_link "New Group" + end + + And 'submit form with new group info' do + fill_in 'group_name', :with => 'Samurai' + click_button "Create group" + end + + Then 'I should see newly created group' do + page.should have_content "Samurai" + page.should have_content "You will only see events from projects in this group" + end + + Then 'I should be redirected to group page' do + current_path.should == group_path(Group.last) + end + protected def current_group