Commit d431e4339269041784986da40a0e0879baaf96a9

Authored by Dmitriy Zaporozhets
1 parent 00a1f5bc

Fix few bugs and tests after refactoring ownership logic

app/controllers/admin/users_controller.rb
... ... @@ -9,7 +9,7 @@ class Admin::UsersController < AdminController
9 9 def show
10 10 @admin_user = User.find(params[:id])
11 11  
12   - @projects = if @admin_user.projects.empty?
  12 + @projects = if @admin_user.authorized_projects.empty?
13 13 Project
14 14 else
15 15 Project.without_user(@admin_user)
... ... @@ -98,7 +98,7 @@ class Admin::UsersController < AdminController
98 98  
99 99 def destroy
100 100 @admin_user = User.find(params[:id])
101   - if @admin_user.my_own_projects.count > 0
  101 + if @admin_user.personal_projects.count > 0
102 102 redirect_to admin_users_path, alert: "User is a project owner and can't be removed." and return
103 103 end
104 104 @admin_user.destroy
... ...
app/helpers/namespaces_helper.rb
1 1 module NamespacesHelper
2 2 def namespaces_options(selected = :current_user, scope = :default)
3   - groups = current_user.namespaces.select {|n| n.type == 'Group'}
  3 + groups = current_user.owned_groups.select {|n| n.type == 'Group'}
4 4  
5 5 users = if scope == :all
6 6 Namespace.root
... ...
app/models/ability.rb
... ... @@ -29,21 +29,10 @@ class Ability
29 29 rules << project_guest_rules
30 30 end
31 31  
32   - if project.namespace
33   - # If user own project namespace
34   - # (Ex. group owner or account owner)
35   - if project.namespace.owner == user
36   - rules << project_admin_rules
37   - end
38   - else
39   - # For compatibility with global projects
40   - # use projects.owner_id
41   - if project.owner == user
42   - rules << project_admin_rules
43   - end
  32 + if project.owner == user
  33 + rules << project_admin_rules
44 34 end
45 35  
46   -
47 36 rules.flatten
48 37 end
49 38  
... ...
app/models/key.rb
... ... @@ -73,7 +73,7 @@ class Key &lt; ActiveRecord::Base
73 73 if is_deploy_key
74 74 [project]
75 75 else
76   - user.projects
  76 + user.authorized_projects
77 77 end
78 78 end
79 79  
... ...
app/models/project.rb
... ... @@ -80,7 +80,7 @@ class Project &lt; ActiveRecord::Base
80 80  
81 81 # Scopes
82 82 scope :public_only, where(private_flag: false)
83   - scope :without_user, ->(user) { where("id NOT IN (:ids)", ids: user.projects.map(&:id) ) }
  83 + scope :without_user, ->(user) { where("id NOT IN (:ids)", ids: user.authorized_projects.map(&:id) ) }
84 84 scope :not_in_group, ->(group) { where("id NOT IN (:ids)", ids: group.project_ids ) }
85 85 scope :in_namespace, ->(namespace) { where(namespace_id: namespace.id) }
86 86 scope :sorted_by_activity, ->() { order("(SELECT max(events.created_at) FROM events WHERE events.project_id = projects.id) DESC") }
... ...
app/models/user.rb
... ... @@ -187,4 +187,9 @@ class User &lt; ActiveRecord::Base
187 187 (projects.namespace_id IS NULL AND projects.creator_id = :user_id)",
188 188 namespaces: namespaces.map(&:id), user_id: self.id)
189 189 end
  190 +
  191 + # Team membership in personal projects
  192 + def tm_in_personal_projects
  193 + personal_projects.users_projects.where(user_id: self.id)
  194 + end
190 195 end
... ...
app/roles/account.rb
... ... @@ -69,7 +69,7 @@ module Account
69 69  
70 70 def projects_limit_percent
71 71 return 100 if projects_limit.zero?
72   - (my_own_projects.count.to_f / projects_limit) * 100
  72 + (personal_projects.count.to_f / projects_limit) * 100
73 73 end
74 74  
75 75 def recent_push project_id = nil
... ...
app/views/admin/projects/index.html.haml
... ... @@ -28,7 +28,10 @@
28 28 %span.monospace= project.path_with_namespace + ".git"
29 29 %td= project.users_projects.count
30 30 %td
31   - = link_to project.chief.name, [:admin, project.chief]
  31 + - if project.owner
  32 + = link_to project.owner.name, [:admin, project.owner]
  33 + - else
  34 + (deleted)
32 35 %td= last_commit(project)
33 36 %td= link_to 'Edit', edit_admin_project_path(project), id: "edit_#{dom_id(project)}", class: "btn small"
34 37 %td.bgred= link_to 'Destroy', [:admin, project], confirm: "REMOVE #{project.name}? Are you sure?", method: :delete, class: "btn small danger"
... ...
app/views/admin/users/show.html.haml
... ... @@ -106,8 +106,8 @@
106 106 %td= link_to group.name, admin_group_path(group)
107 107  
108 108  
109   -- if @admin_user.projects.present?
110   - %h5 Projects:
  109 +- if @admin_user.personal_projects.present?
  110 + %h5 Personal Projects:
111 111 %br
112 112  
113 113 %table.zebra-striped
... ... @@ -118,7 +118,7 @@
118 118 %th
119 119 %th
120 120  
121   - - @admin_user.users_projects.each do |tm|
  121 + - @admin_user.tm_in_personal_projects.each do |tm|
122 122 - project = tm.project
123 123 %tr
124 124 %td= link_to project.name_with_namespace, admin_project_path(project)
... ...
app/views/profiles/show.html.haml
... ... @@ -64,7 +64,7 @@
64 64 %legend
65 65 Personal projects:
66 66 %small.right
67   - %span= current_user.my_own_projects.count
  67 + %span= current_user.personal_projects.count
68 68 of
69 69 %span= current_user.projects_limit
70 70 .padded
... ...
lib/api/projects.rb
... ... @@ -9,7 +9,7 @@ module Gitlab
9 9 # Example Request:
10 10 # GET /projects
11 11 get do
12   - @projects = paginate current_user.projects
  12 + @projects = paginate current_user.authorized_projects
13 13 present @projects, with: Entities::Project
14 14 end
15 15  
... ...
spec/factories.rb
... ... @@ -37,7 +37,7 @@ FactoryGirl.define do
37 37 end
38 38  
39 39 factory :namespace do
40   - sequence(:name) { |n| "group#{n}" }
  40 + sequence(:name) { |n| "namespace#{n}" }
41 41 path { name.downcase.gsub(/\s/, '_') }
42 42 owner
43 43 end
... ...
spec/requests/api/issues_spec.rb
... ... @@ -4,7 +4,7 @@ describe Gitlab::API do
4 4 include ApiHelpers
5 5  
6 6 let(:user) { create(:user) }
7   - let!(:project) { create(:project, owner: user) }
  7 + let!(:project) { create(:project, namespace: user.namespace ) }
8 8 let!(:issue) { create(:issue, author: user, assignee: user, project: project) }
9 9 before { project.add_access(user, :read) }
10 10  
... ...
spec/requests/api/merge_requests_spec.rb
... ... @@ -4,7 +4,7 @@ describe Gitlab::API do
4 4 include ApiHelpers
5 5  
6 6 let(:user) { create(:user ) }
7   - let!(:project) { create(:project, owner: user) }
  7 + let!(:project) { create(:project, namespace: user.namespace ) }
8 8 let!(:merge_request) { create(:merge_request, author: user, assignee: user, project: project, title: "Test") }
9 9 before { project.add_access(user, :read) }
10 10  
... ...
spec/requests/api/milestones_spec.rb
... ... @@ -4,7 +4,7 @@ describe Gitlab::API do
4 4 include ApiHelpers
5 5  
6 6 let(:user) { create(:user) }
7   - let!(:project) { create(:project, owner: user) }
  7 + let!(:project) { create(:project, namespace: user.namespace ) }
8 8 let!(:milestone) { create(:milestone, project: project) }
9 9  
10 10 before { project.add_access(user, :read) }
... ...
spec/requests/api/notes_spec.rb
... ... @@ -4,7 +4,7 @@ describe Gitlab::API do
4 4 include ApiHelpers
5 5  
6 6 let(:user) { create(:user) }
7   - let!(:project) { create(:project, owner: user) }
  7 + let!(:project) { create(:project, namespace: user.namespace ) }
8 8 let!(:issue) { create(:issue, project: project, author: user) }
9 9 let!(:snippet) { create(:snippet, project: project, author: user) }
10 10 let!(:issue_note) { create(:note, noteable: issue, project: project, author: user) }
... ...
spec/requests/api/projects_spec.rb
... ... @@ -7,7 +7,7 @@ describe Gitlab::API do
7 7 let(:user2) { create(:user) }
8 8 let(:user3) { create(:user) }
9 9 let!(:hook) { create(:project_hook, project: project, url: "http://example.com") }
10   - let!(:project) { create(:project, owner: user ) }
  10 + let!(:project) { create(:project, namespace: user.namespace ) }
11 11 let!(:snippet) { create(:snippet, author: user, project: project, title: 'example') }
12 12 let!(:users_project) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) }
13 13 let!(:users_project2) { create(:users_project, user: user3, project: project, project_access: UsersProject::DEVELOPER) }
... ... @@ -79,7 +79,7 @@ describe Gitlab::API do
79 79 end
80 80  
81 81 it "should return a project by path name" do
82   - get api("/projects/#{project.path}", user)
  82 + get api("/projects/#{project.id}", user)
83 83 response.status.should == 200
84 84 json_response['name'].should == project.name
85 85 end
... ... @@ -93,7 +93,7 @@ describe Gitlab::API do
93 93  
94 94 describe "GET /projects/:id/repository/branches" do
95 95 it "should return an array of project branches" do
96   - get api("/projects/#{project.path}/repository/branches", user)
  96 + get api("/projects/#{project.id}/repository/branches", user)
97 97 response.status.should == 200
98 98 json_response.should be_an Array
99 99 json_response.first['name'].should == project.repo.heads.sort_by(&:name).first.name
... ... @@ -102,7 +102,7 @@ describe Gitlab::API do
102 102  
103 103 describe "GET /projects/:id/repository/branches/:branch" do
104 104 it "should return the branch information for a single branch" do
105   - get api("/projects/#{project.path}/repository/branches/new_design", user)
  105 + get api("/projects/#{project.id}/repository/branches/new_design", user)
106 106 response.status.should == 200
107 107  
108 108 json_response['name'].should == 'new_design'
... ... @@ -112,7 +112,7 @@ describe Gitlab::API do
112 112  
113 113 describe "GET /projects/:id/members" do
114 114 it "should return project team members" do
115   - get api("/projects/#{project.path}/members", user)
  115 + get api("/projects/#{project.id}/members", user)
116 116 response.status.should == 200
117 117 json_response.should be_an Array
118 118 json_response.count.should == 2
... ... @@ -120,7 +120,7 @@ describe Gitlab::API do
120 120 end
121 121  
122 122 it "finds team members with query string" do
123   - get api("/projects/#{project.path}/members", user), query: user.username
  123 + get api("/projects/#{project.id}/members", user), query: user.username
124 124 response.status.should == 200
125 125 json_response.should be_an Array
126 126 json_response.count.should == 1
... ... @@ -130,7 +130,7 @@ describe Gitlab::API do
130 130  
131 131 describe "GET /projects/:id/members/:user_id" do
132 132 it "should return project team member" do
133   - get api("/projects/#{project.path}/members/#{user.id}", user)
  133 + get api("/projects/#{project.id}/members/#{user.id}", user)
134 134 response.status.should == 200
135 135 json_response['email'].should == user.email
136 136 json_response['access_level'].should == UsersProject::MASTER
... ... @@ -140,7 +140,7 @@ describe Gitlab::API do
140 140 describe "POST /projects/:id/members" do
141 141 it "should add user to project team" do
142 142 expect {
143   - post api("/projects/#{project.path}/members", user), user_id: user2.id,
  143 + post api("/projects/#{project.id}/members", user), user_id: user2.id,
144 144 access_level: UsersProject::DEVELOPER
145 145 }.to change { UsersProject.count }.by(1)
146 146  
... ... @@ -152,7 +152,7 @@ describe Gitlab::API do
152 152  
153 153 describe "PUT /projects/:id/members/:user_id" do
154 154 it "should update project team member" do
155   - put api("/projects/#{project.path}/members/#{user3.id}", user), access_level: UsersProject::MASTER
  155 + put api("/projects/#{project.id}/members/#{user3.id}", user), access_level: UsersProject::MASTER
156 156 response.status.should == 200
157 157 json_response['email'].should == user3.email
158 158 json_response['access_level'].should == UsersProject::MASTER
... ... @@ -162,14 +162,14 @@ describe Gitlab::API do
162 162 describe "DELETE /projects/:id/members/:user_id" do
163 163 it "should remove user from project team" do
164 164 expect {
165   - delete api("/projects/#{project.path}/members/#{user3.id}", user)
  165 + delete api("/projects/#{project.id}/members/#{user3.id}", user)
166 166 }.to change { UsersProject.count }.by(-1)
167 167 end
168 168 end
169 169  
170 170 describe "GET /projects/:id/hooks" do
171 171 it "should return project hooks" do
172   - get api("/projects/#{project.path}/hooks", user)
  172 + get api("/projects/#{project.id}/hooks", user)
173 173  
174 174 response.status.should == 200
175 175  
... ... @@ -181,7 +181,7 @@ describe Gitlab::API do
181 181  
182 182 describe "GET /projects/:id/hooks/:hook_id" do
183 183 it "should return a project hook" do
184   - get api("/projects/#{project.path}/hooks/#{hook.id}", user)
  184 + get api("/projects/#{project.id}/hooks/#{hook.id}", user)
185 185 response.status.should == 200
186 186 json_response['url'].should == hook.url
187 187 end
... ... @@ -190,7 +190,7 @@ describe Gitlab::API do
190 190 describe "POST /projects/:id/hooks" do
191 191 it "should add hook to project" do
192 192 expect {
193   - post api("/projects/#{project.path}/hooks", user),
  193 + post api("/projects/#{project.id}/hooks", user),
194 194 "url" => "http://example.com"
195 195 }.to change {project.hooks.count}.by(1)
196 196 end
... ... @@ -198,7 +198,7 @@ describe Gitlab::API do
198 198  
199 199 describe "PUT /projects/:id/hooks/:hook_id" do
200 200 it "should update an existing project hook" do
201   - put api("/projects/#{project.path}/hooks/#{hook.id}", user),
  201 + put api("/projects/#{project.id}/hooks/#{hook.id}", user),
202 202 url: 'http://example.org'
203 203 response.status.should == 200
204 204 json_response['url'].should == 'http://example.org'
... ... @@ -209,7 +209,7 @@ describe Gitlab::API do
209 209 describe "DELETE /projects/:id/hooks" do
210 210 it "should delete hook from project" do
211 211 expect {
212   - delete api("/projects/#{project.path}/hooks", user),
  212 + delete api("/projects/#{project.id}/hooks", user),
213 213 hook_id: hook.id
214 214 }.to change {project.hooks.count}.by(-1)
215 215 end
... ... @@ -217,7 +217,7 @@ describe Gitlab::API do
217 217  
218 218 describe "GET /projects/:id/repository/tags" do
219 219 it "should return an array of project tags" do
220   - get api("/projects/#{project.path}/repository/tags", user)
  220 + get api("/projects/#{project.id}/repository/tags", user)
221 221 response.status.should == 200
222 222 json_response.should be_an Array
223 223 json_response.first['name'].should == project.repo.tags.sort_by(&:name).reverse.first.name
... ... @@ -229,7 +229,7 @@ describe Gitlab::API do
229 229 before { project.add_access(user2, :read) }
230 230  
231 231 it "should return project commits" do
232   - get api("/projects/#{project.path}/repository/commits", user)
  232 + get api("/projects/#{project.id}/repository/commits", user)
233 233 response.status.should == 200
234 234  
235 235 json_response.should be_an Array
... ... @@ -239,7 +239,7 @@ describe Gitlab::API do
239 239  
240 240 context "unauthorized user" do
241 241 it "should not return project commits" do
242   - get api("/projects/#{project.path}/repository/commits")
  242 + get api("/projects/#{project.id}/repository/commits")
243 243 response.status.should == 401
244 244 end
245 245 end
... ... @@ -247,7 +247,7 @@ describe Gitlab::API do
247 247  
248 248 describe "GET /projects/:id/snippets" do
249 249 it "should return an array of project snippets" do
250   - get api("/projects/#{project.path}/snippets", user)
  250 + get api("/projects/#{project.id}/snippets", user)
251 251 response.status.should == 200
252 252 json_response.should be_an Array
253 253 json_response.first['title'].should == snippet.title
... ... @@ -256,7 +256,7 @@ describe Gitlab::API do
256 256  
257 257 describe "GET /projects/:id/snippets/:snippet_id" do
258 258 it "should return a project snippet" do
259   - get api("/projects/#{project.path}/snippets/#{snippet.id}", user)
  259 + get api("/projects/#{project.id}/snippets/#{snippet.id}", user)
260 260 response.status.should == 200
261 261 json_response['title'].should == snippet.title
262 262 end
... ... @@ -264,7 +264,7 @@ describe Gitlab::API do
264 264  
265 265 describe "POST /projects/:id/snippets" do
266 266 it "should create a new project snippet" do
267   - post api("/projects/#{project.path}/snippets", user),
  267 + post api("/projects/#{project.id}/snippets", user),
268 268 title: 'api test', file_name: 'sample.rb', code: 'test'
269 269 response.status.should == 201
270 270 json_response['title'].should == 'api test'
... ... @@ -273,7 +273,7 @@ describe Gitlab::API do
273 273  
274 274 describe "PUT /projects/:id/snippets/:shippet_id" do
275 275 it "should update an existing project snippet" do
276   - put api("/projects/#{project.path}/snippets/#{snippet.id}", user),
  276 + put api("/projects/#{project.id}/snippets/#{snippet.id}", user),
277 277 code: 'updated code'
278 278 response.status.should == 200
279 279 json_response['title'].should == 'example'
... ... @@ -284,31 +284,31 @@ describe Gitlab::API do
284 284 describe "DELETE /projects/:id/snippets/:snippet_id" do
285 285 it "should delete existing project snippet" do
286 286 expect {
287   - delete api("/projects/#{project.path}/snippets/#{snippet.id}", user)
  287 + delete api("/projects/#{project.id}/snippets/#{snippet.id}", user)
288 288 }.to change { Snippet.count }.by(-1)
289 289 end
290 290 end
291 291  
292 292 describe "GET /projects/:id/snippets/:snippet_id/raw" do
293 293 it "should get a raw project snippet" do
294   - get api("/projects/#{project.path}/snippets/#{snippet.id}/raw", user)
  294 + get api("/projects/#{project.id}/snippets/#{snippet.id}/raw", user)
295 295 response.status.should == 200
296 296 end
297 297 end
298 298  
299 299 describe "GET /projects/:id/:sha/blob" do
300 300 it "should get the raw file contents" do
301   - get api("/projects/#{project.path}/repository/commits/master/blob?filepath=README.md", user)
  301 + get api("/projects/#{project.id}/repository/commits/master/blob?filepath=README.md", user)
302 302 response.status.should == 200
303 303 end
304 304  
305 305 it "should return 404 for invalid branch_name" do
306   - get api("/projects/#{project.path}/repository/commits/invalid_branch_name/blob?filepath=README.md", user)
  306 + get api("/projects/#{project.id}/repository/commits/invalid_branch_name/blob?filepath=README.md", user)
307 307 response.status.should == 404
308 308 end
309 309  
310 310 it "should return 404 for invalid file" do
311   - get api("/projects/#{project.path}/repository/commits/master/blob?filepath=README.invalid", user)
  311 + get api("/projects/#{project.id}/repository/commits/master/blob?filepath=README.invalid", user)
312 312 response.status.should == 404
313 313 end
314 314 end
... ...
spec/requests/projects_spec.rb
... ... @@ -5,7 +5,7 @@ describe &quot;Projects&quot; do
5 5  
6 6 describe "GET /projects/show" do
7 7 before do
8   - @project = create(:project, owner: @user)
  8 + @project = create(:project, namespace: @user.namespace)
9 9 @project.add_access(@user, :read)
10 10  
11 11 visit project_path(@project)
... ... @@ -37,7 +37,7 @@ describe &quot;Projects&quot; do
37 37  
38 38 describe "PUT /projects/:id" do
39 39 before do
40   - @project = create(:project, owner: @user)
  40 + @project = create(:project, namespace: @user.namespace)
41 41 @project.add_access(@user, :admin, :read)
42 42  
43 43 visit edit_project_path(@project)
... ... @@ -58,7 +58,7 @@ describe &quot;Projects&quot; do
58 58  
59 59 describe "DELETE /projects/:id" do
60 60 before do
61   - @project = create(:project, owner: @user)
  61 + @project = create(:project, namespace: @user.namespace)
62 62 @project.add_access(@user, :read, :admin)
63 63 visit edit_project_path(@project)
64 64 end
... ...
spec/spec_helper.rb
... ... @@ -38,7 +38,7 @@ RSpec.configure do |config|
38 38 stub_gitolite!
39 39  
40 40 # !!! Observers disabled by default in tests
41   - ActiveRecord::Base.observers.disable(:all)
  41 + #ActiveRecord::Base.observers.disable(:all)
42 42 # ActiveRecord::Base.observers.enable(:all)
43 43  
44 44 # Use tmp dir for FS manipulations
... ...