Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
heptapod
heptapod
Commits
9e0698c3a079
Commit
232d61d5
authored
Jan 17, 2013
by
GitLab
Browse files
Refactor project creation. Added logout link to profile page
parent
6c74866b083e
Changes
19
Hide whitespace changes
Inline
Side-by-side
app/assets/stylesheets/sections/projects.scss
View file @
9e0698c3
...
...
@@ -42,9 +42,6 @@
line-height
:
20px
;
padding
:
8px
;
}
label
{
color
:
#888
;
}
.btn
{
padding
:
6px
10px
;
margin-left
:
10px
;
...
...
app/contexts/project_update_context.rb
deleted
100644 → 0
View file @
6c74866b
class
ProjectUpdateContext
<
BaseContext
def
execute
(
role
=
:default
)
namespace_id
=
params
[
:project
].
delete
(
:namespace_id
)
params
[
:project
].
delete
(
:public
)
unless
can?
(
current_user
,
:change_public_mode
,
project
)
allowed_transfer
=
can?
(
current_user
,
:change_namespace
,
project
)
||
role
==
:admin
if
allowed_transfer
&&
namespace_id
.
present?
if
namespace_id
==
Namespace
.
global_id
if
project
.
namespace
.
present?
# Transfer to global namespace from anyone
project
.
transfer
(
nil
)
end
elsif
namespace_id
.
to_i
!=
project
.
namespace_id
# Transfer to someone namespace
namespace
=
Namespace
.
find
(
namespace_id
)
project
.
transfer
(
namespace
)
end
end
project
.
update_attributes
(
params
[
:project
],
as:
role
)
end
end
app/contexts/projects/create_context.rb
0 → 100644
View file @
9e0698c3
module
Projects
class
CreateContext
<
BaseContext
def
execute
# get namespace id
namespace_id
=
params
[
:project
].
delete
(
:namespace_id
)
@project
=
Project
.
new
(
params
[
:project
])
# Parametrize path for project
#
# Ex.
# 'GitLab HQ'.parameterize => "gitlab-hq"
#
@project
.
path
=
@project
.
name
.
dup
.
parameterize
if
namespace_id
# Find matching namespace and check if it allowed
# for current user if namespace_id passed.
if
allowed_namespace?
(
current_user
,
namespace_id
)
@project
.
namespace_id
=
namespace_id
unless
namespace_id
==
Namespace
.
global_id
else
deny_namespace
return
@project
end
else
# Set current user namespace if namespace_id is nil
@project
.
namespace_id
=
current_user
.
id
end
Project
.
transaction
do
@project
.
creator
=
current_user
@project
.
save!
# Add user as project master
@project
.
users_projects
.
create!
(
project_access:
UsersProject
::
MASTER
,
user:
current_user
)
# when project saved no team member exist so
# project repository should be updated after first user add
@project
.
update_repository
end
@project
rescue
=>
ex
@project
.
errors
.
add
(
:base
,
"Can't save project. Please try again later"
)
@project
end
protected
def
deny_namespace
@project
.
errors
.
add
(
:namespace
,
"is not valid"
)
end
def
allowed_namespace?
(
user
,
namespace_id
)
if
namespace_id
==
Namespace
.
global_id
return
user
.
admin
else
namespace
=
Namespace
.
find_by_id
(
namespace_id
)
current_user
.
can?
(
:manage_namespace
,
namespace
)
end
end
end
end
app/contexts/projects/update_context.rb
0 → 100644
View file @
9e0698c3
module
Projects
class
UpdateContext
<
BaseContext
def
execute
(
role
=
:default
)
namespace_id
=
params
[
:project
].
delete
(
:namespace_id
)
params
[
:project
].
delete
(
:public
)
unless
can?
(
current_user
,
:change_public_mode
,
project
)
allowed_transfer
=
can?
(
current_user
,
:change_namespace
,
project
)
||
role
==
:admin
if
allowed_transfer
&&
namespace_id
.
present?
if
namespace_id
==
Namespace
.
global_id
if
project
.
namespace
.
present?
# Transfer to global namespace from anyone
project
.
transfer
(
nil
)
end
elsif
namespace_id
.
to_i
!=
project
.
namespace_id
# Transfer to someone namespace
namespace
=
Namespace
.
find
(
namespace_id
)
project
.
transfer
(
namespace
)
end
end
project
.
update_attributes
(
params
[
:project
],
as:
role
)
end
end
end
app/controllers/admin/projects_controller.rb
View file @
9e0698c3
...
...
@@ -29,7 +29,7 @@ def team_update
end
def
update
status
=
ProjectUpdateContext
.
new
(
project
,
current_user
,
params
).
execute
(
:admin
)
status
=
Project
s
::
UpdateContext
.
new
(
project
,
current_user
,
params
).
execute
(
:admin
)
if
status
redirect_to
[
:admin
,
@project
],
notice:
'Project was successfully updated.'
...
...
app/controllers/projects_controller.rb
View file @
9e0698c3
...
...
@@ -19,7 +19,7 @@ def edit
end
def
create
@project
=
Project
.
c
reate
_by_user
(
params
[
:project
],
current_user
)
@project
=
Project
s
::
C
reate
Context
.
new
(
nil
,
current_user
,
params
).
execute
respond_to
do
|
format
|
flash
[
:notice
]
=
'Project was successfully created.'
if
@project
.
saved?
...
...
@@ -35,7 +35,7 @@ def create
end
def
update
status
=
ProjectUpdateContext
.
new
(
project
,
current_user
,
params
).
execute
status
=
Project
s
::
UpdateContext
.
new
(
project
,
current_user
,
params
).
execute
respond_to
do
|
format
|
if
status
...
...
app/helpers/namespaces_helper.rb
View file @
9e0698c3
module
NamespacesHelper
def
namespaces_options
(
selected
=
:current_user
,
scope
=
:default
)
groups
=
current_user
.
owned_groups
.
select
{
|
n
|
n
.
type
==
'Group'
}
if
current_user
.
admin
groups
=
Group
.
all
users
=
Namespace
.
root
else
groups
=
current_user
.
owned_groups
.
select
{
|
n
|
n
.
type
==
'Group'
}
users
=
current_user
.
namespaces
.
reject
{
|
n
|
n
.
type
==
'Group'
}
end
users
=
if
scope
==
:all
Namespace
.
root
else
current_user
.
namespaces
.
reject
{
|
n
|
n
.
type
==
'Group'
}
end
global_opts
=
[
"Global"
,
[[
'/'
,
Namespace
.
global_id
]]
]
group_opts
=
[
"Groups"
,
groups
.
map
{
|
g
|
[
g
.
human_name
,
g
.
id
]}
]
...
...
app/models/ability.rb
View file @
9e0698c3
...
...
@@ -7,7 +7,7 @@ def allowed(object, subject)
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
)
when
"Group"
,
"Namespace"
then
group_abilities
(
object
,
subject
)
else
[]
end
end
...
...
@@ -102,7 +102,8 @@ def group_abilities user, group
# Only group owner and administrators can manage group
if
group
.
owner
==
user
||
user
.
admin?
rules
<<
[
:manage_group
:manage_group
,
:manage_namespace
]
end
...
...
app/models/project.rb
View file @
9e0698c3
...
...
@@ -116,55 +116,6 @@ def find_with_namespace(id)
end
end
def
create_by_user
(
params
,
user
)
namespace_id
=
params
.
delete
(
:namespace_id
)
project
=
Project
.
new
params
Project
.
transaction
do
# Parametrize path for project
#
# Ex.
# 'GitLab HQ'.parameterize => "gitlab-hq"
#
project
.
path
=
project
.
name
.
dup
.
parameterize
project
.
creator
=
user
# Apply namespace if user has access to it
# else fallback to user namespace
if
namespace_id
!=
Namespace
.
global_id
project
.
namespace_id
=
user
.
namespace_id
if
namespace_id
group
=
Group
.
find_by_id
(
namespace_id
)
if
user
.
can?
:manage_group
,
group
project
.
namespace_id
=
namespace_id
end
end
end
project
.
save!
# Add user as project master
project
.
users_projects
.
create!
(
project_access:
UsersProject
::
MASTER
,
user:
user
)
# when project saved no team member exist so
# project repository should be updated after first user add
project
.
update_repository
end
project
rescue
Gitlab
::
Gitolite
::
AccessDenied
=>
ex
project
.
error_code
=
:gitolite
project
rescue
=>
ex
project
.
error_code
=
:db
project
.
errors
.
add
(
:base
,
"Can't save project. Please try again later"
)
project
end
def
access_options
UsersProject
.
access_roles
end
...
...
app/models/user.rb
View file @
9e0698c3
...
...
@@ -152,11 +152,8 @@ def namespaces
namespaces
<<
self
.
namespace
if
self
.
namespace
# Add groups you can manage
namespaces
+=
if
admin
Group
.
all
else
groups
.
all
end
namespaces
+=
groups
.
all
namespaces
end
...
...
@@ -234,6 +231,10 @@ def abilities
end
end
def
can_select_namespace?
several_namespaces?
||
admin
end
def
can?
action
,
subject
abilities
.
allowed?
(
self
,
action
,
subject
)
end
...
...
app/views/dashboard/_sidebar.html.haml
View file @
9e0698c3
...
...
@@ -9,6 +9,6 @@
%hr
.gitlab-promo
=
link_to
"Homepage"
,
"http://gitlab
hq.com
"
=
link_to
"Blog"
,
"http://blog.gitlab
hq.com
"
=
link_to
"Homepage"
,
"http://gitlab
.org
"
=
link_to
"Blog"
,
"http://blog.gitlab
.org
"
=
link_to
"@gitlabhq"
,
"https://twitter.com/gitlabhq"
app/views/profiles/show.html.haml
View file @
9e0698c3
...
...
@@ -6,6 +6,11 @@
%small
=
@user
.
email
.right
=
link_to
destroy_user_session_path
,
class:
"logout"
,
method: :delete
do
%small
%i
.icon-signout
Logout
%hr
=
form_for
@user
,
url:
profile_path
,
method: :put
,
html:
{
class:
"edit_user form-horizontal"
}
do
|
f
|
...
...
app/views/projects/_form.html.haml
View file @
9e0698c3
...
...
@@ -9,19 +9,11 @@
Project name is
.input
=
f
.
text_field
:name
,
placeholder:
"Example Project"
,
class:
"xxlarge"
%fieldset
%legend
Advanced settings:
.control-group
=
f
.
label
:path
do
Repository
.controls
=
text_field_tag
:ppath
,
@repository
.
path_to_repo
,
class:
"xxlarge"
,
readonly:
true
-
unless
@repository
.
heads
.
empty?
.clearfix
=
f
.
label
:default_branch
,
"Default Branch"
.input
=
f
.
select
(
:default_branch
,
@repository
.
heads
.
map
(
&
:name
),
{},
style:
"width:210px;"
)
-
unless
@repository
.
heads
.
empty?
.clearfix
=
f
.
label
:default_branch
,
"Default Branch"
.input
=
f
.
select
(
:default_branch
,
@repository
.
heads
.
map
(
&
:name
),
{},
style:
"width:210px;"
)
%fieldset
.features
%legend
Features:
...
...
@@ -87,4 +79,4 @@
-
unless
@project
.
new_record?
-
if
can?
(
current_user
,
:remove_project
,
@project
)
.right
=
link_to
'Remove'
,
@project
,
confirm:
'Removed project can not be restored! Are you sure?'
,
method: :delete
,
class:
"btn danger"
=
link_to
'Remove
Project
'
,
@project
,
confirm:
'Removed project can not be restored! Are you sure?'
,
method: :delete
,
class:
"btn danger"
app/views/projects/_new_form.html.haml
View file @
9e0698c3
...
...
@@ -9,10 +9,10 @@
=
f
.
text_field
:name
,
placeholder:
"Example Project"
,
class:
"xxlarge"
=
f
.
submit
'Create project'
,
class:
"btn success project-submit"
-
if
current_user
.
several
_namespace
s
?
-
if
current_user
.
can_select
_namespace?
.clearfix
=
f
.
label
:namespace_id
do
%span
.cgray
Namespace
%span
Namespace
.input
=
f
.
select
:namespace_id
,
namespaces_options
(
params
[
:namespace_id
]
||
:current_user
),
{},
{
class:
'chosen'
}
%hr
...
...
app/views/projects/create.js.haml
View file @
9e0698c3
...
...
@@ -2,11 +2,9 @@
:plain
location.href = "
#{
project_path
(
@project
)
}
";
-
else
-
if
@project
.
git_error?
location.href = "
#{
errors_githost_path
}
";
-
else
:plain
$('.project_new_holder').show();
$("#new_project").replaceWith("
#{
escape_javascript
(
render
(
'new_form'
))
}
");
$('.save-project-loader').hide();
new Projects();
$('select.chosen').chosen()
features/project/project.feature
View file @
9e0698c3
Feature
:
Project
s
Feature
:
Project
Feature
Background
:
Given
I sign in as a user
And
I own project
"Shop"
...
...
features/steps/project/project.rb
View file @
9e0698c3
class
Project
s
<
Spinach
::
FeatureSteps
class
Project
Feature
<
Spinach
::
FeatureSteps
include
SharedAuthentication
include
SharedProject
include
SharedPaths
...
...
features/steps/shared/project.rb
View file @
9e0698c3
...
...
@@ -47,7 +47,6 @@ module SharedProject
Then
'I should see project settings'
do
current_path
.
should
==
edit_project_path
(
@project
)
page
.
should
have_content
(
"Project name is"
)
page
.
should
have_content
(
"Advanced settings:"
)
page
.
should
have_content
(
"Features:"
)
end
...
...
lib/api/projects.rb
View file @
9e0698c3
...
...
@@ -43,7 +43,7 @@ class Projects < Grape::API
:wall_enabled
,
:merge_requests_enabled
,
:wiki_enabled
]
@project
=
Project
.
c
reate
_by_user
(
attrs
,
current_user
)
@project
=
Project
s
::
C
reate
Context
.
new
(
nil
,
attrs
,
current_user
)
.
execute
if
@project
.
saved?
present
@project
,
with:
Entities
::
Project
else
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment